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

Last change on this file since 880 was 819, checked in by garnier, 17 years ago

import all except CVS

File size: 188.7 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.14 2007/12/03 19:36:06 miheikki 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 <assert.h>
39
40G4Abla::G4Abla()
41{
42
43}
44
45G4Abla::G4Abla(G4Hazard *hazard, G4Volant *volant)
46{
47 verboseLevel = 0;
48
49 volant = volant; // ABLA internal particle data
50 volant->iv = 0;
51 hazard = hazard; // Random seeds
52
53 varntp = new G4VarNtp();
54 pace = new G4Pace();
55 ald = new G4Ald();
56 ablamain = new G4Ablamain();
57 emdpar = new G4Emdpar();
58 eenuc = new G4Eenuc();
59 ec2sub = new G4Ec2sub();
60 ecld = new G4Ecld();
61 fb = new G4Fb();
62 fiss = new G4Fiss();
63 opt = new G4Opt();
64}
65
66G4Abla::G4Abla(G4Hazard *aHazard, G4Volant *aVolant, G4VarNtp *aVarntp)
67{
68 verboseLevel = 0;
69
70 volant = aVolant; // ABLA internal particle data
71 volant->iv = 0;
72 hazard = aHazard; // Random seeds
73 varntp = aVarntp; // Output data structure
74 varntp->ntrack = 0;
75
76 pace = new G4Pace();
77 ald = new G4Ald();
78 ablamain = new G4Ablamain();
79 emdpar = new G4Emdpar();
80 eenuc = new G4Eenuc();
81 ec2sub = new G4Ec2sub();
82 ecld = new G4Ecld();
83 fb = new G4Fb();
84 fiss = new G4Fiss();
85 opt = new G4Opt();
86}
87
88G4Abla::~G4Abla()
89{
90 delete pace;
91 delete ald;
92 delete ablamain;
93 delete emdpar;
94 delete eenuc;
95 delete ec2sub;
96 delete ecld;
97 delete fb;
98 delete fiss;
99 delete opt;
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(G4double nucleusA, G4double nucleusZ, G4double nucleusMass, G4double excitationEnergy,
110 G4double angularMomentum, G4double recoilEnergy, G4double momX, G4double momY, G4double momZ,
111 G4int eventnumber)
112{
113 // C ************************* EVAPORATION KHS *********
114
115 const G4double uma = 931.4942;
116 const G4double melec = 0.511;
117 const G4double fmp = 938.27231;
118 const G4double fmn = 939.56563;
119
120 // Rotation matrix...
121 G4double sitet = 0.0;
122 G4double R[4][4];
123
124 G4double plab1, gam1, eta1;
125
126 G4double plab2, gam2, eta2;
127
128 G4double stet1;
129 G4double stet2;
130
131 G4int nbpevap;
132 G4int mempaw = 0, memiv = 0;
133
134 G4double csdir1[4];
135 G4double csdir2[4];
136
137 G4double csrem[4];
138 G4double alrem = 0.0, berem = 0.0, garem = 0.0;
139
140 G4double pfis_rem[4];
141 G4double pf1_rem[4];
142
143 G4double e_evapo = 0.0;
144 G4double el;
145 G4double fmcv;
146
147 G4double aff1;
148 G4double zff1;
149 G4double eff1;
150
151 G4double aff2;
152 G4double zff2;
153 G4double eff2;
154
155 G4double v1, v2;
156
157 G4double t2 = 0.0;
158 G4double ctet1;
159 G4double ctet2 = 0.0;
160 G4double phi1;
161 G4double phi2 = 0.0;
162 G4double p2 = 0.0;
163 G4double epf2_out = 0.0 ; ///AH adding initialization
164 G4int lma_pf1 = 0, lmi_pf1 = 0;
165 G4int lma_pf2 = 0, lmi_pf2 = 0;
166 G4int nopart = 0;
167
168 G4double cst, sst, csf, ssf;
169
170 G4double zf, af, mtota, pleva, pxeva, pyeva;
171 G4int ff = 0;
172 G4int inum = eventnumber;
173 G4int inttype;
174 G4double esrem = excitationEnergy;
175
176 G4double aprf = nucleusA;
177 G4double zprf = nucleusZ;
178 G4double mcorem = nucleusMass;
179 G4double ee = excitationEnergy;
180 G4double jprf = angularMomentum; // actually root-mean-squared
181
182 G4double erecrem = recoilEnergy;
183 G4double trem;
184 G4double pxrem = momX;
185 G4double pyrem = momY;
186 G4double pzrem = momZ;
187
188 G4double remmass;
189
190 varntp->ntrack = 0;
191 volant->iv = 0;
192
193 G4double pcorem = std::sqrt(erecrem*(erecrem +2.*938.2796*nucleusA));
194 // G4double pcorem = std::sqrt(std::pow(momX,2) + std::pow(momY,2) + std::pow(momZ,2));
195 // assert(isnan(pcorem) == false);
196 if(esrem >= 1.0e-3) { //then
197 // void evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
198 // G4double *zf_par, G4double *af_par, G4double *mtota_par,
199 // G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
200 // G4double *ff_par, G4int *inttype_par, G4int *inum_par);
201 // G4cout <<"Evaporating nucleus: " << G4endl;
202 // G4cout <<"A = " << aprf << " Z = " << zprf << G4endl;
203 evapora(zprf,aprf,ee,jprf, &zf, &af, &mtota, &pleva, &pxeva, &pyeva, &ff, &inttype, &inum);
204 // assert(isnan(pleva) == false);
205 // assert(isnan(pxeva) == false);
206 // assert(isnan(pyeva) == false);
207 }
208 else {
209 ff = 0;
210 zf = zprf;
211 af = aprf;
212 pxeva = pxrem;
213 pyeva = pyrem;
214 pleva = pzrem;
215 } // endif
216 // assert(isnan(zf) == false);
217 // assert(isnan(af) == false);
218 // assert(isnan(ee) == false);
219 //
220 // AFP,ZFP is the final fragment if no fission occurs (FF=0)
221 // In case of fission (FF=1) it is the nucleus that undergoes fission.
222// G4double zfp = idnint(zf);
223// G4double afp = idnint(af);
224
225 if (ff == 1) { //then
226 // --------------------- Here, a FISSION occures --------------------------
227 //
228 // FEE: (EE) energy of fissioning nucleus ABOVE the fission barrier.
229 //
230 // calcul des impulsions des particules evaporees (avant fission)
231 // dans le systeme labo:
232
233 trem = double(erecrem);
234 remmass = pace2(aprf,zprf) + aprf*uma - zprf*melec; // canonic
235 remmass = mcorem + double(esrem); // ok
236 remmass = mcorem; //cugnon
237 varntp->kfis = 1;
238 G4double gamrem = (remmass + trem)/remmass;
239 G4double etrem = std::sqrt(trem*(trem + 2.0*remmass))/remmass;
240 // assert(isnan(etrem) == false);
241 // This is not treated as accurately as for the non fission case for which
242 // the remnant mass is computed to satisfy the energy conservation
243 // of evaporated particles. But it is not bad and more canonical!
244 remmass = pace2(aprf,zprf) + aprf*uma - zprf*melec+double(esrem); // !canonic
245 // Essais avec la masse de KHS (9/2002):
246 el = 0.0;
247 mglms(aprf,zprf,0,&el);
248 remmass = zprf*fmp + (aprf-zprf)*fmn + el + double(esrem);
249
250 gamrem = std::sqrt(std::pow(pcorem,2) + std::pow(remmass,2))/remmass;
251 // assert(isnan(gamrem) == false);
252 etrem = pcorem/remmass;
253 // assert(isnan(etrem) == false);
254
255 alrem = pxrem/pcorem;
256 // assert(isnan(alrem) == false);
257 berem = pyrem/pcorem;
258 // assert(isnan(berem) == false);
259 garem = pzrem/pcorem;
260 // assert(isnan(garem) == false);
261
262 csrem[0] = 0.0; // Should not be used.
263 csrem[1] = alrem;
264 csrem[2] = berem;
265 csrem[3] = garem;
266
267 // C Pour Vérif Remnant = evapo(Pre fission) + Noyau_fissionant (systÚme Remnant)
268 G4double bil_e = 0.0;
269 G4double bil_px = 0.0;
270 G4double bil_py = 0.0;
271 G4double bil_pz = 0.0;
272 G4double masse = 0.0;
273
274 for(G4int iloc = 1; iloc <= volant->iv; iloc++) { //DO iloc=1,iv
275 // assert(isnan(volant->zpcv[iloc]) == false);
276 // assert(volant->acv[iloc] != 0);
277 // assert(volant->zpcv[iloc] != 0);
278 mglms(double(volant->acv[iloc]),double(volant->zpcv[iloc]),0,&el);
279 // assert(isnan(el) == false);
280 masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el;
281 // assert(isnan(masse) == false);
282 bil_e = bil_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
283 // assert(isnan(bil_e) == false);
284 bil_px = bil_px + volant->pcv[iloc]*(volant->xcv[iloc]);
285 bil_py = bil_py + volant->pcv[iloc]*(volant->ycv[iloc]);
286 bil_pz = bil_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
287 } // enddo
288 // C Ce bilan (impulsion nulle) est parfait. (Bil_Px=Bil_Px+PXEVA....)
289
290 G4int ndec = 1;
291
292 if(volant->iv != 0) { //then
293 if(verboseLevel > 2) {
294 G4cout <<"varntp->ntrack = " << varntp->ntrack << G4endl;
295 G4cout <<"1st Translab: Adding indices from " << ndec << " to " << volant->iv << G4endl;
296 }
297 nopart = varntp->ntrack - 1;
298 translab(gamrem,etrem,csrem,nopart,ndec);
299 if(verboseLevel > 2) {
300 G4cout <<"Translab complete!" << G4endl;
301 G4cout <<"varntp->ntrack = " << varntp->ntrack << G4endl;
302 }
303 }
304 nbpevap = volant->iv; // nombre de particules d'evaporation traitees
305
306 // C
307 // C Now calculation of the fission fragment distribution including
308 // C evaporation from the fragments.
309 // C
310
311 // C Distribution of the fission fragments:
312
313 // void fissionDistri(G4double a,G4double z,G4double e,
314 // G4double &a1,G4double &z1,G4double &e1,G4double &v1,
315 // G4double &a2,G4double &z2,G4double &e2,G4double &v2);
316
317 fissionDistri(af,zf,ee,aff1,zff1,eff1,v1,aff2,zff2,eff2,v2);
318
319 // C verif des A et Z decimaux:
320 G4int na_f = int(std::floor(af + 0.5));
321 G4int nz_f = int(std::floor(zf + 0.5));
322 varntp->izfis = nz_f; // copie dans le ntuple
323 varntp->iafis = na_f;
324 G4int na_pf1 = int(std::floor(aff1 + 0.5));
325 G4int nz_pf1 = int(std::floor(zff1 + 0.5));
326 G4int na_pf2 = int(std::floor(aff2 + 0.5));
327 G4int nz_pf2 = int(std::floor(zff2 + 0.5));
328
329 if((na_f != (na_pf1+na_pf2)) || (nz_f != (nz_pf1+nz_pf2))) {
330 if(verboseLevel > 2) {
331 G4cout <<"problemes arrondis dans la fission " << G4endl;
332 G4cout << "af,zf,aff1,zff1,aff2,zff2" << G4endl;
333 G4cout << af <<" , " << zf <<" , " << aff1 <<" , " << zff1 <<" , " << aff2 <<" , " << zff2 << G4endl;
334 G4cout << "a,z,a1,z1,a2,z2 integer" << G4endl;
335 G4cout << na_f <<" , " << nz_f <<" , " << na_pf1 <<" , " << nz_pf1 <<" , " << na_pf2 <<" , " << nz_pf2 << G4endl;
336 }
337 }
338
339 // Calcul de l'impulsion des PF dans le syteme noyau de fission:
340 G4int kboud = idnint(zf);
341 G4int jboud = idnint(af-zf);
342 //G4double ef = fb->efa[kboud][jboud]; // barriere de fission
343 G4double ef = fb->efa[jboud][kboud]; // barriere de fission
344 // assert(isnan(ef) == false);
345 varntp->estfis = ee + ef; // copie dans le ntuple
346
347 // C MASSEF = pace2(AF,ZF)
348 // C MASSEF = MASSEF + AF*UMA - ZF*MELEC + EE + EF
349 // C MASSE1 = pace2(DBLE(AFF1),DBLE(ZFF1))
350 // C MASSE1 = MASSE1 + AFF1*UMA - ZFF1*MELEC + EFF1
351 // C MASSE2 = pace2(DBLE(AFF2),DBLE(ZFF2))
352 // C MASSE2 = MASSE2 + AFF2*UMA - ZFF2*MELEC + EFF2
353 // C WRITE(6,*) 'MASSEF,MASSE1,MASSE2',MASSEF,MASSE1,MASSE2
354 // C MGLMS est la fonction de masse cohérente avec KHS evapo-fis.
355 // C Attention aux parametres, ici 0=OPTSHP, NO microscopic correct.
356 mglms(af,zf,0,&el);
357 // assert(isnan(el) == false);
358 G4double massef = zf*fmp + (af - zf)*fmn + el + ee + ef;
359 // assert(isnan(massef) == false);
360 mglms(double(aff1),double(zff1),0,&el);
361 // assert(isnan(el) == false);
362 G4double masse1 = zff1*fmp + (aff1-zff1)*fmn + el + eff1;
363 // assert(isnan(masse1) == false);
364 mglms(aff2,zff2,0,&el);
365 // assert(isnan(el) == false);
366 G4double masse2 = zff2*fmp + (aff2 - zff2)*fmn + el + eff2;
367 // assert(isnan(masse2) == false);
368 // C WRITE(6,*) 'MASSEF,MASSE1,MASSE2',MASSEF,MASSE1,MASSE2
369 G4double b = massef - masse1 - masse2;
370 if(b < 0.0) { //then
371 b=0.0;
372 if(verboseLevel > 2) {
373 G4cout <<"anomalie dans la fission: " << G4endl;
374 G4cout << inum<< " , " << af<< " , " <<zf<< " , " <<massef<< " , " <<aff1<< " , " <<zff1<< " , " <<masse1<< " , " <<aff2<< " , " <<zff2<< " , " << masse2 << G4endl;
375 }
376 } //endif
377 G4double t1 = b*(b + 2.0*masse2)/(2.0*massef);
378 // assert(isnan(t1) == false);
379 G4double p1 = std::sqrt(t1*(t1 + 2.0*masse1));
380 // assert(isnan(p1) == false);
381
382 G4double rndm;
383 standardRandom(&rndm, &(hazard->igraine[13]));
384 ctet1 = 2.0*rndm - 1.0;
385 standardRandom(&rndm,&(hazard->igraine[9]));
386 phi1 = rndm*2.0*3.141592654;
387
388 // C ----Coefs de la transformation de Lorentz (noyau de fission -> Remnant)
389 G4double peva = std::pow(pxeva,2) + std::pow(pyeva,2) + std::pow(pleva,2);
390 G4double gamfis = std::sqrt(std::pow(massef,2) + peva)/massef;
391 // assert(isnan(gamfis) == false);
392 peva = std::sqrt(peva);
393 // assert(isnan(peva) == false);
394 G4double etfis = peva/massef;
395
396 G4double epf1_in;
397 G4double epf1_out;
398
399 // C ----Matrice de rotation (noyau de fission -> Remnant)
400 if(peva >= 1.0e-4) {
401 sitet = std::sqrt(std::pow(pxeva,2)+std::pow(pyeva,2))/peva;
402 // assert(isnan(sitet) == false);
403 }
404 if(sitet > 1.0e-5) { //then
405 G4double cstet = pleva/peva;
406 G4double siphi = pyeva/(sitet*peva);
407 G4double csphi = pxeva/(sitet*peva);
408
409 R[1][1] = cstet*csphi;
410 R[1][2] = -siphi;
411 R[1][3] = sitet*csphi;
412 R[2][1] = cstet*siphi;
413 R[2][2] = csphi;
414 R[2][3] = sitet*siphi;
415 R[3][1] = -sitet;
416 R[3][2] = 0.0;
417 R[3][3] = cstet;
418 }
419 else {
420 R[1][1] = 1.0;
421 R[1][2] = 0.0;
422 R[1][3] = 0.0;
423 R[2][1] = 0.0;
424 R[2][2] = 1.0;
425 R[2][3] = 0.0;
426 R[3][1] = 0.0;
427 R[3][2] = 0.0;
428 R[3][3] = 1.0;
429 } // endif
430 // c test de verif:
431
432 if((zff1 <= 0.0) || (aff1 <= 0.0) || (aff1 < zff1)) { //then
433 if(verboseLevel > 2) {
434 G4cout <<"zf = " << zf <<" af = " << af <<"ee = " << ee <<"zff1 = " << zff1 <<"aff1 = " << aff1 << G4endl;
435 }
436 }
437 else {
438 // C ---------------------- PF1 will evaporate
439 epf1_in = double(eff1);
440 epf1_out = epf1_in;
441 // void evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
442 // G4double *zf_par, G4double *af_par, G4double *mtota_par,
443 // G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
444 // G4double *ff_par, G4int *inttype_par, G4int *inum_par);
445 G4double zf1, af1, malpha1, ffpleva1, ffpxeva1, ffpyeva1;
446 G4int ff1, ftype1;
447 evapora(zff1, aff1, epf1_out, 0.0, &zf1, &af1, &malpha1, &ffpleva1,
448 &ffpxeva1, &ffpyeva1, &ff1, &ftype1, &inum);
449 // C On ajoute le fragment:
450 // assert(af1 > 0);
451 volant->iv = volant->iv + 1;
452 // assert(af1 != 0);
453 // assert(zf1 != 0);
454 volant->acv[volant->iv] = af1;
455 volant->zpcv[volant->iv] = zf1;
456 if(verboseLevel > 2) {
457 G4cout <<"Added fission fragment: a = " << volant->acv[volant->iv] << " z = " << volant->zpcv[volant->iv] << G4endl;
458 }
459 peva = std::sqrt(std::pow(ffpxeva1,2) + std::pow(ffpyeva1,2) + std::pow(ffpleva1,2));
460 // assert(isnan(peva) == false);
461 volant->pcv[volant->iv] = peva;
462 if(peva > 0.001) { // then
463 volant->xcv[volant->iv] = ffpxeva1/peva;
464 volant->ycv[volant->iv] = ffpyeva1/peva;
465 volant->zcv[volant->iv] = ffpleva1/peva;
466 }
467 else {
468 volant->xcv[volant->iv] = 1.0;
469 volant->ycv[volant->iv] = 0.0;
470 volant->zcv[volant->iv] = 0.0;
471 } // end if
472
473 // C Pour Vérif evapo de PF1 dans le systeme du Noyau Fissionant
474 G4double bil1_e = 0.0;
475 G4double bil1_px = 0.0;
476 G4double bil1_py=0.0;
477 G4double bil1_pz=0.0;
478 for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
479 // for(G4int iloc = nbpevap + 1; iloc <= volant->iv + 1; iloc++) { //do iloc=nbpevap+1,iv
480 mglms(volant->acv[iloc], volant->zpcv[iloc],0,&el);
481 masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el;
482 // assert(isnan(masse) == false);
483 bil1_e = bil1_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
484 // assert(isnan(bil1_e) == false);
485 bil1_px = bil1_px + volant->pcv[iloc]*(volant->xcv[iloc]);
486 bil1_py = bil1_py + volant->pcv[iloc]*(volant->ycv[iloc]);
487 bil1_pz = bil1_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
488 } // enddo
489
490 // Calcul des cosinus directeurs de PF1 dans le Remnant et calcul
491 // des coefs pour la transformation de Lorentz Systeme PF --> Systeme Remnant
492 translabpf(masse1,t1,p1,ctet1,phi1,gamfis,etfis,R,&plab1,&gam1,&eta1,csdir1);
493
494 // calcul des impulsions des particules evaporees dans le systeme Remnant:
495 if(verboseLevel > 2) {
496 G4cout <<"2nd Translab (pf1 evap): Adding indices from " << nbpevap+1 << " to " << volant->iv << G4endl;
497 }
498 nopart = varntp->ntrack - 1;
499 translab(gam1,eta1,csdir1,nopart,nbpevap+1);
500 if(verboseLevel > 2) {
501 G4cout <<"After translab call... varntp->ntrack = " << varntp->ntrack << G4endl;
502 }
503 memiv = nbpevap + 1; // memoires pour la future transformation
504 mempaw = nopart; // remnant->labo pour pf1 et pf2.
505 lmi_pf1 = nopart + nbpevap + 1; // indices min et max dans /var_ntp/
506 lma_pf1 = nopart + volant->iv; // des particules issues de pf1
507 nbpevap = volant->iv; // nombre de particules d'evaporation traitees
508 } // end if
509 // C --------------------- End of PF1 calculation
510
511 // c test de verif:
512 if((zff2 <= 0.0) || (aff2 <= 0.0) || (aff2 <= zff2)) { //then
513 if(verboseLevel > 2) {
514 G4cout << zf << " " << af << " " << ee << " " << zff2 << " " << aff2 << G4endl;
515 }
516 }
517 else {
518 // C ---------------------- PF2 will evaporate
519 G4double epf2_in = double(eff2);
520 G4double epf2_out = epf2_in;
521 // void evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
522 // G4double *zf_par, G4double *af_par, G4double *mtota_par,
523 // G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
524 // G4double *ff_par, G4int *inttype_par, G4int *inum_par);
525 G4double zf2, af2, malpha2, ffpleva2, ffpxeva2, ffpyeva2;
526 G4int ff2, ftype2;
527 evapora(zff2,aff2,epf2_out,0.0,&zf2,&af2,&malpha2,&ffpleva2,
528 &ffpxeva2,&ffpyeva2,&ff2,&ftype2,&inum);
529 // C On ajoute le fragment:
530 volant->iv = volant->iv + 1;
531 volant->acv[volant->iv] = af2;
532 volant->zpcv[volant->iv] = zf2;
533 if(verboseLevel > 2) {
534 G4cout <<"Added fission fragment: a = " << volant->acv[volant->iv] << " z = " << volant->zpcv[volant->iv] << G4endl;
535 }
536 peva = std::sqrt(std::pow(ffpxeva2,2) + std::pow(ffpyeva2,2) + std::pow(ffpleva2,2));
537 // assert(isnan(peva) == false);
538 volant->pcv[volant->iv] = peva;
539 // exit(0);
540 if(peva > 0.001) { //then
541 volant->xcv[volant->iv] = ffpxeva2/peva;
542 volant->ycv[volant->iv] = ffpyeva2/peva;
543 volant->zcv[volant->iv] = ffpleva2/peva;
544 }
545 else {
546 volant->xcv[volant->iv] = 1.0;
547 volant->ycv[volant->iv] = 0.0;
548 volant->zcv[volant->iv] = 0.0;
549 } //end if
550 // C Pour Vérif evapo de PF1 dans le systeme du Noyau Fissionant
551 G4double bil2_e = 0.0;
552 G4double bil2_px = 0.0;
553 G4double bil2_py = 0.0;
554 G4double bil2_pz = 0.0;
555 // for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
556 for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
557 mglms(volant->acv[iloc],volant->zpcv[iloc],0,&el);
558 masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el;
559 bil2_e = bil2_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
560 // assert(isnan(bil2_e) == false);
561 bil2_px = bil2_px + volant->pcv[iloc]*(volant->xcv[iloc]);
562 bil2_py = bil2_py + volant->pcv[iloc]*(volant->ycv[iloc]);
563 bil2_pz = bil2_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
564 } //enddo
565
566 // C ----Calcul des cosinus directeurs de PF2 dans le Remnant et calcul
567 // c des coefs pour la transformation de Lorentz Systeme PF --> Systeme Remnant
568 G4double t2 = b - t1;
569 // G4double ctet2 = -ctet1;
570 ctet2 = -1.0*ctet1;
571 assert(std::fabs(ctet2) <= 1.0);
572 // assert(isnan(ctet2) == false);
573 phi2 = dmod(phi1+3.141592654,6.283185308);
574 // assert(isnan(phi2) == false);
575 G4double p2 = std::sqrt(t2*(t2+2.0*masse2));
576 // assert(isnan(p2) == false);
577
578 // void translabpf(G4double masse1, G4double t1, G4double p1, G4double ctet1,
579 // G4double phi1, G4double gamrem, G4double etrem, G4double R[][4],
580 // G4double *plab1, G4double *gam1, G4double *eta1, G4double csdir[]);
581 translabpf(masse2,t2,p2,ctet2,phi2,gamfis,etfis,R,&plab2,&gam2,&eta2,csdir2);
582 // C
583 // C calcul des impulsions des particules evaporees dans le systeme Remnant:
584 // c
585 if(verboseLevel > 2) {
586 G4cout <<"3rd Translab (pf2 evap): Adding indices from " << nbpevap+1 << " to " << volant->iv << G4endl;
587 }
588 nopart = varntp->ntrack - 1;
589 translab(gam2,eta2,csdir2,nopart,nbpevap+1);
590 lmi_pf2 = nopart + nbpevap + 1; // indices min et max dans /var_ntp/
591 lma_pf2 = nopart + volant->iv; // des particules issues de pf2
592 } // end if
593 // C --------------------- End of PF2 calculation
594
595 // C Pour vérifications: calculs du noyau fissionant et des PF dans
596 // C le systeme du remnant.
597 for(G4int iloc = 1; iloc <= 3; iloc++) { // do iloc=1,3
598 pfis_rem[iloc] = 0.0;
599 } // enddo
600 G4double efis_rem, pfis_trav[4];
601 lorab(gamfis,etfis,massef,pfis_rem,&efis_rem,pfis_trav);
602 rotab(R,pfis_trav,pfis_rem);
603
604 stet1 = std::sqrt(1.0 - std::pow(ctet1,2));
605 // assert(isnan(stet1) == false);
606 pf1_rem[1] = p1*stet1*std::cos(phi1);
607 pf1_rem[2] = p1*stet1*std::sin(phi1);
608 pf1_rem[3] = p1*ctet1;
609 G4double e1_rem;
610 lorab(gamfis,etfis,masse1+t1,pf1_rem,&e1_rem,pfis_trav);
611 rotab(R,pfis_trav,pf1_rem);
612
613 stet2 = std::sqrt(1.0 - std::pow(ctet2,2));
614 assert(std::pow(ctet2,2) >= 0.0);
615 assert(std::pow(ctet2,2) <= 1.0);
616 // assert(isnan(stet2) == false);
617
618 G4double pf2_rem[4];
619 G4double e2_rem;
620 pf2_rem[1] = p2*stet2*std::cos(phi2);
621 pf2_rem[2] = p2*stet2*std::sin(phi2);
622 pf2_rem[3] = p2*ctet2;
623 lorab(gamfis,etfis,masse2+t2,pf2_rem,&e2_rem,pfis_trav);
624 rotab(R,pfis_trav,pf2_rem);
625 // C Verif 0: Remnant = evapo_pre_fission + Noyau Fissionant
626 bil_e = remmass - efis_rem - bil_e;
627 bil_px = bil_px + pfis_rem[1];
628 bil_py = bil_py + pfis_rem[2];
629 bil_pz = bil_pz + pfis_rem[3];
630 // C Verif 1: noyau fissionant = PF1 + PF2 dans le systeme remnant
631 // G4double bilan_e = efis_rem - e1_rem - e2_rem;
632 // G4double bilan_px = pfis_rem[1] - pf1_rem[1] - pf2_rem[1];
633 // G4double bilan_py = pfis_rem[2] - pf1_rem[2] - pf2_rem[2];
634 // G4double bilan_pz = pfis_rem[3] - pf1_rem[3] - pf2_rem[3];
635 // C Verif 2: PF1 et PF2 egaux a toutes leurs particules evaporees
636 // C (Systeme remnant)
637 if((lma_pf1-lmi_pf1) != 0) { //then
638 G4double bil_e_pf1 = e1_rem - epf1_out;
639 G4double bil_px_pf1 = pf1_rem[1];
640 G4double bil_py_pf1 = pf1_rem[2];
641 G4double bil_pz_pf1 = pf1_rem[3];
642 for(G4int ipf1 = lmi_pf1; ipf1 <= lma_pf1; ipf1++) { //do ipf1=lmi_pf1,lma_pf1
643 bil_e_pf1 = bil_e_pf1 - (std::pow(varntp->plab[ipf1],2) + std::pow(varntp->enerj[ipf1],2))/(2.0*(varntp->enerj[ipf1]));
644 cst = std::cos(varntp->tetlab[ipf1]/57.2957795);
645 sst = std::sin(varntp->tetlab[ipf1]/57.2957795);
646 csf = std::cos(varntp->philab[ipf1]/57.2957795);
647 ssf = std::sin(varntp->philab[ipf1]/57.2957795);
648 bil_px_pf1 = bil_px_pf1 - varntp->plab[ipf1]*sst*csf;
649 bil_py_pf1 = bil_py_pf1 - varntp->plab[ipf1]*sst*ssf;
650 bil_pz_pf1 = bil_pz_pf1 - varntp->plab[ipf1]*cst;
651 } // enddo
652 } //endif
653
654 if((lma_pf2-lmi_pf2) != 0) { //then
655 G4double bil_e_pf2 = e2_rem - epf2_out;
656 G4double bil_px_pf2 = pf2_rem[1];
657 G4double bil_py_pf2 = pf2_rem[2];
658 G4double bil_pz_pf2 = pf2_rem[3];
659 for(G4int ipf2 = lmi_pf2; ipf2 <= lma_pf2; ipf2++) { //do ipf2=lmi_pf2,lma_pf2
660 bil_e_pf2 = bil_e_pf2 - (std::pow(varntp->plab[ipf2],2) + std::pow(varntp->enerj[ipf2],2))/(2.0*(varntp->enerj[ipf2]));
661 G4double cst = std::cos(varntp->tetlab[ipf2]/57.2957795);
662 G4double sst = std::sin(varntp->tetlab[ipf2]/57.2957795);
663 G4double csf = std::cos(varntp->philab[ipf2]/57.2957795);
664 G4double ssf = std::sin(varntp->philab[ipf2]/57.2957795);
665 bil_px_pf2 = bil_px_pf2 - varntp->plab[ipf2]*sst*csf;
666 bil_py_pf2 = bil_py_pf2 - varntp->plab[ipf2]*sst*ssf;
667 bil_pz_pf2 = bil_pz_pf2 - varntp->plab[ipf2]*cst;
668 } // enddo
669 } //endif
670 // C
671 // C ---- Transformation systeme Remnant -> systeme labo. (evapo de PF1 ET PF2)
672 // C
673 // G4double mempaw, memiv;
674 if(verboseLevel > 2) {
675 G4cout <<"4th Translab: Adding indices from " << memiv << " to " << volant->iv << G4endl;
676 }
677 translab(gamrem,etrem,csrem,mempaw,memiv);
678 // C ******************* END of fission calculations ************************
679 }
680 else {
681 // C ************************ Evapo sans fission *****************************
682 // C Here, FF=0, --> Evapo sans fission, on ajoute le fragment:
683 // C *************************************************************************
684 varntp->kfis = 0;
685 if(verboseLevel > 2) {
686 G4cout <<"Evaporation without fission" << G4endl;
687 }
688 volant->iv = volant->iv + 1;
689 volant->acv[volant->iv] = af;
690 volant->zpcv[volant->iv] = zf;
691 G4double peva = std::sqrt(std::pow(pxeva,2)+std::pow(pyeva,2)+std::pow(pleva,2));
692 // assert(isnan(peva) == false);
693 volant->pcv[volant->iv] = peva;
694 if(peva > 0.001) { //then
695 volant->xcv[volant->iv] = pxeva/peva;
696 volant->ycv[volant->iv] = pyeva/peva;
697 volant->zcv[volant->iv] = pleva/peva;
698 }
699 else {
700 volant->xcv[volant->iv] = 1.0;
701 volant->ycv[volant->iv] = 0.0;
702 volant->zcv[volant->iv] = 0.0;
703 } // end if
704
705 // C
706 // C calcul des impulsions des particules evaporees dans le systeme labo:
707 // c
708 trem = double(erecrem);
709 // C REMMASS = pace2(APRF,ZPRF) + APRF*UMA - ZPRF*MELEC !Canonic
710 // C REMMASS = MCOREM + DBLE(ESREM) !OK
711 remmass = mcorem; //Cugnon
712 // C GAMREM = (REMMASS + TREM)/REMMASS !OK
713 // C ETREM = DSQRT(TREM*(TREM + 2.*REMMASS))/REMMASS !OK
714 csrem[0] = 0.0; // Should not be used.
715 csrem[1] = alrem;
716 csrem[2] = berem;
717 csrem[3] = garem;
718
719 // for(G4int j = 1; j <= volant->iv; j++) { //do j=1,iv
720 for(G4int j = 1; j <= volant->iv; j++) { //do j=1,iv
721 if(volant->acv[j] == 0) {
722 if(verboseLevel > 2) {
723 G4cout <<"volant->acv[" << j << "] = 0" << G4endl;
724 G4cout <<"volant->iv = " << volant->iv << G4endl;
725 }
726 }
727 if(volant->acv[j] > 0) {
728 assert(volant->acv[j] != 0);
729 // assert(volant->zpcv[j] != 0);
730 mglms(volant->acv[j],volant->zpcv[j],0,&el);
731 fmcv = volant->zpcv[j]*fmp + (volant->acv[j] - volant->zpcv[j])*fmn + el;
732 e_evapo = e_evapo + std::sqrt(std::pow(volant->pcv[j],2) + std::pow(fmcv,2));
733 // assert(isnan(e_evapo) == false);
734 }
735 } // enddo
736
737 // C Redefinition pour conservation d'impulsion!!!
738 // C this mass obtained by energy balance is very close to the
739 // C mass of the remnant computed by pace2 + excitation energy (EE). (OK)
740 remmass = e_evapo;
741
742 G4double gamrem = std::sqrt(std::pow(pcorem,2)+std::pow(remmass,2))/remmass;
743 // assert(isnan(gamrem) == false);
744 G4double etrem = pcorem/remmass;
745
746 if(verboseLevel > 2) {
747 G4cout <<"5th Translab (no fission): Adding indices from " << 1 << " to " << volant->iv << G4endl;
748 }
749 nopart = varntp->ntrack - 1;
750 translab(gamrem,etrem,csrem,nopart,1);
751
752 // C End of the (FISSION - NO FISSION) condition (FF=1 or 0)
753 } //end if
754 // C *********************** FIN de l'EVAPO KHS ********************
755}
756
757// Evaporation code
758void G4Abla::initEvapora()
759{
760 // 6 C *******************************************************************
761 // 7 C
762 // 8 C SUBROUTINE ABLAINIT(STATUS,TSTAT,NAME,FPATH)
763 // 9 C********************************************************************
764 // 10
765 // 11 SUBROUTINE INIT_EVAPORA(RACINE)
766 // 12
767 // 13 C********************************************************************
768 // 14 C ON INPUT: INPUT PARAMETERS FROM FILE
769 // 15 C---------------------------------------------------------------------
770 // 16 C ON OUTPUT:
771 // 17 C STATUS - FLAG FOR END OF INPUT FILE
772 // 18 C TSTAT - FLAG FOR NTUPLE-OUTPUT
773 // 19 C NAME - NAME FOR ISOTOPIC PRODUCTION CROSS SECTION FILES
774 // 20 C FPATH - PATH FOR " " " " "
775 // 21 C---------------------------------------------------------------------
776 // 22 C
777 // 23 C Modification 5-january-2000 by KHS and BJ
778 // 24 C
779 // 25 C New treatment of dissipation.
780 // 26 C See report of Beatriz Jurado, Jan. 2000
781 // 27 C
782 // 28 C---------------------------------------------------------------------
783 // 29 C
784 // 30 C MODIFICATION 6-aug-1999 by JB and MVR
785 // 31 C
786 // 32 C Some problems arised from an uncorrect evaluation of the fission barrier
787 // 33 C { 1) shell correction ( ECGNZ(J,K) ) was not subctracted (20-jul-99)
788 // 34 C 2) fiss. barrier EF was calc. before ang. mom. correct. (6-aug-99) }
789 // 35 C
790 // 36 C---------------------------------------------------------------------
791 // 37 C PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS
792 // 38 C COMMON /ABLAMAIN/ AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC,
793 // 39 C R_0,R_P,R_T, IMAX,IRNDM,PI,
794 // 40 C BFPRO,SNPRO,SPPRO,SHELL
795 // 41 C
796 // 42 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES
797 // 43 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C
798 // 44 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC.
799 // 45 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION
800 // 46 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII
801 // 47 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141...
802 // 48 C BFPRO - FISSION BARRIER OF THE PROJECTILE
803 // 49 C SNPRO - NEUTRON SEPARATION ENERGY OF THE PROJECTILE
804 // 50 C SPPRO - PROTON " " " " "
805 // 51 C SHELL - GROUND STATE SHELL CORRECTION
806 // 52 C---------------------------------------------------------------------
807 // 53 C
808 // 54 C ENERGIES WIDTHS AND CROSS SECTIONS FOR EM EXCITATION
809 // 55 C COMMON /EMDPAR/ EGDR,EGQR,FWHMGDR,FWHMGQR,CREMDE1,CREMDE2,
810 // 56 C AE1,BE1,CE1,AE2,BE2,CE2,SR1,SR2,XR
811 // 57 C
812 // 58 C EGDR,EGQR - MEAN ENERGY OF GDR AND GQR
813 // 59 C FWHMGDR,FWHMGQR - FWHM OF GDR, GQR
814 // 60 C CREMDE1,CREMDE2 - EM CROSS SECTION FOR E1 AND E2
815 // 61 C AE1,BE1,CE1 - ARRAYS TO CALCULATE
816 // 62 C AE2,BE2,CE2 - THE EXCITATION ENERGY AFTER E.M. EXC.
817 // 63 C SR1,SR2,XR - WITH MONTE CARLO
818 // 64 C---------------------------------------------------------------------
819 // 65 C
820 // 66 C DEFORMATIONS AND G.S. SHELL EFFECTS
821 // 67 C COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA
822 // 68 C
823 // 69 C ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S.
824 // 70 C ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0)
825 // 71 C VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE
826 // 72 C ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!)
827 // 73 C BETA2 = SQRT(5/(4PI)) * ALPHA
828 // 74 C---------------------------------------------------------------------
829 // 75 C
830 // 76 C ARRAYS FOR EXCITATION ENERGY BY STATISTICAL HOLE ENERY MODEL
831 // 77 C COMMON /EENUC/ SHE, XHE
832 // 78 C
833 // 79 C SHE, XHE - ARRAYS TO CALCULATE THE EXC. ENERGY AFTER
834 // 80 C ABRASION BY THE STATISTICAL HOLE ENERGY MODEL
835 // 81 C---------------------------------------------------------------------
836 // 82 C
837 // 83 C G.S. SHELL EFFECT
838 // 84 C COMMON /EC2SUB/ ECNZ
839 // 85 C
840 // 86 C ECNZ G.S. SHELL EFFECT FOR THE MASSES (IDENTICAL TO ECGNZ)
841 // 87 C---------------------------------------------------------------------
842 // 88 C
843 // 89 C OPTIONS AND PARAMETERS FOR FISSION CHANNEL
844 // 90 C COMMON /FISS/ AKAP,BET,HOMEGA,KOEFF,IFIS,
845 // 91 C OPTSHP,OPTXFIS,OPTLES,OPTCOL
846 // 92 C
847 // 93 C AKAP - HBAR**2/(2* MN * R_0**2) = 10 MEV
848 // 94 C BET - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1)
849 // 95 C HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV
850 // 96 C KOEFF - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0
851 // 97 C IFIS - 0/1 FISSION CHANNEL OFF/ON
852 // 98 C OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY
853 // 99 C = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY
854 // 100 C = 1 SHELL , NO PAIRING
855 // 101 C = 2 PAIRING, NO SHELL
856 // 102 C = 3 SHELL AND PAIRING
857 // 103 C OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF
858 // 104 C OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV
859 // 105 C FISSILITY PARAMETER.
860 // 106 C OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224
861 // 107 C OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON
862 // 108 C---------------------------------------------------------------------
863 // 109 C
864 // 110 C OPTIONS
865 // 111 C COMMON /OPT/ OPTEMD,OPTCHA,EEFAC
866 // 112 C
867 // 113 C OPTEMD - 0/1 NO EMD / INCL. EMD
868 // 114 C OPTCHA - 0/1 0 GDR / 1 HYPERGEOMETRICAL PREFRAGMENT-CHARGE-DIST.
869 // 115 C *** RECOMMENDED IS OPTCHA = 1 ***
870 // 116 C EEFAC - EXCITATION ENERGY FACTOR, 2.0 RECOMMENDED
871 // 117 C---------------------------------------------------------------------
872 // 118 C
873 // 119 C FISSION BARRIERS
874 // 120 C COMMON /FB/ EFA
875 // 121 C EFA - ARRAY OF FISSION BARRIERS
876 // 122 C---------------------------------------------------------------------
877 // 123 C
878 // 124 C p LEVEL DENSITY PARAMETERS
879 // 125 C COMMON /ALD/ AV,AS,AK,OPTAFAN
880 // 126 C AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE
881 // 127 C LEVEL DENSITY PARAMETER
882 // 128 C OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1
883 // 129 C RECOMMENDED IS OPTAFAN = 0
884 // 130 C---------------------------------------------------------------------
885 // 131 C ____________________________________________________________________
886 // 132 C /
887 // 133 C / INITIALIZES PARAMETERS IN COMMON /ABRAMAIN/, /EMDPAR/, /ECLD/ ...
888 // 134 C / PROJECTILE PARAMETERS, EMD PARAMETERS, SHELL CORRECTION TABLES.
889 // 135 C / CALCULATES MAXIMUM IMPACT PARAMETER FOR NUCLEAR COLLISIONS AND
890 // 136 C / TOTAL GEOMETRICAL CROSS SECTION + EMD CROSS SECTIONS
891 // 137 C ____________________________________________________________________
892 // 138 C
893 // 139 C
894 // 201 C
895 // 202 C---------- SET INPUT VALUES
896 // 203 C
897 // 204 C *** INPUT FROM UNIT 10 IN THE FOLLOWING SEQUENCE !
898 // 205 C AP1 = INTEGER !
899 // 206 C ZP1 = INTEGER !
900 // 207 C AT1 = INTEGER !
901 // 208 C ZT1 = INTEGER !
902 // 209 C EAP = REAL !
903 // 210 C IMAX = INTEGER !
904 // 211 C IFIS = INTEGER SWITCH FOR FISSION
905 // 212 C OPTSHP = INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY
906 // 213 C =0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY
907 // 214 C =1 SHELL , NO PAIRING CORRECTION
908 // 215 C =2 PAIRING, NO SHELL CORRECTION
909 // 216 C =3 SHELL AND PAIRING CORRECTION IN MASSES AND ENERGY
910 // 217 C OPTEMD =0,1 0 NO EMD, 1 INCL. EMD
911 // 218 C ELECTROMAGNETIC DISSOZIATION IS CALCULATED AS WELL.
912 // 219 C OPTCHA =0,1 0 GDR- , 1 HYPERGEOMETRICAL PREFRAGMENT-CHARGE-DIST.
913 // 220 C RECOMMENDED IS OPTCHA=1
914 // 221 C OPTCOL =0,1 COLLECTIVE ENHANCEMENT SWITCHED ON 1 OR OFF 0 IN DENSN
915 // 222 C OPTAFAN=0,1 SWITCH FOR AF/AN = 1 IN DENSNIV 0 AF/AN>1 1 AF/AN=1
916 // 223 C AKAP = REAL ALWAYS EQUALS 10
917 // 224 C BET = REAL REDUCED FRICTION COEFFICIENT / 10**(+21) S**(-1)
918 // 225 C HOMEGA = REAL CURVATURE / MEV RECOMMENDED = 1. MEV
919 // 226 C KOEFF = REAL COEFFICIENT FOR FISSION BARRIER
920 // 227 C OPTXFIS= INTEGER 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV
921 // 228 C FISSILITY PARAMETER.
922 // 229 C EEFAC = REAL EMPIRICAL FACTOR FOR THE EXCITATION ENERGY
923 // 230 C RECOMMENDED 2.D0, STATISTICAL ABRASION MODELL 1.D0
924 // 231 C AV = REAL KOEFFICIENTS FOR CALCULATION OF A(TILDE)
925 // 232 C AS = REAL LEVEL DENSITY PARAMETER
926 // 233 C AK = REAL
927 // 234 C
928 // 235 C This following inputs will be initialized in the main through the
929 // 236 C common /ABLAMAIN/ (A.B.)
930 // 237
931
932 // switch-fission.1=on.0=off
933 fiss->ifis = 1;
934
935 // shell+pairing.0-1-2-3
936 fiss->optshp = 0;
937
938 // optemd =0,1 0 no emd, 1 incl. emd
939 opt->optemd = 1;
940 // read(10,*,iostat=io) dum(10),optcha
941 opt->optcha = 1;
942
943 // not.to.be.changed.(akap)
944 fiss->akap = 10.0;
945
946 // nuclear.viscosity.(beta)
947 fiss->bet = 1.5;
948
949 // potential-curvature
950 fiss->homega = 1.0;
951
952 // fission-barrier-coefficient
953 fiss->koeff = 1.;
954
955 //collective enhancement switched on 1 or off 0 in densn (qr=val or =1.)
956 fiss->optcol = 0;
957
958 // switch-for-low-energy-sys
959 fiss->optles = 0;
960
961 opt->eefac = 2.;
962
963 ald->optafan = 0;
964
965 ald->av = 0.073e0;
966 ald->as = 0.095e0;
967 ald->ak = 0.0e0;
968
969 if(verboseLevel > 3) {
970 G4cout <<"ifis " << fiss->ifis << G4endl;
971 G4cout <<"optshp " << fiss->optshp << G4endl;
972 G4cout <<"optemd " << opt->optemd << G4endl;
973 G4cout <<"optcha " << opt->optcha << G4endl;
974 G4cout <<"akap " << fiss->akap << G4endl;
975 G4cout <<"bet " << fiss->bet << G4endl;
976 G4cout <<"homega " << fiss->homega << G4endl;
977 G4cout <<"koeff " << fiss->koeff << G4endl;
978 G4cout <<"optcol " << fiss->optcol << G4endl;
979 G4cout <<"optles " << fiss->optles << G4endl;
980 G4cout <<"eefac " << opt->eefac << G4endl;
981 G4cout <<"optafan " << ald->optafan << G4endl;
982 G4cout <<"av " << ald->av << G4endl;
983 G4cout <<"as " << ald->as << G4endl;
984 G4cout <<"ak " << ald->ak << G4endl;
985 }
986 fiss->optxfis = 1;
987
988 G4InclAblaDataFile *dataInterface = new G4InclAblaDataFile();
989 if(dataInterface->readData() == true) {
990 if(verboseLevel > 0) {
991 G4cout <<"G4Abla: Datafiles read successfully." << G4endl;
992 }
993 }
994 else {
995 G4Exception("ERROR: Failed to read datafiles.");
996 }
997
998 for(int z = 0; z < 98; z++) { //do 30 z = 0,98,1
999 for(int n = 0; n < 154; n++) { //do 31 n = 0,153,1
1000 ecld->ecfnz[n][z] = 0.e0;
1001 ec2sub->ecnz[n][z] = dataInterface->getEcnz(n,z);
1002 ecld->ecgnz[n][z] = dataInterface->getEcnz(n,z);
1003 ecld->alpha[n][z] = dataInterface->getAlpha(n,z);
1004 ecld->vgsld[n][z] = dataInterface->getVgsld(n,z);
1005 }
1006 }
1007
1008 for(int z = 0; z < 500; z++) {
1009 for(int a = 0; a < 500; a++) {
1010 pace->dm[z][a] = dataInterface->getPace2(z,a);
1011 }
1012 }
1013
1014 delete dataInterface;
1015}
1016
1017void G4Abla::qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u, G4double *qr)
1018{
1019 // QROT INCLUDING DAMPING
1020 // INPUT: Z,A,BET,SIG,U
1021 // OUTPUT: QR - COLLECTIVE ENHANCEMENT FACTOR
1022 //
1023 // SEE JUNGHANS ET AL., NUCL. PHYS. A 629 (1998) 635
1024 //
1025 //
1026 // FR(U) EXPONENTIAL FUNCTION TO DEFINE DAMPING
1027 // UCR CRITICAL ENERGY FOR DAMPING
1028 // DCR WIDTH OF DAMPING
1029 // BET BETA-DEFORMATION !
1030 // SIG PERPENDICULAR SPIN CUTOFF FACTOR
1031 // U ENERGY
1032 // QR COEFFICIENT OF COLLECTIVE ENHANCEMENT
1033 // A MASS NUMBER
1034 // Z CHARGE NUMBER
1035
1036 G4double ucr,dcr,ponq,dn,n,dz;
1037
1038 dcr = 10.0;
1039
1040 ucr = 40.0;
1041
1042 if(((std::fabs(bet)-1.15) < 0) || ((std::fabs(bet)-1.15) == 0)) {
1043 goto qrot10;
1044 }
1045
1046 if((std::fabs(bet)-1.15) > 0) {
1047 goto qrot11;
1048 }
1049
1050 qrot10:
1051 n = a - z;
1052 dz = std::fabs(z - 82.0);
1053 if (n > 104) {
1054 dn = std::fabs(n-126.e0);
1055 }
1056 else {
1057 dn = std::fabs(n - 82.0);
1058 }
1059
1060 bet = 0.022 + 0.003*dn + 0.005*dz;
1061
1062 sig = 25.0*std::pow(bet,2) * sig;
1063
1064 qrot11:
1065 ponq = (u - ucr)/dcr;
1066
1067 if (ponq > 700.0) {
1068 ponq = 700.0;
1069 }
1070 if (sig < 1.0) {
1071 sig = 1.0;
1072 }
1073 (*qr) = 1.0/(1.0 + std::exp(ponq)) * (sig - 1.0) + 1.0;
1074
1075 if ((*qr) < 1.0) {
1076 (*qr) = 1.0;
1077 }
1078
1079 return;
1080}
1081
1082void G4Abla::mglw(G4double a, G4double z, G4double *el)
1083{
1084 // MODEL DE LA GOUTTE LIQUIDE DE C. F. WEIZSACKER.
1085 // USUALLY AN OBSOLETE OPTION
1086
1087 G4int a1,z1;
1088 G4double xv = 0.0, xs = 0.0, xc = 0.0, xa = 0.0;
1089
1090 a1 = idnint(a);
1091 z1 = idnint(z);
1092
1093 if ((a <= 0.01) || (z < 0.01)) {
1094 (*el) = 1.0e38;
1095 }
1096 else {
1097 xv = -15.56*a;
1098 xs = 17.23*std::pow(a,(2.0/3.0));
1099
1100 if (a > 1.0) {
1101 xc = 0.7*z*(z-1.0)*std::pow((a-1.0),(-1.e0/3.e0));
1102 }
1103 else {
1104 xc = 0.0;
1105 }
1106 }
1107
1108 xa = 23.6*(std::pow((a-2.0*z),2)/a);
1109 (*el) = xv+xs+xc+xa;
1110 return;
1111}
1112
1113void G4Abla::mglms(G4double a, G4double z, G4int refopt4, G4double *el)
1114{
1115 // USING FUNCTION EFLMAC(IA,IZ,0)
1116 //
1117 // REFOPT4 = 0 : WITHOUT MICROSCOPIC CORRECTIONS
1118 // REFOPT4 = 1 : WITH SHELL CORRECTION
1119 // REFOPT4 = 2 : WITH PAIRING CORRECTION
1120 // REFOPT4 = 3 : WITH SHELL- AND PAIRING CORRECTION
1121
1122 // 1839 C-----------------------------------------------------------------------
1123 // 1840 C A1 LOCAL MASS NUMBER (INTEGER VARIABLE OF A)
1124 // 1841 C Z1 LOCAL NUCLEAR CHARGE (INTEGER VARIABLE OF Z)
1125 // 1842 C REFOPT4 OPTION, SPECIFYING THE MASS FORMULA (SEE ABOVE)
1126 // 1843 C A MASS NUMBER
1127 // 1844 C Z NUCLEAR CHARGE
1128 // 1845 C DEL PAIRING CORRECTION
1129 // 1846 C EL BINDING ENERGY
1130 // 1847 C ECNZ( , ) TABLE OF SHELL CORRECTIONS
1131 // 1848 C-----------------------------------------------------------------------
1132 // 1849 C
1133 G4int a1 = idnint(a);
1134 G4int z1 = idnint(z);
1135
1136 if ( (a1 <= 0) || (z1 <= 0) || ((a1-z1) <= 0) ) { //then
1137 // modif pour récupérer une masse p et n correcte:
1138 (*el) = 0.0;
1139 return;
1140 // goto mglms50;
1141 }
1142 else {
1143 // binding energy incl. pairing contr. is calculated from
1144 // function eflmac
1145 assert(a1 != 0);
1146 (*el) = eflmac(a1,z1,0,refopt4);
1147 // assert(isnan((*el)) == false);
1148 if (refopt4 > 0) {
1149 if (refopt4 != 2) {
1150 (*el) = (*el) + ec2sub->ecnz[a1-z1][z1];
1151 //(*el) = (*el) + ec2sub->ecnz[z1][a1-z1];
1152 //assert(isnan((*el)) == false);
1153 }
1154 }
1155 }
1156 return;
1157}
1158
1159G4double G4Abla::spdef(G4int a, G4int z, G4int optxfis)
1160{
1161
1162 // INPUT: A,Z,OPTXFIS MASS AND CHARGE OF A NUCLEUS,
1163 // OPTION FOR FISSILITY
1164 // OUTPUT: SPDEF
1165
1166 // ALPHA2 SADDLE POINT DEF. COHEN&SWIATECKI ANN.PHYS. 22 (1963) 406
1167 // RANGING FROM FISSILITY X=0.30 TO X=1.00 IN STEPS OF 0.02
1168
1169 G4int index;
1170 G4double x,v,dx;
1171
1172 const G4int alpha2Size = 37;
1173 // The value 0.0 at alpha2[0] added by PK.
1174 G4double alpha2[alpha2Size] = {0.0, 2.5464e0, 2.4944e0, 2.4410e0, 2.3915e0, 2.3482e0,
1175 2.3014e0, 2.2479e0, 2.1982e0, 2.1432e0, 2.0807e0, 2.0142e0, 1.9419e0,
1176 1.8714e0, 1.8010e0, 1.7272e0, 1.6473e0, 1.5601e0, 1.4526e0, 1.3164e0,
1177 1.1391e0, 0.9662e0, 0.8295e0, 0.7231e0, 0.6360e0, 0.5615e0, 0.4953e0,
1178 0.4354e0, 0.3799e0, 0.3274e0, 0.2779e0, 0.2298e0, 0.1827e0, 0.1373e0,
1179 0.0901e0, 0.0430e0, 0.0000e0};
1180
1181 dx = 0.02;
1182 x = fissility(a,z,optxfis);
1183
1184 if (x > 1.0) {
1185 x = 1.0;
1186 }
1187
1188 if (x < 0.0) {
1189 x = 0.0;
1190 }
1191
1192 v = (x - 0.3)/dx + 1.0;
1193 index = idnint(v);
1194
1195 if (index < 1) {
1196 return(alpha2[1]); // alpha2[0] -> alpha2[1]
1197 }
1198
1199 if (index == 36) { //then // :::FIXME:: Possible off-by-one bug...
1200 return(alpha2[36]);
1201 }
1202 else {
1203 return(alpha2[index] + (alpha2[index+1] - alpha2[index]) / dx * ( x - (0.3e0 + dx*(index-1)))); //:::FIXME::: Possible off-by-one
1204 }
1205
1206 return alpha2[0]; // The algorithm is not supposed to reach this point.
1207}
1208
1209G4double G4Abla::fissility(int a,int z, int optxfis)
1210{
1211 // CALCULATION OF FISSILITY PARAMETER
1212 //
1213 // INPUT: A,Z INTEGER MASS & CHARGE OF NUCLEUS
1214 // OPTXFIS = 0 : MYERS, SWIATECKI
1215 // 1 : DAHLINGER
1216 // 2 : ANDREYEV
1217
1218 G4double aa,zz,i;
1219 G4double fissilityResult = 0.0;
1220
1221 aa = double(a);
1222 zz = double(z);
1223 i = double(a-2*z) / aa;
1224
1225 // myers & swiatecki droplet modell
1226 if (optxfis == 0) { //then
1227 fissilityResult = std::pow(zz,2) / aa /50.8830e0 / (1.0e0 - 1.7826e0 * std::pow(i,2));
1228 }
1229
1230 if (optxfis == 1) {
1231 // dahlinger fit:
1232 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));
1233 }
1234
1235 if (optxfis == 2) {
1236 // dubna fit:
1237 fissilityResult = std::pow(zz,2) / aa /(48.e0*(1.e0 - 17.22e0*std::pow(i,4)));
1238 }
1239
1240 return fissilityResult;
1241}
1242
1243void G4Abla::evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
1244 G4double *zf_par, G4double *af_par, G4double *mtota_par,
1245 G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
1246 G4int *ff_par, G4int *inttype_par, G4int *inum_par)
1247{
1248 G4double zf = (*zf_par);
1249 G4double af = (*af_par);
1250 G4double mtota = (*mtota_par);
1251 G4double pleva = (*pleva_par);
1252 G4double pxeva = (*pxeva_par);
1253 G4double pyeva = (*pyeva_par);
1254 G4int ff = (*ff_par);
1255 G4int inttype = (*inttype_par);
1256 G4int inum = (*inum_par);
1257
1258 // 533 C
1259 // 534 C INPUT:
1260 // 535 C
1261 // 536 C ZPRF, APRF, EE(EE IS MODIFIED!), JPRF
1262 // 537 C
1263 // 538 C PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS
1264 // 539 C COMMON /ABRAMAIN/ AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC,
1265 // 540 C R_0,R_P,R_T, IMAX,IRNDM,PI,
1266 // 541 C BFPRO,SNPRO,SPPRO,SHELL
1267 // 542 C
1268 // 543 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES
1269 // 544 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C
1270 // 545 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC.
1271 // 546 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION
1272 // 547 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII
1273 // 548 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141...
1274 // 549 C BFPRO - FISSION BARRIER OF THE PROJECTILE
1275 // 550 C SNPRO - NEUTRON SEPARATION ENERGY OF THE PROJECTILE
1276 // 551 C SPPRO - PROTON " " " " "
1277 // 552 C SHELL - GROUND STATE SHELL CORRECTION
1278 // 553 C
1279 // 554 C---------------------------------------------------------------------
1280 // 555 C FISSION BARRIERS
1281 // 556 C COMMON /FB/ EFA
1282 // 557 C EFA - ARRAY OF FISSION BARRIERS
1283 // 558 C---------------------------------------------------------------------
1284 // 559 C OUTPUT:
1285 // 560 C ZF, AF, MTOTA, PLEVA, PTEVA, FF, INTTYPE, INUM
1286 // 561 C
1287 // 562 C ZF,AF - CHARGE AND MASS OF FINAL FRAGMENT AFTER EVAPORATION
1288 // 563 C MTOTA _ NUMBER OF EVAPORATED ALPHAS
1289 // 564 C PLEVA,PXEVA,PYEVA - MOMENTUM RECOIL BY EVAPORATION
1290 // 565 C INTTYPE - TYPE OF REACTION 0/1 NUCLEAR OR ELECTROMAGNETIC
1291 // 566 C FF - 0/1 NO FISSION / FISSION EVENT
1292 // 567 C INUM - EVENTNUMBER
1293 // 568 C ____________________________________________________________________
1294 // 569 C /
1295 // 570 C / CALCUL DE LA MASSE ET CHARGE FINALES D'UNE CHAINE D'EVAPORATION
1296 // 571 C /
1297 // 572 C / PROCEDURE FOR CALCULATING THE FINAL MASS AND CHARGE VALUES OF A
1298 // 573 C / SPECIFIC EVAPORATION CHAIN, STARTING POINT DEFINED BY (APRF, ZPRF,
1299 // 574 C / EE)
1300 // 575 C / On ajoute les 3 composantes de l'impulsion (PXEVA,PYEVA,PLEVA)
1301 // 576 C / (actuellement PTEVA n'est pas correct; mauvaise norme...)
1302 // 577 C /____________________________________________________________________
1303 // 578 C
1304 // 612 C
1305 // 613 C-----------------------------------------------------------------------
1306 // 614 C IRNDM DUMMY ARGUMENT FOR RANDOM-NUMBER FUNCTION
1307 // 615 C SORTIE LOCAL HELP VARIABLE TO END THE EVAPORATION CHAIN
1308 // 616 C ZF NUCLEAR CHARGE OF THE FRAGMENT
1309 // 617 C ZPRF NUCLEAR CHARGE OF THE PREFRAGMENT
1310 // 618 C AF MASS NUMBER OF THE FRAGMENT
1311 // 619 C APRF MASS NUMBER OF THE PREFRAGMENT
1312 // 620 C EPSILN ENERGY BURNED IN EACH EVAPORATION STEP
1313 // 621 C MALPHA LOCAL MASS CONTRIBUTION TO MTOTA IN EACH EVAPORATION
1314 // 622 C STEP
1315 // 623 C EE EXCITATION ENERGY (VARIABLE)
1316 // 624 C PROBP PROTON EMISSION PROBABILITY
1317 // 625 C PROBN NEUTRON EMISSION PROBABILITY
1318 // 626 C PROBA ALPHA-PARTICLE EMISSION PROBABILITY
1319 // 627 C PTOTL TOTAL EMISSION PROBABILITY
1320 // 628 C E LOWEST PARTICLE-THRESHOLD ENERGY
1321 // 629 C SN NEUTRON SEPARATION ENERGY
1322 // 630 C SBP PROTON SEPARATION ENERGY PLUS EFFECTIVE COULOMB
1323 // 631 C BARRIER
1324 // 632 C SBA ALPHA-PARTICLE SEPARATION ENERGY PLUS EFFECTIVE
1325 // 633 C COULOMB BARRIER
1326 // 634 C BP EFFECTIVE PROTON COULOMB BARRIER
1327 // 635 C BA EFFECTIVE ALPHA COULOMB BARRIER
1328 // 636 C MTOTA TOTAL MASS OF THE EVAPORATED ALPHA PARTICLES
1329 // 637 C X UNIFORM RANDOM NUMBER FOR NUCLEAR CHARGE
1330 // 638 C AMOINS LOCAL MASS NUMBER OF EVAPORATED PARTICLE
1331 // 639 C ZMOINS LOCAL NUCLEAR CHARGE OF EVAPORATED PARTICLE
1332 // 640 C ECP KINETIC ENERGY OF PROTON WITHOUT COULOMB
1333 // 641 C REPULSION
1334 // 642 C ECN KINETIC ENERGY OF NEUTRON
1335 // 643 C ECA KINETIC ENERGY OF ALPHA PARTICLE WITHOUT COULOMB
1336 // 644 C REPULSION
1337 // 645 C PLEVA TRANSVERSAL RECOIL MOMENTUM OF EVAPORATION
1338 // 646 C PTEVA LONGITUDINAL RECOIL MOMENTUM OF EVAPORATION
1339 // 647 C FF FISSION FLAG
1340 // 648 C INTTYPE INTERACTION TYPE FLAG
1341 // 649 C RNDX RECOIL MOMENTUM IN X-DIRECTION IN A SINGLE STEP
1342 // 650 C RNDY RECOIL MOMENTUM IN Y-DIRECTION IN A SINGLE STEP
1343 // 651 C RNDZ RECOIL MOMENTUM IN Z-DIRECTION IN A SINGLE STEP
1344 // 652 C RNDN NORMALIZATION OF RECOIL MOMENTUM FOR EACH STEP
1345 // 653 C-----------------------------------------------------------------------
1346 // 654 C
1347 // 655 SAVE
1348 // SAVE -> static
1349
1350 static G4int sortie;
1351 static G4double epsiln,probp,probn,proba,ptotl,e;
1352 static G4double sn,sbp,sba,x,amoins,zmoins,ecn,ecp,eca,bp,ba;
1353 static G4double pteva;
1354
1355 static G4int itest;
1356 static G4double probf;
1357
1358 static G4int k, j, il;
1359
1360 static G4double ctet1,stet1,phi1;
1361 static G4double sbfis,rnd;
1362 static G4double selmax;
1363 static G4double segs;
1364 static G4double ef;
1365 static G4int irndm;
1366
1367 static G4double pc, malpha;
1368
1369 zf = zprf;
1370 af = aprf;
1371 pleva = 0.0;
1372 pteva = 0.0;
1373 pxeva = 0.0;
1374 pyeva = 0.0;
1375
1376 sortie = 0;
1377 ff = 0;
1378
1379 itest = 0;
1380 if (itest == 1) {
1381 G4cout << "***************************" << G4endl;
1382 }
1383
1384 evapora10:
1385
1386 if (itest == 1) {
1387 G4cout <<"------zf,af,ee------" << idnint(zf) << "," << idnint(af) << "," << ee << G4endl;
1388 }
1389
1390 // calculation of the probabilities for the different decay channels
1391 // plus separation energies and kinetic energies of the particles
1392 direct(zf,af,ee,jprf,&probp,&probn,&proba,&probf,&ptotl,
1393 &sn,&sbp,&sba,&ecn,&ecp,&eca,&bp,&ba,inttype,inum,itest); //:::FIXME::: Call
1394 // assert(isnan(proba) == false);
1395 // assert(isnan(probp) == false);
1396 // assert(isnan(probn) == false);
1397 // assert(isnan(probf) == false);
1398 assert((eca+ba) >= 0);
1399 assert((ecp+bp) >= 0);
1400 // assert(isnan(ecp) == false);
1401 // assert(isnan(ecn) == false);
1402 // assert(isnan(bp) == false);
1403 // assert(isnan(ba) == false);
1404 k = idnint(zf);
1405 j = idnint(af-zf);
1406
1407 // now ef is calculated from efa that depends on the subroutine
1408 // barfit which takes into account the modification on the ang. mom.
1409 // jb mvr 6-aug-1999
1410 // note *** shell correction! (ecgnz) jb mvr 20-7-1999
1411 il = idnint(jprf);
1412 barfit(k,k+j,il,&sbfis,&segs,&selmax);
1413 // assert(isnan(sbfis) == false);
1414
1415 if ((fiss->optshp == 1) || (fiss->optshp == 3)) { //then
1416 // fb->efa[k][j] = G4double(sbfis) - ecld->ecgnz[j][k];
1417 fb->efa[j][k] = G4double(sbfis) - ecld->ecgnz[j][k];
1418 }
1419 else {
1420 fb->efa[j][k] = G4double(sbfis);
1421 // fb->efa[j][k] = G4double(sbfis);
1422 } //end if
1423 ef = fb->efa[j][k];
1424 // ef = fb->efa[j][k];
1425 // assert(isnan(fb->efa[j][k]) == false);
1426 // here the final steps of the evaporation are calculated
1427 if ((sortie == 1) || (ptotl == 0.e0)) {
1428 e = dmin1(sn,sbp,sba);
1429 if (e > 1.0e30) {
1430 if(verboseLevel > 2) {
1431 G4cout <<"erreur a la sortie evapora,e>1.e30,af=" << af <<" zf=" << zf << G4endl;
1432 }
1433 }
1434 if (zf <= 6.0) {
1435 goto evapora100;
1436 }
1437 if (e < 0.0) {
1438 if (sn == e) {
1439 af = af - 1.e0;
1440 }
1441 else if (sbp == e) {
1442 af = af - 1.0;
1443 zf = zf - 1.0;
1444 }
1445 else if (sba == e) {
1446 af = af - 4.0;
1447 zf = zf - 2.0;
1448 }
1449 if (af < 2.5) {
1450 goto evapora100;
1451 }
1452 goto evapora10;
1453 }
1454 goto evapora100;
1455 }
1456 irndm = irndm + 1;
1457
1458 // here the normal evaporation cascade starts
1459
1460 // random number for the evaporation
1461 // x = double(Rndm(irndm))*ptotl;
1462 x = double(haz(1))*ptotl;
1463
1464// G4cout <<"proba = " << proba << G4endl;
1465// G4cout <<"probp = " << probp << G4endl;
1466// G4cout <<"probn = " << probn << G4endl;
1467// G4cout <<"probf = " << probf << G4endl;
1468
1469 itest = 0;
1470 if (x < proba) {
1471 // alpha evaporation
1472 if (itest == 1) {
1473 G4cout <<"< alpha evaporation >" << G4endl;
1474 }
1475 amoins = 4.0;
1476 zmoins = 2.0;
1477 epsiln = sba + eca;
1478 assert((std::pow((1.0 + (eca+ba)/3.72834e3),2) - 1.0) >= 0);
1479 pc = std::sqrt(std::pow((1.0 + (eca+ba)/3.72834e3),2) - 1.0) * 3.72834e3;
1480 // assert(isnan(pc) == false);
1481 malpha = 4.0;
1482
1483 // volant:
1484 volant->iv = volant->iv + 1;
1485 volant->acv[volant->iv] = 4.;
1486 volant->zpcv[volant->iv] = 2.;
1487 volant->pcv[volant->iv] = pc;
1488 }
1489 else if (x < proba+probp) {
1490 // proton evaporation
1491 if (itest == 1) {
1492 G4cout <<"< proton evaporation >" << G4endl;
1493 }
1494 amoins = 1.0;
1495 zmoins = 1.0;
1496 epsiln = sbp + ecp;
1497 assert((std::pow((1.0 + (ecp + bp)/9.3827e2),2) - 1.0) >= 0);
1498 pc = std::sqrt(std::pow((1.0 + (ecp + bp)/9.3827e2),2) - 1.0) * 9.3827e2;
1499 // assert(isnan(pc) == false);
1500 malpha = 0.0;
1501 // volant:
1502 volant->iv = volant->iv + 1;
1503 volant->acv[volant->iv] = 1.;
1504 volant->zpcv[volant->iv] = 1.;
1505 volant->pcv[volant->iv] = pc;
1506 }
1507 else if (x < proba+probp+probn) {
1508 // neutron evaporation
1509 if (itest == 1) {
1510 G4cout <<"< neutron evaporation >" << G4endl;
1511 }
1512 amoins = 1.0;
1513 zmoins = 0.0;
1514 epsiln = sn + ecn;
1515 assert((std::pow((1.0 + (ecn)/9.3956e2),2) - 1.0) >= 0);
1516 pc = std::sqrt(std::pow((1.0 + (ecn)/9.3956e2),2) - 1.0) * 9.3956e2;
1517 // assert(isnan(pc) == false);
1518 malpha = 0.0;
1519
1520 // volant:
1521 volant->iv = volant->iv + 1;
1522 volant->acv[volant->iv] = 1.;
1523 volant->zpcv[volant->iv] = 0.;
1524 volant->pcv[volant->iv] = pc;
1525 }
1526 else {
1527 // fission
1528 // in case of fission-events the fragment nucleus is the mother nucleus
1529 // before fission occurs with excitation energy above the fis.- barrier.
1530 // fission fragment mass distribution is calulated in subroutine fisdis
1531 if (itest == 1) {
1532 G4cout <<"< fission >" << G4endl;
1533 }
1534 amoins = 0.0;
1535 zmoins = 0.0;
1536 epsiln = ef;
1537
1538 malpha = 0.0;
1539 pc = 0.0;
1540 ff = 1;
1541 // ff = 0; // For testing, allows to disable fission!
1542 }
1543
1544 if (itest == 1) {
1545 G4cout <<"sn,sbp,sba,ef" << sn << "," << sbp << "," << sba <<"," << ef << G4endl;
1546 G4cout <<"probn,probp,proba,probf,ptotl " <<","<< probn <<","<< probp <<","<< proba <<","<< probf <<","<< ptotl << G4endl;
1547 }
1548
1549 // calculation of the daughter nucleus
1550 af = af - amoins;
1551 zf = zf - zmoins;
1552 ee = ee - epsiln;
1553 if (ee <= 0.01) {
1554 ee = 0.01;
1555 }
1556 mtota = mtota + malpha;
1557
1558 if(ff == 0) {
1559 standardRandom(&rnd,&(hazard->igraine[8]));
1560 ctet1 = 2.0*rnd - 1.0;
1561 standardRandom(&rnd,&(hazard->igraine[4]));
1562 phi1 = rnd*2.0*3.141592654;
1563 stet1 = std::sqrt(1.0 - std::pow(ctet1,2));
1564 // assert(isnan(stet1) == false);
1565 volant->xcv[volant->iv] = stet1*std::cos(phi1);
1566 volant->ycv[volant->iv] = stet1*std::sin(phi1);
1567 volant->zcv[volant->iv] = ctet1;
1568 pxeva = pxeva - pc * volant->xcv[volant->iv];
1569 pyeva = pyeva - pc * volant->ycv[volant->iv];
1570 pleva = pleva - pc * ctet1;
1571 // assert(isnan(pleva) == false);
1572 }
1573
1574 // condition for end of evaporation
1575 if ((af < 2.5) || (ff == 1)) {
1576 goto evapora100;
1577 }
1578 goto evapora10;
1579
1580 evapora100:
1581 (*zf_par) = zf;
1582 (*af_par) = af;
1583 (*mtota_par) = mtota;
1584 (*pleva_par) = pleva;
1585 (*pxeva_par) = pxeva;
1586 (*pyeva_par) = pyeva;
1587 (*ff_par) = ff;
1588 (*inttype_par) = inttype;
1589 (*inum_par) = inum;
1590
1591 return;
1592}
1593
1594void G4Abla::direct(G4double zprf, G4double a, G4double ee, G4double jprf,
1595 G4double *probp_par, G4double *probn_par, G4double *proba_par,
1596 G4double *probf_par, G4double *ptotl_par, G4double *sn_par,
1597 G4double *sbp_par, G4double *sba_par, G4double *ecn_par,
1598 G4double *ecp_par,G4double *eca_par, G4double *bp_par,
1599 G4double *ba_par, G4int inttype, G4int inum, G4int itest)
1600{
1601 G4int dummy0;
1602
1603 G4double probp = (*probp_par);
1604 G4double probn = (*probn_par);
1605 G4double proba = (*proba_par);
1606 G4double probf = (*probf_par);
1607 G4double ptotl = (*ptotl_par);
1608 G4double sn = (*sn_par);
1609 G4double sbp = (*sbp_par);
1610 G4double sba = (*sba_par);
1611 G4double ecn = (*ecn_par);
1612 G4double ecp = (*ecp_par);
1613 G4double eca = (*eca_par);
1614 G4double bp = (*bp_par);
1615 G4double ba = (*ba_par);
1616
1617 // CALCULATION OF PARTICLE-EMISSION PROBABILITIES & FISSION /
1618 // BASED ON THE SIMPLIFIED FORMULAS FOR THE DECAY WIDTH BY /
1619 // MORETTO, ROCHESTER MEETING TO AVOID COMPUTING TIME /
1620 // INTENSIVE INTEGRATION OF THE LEVEL DENSITIES /
1621 // USES EFFECTIVE COULOMB BARRIERS AND AN AVERAGE KINETIC ENERGY/
1622 // OF THE EVAPORATED PARTICLES /
1623 // COLLECTIVE ENHANCMENT OF THE LEVEL DENSITY IS INCLUDED /
1624 // DYNAMICAL HINDRANCE OF FISSION IS INCLUDED BY A STEP FUNCTION/
1625 // APPROXIMATION. SEE A.R. JUNGHANS DIPLOMA THESIS /
1626 // SHELL AND PAIRING STRUCTURES IN THE LEVEL DENSITY IS INCLUDED/
1627
1628 // INPUT:
1629 // ZPRF,A,EE CHARGE, MASS, EXCITATION ENERGY OF COMPOUND
1630 // NUCLEUS
1631 // JPRF ROOT-MEAN-SQUARED ANGULAR MOMENTUM
1632
1633 // DEFORMATIONS AND G.S. SHELL EFFECTS
1634 // COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA
1635
1636 // ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S.
1637 // ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0)
1638 // VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE
1639 // ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!)
1640 // BETA2 = SQRT((4PI)/5) * ALPHA
1641
1642 //OPTIONS AND PARAMETERS FOR FISSION CHANNEL
1643 //COMMON /FISS/ AKAP,BET,HOMEGA,KOEFF,IFIS,
1644 // OPTSHP,OPTXFIS,OPTLES,OPTCOL
1645 //
1646 // AKAP - HBAR**2/(2* MN * R_0**2) = 10 MEV, R_0 = 1.4 FM
1647 // BET - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1)
1648 // HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV
1649 // KOEFF - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0
1650 // IFIS - 0/1 FISSION CHANNEL OFF/ON
1651 // OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY
1652 // = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY
1653 // = 1 SHELL , NO PAIRING
1654 // = 2 PAIRING, NO SHELL
1655 // = 3 SHELL AND PAIRING
1656 // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF
1657 // OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV
1658 // FISSILITY PARAMETER.
1659 // OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224
1660 // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON
1661
1662 // LEVEL DENSITY PARAMETERS
1663 // COMMON /ALD/ AV,AS,AK,OPTAFAN
1664 // AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE
1665 // LEVEL DENSITY PARAMETER
1666 // OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1
1667 // RECOMMENDED IS OPTAFAN = 0
1668
1669 // FISSION BARRIERS
1670 // COMMON /FB/ EFA
1671 // EFA - ARRAY OF FISSION BARRIERS
1672
1673
1674 // OUTPUT: PROBN,PROBP,PROBA,PROBF,PTOTL:
1675 // - EMISSION PROBABILITIES FOR N EUTRON, P ROTON, A LPHA
1676 // PARTICLES, F ISSION AND NORMALISATION
1677 // SN,SBP,SBA: SEPARATION ENERGIES N P A
1678 // INCLUDING EFFECTIVE BARRIERS
1679 // ECN,ECP,ECA,BP,BA
1680 // - AVERAGE KINETIC ENERGIES (2*T) AND EFFECTIVE BARRIERS
1681
1682 static G4double bk;
1683 static G4int afp;
1684 static G4double at; // = 0.0;
1685 static G4double bet; // = 0.0;
1686 static G4double bs;
1687 static G4double bshell;
1688 static G4double cf;
1689 static G4double dconst;
1690 static G4double defbet;
1691 static G4double denomi;
1692 static G4double densa;
1693 static G4double densf;
1694 static G4double densg;
1695 static G4double densn;
1696 static G4double densp;
1697 static G4double edyn;
1698 static G4double eer;
1699 static G4double ef;
1700 static G4double ft;
1701 static G4double ga; // = 0.0;
1702 static G4double gf; // = 0.0;
1703 static G4double gn; // = 0.0;
1704 static G4double gngf;
1705 static G4double gp; // = 0.0;
1706 static G4double gsum;
1707 static G4double hbar = 6.582122e-22; // = 0.0;
1708 static G4double homega; // = 0.0;
1709 static G4double iflag;
1710 static G4int il;
1711 static G4int ilast;
1712 static G4int imaxwell;
1713 static G4int in;
1714 static G4int iz;
1715 static G4int j;
1716 static G4int k;
1717 static G4double ma1z;
1718 static G4double ma1z1;
1719 static G4double ma4z2;
1720 static G4double maz;
1721 static G4double nprf;
1722 static G4double nt;
1723 static G4double parc;
1724 static G4double pi = 3.14159265;
1725 static G4double pt;
1726 static G4double ra;
1727 static G4double rat;
1728 static G4double refmod;
1729 static G4double rf;
1730 static G4double rn;
1731 static G4double rnd;
1732 static G4double rnt;
1733 static G4double rp;
1734 static G4double rpt;
1735 static G4double sa;
1736 static G4double sbf;
1737 static G4double sbfis;
1738 static G4double segs;
1739 static G4double selmax;
1740 static G4double sp;
1741 static G4double tauc;
1742 static G4double tconst;
1743 static G4double temp;
1744 static G4double ts1;
1745 static G4double tsum;
1746 static G4double wf; // = 0.0;
1747 static G4double wfex;
1748 static G4double xx;
1749 static G4double y;
1750
1751 imaxwell = 1;
1752 inttype = 0;
1753
1754 // limiting of excitation energy where fission occurs
1755 // Note, this is not the dynamical hindrance (see end of routine)
1756 edyn = 1000.0;
1757
1758 // no limit if statistical model is calculated.
1759 if (bet <= 1.0e-16) {
1760 edyn = 10000.0;
1761 }
1762
1763 // just a change of name until the end of this subroutine
1764 eer = ee;
1765 if (inum == 1) {
1766 ilast = 1;
1767 }
1768
1769 // calculation of masses
1770 // refmod = 1 ==> myers,swiatecki model
1771 // refmod = 0 ==> weizsaecker model
1772 refmod = 1; // Default = 1
1773
1774 if (refmod == 1) {
1775 mglms(a,zprf,fiss->optshp,&maz);
1776 mglms(a-1.0,zprf,fiss->optshp,&ma1z);
1777 mglms(a-1.0,zprf-1.0,fiss->optshp,&ma1z1);
1778 mglms(a-4.0,zprf-2.0,fiss->optshp,&ma4z2);
1779 }
1780 else {
1781 mglw(a,zprf,&maz);
1782 mglw(a-1.0,zprf,&ma1z);
1783 mglw(a-1.0,zprf-1.0,&ma1z1);
1784 mglw(a-4.0,zprf-2.0,&ma4z2);
1785 }
1786 // assert(isnan(maz) == false);
1787 // assert(isnan(ma1z) == false);
1788 // assert(isnan(ma1z1) == false);
1789 // assert(isnan(ma4z2) == false);
1790
1791 // separation energies and effective barriers
1792 sn = ma1z - maz;
1793 sp = ma1z1 - maz;
1794 sa = ma4z2 - maz - 28.29688;
1795 if (zprf < 1.0e0) {
1796 sbp = 1.0e75;
1797 goto direct30;
1798 }
1799
1800 // parameterisation gaimard:
1801 // bp = 1.44*(zprf-1.d0)/(1.22*std::pow((a - 1.0),(1.0/3.0))+5.6)
1802 // parameterisation khs (12-99)
1803 bp = 1.44*(zprf - 1.0)/(2.1*std::pow((a - 1.0),(1.0/3.0)) + 0.0);
1804
1805 sbp = sp + bp;
1806 // assert(isnan(sbp) == false);
1807 // assert(isinf(sbp) == false);
1808 if (a-4.0 <= 0.0) {
1809 sba = 1.0e+75;
1810 goto direct30;
1811 }
1812
1813 // new effective barrier for alpha evaporation d=6.1: khs
1814 // ba = 2.88d0*(zprf-2.d0)/(1.22d0*(a-4.d0)**(1.d0/3.d0)+6.1d0)
1815 // parametrisation khs (12-99)
1816 ba = 2.88*(zprf - 2.0)/(2.2*std::pow((a - 4.0),(1.0/3.0)) + 0.0);
1817
1818 sba = sa + ba;
1819 // assert(isnan(sba) == false);
1820 // assert(isinf(sba) == false);
1821 direct30:
1822
1823 // calculation of surface and curvature integrals needed to
1824 // to calculate the level density parameter (in densniv)
1825 if (fiss->ifis > 0) {
1826 k = idnint(zprf);
1827 j = idnint(a - zprf);
1828
1829 // now ef is calculated from efa that depends on the subroutine
1830 // barfit which takes into account the modification on the ang. mom.
1831 // jb mvr 6-aug-1999
1832 // note *** shell correction! (ecgnz) jb mvr 20-7-1999
1833 il = idnint(jprf);
1834 barfit(k,k+j,il,&sbfis,&segs,&selmax);
1835 // assert(isnan(sbfis) == false);
1836 if ((fiss->optshp == 1) || (fiss->optshp == 3)) {
1837 // fb->efa[k][j] = G4double(sbfis) - ecld->ecgnz[j][k];
1838 // fb->efa[j][k] = G4double(sbfis) - ecld->ecgnz[j][k];
1839 fb->efa[j][k] = double(sbfis) - ecld->ecgnz[j][k];
1840 }
1841 else {
1842 // fb->efa[k][j] = G4double(sbfis);
1843 fb->efa[j][k] = double(sbfis);
1844 }
1845 // ef = fb->efa[k][j];
1846 ef = fb->efa[j][k];
1847
1848 // to avoid negative values for impossible nuclei
1849 // the fission barrier is set to zero if smaller than zero.
1850 // if (fb->efa[k][j] < 0.0) {
1851 // fb->efa[k][j] = 0.0;
1852 // }
1853 if (fb->efa[j][k] < 0.0) {
1854 if(verboseLevel > 2) {
1855 G4cout <<"Setting fission barrier to 0" << G4endl;
1856 }
1857 fb->efa[j][k] = 0.0;
1858 }
1859 // assert(isnan(fb->efa[j][k]) == false);
1860
1861 // factor with jprf should be 0.0025d0 - 0.01d0 for
1862 // approximate influence of ang. momentum on bfis a.j. 22.07.96
1863 // 0.0 means no angular momentum
1864
1865 if (ef < 0.0) {
1866 ef = 0.0;
1867 }
1868 xx = fissility((k+j),k,fiss->optxfis);
1869 // assert(isnan(xx) == false);
1870 // assert(isinf(xx) == false);
1871
1872 y = 1.00 - xx;
1873 if (y < 0.0) {
1874 y = 0.0;
1875 }
1876 if (y > 1.0) {
1877 y = 1.0;
1878 }
1879 bs = bipol(1,y);
1880 // assert(isnan(bs) == false);
1881 // assert(isinf(bs) == false);
1882 bk = bipol(2,y);
1883 // assert(isnan(bk) == false);
1884 // assert(isinf(bk) == false);
1885 }
1886 else {
1887 ef = 1.0e40;
1888 bs = 1.0;
1889 bk = 1.0;
1890 }
1891 sbf = ee - ef;
1892
1893 afp = idnint(a);
1894 iz = idnint(zprf);
1895 in = afp - iz;
1896 bshell = ecld->ecfnz[in][iz];
1897 // assert(isnan(bshell) == false);
1898
1899 // ld saddle point deformation
1900 // here: beta2 = std::sqrt(5/(4pi)) * alpha2
1901
1902 // for the ground state def. 1.5d0 should be used
1903 // because this was just the factor to produce the
1904 // alpha-deformation table 1.5d0 should be used
1905 // a.r.j. 6.8.97
1906 defbet = 1.58533e0 * spdef(idnint(a),idnint(zprf),fiss->optxfis);
1907 // assert(isnan(defbet) == false);
1908
1909 // level density and temperature at the saddle point
1910 // G4cout <<"a = " << a << G4endl;
1911 // G4cout <<"zprf = " << zprf << G4endl;
1912 // G4cout <<"ee = " << ee << G4endl;
1913 // G4cout <<"ef = " << ef << G4endl;
1914 // G4cout <<"bshell = " << bshell << G4endl;
1915 // G4cout <<"bs = " << bs << G4endl;
1916 // G4cout <<"bk = " << bk << G4endl;
1917 // G4cout <<"defbet = " << defbet << G4endl;
1918 densniv(a,zprf,ee,ef,&densf,bshell,bs,bk,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1919 // G4cout <<"densf = " << densf << G4endl;
1920 // G4cout <<"temp = " << temp << G4endl;
1921 // assert(isnan(densf) == false);
1922 // assert(isnan(temp) == false);
1923 // assert(temp != 0);
1924 ft = temp;
1925 if (iz >= 2) {
1926 bshell = ecld->ecgnz[in][iz-1] - ecld->vgsld[in][iz-1];
1927 defbet = 1.5 * (ecld->alpha[in][iz-1]);
1928
1929 // level density and temperature in the proton daughter
1930 densniv(a-1.0,zprf-1.0e0,ee,sbp,&densp, bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1931 assert(temp >= 0);
1932 // assert(isnan(temp) == false);
1933 pt = temp;
1934 if (imaxwell == 1) {
1935 // valentina - random kinetic energy in a maxwelliam distribution
1936 // modif juin/2002 a.b. c.v. for light targets; limit on the energy
1937 // from the maxwell distribution.
1938 rpt = pt;
1939 ecp = 2.0 * pt;
1940 if(rpt <= 1.0e-3) {
1941 goto direct2914;
1942 }
1943 iflag = 0;
1944 direct1914:
1945 ecp = fmaxhaz(rpt);
1946 iflag = iflag + 1;
1947 if(iflag >= 10) {
1948 standardRandom(&rnd,&(hazard->igraine[5]));
1949 ecp=std::sqrt(rnd)*(eer-sbp);
1950 // assert(isnan(ecp) == false);
1951 goto direct2914;
1952 }
1953 if((ecp+sbp) > eer) {
1954 goto direct1914;
1955 }
1956 }
1957 else {
1958 ecp = 2.0 * pt;
1959 }
1960
1961 direct2914:
1962 dummy0 = 0;
1963 // G4cout <<""<<G4endl;
1964 }
1965 else {
1966 densp = 0.0;
1967 ecp = 0.0;
1968 pt = 0.0;
1969 }
1970
1971 if (in >= 2) {
1972 bshell = ecld->ecgnz[in-1][iz] - ecld->vgsld[in-1][iz];
1973 defbet = 1.5e0 * (ecld->alpha[in-1][iz]);
1974
1975 // level density and temperature in the neutron daughter
1976 densniv(a-1.0,zprf,ee,sn,&densn,bshell, 1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1977 nt = temp;
1978
1979 if (imaxwell == 1) {
1980 // valentina - random kinetic energy in a maxwelliam distribution
1981 // modif juin/2002 a.b. c.v. for light targets; limit on the energy
1982 // from the maxwell distribution.
1983 rnt = nt;
1984 ecn = 2.0 * nt;
1985 if(rnt <= 1.e-3) {
1986 goto direct2915;
1987 }
1988
1989 iflag=0;
1990
1991 ecn = fmaxhaz(rnt);
1992 iflag=iflag+1;
1993 if(iflag >= 10) {
1994 standardRandom(&rnd,&(hazard->igraine[6]));
1995 ecn = std::sqrt(rnd)*(eer-sn);
1996 // assert(isnan(ecn) == false);
1997 goto direct2915;
1998 }
1999 // if((ecn+sn) > eer) {
2000 // goto direct1915;
2001 // }
2002 // else {
2003 // ecn = 2.e0 * nt;
2004 // }
2005 if((ecn + sn) <= eer) {
2006 ecn = 2.0 * nt;
2007 }
2008 direct2915:
2009 dummy0 = 0;
2010 // G4cout <<"" <<G4endl;
2011 }
2012 }
2013 else {
2014 densn = 0.0;
2015 ecn = 0.0;
2016 nt = 0.0;
2017 }
2018
2019 if ((in >= 3) && (iz >= 3)) {
2020 bshell = ecld->ecgnz[in-2][iz-2] - ecld->vgsld[in-2][iz-2];
2021 defbet = 1.5 * (ecld->alpha[in-2][iz-2]);
2022
2023 // level density and temperature in the alpha daughter
2024 densniv(a-4.0,zprf-2.0e0,ee,sba,&densa,bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
2025
2026 // valentina - random kinetic energy in a maxwelliam distribution
2027 at = temp;
2028 if (imaxwell == 1) {
2029 // modif juin/2002 a.b. c.v. for light targets; limit on the energy
2030 // from the maxwell distribution.
2031 rat = at;
2032 eca= 2.e0 * at;
2033 if(rat <= 1.e-3) {
2034 goto direct2916;
2035 }
2036 iflag=0;
2037 direct1916:
2038 eca = fmaxhaz(rat);
2039 iflag=iflag+1;
2040 if(iflag >= 10) {
2041 standardRandom(&rnd,&(hazard->igraine[7]));
2042 eca=std::sqrt(rnd)*(eer-sba);
2043 // assert(isnan(eca) == false);
2044 goto direct2916;
2045 }
2046 if((eca+sba) > eer) {
2047 goto direct1916;
2048 }
2049 else {
2050 eca = 2.0 * at;
2051 }
2052 direct2916:
2053 dummy0 = 0;
2054 // G4cout <<"" << G4endl;
2055 }
2056 else {
2057 densa = 0.0;
2058 eca = 0.0;
2059 at = 0.0;
2060 }
2061 } // PK
2062
2063 // special treatment for unbound nuclei
2064 if (sn < 0.0) {
2065 probn = 1.0;
2066 probp = 0.0;
2067 proba = 0.0;
2068 probf = 0.0;
2069 goto direct70;
2070 }
2071 if (sbp < 0.0) {
2072 probp = 1.0;
2073 probn = 0.0;
2074 proba = 0.0;
2075 probf = 0.0;
2076 goto direct70;
2077 }
2078
2079 if ((a < 50.e0) || (ee > edyn)) { // no fission if e*> edyn or mass < 50
2080 // G4cout <<"densf = 0.0" << G4endl;
2081 densf = 0.e0;
2082 }
2083
2084 bshell = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz];
2085 defbet = 1.5e0 * (ecld->alpha[in][iz]);
2086
2087 // compound nucleus level density
2088 densniv(a,zprf,ee,0.0e0,&densg,bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
2089 // assert(isnan(densg) == false);
2090 // assert(isnan(temp) == false);
2091
2092 if ( densg > 0.e0) {
2093 // calculation of the partial decay width
2094 // used for both the time scale and the evaporation decay width
2095 gp = (std::pow(a,(2.0/3.0))/fiss->akap)*densp/densg/pi*std::pow(pt,2);
2096 gn = (std::pow(a,(2.0/3.0))/fiss->akap)*densn/densg/pi*std::pow(nt,2);
2097 ga = (std::pow(a,(2.0/3.0))/fiss->akap)*densa/densg/pi*2.0*std::pow(at,2);
2098 gf = densf/densg/pi/2.0*ft;
2099 // assert(isnan(gf) == false);
2100
2101 // assert(isnan(gp) == false);
2102 // assert(isnan(gn) == false);
2103 // assert(isnan(ga) == false);
2104 // assert(isnan(ft) == false);
2105 // assert(ft != 0);
2106 // assert(isnan(gf) == false);
2107
2108 if(itest == 1) {
2109 G4cout <<"gn,gp,ga,gf " << gn <<","<< gp <<","<< ga <<","<< gf << G4endl;
2110 }
2111 }
2112 else {
2113 if(verboseLevel > 2) {
2114 G4cout <<"direct: densg <= 0.e0 " << a <<","<< zprf <<","<< ee << G4endl;
2115 }
2116 }
2117
2118 gsum = ga + gp + gn;
2119 // assert(isinf(gsum) == false);
2120 // assert(isnan(gsum) == false);
2121 if (gsum > 0.0) {
2122 ts1 = hbar / gsum;
2123 }
2124 else {
2125 ts1 = 1.0e99;
2126 }
2127
2128 if (inum > ilast) { // new event means reset the time scale
2129 tsum = 0;
2130 }
2131
2132 // calculate the relative probabilities for all decay channels
2133 if (densf == 0.0) {
2134 if (densp == 0.0) {
2135 if (densn == 0.0) {
2136 if (densa == 0.0) {
2137 // no reaction is possible
2138 probf = 0.0;
2139 probp = 0.0;
2140 probn = 0.0;
2141 proba = 0.0;
2142 goto direct70;
2143 }
2144
2145 // alpha evaporation is the only open channel
2146 rf = 0.0;
2147 rp = 0.0;
2148 rn = 0.0;
2149 ra = 1.0;
2150 goto direct50;
2151 }
2152
2153 // alpha emission and neutron emission
2154 rf = 0.0;
2155 rp = 0.0;
2156 rn = 1.0;
2157 ra = densa*2.0/densn*std::pow((at/nt),2);
2158 goto direct50;
2159 }
2160 // alpha, proton and neutron emission
2161 rf = 0.0;
2162 rp = 1.0;
2163 rn = densn/densp*std::pow((nt/pt),2);
2164 // assert(isnan(rn) == false);
2165 ra = densa*2.0/densp*std::pow((at/pt),2);
2166 // assert(isnan(ra) == false);
2167 goto direct50;
2168 }
2169
2170 // here fission has taken place
2171 rf = 1.0;
2172
2173 // cramers and weidenmueller factors for the dynamical hindrances of
2174 // fission
2175 if (bet <= 1.0e-16) {
2176 cf = 1.0;
2177 wf = 1.0;
2178 }
2179 else if (sbf > 0.0e0) {
2180 cf = cram(bet,homega);
2181 // if fission barrier ef=0.d0 then fission is the only possible
2182 // channel. to avoid std::log(0) in function tau
2183 // a.j. 7/28/93
2184 if (ef <= 0.0) {
2185 rp = 0.0;
2186 rn = 0.0;
2187 ra = 0.0;
2188 goto direct50;
2189 }
2190 else {
2191 // transient time tau()
2192 tauc = tau(bet,homega,ef,ft);
2193 // assert(isnan(tauc) == false);
2194 }
2195 wfex = (tauc - tsum)/ts1;
2196
2197 if (wfex < 0.0) {
2198 wf = 1.0;
2199 }
2200 else {
2201 wf = std::exp( -wfex);
2202 }
2203 }
2204 else {
2205 cf=1.0;
2206 wf=1.0;
2207 }
2208
2209 if(verboseLevel > 2) {
2210 G4cout <<"tsum,wf,cf " << tsum <<","<< wf <<","<< cf << G4endl;
2211 }
2212
2213 tsum = tsum + ts1;
2214
2215 // change by g.k. and a.h. 5.9.95
2216 tconst = 0.7;
2217 dconst = 12.0/std::sqrt(a);
2218 // assert(isnan(dconst) == false);
2219 nprf = a - zprf;
2220
2221 if (fiss->optshp >= 2) { //then
2222 parite(nprf,&parc);
2223 // assert(isnan(parc) == false);
2224 dconst = dconst*parc;
2225 }
2226 else {
2227 dconst= 0.0;
2228 }
2229 if ((ee <= 17.e0) && (fiss->optles == 1) && (iz >= 90) && (in >= 134)) { //then
2230 // constant changed to 5.0 accord to moretto & vandenbosch a.j. 19.3.96
2231 gngf = std::pow(a,(2.0/3.0))*tconst/10.0*std::exp((ef-sn+dconst)/tconst);
2232
2233 // if the excitation energy is so low that densn=0 ==> gn = 0
2234 // fission remains the only channel.
2235 // a. j. 10.1.94
2236 if (gn == 0.0) {
2237 rn = 0.0;
2238 rp = 0.0;
2239 ra = 0.0;
2240 }
2241 else {
2242 rn=gngf;
2243 // assert(isnan(rn) == false);
2244 rp=gngf*gp/gn;
2245 // assert(isnan(rp) == false);
2246 ra=gngf*ga/gn;
2247 // assert(isnan(ra) == false);
2248 }
2249 } else {
2250 // assert(isnan(cf) == false);
2251 // assert(isinf(gn) == false);
2252 // assert(isinf(gf) == false);
2253 // assert(isinf(cf) == false);
2254 assert(gn > 0 || (gf != 0 && cf != 0));
2255 rn = gn/(gf*cf);
2256// G4cout <<"rn = " << G4endl;
2257// G4cout <<"gn = " << gn << " gf = " << gf << " cf = " << cf << G4endl;
2258 // assert(isnan(rn) == false);
2259 rp = gp/(gf*cf);
2260 // assert(isnan(rp) == false);
2261 ra = ga/(gf*cf);
2262 // assert(isnan(ra) == false);
2263 }
2264 direct50:
2265 // relative decay probabilities
2266 // assert(isnan(ra) == false);
2267 // assert(isnan(rp) == false);
2268 // assert(isnan(rn) == false);
2269 // assert(isnan(rf) == false);
2270
2271 denomi = rp+rn+ra+rf;
2272 // assert(isnan(denomi) == false);
2273 assert(denomi > 0);
2274 // decay probabilities after transient time
2275 probf = rf/denomi;
2276 // assert(isnan(probf) == false);
2277 probp = rp/denomi;
2278 // assert(isnan(probp) == false);
2279 probn = rn/denomi;
2280 // assert(isnan(probn) == false);
2281 proba = ra/denomi;
2282 // assert(isnan(proba) == false);
2283 // assert(isinf(proba) == false);
2284
2285 // new treatment of grange-weidenmueller factor, 5.1.2000, khs !!!
2286
2287 // decay probabilites with transient time included
2288 // assert(isnan(wf) == false);
2289 assert(std::fabs(probf) <= 1.0);
2290 probf = probf * wf;
2291 if(probf == 1.0) {
2292 probp = 0.0;
2293 probn = 0.0;
2294 proba = 0.0;
2295 }
2296 else {
2297 probp = probp * (wf + (1.e0-wf)/(1.e0-probf));
2298 probn = probn * (wf + (1.e0-wf)/(1.e0-probf));
2299 proba = proba * (wf + (1.e0-wf)/(1.e0-probf));
2300 }
2301 direct70:
2302 // assert(isnan(probp) == false);
2303 // assert(isnan(probn) == false);
2304 // assert(isnan(probf) == false);
2305 // assert(isnan(proba) == false);
2306 ptotl = probp+probn+proba+probf;
2307 // assert(isnan(ptotl) == false);
2308
2309 ee = eer;
2310 ilast = inum;
2311
2312 // Return values:
2313 // assert(isnan(proba) == false);
2314 (*probp_par) = probp;
2315 (*probn_par) = probn;
2316 (*proba_par) = proba;
2317 (*probf_par) = probf;
2318 (*ptotl_par) = ptotl;
2319 (*sn_par) = sn;
2320 (*sbp_par) = sbp;
2321 (*sba_par) = sba;
2322 (*ecn_par) = ecn;
2323 (*ecp_par) = ecp;
2324 (*eca_par) = eca;
2325 (*bp_par) = bp;
2326 (*ba_par) = ba;
2327}
2328
2329void G4Abla::densniv(G4double a, G4double z, G4double ee, G4double esous, G4double *dens, G4double bshell, G4double bs, G4double bk,
2330 G4double *temp, G4int optshp, G4int optcol, G4double defbet)
2331{
2332 // 1498 C
2333 // 1499 C INPUT:
2334 // 1500 C A,EE,ESOUS,OPTSHP,BS,BK,BSHELL,DEFBET
2335 // 1501 C
2336 // 1502 C LEVEL DENSITY PARAMETERS
2337 // 1503 C COMMON /ALD/ AV,AS,AK,OPTAFAN
2338 // 1504 C AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE
2339 // 1505 C LEVEL DENSITY PARAMETER
2340 // 1506 C OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1
2341 // 1507 C RECOMMENDED IS OPTAFAN = 0
2342 // 1508 C---------------------------------------------------------------------
2343 // 1509 C OUTPUT: DENS,TEMP
2344 // 1510 C
2345 // 1511 C ____________________________________________________________________
2346 // 1512 C /
2347 // 1513 C / PROCEDURE FOR CALCULATING THE STATE DENSITY OF A COMPOUND NUCLEUS
2348 // 1514 C /____________________________________________________________________
2349 // 1515 C
2350 // 1516 INTEGER AFP,IZ,OPTSHP,OPTCOL,J,OPTAFAN
2351 // 1517 REAL*8 A,EE,ESOUS,DENS,E,Y0,Y1,Y2,Y01,Y11,Y21,PA,BS,BK,TEMP
2352 // 1518 C=====INSERTED BY KUDYAEV===============================================
2353 // 1519 COMMON /ALD/ AV,AS,AK,OPTAFAN
2354 // 1520 REAL*8 ECR,ER,DELTAU,Z,DELTPP,PARA,PARZ,FE,HE,ECOR,ECOR1,Pi6
2355 // 1521 REAL*8 BSHELL,DELTA0,AV,AK,AS,PONNIV,PONFE,DEFBET,QR,SIG,FP
2356 // 1522 C=======================================================================
2357 // 1523 C
2358 // 1524 C
2359 // 1525 C-----------------------------------------------------------------------
2360 // 1526 C A MASS NUMBER OF THE DAUGHTER NUCLEUS
2361 // 1527 C EE EXCITATION ENERGY OF THE MOTHER NUCLEUS
2362 // 1528 C ESOUS SEPARATION ENERGY PLUS EFFECTIVE COULOMB BARRIER
2363 // 1529 C DENS STATE DENSITY OF DAUGHTER NUCLEUS AT EE-ESOUS-EC
2364 // 1530 C BSHELL SHELL CORRECTION
2365 // 1531 C TEMP NUCLEAR TEMPERATURE
2366 // 1532 C E LOCAL EXCITATION ENERGY OF THE DAUGHTER NUCLEUS
2367 // 1533 C E1 LOCAL HELP VARIABLE
2368 // 1534 C Y0,Y1,Y2,Y01,Y11,Y21
2369 // 1535 C LOCAL HELP VARIABLES
2370 // 1536 C PA LOCAL STATE-DENSITY PARAMETER
2371 // 1537 C EC KINETIC ENERGY OF EMITTED PARTICLE WITHOUT
2372 // 1538 C COULOMB REPULSION
2373 // 1539 C IDEN FAKTOR FOR SUBSTRACTING KINETIC ENERGY IDEN*TEMP
2374 // 1540 C DELTA0 PAIRING GAP 12 FOR GROUND STATE
2375 // 1541 C 14 FOR SADDLE POINT
2376 // 1542 C EITERA HELP VARIABLE FOR TEMPERATURE ITERATION
2377 // 1543 C-----------------------------------------------------------------------
2378 // 1544 C
2379 // 1545 C
2380 G4double afp;
2381 G4double delta0;
2382 G4double deltau;
2383 G4double deltpp;
2384 G4double e;
2385 G4double ecor = 0.0;
2386 G4double ecor1;
2387 G4double ecr;
2388 G4double er;
2389 G4double fe;
2390 G4double fp;
2391 G4double he;
2392 G4double iz;
2393 G4double pa;
2394 G4double para;
2395 G4double parz;
2396 G4double ponfe;
2397 G4double ponniv;
2398 G4double qr;
2399 G4double sig;
2400 G4double y01;
2401 G4double y11;
2402 G4double y2;
2403 G4double y21;
2404 G4double y1;
2405 G4double y0;
2406
2407 G4double pi6 = std::pow(3.1415926535,2) / 6.0;
2408 ecr=10.0;
2409 er=28.0;
2410 afp=idnint(a);
2411 iz=idnint(z);
2412
2413 // level density parameter
2414 if((ald->optafan == 1)) {
2415 pa = (ald->av)*a + (ald->as)*std::pow(a,(2.e0/3.e0)) + (ald->ak)*std::pow(a,(1.e0/3.e0));
2416 }
2417 else {
2418 pa = (ald->av)*a + (ald->as)*bs*std::pow(a,(2.e0/3.e0)) + (ald->ak)*bk*std::pow(a,(1.e0/3.e0));
2419 }
2420
2421 fp = 0.01377937231e0 * std::pow(a,(5.e0/3.e0)) * (1.e0 + defbet/3.e0);
2422
2423 // pairing corrections
2424 if (bs > 1.0) {
2425 delta0 = 14;
2426 }
2427 else {
2428 delta0 = 12;
2429 }
2430
2431 if (esous > 1.0e30) {
2432 (*dens) = 0.0;
2433 (*temp) = 0.0;
2434 goto densniv100;
2435 }
2436
2437 e = ee - esous;
2438
2439 if (e < 0.0) {
2440 (*dens) = 0.0;
2441 (*temp) = 0.0;
2442 goto densniv100;
2443 }
2444
2445 // shell corrections
2446 if (optshp > 0) {
2447 deltau = bshell;
2448 if (optshp == 2) {
2449 deltau = 0.0;
2450 }
2451 if (optshp >= 2) {
2452 // pairing energy shift with condensation energy a.r.j. 10.03.97
2453 // deltpp = -0.25e0* (delta0/std::pow(std::sqrt(a),2)) * pa /pi6 + 2.e0*delta0/std::sqrt(a);
2454 deltpp = -0.25e0* std::pow((delta0/std::sqrt(a)),2) * pa /pi6 + 2.e0*delta0/std::sqrt(a);
2455 // assert(isnan(deltpp) == false);
2456
2457 parite(a,&para);
2458 if (para < 0.0) {
2459 e = e - delta0/std::sqrt(a);
2460 // assert(isnan(e) == false);
2461 } else {
2462 parite(z,&parz);
2463 if (parz > 0.e0) {
2464 e = e - 2.0*delta0/std::sqrt(a);
2465 // assert(isnan(e) == false);
2466 } else {
2467 e = e;
2468 // assert(isnan(e) == false);
2469 }
2470 }
2471 } else {
2472 deltpp = 0.0;
2473 }
2474 } else {
2475 deltau = 0.0;
2476 deltpp = 0.0;
2477 }
2478 if (e < 0.0) {
2479 e = 0.0;
2480 (*temp) = 0.0;
2481 }
2482
2483 // washing out is made stronger ! g.k. 3.7.96
2484 ponfe = -2.5*pa*e*std::pow(a,(-4.0/3.0));
2485
2486 if (ponfe < -700.0) {
2487 ponfe = -700.0;
2488 }
2489 fe = 1.0 - std::exp(ponfe);
2490 if (e < ecr) {
2491 // priv. comm. k.-h. schmidt
2492 he = 1.0 - std::pow((1.0 - e/ecr),2);
2493 }
2494 else {
2495 he = 1.0;
2496 }
2497
2498 // Excitation energy corrected for pairing and shell effects
2499 // washing out with excitation energy is included.
2500 ecor = e + deltau*fe + deltpp*he;
2501
2502 if (ecor <= 0.1) {
2503 ecor = 0.1;
2504 }
2505
2506 // statt 170.d0 a.r.j. 8.11.97
2507
2508 // iterative procedure according to grossjean and feldmeier
2509 // to avoid the singularity e = 0
2510 if (ee < 5.0) {
2511 y1 = std::sqrt(pa*ecor);
2512 // assert(isnan(y1) == false);
2513 for(int j = 0; j < 5; j++) {
2514 y2 = pa*ecor*(1.e0-std::exp(-y1));
2515 // assert(isnan(y2) == false);
2516 y1 = std::sqrt(y2);
2517 // assert(isnan(y1) == false);
2518 }
2519
2520 y0 = pa/y1;
2521 // assert(isnan(y0) == false);
2522 assert(y0 != 0.0);
2523 (*temp)=1.0/y0;
2524 (*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;
2525 if (ecor < 1.0) {
2526 ecor1=1.0;
2527 y11 = std::sqrt(pa*ecor1);
2528 // assert(isnan(y11) == false);
2529 for(int j = 0; j < 7; j++) {
2530 y21 = pa*ecor1*(1.0-std::exp(-y11));
2531 // assert(isnan(21) == false);
2532 y11 = std::sqrt(y21);
2533 // assert(isnan(y11) == false);
2534 }
2535
2536 y01 = pa/y11;
2537 // assert(isnan(y01) == false);
2538 (*dens) = (*dens)*std::pow((y01/y0),1.5);
2539 (*temp) = (*temp)*std::pow((y01/y0),1.5);
2540 }
2541 }
2542 else {
2543 ponniv = 2.0*std::sqrt(pa*ecor);
2544 // assert(isnan(ponniv) == false);
2545 if (ponniv > 700.0) {
2546 ponniv = 700.0;
2547 }
2548
2549 // fermi gas state density
2550 (*dens) = std::pow(pa,(-0.25e0))*std::pow(ecor,(-1.25e0))*std::exp(ponniv) * 0.1477045e0;
2551 // assert(isnan(std::sqrt(ecor/pa)) == false);
2552 (*temp) = std::sqrt(ecor/pa);
2553 }
2554 densniv100:
2555
2556 // spin cutoff parameter
2557 sig = fp * (*temp);
2558
2559 // collective enhancement
2560 if (optcol == 1) {
2561 qrot(z,a,defbet,sig,ecor,&qr);
2562 }
2563 else {
2564 qr = 1.0;
2565 }
2566
2567 (*dens) = (*dens) * qr;
2568}
2569
2570
2571G4double G4Abla::bfms67(G4double zms, G4double ams)
2572{
2573 // This subroutine calculates the fission barriers
2574 // of the liquid-drop model of Myers and Swiatecki (1967).
2575 // Analytic parameterization of Dahlinger 1982
2576 // replaces tables. Barrier heights from Myers and Swiatecki !!!
2577
2578 G4double nms,ims,ksims,xms, ums;
2579
2580 nms = ams - zms;
2581 ims = (nms-zms)/ams;
2582 ksims= 50.15e0 * (1.- 1.78 * std::pow(ims,2));
2583 xms = std::pow(zms,2) / (ams * ksims);
2584 ums = 0.368e0-5.057e0*xms+8.93e0*std::pow(xms,2)-8.71*std::pow(xms,3);
2585 return(0.7322e0*std::pow(zms,2)/std::pow(ams,(0.333333e0))*std::pow(10.e0,ums));
2586}
2587
2588void G4Abla::lpoly(G4double x, G4int n, G4double pl[])
2589{
2590 // THIS SUBROUTINE CALCULATES THE ORDINARY LEGENDRE POLYNOMIALS OF
2591 // ORDER 0 TO N-1 OF ARGUMENT X AND STORES THEM IN THE VECTOR PL.
2592 // THEY ARE CALCULATED BY RECURSION RELATION FROM THE FIRST TWO
2593 // POLYNOMIALS.
2594 // WRITTEN BY A.J.SIERK LANL T-9 FEBRUARY, 1984
2595
2596 // NOTE: PL AND X MUST BE DOUBLE PRECISION ON 32-BIT COMPUTERS!
2597
2598 pl[0] = 1.0;
2599 pl[1] = x;
2600
2601 for(int i = 2; i < n; i++) {
2602 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);
2603 }
2604}
2605
2606G4double G4Abla::eflmac(G4int ia, G4int iz, G4int flag, G4int optshp)
2607{
2608 // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS.
2609 // SWITCH FOR PAIRING INCLUDED AS WELL.
2610 // BINDING = EFLMAC(IA,IZ,0,OPTSHP)
2611 // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C
2612 // A.J. 15.07.96
2613
2614 // this function will calculate the liquid-drop nuclear mass for spheri
2615 // configuration according to the preprint NUCLEAR GROUND-STATE
2616 // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p.
2617 // All constants are taken from this publication for consistency.
2618
2619 // Parameters:
2620 // a: nuclear mass number
2621 // z: nuclear charge
2622 // flag: 0 - return mass excess
2623 // otherwise - return pairing (= -1/2 dpn + 1/2 (Dp + Dn))
2624
2625 G4double eflmacResult;
2626
2627 G4int in;
2628 G4double z,n,a,av,as,a0,c1,c4,b1,b3,f,ca,w,dp,dn,dpn,efl,pi;
2629 G4double rmac,bs,h,r0,kf,ks,kv,rp,ay,aden,x0,y0,mh,mn,esq,ael,i;
2630 pi = 3.141592653589793238e0;
2631
2632 // fundamental constants
2633 // hydrogen-atom mass excess
2634 mh = 7.289034;
2635
2636 // neutron mass excess
2637 mn = 8.071431;
2638
2639 // electronic charge squared
2640 esq = 1.4399764;
2641
2642 // constants from considerations other than nucl. masses
2643 // electronic binding
2644 ael = 1.433e-5;
2645
2646 // proton rms radius
2647 rp = 0.8;
2648
2649 // nuclear radius constant
2650 r0 = 1.16;
2651
2652 // range of yukawa-plus-expon. potential
2653 ay = 0.68;
2654
2655 // range of yukawa function used to generate
2656 // nuclear charge distribution
2657 aden= 0.70;
2658
2659 // constants from considering odd-even mass differences
2660 // average pairing gap
2661 rmac= 4.80;
2662
2663 // neutron-proton interaction
2664 h = 6.6;
2665
2666 // wigner constant
2667 w = 30.0;
2668
2669 // adjusted parameters
2670 // volume energy
2671 av = 16.00126;
2672
2673 // volume asymmetry
2674 kv = 1.92240;
2675
2676 // surface energy
2677 as = 21.18466;
2678
2679 // surface asymmetry
2680 ks = 2.345;
2681 // a^0 constant
2682 a0 = 2.615;
2683
2684 // charge asymmetry
2685 ca = 0.10289;
2686
2687 // we will account for deformation by using the microscopic
2688 // corrections tabulated from p. 68ff */
2689 bs = 1.0;
2690
2691 z = double(iz);
2692 a = double(ia);
2693 in = ia - iz;
2694 n = double(in);
2695 dn = rmac*bs/std::pow(n,(1.0/3.0));
2696 dp = rmac*bs/std::pow(z,(1.0/3.0));
2697 dpn = h/bs/std::pow(a,(2.0/3.0));
2698 // assert(isnan(dpn) == false);
2699
2700 c1 = 3.0/5.0*esq/r0;
2701 // assert(isnan(c1) == false);
2702 // assert(isinf(c1) == false);
2703
2704 c4 = 5.0/4.0*std::pow((3.0/(2.0*pi)),(2.0/3.0)) * c1;
2705 // assert(isnan(c4) == false);
2706 // assert(isinf(c4) == false);
2707
2708 // assert(isnan(pi) == false);
2709 // assert(isnan(z) == false);
2710 // assert(isnan(a) == false);
2711 // assert(isnan(r0) == false);
2712 kf = std::pow((9.0*pi*z/(4.0*a)),(1.0/3.0))/r0;
2713 // assert(isnan(kf) == false);
2714 // assert(isinf(kf) == false);
2715
2716 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));
2717 i = (n-z)/a;
2718
2719 x0 = r0 * std::pow(a,(1.0/3.0)) / ay;
2720 y0 = r0 * std::pow(a,(1.0/3.0)) / aden;
2721
2722 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);
2723
2724 b3 = 1.0 - 5.0/std::pow(y0,2) * (1.0 - 15.0/(8.0*y0) + 21.0/(8.0 * std::pow(y0,3))
2725 - 3.0/4.0 * (1.0 + 9.0/(2.0*y0) + 7.0/std::pow(y0,2)
2726 + 7.0/(2.0 * std::pow(y0,3))) * std::exp(-2.0*y0));
2727
2728 // now calulation of total binding energy a.j. 16.7.96
2729
2730 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
2731 + 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))
2732 + f*std::pow(z,2)/a -ca*(n-z) - ael * std::pow(z,(2.39e0));
2733
2734 if ((in == iz) && (mod(in,2) == 1) && (mod(iz,2) == 1)) {
2735 // n and z odd and equal
2736 efl = efl + w*(utilabs(i)+1.e0/a);
2737 }
2738 else {
2739 efl= efl + w* utilabs(i);
2740 }
2741
2742 // pairing is made optional
2743 if (optshp >= 2) {
2744 // average pairing
2745 if ((mod(in,2) == 1) && (mod(iz,2) == 1)) {
2746 efl = efl - dpn;
2747 }
2748 if (mod(in,2) == 1) {
2749 efl = efl + dn;
2750 }
2751 if (mod(iz,2) == 1) {
2752 efl = efl + dp;
2753 }
2754 // end if for pairing term
2755 }
2756
2757 if (flag != 0) {
2758 eflmacResult = (0.5*(dn + dp) - 0.5*dpn);
2759 }
2760 else {
2761 eflmacResult = efl;
2762 }
2763
2764 return eflmacResult;
2765}
2766
2767void G4Abla::appariem(G4double a, G4double z, G4double *del)
2768{
2769 // CALCUL DE LA CORRECTION, DUE A L'APPARIEMENT, DE L'ENERGIE DE
2770 // LIAISON D'UN NOYAU
2771 // PROCEDURE FOR CALCULATING THE PAIRING CORRECTION TO THE BINDING
2772 // ENERGY OF A SPECIFIC NUCLEUS
2773
2774 double para,parz;
2775 // A MASS NUMBER
2776 // Z NUCLEAR CHARGE
2777 // PARA HELP VARIABLE FOR PARITY OF A
2778 // PARZ HELP VARIABLE FOR PARITY OF Z
2779 // DEL PAIRING CORRECTION
2780
2781 parite(a, &para);
2782
2783 if (para < 0.0) {
2784 (*del) = 0.0;
2785 }
2786 else {
2787 parite(z, &parz);
2788 if (parz > 0.0) {
2789 // assert(isnan(std::sqrt(a)) == false);
2790 (*del) = -12.0/std::sqrt(a);
2791 }
2792 else {
2793 // assert(isnan(std::sqrt(a)) == false);
2794 (*del) = 12.0/std::sqrt(a);
2795 }
2796 }
2797}
2798
2799void G4Abla::parite(G4double n, G4double *par)
2800{
2801 // CALCUL DE LA PARITE DU NOMBRE N
2802 //
2803 // PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N.
2804 // RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN
2805
2806 G4double n1, n2, n3;
2807
2808 // N NUMBER TO BE TESTED
2809 // N1,N2 HELP VARIABLES
2810 // PAR HELP VARIABLE FOR PARITY OF N
2811
2812 n3 = double(idnint(n));
2813 n1 = n3/2.0;
2814 n2 = n1 - dint(n1);
2815
2816 if (n2 > 0.0) {
2817 (*par) = -1.0;
2818 }
2819 else {
2820 (*par) = 1.0;
2821 }
2822}
2823
2824G4double G4Abla::tau(G4double bet, G4double homega, G4double ef, G4double t)
2825{
2826 // INPUT : BET, HOMEGA, EF, T
2827 // OUTPUT: TAU - RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED
2828 // 90 PERCENT OF ITS FINAL VALUE
2829 //
2830 // BETA - NUCLEAR VISCOSITY
2831 // HOMEGA - CURVATURE OF POTENTIAL
2832 // EF - FISSION BARRIER
2833 // T - NUCLEAR TEMPERATURE
2834
2835 G4double tauResult;
2836
2837 G4double tlim;
2838 tlim = 8.e0 * ef;
2839 if (t > tlim) {
2840 t = tlim;
2841 }
2842
2843 // modified bj and khs 6.1.2000:
2844 if (bet/(std::sqrt(2.0)*10.0*(homega/6.582122)) <= 1.0) {
2845 tauResult = std::log(10.0*ef/t)/(bet*1.0e21);
2846 // assert(isnan(tauResult) == false);
2847 }
2848 else {
2849 tauResult = std::log(10.0*ef/t)/ (2.0*std::pow((10.0*homega/6.582122),2))*(bet*1.0e-21);
2850 // assert(isnan(tauResult) == false);
2851 } //end if
2852
2853 return tauResult;
2854}
2855
2856G4double G4Abla::cram(G4double bet, G4double homega)
2857{
2858 // INPUT : BET, HOMEGA NUCLEAR VISCOSITY + CURVATURE OF POTENTIAL
2859 // OUTPUT: KRAMERS FAKTOR - REDUCTION OF THE FISSION PROBABILITY
2860 // INDEPENDENT OF EXCITATION ENERGY
2861
2862 G4double rel = bet/(20.0*homega/6.582122);
2863 G4double cramResult = std::sqrt(1.0 + std::pow(rel,2)) - rel;
2864 // limitation introduced 6.1.2000 by khs
2865
2866 if (cramResult > 1.0) {
2867 cramResult = 1.0;
2868 }
2869
2870 // assert(isnan(cramResult) == false);
2871 return cramResult;
2872}
2873
2874G4double G4Abla::bipol(int iflag, G4double y)
2875{
2876 // CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS
2877 // RELATIVE TO THE SPHERICAL CONFIGURATION
2878 // BASED ON MYERS, DROPLET MODEL FOR ARBITRARY SHAPES
2879
2880 // INPUT: IFLAG - 0/1 BK/BS CALCULATION
2881 // Y - (1 - X) COMPLEMENT OF THE FISSILITY
2882
2883 // LINEAR INTERPOLATION OF BS BK TABLE
2884
2885 int i;
2886
2887 G4double bipolResult;
2888
2889 const int bsbkSize = 54;
2890
2891 G4double bk[bsbkSize] = {0.0, 1.00000,1.00087,1.00352,1.00799,1.01433,1.02265,1.03306,
2892 1.04576,1.06099,1.07910,1.10056,1.12603,1.15651,1.19348,
2893 1.23915,1.29590,1.35951,1.41013,1.44103,1.46026,1.47339,
2894 1.48308,1.49068,1.49692,1.50226,1.50694,1.51114,1.51502,
2895 1.51864,1.52208,1.52539,1.52861,1.53177,1.53490,1.53803,
2896 1.54117,1.54473,1.54762,1.55096,1.55440,1.55798,1.56173,
2897 1.56567,1.56980,1.57413,1.57860,1.58301,1.58688,1.58688,
2898 1.58688,1.58740,1.58740, 0.0}; //Zeroes at bk[0], and at the end added by PK
2899
2900 G4double bs[bsbkSize] = {0.0, 1.00000,1.00086,1.00338,1.00750,1.01319,
2901 1.02044,1.02927,1.03974,
2902 1.05195,1.06604,1.08224,1.10085,1.12229,1.14717,1.17623,1.20963,
2903 1.24296,1.26532,1.27619,1.28126,1.28362,1.28458,1.28477,1.28450,
2904 1.28394,1.28320,1.28235,1.28141,1.28042,1.27941,1.27837,1.27732,
2905 1.27627,1.27522,1.27418,1.27314,1.27210,1.27108,1.27006,1.26906,
2906 1.26806,1.26707,1.26610,1.26514,1.26418,1.26325,1.26233,1.26147,
2907 1.26147,1.26147,1.25992,1.25992, 0.0};
2908
2909 i = idint(y/(2.0e-02)) + 1;
2910 assert(i >= 1);
2911
2912 if(i >= bsbkSize) {
2913 if(verboseLevel > 2) {
2914 G4cout <<"G4Abla error: index i = " << i << " is greater than array size permits." << G4endl;
2915 }
2916 bipolResult = 0.0;
2917 }
2918 else {
2919 if (iflag == 1) {
2920 bipolResult = bs[i] + (bs[i+1] - bs[i])/2.0e-02 * (y - 2.0e-02*(i - 1));
2921 }
2922 else {
2923 bipolResult = bk[i] + (bk[i+1] - bk[i])/2.0e-02 * (y - 2.0e-02*(i - 1));
2924 }
2925 }
2926
2927 // assert(isnan(bipolResult) == false);
2928 return bipolResult;
2929}
2930
2931void G4Abla::barfit(G4int iz, G4int ia, G4int il, G4double *sbfis, G4double *segs, G4double *selmax)
2932{
2933 // 2223 C VERSION FOR 32BIT COMPUTER
2934 // 2224 C THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE
2935 // 2225 C GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM
2936 // 2226 C AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF
2937 // 2227 C H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC
2938 // 2228 C NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR
2939 // 2229 C MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY
2940 // 2230 C 2*PI).
2941 // 2231 C
2942 // 2232 C THE FISSION BARRIER FO IL = 0 IS CALCULATED FROM A 7TH
2943 // 2233 C ORDER FIT IN TWO VARIABLES TO 638 CALCULATED FISSION
2944 // 2234 C BARRIERS FOR Z VALUES FROM 20 TO 110. THESE 638 BARRIERS ARE
2945 // 2235 C FIT WITH AN RMS DEVIATION OF 0.10 MEV BY THIS 49-PARAMETER
2946 // 2236 C FUNCTION.
2947 // 2237 C IF BARFIT IS CALLED WITH (IZ,IA) VALUES OUTSIDE THE RANGE OF
2948 // 2238 C THE BARRIER HEIGHT IS SET TO 0.0, AND A MESSAGE IS PRINTED
2949 // 2239 C ON THE DEFAULT OUTPUT FILE.
2950 // 2240 C
2951 // 2241 C FOR IL VALUES NOT EQUAL TO ZERO, THE VALUES OF L AT WHICH
2952 // 2242 C THE BARRIER IS 80% AND 20% OF THE L=0 VALUE ARE RESPECTIVELY
2953 // 2243 C FIT TO 20-PARAMETER FUNCTIONS OF Z AND A, OVER A MORE
2954 // 2244 C RESTRICTED RANGE OF A VALUES, THAN IS THE CASE FOR L = 0.
2955 // 2245 C THE VALUE OF L WHERE THE BARRIER DISAPPEARS, LMAX IS FIT TO
2956 // 2246 C A 24-PARAMETER FUNCTION OF Z AND A, WITH THE SAME RANGE OF
2957 // 2247 C Z AND A VALUES AS L-80 AND L-20.
2958 // 2248 C ONCE AGAIN, IF AN (IZ,IA) PAIR IS OUTSIDE OF THE RANGE OF
2959 // 2249 C VALIDITY OF THE FIT, THE BARRIER VALUE IS SET TO 0.0 AND A
2960 // 2250 C MESSAGE IS PRINTED. THESE THREE VALUES (BFIS(L=0),L-80, AND
2961 // 2251 C L-20) AND THE CONSTRINTS OF BFIS = 0 AND D(BFIS)/DL = 0 AT
2962 // 2252 C L = LMAX AND L=0 LEAD TO A FIFTH-ORDER FIT TO BFIS(L) FOR
2963 // 2253 C L>L-20. THE FIRST THREE CONSTRAINTS LEAD TO A THIRD-ORDER FIT
2964 // 2254 C FOR THE REGION L < L-20.
2965 // 2255 C
2966 // 2256 C THE GROUND STATE ENERGIES ARE CALCULATED FROM A
2967 // 2257 C 120-PARAMETER FIT IN Z, A, AND L TO 214 GROUND-STATE ENERGIES
2968 // 2258 C FOR 36 DIFFERENT Z AND A VALUES.
2969 // 2259 C (THE RANGE OF Z AND A IS THE SAME AS FOR L-80, L-20, AND
2970 // 2260 C L-MAX)
2971 // 2261 C
2972 // 2262 C THE CALCULATED BARRIERS FROM WHICH THE FITS WERE MADE WERE
2973 // 2263 C CALCULATED IN 1983-1984 BY A. J. SIERK OF LOS ALAMOS
2974 // 2264 C NATIONAL LABORATORY GROUP T-9, USING YUKAWA-PLUS-EXPONENTIAL
2975 // 2265 C G4DOUBLE FOLDED NUCLEAR ENERGY, EXACT COULOMB DIFFUSENESS
2976 // 2266 C CORRECTIONS, AND DIFFUSE-MATTER MOMENTS OF INERTIA.
2977 // 2267 C THE PARAMETERS OF THE MODEL R-0 = 1.16 FM, AS 21.13 MEV,
2978 // 2268 C KAPPA-S = 2.3, A = 0.68 FM.
2979 // 2269 C THE DIFFUSENESS OF THE MATTER AND CHARGE DISTRIBUTIONS USED
2980 // 2270 C CORRESPONDS TO A SURFACE DIFFUSENESS PARAMETER (DEFINED BY
2981 // 2271 C MYERS) OF 0.99 FM. THE CALCULATED BARRIERS FOR L = 0 ARE
2982 // 2272 C ACCURATE TO A LITTLE LESS THAN 0.1 MEV; THE OUTPUT FROM
2983 // 2273 C THIS SUBROUTINE IS A LITTLE LESS ACCURATE. WORST ERRORS MAY BE
2984 // 2274 C AS LARGE AS 0.5 MEV; CHARACTERISTIC UNCERTAINY IS IN THE RANGE
2985 // 2275 C OF 0.1-0.2 MEV. THE RMS DEVIATION OF THE GROUND-STATE FIT
2986 // 2276 C FROM THE 214 INPUT VALUES IS 0.20 MEV. THE MAXIMUM ERROR
2987 // 2277 C OCCURS FOR LIGHT NUCLEI IN THE REGION WHERE THE GROUND STATE
2988 // 2278 C IS PROLATE, AND MAY BE GREATER THAN 1.0 MEV FOR VERY NEUTRON
2989 // 2279 C DEFICIENT NUCLEI, WITH L NEAR LMAX. FOR MOST NUCLEI LIKELY TO
2990 // 2280 C BE ENCOUNTERED IN REAL EXPERIMENTS, THE MAXIMUM ERROR IS
2991 // 2281 C CLOSER TO 0.5 MEV, AGAIN FOR LIGHT NUCLEI AND L NEAR LMAX.
2992 // 2282 C
2993 // 2283 C WRITTEN BY A. J. SIERK, LANL T-9
2994 // 2284 C VERSION 1.0 FEBRUARY, 1984
2995 // 2285 C
2996 // 2286 C THE FOLLOWING IS NECESSARY FOR 32-BIT MACHINES LIKE DEC VAX,
2997 // 2287 C IBM, ETC
2998
2999 G4double pa[7],pz[7],pl[10];
3000 G4double a,z,amin,amax,amin2,amax2,aa,zz,bfis;
3001 G4double bfis0,ell,el,egs,el80,el20,elmax,sel80,sel20,x,y,q,qa,qb;
3002 G4double aj,ak,a1,a2;
3003
3004 G4int i,j,k,m;
3005 G4int l;
3006
3007 G4double emncof[4][5] = {{-9.01100e+2,-1.40818e+3, 2.77000e+3,-7.06695e+2, 8.89867e+2},
3008 {1.35355e+4,-2.03847e+4, 1.09384e+4,-4.86297e+3,-6.18603e+2},
3009 {-3.26367e+3, 1.62447e+3, 1.36856e+3, 1.31731e+3, 1.53372e+2},
3010 {7.48863e+3,-1.21581e+4, 5.50281e+3,-1.33630e+3, 5.05367e-2}};
3011
3012 G4double elmcof[4][5] = {{1.84542e+3,-5.64002e+3, 5.66730e+3,-3.15150e+3, 9.54160e+2},
3013 {-2.24577e+3, 8.56133e+3,-9.67348e+3, 5.81744e+3,-1.86997e+3},
3014 {2.79772e+3,-8.73073e+3, 9.19706e+3,-4.91900e+3, 1.37283e+3},
3015 {-3.01866e+1, 1.41161e+3,-2.85919e+3, 2.13016e+3,-6.49072e+2}};
3016
3017 G4double emxcof[4][6] = {{9.43596e4,-2.241997e5,2.223237e5,-1.324408e5,4.68922e4,-8.83568e3},
3018 {-1.655827e5,4.062365e5,-4.236128e5,2.66837e5,-9.93242e4,1.90644e4},
3019 {1.705447e5,-4.032e5,3.970312e5,-2.313704e5,7.81147e4,-1.322775e4},
3020 {-9.274555e4,2.278093e5,-2.422225e5,1.55431e5,-5.78742e4,9.97505e3}};
3021
3022 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},
3023 {-1.13269453e+6, 2.97764590e+6,-4.54326326e+6, 3.00464870e+6, -1.44989274e+6,-1.02026610e+5, 6.27959815e+4},
3024 {1.37543304e+6,-3.65808988e+6, 5.47798999e+6,-3.78109283e+6, 1.84131765e+6, 1.53669695e+4,-6.96817834e+4},
3025 {-8.56559835e+5, 2.48872266e+6,-4.07349128e+6, 3.12835899e+6, -1.62394090e+6, 1.19797378e+5, 4.25737058e+4},
3026 {3.28723311e+5,-1.09892175e+6, 2.03997269e+6,-1.77185718e+6, 9.96051545e+5,-1.53305699e+5,-1.12982954e+4},
3027 {4.15850238e+4, 7.29653408e+4,-4.93776346e+5, 6.01254680e+5, -4.01308292e+5, 9.65968391e+4,-3.49596027e+3},
3028 {-1.82751044e+5, 3.91386300e+5,-3.03639248e+5, 1.15782417e+5, -4.24399280e+3,-6.11477247e+3, 3.66982647e+2}};
3029
3030 const G4int sizex = 5;
3031 const G4int sizey = 6;
3032 const G4int sizez = 4;
3033
3034 G4double egscof[sizey][sizey][sizez];
3035
3036 G4double egs1[sizey][sizex] = {{1.927813e5, 7.666859e5, 6.628436e5, 1.586504e5,-7.786476e3},
3037 {-4.499687e5,-1.784644e6,-1.546968e6,-4.020658e5,-3.929522e3},
3038 {4.667741e5, 1.849838e6, 1.641313e6, 5.229787e5, 5.928137e4},
3039 {-3.017927e5,-1.206483e6,-1.124685e6,-4.478641e5,-8.682323e4},
3040 {1.226517e5, 5.015667e5, 5.032605e5, 2.404477e5, 5.603301e4},
3041 {-1.752824e4,-7.411621e4,-7.989019e4,-4.175486e4,-1.024194e4}};
3042
3043 G4double egs2[sizey][sizex] = {{-6.459162e5,-2.903581e6,-3.048551e6,-1.004411e6,-6.558220e4},
3044 {1.469853e6, 6.564615e6, 6.843078e6, 2.280839e6, 1.802023e5},
3045 {-1.435116e6,-6.322470e6,-6.531834e6,-2.298744e6,-2.639612e5},
3046 {8.665296e5, 3.769159e6, 3.899685e6, 1.520520e6, 2.498728e5},
3047 {-3.302885e5,-1.429313e6,-1.512075e6,-6.744828e5,-1.398771e5},
3048 {4.958167e4, 2.178202e5, 2.400617e5, 1.167815e5, 2.663901e4}};
3049
3050 G4double egs3[sizey][sizex] = {{3.117030e5, 1.195474e6, 9.036289e5, 6.876190e4,-6.814556e4},
3051 {-7.394913e5,-2.826468e6,-2.152757e6,-2.459553e5, 1.101414e5},
3052 {7.918994e5, 3.030439e6, 2.412611e6, 5.228065e5, 8.542465e3},
3053 {-5.421004e5,-2.102672e6,-1.813959e6,-6.251700e5,-1.184348e5},
3054 {2.370771e5, 9.459043e5, 9.026235e5, 4.116799e5, 1.001348e5},
3055 {-4.227664e4,-1.738756e5,-1.795906e5,-9.292141e4,-2.397528e4}};
3056
3057 G4double egs4[sizey][sizex] = {{-1.072763e5,-5.973532e5,-6.151814e5, 7.371898e4, 1.255490e5},
3058 {2.298769e5, 1.265001e6, 1.252798e6,-2.306276e5,-2.845824e5},
3059 {-2.093664e5,-1.100874e6,-1.009313e6, 2.705945e5, 2.506562e5},
3060 {1.274613e5, 6.190307e5, 5.262822e5,-1.336039e5,-1.115865e5},
3061 {-5.715764e4,-2.560989e5,-2.228781e5,-3.222789e3, 1.575670e4},
3062 {1.189447e4, 5.161815e4, 4.870290e4, 1.266808e4, 2.069603e3}};
3063
3064 for(i = 0; i < sizey; i++) {
3065 for(j = 0; j < sizex; j++) {
3066 // egscof[i][j][0] = egs1[i][j];
3067 // egscof[i][j][1] = egs2[i][j];
3068 // egscof[i][j][2] = egs3[i][j];
3069 // egscof[i][j][3] = egs4[i][j];
3070 egscof[i][j][0] = egs1[i][j];
3071 egscof[i][j][1] = egs2[i][j];
3072 egscof[i][j][2] = egs3[i][j];
3073 egscof[i][j][3] = egs4[i][j];
3074 }
3075 }
3076
3077 // the program starts here
3078 if (iz < 19 || iz > 111) {
3079 goto barfit900;
3080 }
3081
3082 if(iz > 102 && il > 0) {
3083 goto barfit902;
3084 }
3085
3086 z=double(iz);
3087 a=double(ia);
3088 el=double(il);
3089 amin= 1.2e0*z + 0.01e0*z*z;
3090 amax= 5.8e0*z - 0.024e0*z*z;
3091
3092 if(a < amin || a > amax) {
3093 goto barfit910;
3094 }
3095
3096 // angul.mom.zero barrier
3097 aa=2.5e-3*a;
3098 zz=1.0e-2*z;
3099 ell=1.0e-2*el;
3100 bfis0 = 0.0;
3101 lpoly(zz,7,pz);
3102 lpoly(aa,7,pa);
3103
3104 for(i = 0; i < 7; i++) { //do 10 i=1,7
3105 for(j = 0; j < 7; j++) { //do 10 j=1,7
3106 bfis0=bfis0+elzcof[j][i]*pz[i]*pa[j];
3107 //bfis0=bfis0+elzcof[i][j]*pz[j]*pa[i];
3108 }
3109 }
3110
3111 bfis=bfis0;
3112 // assert(isnan(bfis) == false);
3113
3114 (*sbfis)=bfis;
3115 egs=0.0;
3116 (*segs)=egs;
3117
3118 // values of l at which the barrier
3119 // is 20%(el20) and 80%(el80) of l=0 value
3120 amin2 = 1.4e0*z + 0.009e0*z*z;
3121 amax2 = 20.e0 + 3.0e0*z;
3122
3123 if((a < amin2-5.e0 || a > amax2+10.e0) && il > 0) {
3124 goto barfit920;
3125 }
3126
3127 lpoly(zz,5,pz);
3128 lpoly(aa,4,pa);
3129 el80=0.0;
3130 el20=0.0;
3131 elmax=0.0;
3132
3133 for(i = 0; i < 4; i++) {
3134 for(j = 0; j < 5; j++) {
3135// el80 = el80 + elmcof[j][i]*pz[j]*pa[i];
3136// el20 = el20 + emncof[j][i]*pz[j]*pa[i];
3137 el80 = el80 + elmcof[i][j]*pz[j]*pa[i];
3138 el20 = el20 + emncof[i][j]*pz[j]*pa[i];
3139 }
3140 }
3141
3142 sel80 = el80;
3143 sel20 = el20;
3144
3145 // value of l (elmax) where barrier disapp.
3146 lpoly(zz,6,pz);
3147 lpoly(ell,9,pl);
3148
3149 for(i = 0; i < 4; i++) { //do 30 i= 1,4
3150 for(j = 0; j < 6; j++) { //do 30 j=1,6
3151 //elmax = elmax + emxcof[j][i]*pz[j]*pa[i];
3152 // elmax = elmax + emxcof[j][i]*pz[i]*pa[j];
3153 elmax = elmax + emxcof[i][j]*pz[j]*pa[i];
3154 }
3155 }
3156
3157 // assert(isnan(elmax) == false);
3158 (*selmax)=elmax;
3159
3160 // value of barrier at ang.mom. l
3161 if(il < 1){
3162 return;
3163 }
3164
3165 x = sel20/(*selmax);
3166 // assert(isnan(x) == false);
3167 y = sel80/(*selmax);
3168 // assert(isnan(y) == false);
3169
3170 if(el <= sel20) {
3171 // low l
3172 q = 0.2/(std::pow(sel20,2)*std::pow(sel80,2)*(sel20-sel80));
3173 qa = q*(4.0*std::pow(sel80,3) - std::pow(sel20,3));
3174 qb = -q*(4.0*std::pow(sel80,2) - std::pow(sel20,2));
3175 bfis = bfis*(1.0 + qa*std::pow(el,2) + qb*std::pow(el,3));
3176 }
3177 else {
3178 // high l
3179 aj = (-20.0*std::pow(x,5) + 25.e0*std::pow(x,4) - 4.0)*std::pow((y-1.0),2)*y*y;
3180 ak = (-20.0*std::pow(y,5) + 25.0*std::pow(y,4) - 1.0) * std::pow((x-1.0),2)*x*x;
3181 q = 0.2/(std::pow((y-x)*((1.0-x)*(1.0-y)*x*y),2));
3182 qa = q*(aj*y - ak*x);
3183 qb = -q*(aj*(2.0*y + 1.0) - ak*(2.0*x + 1.0));
3184 z = el/(*selmax);
3185 a1 = 4.0*std::pow(z,5) - 5.0*std::pow(z,4) + 1.0;
3186 a2 = qa*(2.e0*z + 1.e0);
3187 bfis=bfis*(a1 + (z - 1.e0)*(a2 + qb*z)*z*z*(z - 1.e0));
3188 }
3189
3190 if(bfis <= 0.0) {
3191 bfis=0.0;
3192 }
3193
3194 if(el > (*selmax)) {
3195 bfis=0.0;
3196 }
3197 (*sbfis)=bfis;
3198
3199 // now calculate rotating ground state energy
3200 if(el > (*selmax)) {
3201 return;
3202 }
3203
3204 for(k = 0; k < 4; k++) {
3205 for(l = 0; l < 6; l++) {
3206 for(m = 0; m < 5; m++) {
3207 //egs = egs + egscof[l][m][k]*pz[l]*pa[k]*pl[2*m-1];
3208 egs = egs + egscof[l][m][k]*pz[l]*pa[k]*pl[2*m];
3209 // egs = egs + egscof[m][l][k]*pz[l]*pa[k]*pl[2*m-1];
3210 }
3211 }
3212 }
3213
3214 (*segs)=egs;
3215 if((*segs) < 0.0) {
3216 (*segs)=0.0;
3217 }
3218
3219 return;
3220
3221 barfit900: //continue
3222 (*sbfis)=0.0;
3223 // for z<19 sbfis set to 1.0e3
3224 if (iz < 19) {
3225 (*sbfis) = 1.0e3;
3226 }
3227 (*segs)=0.0;
3228 (*selmax)=0.0;
3229 return;
3230
3231 barfit902:
3232 (*sbfis)=0.0;
3233 (*segs)=0.0;
3234 (*selmax)=0.0;
3235 return;
3236
3237 barfit910:
3238 (*sbfis)=0.0;
3239 (*segs)=0.0;
3240 (*selmax)=0.0;
3241 return;
3242
3243 barfit920:
3244 (*sbfis)=0.0;
3245 (*segs)=0.0;
3246 (*selmax)=0.0;
3247 return;
3248}
3249
3250G4double G4Abla::expohaz(G4int k, G4double T)
3251{
3252 // TIRAGE ALEATOIRE DANS UNE EXPONENTIELLLE : Y=EXP(-X/T)
3253
3254 // assert(isnan((-1*T*std::log(haz(k)))) == false);
3255 return (-1.0*T*std::log(haz(k)));
3256}
3257
3258G4double G4Abla::fd(G4double E)
3259{
3260 // DISTRIBUTION DE MAXWELL
3261
3262 return (E*std::exp(-E));
3263}
3264
3265G4double G4Abla::f(G4double E)
3266{
3267 // FONCTION INTEGRALE DE FD(E)
3268 return (1.0 - (E + 1.0) * std::exp(-E));
3269}
3270
3271G4double G4Abla::fmaxhaz(G4double T)
3272{
3273 // tirage aleatoire dans une maxwellienne
3274 // t : temperature
3275 //
3276 // declaration des variables
3277 //
3278
3279 const int pSize = 101;
3280 static G4double p[pSize];
3281
3282 // ial generateur pour le cascade (et les iy pour eviter les correlations)
3283 static G4int i;
3284 static G4int itest = 0;
3285 // programme principal
3286
3287 // calcul des p(i) par approximation de newton
3288 p[pSize-1] = 8.0;
3289 G4double x = 0.1;
3290 G4double x1;
3291 G4double y;
3292
3293 if (itest == 1) {
3294 goto fmaxhaz120;
3295 }
3296
3297 for(i = 1; i <= 99; i++) {
3298 fmaxhaz20:
3299 x1 = x - (f(x) - double(i)/100.0)/fd(x);
3300 x = x1;
3301 if (std::fabs(f(x) - double(i)/100.0) < 1e-5) {
3302 goto fmaxhaz100;
3303 }
3304 goto fmaxhaz20;
3305 fmaxhaz100:
3306 p[i] = x;
3307 } //end do
3308
3309 // itest = 1;
3310 itest = 0;
3311 // tirage aleatoire et calcul du x correspondant
3312 // par regression lineaire
3313 fmaxhaz120:
3314 standardRandom(&y, &(hazard->igraine[17]));
3315 i = nint(y*100);
3316
3317 // 2590 c ici on evite froidement les depassements de tableaux....(a.b. 3/9/99)
3318 if(i == 0) {
3319 goto fmaxhaz120;
3320 }
3321
3322 if (i == 1) {
3323 x = p[i]*y*100;
3324 }
3325 else {
3326 x = (p[i] - p[i-1])*(y*100 - i) + p[i];
3327 }
3328
3329 return(x*T);
3330}
3331
3332G4double G4Abla::pace2(G4double a, G4double z)
3333{
3334 // PACE2
3335 // Cette fonction retourne le defaut de masse du noyau A,Z en MeV
3336 // Révisée pour a, z flottants 25/4/2002 =
3337
3338 G4double pace2;
3339
3340 G4int ii = idint(a+0.5);
3341 G4int jj = idint(z+0.5);
3342
3343 if(ii <= 0 || jj < 0) {
3344 pace2=0.;
3345 return pace2;
3346 }
3347
3348 if(jj > 300) {
3349 pace2=0.0;
3350 }
3351 else {
3352 pace2=pace->dm[ii][jj];
3353 }
3354 pace2=pace2/1000.;
3355
3356 if(pace->dm[ii][jj] == 0.) {
3357 if(ii < 12) {
3358 pace2=-500.;
3359 }
3360 else {
3361 guet(&a, &z, &pace2);
3362 pace2=pace2-ii*931.5;
3363 pace2=pace2/1000.;
3364 }
3365 }
3366
3367 return pace2;
3368}
3369
3370void G4Abla::guet(G4double *x_par, G4double *z_par, G4double *find_par)
3371{
3372 // TABLE DE MASSES ET FORMULE DE MASSE TIRE DU PAPIER DE BRACK-GUET
3373 // Gives the theoritical value for mass excess...
3374 // Révisée pour x, z flottants 25/4/2002
3375
3376 //real*8 x,z
3377 // dimension q(0:50,0:70)
3378 G4double x = (*x_par);
3379 G4double z = (*z_par);
3380 G4double find = (*find_par);
3381
3382 const G4int qrows = 50;
3383 const G4int qcols = 70;
3384 G4double q[qrows][qcols];
3385
3386 G4int ix=G4int(std::floor(x+0.5));
3387 G4int iz=G4int(std::floor(z+0.5));
3388 G4double zz = iz;
3389 G4double xx = ix;
3390 find = 0.0;
3391 G4double avol = 15.776;
3392 G4double asur = -17.22;
3393 G4double ac = -10.24;
3394 G4double azer = 8.0;
3395 G4double xjj = -30.03;
3396 G4double qq = -35.4;
3397 G4double c1 = -0.737;
3398 G4double c2 = 1.28;
3399
3400 if(ix <= 7) {
3401 q[0][1]=939.50;
3402 q[1][1]=938.21;
3403 q[1][2]=1876.1;
3404 q[1][3]=2809.39;
3405 q[2][4]=3728.34;
3406 q[2][3]=2809.4;
3407 q[2][5]=4668.8;
3408 q[2][6]=5606.5;
3409 q[3][5]=4669.1;
3410 q[3][6]=5602.9;
3411 q[3][7]=6535.27;
3412 q[4][6]=5607.3;
3413 q[4][7]=6536.1;
3414 q[5][7]=6548.3;
3415 find=q[iz][ix];
3416 }
3417 else {
3418 G4double xneu=xx-zz;
3419 G4double si=(xneu-zz)/xx;
3420 G4double x13=std::pow(xx,.333);
3421 G4double ee1=c1*zz*zz/x13;
3422 G4double ee2=c2*zz*zz/xx;
3423 G4double aux=1.+(9.*xjj/4./qq/x13);
3424 G4double ee3=xjj*xx*si*si/aux;
3425 G4double ee4=avol*xx+asur*(std::pow(xx,.666))+ac*x13+azer;
3426 G4double tota = ee1 + ee2 + ee3 + ee4;
3427 find = 939.55*xneu+938.77*zz - tota;
3428 }
3429
3430 (*x_par) = x;
3431 (*z_par) = z;
3432 (*find_par) = find;
3433}
3434
3435
3436// Fission code
3437
3438void G4Abla::even_odd(G4double r_origin,G4double r_even_odd,G4int &i_out)
3439{
3440 // Procedure to calculate I_OUT from R_IN in a way that
3441 // on the average a flat distribution in R_IN results in a
3442 // fluctuating distribution in I_OUT with an even-odd effect as
3443 // given by R_EVEN_ODD
3444
3445 // /* ------------------------------------------------------------ */
3446 // /* EXAMPLES : */
3447 // /* ------------------------------------------------------------ */
3448 // /* If R_EVEN_ODD = 0 : */
3449 // /* CEIL(R_IN) ---- */
3450 // /* */
3451 // /* R_IN -> */
3452 // /* (somewhere in between CEIL(R_IN) and FLOOR(R_IN)) */ */
3453 // /* */
3454 // /* FLOOR(R_IN) ---- --> I_OUT */
3455 // /* ------------------------------------------------------------ */
3456 // /* If R_EVEN_ODD > 0 : */
3457 // /* The interval for the above treatment is */
3458 // /* larger for FLOOR(R_IN) = even and */
3459 // /* smaller for FLOOR(R_IN) = odd */
3460 // /* For R_EVEN_ODD < 0 : just opposite treatment */
3461 // /* ------------------------------------------------------------ */
3462
3463 // /* ------------------------------------------------------------ */
3464 // /* On input: R_ORIGIN nuclear charge (real number) */
3465 // /* R_EVEN_ODD requested even-odd effect */
3466 // /* Intermediate quantity: R_IN = R_ORIGIN + 0.5 */
3467 // /* On output: I_OUT nuclear charge (integer) */
3468 // /* ------------------------------------------------------------ */
3469
3470 // G4double R_ORIGIN,R_IN,R_EVEN_ODD,R_REST,R_HELP;
3471 G4double r_in,r_rest,r_help;
3472 G4double r_floor;
3473 G4double r_middle;
3474 // G4int I_OUT,N_FLOOR;
3475 G4int n_floor;
3476
3477 r_in = r_origin + 0.5;
3478 r_floor = (float)((int)(r_in));
3479 if (r_even_odd < 0.001) {
3480 i_out = (int)(r_floor);
3481 }
3482 else {
3483 r_rest = r_in - r_floor;
3484 r_middle = r_floor + 0.5;
3485 n_floor = (int)(r_floor);
3486 if (n_floor%2 == 0) {
3487 // even before modif.
3488 r_help = r_middle + (r_rest - 0.5) * (1.0 - r_even_odd);
3489 }
3490 else {
3491 // odd before modification
3492 r_help = r_middle + (r_rest - 0.5) * (1.0 + r_even_odd);
3493 }
3494 i_out = (int)(r_help);
3495 }
3496}
3497
3498G4double G4Abla::umass(G4double z,G4double n,G4double beta)
3499{
3500 // liquid-drop mass, Myers & Swiatecki, Lysekil, 1967
3501 // pure liquid drop, without pairing and shell effects
3502
3503 // On input: Z nuclear charge of nucleus
3504 // N number of neutrons in nucleus
3505 // beta deformation of nucleus
3506 // On output: binding energy of nucleus
3507
3508 G4double a,umass;
3509 G4double alpha;
3510 G4double xcom,xvs,xe;
3511 const G4double pi = 3.1416;
3512
3513 a = n + z;
3514 alpha = ( std::sqrt(5.0/(4.0*pi)) ) * beta;
3515 // assert(isnan(alpha) == false);
3516
3517 xcom = 1.0 - 1.7826 * ((a - 2.0*z)/a)*((a - 2.0*z)/a);
3518 // assert(isnan(xcom) == false);
3519 // factor for asymmetry dependence of surface and volume term
3520 xvs = - xcom * ( 15.4941 * a -
3521 17.9439 * std::pow(a,0.66667) * (1.0+0.4*alpha*alpha) );
3522 // sum of volume and surface energy
3523 xe = z*z * (0.7053/(std::pow(a,0.33333)) * (1.0-0.2*alpha*alpha) - 1.1529/a);
3524 // assert(isnan(xe) == false);
3525 umass = xvs + xe;
3526
3527 return umass;
3528}
3529
3530G4double G4Abla::ecoul(G4double z1,G4double n1,G4double beta1,G4double z2,G4double n2,G4double beta2,G4double d)
3531{
3532 // Coulomb potential between two nuclei
3533 // surfaces are in a distance of d
3534 // in a tip to tip configuration
3535
3536 // approximate formulation
3537 // On input: Z1 nuclear charge of first nucleus
3538 // N1 number of neutrons in first nucleus
3539 // beta1 deformation of first nucleus
3540 // Z2 nuclear charge of second nucleus
3541 // N2 number of neutrons in second nucleus
3542 // beta2 deformation of second nucleus
3543 // d distance of surfaces of the nuclei
3544
3545 // G4double Z1,N1,beta1,Z2,N2,beta2,d,ecoul;
3546 G4double ecoul;
3547 G4double dtot;
3548 const G4double r0 = 1.16;
3549
3550 dtot = r0 * ( std::pow((z1+n1),0.33333) * (1.0+(2.0/3.0)*beta1)
3551 + std::pow((z2+n2),0.33333) * (1.0+(2.0/3.0)*beta2) ) + d;
3552 ecoul = z1 * z2 * 1.44 / dtot;
3553
3554 // assert(isnan(ecoul) == false);
3555 return ecoul;
3556}
3557
3558void G4Abla::fissionDistri(G4double &a,G4double &z,G4double &e,
3559 G4double &a1,G4double &z1,G4double &e1,G4double &v1,
3560 G4double &a2,G4double &z2,G4double &e2,G4double &v2)
3561{
3562 // On input: A, Z, E (mass, atomic number and exc. energy of compound nucleus
3563 // before fission)
3564 // On output: Ai, Zi, Ei (mass, atomic number and exc. energy of fragment 1 and 2
3565 // after fission)
3566
3567 // Additionally calculated but not put in the parameter list:
3568 // Kinetic energy of prefragments EkinR1, EkinR2
3569
3570 // Translation of SIMFIS18.PLI (KHS, 2.1.2001)
3571
3572 // This program calculates isotopic distributions of fission fragments
3573 // with a semiempirical model
3574 // Copy from SIMFIS3, KHS, 8. February 1995
3575 // Modifications made by Jose Benlliure and KHS in August 1996
3576 // Energy counted from lowest barrier (J. Benlliure, KHS 1997)
3577 // Some bugs corrected (J. Benlliure, KHS 1997)
3578 // Version used for thesis S. Steinhaueser (August 1997)
3579 // (Curvature of LD potential increased by factor of 2!)
3580
3581 // Weiter veraendert mit der Absicht, eine Version zu erhalten, die
3582 // derjenigen entspricht, die von J. Benlliure et al.
3583 // in Nucl. Phys. A 628 (1998) 458 verwendet wurde,
3584 // allerdings ohne volle Neutronenabdampfung.
3585
3586 // The excitation energy was calculate now for each fission channel
3587 // separately. The dissipation from saddle to scission was taken from
3588 // systematics, the deformation energy at scission considers the shell
3589 // effects in a simplified way, and the fluctuation is included.
3590 // KHS, April 1999
3591
3592 // The width in N/Z was carefully adapted to values given by Lang et al.
3593
3594 // The width and eventually a shift in N/Z (polarization) follows the
3595 // following rules:
3596
3597 // The line N/Z following UCD has an angle of std::atan(Zcn/Ncn)
3598 // to the horizontal axis on a chart of nuclides.
3599 // (For 238U the angle is 32.2 deg.)
3600
3601 // The following relations hold: (from Armbruster)
3602 //
3603 // sigma(N) (A=const) = sigma(Z) (A=const)
3604 // sigma(A) (N=const) = sigma(Z) (N=const)
3605 // sigma(A) (Z=const) = sigma(N) (Z=const)
3606 //
3607 // From this we get:
3608 // sigma(Z) (N=const) * N = sigma(N) (Z=const) * Z
3609 // sigma(A) (Z=const) = sigma(Z) (A=const) * A/Z
3610 // sigma(N) (Z=const) = sigma(Z) (A=const) * A/Z
3611 // Z*sigma(N) (Z=const) = N*sigma(Z) (N=const) = A*sigma(Z) (A=const)
3612
3613 // Excitation energy now calculated above the lowest potential point
3614 // Inclusion of a distribution of excitation energies
3615
3616 // Several modifications, starting from SIMFIS12: KHS November 2000
3617 // This version seems to work quite well for 238U.
3618 // The transition from symmetric to asymmetric fission around 226Th
3619 // is reasonably well reproduced, although St. I is too strong and St. II
3620 // is too weak. St. I and St. II are also weakly seen for 208Pb.
3621
3622 // Extensions for an event generator of fission events (21.11.2000,KHS)
3623
3624 // Defalt parameters (IPARS) rather carefully adjusted to
3625 // pre-neutron mass distributions of Vives et al. (238U + n)
3626 // Die Parameter Fgamma1 und Fgamma2 sind kleiner als die resultierenden
3627 // Breiten der Massenverteilungen!!!
3628 // Fgamma1 und Fgamma2 wurden angepaᅵ, so daᅵ
3629 // Sigma-A(ST-I) = 3.3, Sigma-A(St-II) = 5.8 (nach Vives)
3630
3631 // Parameters of the model carefully adjusted by KHS (2.2.2001) to
3632 // 238U + 208Pb, 1000 A MeV, Timo Enqvist et al.
3633
3634
3635 G4double n;
3636 G4double nlight1,nlight2;
3637 G4double aheavy1,alight1,aheavy2,alight2;
3638 G4double eheavy1,elight1,eheavy2,elight2;
3639 G4double zheavy1_shell,zheavy2_shell;
3640 G4double zlight1,zlight2;
3641 G4double masscurv;
3642 G4double sasymm1,sasymm2,ssymm,ysum,yasymm;
3643 G4double ssymm_mode1,ssymm_mode2;
3644 G4double cz_asymm1_saddle,cz_asymm2_saddle;
3645 // Curvature at saddle, modified by ld-potential
3646 G4double wzasymm1_saddle, wzasymm2_saddle, wzsymm_saddle;
3647 G4double wzasymm1_scission, wzasymm2_scission, wzsymm_scission;
3648 G4double wzasymm1,wzasymm2,wzsymm;
3649 G4double nlight1_eff, nlight2_eff;
3650 G4int imode = 0;
3651 G4double rmode;
3652 G4double z1mean = 0.0, z2mean = 0.0, z1width = 0.0, za1width = 0.0;
3653 // G4double Z1,Z2,N1R,N2R,A1R,A2R,N1,N2,A1,A2;
3654 G4double n1r,n2r,a1r,a2r,n1,n2;
3655
3656 G4double zsymm,nsymm,asymm;
3657 G4double n1mean = 0.0, n2mean, n1width;
3658 G4double dueff;
3659 // effective shell effect at lowest barrier
3660 G4double eld;
3661 // Excitation energy with respect to ld barrier
3662 G4double re1,re2,re3;
3663 G4double eps1,eps2;
3664 G4double n1ucd,n2ucd,z1ucd,z2ucd;
3665 G4double beta = 0.0, beta1 = 0.0, beta2 = 0.0;
3666
3667 G4double dn1_pol;
3668 // shift of most probable neutron number for given Z,
3669 // according to polarization
3670 G4int i_help;
3671
3672 // /* Parameters of the semiempirical fission model */
3673 G4double a_levdens;
3674 // /* level-density parameter */
3675 G4double a_levdens_light1,a_levdens_light2;
3676 G4double a_levdens_heavy1,a_levdens_heavy2;
3677 const G4double r_null = 1.16;
3678 // /* radius parameter */
3679 G4double epsilon_1_saddle,epsilon0_1_saddle;
3680 G4double epsilon_2_saddle,epsilon0_2_saddle,epsilon_symm_saddle;
3681 G4double epsilon_1_scission,epsilon0_1_scission;
3682 G4double epsilon_2_scission,epsilon0_2_scission;
3683 G4double epsilon_symm_scission;
3684 // /* modified energy */
3685 G4double e_eff1_saddle,e_eff2_saddle;
3686 G4double epot0_mode1_saddle,epot0_mode2_saddle,epot0_symm_saddle;
3687 G4double epot_mode1_saddle,epot_mode2_saddle,epot_symm_saddle;
3688 G4double e_defo, e_defo1,e_defo2, e_scission = 0.0, e_asym;
3689 G4double e1exc = 0.0, e2exc = 0.0;
3690 G4double e1exc_sigma,e2exc_sigma;
3691 G4double e1final,e2final;
3692
3693 const G4double r0 = 1.16;
3694 G4double tker;
3695 G4double ekin1,ekin2;
3696 // G4double EkinR1,EkinR2,E1,E2,V1,V2;
3697 G4double ekinr1,ekinr2;
3698 G4int icz,k;
3699
3700 // Input parameters:
3701 //OMMENT(Nuclear charge number);
3702 // G4double Z;
3703 //OMMENT(Nuclear mass number);
3704 // G4double A;
3705 //OMMENT(Excitation energy above fission barrier);
3706 // G4double E;
3707
3708 // Model parameters:
3709 //OMMENT(position of heavy peak valley 1);
3710 const G4double nheavy1 = 83.0;
3711 //OMMENT(position of heavy peak valley 2);
3712 const G4double nheavy2 = 90.0;
3713 //OMMENT(Shell effect for valley 1);
3714 const G4double delta_u1_shell = -2.65;
3715 // Parameter (Delta_U1_shell = -2)
3716 //OMMENT(Shell effect for valley 2);
3717 const G4double delta_u2_shell = -3.8;
3718 // Parameter (Delta_U2_shell = -3.2)
3719 //OMMENT(I: used shell effect);
3720 G4double delta_u1;
3721 //omment(I: used shell effect);
3722 G4double delta_u2;
3723 //OMMENT(Curvature of asymmetric valley 1);
3724 const G4double cz_asymm1_shell = 0.7;
3725 //OMMENT(Curvature of asymmetric valley 2);
3726 const G4double cz_asymm2_shell = 0.15;
3727 //OMMENT(Factor for width of distr. valley 1);
3728 const G4double fwidth_asymm1 = 0.63;
3729 //OMMENT(Factor for width of distr. valley 2);
3730 const G4double fwidth_asymm2 = 0.97;
3731 // Parameter (CZ_asymm2_scission = 0.12)
3732 //OMMENT(Parameter x: a = A/x);
3733 const G4double xlevdens = 12.0;
3734 //OMMENT(Factor to gamma_heavy1);
3735 const G4double fgamma1 = 2.0;
3736 //OMMENT(I: fading of shells (general));
3737 G4double gamma;
3738 //OMMENT(I: fading of shell 1);
3739 G4double gamma_heavy1;
3740 //OMMENT(I: fading of shell 2);
3741 G4double gamma_heavy2;
3742 //OMMENT(Zero-point energy at saddle);
3743 const G4double e_zero_point = 0.5;
3744 //OMMENT(I: friction from saddle to scission);
3745 G4double e_saddle_scission;
3746 //OMMENT(Friction factor);
3747 const G4double friction_factor = 1.0;
3748 //OMMENT(I: Internal counter for different modes); INIT(0,0,0)
3749 // Integer*4 I_MODE(3)
3750 //OMMENT(I: Yield of symmetric mode);
3751 G4double ysymm = 0.0;
3752 //OMMENT(I: Yield of asymmetric mode 1);
3753 G4double yasymm1 = 0.0;
3754 //OMMENT(I: Yield of asymmetric mode 2);
3755 G4double yasymm2 = 0.0;
3756 //OMMENT(I: Effective position of valley 1);
3757 G4double nheavy1_eff;
3758 //OMMENT(I: position of heavy peak valley 1);
3759 G4double zheavy1;
3760 //omment(I: Effective position of valley 2);
3761 G4double nheavy2_eff;
3762 //OMMENT(I: position of heavy peak valley 2);
3763 G4double zheavy2;
3764 //omment(I: Excitation energy above saddle 1);
3765 G4double eexc1_saddle;
3766 //omment(I: Excitation energy above saddle 2);
3767 G4double eexc2_saddle;
3768 //omment(I: Excitation energy above lowest saddle);
3769 G4double eexc_max;
3770 //omment(I: Effective mass mode 1);
3771 G4double aheavy1_mean;
3772 //omment(I: Effective mass mode 2);
3773 G4double aheavy2_mean;
3774 //omment(I: Width of symmetric mode);
3775 G4double wasymm_saddle;
3776 //OMMENT(I: Width of asymmetric mode 1);
3777 G4double waheavy1_saddle;
3778 //OMMENT(I: Width of asymmetric mode 2);
3779 G4double waheavy2_saddle;
3780 //omment(I: Width of symmetric mode);
3781 G4double wasymm;
3782 //OMMENT(I: Width of asymmetric mode 1);
3783 G4double waheavy1;
3784 //OMMENT(I: Width of asymmetric mode 2);
3785 G4double waheavy2;
3786 //OMMENT(I: Even-odd effect in Z);
3787 G4double r_e_o,r_e_o_exp;
3788 //OMMENT(I: Curveture of symmetric valley);
3789 G4double cz_symm;
3790 //OMMENT(I: Curvature of mass distribution for fixed Z);
3791 G4double cn;
3792 //OMMENT(I: Curvature of Z distribution for fixed A);
3793 G4double cz;
3794 //OMMENT(Minimum neutron width for constant Z);
3795 const G4double sigzmin = 1.16;
3796 //OMMENT(Surface distance of scission configuration);
3797 const G4double d = 2.0;
3798
3799 // /* Charge polarisation from Wagemanns p. 397: */
3800 //OMMENT(Charge polarisation standard I);
3801 const G4double cpol1 = 0.65;
3802 //OMMENT(Charge polarisation standard II);
3803 const G4double cpol2 = 0.55;
3804 //OMMENT(=1: Polarisation simult. in N and Z);
3805 const G4int nzpol = 1;
3806 //OMMENT(=1: test output, =0: no test output);
3807 const G4int itest = 0;
3808
3809 // G4double UMASS, ECOUL, reps1, reps2, rn1_pol;
3810 G4double reps1, reps2, rn1_pol;
3811 // Float_t HAZ,GAUSSHAZ;
3812 G4int kkk = 0;
3813 // G4int kkk = 10; // PK
3814
3815 // I_MODE = 0;
3816
3817 if(itest == 1) {
3818 G4cout << " cn mass " << a << G4endl;
3819 G4cout << " cn charge " << z << G4endl;
3820 G4cout << " cn energy " << e << G4endl;
3821 }
3822
3823 // /* average Z of asymmetric and symmetric components: */
3824 n = a - z; /* neutron number of the fissioning nucleus */
3825
3826 k = 0;
3827 icz = 0;
3828 if ( (std::pow(z,2)/a < 25.0) || (n < nheavy2) || (e > 500.0) ) {
3829 icz = -1;
3830 // GOTO 1002;
3831 goto milledeux;
3832 }
3833
3834 nlight1 = n - nheavy1;
3835 nlight2 = n - nheavy2;
3836
3837 // /* Polarisation assumed for standard I and standard II:
3838 // Z - Zucd = cpol (for A = const);
3839 // from this we get (see Armbruster)
3840 // Z - Zucd = Acn/Ncn * cpol (for N = const) */
3841
3842 zheavy1_shell = ((nheavy1/n) * z) - ((a/n) * cpol1);
3843 zheavy2_shell = ((nheavy2/n) * z) - ((a/n) * cpol2);
3844
3845 e_saddle_scission =
3846 (-24.0 + 0.02227 * (std::pow(z,2))/(std::pow(a,0.33333)) ) * friction_factor;
3847
3848 // /* Energy dissipated from saddle to scission */
3849 // /* F. Rejmund et al., Nucl. Phys. A 678 (2000) 215, fig. 4 b */
3850 // E_saddle_scission = DMAX1(0.,E_saddle_scission);
3851 if (e_saddle_scission > 0.) {
3852 e_saddle_scission = e_saddle_scission;
3853 }
3854 else {
3855 e_saddle_scission = 0.;
3856 }
3857 // /* Semiempirical fission model: */
3858
3859 // /* Fit to experimental result on curvature of potential at saddle */
3860 // /* reference: */
3861 // /* IF Z**2/A < 33.15E0 THEN
3862 // MassCurv = 30.5438538E0 - 4.00212049E0 * Z**2/A
3863 // + 0.11983384E0 * Z**4 / (A**2) ;
3864 // ELSE
3865 // MassCurv = 10.E0 ** (7.16993332E0 - 0.26602401E0 * Z**2/A
3866 // + 0.00283802E0 * Z**4 / (A**2)) ; */
3867 // /* New parametrization of T. Enqvist according to Mulgin et al. 1998 */
3868 if ( (std::pow(z,2))/a < 34.0) {
3869 masscurv = std::pow( 10.0,(-1.093364 + 0.082933 * (std::pow(z,2)/a)
3870 - 0.0002602 * (std::pow(z,4)/std::pow(a,2))) );
3871 } else {
3872 masscurv = std::pow( 10.0,(3.053536 - 0.056477 * (std::pow(z,2)/a)
3873 + 0.0002454 * (std::pow(z,4)/std::pow(a,2))) );
3874 }
3875
3876 cz_symm = (8.0/std::pow(z,2)) * masscurv;
3877
3878 if(itest == 1) {
3879 G4cout << "cz_symmetry= " << cz_symm << G4endl;
3880 }
3881
3882 if (cz_symm < 0) {
3883 icz = -1;
3884 // GOTO 1002;
3885 goto milledeux;
3886 }
3887
3888 // /* proton number in symmetric fission (centre) */
3889 zsymm = z/2.0;
3890 nsymm = n/2.0;
3891 asymm = nsymm + zsymm;
3892
3893 zheavy1 = (cz_symm*zsymm + cz_asymm1_shell*zheavy1_shell)/(cz_symm + cz_asymm1_shell);
3894 zheavy2 = (cz_symm*zsymm + cz_asymm2_shell*zheavy2_shell)/(cz_symm + cz_asymm2_shell);
3895 // /* position of valley due to influence of liquid-drop potential */
3896 nheavy1_eff = (zheavy1 + (a/n * cpol1))*(n/z);
3897 nheavy2_eff = (zheavy2 + (a/n * cpol2))*(n/z);
3898 nlight1_eff = n - nheavy1_eff;
3899 nlight2_eff = n - nheavy2_eff;
3900 // /* proton number of light fragments (centre) */
3901 zlight1 = z - zheavy1;
3902 // /* proton number of light fragments (centre) */
3903 zlight2 = z - zheavy2;
3904 aheavy1 = nheavy1_eff + zheavy1;
3905 aheavy2 = nheavy2_eff + zheavy2;
3906 aheavy1_mean = aheavy1;
3907 aheavy2_mean = aheavy2;
3908 alight1 = nlight1_eff + zlight1;
3909 alight2 = nlight2_eff + zlight2;
3910
3911 a_levdens = a / xlevdens;
3912 a_levdens_heavy1 = aheavy1 / xlevdens;
3913 a_levdens_heavy2 = aheavy2 / xlevdens;
3914 a_levdens_light1 = alight1 / xlevdens;
3915 a_levdens_light2 = alight2 / xlevdens;
3916 gamma = a_levdens / (0.4 * (std::pow(a,1.3333)) );
3917 gamma_heavy1 = ( a_levdens_heavy1 / (0.4 * (std::pow(aheavy1,1.3333)) ) ) * fgamma1;
3918 gamma_heavy2 = a_levdens_heavy2 / (0.4 * (std::pow(aheavy2,1.3333)) );
3919
3920 cz_asymm1_saddle = cz_asymm1_shell + cz_symm;
3921 cz_asymm2_saddle = cz_asymm2_shell + cz_symm;
3922
3923 // Up to here: Ok! Checked CS 10/10/05
3924
3925 cn = umass(zsymm,(nsymm+1.),0.0) + umass(zsymm,(nsymm-1.),0.0)
3926 + 1.44 * (std::pow(zsymm,2))/
3927 ( (std::pow(r_null,2)) *
3928 ( std::pow((asymm+1.0),0.33333) + std::pow((asymm-1.0),0.33333) ) *
3929 ( std::pow((asymm+1.0),0.33333) + std::pow((asymm-1.0),0.33333) ) )
3930 - 2.0 * umass(zsymm,nsymm,0.0)
3931 - 1.44 * (std::pow(zsymm,2))/
3932 ( ( 2.0 * r_null * (std::pow(asymm,0.33333)) ) *
3933 ( 2.0 * r_null * (std::pow(asymm,0.33333)) ) );
3934
3935 // /* shell effect in valley of mode 1 */
3936 delta_u1 = delta_u1_shell + (std::pow((zheavy1_shell-zheavy1),2))*cz_asymm1_shell;
3937 // /* shell effect in valley of mode 2 */
3938 delta_u2 = delta_u2_shell + (std::pow((zheavy2_shell-zheavy2),2))*cz_asymm2_shell;
3939
3940 // /* liquid drop energies
3941 // at the centres of the different shell effects
3942 // with respect to liquid drop at symmetry: */
3943 epot0_mode1_saddle = (std::pow((zheavy1-zsymm),2)) * cz_symm;
3944 epot0_mode2_saddle = (std::pow((zheavy2-zsymm),2)) * cz_symm;
3945 epot0_symm_saddle = 0.0;
3946
3947 if (itest == 1) {
3948 G4cout << "check zheavy1 = " << zheavy1 << G4endl;
3949 G4cout << "check zheavy2 = " << zheavy2 << G4endl;
3950 G4cout << "check zsymm = " << zsymm << G4endl;
3951 G4cout << "check czsymm = " << cz_symm << G4endl;
3952 G4cout << "check epot0_mode1_saddle = " << epot0_mode1_saddle << G4endl;
3953 G4cout << "check epot0_mode2_saddle = " << epot0_mode2_saddle << G4endl;
3954 G4cout << "check epot0_symm_saddle = " << epot0_symm_saddle << G4endl;
3955 G4cout << "delta_u1 = " << delta_u1 << G4endl;
3956 G4cout << "delta_u2 = " << delta_u2 << G4endl;
3957 }
3958
3959 // /* energies including shell effects
3960 // at the centres of the different shell effects
3961 // with respect to liquid drop at symmetry: */
3962 epot_mode1_saddle = epot0_mode1_saddle + delta_u1;
3963 epot_mode2_saddle = epot0_mode2_saddle + delta_u2;
3964 epot_symm_saddle = epot0_symm_saddle;
3965 if (itest == 1) {
3966 G4cout << "check epot_mode1_saddle = " << epot_mode1_saddle << G4endl;
3967 G4cout << "check epot_mode2_saddle = " << epot_mode2_saddle << G4endl;
3968 G4cout << "check epot_symm_saddle = " << epot_symm_saddle << G4endl;
3969 }
3970
3971 // /* Minimum of potential with respect to ld potential at symmetry */
3972 dueff = min(epot_mode1_saddle,epot_mode2_saddle);
3973 dueff = min(dueff,epot_symm_saddle);
3974 dueff = dueff - epot_symm_saddle;
3975
3976 eld = e + dueff + e_zero_point;
3977
3978 if (itest == 1) {
3979 G4cout << "check dueff = " << dueff << G4endl;
3980 G4cout << "check e = " << e << G4endl;
3981 G4cout << "check e_zero_point = " << e_zero_point << G4endl;
3982 G4cout << "check eld = " << eld << G4endl;
3983 }
3984 // Up to here: Ok! Checked CS 10/10/05
3985
3986 // /* E = energy above lowest effective barrier */
3987 // /* Eld = energy above liquid-drop barrier */
3988
3989 // /* Due to this treatment the energy E on input means the excitation */
3990 // /* energy above the lowest saddle. */
3991
3992 // /* These energies are not used */
3993 eheavy1 = e * aheavy1 / a;
3994 eheavy2 = e * aheavy2 / a;
3995 elight1 = e * alight1 / a;
3996 elight2 = e * alight2 / a;
3997
3998 epsilon0_1_saddle = eld - e_zero_point - epot0_mode1_saddle;
3999 // /* excitation energy at saddle mode 1 without shell effect */
4000 epsilon0_2_saddle = eld - e_zero_point - epot0_mode2_saddle;
4001 // /* excitation energy at saddle mode 2 without shell effect */
4002
4003 epsilon_1_saddle = eld - e_zero_point - epot_mode1_saddle;
4004 // /* excitation energy at saddle mode 1 with shell effect */
4005 epsilon_2_saddle = eld - e_zero_point - epot_mode2_saddle;
4006 // /* excitation energy at saddle mode 2 with shell effect */
4007 epsilon_symm_saddle = eld - e_zero_point - epot_symm_saddle;
4008
4009 // /* global parameters */
4010 eexc1_saddle = epsilon_1_saddle;
4011 eexc2_saddle = epsilon_2_saddle;
4012 eexc_max = max(eexc1_saddle,eexc2_saddle);
4013 eexc_max = max(eexc_max,eld);
4014
4015 // /* EEXC_MAX is energy above the lowest saddle */
4016
4017
4018 epsilon0_1_scission = eld + e_saddle_scission - epot0_mode1_saddle;
4019 // /* excitation energy without shell effect */
4020 epsilon0_2_scission = eld + e_saddle_scission - epot0_mode2_saddle;
4021 // /* excitation energy without shell effect */
4022
4023 epsilon_1_scission = eld + e_saddle_scission - epot_mode1_saddle;
4024 // /* excitation energy at scission */
4025 epsilon_2_scission = eld+ e_saddle_scission - epot_mode2_saddle;
4026 // /* excitation energy at scission */
4027 epsilon_symm_scission = eld + e_saddle_scission - epot_symm_saddle;
4028 // /* excitation energy of symmetric fragment at scission */
4029
4030 // /* Calculate widhts at the saddle: */
4031
4032 e_eff1_saddle = epsilon0_1_saddle - delta_u1 * (std::exp((-epsilon_1_saddle*gamma)));
4033
4034 if (e_eff1_saddle > 0.0) {
4035 wzasymm1_saddle = std::sqrt( (0.5 *
4036 (std::sqrt(1.0/a_levdens*e_eff1_saddle)) /
4037 (cz_asymm1_shell * std::exp((-epsilon_1_saddle*gamma)) + cz_symm) ) );
4038 }
4039 else {
4040 wzasymm1_saddle = 1.0;
4041 }
4042
4043 e_eff2_saddle = epsilon0_2_saddle - delta_u2 * (std::exp((-epsilon_2_saddle*gamma)));
4044 if (e_eff2_saddle > 0.0) {
4045 wzasymm2_saddle = std::sqrt( (0.5 *
4046 (std::sqrt(1.0/a_levdens*e_eff2_saddle)) /
4047 (cz_asymm2_shell * std::exp((-epsilon_2_saddle*gamma)) + cz_symm) ) );
4048 }
4049 else {
4050 wzasymm2_saddle = 1.0;
4051 }
4052
4053 if (eld > e_zero_point) {
4054 if ( (eld + epsilon_symm_saddle) < 0.0) {
4055 G4cout << "<e> eld + epsilon_symm_saddle < 0" << G4endl;
4056 }
4057 wzsymm_saddle = std::sqrt( (0.5 *
4058 (std::sqrt(1.0/a_levdens*(eld+epsilon_symm_saddle))) / cz_symm ) );
4059 } else {
4060 wzsymm_saddle = 1.0;
4061 }
4062
4063 if (itest == 1) {
4064 G4cout << "wz1(saddle) = " << wzasymm1_saddle << G4endl;
4065 G4cout << "wz2(saddle) = " << wzasymm2_saddle << G4endl;
4066 G4cout << "wzsymm(saddle) = " << wzsymm_saddle << G4endl;
4067 }
4068
4069 // /* Calculate widhts at the scission point: */
4070 // /* fits of ref. Beizin 1991 (Plots brought to GSI by Sergei Zhdanov) */
4071
4072 wzsymm_scission = wzsymm_saddle;
4073
4074 if (e_saddle_scission == 0.0) {
4075
4076 wzasymm1_scission = wzasymm1_saddle;
4077 wzasymm2_scission = wzasymm2_saddle;
4078
4079 }
4080 else {
4081
4082 if (nheavy1_eff > 75.0) {
4083 wzasymm1_scission = (std::sqrt(21.0)) * z/a;
4084 wzasymm2_scission = (std::sqrt (max( (70.0-28.0)/3.0*(z*z/a-35.0)+28.,0.0 )) ) * z/a;
4085 }
4086 else {
4087 wzasymm1_scission = wzasymm1_saddle;
4088 wzasymm2_scission = wzasymm2_saddle;
4089 }
4090
4091 }
4092
4093 wzasymm1_scission = max(wzasymm1_scission,wzasymm1_saddle);
4094 wzasymm2_scission = max(wzasymm2_scission,wzasymm2_saddle);
4095
4096 wzasymm1 = wzasymm1_scission * fwidth_asymm1;
4097 wzasymm2 = wzasymm2_scission * fwidth_asymm2;
4098 wzsymm = wzsymm_scission;
4099
4100 /* if (ITEST == 1) {
4101 G4cout << "WZ1(scission) = " << WZasymm1_scission << G4endl;
4102 G4cout << "WZ2(scission) = " << WZasymm2_scission << G4endl;
4103 G4cout << "WZsymm(scission) = " << WZsymm_scission << G4endl;
4104 }
4105 if (ITEST == 1) {
4106 G4cout << "WZ1(scission) final= " << WZasymm1 << G4endl;
4107 G4cout << "WZ2(scission) final= " << WZasymm2 << G4endl;
4108 G4cout << "WZsymm(scission) final= " << WZsymm << G4endl;
4109 } */
4110
4111 wasymm = wzsymm * a/z;
4112 waheavy1 = wzasymm1 * a/z;
4113 waheavy2 = wzasymm2 * a/z;
4114
4115 wasymm_saddle = wzsymm_saddle * a/z;
4116 waheavy1_saddle = wzasymm1_saddle * a/z;
4117 waheavy2_saddle = wzasymm2_saddle * a/z;
4118
4119 if (itest == 1) {
4120 G4cout << "wasymm = " << wzsymm << G4endl;
4121 G4cout << "waheavy1 = " << waheavy1 << G4endl;
4122 G4cout << "waheavy2 = " << waheavy2 << G4endl;
4123 }
4124 // Up to here: Ok! Checked CS 11/10/05
4125
4126 if ( (epsilon0_1_saddle - delta_u1*std::exp((-epsilon_1_saddle*gamma_heavy1))) < 0.0) {
4127 sasymm1 = -10.0;
4128 }
4129 else {
4130 sasymm1 = 2.0 * std::sqrt( a_levdens * (epsilon0_1_saddle -
4131 delta_u1*(std::exp((-epsilon_1_saddle*gamma_heavy1))) ) );
4132 }
4133
4134 if ( (epsilon0_2_saddle - delta_u2*std::exp((-epsilon_2_saddle*gamma_heavy2))) < 0.0) {
4135 sasymm2 = -10.0;
4136 }
4137 else {
4138 sasymm2 = 2.0 * std::sqrt( a_levdens * (epsilon0_2_saddle -
4139 delta_u2*(std::exp((-epsilon_2_saddle*gamma_heavy2))) ) );
4140 }
4141
4142 if (epsilon_symm_saddle > 0.0) {
4143 ssymm = 2.0 * std::sqrt( a_levdens*(epsilon_symm_saddle) );
4144 }
4145 else {
4146 ssymm = -10.0;
4147 }
4148
4149 if (ssymm > -10.0) {
4150 ysymm = 1.0;
4151
4152 if (epsilon0_1_saddle < 0.0) {
4153 // /* low energy */
4154 yasymm1 = std::exp((sasymm1-ssymm)) * wzasymm1_saddle / wzsymm_saddle * 2.0;
4155 // /* factor of 2 for symmetry classes */
4156 }
4157 else {
4158 // /* high energy */
4159 ssymm_mode1 = 2.0 * std::sqrt( a_levdens*(epsilon0_1_saddle) );
4160 yasymm1 = ( std::exp((sasymm1-ssymm)) - std::exp((ssymm_mode1 - ssymm)) )
4161 * wzasymm1_saddle / wzsymm_saddle * 2.0;
4162 }
4163
4164 if (epsilon0_2_saddle < 0.0) {
4165 // /* low energy */
4166 yasymm2 = std::exp((sasymm2-ssymm)) * wzasymm2_saddle / wzsymm_saddle * 2.0;
4167 // /* factor of 2 for symmetry classes */
4168 }
4169 else {
4170 // /* high energy */
4171 ssymm_mode2 = 2.0 * std::sqrt( a_levdens*(epsilon0_2_saddle) );
4172 yasymm2 = ( std::exp((sasymm2-ssymm)) - std::exp((ssymm_mode2 - ssymm)) )
4173 * wzasymm2_saddle / wzsymm_saddle * 2.0;
4174 }
4175 // /* difference in the exponent in order */
4176 // /* to avoid numerical overflow */
4177
4178 }
4179 else {
4180 if ( (sasymm1 > -10.0) && (sasymm2 > -10.0) ) {
4181 ysymm = 0.0;
4182 yasymm1 = std::exp(sasymm1) * wzasymm1_saddle * 2.0;
4183 yasymm2 = std::exp(sasymm2) * wzasymm2_saddle * 2.0;
4184 }
4185 }
4186
4187 // /* normalize */
4188 ysum = ysymm + yasymm1 + yasymm2;
4189 if (ysum > 0.0) {
4190 ysymm = ysymm / ysum;
4191 yasymm1 = yasymm1 / ysum;
4192 yasymm2 = yasymm2 / ysum;
4193 yasymm = yasymm1 + yasymm2;
4194 }
4195 else {
4196 ysymm = 0.0;
4197 yasymm1 = 0.0;
4198 yasymm2 = 0.0;
4199 // /* search minimum threshold and attribute all events to this mode */
4200 if ( (epsilon_symm_saddle < epsilon_1_saddle) && (epsilon_symm_saddle < epsilon_2_saddle) ) {
4201 ysymm = 1.0;
4202 }
4203 else {
4204 if (epsilon_1_saddle < epsilon_2_saddle) {
4205 yasymm1 = 1.0;
4206 }
4207 else {
4208 yasymm2 = 1.0;
4209 }
4210 }
4211 }
4212
4213 if (itest == 1) {
4214 G4cout << "ysymm normalized= " << ysymm << G4endl;
4215 G4cout << "yasymm1 normalized= " << yasymm1 << G4endl;
4216 G4cout << "yasymm2 normalized= " << yasymm2 << G4endl;
4217 }
4218 // Up to here: Ok! Ckecked CS 11/10/05
4219
4220 // /* even-odd effect */
4221 // /* simple parametrization KHS, Nov. 2000. From Rejmund et al. */
4222 if ((int)(z) % 2 == 0) {
4223 r_e_o_exp = -0.017 * (e_saddle_scission + eld) * (e_saddle_scission + eld);
4224 if ( r_e_o_exp < -307.0) {
4225 r_e_o_exp = -307.0;
4226 r_e_o = std::pow(10.0,r_e_o_exp);
4227 }
4228 else {
4229 r_e_o = std::pow(10.0,r_e_o_exp);
4230 }
4231 }
4232 else {
4233 r_e_o = 0.0;
4234 }
4235
4236 // $LOOP; /* event loop */
4237 // I_COUNT = I_COUNT + 1;
4238
4239 // /* random decision: symmetric or asymmetric */
4240 // /* IMODE = 1 means asymmetric fission, mode 1,
4241 // IMODE = 2 means asymmetric fission, mode 2,
4242 // IMODE = 3 means symmetric */
4243 // RMODE = dble(HAZ(k));
4244 // rmode = rnd.rndm();
4245 rmode = haz(k);
4246 // Cast for test CS 11/10/05
4247 // RMODE = 0.54;
4248 // rmode = 0.54;
4249 if (rmode < yasymm1) {
4250 imode = 1;
4251 }
4252 if ( (rmode > yasymm1) && (rmode < (yasymm1+yasymm2)) ) {
4253 imode = 2;
4254 }
4255 if ( (rmode > yasymm1) && (rmode > (yasymm1+yasymm2)) ) {
4256 imode = 3;
4257 }
4258
4259 // /* determine parameters of the Z distribution */
4260 // force imode (for testing, PK)
4261 // imode = 3;
4262 if (imode == 1) {
4263 z1mean = zheavy1;
4264 z1width = wzasymm1;
4265 }
4266 if (imode == 2) {
4267 z1mean = zheavy2;
4268 z1width = wzasymm2;
4269 }
4270 if (imode == 3) {
4271 z1mean = zsymm;
4272 z1width = wzsymm;
4273 }
4274
4275 if (itest == 1) {
4276 G4cout << "nbre aleatoire tire " << rmode << G4endl;
4277 G4cout << "fission mode " << imode << G4endl;
4278 G4cout << "z1mean= " << z1mean << G4endl;
4279 G4cout << "z1width= " << z1width << G4endl;
4280 }
4281
4282 // /* random decision: Z1 and Z2 at scission: */
4283 z1 = 1.0;
4284 z2 = 1.0;
4285 while ( (z1<5.0) || (z2<5.0) ) {
4286 // Z1 = dble(GAUSSHAZ(K,sngl(Z1mean),sngl(Z1width)));
4287 // z1 = rnd.gaus(z1mean,z1width);
4288 z1 = gausshaz(k, z1mean, z1width);
4289 z2 = z - z1;
4290 }
4291 if (itest == 1) {
4292 G4cout << "ff charge sample " << G4endl;
4293 G4cout << "z1 = " << z1 << G4endl;
4294 G4cout << "z2 = " << z2 << G4endl;
4295 }
4296
4297 // CALL EVEN_ODD(Z1,R_E_O,I_HELP);
4298 // /* Integer proton number with even-odd effect */
4299 // Z1 = REAL(I_HELP)
4300 // /* Z1 = INT(Z1+0.5E0); */
4301 z2 = z - z1;
4302
4303 // /* average N of both fragments: */
4304 if (imode == 1) {
4305 n1mean = (z1 + cpol1 * a/n) * n/z;
4306 }
4307 if (imode == 2) {
4308 n1mean = (z1 + cpol2 * a/n) * n/z;
4309 }
4310 /* CASE(99) ! only for testing;
4311 N1UCD = Z1 * N/Z;
4312 N2UCD = Z2 * N/Z;
4313 re1 = UMASS(Z1,N1UCD,0.6) +;
4314 & UMASS(Z2,N2UCD,0.6) +;
4315 & ECOUL(Z1,N1UCD,0.6,Z2,N2UCD,0.6,d);
4316 re2 = UMASS(Z1,N1UCD+1.,0.6) +;
4317 & UMASS(Z2,N2UCD-1.,0.6) +;
4318 & ECOUL(Z1,N1UCD+1.,0.6,Z2,N2UCD-1.,0.6,d);
4319 re3 = UMASS(Z1,N1UCD+2.,0.6) +;
4320 & UMASS(Z2,N2UCD-2.,0.6) +;
4321 & ECOUL(Z1,N1UCD+2.,0.6,Z2,N2UCD-2.,0.6,d);
4322 eps2 = (re1-2.0*re2+re3) / 2.0;
4323 eps1 = re2 - re1 - eps2;
4324 DN1_POL = - eps1 / (2.0 * eps2);
4325 N1mean = N1UCD + DN1_POL; */
4326 if (imode == 3) {
4327 n1ucd = z1 * n/z;
4328 n2ucd = z2 * n/z;
4329 re1 = umass(z1,n1ucd,0.6) + umass(z2,n2ucd,0.6) + ecoul(z1,n1ucd,0.6,z2,n2ucd,0.6,d);
4330 re2 = umass(z1,n1ucd+1.,0.6) + umass(z2,n2ucd-1.,0.6) + ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,d);
4331 re3 = umass(z1,n1ucd+2.,0.6) + umass(z2,n2ucd-2.,0.6) + ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,d);
4332 eps2 = (re1-2.0*re2+re3) / 2.0;
4333 eps1 = re2 - re1 - eps2;
4334 dn1_pol = - eps1 / (2.0 * eps2);
4335 n1mean = n1ucd + dn1_pol;
4336 }
4337 // all fission modes features have been checked CS 11/10/05
4338 n2mean = n - n1mean;
4339 z2mean = z - z1mean;
4340
4341 // /* Excitation energies */
4342 // /* formulated in energies in close consistency with the fission model */
4343
4344 // /* E_defo = UMASS(Z*0.5E0,N*0.5E0,0.6E0) -
4345 // UMASS(Z*0.5E0,N*0.5E0,0); */
4346 // /* calculates the deformation energy of the liquid drop for
4347 // deformation beta = 0.6 which is most probable at scission */
4348
4349 // /* N1R and N2R provisionaly taken without fluctuations in
4350 // polarisation: */
4351 n1r = n1mean;
4352 n2r = n2mean;
4353 a1r = n1r + z1;
4354 a2r = n2r + z2;
4355
4356 if (imode == 1) { /* N = 82 */;
4357 //! /* Eexc at scission */
4358 e_scission = max(epsilon_1_scission,1.0);
4359 if (n1mean > (n * 0.5) ) {
4360 //! /* 1. fragment is spherical */
4361 beta1 = 0.0;
4362 beta2 = 0.6;
4363 e1exc = epsilon_1_scission * a1r / a;
4364 e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
4365 e2exc = epsilon_1_scission * a2r / a + e_defo;
4366 }
4367 else {
4368 //! /* 2. fragment is spherical */
4369 beta1 = 0.6;
4370 beta2 = 0.0;
4371 e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
4372 e1exc = epsilon_1_scission * a1r / a + e_defo;
4373 e2exc = epsilon_1_scission * a2r / a;
4374 }
4375 }
4376
4377 if (imode == 2) {
4378 //! /* N appr. 86 */
4379 e_scission = max(epsilon_2_scission,1.0);
4380 if (n1mean > (n * 0.5) ) {
4381 //! /* 2. fragment is spherical */
4382 beta1 = (n1r - nheavy2) * 0.034 + 0.3;
4383 e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
4384 e1exc = epsilon_2_scission * a1r / a + e_defo;
4385 beta2 = 0.6 - beta1;
4386 e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
4387 e2exc = epsilon_2_scission * a2r / a + e_defo;
4388 }
4389 else {
4390 //! /* 1. fragment is spherical */
4391 beta2 = (n2r - nheavy2) * 0.034 + 0.3;
4392 e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
4393 e2exc = epsilon_2_scission * a2r / a + e_defo;
4394 beta1 = 0.6 - beta2;
4395 e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
4396 e1exc = epsilon_2_scission * a1r / a + e_defo;
4397 }
4398 }
4399
4400 if (imode == 3) {
4401 // ! /* Symmetric fission channel */
4402
4403 // /* the fit function for beta is the deformation for
4404 // optimum energy at the scission point, d = 2 */
4405 // /* beta : deformation of symmetric fragments */
4406 // /* beta1 : deformation of first fragment */
4407 // /* beta2 : deformation of second fragment */
4408 beta = 0.177963 + 0.0153241 * zsymm - 0.000162037 * zsymm*zsymm;
4409 beta1 = 0.177963 + 0.0153241 * z1 - 0.000162037 * z1*z1;
4410 // beta1 = 0.6
4411 e_defo1 = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
4412 beta2 = 0.177963 + 0.0153241 * z2 - 0.000162037 * z2*z2;
4413 // beta2 = 0.6
4414 e_defo2 = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
4415 e_asym = umass(z1 , n1r, beta1) + umass(z2, n2r ,beta2)
4416 + ecoul(z1,n1r,beta1,z2,n2r,beta2,2.0)
4417 - 2.0 * umass(zsymm,nsymm,beta)
4418 - ecoul(zsymm,nsymm,beta,zsymm,nsymm,beta,2.0);
4419 // E_asym = CZ_symm * (Z1 - Zsymm)**2
4420 e_scission = max((epsilon_symm_scission - e_asym),1.0);
4421 // /* $LIST(Z1,N1R,Z2,N2R,E_asym,E_scission); */
4422 e1exc = e_scission * a1r / a + e_defo1;
4423 e2exc = e_scission * a2r / a + e_defo2;
4424 }
4425 // Energies checked for all the modes CS 11/10/05
4426
4427 // /* random decision: N1R and N2R at scission, before evaporation: */
4428 // /* CN = UMASS(Zsymm , Nsymm + 1.E0,0) +
4429 // UMASS(Zsymm, Nsymm - 1.E0,0)
4430 // + 1.44E0 * (Zsymm)**2 /
4431 // (r_null**2 * ((Asymm+1)**1/3 + (Asymm-1)**1/3)**2 )
4432 // - 2.E0 * UMASS(Zsymm,Nsymm,0)
4433 // - 1.44E0 * (Zsymm)**2 / (r_null * 2.E0 * (Asymm)**1/3)**2; */
4434
4435
4436 // /* N1width = std::sqrt(0.5E0 * std::sqrt(1.E0/A_levdens*(Eld+E_saddle_scission)) / CN); */
4437 // /* 8. 9. 1998: KHS (see also consideration in the first comment block)
4438 // sigma_N(Z=const) = A/Z * sigma_Z(A=const)
4439 // sigma_Z(A=const) = 0.4 to 0.5 (from Lang paper Nucl Phys. A345 (1980) 34)
4440 // sigma_N(Z=const) = 0.45 * A/Z (= 1.16 for 238U)
4441 // therefore: SIGZMIN = 1.16 */
4442
4443 if ( (imode == 1) || (imode == 2) ) {
4444 cn=(umass(z1,n1mean+1.,beta1) + umass(z1,n1mean-1.,beta1)
4445 + umass(z2,n2mean+1.,beta2) + umass(z2,n2mean-1.,beta2)
4446 + ecoul(z1,n1mean+1.,beta1,z2,n2mean-1.,beta2,2.0)
4447 + ecoul(z1,n1mean-1.,beta1,z2,n2mean+1.,beta2,2.0)
4448 - 2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
4449 - 2.0 * umass(z1, n1mean, beta1)
4450 - 2.0 * umass(z2, n2mean, beta2) ) * 0.5;
4451 // /* Coulomb energy neglected for the moment! */
4452 // IF (E_scission.lt.0.) Then
4453 // write(6,*)'<E> E_scission < 0, MODE 1,2'
4454 // ENDIF
4455 // IF (CN.lt.0.) Then
4456 // write(6,*)'CN < 0, MODE 1,2'
4457 // ENDIF
4458 n1width=std::sqrt( (0.5 * (std::sqrt(1.0/a_levdens*(e_scission)))/cn) );
4459 n1width=max(n1width, sigzmin);
4460
4461 // /* random decision: N1R and N2R at scission, before evaporation: */
4462 n1r = 1.0;
4463 n2r = 1.0;
4464 while ( (n1r<5.0) || (n2r<5.0) ) {
4465 // n1r = dble(gausshaz(k,sngl(n1mean),sngl(n1width)));
4466 // n1r = rnd.gaus(n1mean,n1width);
4467 n1r = gausshaz(k, n1mean, n1width);
4468 n2r = n - n1r;
4469 }
4470 // N1R = GAUSSHAZ(K,N1mean,N1width)
4471 if (itest == 1) {
4472 G4cout << "after neutron sample " << n1r << G4endl;
4473 }
4474 n1r = (float)( (int)((n1r+0.5)) );
4475 n2r = n - n1r;
4476
4477 even_odd(z1,r_e_o,i_help);
4478 // /* proton number with even-odd effect */
4479 z1 = (float)(i_help);
4480 z2 = z - z1;
4481
4482 a1r = z1 + n1r;
4483 a2r = z2 + n2r;
4484 }
4485
4486 if (imode == 3) {
4487 //! /* When(3) */
4488 if (nzpol > 0.0) {
4489 // /* We treat a simultaneous split in Z and N to determine polarisation */
4490 cz = ( umass(z1-1., n1mean+1.,beta1)
4491 + umass(z2+1., n2mean-1.,beta1)
4492 + umass(z1+1., n1mean-1.,beta2)
4493 + umass(z2 - 1., n2mean + 1.,beta2)
4494 + ecoul(z1-1.,n1mean+1.,beta1,z2+1.,n2mean-1.,beta2,2.0)
4495 + ecoul(z1+1.,n1mean-1.,beta1,z2-1.,n2mean+1.,beta2,2.0)
4496 - 2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
4497 - 2.0 * umass(z1, n1mean,beta1)
4498 - 2.0 * umass(z2, n2mean,beta2) ) * 0.5;
4499 // IF (E_scission.lt.0.) Then
4500 // write(6,*) '<E> E_scission < 0, MODE 1,2'
4501 // ENDIF
4502 // IF (CZ.lt.0.) Then
4503 // write(6,*) 'CZ < 0, MODE 1,2'
4504 // ENDIF
4505 za1width=std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*(e_scission)) / cz) );
4506 za1width=std::sqrt( (max((za1width*za1width-(1.0/12.0)),0.1)) );
4507 // /* Check the value of 0.1 ! */
4508 // /* Shephard correction */
4509 a1r = z1 + n1mean;
4510 a1r = (float)((int)((a1r+0.5)));
4511 a2r = a - a1r;
4512 // /* A1R and A2R are integer numbers now */
4513 // /* $LIST(A1R,A2R,ZA1WIDTH); */
4514
4515 n1ucd = n/a * a1r;
4516 n2ucd = n/a * a2r;
4517 z1ucd = z/a * a1r;
4518 z2ucd = z/a * a2r;
4519
4520 re1 = umass(z1ucd-1.,n1ucd+1.,beta1) + umass(z2ucd+1.,n2ucd-1.,beta2)
4521 + ecoul(z1ucd-1.,n1ucd+1.,beta1,z2ucd+1.,n2ucd-1.,beta2,d);
4522 re2 = umass(z1ucd,n1ucd,beta1) + umass(z2ucd,n2ucd,beta2)
4523 + ecoul(z1ucd,n1ucd,beta1,z2ucd,n2ucd,beta2,d);
4524 re3 = umass(z1ucd+1.,n1ucd-1.,beta1) + umass(z2ucd-1.,n2ucd+1.,beta2) +
4525 + ecoul(z1ucd+1.,n1ucd-1.,beta1,z2ucd-1.,n2ucd+1.,beta2,d);
4526
4527 eps2 = (re1-2.0*re2+re3) / 2.0;
4528 eps1 = (re3 - re1)/2.0;
4529 dn1_pol = - eps1 / (2.0 * eps2);
4530 z1 = z1ucd + dn1_pol;
4531 if (itest == 1) {
4532 G4cout << "before proton sample " << z1 << G4endl;
4533 }
4534 // Z1 = dble(GAUSSHAZ(k,sngl(Z1),sngl(ZA1width)));
4535 // z1 = rnd.gaus(z1,za1width);
4536 z1 = gausshaz(k, z1, za1width);
4537 if (itest == 1) {
4538 G4cout << "after proton sample " << z1 << G4endl;
4539 }
4540 even_odd(z1,r_e_o,i_help);
4541 // /* proton number with even-odd effect */
4542 z1 = (float)(i_help);
4543 z2 = (float)((int)( (z - z1 + 0.5)) );
4544
4545 n1r = a1r - z1;
4546 n2r = n - n1r;
4547 }
4548 else {
4549 // /* First division of protons, then adjustment of neutrons */
4550 cn = ( umass(z1, n1mean+1.,beta1) + umass(z1, n1mean-1., beta1)
4551 + umass(z2, n2mean+1.,beta2) + umass(z2, n2mean-1., beta2)
4552 + ecoul(z1,n1mean+1.,beta1,z2,n2mean-1.,beta2,2.0)
4553 + ecoul(z1,n1mean-1.,beta1,z2,n2mean+1.,beta2,2.0)
4554 - 2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
4555 - 2.0 * umass(z1, n1mean, 0.6)
4556 - 2.0 * umass(z2, n2mean, 0.6) ) * 0.5;
4557 // /* Coulomb energy neglected for the moment! */
4558 // IF (E_scission.lt.0.) Then
4559 // write(6,*) '<E> E_scission < 0, MODE 1,2'
4560 // Endif
4561 // IF (CN.lt.0.) Then
4562 // write(6,*) 'CN < 0, MODE 1,2'
4563 // Endif
4564 n1width=std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*(e_scission)) / cn) );
4565 n1width=max(n1width, sigzmin);
4566
4567 // /* random decision: N1R and N2R at scission, before evaporation: */
4568 // N1R = dble(GAUSSHAZ(k,sngl(N1mean),sngl(N1width)));
4569 // n1r = rnd.gaus(n1mean,n1width);
4570 n1r = gausshaz(k, n1mean, n1width);
4571 n1r = (float)( (int)((n1r+0.5)) );
4572 n2r = n - n1r;
4573
4574 even_odd(z1,r_e_o,i_help);
4575 // /* Integer proton number with even-odd effect */
4576 z1 = (float)(i_help);
4577 z2 = z - z1;
4578
4579 a1r = z1 + n1r;
4580 a2r = z2 + n2r;
4581
4582 }
4583 }
4584
4585 if (itest == 1) {
4586 G4cout << "remid imode = " << imode << G4endl;
4587 G4cout << "n1width = " << n1width << G4endl;
4588 G4cout << "n1r = " << n1r << G4endl;
4589 G4cout << "a1r = " << a1r << G4endl;
4590 G4cout << "n2r = " << n2r << G4endl;
4591 G4cout << "a2r = " << a2r << G4endl;
4592 }
4593 // Up to here: checked CS 11/10/05
4594
4595 // /* Extracted from Lang et al. Nucl. Phys. A 345 (1980) 34 */
4596 e1exc_sigma = 5.5;
4597 e2exc_sigma = 5.5;
4598
4599 neufcentquatrevingtsept:
4600 // E1final = dble(Gausshaz(k,sngl(E1exc),sngl(E1exc_sigma)));
4601 // E2final = dble(Gausshaz(k,sngl(E2exc),sngl(E2exc_sigma)));
4602 // e1final = rnd.gaus(e1exc,e1exc_sigma);
4603 // e2final = rnd.gaus(e2exc,e2exc_sigma);
4604 e1final = gausshaz(k, e1exc, e1exc_sigma);
4605 e2final = gausshaz(k, e2exc, e2exc_sigma);
4606 if ( (e1final < 0.0) || (e2final < 0.0) ) goto neufcentquatrevingtsept;
4607 if (itest == 1) {
4608 G4cout << "sampled exc 1 " << e1final << G4endl;
4609 G4cout << "sampled exc 2 " << e2final << G4endl;
4610 }
4611
4612 // /* OUTPUT QUANTITIES OF THE EVENT GENERATOR: */
4613
4614 // /* Quantities before neutron evaporation */
4615
4616 // /* Neutron number of prefragments: N1R and N2R */
4617 // /* Atomic number of fragments: Z1 and Z2 */
4618 // /* Kinetic energy of fragments: EkinR1, EkinR2 *7
4619
4620 // /* Quantities after neutron evaporation: */
4621
4622 // /* Neutron number of fragments: N1 and N2 */
4623 // /* Mass number of fragments: A1 and A2 */
4624 // /* Atomic number of fragments: Z1 and Z2 */
4625 // /* Number of evaporated neutrons: N1R-N1 and N2R-N2 */
4626 // /* Kinetic energy of fragments: EkinR1*A1/A1R and
4627 // EkinR2*A2/A2R */
4628
4629 n1 = n1r;
4630 n2 = n2r;
4631 a1 = n1 + z1;
4632 a2 = n2 + z2;
4633 e1 = e1final;
4634 e2 = e2final;
4635
4636 // /* Pre-neutron-emission total kinetic energy: */
4637 tker = (z1 * z2 * 1.44) /
4638 ( r0 * std::pow(a1,0.33333) * (1.0 + 2.0/3.0 * beta1) +
4639 r0 * std::pow(a2,0.33333) * (1.0 + 2.0/3.0 * beta2) + 2.0 );
4640 // /* Pre-neutron-emission kinetic energy of 1. fragment: */
4641 ekinr1 = tker * a2 / a;
4642 // /* Pre-neutron-emission kinetic energy of 2. fragment: */
4643 ekinr2 = tker * a1 / a;
4644
4645 v1 = std::sqrt( (ekinr1/a1) ) * 1.3887;
4646 v2 = std::sqrt( (ekinr2/a2) ) * 1.3887;
4647
4648 if (itest == 1) {
4649 G4cout << "ekinr1 " << ekinr1 << G4endl;
4650 G4cout << "ekinr2 " << ekinr2 << G4endl;
4651 }
4652
4653 milledeux:
4654 //**************************
4655 //*** only symmetric fission
4656 //**************************
4657 // Symmetric fission: Ok! Checked CS 10/10/05
4658 if ( (icz == -1) || (a1 < 0.0) || (a2 < 0.0) ) {
4659 // IF (z.eq.92) THEN
4660 // write(6,*)'symmetric fission'
4661 // write(6,*)'Z,A,E,A1,A2,icz,Atot',Z,A,E,A1,A2,icz,Atot
4662 // END IF
4663
4664 if (itest == 1) {
4665 G4cout << "milledeux: liquid-drop option " << G4endl;
4666 }
4667
4668 n = a-z;
4669 // proton number in symmetric fission (centre) *
4670 zsymm = z / 2.0;
4671 nsymm = n / 2.0;
4672 asymm = nsymm + zsymm;
4673
4674 a_levdens = a / xlevdens;
4675
4676 masscurv = 2.0;
4677 cz_symm = 8.0 / std::pow(z,2) * masscurv;
4678
4679 wzsymm = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cz_symm) ) ;
4680
4681 if (itest == 1) {
4682 G4cout << " symmetric high energy fission " << G4endl;
4683 G4cout << "wzsymm " << wzsymm << G4endl;
4684 }
4685
4686 z1mean = zsymm;
4687 z1width = wzsymm;
4688
4689 // random decision: Z1 and Z2 at scission: */
4690 z1 = 1.0;
4691 z2 = 1.0;
4692 while ( (z1 < 5.0) || (z2 < 5.0) ) {
4693 // z1 = dble(gausshaz(kkk,sngl(z1mean),sngl(z1width)));
4694 // z1 = rnd.gaus(z1mean,z1width);
4695 z1 = gausshaz(kkk, z1mean, z1width);
4696 z2 = z - z1;
4697 }
4698
4699 if (itest == 1) {
4700 G4cout << " z1 " << z1 << G4endl;
4701 G4cout << " z2 " << z2 << G4endl;
4702 }
4703 if (itest == 1) {
4704 G4cout << " zsymm " << zsymm << G4endl;
4705 G4cout << " nsymm " << nsymm << G4endl;
4706 G4cout << " asymm " << asymm << G4endl;
4707 }
4708 // CN = UMASS(Zsymm , Nsymm + 1.E0) + UMASS(Zsymm, Nsymm - 1.E0)
4709 // # + 1.44E0 * (Zsymm)**2 /
4710 // # (r_null**2 * ((Asymm+1)**(1./3.) +
4711 // # (Asymm-1)**(1./3.))**2 )
4712 // # - 2.E0 * UMASS(Zsymm,Nsymm)
4713 // # - 1.44E0 * (Zsymm)**2 /
4714 // # (r_null * 2.E0 * (Asymm)**(1./3.))**2
4715
4716 n1ucd = z1 * n/z;
4717 n2ucd = z2 * n/z;
4718 re1 = umass(z1,n1ucd,0.6) + umass(z2,n2ucd,0.6) +
4719 ecoul(z1,n1ucd,0.6,z2,n2ucd,0.6,2.0);
4720 re2 = umass(z1,n1ucd+1.,0.6) + umass(z2,n2ucd-1.,0.6) +
4721 ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,2.0);
4722 re3 = umass(z1,n1ucd+2.,0.6) + umass(z2,n2ucd-2.,0.6) +
4723 ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,2.0);
4724 reps2 = (re1-2.0*re2+re3)/2.0;
4725 reps1 = re2 - re1 -reps2;
4726 rn1_pol = -reps1/(2.0*reps2);
4727 n1mean = n1ucd + rn1_pol;
4728 n2mean = n - n1mean;
4729
4730 if (itest == 1) {
4731 G4cout << " n1mean " << n1mean << G4endl;
4732 G4cout << " n2mean " << n2mean << G4endl;
4733 }
4734
4735 cn = (umass(z1,n1mean+1.,0.0) + umass(z1,n1mean-1.,0.0) +
4736 + umass(z2,n2mean+1.,0.0) + umass(z2,n2mean-1.,0.0)
4737 - 2.0 * umass(z1,n1mean,0.0) +
4738 - 2.0 * umass(z2,n2mean,0.0) ) * 0.5;
4739 // This is an approximation! Coulomb energy is neglected.
4740
4741 n1width = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cn) );
4742
4743 if (itest == 1) {
4744 G4cout << " cn " << cn << G4endl;
4745 G4cout << " n1width " << n1width << G4endl;
4746 }
4747
4748 // random decision: N1R and N2R at scission, before evaporation: */
4749 // N1R = dfloat(NINT(GAUSSHAZ(KKK,sngl(N1mean),sngl(N1width))));
4750 // n1r = (float)( (int)(rnd.gaus(n1mean,n1width)) );
4751 n1r = (float)( (int)(gausshaz(k, n1mean,n1width)) );
4752 n2r = n - n1r;
4753 // Mass of first and second fragment */
4754 a1 = z1 + n1r;
4755 a2 = z2 + n2r;
4756
4757 e1 = e*a1/(a1+a2);
4758 e2 = e - e*a1/(a1+a2);
4759 if (itest == 1) {
4760 G4cout << " n1r " << n1r << G4endl;
4761 G4cout << " n2r " << n2r << G4endl;
4762 }
4763
4764 }
4765
4766 if (itest == 1) {
4767 G4cout << " a1 " << a1 << G4endl;
4768 G4cout << " z1 " << z1 << G4endl;
4769 G4cout << " a2 " << a2 << G4endl;
4770 G4cout << " z2 " << z2 << G4endl;
4771 G4cout << " e1 " << e1 << G4endl;
4772 G4cout << " e2 " << e << G4endl;
4773 }
4774
4775 // /* Pre-neutron-emission total kinetic energy: */
4776 tker = (z1 * z2 * 1.44) /
4777 ( r0 * std::pow(a1,0.33333) * (1.0 + 2.0/3.0 * beta1) +
4778 r0 * std::pow(a2,0.33333) * (1.0 + 2.0/3.0 * beta2) + 2.0 );
4779 // /* Pre-neutron-emission kinetic energy of 1. fragment: */
4780 ekin1 = tker * a2 / a;
4781 // /* Pre-neutron-emission kinetic energy of 2. fragment: */
4782 ekin2 = tker * a1 / a;
4783
4784 v1 = std::sqrt( (ekin1/a1) ) * 1.3887;
4785 v2 = std::sqrt( (ekin2/a2) ) * 1.3887;
4786
4787 if (itest == 1) {
4788 G4cout << " kinetic energies " << G4endl;
4789 G4cout << " ekin1 " << ekin1 << G4endl;
4790 G4cout << " ekin2 " << ekin2 << G4endl;
4791 }
4792}
4793
4794// SUBROUTINE TRANSLAB(GAMREM,ETREM,CSREM,NOPART,NDEC)
4795void G4Abla::translab(G4double gamrem, G4double etrem, G4double csrem[4], G4int nopart, G4int ndec)
4796{
4797 // c Ce subroutine transforme dans un repere 1 les impulsions pcv des
4798 // c particules acv, zcv et de cosinus directeurs xcv, ycv, zcv calculees
4799 // c dans un repere 2.
4800 // c La transformation de lorentz est definie par GAMREM (gamma) et
4801 // c ETREM (eta). La direction du repere 2 dans 1 est donnees par les
4802 // c cosinus directeurs ALREM,BEREM,GAREM (axe oz du repere 2).
4803 // c L'axe oy(2) est fixe par le produit vectoriel oz(1)*oz(2).
4804 // c Le calcul est fait pour les particules de NDEC a iv du common volant.
4805 // C Resultats dans le NTUPLE (common VAR_NTP) decale de NOPART (cascade).
4806
4807 // REAL*8 GAMREM,ETREM,ER,PLABI(3),PLABF(3),R(3,3)
4808 // real*8 MASSE,PTRAV2,CSREM(3),UMA,MELEC,EL
4809 // real*4 acv,zpcv,pcv,xcv,ycv,zcv
4810 // common/volant/acv(200),zpcv(200),pcv(200),xcv(200),
4811 // s ycv(200),zcv(200),iv
4812
4813 // parameter (max=250)
4814 // real*4 EXINI,ENERJ,BIMPACT,PLAB,TETLAB,PHILAB,ESTFIS
4815 // integer AVV,ZVV,JREMN,KFIS,IZFIS,IAFIS
4816 // common/VAR_NTP/MASSINI,MZINI,EXINI,MULNCASC,MULNEVAP,
4817 // +MULNTOT,BIMPACT,JREMN,KFIS,ESTFIS,IZFIS,IAFIS,NTRACK,
4818 // +ITYPCASC(max),AVV(max),ZVV(max),ENERJ(max),PLAB(max),
4819 // +TETLAB(max),PHILAB(max)
4820
4821 // DATA UMA,MELEC/931.4942,0.511/
4822
4823 // C Matrice de rotation dans le labo:
4824 G4double sitet = std::sqrt(std::pow(csrem[1],2)+std::pow(csrem[2],2));
4825 G4double cstet, siphi, csphi;
4826 G4double R[4][4];
4827
4828 if(sitet > 1.0e-6) { //then
4829 cstet = csrem[3];
4830 siphi = csrem[2]/sitet;
4831 csphi = csrem[1]/sitet;
4832
4833 R[1][1] = cstet*csphi;
4834 R[1][2] = -siphi;
4835 R[1][3] = sitet*csphi;
4836 R[2][1] = cstet*siphi;
4837 R[2][2] = csphi;
4838 R[2][3] = sitet*siphi;
4839 R[3][1] = -sitet;
4840 R[3][2] = 0.0;
4841 R[3][3] = cstet;
4842 }
4843 else {
4844 R[1][1] = 1.0;
4845 R[1][2] = 0.0;
4846 R[1][3] = 0.0;
4847 R[2][1] = 0.0;
4848 R[2][2] = 1.0;
4849 R[2][3] = 0.0;
4850 R[3][1] = 0.0;
4851 R[3][2] = 0.0;
4852 R[3][3] = 1.0;
4853 } //endif
4854
4855 G4int intp = 0;
4856 G4double el = 0.0;
4857 G4double masse = 0.0;
4858 G4double er = 0.0;
4859 G4double plabi[4];
4860 G4double ptrav2 = 0.0;
4861 G4double plabf[4];
4862 G4double bidon = 0.0;
4863
4864 for(G4int i = ndec; i <= volant->iv; i++) { //do i=ndec,iv
4865 intp = i + nopart;
4866 varntp->ntrack = varntp->ntrack + 1;
4867 if(nint(volant->acv[i]) == 0 && nint(volant->zpcv[i]) == 0) {
4868 if(verboseLevel > 2) {
4869 G4cout <<"Error: Particles with A = 0 Z = 0 detected! " << G4endl;
4870 }
4871 continue;
4872 }
4873 if(varntp->ntrack >= VARNTPSIZE) {
4874 if(verboseLevel > 2) {
4875 G4cout <<"Error! Output data structure not big enough!" << G4endl;
4876 }
4877 }
4878 varntp->avv[intp] = nint(volant->acv[i]);
4879 varntp->zvv[intp] = nint(volant->zpcv[i]);
4880 varntp->itypcasc[intp] = 0;
4881 // transformation de lorentz remnan --> labo:
4882 if (varntp->avv[intp] == -1) { //then
4883 masse = 138.00; // cugnon
4884 // c if (avv(intp).eq.1) masse=938.2796 !cugnon
4885 // c if (avv(intp).eq.4) masse=3727.42 !ok
4886 }
4887 else {
4888 mglms(double(volant->acv[i]),double(volant->zpcv[i]),0, &el);
4889 // assert(isnan(el) == false);
4890 masse = volant->zpcv[i]*938.27 + (volant->acv[i] - volant->zpcv[i])*939.56 + el;
4891 } //end if
4892
4893 er = std::sqrt(std::pow(volant->pcv[i],2) + std::pow(masse,2));
4894 // assert(isnan(er) == false);
4895 plabi[1] = volant->pcv[i]*(volant->xcv[i]);
4896 plabi[2] = volant->pcv[i]*(volant->ycv[i]);
4897 plabi[3] = er*etrem + gamrem*(volant->pcv[i])*(volant->zcv[i]);
4898
4899 ptrav2 = std::pow(plabi[1],2) + std::pow(plabi[2],2) + std::pow(plabi[3],2);
4900 // assert(isnan(ptrav2) == false);
4901 varntp->plab[intp] = std::sqrt(ptrav2);
4902 varntp->enerj[intp] = std::sqrt(ptrav2 + std::pow(masse,2)) - masse;
4903
4904 // Rotation dans le labo:
4905 for(G4int j = 1; j <= 3; j++) { //do j=1,3
4906 plabf[j] = 0.0;
4907 for(G4int k = 1; k <= 3; k++) { //do k=1,3
4908 plabf[j] = plabf[j] + R[k][j]*plabi[k]; // :::Fixme::: (indices?)
4909 } // end do
4910 } // end do
4911 // C impulsions dans le nouveau systeme copiees dans /volant/
4912 volant->pcv[i] = varntp->plab[intp];
4913 ptrav2 = std::sqrt(std::pow(plabf[1],2) + std::pow(plabf[2],2) + std::pow(plabf[3],2));
4914 if(ptrav2 >= 1.0e-6) { //then
4915 volant->xcv[i] = plabf[1]/ptrav2;
4916 volant->ycv[i] = plabf[2]/ptrav2;
4917 volant->zcv[i] = plabf[3]/ptrav2;
4918 }
4919 else {
4920 volant->xcv[i] = 1.0;
4921 volant->ycv[i] = 0.0;
4922 volant->zcv[i] = 0.0;
4923 } //endif
4924 // impulsions dans le nouveau systeme copiees dans /VAR_NTP/
4925 if(varntp->plab[intp] >= 1.0e-6) { //then
4926 bidon = plabf[3]/(varntp->plab[intp]);
4927 // assert(isnan(bidon) == false);
4928 if(bidon > 1.0) {
4929 bidon = 1.0;
4930 }
4931 if(bidon < -1.0) {
4932 bidon = -1.0;
4933 }
4934 varntp->tetlab[intp] = std::acos(bidon);
4935 sitet = std::sin(varntp->tetlab[intp]);
4936 varntp->philab[intp] = std::atan2(plabf[2],plabf[1]);
4937 varntp->tetlab[intp] = varntp->tetlab[intp]*57.2957795;
4938 varntp->philab[intp] = varntp->philab[intp]*57.2957795;
4939 }
4940 else {
4941 varntp->tetlab[intp] = 90.0;
4942 varntp->philab[intp] = 0.0;
4943 } // endif
4944 } // end do
4945}
4946// C-------------------------------------------------------------------------
4947
4948// SUBROUTINE TRANSLABPF(MASSE1,T1,P1,CTET1,PHI1,GAMREM,ETREM,R,
4949// s PLAB1,GAM1,ETA1,CSDIR)
4950void G4Abla::translabpf(G4double masse1, G4double t1, G4double p1, G4double ctet1,
4951 G4double phi1, G4double gamrem, G4double etrem, G4double R[][4],
4952 G4double *plab1, G4double *gam1, G4double *eta1, G4double csdir[])
4953{
4954 // C Calcul de l'impulsion du PF (PLAB1, cos directeurs CSDIR(3)) dans le
4955 // C systeme remnant et des coefs de Lorentz GAM1,ETA1 de passage
4956 // c du systeme PF --> systeme remnant.
4957 // c
4958 // C Input: MASSE1, T1 (energie cinetique), CTET1,PHI1 (cosTHETA et PHI)
4959 // C (le PF dans le systeme du Noyau de Fission (NF)).
4960 // C GAMREM,ETREM les coefs de Lorentz systeme NF --> syst remnant,
4961 // C R(3,3) la matrice de rotation systeme NF--> systeme remnant.
4962 // C
4963 // C
4964 // REAL*8 MASSE1,T1,P1,CTET1,PHI1,GAMREM,ETREM,R(3,3),
4965 // s PLAB1,GAM1,ETA1,CSDIR(3),ER,SITET,PLABI(3),PLABF(3)
4966
4967 G4double er = t1 + masse1;
4968
4969 G4double sitet = std::sqrt(1.0 - std::pow(ctet1,2));
4970
4971 G4double plabi[4];
4972 G4double plabf[4];
4973 // C ----Transformation de Lorentz Noyau fissionnant --> Remnant:
4974 plabi[1] = p1*sitet*std::cos(phi1);
4975 plabi[2] = p1*sitet*std::sin(phi1);
4976 plabi[3] = er*etrem + gamrem*p1*ctet1;
4977
4978 // C ----Rotation du syst Noyaut Fissionant vers syst remnant:
4979 for(G4int j = 1; j <= 3; j++) { // do j=1,3
4980 plabf[j] = 0.0;
4981 for(G4int k = 1; k <= 3; k++) { //do k=1,3
4982 // plabf[j] = plabf[j] + R[j][k]*plabi[k];
4983 plabf[j] = plabf[j] + R[k][j]*plabi[k];
4984 } //end do
4985 } //end do
4986 // C ----Cosinus directeurs et coefs de la transf de Lorentz dans le
4987 // c nouveau systeme:
4988 (*plab1) = std::pow(plabf[1],2) + std::pow(plabf[2],2) + std::pow(plabf[3],2);
4989 (*gam1) = std::sqrt(std::pow(masse1,2) + (*plab1))/masse1;
4990 (*plab1) = std::sqrt((*plab1));
4991 (*eta1) = (*plab1)/masse1;
4992
4993 if((*plab1) <= 1.0e-6) { //then
4994 csdir[1] = 0.0;
4995 csdir[2] = 0.0;
4996 csdir[3] = 1.0;
4997 }
4998 else {
4999 for(G4int i = 1; i <= 3; i++) { //do i=1,3
5000 csdir[i] = plabf[i]/(*plab1);
5001 } // end do
5002 } //endif
5003}
5004
5005// SUBROUTINE LOR_AB(GAM,ETA,Ein,Pin,Eout,Pout)
5006void G4Abla::lorab(G4double gam, G4double eta, G4double ein, G4double pin[],
5007 G4double *eout, G4double pout[])
5008{
5009 // C Transformation de lorentz brute pour vérifs.
5010 // C P(3) = P_longitudinal (transformé)
5011 // C P(1) et P(2) = P_transvers (non transformés)
5012 // DIMENSION Pin(3),Pout(3)
5013 // REAL*8 GAM,ETA,Ein
5014
5015 pout[1] = pin[1];
5016 pout[2] = pin[2];
5017 (*eout) = gam*ein + eta*pin[3];
5018 pout[3] = eta*ein + gam*pin[3];
5019}
5020
5021// SUBROUTINE ROT_AB(R,Pin,Pout)
5022void G4Abla::rotab(G4double R[4][4], G4double pin[4], G4double pout[4])
5023{
5024 // C Rotation d'un vecteur
5025 // DIMENSION Pin(3),Pout(3)
5026 // REAL*8 R(3,3)
5027
5028 for(G4int i = 1; i <= 3; i++) { // do i=1,3
5029 pout[i] = 0.0;
5030 for(G4int j = 1; j <= 3; j++) { //do j=1,3
5031 // pout[i] = pout[i] + R[i][j]*pin[j];
5032 pout[i] = pout[i] + R[j][i]*pin[j];
5033 } // enddo
5034 } //enddo
5035}
5036
5037// Methods related to the internal ABLA random number generator. In
5038// the future the random number generation must be factored into its
5039// own class
5040
5041void G4Abla::standardRandom(G4double *rndm, G4long *seed)
5042{
5043 (*seed) = (*seed); // Avoid warning during compilation.
5044 // Use Geant4 G4UniformRand
5045 (*rndm) = G4UniformRand();
5046}
5047
5048G4double G4Abla::haz(G4int k)
5049{
5050 const G4int pSize = 110;
5051 static G4double p[pSize];
5052 static G4long ix,i;
5053 static G4double x,y,a,haz;
5054 // k =< -1 on initialise
5055 // k = -1 c'est reproductible
5056 // k < -1 || k > -1 ce n'est pas reproductible
5057
5058 // Zero is invalid random seed. Set proper value from our random seed collection:
5059 if(ix == 0) {
5060 ix = hazard->ial;
5061 }
5062
5063 if (k <= -1) { //then
5064 if(k == -1) { //then
5065 ix = 0;
5066 }
5067 else {
5068 x = 0.0;
5069 y = secnds(int(x));
5070 ix = int(y * 100 + 43543000);
5071 if(mod(ix,2) == 0) {
5072 ix = ix + 1;
5073 }
5074 }
5075
5076 // Here we are using random number generator copied from INCL code
5077 // instead of the CERNLIB one! This causes difficulties for
5078 // automatic testing since the random number generators, and thus
5079 // the behavior of the routines in C++ and FORTRAN versions is no
5080 // longer exactly the same!
5081 standardRandom(&x, &ix);
5082 for(G4int i = 0; i < pSize; i++) { //do i=1,110
5083 standardRandom(&(p[i]), &ix);
5084 }
5085 standardRandom(&a, &ix);
5086 k = 0;
5087 }
5088
5089 i = nint(100*a)+1;
5090 haz = p[i];
5091 standardRandom(&a, &ix);
5092 p[i] = a;
5093
5094 hazard->ial = ix;
5095
5096 return haz;
5097}
5098
5099
5100G4double G4Abla::gausshaz(int k, double xmoy, double sig)
5101{
5102 // Gaussian random numbers:
5103
5104 // 1005 C*** TIRAGE ALEATOIRE DANS UNE GAUSSIENNE DE LARGEUR SIG ET MOYENNE XMOY
5105 static G4int iset = 0;
5106 static G4double v1,v2,r,fac,gset,gausshaz;
5107
5108 if(iset == 0) { //then
5109 do {
5110 v1 = 2.0*haz(k) - 1.0;
5111 v2 = 2.0*haz(k) - 1.0;
5112 r = std::pow(v1,2) + std::pow(v2,2);
5113 } while(r >= 1);
5114
5115 fac = std::sqrt(-2.*std::log(r)/r);
5116 // assert(isnan(fac) == false);
5117 gset = v1*fac;
5118 gausshaz = v2*fac*sig+xmoy;
5119 iset = 1;
5120 }
5121 else {
5122 gausshaz=gset*sig+xmoy;
5123 iset=0;
5124 }
5125
5126 return gausshaz;
5127}
5128
5129
5130// Utilities
5131
5132G4double G4Abla::min(G4double a, G4double b)
5133{
5134 if(a < b) {
5135 return a;
5136 }
5137 else {
5138 return b;
5139 }
5140}
5141
5142G4int G4Abla::min(G4int a, G4int b)
5143{
5144 if(a < b) {
5145 return a;
5146 }
5147 else {
5148 return b;
5149 }
5150}
5151
5152G4double G4Abla::max(G4double a, G4double b)
5153{
5154 if(a > b) {
5155 return a;
5156 }
5157 else {
5158 return b;
5159 }
5160}
5161
5162G4int G4Abla::max(G4int a, G4int b)
5163{
5164 if(a > b) {
5165 return a;
5166 }
5167 else {
5168 return b;
5169 }
5170}
5171
5172G4int G4Abla::nint(G4double number)
5173{
5174 G4double intpart;
5175 G4double fractpart;
5176 fractpart = std::modf(number, &intpart);
5177 if(number == 0) {
5178 return 0;
5179 }
5180 if(number > 0) {
5181 if(fractpart < 0.5) {
5182 return int(std::floor(number));
5183 }
5184 else {
5185 return int(std::ceil(number));
5186 }
5187 }
5188 if(number < 0) {
5189 if(fractpart < -0.5) {
5190 return int(std::floor(number));
5191 }
5192 else {
5193 return int(std::ceil(number));
5194 }
5195 }
5196
5197 return int(std::floor(number));
5198}
5199
5200G4int G4Abla::secnds(G4int x)
5201{
5202 time_t mytime;
5203 tm *mylocaltime;
5204
5205 time(&mytime);
5206 mylocaltime = localtime(&mytime);
5207
5208 if(x == 0) {
5209 return(mylocaltime->tm_hour*60*60 + mylocaltime->tm_min*60 + mylocaltime->tm_sec);
5210 }
5211 else {
5212 return(mytime - x);
5213 }
5214}
5215
5216G4int G4Abla::mod(G4int a, G4int b)
5217{
5218 if(b != 0) {
5219 return (a - (a/b)*b);
5220 }
5221 else {
5222 return 0;
5223 }
5224}
5225
5226G4double G4Abla::dmod(G4double a, G4double b)
5227{
5228 if(b != 0) {
5229 return (a - (a/b)*b);
5230 }
5231 else {
5232 return 0.0;
5233 }
5234}
5235
5236G4double G4Abla::dint(G4double a)
5237{
5238 G4double value = 0.0;
5239
5240 if(a < 0.0) {
5241 value = double(std::ceil(a));
5242 }
5243 else {
5244 value = double(std::floor(a));
5245 }
5246
5247 return value;
5248}
5249
5250G4int G4Abla::idint(G4double a)
5251{
5252 G4int value = 0;
5253
5254 if(a < 0) {
5255 value = int(std::ceil(a));
5256 }
5257 else {
5258 value = int(std::floor(a));
5259 }
5260
5261 return value;
5262}
5263
5264G4int G4Abla::idnint(G4double value)
5265{
5266 G4double valueCeil = int(std::ceil(value));
5267 G4double valueFloor = int(std::floor(value));
5268
5269 if(std::fabs(value - valueCeil) < std::fabs(value - valueFloor)) {
5270 return int(valueCeil);
5271 }
5272 else {
5273 return int(valueFloor);
5274 }
5275}
5276
5277G4double G4Abla::dmin1(G4double a, G4double b, G4double c)
5278{
5279 if(a < b && a < c) {
5280 return a;
5281 }
5282 if(b < a && b < c) {
5283 return b;
5284 }
5285 if(c < a && c < b) {
5286 return c;
5287 }
5288 return a;
5289}
5290
5291G4double G4Abla::utilabs(G4double a)
5292{
5293 if(a > 0) {
5294 return a;
5295 }
5296 if(a < 0) {
5297 return (-1*a);
5298 }
5299 if(a == 0) {
5300 return a;
5301 }
5302
5303 return a;
5304}
Note: See TracBrowser for help on using the repository browser.