Geant4 Cross Reference |
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 // ABLAXX statistical de-excitation model 27 // Jose Luis Rodriguez, UDC (translation from ABLA07 and contact person) 28 // Pekka Kaitaniemi, HIP (initial translation of ablav3p) 29 // Aleksandra Kelic, GSI (ABLA07 code) 30 // Davide Mancusi, CEA (contact person INCL) 31 // Aatos Heikkinen, HIP (project coordination) 32 // 33 34 #include "globals.hh" 35 #include <cmath> 36 #include <memory> 37 #include <time.h> 38 39 #include "G4Abla.hh" 40 #include "G4AblaDataDefs.hh" 41 #include "G4AblaDataFile.hh" 42 #include "G4AblaRandom.hh" 43 44 G4Abla::G4Abla(G4VarNtp* aVarntp) 45 { 46 verboseLevel = 0; 47 ilast = 0; 48 varntp = static_cast<G4VarNtp*>(aVarntp); // Output data structure 49 50 verboseLevel = 0; 51 gammaemission = 0; // 0 presaddle, 1 postsaddle 52 T_freeze_out_in = T_freeze_out = 0.; 53 Ainit = 0; 54 Zinit = 0; 55 Sinit = 0; 56 IEV_TAB_SSC = 0; 57 58 ald = std::make_unique<G4Ald>(); 59 ec2sub = std::make_unique<G4Ec2sub>(); 60 ecld = std::make_unique<G4Ecld>(); 61 masses = std::make_unique<G4Mexp>(); 62 fb = std::make_unique<G4Fb>(); 63 fiss = std::make_unique<G4Fiss>(); 64 opt = std::make_unique<G4Opt>(); 65 } 66 67 void G4Abla::setVerboseLevel(G4int level) { verboseLevel = level; } 68 69 // Main interface to the evaporation without lambda evaporation 70 void G4Abla::DeexcitationAblaxx(G4int nucleusA, 71 G4int nucleusZ, 72 G4double excitationEnergy, 73 G4double angularMomentum, 74 G4double momX, 75 G4double momY, 76 G4double momZ, 77 G4int eventnumber) 78 { 79 DeexcitationAblaxx(nucleusA, nucleusZ, excitationEnergy, angularMomentum, momX, momY, momZ, eventnumber, 0); 80 } 81 82 // Main interface to the evaporation with lambda emission 83 void G4Abla::DeexcitationAblaxx(G4int nucleusA, 84 G4int nucleusZ, 85 G4double excitationEnergy, 86 G4double angularMomentum, 87 G4double momX, 88 G4double momY, 89 G4double momZ, 90 G4int eventnumber, 91 G4int nucleusS) 92 { 93 94 const G4double amu = 931.4940; // MeV/C^2 95 const G4double C = 29.9792458; // cm/ns 96 97 SetParametersG4(nucleusZ, nucleusA); 98 99 mult10: 100 G4int IS = 0; 101 102 varntp->clear(); // Clean up an initialize ABLA output. 103 104 if (nucleusS > 0) 105 nucleusS = 0; // S=1 from INCL ???? 106 107 G4int NbLam0 = std::abs(nucleusS); 108 109 Ainit = -1 * nucleusA; 110 Zinit = -1 * nucleusZ; 111 Sinit = -1 * nucleusS; 112 113 G4double aff = 0.0; 114 G4double zff = 0.0; 115 G4int ZFP1 = 0, AFP1 = 0, AFPIMF = 0, ZFPIMF = 0, ZFP2 = 0, AFP2 = 0, SFP1 = 0, SFP2 = 0, SFPIMF = 0; 116 G4double vx_eva = 0.0, vy_eva = 0.0, vz_eva = 0.0; 117 G4double VX_PREF = 0., VY_PREF = 0., VZ_PREF = 00, VP1X, VP1Y, VP1Z, VXOUT, VYOUT, VZOUT, V_CM[3], VFP1_CM[3], 118 VFP2_CM[3], VIMF_CM[3], VX2OUT, VY2OUT, VZ2OUT; 119 G4double zf = 0.0, af = 0.0, mtota = 0.0, tkeimf = 0.0, jprf0 = 0.; 120 G4int ff = 0, afpnew = 0, zfpnew = 0, aprfp = 0, zprfp = 0, IOUNSTABLE = 0, ILOOP = 0, IEV_TAB = 0, 121 IEV_TAB_TEMP = 0; 122 G4int fimf = 0, INMIN = 0, INMAX = 0; 123 G4int ftype = 0; //,ftype1=0; 124 G4int inum = eventnumber; 125 G4int inttype = 0; 126 opt->optimfallowed = 1; 127 128 if (fiss->zt > 56) 129 { 130 fiss->ifis = 1; 131 } 132 else 133 { 134 fiss->ifis = 0; 135 } 136 137 if (NbLam0 > 0) 138 { 139 opt->nblan0 = NbLam0; 140 } 141 142 G4double aprf = (G4double)nucleusA; 143 G4double zprf = (G4double)nucleusZ; 144 G4double ee = excitationEnergy; 145 G4double jprf = angularMomentum; // actually root-mean-squared 146 147 G4double pxrem = momX; 148 G4double pyrem = momY; 149 G4double pzrem = momZ; 150 G4double zimf, aimf; 151 152 gammaemission = 0; 153 G4double T_init = 0., T_diff = 0., a_tilda = 0., a_tilda_BU = 0., EE_diff = 0., EINCL = 0., A_FINAL = 0., 154 Z_FINAL = 0., E_FINAL = 0.; 155 156 G4double A_diff = 0., ASLOPE1, ASLOPE2, A_ACC, ABU_SLOPE, ABU_SUM = 0., AMEM = 0., ZMEM = 0., EMEM = 0., JMEM = 0., 157 PX_BU_SUM = 0.0, PY_BU_SUM = 0.0, PZ_BU_SUM = 0.0, ETOT_SUM = 0., P_BU_SUM = 0., ZBU_SUM = 0., 158 Z_Breakup_sum = 0., A_Breakup, Z_Breakup, N_Breakup, G_SYMM, CZ, Sigma_Z, Z_Breakup_Mean, ZTEMP = 0., 159 ATEMP = 0.; 160 161 G4double ETOT_PRF = 0.0, PXPRFP = 0., PYPRFP = 0., PZPRFP = 0., PPRFP = 0., VX1_BU = 0., VY1_BU = 0., VZ1_BU = 0., 162 VBU2 = 0., GAMMA_REL = 1.0, Eexc_BU_SUM = 0., VX_BU_SUM = 0., VY_BU_SUM = 0., VZ_BU_SUM = 0., 163 E_tot_BU = 0., EKIN_BU = 0., ZIMFBU = 0., AIMFBU = 0., ZFFBU = 0., AFFBU = 0., AFBU = 0., ZFBU = 0., 164 EEBU = 0., TKEIMFBU = 0., vx_evabu = 0., vy_evabu = 0., vz_evabu = 0., Bvalue_BU = 0., P_BU = 0., 165 ETOT_BU = 1., PX_BU = 0., PY_BU = 0., PZ_BU = 0., VX2_BU = 0., VY2_BU = 0., VZ2_BU = 0.; 166 167 G4int ABU_DIFF, ZBU_DIFF, NBU_DIFF; 168 G4int INEWLOOP = 0, ILOOPBU = 0; 169 170 G4double BU_TAB_TEMP[indexpart][6], BU_TAB_TEMP1[indexpart][6]; 171 G4double EV_TAB_TEMP[indexpart][6], EV_TEMP[indexpart][6]; 172 G4int IMEM_BU[indexpart], IMEM = 0; 173 174 if (nucleusA < 1) 175 { 176 std::cout << "Error - Remnant with a mass number A below 1." << std::endl; 177 // INCL_ERROR("Remnant with a mass number A below 1."); 178 return; 179 } 180 181 for (G4int j = 0; j < 3; j++) 182 { 183 V_CM[j] = 0.; 184 VFP1_CM[j] = 0.; 185 VFP2_CM[j] = 0.; 186 VIMF_CM[j] = 0.; 187 } 188 189 for (G4int I1 = 0; I1 < indexpart; I1++) 190 { 191 for (G4int I2 = 0; I2 < 12; I2++) 192 BU_TAB[I1][I2] = 0.0; 193 for (G4int I2 = 0; I2 < 6; I2++) 194 { 195 BU_TAB_TEMP[I1][I2] = 0.0; 196 BU_TAB_TEMP1[I1][I2] = 0.0; 197 EV_TAB_TEMP[I1][I2] = 0.0; 198 EV_TAB[I1][I2] = 0.0; 199 EV_TAB_SSC[I1][I2] = 0.0; 200 EV_TEMP[I1][I2] = 0.0; 201 } 202 } 203 204 G4int idebug = 0; 205 if (idebug == 1) 206 { 207 zprf = 81.; 208 aprf = 201.; 209 // ee = 86.5877686; 210 ee = 100.0; 211 jprf = 10.; 212 zf = 0.; 213 af = 0.; 214 mtota = 0.; 215 ff = 1; 216 inttype = 0; 217 // inum = 2; 218 } 219 // 220 G4double AAINCL = aprf; 221 G4double ZAINCL = zprf; 222 EINCL = ee; 223 // 224 // Velocity after the first stage of reaction (INCL) 225 // For coupling with INCL, comment the lines below, and use output 226 // of INCL as pxincl, pyincl,pzincl 227 // 228 G4double pincl = std::sqrt(pxrem * pxrem + pyrem * pyrem + pzrem * pzrem); 229 // PPRFP is in MeV/c 230 G4double ETOT_incl = std::sqrt(pincl * pincl + (AAINCL * amu) * (AAINCL * amu)); 231 G4double VX_incl = C * pxrem / ETOT_incl; 232 G4double VY_incl = C * pyrem / ETOT_incl; 233 G4double VZ_incl = C * pzrem / ETOT_incl; 234 // 235 // Multiplicity in the break-up event 236 G4int IMULTBU = 0; 237 G4int IMULTIFR = 0; 238 G4int I_Breakup = 0; 239 G4int NbLamprf = 0; 240 IEV_TAB = 0; 241 242 /* 243 C Set maximum temperature for sequential decay (evaporation) 244 C Remove additional energy by simultaneous break up 245 C (vaporisation or multi-fragmentation) 246 247 C Idea: If the temperature of the projectile spectator exceeds 248 c the limiting temperature T_freeze_out, the additional 249 C energy which is present in the spectator is used for 250 C a stage of simultaneous break up. It is either the 251 C simultaneous emission of a gaseous phase or the simultaneous 252 C emission of several intermediate-mass fragments. Only one 253 C piece of the projectile spectator (assumed to be the largest 254 C one) is kept track. 255 256 C MVR, KHS, October 2001 257 C KHS, AK 2007 - Masses from the power low; slope parameter dependent 258 on C energy per nucleon; symmtery-energy coeff. 259 dependent on C energy per nucleon. 260 261 c Clear BU_TAB (array of multifragmentation products) 262 */ 263 if (T_freeze_out_in >= 0.0) 264 { 265 T_freeze_out = T_freeze_out_in; 266 } 267 else 268 { 269 T_freeze_out = max(9.33 * std::exp(-0.00282 * AAINCL), 5.5); 270 // ! See: J. Natowitz et al, PRC65 (2002) 034618 271 // T_freeze_out=DMAX1(9.0D0*DEXP(-0.001D0*AAABRA), 272 // & 5.5D0) 273 } 274 // 275 a_tilda = ald->av * aprf + ald->as * std::pow(aprf, 2.0 / 3.0) + ald->ak * std::pow(aprf, 1.0 / 3.0); 276 277 T_init = std::sqrt(EINCL / a_tilda); 278 279 T_diff = T_init - T_freeze_out; 280 281 if (T_diff > 0.1 && zprf > 2. && (aprf - zprf) > 0.) 282 { 283 // T_Diff is set to be larger than 0.1 MeV in order to avoid strange cases 284 // for which T_Diff is of the order of 1.e-3 and less. 285 varntp->kfis = 10; 286 287 for (G4int i = 0; i < 5; i++) 288 { 289 EE_diff = EINCL - a_tilda * T_freeze_out * T_freeze_out; 290 // Energy removed 10*5/T_init per nucleon removed in 291 // simultaneous breakup adjusted to frag. xsections 238U 292 // (1AGeV) + Pb data, KHS Dec. 2005 293 // This should maybe be re-checked, in a meanwhile several things in 294 // break-up description have changed (AK). 295 296 A_diff = dint(EE_diff / (8.0 * 5.0 / T_freeze_out)); 297 298 if (A_diff > AAINCL) 299 A_diff = AAINCL; 300 301 A_FINAL = AAINCL - A_diff; 302 303 a_tilda = 304 ald->av * A_FINAL + ald->as * std::pow(A_FINAL, 2.0 / 3.0) + ald->ak * std::pow(A_FINAL, 1.0 / 3.0); 305 E_FINAL = a_tilda * T_freeze_out * T_freeze_out; 306 307 if (A_FINAL < 4.0) 308 { // To avoid numerical problems 309 EE_diff = EINCL - E_FINAL; 310 A_FINAL = 1.0; 311 Z_FINAL = 1.0; 312 E_FINAL = 0.0; 313 goto mul4325; 314 } 315 } 316 mul4325: 317 // The idea is similar to Z determination of multifragment - Z of "heavy" 318 // partner is not fixed by the A/Z of the prefragment, but randomly picked 319 // from Gaussian Z_FINAL_MEAN = dint(zprf * A_FINAL / (aprf)); 320 321 Z_FINAL = dint(zprf * A_FINAL / (aprf)); 322 323 if (E_FINAL < 0.0) 324 E_FINAL = 0.0; 325 326 aprf = A_FINAL; 327 zprf = Z_FINAL; 328 ee = E_FINAL; 329 330 A_diff = AAINCL - aprf; 331 332 // Creation of multifragmentation products by breakup 333 if (A_diff <= 1.0) 334 { 335 aprf = AAINCL; 336 zprf = ZAINCL; 337 ee = EINCL; 338 IMULTIFR = 0; 339 goto mult7777; 340 } 341 else if (A_diff > 1.0) 342 { 343 344 A_ACC = 0.0; 345 // Energy-dependence of the slope parameter, acc. to A. Botvina, fits also 346 // to exp. data (see e.g. Sfienti et al, NPA 2007) 347 ASLOPE1 = -2.400; // e*/a=7 -2.4 348 ASLOPE2 = -1.200; // e*/a=3 -1.2 349 350 a_tilda = ald->av * AAINCL + ald->as * std::pow(AAINCL, 2.0 / 3.0) + ald->ak * std::pow(AAINCL, 1.0 / 3.0); 351 352 E_FINAL = a_tilda * T_freeze_out * T_freeze_out; 353 354 ABU_SLOPE = (ASLOPE1 - ASLOPE2) / 4.0 * (E_FINAL / AAINCL) + ASLOPE1 - (ASLOPE1 - ASLOPE2) * 7.0 / 4.0; 355 356 // Botvina et al, PRC 74 (2006) 044609, fig. 5 for B0=18 MeV 357 // ABU_SLOPE = 5.57489D0-2.08149D0*(E_FINAL/AAABRA)+ 358 // & 0.3552D0*(E_FINAL/AAABRA)**2-0.024927D0*(E_FINAL/AAABRA)**3+ 359 // & 7.268D-4*(E_FINAL/AAABRA)**4 360 // They fit with A**(-tau) and here is done A**(tau) 361 // ABU_SLOPE = ABU_SLOPE*(-1.D0) 362 363 // ABU_SLOPE = -2.60D0 364 // print*,ABU_SLOPE,(E_FINAL/AAABRA) 365 366 if (ABU_SLOPE > -1.01) 367 ABU_SLOPE = -1.01; 368 369 I_Breakup = 0; 370 Z_Breakup_sum = Z_FINAL; 371 ABU_SUM = 0.0; 372 ZBU_SUM = 0.0; 373 374 for (G4int i = 0; i < 100; i++) 375 { 376 IS = 0; 377 mult4326: 378 A_Breakup = dint(G4double(IPOWERLIMHAZ(ABU_SLOPE, 1, idnint(A_diff)))); 379 // Power law with exponent ABU_SLOPE 380 IS = IS + 1; 381 if (IS > 100) 382 { 383 std::cout << "WARNING: IPOWERLIMHAZ CALLED MORE THAN 100 TIMES WHEN " 384 "CALCULATING A_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED: " 385 << A_Breakup << std::endl; 386 goto mult10; 387 } 388 389 if (A_Breakup > AAINCL) 390 goto mult4326; 391 392 if (A_Breakup <= 0.0) 393 { 394 std::cout << "A_BREAKUP <= 0 " << std::endl; 395 goto mult10; 396 } 397 398 A_ACC = A_ACC + A_Breakup; 399 400 if (A_ACC <= A_diff) 401 { 402 403 Z_Breakup_Mean = dint(A_Breakup * ZAINCL / AAINCL); 404 405 Z_Breakup_sum = Z_Breakup_sum + Z_Breakup_Mean; 406 // 407 // See G.A. Souliotis et al, PRC 75 (2007) 011601R (Fig. 2) 408 G_SYMM = 34.2281 - 5.14037 * E_FINAL / AAINCL; 409 if (E_FINAL / AAINCL < 2.0) 410 G_SYMM = 25.0; 411 if (E_FINAL / AAINCL > 4.0) 412 G_SYMM = 15.0; 413 414 // G_SYMM = 23.6; 415 416 G_SYMM = 25.0; // 25 417 CZ = 2.0 * G_SYMM * 4.0 / A_Breakup; 418 // 2*CZ=d^2(Esym)/dZ^2, Esym=Gamma*(A-2Z)**2/A 419 // gamma = 23.6D0 is the symmetry-energy coefficient 420 G4int IIS = 0; 421 Sigma_Z = std::sqrt(T_freeze_out / CZ); 422 423 IS = 0; 424 mult4333: 425 Z_Breakup = dint(G4double(gausshaz(1, Z_Breakup_Mean, Sigma_Z))); 426 IS = IS + 1; 427 // 428 if (IS > 100) 429 { 430 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 431 "CALCULATING Z_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE " 432 "DICED: " 433 << A_Breakup << " " << Z_Breakup << std::endl; 434 goto mult10; 435 } 436 437 if (Z_Breakup < 0.0) 438 goto mult4333; 439 if ((A_Breakup - Z_Breakup) < 0.0) 440 goto mult4333; 441 if ((A_Breakup - Z_Breakup) == 0.0 && Z_Breakup != 1.0) 442 goto mult4333; 443 444 if (Z_Breakup >= ZAINCL) 445 { 446 IIS = IIS + 1; 447 if (IIS > 10) 448 { 449 std::cout << "Z_BREAKUP RESAMPLED MORE THAN 10 TIMES; EVENT WILL " 450 "BE RESAMPLED AGAIN " 451 << std::endl; 452 goto mult10; 453 } 454 goto mult4333; 455 } 456 457 // *** Find the limits that fragment is bound : 458 isostab_lim(idnint(Z_Breakup), &INMIN, &INMAX); 459 // INMIN = MAX(1,INMIN-2) 460 if (Z_Breakup > 2.0) 461 { 462 if (idnint(A_Breakup - Z_Breakup) < INMIN || idnint(A_Breakup - Z_Breakup) > (INMAX + 5)) 463 { 464 // PRINT*,'N_Breakup >< NMAX', 465 // & IDNINT(Z_Breakup),IDNINT(A_Breakup-Z_Breakup),INMIN,INMAX 466 goto mult4343; 467 } 468 } 469 470 mult4343: 471 472 // We consider all products, also nucleons created in the break-up 473 // I_Breakup = I_Breakup + 1;// moved below 474 475 N_Breakup = A_Breakup - Z_Breakup; 476 BU_TAB[I_Breakup][0] = dint(Z_Breakup); // Mass of break-up product 477 BU_TAB[I_Breakup][1] = dint(A_Breakup); // Z of break-up product 478 ABU_SUM = ABU_SUM + BU_TAB[i][1]; 479 ZBU_SUM = ZBU_SUM + BU_TAB[i][0]; 480 // 481 // Break-up products are given zero angular momentum (simplification) 482 BU_TAB[I_Breakup][3] = 0.0; 483 I_Breakup = I_Breakup + 1; 484 IMULTBU = IMULTBU + 1; 485 } 486 else 487 { 488 // There are A_DIFF - A_ACC nucleons lost by breakup, but they do 489 // not end up in multifragmentation products. This is a deficiency 490 // of the Monte-Carlo method applied above to determine the sizes 491 // of the fragments according to the power law. 492 // print*,'Deficiency',IDNINT(A_DIFF-A_ACC) 493 494 goto mult4327; 495 } // if(A_ACC<=A_diff) 496 } // for 497 // mult4327: 498 // IMULTIFR = 1; 499 } // if(A_diff>1.0) 500 mult4327: 501 IMULTIFR = 1; 502 503 // "Missing" A and Z picked from the power law: 504 ABU_DIFF = idnint(ABU_SUM + aprf - AAINCL); 505 ZBU_DIFF = idnint(ZBU_SUM + zprf - ZAINCL); 506 NBU_DIFF = idnint((ABU_SUM - ZBU_SUM) + (aprf - zprf) - (AAINCL - ZAINCL)); 507 // 508 if (IMULTBU > 200) 509 std::cout << "WARNING - MORE THAN 200 BU " << IMULTBU << std::endl; 510 511 if (IMULTBU < 1) 512 std::cout << "WARNING - LESS THAN 1 BU " << IMULTBU << std::endl; 513 //,AABRA,ZABRA,IDNINT(APRF),IDNINT(ZPRF),ABU_DIFF,ZBU_DIFF 514 515 G4int IPROBA = 0; 516 for (G4int i = 0; i < IMULTBU; i++) 517 IMEM_BU[i] = 0; 518 519 while (NBU_DIFF != 0 && ZBU_DIFF != 0) 520 { 521 // (APRF,ZPRF) is also inlcuded in this game, as from time to time the 522 // program is entering into endless loop, as it can not find proper 523 // nucleus for adapting A and Z. 524 IS = 0; 525 mult5555: 526 G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); 527 IPROBA = IPROBA + 1; 528 IS = IS + 1; 529 if (IS > 100) 530 { 531 std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " 532 "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." 533 << std::endl; 534 goto mult10; 535 } 536 G4int IEL = G4int(RHAZ); 537 if (IMEM_BU[IEL] == 1) 538 goto mult5555; 539 if (!(IEL < 200)) 540 std::cout << "5555:" << IEL << RHAZ << IMULTBU << std::endl; 541 if (IEL < 0) 542 std::cout << "5555:" << IEL << RHAZ << IMULTBU << std::endl; 543 if (IEL <= IMULTBU) 544 { 545 N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0] - DSIGN(1.0, G4double(NBU_DIFF))); 546 } 547 else if (IEL > IMULTBU) 548 { 549 N_Breakup = dint(aprf - zprf - DSIGN(1.0, G4double(NBU_DIFF))); 550 } 551 if (N_Breakup < 0.0) 552 { 553 IMEM_BU[IEL] = 1; 554 goto mult5555; 555 } 556 if (IEL <= IMULTBU) 557 { 558 ZTEMP = dint(BU_TAB[IEL][0] - DSIGN(1.0, G4double(ZBU_DIFF))); 559 } 560 else if (IEL > IMULTBU) 561 { 562 ZTEMP = dint(zprf - DSIGN(1.0, G4double(ZBU_DIFF))); 563 } 564 if (ZTEMP < 0.0) 565 { 566 IMEM_BU[IEL] = 1; 567 goto mult5555; 568 } 569 if (ZTEMP < 1.0 && N_Breakup < 1.0) 570 { 571 IMEM_BU[IEL] = 1; 572 goto mult5555; 573 } 574 // Nuclei with A=Z and Z>1 are allowed in this stage, as otherwise, 575 // for more central collisions there is not enough mass which can be 576 // shufeled in order to conserve A and Z. These are mostly nuclei with 577 // Z=2 and in less extent 3, 4 or 5. 578 // IF(ZTEMP.GT.1.D0 .AND. N_Breakup.EQ.0.D0) THEN 579 // GOTO 5555 580 // ENDIF 581 if (IEL <= IMULTBU) 582 { 583 BU_TAB[IEL][0] = dint(ZTEMP); 584 BU_TAB[IEL][1] = dint(ZTEMP + N_Breakup); 585 } 586 else if (IEL > IMULTBU) 587 { 588 zprf = dint(ZTEMP); 589 aprf = dint(ZTEMP + N_Breakup); 590 } 591 NBU_DIFF = NBU_DIFF - ISIGN(1, NBU_DIFF); 592 ZBU_DIFF = ZBU_DIFF - ISIGN(1, ZBU_DIFF); 593 } // while 594 595 IPROBA = 0; 596 for (G4int i = 0; i < IMULTBU; i++) 597 IMEM_BU[i] = 0; 598 599 if (NBU_DIFF != 0 && ZBU_DIFF == 0) 600 { 601 while (NBU_DIFF > 0 || NBU_DIFF < 0) 602 { 603 IS = 0; 604 mult5556: 605 G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); 606 IS = IS + 1; 607 if (IS > 100) 608 { 609 std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " 610 "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." 611 << std::endl; 612 goto mult10; 613 } 614 G4int IEL = G4int(RHAZ); 615 if (IMEM_BU[IEL] == 1) 616 goto mult5556; 617 // IPROBA = IPROBA + 1; 618 if (IPROBA > IMULTBU + 1 && NBU_DIFF > 0) 619 { 620 std::cout << "###',IPROBA,IMULTBU,NBU_DIFF,ZBU_DIFF,T_freeze_out" << std::endl; 621 IPROBA = IPROBA + 1; 622 if (IEL <= IMULTBU) 623 { 624 BU_TAB[IEL][1] = dint(BU_TAB[IEL][1] - G4double(NBU_DIFF)); 625 } 626 else 627 { 628 if (IEL > IMULTBU) 629 aprf = dint(aprf - G4double(NBU_DIFF)); 630 } 631 goto mult5432; 632 } 633 if (!(IEL < 200)) 634 std::cout << "5556:" << IEL << RHAZ << IMULTBU << std::endl; 635 if (IEL < 0) 636 std::cout << "5556:" << IEL << RHAZ << IMULTBU << std::endl; 637 if (IEL <= IMULTBU) 638 { 639 N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0] - DSIGN(1.0, G4double(NBU_DIFF))); 640 } 641 else if (IEL > IMULTBU) 642 { 643 N_Breakup = dint(aprf - zprf - DSIGN(1.0, G4double(NBU_DIFF))); 644 } 645 if (N_Breakup < 0.0) 646 { 647 IMEM_BU[IEL] = 1; 648 goto mult5556; 649 } 650 if (IEL <= IMULTBU) 651 { 652 ATEMP = dint(BU_TAB[IEL][0] + N_Breakup); 653 } 654 else if (IEL > IMULTBU) 655 { 656 ATEMP = dint(zprf + N_Breakup); 657 } 658 if ((ATEMP - N_Breakup) < 1.0 && N_Breakup < 1.0) 659 { 660 IMEM_BU[IEL] = 1; 661 goto mult5556; 662 } 663 // IF((ATEMP - N_Breakup).GT.1.D0 .AND. 664 // & N_Breakup.EQ.0.D0) THEN 665 // IMEM_BU(IEL) = 1 666 // GOTO 5556 667 // ENDIF 668 if (IEL <= IMULTBU) 669 BU_TAB[IEL][1] = dint(BU_TAB[IEL][0] + N_Breakup); 670 else if (IEL > IMULTBU) 671 aprf = dint(zprf + N_Breakup); 672 // 673 NBU_DIFF = NBU_DIFF - ISIGN(1, NBU_DIFF); 674 } // while(NBU_DIFF > 0 || NBU_DIFF < 0) 675 676 IPROBA = 0; 677 for (G4int i = 0; i < IMULTBU; i++) 678 IMEM_BU[i] = 0; 679 } 680 else 681 { // if(NBU_DIFF != 0 && ZBU_DIFF == 0) 682 if (ZBU_DIFF != 0 && NBU_DIFF == 0) 683 { 684 while (ZBU_DIFF > 0 || ZBU_DIFF < 0) 685 { 686 IS = 0; 687 mult5557: 688 G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); 689 IS = IS + 1; 690 if (IS > 100) 691 { 692 std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " 693 "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." 694 << std::endl; 695 goto mult10; 696 } 697 G4int IEL = G4int(RHAZ); 698 if (IMEM_BU[IEL] == 1) 699 goto mult5557; 700 // IPROBA = IPROBA + 1; 701 if (IPROBA > IMULTBU + 1 && ZBU_DIFF > 0) 702 { 703 std::cout << "###',IPROBA,IMULTBU,NBU_DIFF,ZBU_DIFF,T_freeze_out" << std::endl; 704 IPROBA = IPROBA + 1; 705 if (IEL <= IMULTBU) 706 { 707 N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0]); 708 BU_TAB[IEL][0] = dint(BU_TAB[IEL][0] - G4double(ZBU_DIFF)); 709 BU_TAB[IEL][1] = dint(BU_TAB[IEL][0] + N_Breakup); 710 } 711 else 712 { 713 if (IEL > IMULTBU) 714 { 715 N_Breakup = aprf - zprf; 716 zprf = dint(zprf - G4double(ZBU_DIFF)); 717 aprf = dint(zprf + N_Breakup); 718 } 719 } 720 goto mult5432; 721 } 722 if (!(IEL < 200)) 723 std::cout << "5557:" << IEL << RHAZ << IMULTBU << std::endl; 724 if (IEL < 0) 725 std::cout << "5557:" << IEL << RHAZ << IMULTBU << std::endl; 726 if (IEL <= IMULTBU) 727 { 728 N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0]); 729 ZTEMP = dint(BU_TAB[IEL][0] - DSIGN(1.0, G4double(ZBU_DIFF))); 730 } 731 else if (IEL > IMULTBU) 732 { 733 N_Breakup = dint(aprf - zprf); 734 ZTEMP = dint(zprf - DSIGN(1.0, G4double(ZBU_DIFF))); 735 } 736 ATEMP = dint(ZTEMP + N_Breakup); 737 if (ZTEMP < 0.0) 738 { 739 IMEM_BU[IEL] = 1; 740 goto mult5557; 741 } 742 if ((ATEMP - ZTEMP) < 0.0) 743 { 744 IMEM_BU[IEL] = 1; 745 goto mult5557; 746 } 747 if ((ATEMP - ZTEMP) < 1.0 && ZTEMP < 1.0) 748 { 749 IMEM_BU[IEL] = 1; 750 goto mult5557; 751 } 752 if (IEL <= IMULTBU) 753 { 754 BU_TAB[IEL][0] = dint(ZTEMP); 755 BU_TAB[IEL][1] = dint(ZTEMP + N_Breakup); 756 } 757 else 758 { 759 if (IEL > IMULTBU) 760 { 761 zprf = dint(ZTEMP); 762 aprf = dint(ZTEMP + N_Breakup); 763 } 764 } 765 ZBU_DIFF = ZBU_DIFF - ISIGN(1, ZBU_DIFF); 766 } // while 767 } // if(ZBU_DIFF != 0 && NBU_DIFF == 0) 768 } // if(NBU_DIFF != 0 && ZBU_DIFF == 0) 769 770 mult5432: 771 // Looking for the heaviest fragment among all multifragmentation events, 772 // and "giving" excitation energy to fragments 773 ZMEM = 0.0; 774 775 for (G4int i = 0; i < IMULTBU; i++) 776 { 777 // For particles with Z>2 we calculate excitation energy from freeze-out 778 // temperature. 779 // For particels with Z<3 we assume that they form a gas, and that 780 // temperature results in kinetic energy (which is sampled from Maxwell 781 // distribution with T=Tfreeze-out) and not excitation energy. 782 if (BU_TAB[i][0] > 2.0) 783 { 784 a_tilda_BU = ald->av * BU_TAB[i][1] + ald->as * std::pow(BU_TAB[i][1], 2.0 / 3.0) + 785 ald->ak * std::pow(BU_TAB[i][1], 1.0 / 3.0); 786 BU_TAB[i][2] = a_tilda_BU * T_freeze_out * T_freeze_out; // E* of break-up product 787 } 788 else 789 { 790 BU_TAB[i][2] = 0.0; 791 } 792 // 793 if (BU_TAB[i][0] > ZMEM) 794 { 795 IMEM = i; 796 ZMEM = BU_TAB[i][0]; 797 AMEM = BU_TAB[i][1]; 798 EMEM = BU_TAB[i][2]; 799 JMEM = BU_TAB[i][3]; 800 } 801 } // for IMULTBU 802 803 if (zprf < ZMEM) 804 { 805 BU_TAB[IMEM][0] = zprf; 806 BU_TAB[IMEM][1] = aprf; 807 BU_TAB[IMEM][2] = ee; 808 BU_TAB[IMEM][3] = jprf; 809 zprf = ZMEM; 810 aprf = AMEM; 811 aprfp = idnint(aprf); 812 zprfp = idnint(zprf); 813 ee = EMEM; 814 jprf = JMEM; 815 } 816 817 // Just for checking: 818 ABU_SUM = aprf; 819 ZBU_SUM = zprf; 820 for (G4int i = 0; i < IMULTBU; i++) 821 { 822 ABU_SUM = ABU_SUM + BU_TAB[i][1]; 823 ZBU_SUM = ZBU_SUM + BU_TAB[i][0]; 824 } 825 ABU_DIFF = idnint(ABU_SUM - AAINCL); 826 ZBU_DIFF = idnint(ZBU_SUM - ZAINCL); 827 // 828 if (ABU_DIFF != 0 || ZBU_DIFF != 0) 829 std::cout << "Problem of mass in BU " << ABU_DIFF << " " << ZBU_DIFF << std::endl; 830 PX_BU_SUM = 0.0; 831 PY_BU_SUM = 0.0; 832 PZ_BU_SUM = 0.0; 833 // Momenta of break-up products are calculated. They are all given in the 834 // rest frame of the primary prefragment (i.e. after incl): Goldhaber model 835 // **************************************** "Heavy" residue 836 AMOMENT(AAINCL, aprf, 1, &PXPRFP, &PYPRFP, &PZPRFP); 837 PPRFP = std::sqrt(PXPRFP * PXPRFP + PYPRFP * PYPRFP + PZPRFP * PZPRFP); 838 // ******************************************************** 839 // PPRFP is in MeV/c 840 ETOT_PRF = std::sqrt(PPRFP * PPRFP + (aprf * amu) * (aprf * amu)); 841 VX_PREF = C * PXPRFP / ETOT_PRF; 842 VY_PREF = C * PYPRFP / ETOT_PRF; 843 VZ_PREF = C * PZPRFP / ETOT_PRF; 844 845 // Contribution from Coulomb repulsion ******************** 846 tke_bu(zprf, aprf, ZAINCL, AAINCL, &VX1_BU, &VY1_BU, &VZ1_BU); 847 848 // Lorentz kinematics 849 // VX_PREF = VX_PREF + VX1_BU 850 // VY_PREF = VY_PREF + VY1_BU 851 // VZ_PREF = VZ_PREF + VZ1_BU 852 // Lorentz transformation 853 lorentz_boost(VX1_BU, VY1_BU, VZ1_BU, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); 854 855 VX_PREF = VXOUT; 856 VY_PREF = VYOUT; 857 VZ_PREF = VZOUT; 858 859 // Total momentum: Goldhaber + Coulomb 860 VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; 861 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 862 ETOT_PRF = aprf * amu / GAMMA_REL; 863 PXPRFP = ETOT_PRF * VX_PREF / C; 864 PYPRFP = ETOT_PRF * VY_PREF / C; 865 PZPRFP = ETOT_PRF * VZ_PREF / C; 866 867 // ******************************************************** 868 // Momentum: Total width of abrasion and breakup assumed to be given 869 // by Fermi momenta of nucleons 870 // ***************************************** 871 872 PX_BU_SUM = PXPRFP; 873 PY_BU_SUM = PYPRFP; 874 PZ_BU_SUM = PZPRFP; 875 876 Eexc_BU_SUM = ee; 877 Bvalue_BU = eflmac(idnint(aprf), idnint(zprf), 1, 0); 878 879 for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) 880 { 881 // For bu products: 882 Bvalue_BU = Bvalue_BU + eflmac(idnint(BU_TAB[I_Breakup][1]), idnint(BU_TAB[I_Breakup][0]), 1, 0); 883 Eexc_BU_SUM = Eexc_BU_SUM + BU_TAB[I_Breakup][2]; 884 885 AMOMENT(AAINCL, BU_TAB[I_Breakup][1], 1, &PX_BU, &PY_BU, &PZ_BU); 886 P_BU = std::sqrt(PX_BU * PX_BU + PY_BU * PY_BU + PZ_BU * PZ_BU); 887 // ******************************************************* 888 // PPRFP is in MeV/c 889 ETOT_BU = std::sqrt(P_BU * P_BU + (BU_TAB[I_Breakup][1] * amu) * (BU_TAB[I_Breakup][1] * amu)); 890 BU_TAB[I_Breakup][4] = C * PX_BU / ETOT_BU; // Velocity in x 891 BU_TAB[I_Breakup][5] = C * PY_BU / ETOT_BU; // Velocity in y 892 BU_TAB[I_Breakup][6] = C * PZ_BU / ETOT_BU; // Velocity in z 893 // Contribution from Coulomb repulsion: 894 tke_bu(BU_TAB[I_Breakup][0], BU_TAB[I_Breakup][1], ZAINCL, AAINCL, &VX2_BU, &VY2_BU, &VZ2_BU); 895 // Lorentz kinematics 896 // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) + VX2_BU ! velocity 897 // change by Coulomb repulsion BU_TAB(I_Breakup,6) = 898 // BU_TAB(I_Breakup,6) + VY2_BU BU_TAB(I_Breakup,7) = 899 // BU_TAB(I_Breakup,7) + VZ2_BU 900 // Lorentz transformation 901 lorentz_boost(VX2_BU, 902 VY2_BU, 903 VZ2_BU, 904 BU_TAB[I_Breakup][4], 905 BU_TAB[I_Breakup][5], 906 BU_TAB[I_Breakup][6], 907 &VXOUT, 908 &VYOUT, 909 &VZOUT); 910 911 BU_TAB[I_Breakup][4] = VXOUT; 912 BU_TAB[I_Breakup][5] = VYOUT; 913 BU_TAB[I_Breakup][6] = VZOUT; 914 915 // Total momentum: Goldhaber + Coulomb 916 VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + 917 BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; 918 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 919 ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; 920 PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; 921 PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; 922 PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; 923 924 PX_BU_SUM = PX_BU_SUM + PX_BU; 925 PY_BU_SUM = PY_BU_SUM + PY_BU; 926 PZ_BU_SUM = PZ_BU_SUM + PZ_BU; 927 928 } // for I_Breakup 929 930 // In the frame of source (i.e. prefragment after abrasion or INCL) 931 P_BU_SUM = std::sqrt(PX_BU_SUM * PX_BU_SUM + PY_BU_SUM * PY_BU_SUM + PZ_BU_SUM * PZ_BU_SUM); 932 // ******************************************************** 933 // PPRFP is in MeV/c 934 ETOT_SUM = std::sqrt(P_BU_SUM * P_BU_SUM + (AAINCL * amu) * (AAINCL * amu)); 935 936 VX_BU_SUM = C * PX_BU_SUM / ETOT_SUM; 937 VY_BU_SUM = C * PY_BU_SUM / ETOT_SUM; 938 VZ_BU_SUM = C * PZ_BU_SUM / ETOT_SUM; 939 940 // Lorentz kinematics - DM 17/5/2010 941 // VX_PREF = VX_PREF - VX_BU_SUM 942 // VY_PREF = VY_PREF - VY_BU_SUM 943 // VZ_PREF = VZ_PREF - VZ_BU_SUM 944 // Lorentz transformation 945 lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); 946 947 VX_PREF = VXOUT; 948 VY_PREF = VYOUT; 949 VZ_PREF = VZOUT; 950 951 VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; 952 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 953 ETOT_PRF = aprf * amu / GAMMA_REL; 954 PXPRFP = ETOT_PRF * VX_PREF / C; 955 PYPRFP = ETOT_PRF * VY_PREF / C; 956 PZPRFP = ETOT_PRF * VZ_PREF / C; 957 958 PX_BU_SUM = 0.0; 959 PY_BU_SUM = 0.0; 960 PZ_BU_SUM = 0.0; 961 962 PX_BU_SUM = PXPRFP; 963 PY_BU_SUM = PYPRFP; 964 PZ_BU_SUM = PZPRFP; 965 E_tot_BU = ETOT_PRF; 966 967 EKIN_BU = aprf * amu / GAMMA_REL - aprf * amu; 968 969 for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) 970 { 971 // Lorentz kinematics - DM 17/5/2010 972 // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) - VX_BU_SUM 973 // BU_TAB(I_Breakup,6) = BU_TAB(I_Breakup,6) - VY_BU_SUM 974 // BU_TAB(I_Breakup,7) = BU_TAB(I_Breakup,7) - VZ_BU_SUM 975 // Lorentz transformation 976 lorentz_boost(-VX_BU_SUM, 977 -VY_BU_SUM, 978 -VZ_BU_SUM, 979 BU_TAB[I_Breakup][4], 980 BU_TAB[I_Breakup][5], 981 BU_TAB[I_Breakup][6], 982 &VXOUT, 983 &VYOUT, 984 &VZOUT); 985 986 BU_TAB[I_Breakup][4] = VXOUT; 987 BU_TAB[I_Breakup][5] = VYOUT; 988 BU_TAB[I_Breakup][6] = VZOUT; 989 990 VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + 991 BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; 992 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 993 994 ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; 995 996 EKIN_BU = EKIN_BU + BU_TAB[I_Breakup][1] * amu / GAMMA_REL - BU_TAB[I_Breakup][1] * amu; 997 998 PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; 999 PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; 1000 PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; 1001 E_tot_BU = E_tot_BU + ETOT_BU; 1002 1003 PX_BU_SUM = PX_BU_SUM + PX_BU; 1004 PY_BU_SUM = PY_BU_SUM + PY_BU; 1005 PZ_BU_SUM = PZ_BU_SUM + PZ_BU; 1006 } // for I_Breakup 1007 1008 if (std::abs(PX_BU_SUM) > 10. || std::abs(PY_BU_SUM) > 10. || std::abs(PZ_BU_SUM) > 10.) 1009 { 1010 1011 // In the frame of source (i.e. prefragment after INCL) 1012 P_BU_SUM = std::sqrt(PX_BU_SUM * PX_BU_SUM + PY_BU_SUM * PY_BU_SUM + PZ_BU_SUM * PZ_BU_SUM); 1013 // ******************************************************** 1014 // PPRFP is in MeV/c 1015 ETOT_SUM = std::sqrt(P_BU_SUM * P_BU_SUM + (AAINCL * amu) * (AAINCL * amu)); 1016 1017 VX_BU_SUM = C * PX_BU_SUM / ETOT_SUM; 1018 VY_BU_SUM = C * PY_BU_SUM / ETOT_SUM; 1019 VZ_BU_SUM = C * PZ_BU_SUM / ETOT_SUM; 1020 1021 // Lorentz kinematics 1022 // VX_PREF = VX_PREF - VX_BU_SUM 1023 // VY_PREF = VY_PREF - VY_BU_SUM 1024 // VZ_PREF = VZ_PREF - VZ_BU_SUM 1025 // Lorentz transformation 1026 lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); 1027 1028 VX_PREF = VXOUT; 1029 VY_PREF = VYOUT; 1030 VZ_PREF = VZOUT; 1031 1032 VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; 1033 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 1034 ETOT_PRF = aprf * amu / GAMMA_REL; 1035 PXPRFP = ETOT_PRF * VX_PREF / C; 1036 PYPRFP = ETOT_PRF * VY_PREF / C; 1037 PZPRFP = ETOT_PRF * VZ_PREF / C; 1038 1039 PX_BU_SUM = 0.0; 1040 PY_BU_SUM = 0.0; 1041 PZ_BU_SUM = 0.0; 1042 1043 PX_BU_SUM = PXPRFP; 1044 PY_BU_SUM = PYPRFP; 1045 PZ_BU_SUM = PZPRFP; 1046 E_tot_BU = ETOT_PRF; 1047 1048 EKIN_BU = aprf * amu / GAMMA_REL - aprf * amu; 1049 1050 for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) 1051 { 1052 // Lorentz kinematics - DM 17/5/2010 1053 // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) - VX_BU_SUM 1054 // BU_TAB(I_Breakup,6) = BU_TAB(I_Breakup,6) - VY_BU_SUM 1055 // BU_TAB(I_Breakup,7) = BU_TAB(I_Breakup,7) - VZ_BU_SUM 1056 // Lorentz transformation 1057 lorentz_boost(-VX_BU_SUM, 1058 -VY_BU_SUM, 1059 -VZ_BU_SUM, 1060 BU_TAB[I_Breakup][4], 1061 BU_TAB[I_Breakup][5], 1062 BU_TAB[I_Breakup][6], 1063 &VXOUT, 1064 &VYOUT, 1065 &VZOUT); 1066 1067 BU_TAB[I_Breakup][4] = VXOUT; 1068 BU_TAB[I_Breakup][5] = VYOUT; 1069 BU_TAB[I_Breakup][6] = VZOUT; 1070 1071 VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + 1072 BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; 1073 GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); 1074 1075 ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; 1076 1077 EKIN_BU = EKIN_BU + BU_TAB[I_Breakup][1] * amu / GAMMA_REL - BU_TAB[I_Breakup][1] * amu; 1078 1079 PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; 1080 PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; 1081 PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; 1082 E_tot_BU = E_tot_BU + ETOT_BU; 1083 1084 PX_BU_SUM = PX_BU_SUM + PX_BU; 1085 PY_BU_SUM = PY_BU_SUM + PY_BU; 1086 PZ_BU_SUM = PZ_BU_SUM + PZ_BU; 1087 } // for I_Breakup 1088 } // if DABS(PX_BU_SUM).GT.10.d0 1089 // 1090 // Find the limits that fragment is bound - only done for neutrons and 1091 // LCPs and for nuclei with A=Z, for other nuclei it will be done after 1092 // decay: 1093 1094 INEWLOOP = 0; 1095 for (G4int i = 0; i < IMULTBU; i++) 1096 { 1097 if (BU_TAB[i][0] < 3.0 || BU_TAB[i][0] == BU_TAB[i][1]) 1098 { 1099 unstable_nuclei(idnint(BU_TAB[i][1]), 1100 idnint(BU_TAB[i][0]), 1101 &afpnew, 1102 &zfpnew, 1103 IOUNSTABLE, 1104 BU_TAB[i][4], 1105 BU_TAB[i][5], 1106 BU_TAB[i][6], 1107 &VP1X, 1108 &VP1Y, 1109 &VP1Z, 1110 BU_TAB_TEMP, 1111 &ILOOP); 1112 1113 if (IOUNSTABLE > 0) 1114 { 1115 // Properties of "heavy fragment": 1116 BU_TAB[i][1] = G4double(afpnew); 1117 BU_TAB[i][0] = G4double(zfpnew); 1118 BU_TAB[i][4] = VP1X; 1119 BU_TAB[i][5] = VP1Y; 1120 BU_TAB[i][6] = VP1Z; 1121 1122 // Properties of "light" fragments: 1123 for (int IJ = 0; IJ < ILOOP; IJ++) 1124 { 1125 BU_TAB[IMULTBU + INEWLOOP + IJ][0] = BU_TAB_TEMP[IJ][0]; 1126 BU_TAB[IMULTBU + INEWLOOP + IJ][1] = BU_TAB_TEMP[IJ][1]; 1127 BU_TAB[IMULTBU + INEWLOOP + IJ][4] = BU_TAB_TEMP[IJ][2]; 1128 BU_TAB[IMULTBU + INEWLOOP + IJ][5] = BU_TAB_TEMP[IJ][3]; 1129 BU_TAB[IMULTBU + INEWLOOP + IJ][6] = BU_TAB_TEMP[IJ][4]; 1130 BU_TAB[IMULTBU + INEWLOOP + IJ][2] = 0.0; 1131 BU_TAB[IMULTBU + INEWLOOP + IJ][3] = 0.0; 1132 } // for ILOOP 1133 1134 INEWLOOP = INEWLOOP + ILOOP; 1135 1136 } // if IOUNSTABLE.GT.0 1137 } // if BU_TAB[I_Breakup][0]<3.0 1138 } // for IMULTBU 1139 1140 // Increased array of BU_TAB 1141 IMULTBU = IMULTBU + INEWLOOP; 1142 // Evaporation from multifragmentation products 1143 opt->optimfallowed = 1; // IMF is allowed 1144 fiss->ifis = 0; // fission is not allowed 1145 gammaemission = 0; 1146 ILOOPBU = 0; 1147 1148 // Arrays for lambda emission from breakup fragments 1149 G4double* problamb; 1150 problamb = new G4double[IMULTBU]; 1151 G4double sumN = aprf - zprf; 1152 for (G4int i = 0; i < IMULTBU; i++) 1153 sumN = sumN + BU_TAB[i][1] - BU_TAB[i][0]; 1154 1155 for (G4int i = 0; i < IMULTBU; i++) 1156 { 1157 problamb[i] = (BU_TAB[i][1] - BU_TAB[i][0]) / sumN; 1158 } 1159 G4int* Nblamb; 1160 Nblamb = new G4int[IMULTBU]; 1161 for (G4int i = 0; i < IMULTBU; i++) 1162 Nblamb[i] = 0; 1163 for (G4int j = 0; j < NbLam0;) 1164 { 1165 G4double probtotal = (aprf - zprf) / sumN; 1166 G4double ran = G4AblaRandom::flat(); 1167 // Lambdas in the heavy breakup fragment 1168 if (ran <= probtotal) 1169 { 1170 NbLamprf++; 1171 goto directlamb0; 1172 } 1173 for (G4int i = 0; i < IMULTBU; i++) 1174 { 1175 // Lambdas in the light breakup residues 1176 if (probtotal < ran && ran <= probtotal + problamb[i]) 1177 { 1178 Nblamb[i] = Nblamb[i] + 1; 1179 goto directlamb0; 1180 } 1181 probtotal = probtotal + problamb[i]; 1182 } 1183 directlamb0: 1184 j++; 1185 } 1186 // 1187 for (G4int i = 0; i < IMULTBU; i++) 1188 { 1189 EEBU = BU_TAB[i][2]; 1190 BU_TAB[i][10] = BU_TAB[i][6]; 1191 G4double jprfbu = BU_TAB[i][9]; 1192 if (BU_TAB[i][0] > 2.0) 1193 { 1194 G4int nbl = Nblamb[i]; 1195 evapora(BU_TAB[i][0], 1196 BU_TAB[i][1], 1197 &EEBU, 1198 0.0, 1199 &ZFBU, 1200 &AFBU, 1201 &mtota, 1202 &vz_evabu, 1203 &vx_evabu, 1204 &vy_evabu, 1205 &ff, 1206 &fimf, 1207 &ZIMFBU, 1208 &AIMFBU, 1209 &TKEIMFBU, 1210 &jprfbu, 1211 &inttype, 1212 &inum, 1213 EV_TEMP, 1214 &IEV_TAB_TEMP, 1215 &nbl); 1216 1217 Nblamb[i] = nbl; 1218 BU_TAB[i][9] = jprfbu; 1219 1220 // Velocities of evaporated particles (in the frame of the primary 1221 // prefragment) 1222 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 1223 { 1224 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1225 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1226 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1227 // Lorentz kinematics 1228 // DO IK = 3, 5, 1 1229 // EV_TAB(IJ+IEV_TAB,IK) = EV_TEMP(IJ,IK) + 1230 // BU_TAB(I,IK+2) ENDDO 1231 // Lorentz transformation 1232 lorentz_boost(BU_TAB[i][4], 1233 BU_TAB[i][5], 1234 BU_TAB[i][6], 1235 EV_TEMP[IJ][2], 1236 EV_TEMP[IJ][3], 1237 EV_TEMP[IJ][4], 1238 &VXOUT, 1239 &VYOUT, 1240 &VZOUT); 1241 EV_TAB[IJ + IEV_TAB][2] = VXOUT; 1242 EV_TAB[IJ + IEV_TAB][3] = VYOUT; 1243 EV_TAB[IJ + IEV_TAB][4] = VZOUT; 1244 } 1245 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 1246 1247 // All velocities in the frame of the "primary" prefragment (after INC) 1248 // Lorentz kinematics 1249 // BU_TAB(I,5) = BU_TAB(I,5) + VX_EVABU 1250 // BU_TAB(I,6) = BU_TAB(I,6) + VY_EVABU 1251 // BU_TAB(I,7) = BU_TAB(I,7) + VZ_EVABU 1252 // Lorentz transformation 1253 lorentz_boost( 1254 vx_evabu, vy_evabu, vz_evabu, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); 1255 BU_TAB[i][4] = VXOUT; 1256 BU_TAB[i][5] = VYOUT; 1257 BU_TAB[i][6] = VZOUT; 1258 1259 if (fimf == 0) 1260 { 1261 BU_TAB[i][7] = dint(ZFBU); 1262 BU_TAB[i][8] = dint(AFBU); 1263 BU_TAB[i][11] = nbl; 1264 } // if fimf==0 1265 1266 if (fimf == 1) 1267 { 1268 // PRINT*,'IMF EMISSION FROM BU PRODUCTS' 1269 // IMF emission: Heavy partner is not allowed to fission or to emitt 1270 // IMF. 1271 // double FEE = EEBU; 1272 G4int FFBU1 = 0; 1273 G4int FIMFBU1 = 0; 1274 opt->optimfallowed = 0; // IMF is not allowed 1275 fiss->ifis = 0; // fission is not allowed 1276 // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF 1277 G4double EkinR1 = TKEIMFBU * AIMFBU / (AFBU + AIMFBU); 1278 G4double EkinR2 = TKEIMFBU * AFBU / (AFBU + AIMFBU); 1279 G4double V1 = std::sqrt(EkinR1 / AFBU) * 1.3887; 1280 G4double V2 = std::sqrt(EkinR2 / AIMFBU) * 1.3887; 1281 G4double VZ1_IMF = (2.0 * G4AblaRandom::flat() - 1.0) * V1; 1282 G4double VPERP1 = std::sqrt(V1 * V1 - VZ1_IMF * VZ1_IMF); 1283 G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; 1284 G4double VX1_IMF = VPERP1 * std::sin(ALPHA1); 1285 G4double VY1_IMF = VPERP1 * std::cos(ALPHA1); 1286 G4double VX2_IMF = -VX1_IMF / V1 * V2; 1287 G4double VY2_IMF = -VY1_IMF / V1 * V2; 1288 G4double VZ2_IMF = -VZ1_IMF / V1 * V2; 1289 1290 G4double EEIMFP = EEBU * AFBU / (AFBU + AIMFBU); 1291 G4double EEIMF = EEBU * AIMFBU / (AFBU + AIMFBU); 1292 1293 // Decay of heavy partner 1294 G4double IINERTTOT = 1295 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(AIMFBU, 5.0 / 3.0) + std::pow(AFBU, 5.0 / 3.0)) + 1296 931.490 * 1.160 * 1.160 * AIMFBU * AFBU / (AIMFBU + AFBU) * 1297 (std::pow(AIMFBU, 1. / 3.) + std::pow(AFBU, 1. / 3.)) * 1298 (std::pow(AIMFBU, 1. / 3.) + std::pow(AFBU, 1. / 3.)); 1299 1300 G4double JPRFHEAVY = 1301 BU_TAB[i][9] * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(AFBU, 5.0 / 3.0) / IINERTTOT; 1302 G4double JPRFLIGHT = 1303 BU_TAB[i][9] * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(AIMFBU, 5.0 / 3.0) / IINERTTOT; 1304 1305 // Lorentz kinematics 1306 // BU_TAB(I,5) = BU_TAB(I,5) + VX1_IMF 1307 // BU_TAB(I,6) = BU_TAB(I,6) + VY1_IMF 1308 // BU_TAB(I,7) = BU_TAB(I,7) + VZ1_IMF 1309 // Lorentz transformation 1310 lorentz_boost( 1311 VX1_IMF, VY1_IMF, VZ1_IMF, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); 1312 BU_TAB[i][4] = VXOUT; 1313 BU_TAB[i][5] = VYOUT; 1314 BU_TAB[i][6] = VZOUT; 1315 1316 G4double vx1ev_imf = 0., vy1ev_imf = 0., vz1ev_imf = 0., zdummy = 0., adummy = 0., tkedummy = 0., 1317 jprf1 = 0.; 1318 1319 // Lambda particles 1320 G4int NbLamH = 0; 1321 G4int NbLamimf = 0; 1322 G4double pbH = (AFBU - ZFBU) / (AFBU - ZFBU + AIMFBU - ZIMFBU); 1323 for (G4int j = 0; j < nbl; j++) 1324 { 1325 if (G4AblaRandom::flat() < pbH) 1326 { 1327 NbLamH++; 1328 } 1329 else 1330 { 1331 NbLamimf++; 1332 } 1333 } 1334 // Decay of IMF's partner: 1335 evapora(ZFBU, 1336 AFBU, 1337 &EEIMFP, 1338 JPRFHEAVY, 1339 &ZFFBU, 1340 &AFFBU, 1341 &mtota, 1342 &vz1ev_imf, 1343 &vx1ev_imf, 1344 &vy1ev_imf, 1345 &FFBU1, 1346 &FIMFBU1, 1347 &zdummy, 1348 &adummy, 1349 &tkedummy, 1350 &jprf1, 1351 &inttype, 1352 &inum, 1353 EV_TEMP, 1354 &IEV_TAB_TEMP, 1355 &NbLamH); 1356 1357 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 1358 { 1359 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1360 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1361 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1362 // Lorentz kinematics 1363 // DO IK = 3, 5, 1 1364 // EV_TAB(IJ+IEV_TAB,IK) = EV_TEMP(IJ,IK) + 1365 // BU_TAB(I,IK+2) ENDDO 1366 // Lorentz transformation 1367 lorentz_boost(BU_TAB[i][4], 1368 BU_TAB[i][5], 1369 BU_TAB[i][6], 1370 EV_TEMP[IJ][2], 1371 EV_TEMP[IJ][3], 1372 EV_TEMP[IJ][4], 1373 &VXOUT, 1374 &VYOUT, 1375 &VZOUT); 1376 EV_TAB[IJ + IEV_TAB][2] = VXOUT; 1377 EV_TAB[IJ + IEV_TAB][3] = VYOUT; 1378 EV_TAB[IJ + IEV_TAB][4] = VZOUT; 1379 } 1380 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 1381 1382 BU_TAB[i][7] = dint(ZFFBU); 1383 BU_TAB[i][8] = dint(AFFBU); 1384 BU_TAB[i][11] = NbLamH; 1385 // Lorentz kinematics 1386 // BU_TAB(I,5) = BU_TAB(I,5) + vx1ev_imf 1387 // BU_TAB(I,6) = BU_TAB(I,6) + vy1ev_imf 1388 // BU_TAB(I,7) = BU_TAB(I,7) + vz1ev_imf 1389 lorentz_boost(vx1ev_imf, 1390 vy1ev_imf, 1391 vz1ev_imf, 1392 BU_TAB[i][4], 1393 BU_TAB[i][5], 1394 BU_TAB[i][6], 1395 &VXOUT, 1396 &VYOUT, 1397 &VZOUT); 1398 BU_TAB[i][4] = VXOUT; 1399 BU_TAB[i][5] = VYOUT; 1400 BU_TAB[i][6] = VZOUT; 1401 // For IMF - fission and IMF emission are not allowed 1402 G4int FFBU2 = 0; 1403 G4int FIMFBU2 = 0; 1404 opt->optimfallowed = 0; // IMF is not allowed 1405 fiss->ifis = 0; // fission is not allowed 1406 // Decay of IMF 1407 G4double zffimf, affimf, zdummy1, adummy1, tkedummy1, jprf2, vx2ev_imf, vy2ev_imf, vz2ev_imf; 1408 1409 evapora(ZIMFBU, 1410 AIMFBU, 1411 &EEIMF, 1412 JPRFLIGHT, 1413 &zffimf, 1414 &affimf, 1415 &mtota, 1416 &vz2ev_imf, 1417 &vx2ev_imf, 1418 &vy2ev_imf, 1419 &FFBU2, 1420 &FIMFBU2, 1421 &zdummy1, 1422 &adummy1, 1423 &tkedummy1, 1424 &jprf2, 1425 &inttype, 1426 &inum, 1427 EV_TEMP, 1428 &IEV_TAB_TEMP, 1429 &NbLamimf); 1430 1431 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 1432 { 1433 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1434 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1435 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1436 // Lorentz kinematics 1437 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + BU_TAB(I,5) 1438 // +VX2_IMF EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + 1439 // BU_TAB(I,6) +VY2_IMF EV_TAB(IJ+IEV_TAB,5) = 1440 // EV_TEMP(IJ,5) + BU_TAB(I,7) +VZ2_IMF 1441 // Lorentz transformation 1442 lorentz_boost(BU_TAB[i][4], 1443 BU_TAB[i][5], 1444 BU_TAB[i][6], 1445 EV_TEMP[IJ][2], 1446 EV_TEMP[IJ][3], 1447 EV_TEMP[IJ][4], 1448 &VXOUT, 1449 &VYOUT, 1450 &VZOUT); 1451 lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 1452 EV_TAB[IJ + IEV_TAB][2] = VX2OUT; 1453 EV_TAB[IJ + IEV_TAB][3] = VY2OUT; 1454 EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; 1455 } 1456 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 1457 1458 BU_TAB[IMULTBU + ILOOPBU][0] = BU_TAB[i][0]; 1459 BU_TAB[IMULTBU + ILOOPBU][1] = BU_TAB[i][1]; 1460 BU_TAB[IMULTBU + ILOOPBU][2] = BU_TAB[i][2]; 1461 BU_TAB[IMULTBU + ILOOPBU][3] = BU_TAB[i][3]; 1462 BU_TAB[IMULTBU + ILOOPBU][7] = dint(zffimf); 1463 BU_TAB[IMULTBU + ILOOPBU][8] = dint(affimf); 1464 BU_TAB[IMULTBU + ILOOPBU][11] = NbLamimf; 1465 // Lorentz transformation 1466 lorentz_boost( 1467 VX2_IMF, VY2_IMF, VZ2_IMF, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); 1468 lorentz_boost(vx2ev_imf, vy2ev_imf, vz2ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 1469 BU_TAB[IMULTBU + ILOOPBU][4] = VX2OUT; 1470 BU_TAB[IMULTBU + ILOOPBU][5] = VY2OUT; 1471 BU_TAB[IMULTBU + ILOOPBU][6] = VZ2OUT; 1472 ILOOPBU = ILOOPBU + 1; 1473 } // if fimf==1 1474 } 1475 else 1476 { // if BU_TAB(I,1).GT.2.D0 1477 // BU_TAB[i][0] = BU_TAB[i][0]; 1478 // BU_TAB[i][1] = BU_TAB[i][1]; 1479 // BU_TAB[i][2] = BU_TAB[i][2]; 1480 // BU_TAB[i][3] = BU_TAB[i][3]; 1481 BU_TAB[i][7] = BU_TAB[i][0]; 1482 BU_TAB[i][8] = BU_TAB[i][1]; 1483 // BU_TAB[i][4] = BU_TAB[i][4]; 1484 // BU_TAB[i][5] = BU_TAB[i][5]; 1485 // BU_TAB[i][6] = BU_TAB[i][6]; 1486 BU_TAB[i][11] = Nblamb[i]; 1487 } // if BU_TAB(I,1).GT.2.D0 1488 } // for IMULTBU 1489 1490 IMULTBU = IMULTBU + ILOOPBU; 1491 // 1492 // RESOLVE UNSTABLE NUCLEI 1493 // 1494 INEWLOOP = 0; 1495 ABU_SUM = 0.0; 1496 ZBU_SUM = 0.0; 1497 // 1498 for (G4int i = 0; i < IMULTBU; i++) 1499 { 1500 ABU_SUM = ABU_SUM + BU_TAB[i][8]; 1501 ZBU_SUM = ZBU_SUM + BU_TAB[i][7]; 1502 unstable_nuclei(idnint(BU_TAB[i][8]), 1503 idnint(BU_TAB[i][7]), 1504 &afpnew, 1505 &zfpnew, 1506 IOUNSTABLE, 1507 BU_TAB[i][4], 1508 BU_TAB[i][5], 1509 BU_TAB[i][6], 1510 &VP1X, 1511 &VP1Y, 1512 &VP1Z, 1513 BU_TAB_TEMP1, 1514 &ILOOP); 1515 1516 // From now on, all neutrons and LCP created in above subroutine are part 1517 // of the 1518 // BU_TAB array (see below - Properties of "light" fragments). Therefore, 1519 // NEVA, PEVA ... are not needed any more in the break-up stage. 1520 1521 if (IOUNSTABLE > 0) 1522 { 1523 // Properties of "heavy fragment": 1524 ABU_SUM = ABU_SUM + G4double(afpnew) - BU_TAB[i][8]; 1525 ZBU_SUM = ZBU_SUM + G4double(zfpnew) - BU_TAB[i][7]; 1526 BU_TAB[i][8] = G4double(afpnew); 1527 BU_TAB[i][7] = G4double(zfpnew); 1528 BU_TAB[i][4] = VP1X; 1529 BU_TAB[i][5] = VP1Y; 1530 BU_TAB[i][6] = VP1Z; 1531 1532 // Properties of "light" fragments: 1533 for (G4int IJ = 0; IJ < ILOOP; IJ++) 1534 { 1535 BU_TAB[IMULTBU + INEWLOOP + IJ][7] = BU_TAB_TEMP1[IJ][0]; 1536 BU_TAB[IMULTBU + INEWLOOP + IJ][8] = BU_TAB_TEMP1[IJ][1]; 1537 BU_TAB[IMULTBU + INEWLOOP + IJ][4] = BU_TAB_TEMP1[IJ][2]; 1538 BU_TAB[IMULTBU + INEWLOOP + IJ][5] = BU_TAB_TEMP1[IJ][3]; 1539 BU_TAB[IMULTBU + INEWLOOP + IJ][6] = BU_TAB_TEMP1[IJ][4]; 1540 BU_TAB[IMULTBU + INEWLOOP + IJ][2] = 0.0; 1541 BU_TAB[IMULTBU + INEWLOOP + IJ][3] = 0.0; 1542 BU_TAB[IMULTBU + INEWLOOP + IJ][0] = BU_TAB[i][0]; 1543 BU_TAB[IMULTBU + INEWLOOP + IJ][1] = BU_TAB[i][1]; 1544 BU_TAB[IMULTBU + INEWLOOP + IJ][11] = BU_TAB[i][11]; 1545 ABU_SUM = ABU_SUM + BU_TAB[IMULTBU + INEWLOOP + IJ][8]; 1546 ZBU_SUM = ZBU_SUM + BU_TAB[IMULTBU + INEWLOOP + IJ][7]; 1547 } // for ILOOP 1548 1549 INEWLOOP = INEWLOOP + ILOOP; 1550 } // if(IOUNSTABLE>0) 1551 } // for IMULTBU unstable 1552 1553 // Increased array of BU_TAB 1554 IMULTBU = IMULTBU + INEWLOOP; 1555 1556 // Transform all velocities into the rest frame of the projectile 1557 lorentz_boost(VX_incl, VY_incl, VZ_incl, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); 1558 VX_PREF = VXOUT; 1559 VY_PREF = VYOUT; 1560 VZ_PREF = VZOUT; 1561 1562 for (G4int i = 0; i < IMULTBU; i++) 1563 { 1564 lorentz_boost(VX_incl, VY_incl, VZ_incl, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); 1565 BU_TAB[i][4] = VXOUT; 1566 BU_TAB[i][5] = VYOUT; 1567 BU_TAB[i][6] = VZOUT; 1568 } 1569 for (G4int i = 0; i < IEV_TAB; i++) 1570 { 1571 lorentz_boost(VX_incl, VY_incl, VZ_incl, EV_TAB[i][2], EV_TAB[i][3], EV_TAB[i][4], &VXOUT, &VYOUT, &VZOUT); 1572 EV_TAB[i][2] = VXOUT; 1573 EV_TAB[i][3] = VYOUT; 1574 EV_TAB[i][4] = VZOUT; 1575 } 1576 if (IMULTBU > 200) 1577 std::cout << "IMULTBU>200 " << IMULTBU << std::endl; 1578 delete[] problamb; 1579 delete[] Nblamb; 1580 } // if(T_diff>0.1) 1581 // End of multi-fragmentation 1582 mult7777: 1583 1584 // Start basic de-excitation of fragments 1585 aprfp = idnint(aprf); 1586 zprfp = idnint(zprf); 1587 1588 if (IMULTIFR == 0) 1589 { 1590 // These momenta are in the frame of the projectile (or target in case of 1591 // direct kinematics) 1592 VX_PREF = VX_incl; 1593 VY_PREF = VY_incl; 1594 VZ_PREF = VZ_incl; 1595 } 1596 // Lambdas after multi-fragmentation 1597 if (IMULTIFR == 1) 1598 { 1599 NbLam0 = NbLamprf; 1600 } 1601 // 1602 // CALL THE EVAPORATION SUBROUTINE 1603 // 1604 opt->optimfallowed = 1; // IMF is allowed 1605 fiss->ifis = 1; // fission is allowed 1606 fimf = 0; 1607 ff = 0; 1608 1609 // To spare computing time; these events in any case cannot decay 1610 // IF(ZPRFP.LE.2.AND.ZPRFP.LT.APRFP)THEN FIXME: <= or < 1611 if (zprfp <= 2 && zprfp < aprfp) 1612 { 1613 zf = zprf; 1614 af = aprf; 1615 ee = 0.0; 1616 ff = 0; 1617 fimf = 0; 1618 ftype = 0; 1619 aimf = 0.0; 1620 zimf = 0.0; 1621 tkeimf = 0.0; 1622 vx_eva = 0.0; 1623 vy_eva = 0.0; 1624 vz_eva = 0.0; 1625 jprf0 = jprf; 1626 goto a1972; 1627 } 1628 1629 // if(ZPRFP.LE.2.AND.ZPRFP.EQ.APRFP) 1630 if (zprfp <= 2 && zprfp == aprfp) 1631 { 1632 unstable_nuclei(aprfp, 1633 zprfp, 1634 &afpnew, 1635 &zfpnew, 1636 IOUNSTABLE, 1637 VX_PREF, 1638 VY_PREF, 1639 VZ_PREF, 1640 &VP1X, 1641 &VP1Y, 1642 &VP1Z, 1643 EV_TAB_TEMP, 1644 &ILOOP); 1645 af = G4double(afpnew); 1646 zf = G4double(zfpnew); 1647 VX_PREF = VP1X; 1648 VY_PREF = VP1Y; 1649 VZ_PREF = VP1Z; 1650 for (G4int I = 0; I < ILOOP; I++) 1651 { 1652 for (G4int IJ = 0; IJ < 6; IJ++) 1653 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 1654 } 1655 IEV_TAB = IEV_TAB + ILOOP; 1656 ee = 0.0; 1657 ff = 0; 1658 fimf = 0; 1659 ftype = 0; 1660 aimf = 0.0; 1661 zimf = 0.0; 1662 tkeimf = 0.0; 1663 vx_eva = 0.0; 1664 vy_eva = 0.0; 1665 vz_eva = 0.0; 1666 jprf0 = jprf; 1667 goto a1972; 1668 } 1669 1670 // IF(ZPRFP.EQ.APRFP)THEN 1671 if (zprfp == aprfp) 1672 { 1673 unstable_nuclei(aprfp, 1674 zprfp, 1675 &afpnew, 1676 &zfpnew, 1677 IOUNSTABLE, 1678 VX_PREF, 1679 VY_PREF, 1680 VZ_PREF, 1681 &VP1X, 1682 &VP1Y, 1683 &VP1Z, 1684 EV_TAB_TEMP, 1685 &ILOOP); 1686 af = G4double(afpnew); 1687 zf = G4double(zfpnew); 1688 VX_PREF = VP1X; 1689 VY_PREF = VP1Y; 1690 VZ_PREF = VP1Z; 1691 for (G4int I = 0; I < ILOOP; I++) 1692 { 1693 for (G4int IJ = 0; IJ < 6; IJ++) 1694 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 1695 } 1696 IEV_TAB = IEV_TAB + ILOOP; 1697 ee = 0.0; 1698 ff = 0; 1699 fimf = 0; 1700 ftype = 0; 1701 aimf = 0.0; 1702 zimf = 0.0; 1703 tkeimf = 0.0; 1704 vx_eva = 0.0; 1705 vy_eva = 0.0; 1706 vz_eva = 0.0; 1707 jprf0 = jprf; 1708 goto a1972; 1709 } 1710 // 1711 evapora(zprf, 1712 aprf, 1713 &ee, 1714 jprf, 1715 &zf, 1716 &af, 1717 &mtota, 1718 &vz_eva, 1719 &vx_eva, 1720 &vy_eva, 1721 &ff, 1722 &fimf, 1723 &zimf, 1724 &aimf, 1725 &tkeimf, 1726 &jprf0, 1727 &inttype, 1728 &inum, 1729 EV_TEMP, 1730 &IEV_TAB_TEMP, 1731 &NbLam0); 1732 // 1733 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 1734 { 1735 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1736 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1737 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1738 // 1739 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 1740 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 1741 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 1742 // Lorentz transformation 1743 lorentz_boost( 1744 VX_PREF, VY_PREF, VZ_PREF, EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); 1745 EV_TAB[IJ + IEV_TAB][2] = VXOUT; 1746 EV_TAB[IJ + IEV_TAB][3] = VYOUT; 1747 EV_TAB[IJ + IEV_TAB][4] = VZOUT; 1748 } 1749 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 1750 1751 a1972: 1752 1753 // vi_pref - velocity of the prefragment; vi_eva - recoil due to evaporation 1754 lorentz_boost(VX_PREF, VY_PREF, VZ_PREF, vx_eva, vy_eva, vz_eva, &VXOUT, &VYOUT, &VZOUT); 1755 V_CM[0] = VXOUT; 1756 V_CM[1] = VYOUT; 1757 V_CM[2] = VZOUT; 1758 // 1759 if (ff == 0 && fimf == 0) 1760 { 1761 // Evaporation of neutrons and LCP; no IMF, no fission 1762 ftype = 0; 1763 ZFP1 = idnint(zf); 1764 AFP1 = idnint(af); 1765 SFP1 = NbLam0; 1766 AFPIMF = 0; 1767 ZFPIMF = 0; 1768 SFPIMF = 0; 1769 ZFP2 = 0; 1770 AFP2 = 0; 1771 SFP2 = 0; 1772 VFP1_CM[0] = V_CM[0]; 1773 VFP1_CM[1] = V_CM[1]; 1774 VFP1_CM[2] = V_CM[2]; 1775 for (G4int j = 0; j < 3; j++) 1776 { 1777 VIMF_CM[j] = 0.0; 1778 VFP2_CM[j] = 0.0; 1779 } 1780 } 1781 // 1782 if (ff == 1 && fimf == 0) 1783 ftype = 1; // fission 1784 if (ff == 0 && fimf == 1) 1785 ftype = 2; // IMF emission 1786 // 1787 // AFP,ZFP IS THE FINAL FRAGMENT IF NO FISSION OR IMF EMISSION OCCURS 1788 // IN CASE OF FISSION IT IS THE NUCLEUS THAT UNDERGOES FISSION OR IMF 1789 // 1790 1791 //***************** FISSION *************************************** 1792 // 1793 if (ftype == 1) 1794 { 1795 varntp->kfis = 1; 1796 if (NbLam0 > 0) 1797 varntp->kfis = 20; 1798 // ftype1=0; 1799 1800 G4int IEV_TAB_FIS = 0, imode = 0; 1801 1802 G4double vx1_fission = 0., vy1_fission = 0., vz1_fission = 0.; 1803 G4double vx2_fission = 0., vy2_fission = 0., vz2_fission = 0.; 1804 G4double vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0.; 1805 1806 fission(af, 1807 zf, 1808 ee, 1809 jprf0, 1810 &vx1_fission, 1811 &vy1_fission, 1812 &vz1_fission, 1813 &vx2_fission, 1814 &vy2_fission, 1815 &vz2_fission, 1816 &ZFP1, 1817 &AFP1, 1818 &SFP1, 1819 &ZFP2, 1820 &AFP2, 1821 &SFP2, 1822 &imode, 1823 &vx_eva_sc, 1824 &vy_eva_sc, 1825 &vz_eva_sc, 1826 EV_TEMP, 1827 &IEV_TAB_FIS, 1828 &NbLam0); 1829 1830 for (G4int IJ = 0; IJ < IEV_TAB_FIS; IJ++) 1831 { 1832 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1833 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1834 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1835 // Lorentz kinematics 1836 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 1837 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 1838 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 1839 // Lorentz transformation 1840 lorentz_boost( 1841 V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); 1842 EV_TAB[IJ + IEV_TAB][2] = VXOUT; 1843 EV_TAB[IJ + IEV_TAB][3] = VYOUT; 1844 EV_TAB[IJ + IEV_TAB][4] = VZOUT; 1845 } 1846 IEV_TAB = IEV_TAB + IEV_TAB_FIS; 1847 1848 // if(imode==1) ftype1 = 1; // S1 mode 1849 // if(imode==2) ftype1 = 2; // S2 mode 1850 1851 AFPIMF = 0; 1852 ZFPIMF = 0; 1853 SFPIMF = 0; 1854 1855 // VX_EVA_SC,VY_EVA_SC,VZ_EVA_SC - recoil due to particle emisison 1856 // between saddle and scission 1857 // Lorentz kinematics 1858 // VFP1_CM(1) = V_CM(1) + VX1_FISSION + VX_EVA_SC ! Velocity of FF1 1859 // in x VFP1_CM(2) = V_CM(2) + VY1_FISSION + VY_EVA_SC ! Velocity of 1860 // FF1 in y VFP1_CM(3) = V_CM(3) + VZ1_FISSION + VZ_EVA_SC ! Velocity 1861 // of FF1 in x 1862 lorentz_boost(vx1_fission, vy1_fission, vz1_fission, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 1863 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 1864 VFP1_CM[0] = VX2OUT; 1865 VFP1_CM[1] = VY2OUT; 1866 VFP1_CM[2] = VZ2OUT; 1867 1868 // Lorentz kinematics 1869 // VFP2_CM(1) = V_CM(1) + VX2_FISSION + VX_EVA_SC ! Velocity of FF2 1870 // in x VFP2_CM(2) = V_CM(2) + VY2_FISSION + VY_EVA_SC ! Velocity of 1871 // FF2 in y VFP2_CM(3) = V_CM(3) + VZ2_FISSION + VZ_EVA_SC ! Velocity 1872 // of FF2 in x 1873 lorentz_boost(vx2_fission, vy2_fission, vz2_fission, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 1874 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 1875 VFP2_CM[0] = VX2OUT; 1876 VFP2_CM[1] = VY2OUT; 1877 VFP2_CM[2] = VZ2OUT; 1878 1879 //************** IMF EMISSION 1880 //************************************************ 1881 // 1882 } 1883 else if (ftype == 2) 1884 { 1885 // IMF emission: Heavy partner is allowed to fission and to emitt IMF, but 1886 // ONLY once. 1887 G4int FF11 = 0; 1888 G4int FIMF11 = 0; 1889 opt->optimfallowed = 1; // IMF is allowed 1890 fiss->ifis = 1; // fission is allowed 1891 // Lambda particles 1892 G4int NbLamH = 0; 1893 G4int NbLamimf = 0; 1894 G4double pbH = (af - zf) / (af - zf + aimf - zimf); 1895 // double pbL = aimf / (af+aimf); 1896 for (G4int i = 0; i < NbLam0; i++) 1897 { 1898 if (G4AblaRandom::flat() < pbH) 1899 { 1900 NbLamH++; 1901 } 1902 else 1903 { 1904 NbLamimf++; 1905 } 1906 } 1907 // 1908 // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF 1909 G4double EkinR1 = tkeimf * aimf / (af + aimf); 1910 G4double EkinR2 = tkeimf * af / (af + aimf); 1911 G4double V1 = std::sqrt(EkinR1 / af) * 1.3887; 1912 G4double V2 = std::sqrt(EkinR2 / aimf) * 1.3887; 1913 G4double VZ1_IMF = (2.0 * G4AblaRandom::flat() - 1.0) * V1; 1914 G4double VPERP1 = std::sqrt(V1 * V1 - VZ1_IMF * VZ1_IMF); 1915 G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; 1916 G4double VX1_IMF = VPERP1 * std::sin(ALPHA1); 1917 G4double VY1_IMF = VPERP1 * std::cos(ALPHA1); 1918 G4double VX2_IMF = -VX1_IMF / V1 * V2; 1919 G4double VY2_IMF = -VY1_IMF / V1 * V2; 1920 G4double VZ2_IMF = -VZ1_IMF / V1 * V2; 1921 1922 G4double EEIMFP = ee * af / (af + aimf); 1923 G4double EEIMF = ee * aimf / (af + aimf); 1924 1925 // Decay of heavy partner 1926 G4double IINERTTOT = 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(aimf, 5.0 / 3.0) + std::pow(af, 5.0 / 3.0)) + 1927 931.490 * 1.160 * 1.160 * aimf * af / (aimf + af) * 1928 (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)) * 1929 (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)); 1930 1931 G4double JPRFHEAVY = jprf0 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(af, 5.0 / 3.0) / IINERTTOT; 1932 G4double JPRFLIGHT = jprf0 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(aimf, 5.0 / 3.0) / IINERTTOT; 1933 if (af < 2.0) 1934 std::cout << "RN117-4,AF,ZF,EE,JPRFheavy" << std::endl; 1935 1936 G4double vx1ev_imf = 0., vy1ev_imf = 0., vz1ev_imf = 0., zdummy = 0., adummy = 0., tkedummy = 0., jprf1 = 0.; 1937 1938 evapora(zf, 1939 af, 1940 &EEIMFP, 1941 JPRFHEAVY, 1942 &zff, 1943 &aff, 1944 &mtota, 1945 &vz1ev_imf, 1946 &vx1ev_imf, 1947 &vy1ev_imf, 1948 &FF11, 1949 &FIMF11, 1950 &zdummy, 1951 &adummy, 1952 &tkedummy, 1953 &jprf1, 1954 &inttype, 1955 &inum, 1956 EV_TEMP, 1957 &IEV_TAB_TEMP, 1958 &NbLamH); 1959 1960 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 1961 { 1962 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 1963 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 1964 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 1965 // 1966 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 1967 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 1968 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 1969 // Lorentz transformation 1970 lorentz_boost( 1971 V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); 1972 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 1973 EV_TAB[IJ + IEV_TAB][2] = VX2OUT; 1974 EV_TAB[IJ + IEV_TAB][3] = VY2OUT; 1975 EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; 1976 } 1977 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 1978 1979 // For IMF - fission and IMF emission are not allowed 1980 G4int FF22 = 0; 1981 G4int FIMF22 = 0; 1982 opt->optimfallowed = 0; // IMF is not allowed 1983 fiss->ifis = 0; // fission is not allowed 1984 1985 // Decay of IMF 1986 G4double zffimf, affimf, zdummy1 = 0., adummy1 = 0., tkedummy1 = 0., jprf2, vx2ev_imf, vy2ev_imf, vz2ev_imf; 1987 1988 evapora(zimf, 1989 aimf, 1990 &EEIMF, 1991 JPRFLIGHT, 1992 &zffimf, 1993 &affimf, 1994 &mtota, 1995 &vz2ev_imf, 1996 &vx2ev_imf, 1997 &vy2ev_imf, 1998 &FF22, 1999 &FIMF22, 2000 &zdummy1, 2001 &adummy1, 2002 &tkedummy1, 2003 &jprf2, 2004 &inttype, 2005 &inum, 2006 EV_TEMP, 2007 &IEV_TAB_TEMP, 2008 &NbLamimf); 2009 2010 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 2011 { 2012 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 2013 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 2014 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 2015 // 2016 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 2017 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 2018 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 2019 // Lorentz transformation 2020 lorentz_boost( 2021 V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); 2022 lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2023 EV_TAB[IJ + IEV_TAB][2] = VX2OUT; 2024 EV_TAB[IJ + IEV_TAB][3] = VY2OUT; 2025 EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; 2026 } 2027 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 2028 // As IMF is not allowed to emit IMF, adummy1=zdummy1=0 2029 2030 AFPIMF = idnint(affimf); 2031 ZFPIMF = idnint(zffimf); 2032 SFPIMF = NbLamimf; 2033 2034 // vi1_imf, vi2_imf - velocities of imf and partner from TKE; 2035 // vi1ev_imf, vi2_imf - recoil of partner and imf due to evaporation 2036 // Lorentz kinematics - DM 18/5/2010 2037 // VIMF_CM(1) = V_CM(1) + VX2_IMF + VX2EV_IMF 2038 // VIMF_CM(2) = V_CM(2) + VY2_IMF + VY2EV_IMF 2039 // VIMF_CM(3) = V_CM(3) + VZ2_IMF + VZ2EV_IMF 2040 lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2041 lorentz_boost(vx2ev_imf, vy2ev_imf, vz2ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2042 VIMF_CM[0] = VX2OUT; 2043 VIMF_CM[1] = VY2OUT; 2044 VIMF_CM[2] = VZ2OUT; 2045 // Lorentz kinematics 2046 // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF 2047 // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF 2048 // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF 2049 lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2050 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2051 VFP1_CM[0] = VX2OUT; 2052 VFP1_CM[1] = VY2OUT; 2053 VFP1_CM[2] = VZ2OUT; 2054 2055 if (FF11 == 0 && FIMF11 == 0) 2056 { 2057 // heavy partner deexcites by emission of light particles 2058 AFP1 = idnint(aff); 2059 ZFP1 = idnint(zff); 2060 SFP1 = NbLamH; 2061 ZFP2 = 0; 2062 AFP2 = 0; 2063 SFP2 = 0; 2064 ftype = 2; 2065 AFPIMF = idnint(affimf); 2066 ZFPIMF = idnint(zffimf); 2067 SFPIMF = NbLamimf; 2068 for (G4int I = 0; I < 3; I++) 2069 VFP2_CM[I] = 0.0; 2070 } 2071 else if (FF11 == 1 && FIMF11 == 0) 2072 { 2073 // Heavy partner fissions 2074 varntp->kfis = 1; 2075 if (NbLam0 > 0) 2076 varntp->kfis = 20; 2077 // 2078 opt->optimfallowed = 0; // IMF is not allowed 2079 fiss->ifis = 0; // fission is not allowed 2080 // 2081 zf = zff; 2082 af = aff; 2083 ee = EEIMFP; 2084 // ftype1=0; 2085 ftype = 21; 2086 2087 G4int IEV_TAB_FIS = 0, imode = 0; 2088 2089 G4double vx1_fission = 0., vy1_fission = 0., vz1_fission = 0.; 2090 G4double vx2_fission = 0., vy2_fission = 0., vz2_fission = 0.; 2091 G4double vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0.; 2092 2093 fission(af, 2094 zf, 2095 ee, 2096 jprf1, 2097 &vx1_fission, 2098 &vy1_fission, 2099 &vz1_fission, 2100 &vx2_fission, 2101 &vy2_fission, 2102 &vz2_fission, 2103 &ZFP1, 2104 &AFP1, 2105 &SFP1, 2106 &ZFP2, 2107 &AFP2, 2108 &SFP2, 2109 &imode, 2110 &vx_eva_sc, 2111 &vy_eva_sc, 2112 &vz_eva_sc, 2113 EV_TEMP, 2114 &IEV_TAB_FIS, 2115 &NbLamH); 2116 2117 for (int IJ = 0; IJ < IEV_TAB_FIS; IJ++) 2118 { 2119 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 2120 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 2121 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 2122 // Lorentz kinematics 2123 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 2124 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 2125 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 2126 // Lorentz transformation 2127 lorentz_boost(VFP1_CM[0], 2128 VFP1_CM[1], 2129 VFP1_CM[2], 2130 EV_TEMP[IJ][2], 2131 EV_TEMP[IJ][3], 2132 EV_TEMP[IJ][4], 2133 &VXOUT, 2134 &VYOUT, 2135 &VZOUT); 2136 EV_TAB[IJ + IEV_TAB][2] = VXOUT; 2137 EV_TAB[IJ + IEV_TAB][3] = VYOUT; 2138 EV_TAB[IJ + IEV_TAB][4] = VZOUT; 2139 } 2140 IEV_TAB = IEV_TAB + IEV_TAB_FIS; 2141 2142 // if(imode==1) ftype1 = 1; // S1 mode 2143 // if(imode==2) ftype1 = 2; // S2 mode 2144 2145 // Lorentz kinematics 2146 // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF + VX1_FISSION + 2147 // & VX_EVA_SC ! Velocity of FF1 in x 2148 // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF + VY1_FISSION + 2149 // & VY_EVA_SC ! Velocity of FF1 in y 2150 // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF + VZ1_FISSION + 2151 // & VZ_EVA_SC ! Velocity of FF1 in x 2152 lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2153 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2154 lorentz_boost(vx1_fission, vy1_fission, vz1_fission, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); 2155 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2156 VFP1_CM[0] = VX2OUT; 2157 VFP1_CM[1] = VY2OUT; 2158 VFP1_CM[2] = VZ2OUT; 2159 2160 // Lorentz kinematics 2161 // VFP2_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF + VX2_FISSION + 2162 // & VX_EVA_SC ! Velocity of FF2 in x 2163 // VFP2_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF + VY2_FISSION + 2164 // & VY_EVA_SC ! Velocity of FF2 in y 2165 // VFP2_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF + VZ2_FISSION + 2166 // & VZ_EVA_SC ! Velocity of FF2 in x 2167 lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2168 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2169 lorentz_boost(vx2_fission, vy2_fission, vz2_fission, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); 2170 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2171 VFP2_CM[0] = VX2OUT; 2172 VFP2_CM[1] = VY2OUT; 2173 VFP2_CM[2] = VZ2OUT; 2174 } 2175 else if (FF11 == 0 && FIMF11 == 1) 2176 { 2177 // Heavy partner emits imf, consequtive imf emission or fission is not 2178 // allowed 2179 opt->optimfallowed = 0; // IMF is not allowed 2180 fiss->ifis = 0; // fission is not allowed 2181 // 2182 zf = zff; 2183 af = aff; 2184 ee = EEIMFP; 2185 aimf = adummy; 2186 zimf = zdummy; 2187 tkeimf = tkedummy; 2188 FF11 = 0; 2189 FIMF11 = 0; 2190 ftype = 22; 2191 // Lambda particles 2192 G4int NbLamH1 = 0; 2193 G4int NbLamimf1 = 0; 2194 G4double pbH1 = (af - zf) / (af - zf + aimf - zimf); 2195 for (G4int i = 0; i < NbLamH; i++) 2196 { 2197 if (G4AblaRandom::flat() < pbH1) 2198 { 2199 NbLamH1++; 2200 } 2201 else 2202 { 2203 NbLamimf1++; 2204 } 2205 } 2206 // 2207 // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF 2208 EkinR1 = tkeimf * aimf / (af + aimf); 2209 EkinR2 = tkeimf * af / (af + aimf); 2210 V1 = std::sqrt(EkinR1 / af) * 1.3887; 2211 V2 = std::sqrt(EkinR2 / aimf) * 1.3887; 2212 G4double VZ1_IMFS = (2.0 * G4AblaRandom::flat() - 1.0) * V1; 2213 VPERP1 = std::sqrt(V1 * V1 - VZ1_IMFS * VZ1_IMFS); 2214 ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; 2215 G4double VX1_IMFS = VPERP1 * std::sin(ALPHA1); 2216 G4double VY1_IMFS = VPERP1 * std::cos(ALPHA1); 2217 G4double VX2_IMFS = -VX1_IMFS / V1 * V2; 2218 G4double VY2_IMFS = -VY1_IMFS / V1 * V2; 2219 G4double VZ2_IMFS = -VZ1_IMFS / V1 * V2; 2220 2221 EEIMFP = ee * af / (af + aimf); 2222 EEIMF = ee * aimf / (af + aimf); 2223 2224 // Decay of heavy partner 2225 IINERTTOT = 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(aimf, 5.0 / 3.0) + std::pow(af, 5.0 / 3.0)) + 2226 931.490 * 1.160 * 1.160 * aimf * af / (aimf + af) * 2227 (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)) * 2228 (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)); 2229 2230 JPRFHEAVY = jprf1 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(af, 5.0 / 3.0) / IINERTTOT; 2231 JPRFLIGHT = jprf1 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(aimf, 5.0 / 3.0) / IINERTTOT; 2232 2233 G4double zffs = 0., affs = 0., vx1ev_imfs = 0., vy1ev_imfs = 0., vz1ev_imfs = 0., jprf3 = 0.; 2234 2235 evapora(zf, 2236 af, 2237 &EEIMFP, 2238 JPRFHEAVY, 2239 &zffs, 2240 &affs, 2241 &mtota, 2242 &vz1ev_imfs, 2243 &vx1ev_imfs, 2244 &vy1ev_imfs, 2245 &FF11, 2246 &FIMF11, 2247 &zdummy, 2248 &adummy, 2249 &tkedummy, 2250 &jprf3, 2251 &inttype, 2252 &inum, 2253 EV_TEMP, 2254 &IEV_TAB_TEMP, 2255 &NbLamH1); 2256 2257 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 2258 { 2259 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 2260 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 2261 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 2262 // 2263 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 2264 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 2265 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 2266 // Lorentz transformation 2267 lorentz_boost(VFP1_CM[0], 2268 VFP1_CM[1], 2269 VFP1_CM[2], 2270 EV_TEMP[IJ][2], 2271 EV_TEMP[IJ][3], 2272 EV_TEMP[IJ][4], 2273 &VXOUT, 2274 &VYOUT, 2275 &VZOUT); 2276 lorentz_boost(vx1ev_imfs, vy1ev_imfs, vz1ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2277 EV_TAB[IJ + IEV_TAB][2] = VX2OUT; 2278 EV_TAB[IJ + IEV_TAB][3] = VY2OUT; 2279 EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; 2280 } 2281 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 2282 2283 // For IMF - fission and IMF emission are not allowed 2284 opt->optimfallowed = 0; // IMF is not allowed 2285 fiss->ifis = 0; // fission is not allowed 2286 // 2287 FF22 = 0; 2288 FIMF22 = 0; 2289 // Decay of "second" IMF 2290 G4double zffimfs = 0., affimfs = 0., vx2ev_imfs = 0., vy2ev_imfs = 0., vz2ev_imfs = 0., jprf4 = 0.; 2291 2292 evapora(zimf, 2293 aimf, 2294 &EEIMF, 2295 JPRFLIGHT, 2296 &zffimfs, 2297 &affimfs, 2298 &mtota, 2299 &vz2ev_imfs, 2300 &vx2ev_imfs, 2301 &vy2ev_imfs, 2302 &FF22, 2303 &FIMF22, 2304 &zdummy1, 2305 &adummy1, 2306 &tkedummy1, 2307 &jprf4, 2308 &inttype, 2309 &inum, 2310 EV_TEMP, 2311 &IEV_TAB_TEMP, 2312 &NbLamimf1); 2313 2314 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 2315 { 2316 EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; 2317 EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; 2318 EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; 2319 // 2320 // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 2321 // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 2322 // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 2323 // Lorentz transformation 2324 lorentz_boost(VFP1_CM[0], 2325 VFP1_CM[1], 2326 VFP1_CM[2], 2327 EV_TEMP[IJ][2], 2328 EV_TEMP[IJ][3], 2329 EV_TEMP[IJ][4], 2330 &VXOUT, 2331 &VYOUT, 2332 &VZOUT); 2333 lorentz_boost(vx2ev_imfs, vy2ev_imfs, vz2ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2334 EV_TAB[IJ + IEV_TAB][2] = VX2OUT; 2335 EV_TAB[IJ + IEV_TAB][3] = VY2OUT; 2336 EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; 2337 } 2338 IEV_TAB = IEV_TAB + IEV_TAB_TEMP; 2339 2340 AFP1 = idnint(affs); 2341 ZFP1 = idnint(zffs); 2342 SFP1 = NbLamH1; 2343 ZFP2 = idnint(zffimfs); 2344 AFP2 = idnint(affimfs); 2345 SFP2 = NbLamimf1; 2346 2347 // Velocity of final heavy residue 2348 // Lorentz kinematics 2349 // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF 2350 // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF 2351 // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF 2352 lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2353 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2354 lorentz_boost(VX1_IMFS, VY1_IMFS, VZ1_IMFS, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); 2355 lorentz_boost(vx1ev_imfs, vy1ev_imfs, vz1ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2356 VFP1_CM[0] = VX2OUT; 2357 VFP1_CM[1] = VY2OUT; 2358 VFP1_CM[2] = VZ2OUT; 2359 2360 // Velocity of the second IMF 2361 // Lorentz kinematics 2362 // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF 2363 // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF 2364 // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF 2365 lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); 2366 lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2367 lorentz_boost(VX2_IMFS, VY2_IMFS, VZ2_IMFS, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); 2368 lorentz_boost(vx2ev_imfs, vy2ev_imfs, vz2ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 2369 VFP2_CM[0] = VX2OUT; 2370 VFP2_CM[1] = VY2OUT; 2371 VFP2_CM[2] = VZ2OUT; 2372 } // second decay 2373 } // if(ftype == 2) 2374 2375 // Only evaporation of light particles 2376 if (ftype != 1 && ftype != 21) 2377 { 2378 2379 // ----------- RESOLVE UNSTABLE NUCLEI 2380 IOUNSTABLE = 0; 2381 2382 unstable_nuclei(AFP1, 2383 ZFP1, 2384 &afpnew, 2385 &zfpnew, 2386 IOUNSTABLE, 2387 VFP1_CM[0], 2388 VFP1_CM[1], 2389 VFP1_CM[2], 2390 &VP1X, 2391 &VP1Y, 2392 &VP1Z, 2393 EV_TAB_TEMP, 2394 &ILOOP); 2395 2396 if (IOUNSTABLE == 1) 2397 { 2398 AFP1 = afpnew; 2399 ZFP1 = zfpnew; 2400 VFP1_CM[0] = VP1X; 2401 VFP1_CM[1] = VP1Y; 2402 VFP1_CM[2] = VP1Z; 2403 for (G4int I = 0; I < ILOOP; I++) 2404 { 2405 for (G4int IJ = 0; IJ < 5; IJ++) 2406 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2407 } 2408 IEV_TAB = IEV_TAB + ILOOP; 2409 } 2410 2411 if (ftype > 1) 2412 { 2413 IOUNSTABLE = 0; 2414 2415 unstable_nuclei(AFPIMF, 2416 ZFPIMF, 2417 &afpnew, 2418 &zfpnew, 2419 IOUNSTABLE, 2420 VIMF_CM[0], 2421 VIMF_CM[1], 2422 VIMF_CM[2], 2423 &VP1X, 2424 &VP1Y, 2425 &VP1Z, 2426 EV_TAB_TEMP, 2427 &ILOOP); 2428 2429 if (IOUNSTABLE == 1) 2430 { 2431 AFPIMF = afpnew; 2432 ZFPIMF = zfpnew; 2433 VIMF_CM[0] = VP1X; 2434 VIMF_CM[1] = VP1Y; 2435 VIMF_CM[2] = VP1Z; 2436 for (G4int I = 0; I < ILOOP; I++) 2437 { 2438 for (G4int IJ = 0; IJ < 5; IJ++) 2439 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2440 } 2441 IEV_TAB = IEV_TAB + ILOOP; 2442 } 2443 2444 if (ftype > 2) 2445 { 2446 IOUNSTABLE = 0; 2447 2448 unstable_nuclei(AFP2, 2449 ZFP2, 2450 &afpnew, 2451 &zfpnew, 2452 IOUNSTABLE, 2453 VFP2_CM[0], 2454 VFP2_CM[1], 2455 VFP2_CM[2], 2456 &VP1X, 2457 &VP1Y, 2458 &VP1Z, 2459 EV_TAB_TEMP, 2460 &ILOOP); 2461 2462 if (IOUNSTABLE == 1) 2463 { 2464 AFP2 = afpnew; 2465 ZFP2 = zfpnew; 2466 VFP2_CM[0] = VP1X; 2467 VFP2_CM[1] = VP1Y; 2468 VFP2_CM[2] = VP1Z; 2469 for (G4int I = 0; I < ILOOP; I++) 2470 { 2471 for (G4int IJ = 0; IJ < 5; IJ++) 2472 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2473 } 2474 IEV_TAB = IEV_TAB + ILOOP; 2475 } 2476 } // ftype>2 2477 } // ftype>1 2478 } 2479 2480 // For the case of fission: 2481 if (ftype == 1 || ftype == 21) 2482 { 2483 // ----------- RESOLVE UNSTABLE NUCLEI 2484 IOUNSTABLE = 0; 2485 // ----------- Fragment 1 2486 unstable_nuclei(AFP1, 2487 ZFP1, 2488 &afpnew, 2489 &zfpnew, 2490 IOUNSTABLE, 2491 VFP1_CM[0], 2492 VFP1_CM[1], 2493 VFP1_CM[2], 2494 &VP1X, 2495 &VP1Y, 2496 &VP1Z, 2497 EV_TAB_TEMP, 2498 &ILOOP); 2499 2500 if (IOUNSTABLE == 1) 2501 { 2502 AFP1 = afpnew; 2503 ZFP1 = zfpnew; 2504 VFP1_CM[0] = VP1X; 2505 VFP1_CM[1] = VP1Y; 2506 VFP1_CM[2] = VP1Z; 2507 for (G4int I = 0; I < ILOOP; I++) 2508 { 2509 for (G4int IJ = 0; IJ < 5; IJ++) 2510 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2511 } 2512 IEV_TAB = IEV_TAB + ILOOP; 2513 } 2514 2515 IOUNSTABLE = 0; 2516 // ----------- Fragment 2 2517 unstable_nuclei(AFP2, 2518 ZFP2, 2519 &afpnew, 2520 &zfpnew, 2521 IOUNSTABLE, 2522 VFP2_CM[0], 2523 VFP2_CM[1], 2524 VFP2_CM[2], 2525 &VP1X, 2526 &VP1Y, 2527 &VP1Z, 2528 EV_TAB_TEMP, 2529 &ILOOP); 2530 2531 if (IOUNSTABLE == 1) 2532 { 2533 AFP2 = afpnew; 2534 ZFP2 = zfpnew; 2535 VFP2_CM[0] = VP1X; 2536 VFP2_CM[1] = VP1Y; 2537 VFP2_CM[2] = VP1Z; 2538 for (G4int I = 0; I < ILOOP; I++) 2539 { 2540 for (G4int IJ = 0; IJ < 5; IJ++) 2541 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2542 } 2543 IEV_TAB = IEV_TAB + ILOOP; 2544 } 2545 2546 if (ftype == 21) 2547 { 2548 IOUNSTABLE = 0; 2549 // ----------- Fragment IMF 2550 unstable_nuclei(AFPIMF, 2551 ZFPIMF, 2552 &afpnew, 2553 &zfpnew, 2554 IOUNSTABLE, 2555 VIMF_CM[0], 2556 VIMF_CM[1], 2557 VIMF_CM[2], 2558 &VP1X, 2559 &VP1Y, 2560 &VP1Z, 2561 EV_TAB_TEMP, 2562 &ILOOP); 2563 2564 if (IOUNSTABLE == 1) 2565 { 2566 AFPIMF = afpnew; 2567 ZFPIMF = zfpnew; 2568 VIMF_CM[0] = VP1X; 2569 VIMF_CM[1] = VP1Y; 2570 VIMF_CM[2] = VP1Z; 2571 for (G4int I = 0; I < ILOOP; I++) 2572 { 2573 for (G4int IJ = 0; IJ < 5; IJ++) 2574 EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; 2575 } 2576 IEV_TAB = IEV_TAB + ILOOP; 2577 } 2578 } // ftype=21 2579 } 2580 2581 // Cross check 2582 if ((ftype == 1 || ftype == 21) && (AFP2 <= 0 || AFP1 <= 0 || ZFP2 <= 0 || ZFP1 <= 0)) 2583 { 2584 std::cout << "ZFP1:" << ZFP1 << std::endl; 2585 std::cout << "AFP1:" << AFP1 << std::endl; 2586 std::cout << "ZFP2:" << ZFP2 << std::endl; 2587 std::cout << "AFP2:" << AFP2 << std::endl; 2588 } 2589 2590 // Put heavy residues in the EV_TAB array 2591 EV_TAB[IEV_TAB][0] = ZFP1; 2592 EV_TAB[IEV_TAB][1] = AFP1; 2593 EV_TAB[IEV_TAB][5] = SFP1; 2594 EV_TAB[IEV_TAB][2] = VFP1_CM[0]; 2595 EV_TAB[IEV_TAB][3] = VFP1_CM[1]; 2596 EV_TAB[IEV_TAB][4] = VFP1_CM[2]; 2597 IEV_TAB = IEV_TAB + 1; 2598 2599 if (AFP2 > 0) 2600 { 2601 EV_TAB[IEV_TAB][0] = ZFP2; 2602 EV_TAB[IEV_TAB][1] = AFP2; 2603 EV_TAB[IEV_TAB][5] = SFP2; 2604 EV_TAB[IEV_TAB][2] = VFP2_CM[0]; 2605 EV_TAB[IEV_TAB][3] = VFP2_CM[1]; 2606 EV_TAB[IEV_TAB][4] = VFP2_CM[2]; 2607 IEV_TAB = IEV_TAB + 1; 2608 } 2609 2610 if (AFPIMF > 0) 2611 { 2612 EV_TAB[IEV_TAB][0] = ZFPIMF; 2613 EV_TAB[IEV_TAB][1] = AFPIMF; 2614 EV_TAB[IEV_TAB][5] = SFPIMF; 2615 EV_TAB[IEV_TAB][2] = VIMF_CM[0]; 2616 EV_TAB[IEV_TAB][3] = VIMF_CM[1]; 2617 EV_TAB[IEV_TAB][4] = VIMF_CM[2]; 2618 IEV_TAB = IEV_TAB + 1; 2619 } 2620 // Put the array of particles in the root file of INCL 2621 FillData(IMULTBU, IEV_TAB); 2622 return; 2623 } 2624 2625 // Evaporation code 2626 void G4Abla::initEvapora() 2627 { 2628 2629 // 40 C BFPRO,SNPRO,SPPRO,SHELL 2630 // 41 C 2631 // 42 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES 2632 // 43 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C 2633 // 44 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC. 2634 // 45 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION 2635 // 46 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII 2636 // 47 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141... 2637 // 48 C BFPRO - FISSION BARRIER OF THE PROJECTILE 2638 // 49 C SNPRO - NEUTRON SEPARATION ENERGY OF THE 2639 // PROJECTILE 50 C SPPRO - PROTON " " " " " 2640 // 51 C SHELL - GROUND STATE SHELL CORRECTION 2641 // 52 2642 // C--------------------------------------------------------------------- 2643 // 53 C 2644 // 54 C ENERGIES WIDTHS AND CROSS SECTIONS FOR EM EXCITATION 2645 // 55 C COMMON /EMDPAR/ EGDR,EGQR,FWHMGDR,FWHMGQR,CREMDE1,CREMDE2, 2646 // 56 C AE1,BE1,CE1,AE2,BE2,CE2,SR1,SR2,XR 2647 // 57 C 2648 // 58 C EGDR,EGQR - MEAN ENERGY OF GDR AND GQR 2649 // 59 C FWHMGDR,FWHMGQR - FWHM OF GDR, GQR 2650 // 60 C CREMDE1,CREMDE2 - EM CROSS SECTION FOR E1 AND E2 2651 // 61 C AE1,BE1,CE1 - ARRAYS TO CALCULATE 2652 // 62 C AE2,BE2,CE2 - THE EXCITATION ENERGY AFTER E.M. EXC. 2653 // 63 C SR1,SR2,XR - WITH MONTE CARLO 2654 // 64 2655 // C--------------------------------------------------------------------- 2656 // 65 C 2657 // 66 C DEFORMATIONS AND G.S. SHELL EFFECTS 2658 // 67 C COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA 2659 // 68 C 2660 // 69 C ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL 2661 // G.S. 2662 // 70 C ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0) 2663 // 71 C VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE 2664 // 72 C ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT 2665 // BETA2!) 73 C BETA2 = SQRT(5/(4PI)) * ALPHA 74 2666 // C--------------------------------------------------------------------- 2667 // 75 C 2668 // 76 C ARRAYS FOR EXCITATION ENERGY BY STATISTICAL HOLE ENERY 2669 // MODEL 77 C COMMON /EENUC/ SHE, XHE 78 C 79 C SHE, 2670 // XHE - ARRAYS TO CALCULATE THE EXC. ENERGY AFTER 80 C ABRASION BY 2671 // THE STATISTICAL HOLE ENERGY MODEL 81 2672 // C--------------------------------------------------------------------- 2673 // 82 C 2674 // 83 C G.S. SHELL EFFECT 2675 // 84 C COMMON /EC2SUB/ ECNZ 2676 // 85 C 2677 // 86 C ECNZ G.S. SHELL EFFECT FOR THE MASSES (IDENTICAL TO ECGNZ) 2678 // 87 2679 // C--------------------------------------------------------------------- 2680 // 2681 2682 G4double MN = 939.5653301; 2683 G4double MP = 938.7829835; 2684 2685 G4AblaDataFile* dataInterface = new G4AblaDataFile(); 2686 if (dataInterface->readData() == true) 2687 { 2688 if (verboseLevel > 0) 2689 { 2690 // G4cout <<"G4Abla: Datafiles read successfully." << G4endl; 2691 } 2692 } 2693 else 2694 { 2695 // G4Exception("ERROR: Failed to read datafiles."); 2696 } 2697 2698 for (G4int z = 0; z < 99; z++) 2699 { // do 30 z = 0,98,1 2700 for (G4int n = 0; n < 154; n++) 2701 { // do 31 n = 0,153,1 2702 ecld->ecfnz[n][z] = 0.e0; 2703 ec2sub->ecnz[n][z] = dataInterface->getEcnz(n, z); 2704 ecld->ecgnz[n][z] = dataInterface->getEcnz(n, z); 2705 ecld->alpha[n][z] = dataInterface->getAlpha(n, z); 2706 ecld->vgsld[n][z] = dataInterface->getVgsld(n, z); 2707 ecld->rms[n][z] = dataInterface->getRms(n, z); 2708 } 2709 } 2710 2711 for (G4int iz = 0; iz < zcolsbeta; iz++) 2712 for (G4int in = 0; in < nrowsbeta; in++) 2713 { 2714 ecld->beta2[in][iz] = dataInterface->getBeta2(in, iz); 2715 ecld->beta4[in][iz] = dataInterface->getBeta4(in, iz); 2716 } 2717 2718 G4double mfrldm[lprows][lpcols]; 2719 // For 2 < Z < 12 we take "experimental" shell corrections instead of 2720 // calculated Read FRLDM tables 2721 for (G4int i = 1; i < lpcols; i++) 2722 { 2723 for (G4int j = 1; j < lprows; j++) 2724 { 2725 if (dataInterface->getMexpID(j, i) == 1) 2726 { 2727 masses->mexpiop[j][i] = 1; 2728 } 2729 else 2730 { 2731 masses->mexpiop[j][i] = 0; 2732 } 2733 // LD masses (even-odd effect is later considered according to Ignatyuk) 2734 if (i == 0 && j == 0) 2735 mfrldm[j][i] = 0.; 2736 else 2737 mfrldm[j][i] = MP * i + MN * j + eflmac(i + j, i, 1, 0); 2738 } 2739 } 2740 2741 for (G4int i = 0; i < lpcols; i++) 2742 for (G4int j = 0; j < lprows; j++) 2743 masses->massexp[j][i] = dataInterface->getMexp(j, i); 2744 2745 G4double e0 = 0.; 2746 for (G4int i = 1; i < lpcols; i++) 2747 { 2748 for (G4int j = 1; j < lprows; j++) 2749 { 2750 masses->bind[j][i] = 0.; 2751 if (masses->mexpiop[j][i] == 1) 2752 { 2753 if (j < 30) 2754 { 2755 2756 ec2sub->ecnz[j][i] = 0.0; 2757 ecld->ecgnz[j][i] = ec2sub->ecnz[j][i]; 2758 masses->bind[j][i] = dataInterface->getMexp(j, i) - MP * i - MN * j; 2759 ecld->vgsld[j][i] = 0.; 2760 2761 e0 = 0.; 2762 } 2763 else 2764 { 2765 // For these nuclei, we take "experimental" ground-state shell 2766 // corrections 2767 // 2768 // Parametrization of CT model by Ignatyuk; note that E0 is shifted to 2769 // correspond to pairing shift in Fermi-gas model (there, energy is 2770 // shifted taking odd-odd nuclei as bassis) 2771 G4double para = 0.; 2772 parite(j + i, ¶); 2773 if (para < 0.0) 2774 { 2775 // e-o, o-e 2776 e0 = 0.285 + 11.17 * std::pow(j + i, -0.464) - 0.390 - 0.00058 * (j + i); 2777 } 2778 else 2779 { 2780 G4double parz = 0.; 2781 parite(i, &parz); 2782 if (parz > 0.0) 2783 { 2784 // e-e 2785 e0 = 22.34 * std::pow(j + i, -0.464) - 0.235; 2786 } 2787 else 2788 { 2789 // o-o 2790 // 2791 // 2792 e0 = 0.0; 2793 } 2794 } 2795 // 2796 if ((j == i) && mod(j, 2) == 1 && mod(i, 2) == 1) 2797 { 2798 e0 = e0 - 30.0 * (1.0 / G4double(j + i)); 2799 } 2800 2801 G4double delta_tot = ec2sub->ecnz[j][i] - ecld->vgsld[j][i]; 2802 ec2sub->ecnz[j][i] = dataInterface->getMexp(j, i) - (mfrldm[j][i] - e0); 2803 2804 ecld->vgsld[j][i] = max(0.0, ec2sub->ecnz[j][i] - delta_tot); 2805 ecld->ecgnz[j][i] = ec2sub->ecnz[j][i]; 2806 2807 } // if j 2808 } // if mexpiop 2809 } 2810 } 2811 // 2812 delete dataInterface; 2813 } 2814 2815 void G4Abla::SetParametersG4(G4int z, G4int a) 2816 { 2817 // A and Z for the target 2818 fiss->at = a; 2819 fiss->zt = z; 2820 2821 // switch-fission.1=on.0=off 2822 fiss->ifis = 1; 2823 2824 // shell+pairing.0-1-2-3 2825 fiss->optshp = 3; 2826 if (fiss->zt < 84 && fiss->zt > 60) 2827 fiss->optshp = 1; 2828 2829 // optemd =0,1 0 no emd, 1 incl. emd 2830 opt->optemd = 1; 2831 // read(10,*,iostat=io) dum(10),optcha 2832 opt->optcha = 1; 2833 2834 // shell+pairing.0-1-2-3 for IMFs 2835 opt->optshpimf = 0; 2836 opt->optimfallowed = 1; 2837 2838 // collective enhancement switched on 1 or off 0 in densn (qr=val or =1.) 2839 fiss->optcol = 1; 2840 if (fiss->zt <= 28) 2841 { 2842 fiss->optcol = 0; 2843 fiss->optshp = 0; 2844 opt->optshpimf = 1; 2845 } 2846 else if (fiss->zt <= 58) 2847 { 2848 fiss->optcol = 0; 2849 fiss->optshp = 1; 2850 opt->optshpimf = 3; 2851 } 2852 // collective enhancement parameters 2853 fiss->ucr = 40.; 2854 fiss->dcr = 10.; 2855 2856 // switch for temperature constant model (CTM) 2857 fiss->optct = 1; 2858 2859 ald->optafan = 0; 2860 2861 // nuclear.viscosity.(beta) 2862 fiss->bet = 4.5; 2863 fiss->bethyp = 28.0; 2864 fiss->optxfis = 3; 2865 2866 // Level density parameters 2867 ald->av = 0.0730; 2868 ald->as = 0.0950; 2869 ald->ak = 0.0000; 2870 2871 // Multi-fragmentation 2872 T_freeze_out_in = -6.5; 2873 } 2874 2875 void G4Abla::SetParameters() 2876 { 2877 /* 2878 C IFIS = INTEGER SWITCH FOR FISSION 2879 C OPTSHP = INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY 2880 C =0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY 2881 C =1 SHELL , NO PAIRING CORRECTION 2882 C =2 PAIRING, NO SHELL CORRECTION 2883 C =3 SHELL AND PAIRING CORRECTION IN MASSES AND ENERGY 2884 C OPTCOL =0,1 COLLECTIVE ENHANCEMENT SWITCHED ON 1 OR OFF 0 IN DENSN 2885 C OPTAFAN=0,1 SWITCH FOR AF/AN = 1 IN DENSNIV 0 AF/AN>1 1 AF/AN=1 2886 C BET = REAL REDUCED FRICTION COEFFICIENT / 10**(+21) S**(-1) 2887 C OPTXFIS= INTEGER 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV 2888 C FISSILITY PARAMETER. 2889 C 2890 C NUCLEAR LEVEL DENSITIES: 2891 C AV = REAL KOEFFICIENTS FOR CALCULATION OF A(TILDE) 2892 C AS = REAL LEVEL DENSITY PARAMETER 2893 C AK = REAL 2894 */ 2895 2896 // switch-fission.1=on.0=off 2897 fiss->ifis = 1; 2898 2899 // shell+pairing.0-1-2-3 2900 fiss->optshp = 3; 2901 if (fiss->zt < 84 && fiss->zt > 56) 2902 fiss->optshp = 1; 2903 2904 // optemd =0,1 0 no emd, 1 incl. emd 2905 opt->optemd = 1; 2906 // read(10,*,iostat=io) dum(10),optcha 2907 opt->optcha = 1; 2908 2909 // shell+pairing.0-1-2-3 for IMFs 2910 opt->optshpimf = 0; 2911 opt->optimfallowed = 1; 2912 2913 // nuclear.viscosity.(beta) 2914 fiss->bet = 4.5; 2915 2916 // collective enhancement switched on 1 or off 0 in densn (qr=val or =1.) 2917 fiss->optcol = 1; 2918 if (fiss->zt <= 56) 2919 { 2920 fiss->optcol = 0; 2921 fiss->optshp = 3; 2922 } 2923 // collective enhancement parameters 2924 fiss->ucr = 40.; 2925 fiss->dcr = 10.; 2926 2927 // switch for temperature constant model (CTM) 2928 fiss->optct = 1; 2929 2930 ald->optafan = 0; 2931 2932 ald->av = 0.0730; 2933 ald->as = 0.0950; 2934 ald->ak = 0.0000; 2935 2936 fiss->optxfis = 3; 2937 2938 // Multi-fragmentation 2939 T_freeze_out_in = -6.5; 2940 } 2941 2942 void G4Abla::mglw(G4double a, G4double z, G4double* el) 2943 { 2944 // MODEL DE LA GOUTTE LIQUIDE DE C. F. WEIZSACKER. 2945 // USUALLY AN OBSOLETE OPTION 2946 2947 G4double xv = 0.0, xs = 0.0, xc = 0.0, xa = 0.0; 2948 2949 if ((a <= 0.01) || (z < 0.01)) 2950 { 2951 (*el) = 1.0e38; 2952 } 2953 else 2954 { 2955 xv = -15.56 * a; 2956 xs = 17.23 * std::pow(a, (2.0 / 3.0)); 2957 2958 if (a > 1.0) 2959 { 2960 xc = 0.7 * z * (z - 1.0) * std::pow((a - 1.0), (-1.e0 / 3.e0)); 2961 } 2962 else 2963 { 2964 xc = 0.0; 2965 } 2966 } 2967 2968 xa = 23.6 * (std::pow((a - 2.0 * z), 2) / a); 2969 (*el) = xv + xs + xc + xa; 2970 return; 2971 } 2972 2973 void G4Abla::mglms(G4double a, G4double z, G4int refopt4, G4double* el) 2974 { 2975 // USING FUNCTION EFLMAC(IA,IZ,0) 2976 // 2977 // REFOPT4 = 0 : WITHOUT MICROSCOPIC CORRECTIONS 2978 // REFOPT4 = 1 : WITH SHELL CORRECTION 2979 // REFOPT4 = 2 : WITH PAIRING CORRECTION 2980 // REFOPT4 = 3 : WITH SHELL- AND PAIRING CORRECTION 2981 2982 // 1839 2983 // C----------------------------------------------------------------------- 2984 // 1840 C A1 LOCAL MASS NUMBER (INTEGER VARIABLE OF A) 2985 // 1841 C Z1 LOCAL NUCLEAR CHARGE (INTEGER VARIABLE OF Z) 2986 // 1842 C REFOPT4 OPTION, SPECIFYING THE MASS FORMULA (SEE 2987 // ABOVE) 1843 C A MASS NUMBER 1844 C Z 2988 // NUCLEAR CHARGE 1845 C DEL PAIRING CORRECTION 1846 2989 // C EL BINDING ENERGY 1847 C ECNZ( , ) TABLE OF 2990 // SHELL CORRECTIONS 1848 2991 // C----------------------------------------------------------------------- 2992 // 1849 C 2993 G4int a1 = idnint(a); 2994 G4int z1 = idnint(z); 2995 G4int n1 = a1 - z1; 2996 2997 if ((a1 <= 0) || (z1 <= 0) || ((a1 - z1) <= 0)) 2998 { // then 2999 // modif pour recuperer une masse p et n correcte: 3000 (*el) = 1.e38; 3001 return; 3002 // goto mglms50; 3003 } 3004 else 3005 { 3006 // binding energy incl. pairing contr. is calculated from 3007 // function eflmac 3008 (*el) = eflmac(a1, z1, 0, refopt4); 3009 3010 if (refopt4 > 0) 3011 { 3012 if (refopt4 != 2) 3013 { 3014 (*el) = (*el) + ec2sub->ecnz[a1 - z1][z1]; 3015 } 3016 } 3017 3018 if (z1 >= 90) 3019 { 3020 if (n1 <= 145) 3021 { 3022 (*el) = (*el) + (12.552 - 0.1436 * z1); 3023 } 3024 else 3025 { 3026 if (n1 > 145 && n1 <= 152) 3027 { 3028 (*el) = (*el) + ((152.4 - 1.77 * z1) + (-0.972 + 0.0113 * z1) * n1); 3029 } 3030 } 3031 } 3032 } 3033 return; 3034 } 3035 3036 G4double G4Abla::spdef(G4int a, G4int z, G4int optxfis) 3037 { 3038 3039 // INPUT: A,Z,OPTXFIS MASS AND CHARGE OF A NUCLEUS, 3040 // OPTION FOR FISSILITY 3041 // OUTPUT: SPDEF 3042 3043 // ALPHA2 SADDLE POINT DEF. COHEN&SWIATECKI ANN.PHYS. 22 (1963) 406 3044 // RANGING FROM FISSILITY X=0.30 TO X=1.00 IN STEPS OF 0.02 3045 3046 G4int index = 0; 3047 G4double x = 0.0, v = 0.0, dx = 0.0; 3048 3049 const G4int alpha2Size = 37; 3050 // The value 0.0 at alpha2[0] added by PK. 3051 G4double alpha2[alpha2Size] = { 0.0, 2.5464e0, 2.4944e0, 2.4410e0, 2.3915e0, 2.3482e0, 2.3014e0, 2.2479e0, 3052 2.1982e0, 2.1432e0, 2.0807e0, 2.0142e0, 1.9419e0, 1.8714e0, 1.8010e0, 1.7272e0, 3053 1.6473e0, 1.5601e0, 1.4526e0, 1.3164e0, 1.1391e0, 0.9662e0, 0.8295e0, 0.7231e0, 3054 0.6360e0, 0.5615e0, 0.4953e0, 0.4354e0, 0.3799e0, 0.3274e0, 0.2779e0, 0.2298e0, 3055 0.1827e0, 0.1373e0, 0.0901e0, 0.0430e0, 0.0000e0 }; 3056 3057 dx = 0.02; 3058 x = fissility(a, z, 0, 0., 0., optxfis); 3059 3060 v = (x - 0.3) / dx + 1.0; 3061 index = idnint(v); 3062 3063 if (index < 1) 3064 { 3065 return (alpha2[1]); 3066 } 3067 3068 if (index == 36) 3069 { 3070 return (alpha2[36]); 3071 } 3072 else 3073 { 3074 return (alpha2[index] + (alpha2[index + 1] - alpha2[index]) / dx * (x - (0.3e0 + dx * (index - 1)))); 3075 } 3076 3077 return alpha2[0]; // The algorithm is not supposed to reach this point. 3078 } 3079 3080 G4double G4Abla::fissility(G4int a, G4int z, G4int ny, G4double sn, G4double slam, G4int optxfis) 3081 { 3082 // CALCULATION OF FISSILITY PARAMETER 3083 // 3084 // INPUT: A,Z INTEGER MASS & CHARGE OF NUCLEUS 3085 // OPTXFIS = 0 : MYERS, SWIATECKI 3086 // 1 : DAHLINGER 3087 // 2 : ANDREYEV 3088 3089 G4double aa = 0.0, zz = 0.0, i = 0.0, z2a, C_S, R, W, G, G1, G2, A_CC; 3090 G4double fissilityResult = 0.0; 3091 3092 aa = G4double(a); 3093 zz = G4double(z); 3094 i = G4double(a - 2 * z) / aa; 3095 z2a = zz * zz / aa - ny * (1115. - 939. + sn - slam) / (0.7053 * std::pow(a, 2. / 3.)); 3096 3097 // myers & swiatecki droplet modell 3098 if (optxfis == 0) 3099 { // then 3100 fissilityResult = std::pow(zz, 2) / aa / 50.8830e0 / (1.0e0 - 1.7826e0 * std::pow(i, 2)); 3101 } 3102 3103 if (optxfis == 1) 3104 { 3105 // dahlinger fit: 3106 fissilityResult = std::pow(zz, 2) / aa * 3107 std::pow((49.22e0 * (1.e0 - 0.3803e0 * std::pow(i, 2) - 20.489e0 * std::pow(i, 4))), (-1)); 3108 } 3109 3110 if (optxfis == 2) 3111 { 3112 // dubna fit: 3113 fissilityResult = std::pow(zz, 2) / aa / (48.e0 * (1.e0 - 17.22e0 * std::pow(i, 4))); 3114 } 3115 3116 if (optxfis == 3) 3117 { 3118 // Fissiilty is calculated according to FRLDM, see Sierk, PRC 1984. 3119 C_S = 21.13 * (1.0 - 2.3 * i * i); 3120 R = 1.16 * std::pow(aa, 1.0 / 3.0); 3121 W = 0.704 / R; 3122 G1 = 1.0 - 15.0 / 8.0 * W + 21.0 / 8.0 * W * W * W; 3123 G2 = 1.0 + 9.0 / 2.0 * W + 7.0 * W * W + 7.0 / 2.0 * W * W * W; 3124 G = 1.0 - 5.0 * W * W * (G1 - 3.0 / 4.0 * G2 * std::exp(-2.0 / W)); 3125 A_CC = 3.0 / 5.0 * 1.44 * G / 1.16; 3126 fissilityResult = z2a * A_CC / (2.0 * C_S); 3127 } 3128 3129 if (fissilityResult > 1.0) 3130 { 3131 fissilityResult = 1.0; 3132 } 3133 3134 if (fissilityResult < 0.0) 3135 { 3136 fissilityResult = 0.0; 3137 } 3138 3139 return fissilityResult; 3140 } 3141 3142 void G4Abla::evapora(G4double zprf, 3143 G4double aprf, 3144 G4double* ee_par, 3145 G4double jprf_par, 3146 G4double* zf_par, 3147 G4double* af_par, 3148 G4double* mtota_par, 3149 G4double* vleva_par, 3150 G4double* vxeva_par, 3151 G4double* vyeva_par, 3152 G4int* ff_par, 3153 G4int* fimf_par, 3154 G4double* fzimf, 3155 G4double* faimf, 3156 G4double* tkeimf_par, 3157 G4double* jprfout, 3158 G4int* inttype_par, 3159 G4int* inum_par, 3160 G4double EV_TEMP[indexpart][6], 3161 G4int* iev_tab_temp_par, 3162 G4int* NbLam0_par) 3163 { 3164 G4double zf = zprf; 3165 G4double af = aprf; 3166 G4double ee = (*ee_par); 3167 G4double jprf = dint(jprf_par); 3168 G4double mtota = (*mtota_par); 3169 G4double vleva = 0.; 3170 G4double vxeva = 0.; 3171 G4double vyeva = 0.; 3172 G4int ff = (*ff_par); 3173 G4int fimf = (*fimf_par); 3174 G4double tkeimf = (*tkeimf_par); 3175 G4int inttype = (*inttype_par); 3176 G4int inum = (*inum_par); 3177 G4int NbLam0 = (*NbLam0_par); 3178 3179 // 533 C 3180 // 534 C INPUT: 3181 // 535 C 3182 // 536 C ZPRF, APRF, EE(EE IS MODIFIED!), JPRF 3183 // 537 C 3184 // 538 C PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS 3185 // 539 C COMMON /ABRAMAIN/ 3186 // AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC, 540 C R_0,R_P,R_T, 3187 // IMAX,IRNDM,PI, 541 C BFPRO,SNPRO,SPPRO,SHELL 3188 // 542 C 3189 // 543 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES 3190 // 544 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C 3191 // 545 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC. 3192 // 546 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION 3193 // 547 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII 3194 // 548 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141... 3195 // 549 C BFPRO - FISSION BARRIER OF THE PROJECTILE 3196 // 550 C SNPRO - NEUTRON SEPARATION ENERGY OF THE 3197 // PROJECTILE 551 C SPPRO - PROTON " " " " " 3198 // 552 C SHELL - GROUND STATE SHELL CORRECTION 3199 // 553 C 3200 // 554 3201 // C--------------------------------------------------------------------- 3202 // 555 C FISSION BARRIERS 3203 // 556 C COMMON /FB/ EFA 3204 // 557 C EFA - ARRAY OF FISSION BARRIERS 3205 // 558 3206 // C--------------------------------------------------------------------- 3207 // 559 C OUTPUT: 3208 // 560 C ZF, AF, MTOTA, PLEVA, PTEVA, FF, INTTYPE, INUM 3209 // 561 C 3210 // 562 C ZF,AF - CHARGE AND MASS OF FINAL FRAGMENT AFTER 3211 // EVAPORATION 563 C MTOTA _ NUMBER OF EVAPORATED ALPHAS 564 C 3212 // PLEVA,PXEVA,PYEVA - MOMENTUM RECOIL BY EVAPORATION 565 C INTTYPE - 3213 // TYPE OF REACTION 0/1 NUCLEAR OR ELECTROMAGNETIC 566 C FF - 0/1 3214 // NO FISSION / FISSION EVENT 567 C INUM - EVENTNUMBER 568 C 3215 // ____________________________________________________________________ 569 3216 // C / 570 C / CALCUL DE LA MASSE ET CHARGE FINALES D'UNE CHAINE 3217 // D'EVAPORATION 571 C / 3218 // 572 C / PROCEDURE FOR CALCULATING THE FINAL MASS AND CHARGE VALUES 3219 // OF A 3220 // 573 C / SPECIFIC EVAPORATION CHAIN, STARTING POINT DEFINED BY 3221 // (APRF, ZPRF, 574 C / EE) 575 C / On ajoute les 3 3222 // composantes de l'impulsion (PXEVA,PYEVA,PLEVA) 3223 // 576 C / (actuellement PTEVA n'est pas correct; mauvaise 3224 // norme...) 577 C 3225 // /____________________________________________________________________ 3226 // 578 C 3227 // 612 C 3228 // 613 3229 // C----------------------------------------------------------------------- 3230 // 614 C IRNDM DUMMY ARGUMENT FOR RANDOM-NUMBER 3231 // FUNCTION 615 C SORTIE LOCAL HELP VARIABLE TO END THE 3232 // EVAPORATION CHAIN 616 C ZF NUCLEAR CHARGE OF THE 3233 // FRAGMENT 617 C ZPRF NUCLEAR CHARGE OF THE 3234 // PREFRAGMENT 618 C AF MASS NUMBER OF THE FRAGMENT 619 3235 // C APRF MASS NUMBER OF THE PREFRAGMENT 3236 // 620 C EPSILN ENERGY BURNED IN EACH EVAPORATION STEP 3237 // 621 C MALPHA LOCAL MASS CONTRIBUTION TO MTOTA IN EACH 3238 // EVAPORATION 622 C STEP 623 C EE 3239 // EXCITATION ENERGY (VARIABLE) 624 C PROBP PROTON 3240 // EMISSION PROBABILITY 625 C PROBN NEUTRON EMISSION 3241 // PROBABILITY 626 C PROBA ALPHA-PARTICLE EMISSION 3242 // PROBABILITY 627 C PTOTL TOTAL EMISSION PROBABILITY 628 3243 // C E LOWEST PARTICLE-THRESHOLD ENERGY 629 C SN 3244 // NEUTRON SEPARATION ENERGY 630 C SBP PROTON 3245 // SEPARATION ENERGY PLUS EFFECTIVE COULOMB 631 C BARRIER 632 C SBA 3246 // ALPHA-PARTICLE SEPARATION ENERGY PLUS EFFECTIVE 633 C COULOMB 3247 // BARRIER 634 C BP EFFECTIVE PROTON COULOMB BARRIER 3248 // 635 C BA EFFECTIVE ALPHA COULOMB BARRIER 3249 // 636 C MTOTA TOTAL MASS OF THE EVAPORATED ALPHA 3250 // PARTICLES 637 C X UNIFORM RANDOM NUMBER FOR 3251 // NUCLEAR CHARGE 3252 // 638 C AMOINS LOCAL MASS NUMBER OF EVAPORATED PARTICLE 3253 // 639 C ZMOINS LOCAL NUCLEAR CHARGE OF EVAPORATED PARTICLE 3254 // 640 C ECP KINETIC ENERGY OF PROTON WITHOUT COULOMB 3255 // 641 C REPULSION 3256 // 642 C ECN KINETIC ENERGY OF NEUTRON 3257 // 643 C ECA KINETIC ENERGY OF ALPHA PARTICLE WITHOUT 3258 // COULOMB 644 C REPULSION 645 C PLEVA 3259 // TRANSVERSAL RECOIL MOMENTUM OF EVAPORATION 646 C PTEVA LONGITUDINAL 3260 // RECOIL MOMENTUM OF EVAPORATION 647 C FF FISSION 3261 // FLAG 648 C INTTYPE INTERACTION TYPE FLAG 3262 // 649 C RNDX RECOIL MOMENTUM IN X-DIRECTION IN A 3263 // SINGLE STEP 650 C RNDY RECOIL MOMENTUM IN Y-DIRECTION 3264 // IN A SINGLE STEP 651 C RNDZ RECOIL MOMENTUM IN 3265 // Z-DIRECTION IN A SINGLE STEP 3266 // 652 C RNDN NORMALIZATION OF RECOIL MOMENTUM FOR 3267 // EACH STEP 653 3268 // C----------------------------------------------------------------------- 3269 // 654 C 3270 // 3271 G4double epsiln = 0.0, probp = 0.0, probd = 0.0, probt = 0.0, probn = 0.0, probhe = 0.0, proba = 0.0, probg = 0.0, 3272 probimf = 0.0, problamb0 = 0.0, ptotl = 0.0, e = 0.0, tcn = 0.0; 3273 G4double sn = 0.0, sbp = 0.0, sbd = 0.0, sbt = 0.0, sbhe = 0.0, sba = 0.0, x = 0.0, amoins = 0.0, zmoins = 0.0, 3274 sp = 0.0, sd = 0.0, st = 0.0, she = 0.0, sa = 0.0, slamb0 = 0.0; 3275 G4double ecn = 0.0, ecp = 0.0, ecd = 0.0, ect = 0.0, eche = 0.0, eca = 0.0, ecg = 0.0, eclamb0 = 0.0, bp = 0.0, 3276 bd = 0.0, bt = 0.0, bhe = 0.0, ba = 0.0; 3277 G4double zimf = 0.0, aimf = 0.0, bimf = 0.0, sbimf = 0.0, timf = 0.0; 3278 G4int itest = 0, sortie = 0; 3279 G4double probf = 0.0; 3280 G4double ctet1 = 0.0, stet1 = 0.0, phi1 = 0.0; 3281 G4double rnd = 0.0; 3282 G4double ef = 0.0; 3283 G4double ts1 = 0.0; 3284 G4int fgamma = 0, gammadecay = 0, flamb0decay = 0; 3285 G4double pc = 0.0, malpha = 0.0; 3286 G4double jprfn = 0.0, jprfp = 0.0, jprfd = 0.0, jprft = 0.0, jprfhe = 0.0, jprfa = 0.0, jprflamb0 = 0.0; 3287 G4double tsum = 0.0; 3288 G4int twon; 3289 3290 const G4double c = 29.9792458; 3291 const G4double mu = 931.494; 3292 const G4double mu2 = 931.494 * 931.494; 3293 3294 G4double pleva = 0.0; 3295 G4double pxeva = 0.0; 3296 G4double pyeva = 0.0; 3297 G4int IEV_TAB_TEMP = 0; 3298 3299 for (G4int I1 = 0; I1 < indexpart; I1++) 3300 for (G4int I2 = 0; I2 < 6; I2++) 3301 EV_TEMP[I1][I2] = 0.0; 3302 // 3303 ff = 0; 3304 itest = 0; 3305 // 3306 evapora10: 3307 // 3308 // calculation of the probabilities for the different decay channels 3309 // plus separation energies and kinetic energies of the particles 3310 // 3311 if (ee < 0. || zf < 3.) 3312 goto evapora100; 3313 direct(zf, 3314 af, 3315 ee, 3316 jprf, 3317 &probp, 3318 &probd, 3319 &probt, 3320 &probn, 3321 &probhe, 3322 &proba, 3323 &probg, 3324 &probimf, 3325 &probf, 3326 &problamb0, 3327 &ptotl, 3328 &sn, 3329 &sbp, 3330 &sbd, 3331 &sbt, 3332 &sbhe, 3333 &sba, 3334 &slamb0, 3335 &ecn, 3336 &ecp, 3337 &ecd, 3338 &ect, 3339 &eche, 3340 &eca, 3341 &ecg, 3342 &eclamb0, 3343 &bp, 3344 &bd, 3345 &bt, 3346 &bhe, 3347 &ba, 3348 &sp, 3349 &sd, 3350 &st, 3351 &she, 3352 &sa, 3353 &ef, 3354 &ts1, 3355 inttype, 3356 inum, 3357 itest, 3358 &sortie, 3359 &tcn, 3360 &jprfn, 3361 &jprfp, 3362 &jprfd, 3363 &jprft, 3364 &jprfhe, 3365 &jprfa, 3366 &jprflamb0, 3367 &tsum, 3368 NbLam0); 3369 // 3370 // HERE THE FINAL STEPS OF THE EVAPORATION ARE CALCULATED 3371 // 3372 if (ptotl == 0.0) 3373 goto evapora100; 3374 3375 e = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); 3376 3377 if (e > 1e30) 3378 std::cout << "ERROR AT THE EXIT OF EVAPORA,E>1.D30,AF=" << af << " ZF=" << zf << std::endl; 3379 3380 if (sortie == 1) 3381 { 3382 if (probn != 0.0) 3383 { 3384 amoins = 1.0; 3385 zmoins = 0.0; 3386 epsiln = sn + ecn; 3387 pc = std::sqrt(std::pow((1.0 + (ecn) / 9.3956e2), 2.) - 1.0) * 9.3956e2; 3388 malpha = 0.0; 3389 fgamma = 0; 3390 fimf = 0; 3391 flamb0decay = 0; 3392 gammadecay = 0; 3393 } 3394 else if (probp != 0.0) 3395 { 3396 amoins = 1.0; 3397 zmoins = 1.0; 3398 epsiln = sp + ecp; 3399 pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2.) - 1.0) * 9.3827e2; 3400 malpha = 0.0; 3401 fgamma = 0; 3402 fimf = 0; 3403 flamb0decay = 0; 3404 gammadecay = 0; 3405 } 3406 else if (probd != 0.0) 3407 { 3408 amoins = 2.0; 3409 zmoins = 1.0; 3410 epsiln = sd + ecd; 3411 pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; 3412 malpha = 0.0; 3413 fgamma = 0; 3414 fimf = 0; 3415 flamb0decay = 0; 3416 gammadecay = 0; 3417 } 3418 else if (probt != 0.0) 3419 { 3420 amoins = 3.0; 3421 zmoins = 1.0; 3422 epsiln = st + ect; 3423 pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; 3424 malpha = 0.0; 3425 fgamma = 0; 3426 fimf = 0; 3427 flamb0decay = 0; 3428 gammadecay = 0; 3429 } 3430 else if (probhe != 0.0) 3431 { 3432 amoins = 3.0; 3433 zmoins = 2.0; 3434 epsiln = she + eche; 3435 pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; 3436 malpha = 0.0; 3437 fgamma = 0; 3438 fimf = 0; 3439 flamb0decay = 0; 3440 gammadecay = 0; 3441 } 3442 else 3443 { 3444 if (proba != 0.0) 3445 { 3446 amoins = 4.0; 3447 zmoins = 2.0; 3448 epsiln = sa + eca; 3449 pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; 3450 malpha = 4.0; 3451 fgamma = 0; 3452 fimf = 0; 3453 flamb0decay = 0; 3454 gammadecay = 0; 3455 } 3456 } 3457 goto direct99; 3458 } 3459 3460 // here the normal evaporation cascade starts 3461 3462 // random number for the evaporation 3463 x = G4AblaRandom::flat() * ptotl; 3464 3465 itest = 0; 3466 if (x < proba) 3467 { 3468 // alpha evaporation 3469 amoins = 4.0; 3470 zmoins = 2.0; 3471 epsiln = sa + eca; 3472 pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; 3473 malpha = 4.0; 3474 fgamma = 0; 3475 fimf = 0; 3476 ff = 0; 3477 flamb0decay = 0; 3478 gammadecay = 0; 3479 jprf = jprfa; 3480 } 3481 else if (x < proba + probhe) 3482 { 3483 // He3 evaporation 3484 amoins = 3.0; 3485 zmoins = 2.0; 3486 epsiln = she + eche; 3487 pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; 3488 malpha = 0.0; 3489 fgamma = 0; 3490 fimf = 0; 3491 ff = 0; 3492 flamb0decay = 0; 3493 gammadecay = 0; 3494 jprf = jprfhe; 3495 } 3496 else if (x < proba + probhe + probt) 3497 { 3498 // triton evaporation 3499 amoins = 3.0; 3500 zmoins = 1.0; 3501 epsiln = st + ect; 3502 pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; 3503 malpha = 0.0; 3504 fgamma = 0; 3505 fimf = 0; 3506 ff = 0; 3507 flamb0decay = 0; 3508 gammadecay = 0; 3509 jprf = jprft; 3510 } 3511 else if (x < proba + probhe + probt + probd) 3512 { 3513 // deuteron evaporation 3514 amoins = 2.0; 3515 zmoins = 1.0; 3516 epsiln = sd + ecd; 3517 pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; 3518 malpha = 0.0; 3519 fgamma = 0; 3520 fimf = 0; 3521 ff = 0; 3522 flamb0decay = 0; 3523 gammadecay = 0; 3524 jprf = jprfd; 3525 } 3526 else if (x < proba + probhe + probt + probd + probp) 3527 { 3528 // proton evaporation 3529 amoins = 1.0; 3530 zmoins = 1.0; 3531 epsiln = sp + ecp; 3532 pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2) - 1.0) * 9.3827e2; 3533 malpha = 0.0; 3534 fgamma = 0; 3535 fimf = 0; 3536 ff = 0; 3537 flamb0decay = 0; 3538 gammadecay = 0; 3539 jprf = jprfp; 3540 } 3541 else if (x < proba + probhe + probt + probd + probp + probn) 3542 { 3543 // neutron evaporation 3544 amoins = 1.0; 3545 zmoins = 0.0; 3546 epsiln = sn + ecn; 3547 pc = std::sqrt(std::pow((1.0 + (ecn) / 9.3956e2), 2.) - 1.0) * 9.3956e2; 3548 malpha = 0.0; 3549 fgamma = 0; 3550 fimf = 0; 3551 ff = 0; 3552 flamb0decay = 0; 3553 gammadecay = 0; 3554 jprf = jprfn; 3555 } 3556 else if (x < proba + probhe + probt + probd + probp + probn + problamb0) 3557 { 3558 // lambda0 evaporation 3559 amoins = 1.0; 3560 zmoins = 0.0; 3561 epsiln = slamb0 + eclamb0; 3562 pc = std::sqrt(std::pow((1.0 + (eclamb0) / 11.1568e2), 2.) - 1.0) * 11.1568e2; 3563 malpha = 0.0; 3564 fgamma = 0; 3565 fimf = 0; 3566 ff = 0; 3567 flamb0decay = 1; 3568 opt->nblan0 = opt->nblan0 - 1; 3569 NbLam0 = NbLam0 - 1; 3570 gammadecay = 0; 3571 jprf = jprflamb0; 3572 } 3573 else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg) 3574 { 3575 // gamma evaporation 3576 amoins = 0.0; 3577 zmoins = 0.0; 3578 epsiln = ecg; 3579 pc = ecg; 3580 malpha = 0.0; 3581 flamb0decay = 0; 3582 gammadecay = 1; 3583 // Next IF command is to shorten the calculations when gamma-emission is the 3584 // only possible channel 3585 if (probp == 0.0 && probn == 0.0 && probd == 0.0 && probt == 0.0 && proba == 0.0 && probhe == 0.0 && 3586 problamb0 == 0.0 && probimf == 0.0 && probf == 0.0) 3587 fgamma = 1; 3588 fimf = 0; 3589 ff = 0; 3590 } 3591 else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg + probimf) 3592 { 3593 // imf evaporation 3594 // AIMF and ZIMF obtained from complete procedure (integration over all 3595 // possible Gamma(IMF) and then randomly picked 3596 3597 G4int iloop = 0; 3598 dir1973: 3599 imf(af, zf, tcn, ee, &zimf, &aimf, &bimf, &sbimf, &timf, jprf); 3600 iloop++; 3601 if (iloop > 100) 3602 std::cout << "Problem in EVAPORA: IMF called > 100 times" << std::endl; 3603 if (zimf >= (zf - 2.0)) 3604 goto dir1973; 3605 if (zimf > zf / 2.0) 3606 { 3607 zimf = zf - zimf; 3608 aimf = af - aimf; 3609 } 3610 // These cases should in principle never happen 3611 if (zimf == 0.0 || aimf == 0.0 || sbimf > ee) 3612 std::cout << "warning: Look in EVAPORA CALL IMF" << std::endl; 3613 3614 // I sample the total kinetic energy consumed by the system of two nuclei 3615 // from the distribution determined with the temperature at saddle point 3616 // TKEIMF is the kinetic energy in the centre of mass of IMF and its partner 3617 3618 G4int ii = 0; 3619 dir1235: 3620 tkeimf = fmaxhaz(timf); 3621 ii++; 3622 if (ii > 100) 3623 { 3624 tkeimf = min(2.0 * timf, ee - sbimf); 3625 goto dir1000; 3626 } 3627 if (tkeimf <= 0.0) 3628 goto dir1235; 3629 if (tkeimf > (ee - sbimf) && timf > 0.5) 3630 goto dir1235; 3631 dir1000: 3632 tkeimf = tkeimf + bimf; 3633 3634 amoins = aimf; 3635 zmoins = zimf; 3636 epsiln = (sbimf - bimf) + tkeimf; 3637 pc = 0.0; 3638 malpha = 0.0; 3639 fgamma = 0; 3640 fimf = 1; 3641 ff = 0; 3642 flamb0decay = 0; 3643 gammadecay = 0; 3644 } 3645 else 3646 { 3647 // fission 3648 // in case of fission-events the fragment nucleus is the mother nucleus 3649 // before fission occurs with excitation energy above the fis.- barrier. 3650 // fission fragment mass distribution is calulated in subroutine fisdis 3651 3652 amoins = 0.0; 3653 zmoins = 0.0; 3654 epsiln = ef; 3655 // 3656 malpha = 0.0; 3657 pc = 0.0; 3658 ff = 1; 3659 fimf = 0; 3660 fgamma = 0; 3661 flamb0decay = 0; 3662 gammadecay = 0; 3663 } 3664 // 3665 direct99: 3666 if (ee <= 0.01) 3667 ee = 0.01; 3668 // Davide Mancusi (DM) - 2010 3669 if (gammadecay == 1 && ee < (epsiln + 0.010)) 3670 { 3671 epsiln = ee - 0.010; 3672 // fgamma = 1; 3673 } 3674 3675 if (epsiln < 0.0) 3676 { 3677 std::cout << "***WARNING epsilon<0***" << std::endl; 3678 // epsiln=0.; 3679 // PRINT*,IDECAYMODE,IDNINT(AF),IDNINT(ZF),EE,EPSILN 3680 } 3681 // calculation of the daughter nucleus 3682 af = af - amoins; 3683 zf = zf - zmoins; 3684 ee = ee - epsiln; 3685 if (ee <= 0.01) 3686 ee = 0.01; 3687 mtota = mtota + malpha; 3688 3689 // if(amoins==2 && zmoins==0)std::cout << ee << std::endl; 3690 3691 secondneutron: 3692 if (amoins == 2 && zmoins == 0) 3693 { 3694 twon = 1; 3695 amoins = 1; 3696 } 3697 else 3698 { 3699 twon = 0; 3700 } 3701 3702 // Determination of x,y,z components of momentum from known emission momentum 3703 // PC 3704 if (ff == 0 && fimf == 0) 3705 { 3706 // 3707 if (flamb0decay == 1) 3708 { 3709 EV_TEMP[IEV_TAB_TEMP][0] = 0.; 3710 EV_TEMP[IEV_TAB_TEMP][1] = -2; 3711 EV_TEMP[IEV_TAB_TEMP][5] = 1.; 3712 } 3713 else 3714 { 3715 EV_TEMP[IEV_TAB_TEMP][0] = zmoins; 3716 EV_TEMP[IEV_TAB_TEMP][1] = amoins; 3717 EV_TEMP[IEV_TAB_TEMP][5] = 0.; 3718 } 3719 rnd = G4AblaRandom::flat(); 3720 ctet1 = 2.0 * rnd - 1.0; // z component: uniform probability between -1 and 1 3721 stet1 = std::sqrt(1.0 - std::pow(ctet1, 2)); // component perpendicular to z 3722 rnd = G4AblaRandom::flat(); 3723 phi1 = rnd * 2.0 * 3.141592654; // angle in x-y plane: uniform probability 3724 // between 0 and 2*pi 3725 G4double xcv = stet1 * std::cos(phi1); // x component 3726 G4double ycv = stet1 * std::sin(phi1); // y component 3727 G4double zcv = ctet1; // z component 3728 // In the CM system 3729 if (gammadecay == 0) 3730 { 3731 // Light particle 3732 G4double ETOT_LP = std::sqrt(pc * pc + amoins * amoins * mu2); 3733 if (flamb0decay == 1) 3734 ETOT_LP = std::sqrt(pc * pc + 1115.683 * 1115.683); 3735 EV_TEMP[IEV_TAB_TEMP][2] = c * pc * xcv / ETOT_LP; 3736 EV_TEMP[IEV_TAB_TEMP][3] = c * pc * ycv / ETOT_LP; 3737 EV_TEMP[IEV_TAB_TEMP][4] = c * pc * zcv / ETOT_LP; 3738 } 3739 else 3740 { 3741 // gamma ray 3742 EV_TEMP[IEV_TAB_TEMP][2] = pc * xcv; 3743 EV_TEMP[IEV_TAB_TEMP][3] = pc * ycv; 3744 EV_TEMP[IEV_TAB_TEMP][4] = pc * zcv; 3745 } 3746 G4double VXOUT = 0., VYOUT = 0., VZOUT = 0.; 3747 lorentz_boost(vxeva, 3748 vyeva, 3749 vleva, 3750 EV_TEMP[IEV_TAB_TEMP][2], 3751 EV_TEMP[IEV_TAB_TEMP][3], 3752 EV_TEMP[IEV_TAB_TEMP][4], 3753 &VXOUT, 3754 &VYOUT, 3755 &VZOUT); 3756 EV_TEMP[IEV_TAB_TEMP][2] = VXOUT; 3757 EV_TEMP[IEV_TAB_TEMP][3] = VYOUT; 3758 EV_TEMP[IEV_TAB_TEMP][4] = VZOUT; 3759 // Heavy residue 3760 if (gammadecay == 0) 3761 { 3762 G4double v2 = std::pow(EV_TEMP[IEV_TAB_TEMP][2], 2.) + std::pow(EV_TEMP[IEV_TAB_TEMP][3], 2.) + 3763 std::pow(EV_TEMP[IEV_TAB_TEMP][4], 2.); 3764 G4double gamma = 1.0 / std::sqrt(1.0 - v2 / (c * c)); 3765 G4double etot_lp = amoins * mu * gamma; 3766 pxeva = pxeva - EV_TEMP[IEV_TAB_TEMP][2] * etot_lp / c; 3767 pyeva = pyeva - EV_TEMP[IEV_TAB_TEMP][3] * etot_lp / c; 3768 pleva = pleva - EV_TEMP[IEV_TAB_TEMP][4] * etot_lp / c; 3769 } 3770 else 3771 { 3772 // in case of gammas, EV_TEMP contains momentum components and not 3773 // velocity 3774 pxeva = pxeva - EV_TEMP[IEV_TAB_TEMP][2]; 3775 pyeva = pyeva - EV_TEMP[IEV_TAB_TEMP][3]; 3776 pleva = pleva - EV_TEMP[IEV_TAB_TEMP][4]; 3777 } 3778 G4double pteva = std::sqrt(pxeva * pxeva + pyeva * pyeva); 3779 // To be checked: 3780 G4double etot = std::sqrt(pleva * pleva + pteva * pteva + af * af * mu2); 3781 vxeva = c * pxeva / etot; // recoil velocity components of residue due to evaporation 3782 vyeva = c * pyeva / etot; 3783 vleva = c * pleva / etot; 3784 IEV_TAB_TEMP = IEV_TAB_TEMP + 1; 3785 } 3786 3787 if (twon == 1) 3788 { 3789 goto secondneutron; 3790 } 3791 3792 // condition for end of evaporation 3793 if (zf < 3. || (ff == 1) || (fgamma == 1) || (fimf == 1)) 3794 { 3795 goto evapora100; 3796 } 3797 goto evapora10; 3798 3799 evapora100: 3800 (*zf_par) = zf; 3801 (*af_par) = af; 3802 (*ee_par) = ee; 3803 (*faimf) = aimf; 3804 (*fzimf) = zimf; 3805 (*jprfout) = jprf; 3806 (*tkeimf_par) = tkeimf; 3807 (*mtota_par) = mtota; 3808 (*vleva_par) = vleva; 3809 (*vxeva_par) = vxeva; 3810 (*vyeva_par) = vyeva; 3811 (*ff_par) = ff; 3812 (*fimf_par) = fimf; 3813 (*inttype_par) = inttype; 3814 (*iev_tab_temp_par) = IEV_TAB_TEMP; 3815 (*inum_par) = inum; 3816 (*NbLam0_par) = NbLam0; 3817 return; 3818 } 3819 3820 void G4Abla::direct(G4double zprf, 3821 G4double a, 3822 G4double ee, 3823 G4double jprf, 3824 G4double* probp_par, 3825 G4double* probd_par, 3826 G4double* probt_par, 3827 G4double* probn_par, 3828 G4double* probhe_par, 3829 G4double* proba_par, 3830 G4double* probg_par, 3831 G4double* probimf_par, 3832 G4double* probf_par, 3833 G4double* problamb0_par, 3834 G4double* ptotl_par, 3835 G4double* sn_par, 3836 G4double* sbp_par, 3837 G4double* sbd_par, 3838 G4double* sbt_par, 3839 G4double* sbhe_par, 3840 G4double* sba_par, 3841 G4double* slamb0_par, 3842 G4double* ecn_par, 3843 G4double* ecp_par, 3844 G4double* ecd_par, 3845 G4double* ect_par, 3846 G4double* eche_par, 3847 G4double* eca_par, 3848 G4double* ecg_par, 3849 G4double* eclamb0_par, 3850 G4double* bp_par, 3851 G4double* bd_par, 3852 G4double* bt_par, 3853 G4double* bhe_par, 3854 G4double* ba_par, 3855 G4double* sp_par, 3856 G4double* sd_par, 3857 G4double* st_par, 3858 G4double* she_par, 3859 G4double* sa_par, 3860 G4double* ef_par, 3861 G4double* ts1_par, 3862 G4int, 3863 G4int inum, 3864 G4int itest, 3865 G4int* sortie, 3866 G4double* tcn, 3867 G4double* jprfn_par, 3868 G4double* jprfp_par, 3869 G4double* jprfd_par, 3870 G4double* jprft_par, 3871 G4double* jprfhe_par, 3872 G4double* jprfa_par, 3873 G4double* jprflamb0_par, 3874 G4double* tsum_par, 3875 G4int NbLam0) 3876 { 3877 G4double probp = (*probp_par); 3878 G4double probd = (*probd_par); 3879 G4double probt = (*probt_par); 3880 G4double probn = (*probn_par); 3881 G4double probhe = (*probhe_par); 3882 G4double proba = (*proba_par); 3883 G4double probg = (*probg_par); 3884 G4double probimf = (*probimf_par); 3885 G4double probf = (*probf_par); 3886 G4double problamb0 = (*problamb0_par); 3887 G4double ptotl = (*ptotl_par); 3888 G4double sn = (*sn_par); 3889 G4double sp = (*sp_par); 3890 G4double sd = (*sd_par); 3891 G4double st = (*st_par); 3892 G4double she = (*she_par); 3893 G4double sa = (*sa_par); 3894 G4double slamb0 = 0.0; 3895 G4double sbp = (*sbp_par); 3896 G4double sbd = (*sbd_par); 3897 G4double sbt = (*sbt_par); 3898 G4double sbhe = (*sbhe_par); 3899 G4double sba = (*sba_par); 3900 G4double ecn = (*ecn_par); 3901 G4double ecp = (*ecp_par); 3902 G4double ecd = (*ecd_par); 3903 G4double ect = (*ect_par); 3904 G4double eche = (*eche_par); 3905 G4double eca = (*eca_par); 3906 G4double ecg = (*ecg_par); 3907 G4double eclamb0 = (*eclamb0_par); 3908 G4double bp = (*bp_par); 3909 G4double bd = (*bd_par); 3910 G4double bt = (*bt_par); 3911 G4double bhe = (*bhe_par); 3912 G4double ba = (*ba_par); 3913 G4double tsum = (*tsum_par); 3914 3915 // CALCULATION OF PARTICLE-EMISSION PROBABILITIES & FISSION / 3916 // BASED ON THE SIMPLIFIED FORMULAS FOR THE DECAY WIDTH BY / 3917 // MORETTO, ROCHESTER MEETING TO AVOID COMPUTING TIME / 3918 // INTENSIVE INTEGRATION OF THE LEVEL DENSITIES / 3919 // USES EFFECTIVE COULOMB BARRIERS AND AN AVERAGE KINETIC ENERGY/ 3920 // OF THE EVAPORATED PARTICLES / 3921 // COLLECTIVE ENHANCMENT OF THE LEVEL DENSITY IS INCLUDED / 3922 // DYNAMICAL HINDRANCE OF FISSION IS INCLUDED BY A STEP FUNCTION/ 3923 // APPROXIMATION. SEE A.R. JUNGHANS DIPLOMA THESIS / 3924 // SHELL AND PAIRING STRUCTURES IN THE LEVEL DENSITY IS INCLUDED/ 3925 3926 // INPUT: 3927 // ZPRF,A,EE CHARGE, MASS, EXCITATION ENERGY OF COMPOUND 3928 // NUCLEUS 3929 // JPRF ROOT-MEAN-SQUARED ANGULAR MOMENTUM 3930 3931 // DEFORMATIONS AND G.S. SHELL EFFECTS 3932 // COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA 3933 3934 // ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S. 3935 // ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0) 3936 // VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE 3937 // ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!) 3938 // BETA2 = SQRT((4PI)/5) * ALPHA 3939 3940 // OPTIONS AND PARAMETERS FOR FISSION CHANNEL 3941 // COMMON /FISS/ AKAP,BET,HOMEGA,KOEFF,IFIS, 3942 // OPTSHP,OPTXFIS,OPTLES,OPTCOL 3943 // 3944 // AKAP - HBAR**2/(2* MN * R_0**2) = 10 MEV, R_0 = 1.4 FM 3945 // BET - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1) 3946 // HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV 3947 // KOEFF - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0 3948 // IFIS - 0/1 FISSION CHANNEL OFF/ON 3949 // OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY 3950 // = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY 3951 // = 1 SHELL , NO PAIRING 3952 // = 2 PAIRING, NO SHELL 3953 // = 3 SHELL AND PAIRING 3954 // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF 3955 // OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV 3956 // FISSILITY PARAMETER. 3957 // OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224 3958 // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON 3959 3960 // LEVEL DENSITY PARAMETERS 3961 // COMMON /ALD/ AV,AS,AK,OPTAFAN 3962 // AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE 3963 // LEVEL DENSITY PARAMETER 3964 // OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1 3965 // RECOMMENDED IS OPTAFAN = 0 3966 3967 // FISSION BARRIERS 3968 // COMMON /FB/ EFA 3969 // EFA - ARRAY OF FISSION BARRIERS 3970 3971 // OUTPUT: PROBN,PROBP,PROBA,PROBF,PTOTL: 3972 // - EMISSION PROBABILITIES FOR N EUTRON, P ROTON, A LPHA 3973 // PARTICLES, F ISSION AND NORMALISATION 3974 // SN,SBP,SBA: SEPARATION ENERGIES N P A 3975 // INCLUDING EFFECTIVE BARRIERS 3976 // ECN,ECP,ECA,BP,BA 3977 // - AVERAGE KINETIC ENERGIES (2*T) AND EFFECTIVE BARRIERS 3978 3979 G4double bk = 0.0; 3980 G4double bksp = 0.0; 3981 G4double bc = 0.0; 3982 G4int afp = 0; 3983 G4double het = 0.0; 3984 G4double at = 0.0; 3985 G4double bs = 0.0; 3986 G4double bssp = 0.0; 3987 G4double bshell = 0.0; 3988 G4double cf = 0.0; 3989 G4double defbet = 0.0; 3990 G4double densa = 0.0; 3991 G4double denshe = 0.0; 3992 G4double densg = 0.0; 3993 G4double densn = 0.0; 3994 G4double densp = 0.0; 3995 G4double densd = 0.0; 3996 G4double denst = 0.0; 3997 G4double denslamb0 = 0.0; 3998 G4double eer = 0.0; 3999 G4double ecor = 0.0; 4000 G4double ef = 0.0; 4001 G4double ft = 0.0; 4002 G4double timf = 0.0; 4003 G4double qr = 0.0; 4004 G4double qrcn = 0.0; 4005 G4double omegap = 0.0; 4006 G4double omegad = 0.0; 4007 G4double omegat = 0.0; 4008 G4double omegahe = 0.0; 4009 G4double omegaa = 0.0; 4010 G4double ga = 0.0; 4011 G4double ghe = 0.0; 4012 G4double gf = 0.0; 4013 G4double gff = 0.0; 4014 G4double gn = 0.0; 4015 G4double gp = 0.0; 4016 G4double gd = 0.0; 4017 G4double gt = 0.0; 4018 G4double gg = 0.0; 4019 G4double glamb0 = 0.0; 4020 G4double gimf = 0.0; 4021 G4double gimf3 = 0.0; 4022 G4double gimf5 = 0.0; 4023 G4double bimf = 0.0; 4024 G4double bsimf = 0.0; 4025 G4double sbimf = 0.0; 4026 G4double densimf = 0.0; 4027 G4double defbetimf = 0.0; 4028 G4double b_imf = 0.0; 4029 G4double a_imf = 0.0; 4030 G4double omegaimf = 0.0; 4031 G4int izimf = 0; 4032 G4double zimf = 0.0; 4033 G4double gsum = 0.0; 4034 G4double gtotal = 0.0; 4035 G4double hbar = 6.582122e-22; 4036 G4double emin = 0.0; 4037 G4int il = 0; 4038 G4int choice_fisspart = 0; 4039 G4double t_lapse = 0.0; 4040 G4int imaxwell = 0; 4041 G4int in = 0; 4042 G4int iz = 0; 4043 G4int ind = 0; 4044 G4int izd = 0; 4045 G4int j = 0; 4046 G4int k = 0; 4047 G4double ma1z = 0.0; 4048 G4double mazz = 0.0; 4049 G4double ma2z = 0.0; 4050 G4double ma1z1 = 0.0; 4051 G4double ma2z1 = 0.0; 4052 G4double ma3z1 = 0.0; 4053 G4double ma3z2 = 0.0; 4054 G4double ma4z2 = 0.0; 4055 G4double maz = 0.0; 4056 G4double nt = 0.0; 4057 G4double pi = 3.1415926535; 4058 G4double pt = 0.0; 4059 G4double dt = 0.0; 4060 G4double tt = 0.0; 4061 G4double lamb0t = 0.0; 4062 G4double gtemp = 0.0; 4063 G4double rdt = 0.0; 4064 G4double rtt = 0.0; 4065 G4double rat = 0.0; 4066 G4double rhet = 0.0; 4067 G4double refmod = 0.0; 4068 G4double rnt = 0.0; 4069 G4double rpt = 0.0; 4070 G4double rlamb0t = 0.0; 4071 G4double sbfis = 1.e40; 4072 G4double segs = 0.0; 4073 G4double selmax = 0.0; 4074 G4double tauc = 0.0; 4075 G4double temp = 0.0; 4076 G4double ts1 = 0.0; 4077 G4double xx = 0.0; 4078 G4double y = 0.0; 4079 G4double k1 = 0.0; 4080 G4double omegasp = 0.0; 4081 G4double homegasp = 0.0; 4082 G4double omegags = 0.0; 4083 G4double homegags = 0.0; 4084 G4double pa = 0.0; 4085 G4double gamma = 0.0; 4086 G4double gfactor = 0.0; 4087 G4double bscn; 4088 G4double bkcn; 4089 G4double bccn; 4090 G4double ftcn = 0.0; 4091 G4double mfcd; 4092 G4double jprfn = jprf; 4093 G4double jprfp = jprf; 4094 G4double jprfd = jprf; 4095 G4double jprft = jprf; 4096 G4double jprfhe = jprf; 4097 G4double jprfa = jprf; 4098 G4double jprflamb0 = jprf; 4099 G4double djprf = 0.0; 4100 G4double dlout = 0.0; 4101 G4double sdlout = 0.0; 4102 G4double iinert = 0.0; 4103 G4double erot = 0.0; 4104 G4double erotn = 0.0; 4105 G4double erotp = 0.0; 4106 G4double erotd = 0.0; 4107 G4double erott = 0.0; 4108 G4double erothe = 0.0; 4109 G4double erota = 0.0; 4110 G4double erotlamb0 = 0.0; 4111 G4double erotcn = 0.0; 4112 // G4double ecorcn=0.0; 4113 G4double imfarg = 0.0; 4114 G4double width_imf = 0.0; 4115 G4int IDjprf = 0; 4116 G4int fimf_allowed = opt->optimfallowed; 4117 4118 if (itest == 1) 4119 { 4120 } 4121 // Switch to calculate Maxwellian distribution of kinetic energies 4122 imaxwell = 1; 4123 *sortie = 0; 4124 4125 // just a change of name until the end of this subroutine 4126 eer = ee; 4127 if (inum == 1) 4128 { 4129 ilast = 1; 4130 } 4131 // calculation of masses 4132 // refmod = 1 ==> myers,swiatecki model 4133 // refmod = 0 ==> weizsaecker model 4134 refmod = 1; // Default = 1 4135 // 4136 if (refmod == 1) 4137 { 4138 mglms(a, zprf, fiss->optshp, &maz); 4139 mglms(a - 1.0, zprf, fiss->optshp, &ma1z); 4140 mglms(a - 2.0, zprf, fiss->optshp, &ma2z); 4141 mglms(a - 1.0, zprf - 1.0, fiss->optshp, &ma1z1); 4142 mglms(a - 2.0, zprf - 1.0, fiss->optshp, &ma2z1); 4143 mglms(a - 3.0, zprf - 1.0, fiss->optshp, &ma3z1); 4144 mglms(a - 3.0, zprf - 2.0, fiss->optshp, &ma3z2); 4145 mglms(a - 4.0, zprf - 2.0, fiss->optshp, &ma4z2); 4146 } 4147 else 4148 { 4149 mglw(a, zprf, &maz); 4150 mglw(a - 1.0, zprf, &ma1z); 4151 mglw(a - 1.0, zprf - 1.0, &ma1z1); 4152 mglw(a - 2.0, zprf - 1.0, &ma2z1); 4153 mglw(a - 3.0, zprf - 1.0, &ma3z1); 4154 mglw(a - 3.0, zprf - 2.0, &ma3z2); 4155 mglw(a - 4.0, zprf - 2.0, &ma4z2); 4156 } 4157 4158 if ((a - 1.) == 3.0 && (zprf - 1.0) == 2.0) 4159 ma1z1 = -7.7181660; 4160 if ((a - 1.) == 4.0 && (zprf - 1.0) == 2.0) 4161 ma1z1 = -28.295992; 4162 4163 // separation energies 4164 sn = ma1z - maz; 4165 sp = ma1z1 - maz; 4166 sd = ma2z1 - maz - 2.2246; 4167 st = ma3z1 - maz - 8.481977; 4168 she = ma3z2 - maz - 7.7181660; 4169 sa = ma4z2 - maz - 28.295992; 4170 // 4171 if (NbLam0 > 1) 4172 { 4173 sn = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0); 4174 sp = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf - 1., NbLam0); 4175 sd = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 2., zprf - 1., NbLam0); 4176 st = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 1., NbLam0); 4177 she = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 2., NbLam0); 4178 sa = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 4., zprf - 2., NbLam0); 4179 slamb0 = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0 - 1); 4180 } 4181 if (NbLam0 == 1) 4182 { 4183 G4double deltasn = sn - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 1., zprf, 0)); 4184 G4double deltasp = sp - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 1., zprf - 1, 0)); 4185 G4double deltasd = sd - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 2., zprf - 1, 0)); 4186 G4double deltast = st - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 3., zprf - 1, 0)); 4187 G4double deltashe = she - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 3., zprf - 2, 0)); 4188 G4double deltasa = sa - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 4., zprf - 2, 0)); 4189 4190 sn = deltasn + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0); 4191 sp = deltasp + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf - 1., NbLam0); 4192 sd = deltasd + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 2., zprf - 1., NbLam0); 4193 st = deltast + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 1., NbLam0); 4194 she = deltashe + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 2., NbLam0); 4195 sa = deltasa + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 4., zprf - 2., NbLam0); 4196 slamb0 = gethyperseparation(a, zprf, NbLam0); 4197 } 4198 4199 // coulomb barriers 4200 // Proton 4201 if (zprf <= 1.0e0 || a <= 1.0e0 || (a - zprf) < 0.0) 4202 { 4203 sbp = 1.0e75; 4204 bp = 1.0e75; 4205 } 4206 else 4207 { 4208 barrs(idnint(zprf - 1.), idnint(a - 1.), 1, 1, &bp, &omegap); 4209 bp = max(bp, 0.1); 4210 sbp = sp + bp; 4211 } 4212 4213 // Deuteron 4214 if (zprf <= 1.0e0 || a <= 2.0e0 || (a - zprf) < 1.0) 4215 { 4216 sbd = 1.0e75; 4217 bd = 1.0e75; 4218 } 4219 else 4220 { 4221 barrs(idnint(zprf - 1.), idnint(a - 2.), 1, 2, &bd, &omegad); 4222 bd = max(bd, 0.1); 4223 sbd = sd + bd; 4224 } 4225 4226 // Triton 4227 if (zprf <= 1.0e0 || a <= 3.0e0 || (a - zprf) < 2.0) 4228 { 4229 sbt = 1.0e75; 4230 bt = 1.0e75; 4231 } 4232 else 4233 { 4234 barrs(idnint(zprf - 1.), idnint(a - 3.), 1, 3, &bt, &omegat); 4235 bt = max(bt, 0.1); 4236 sbt = st + bt; 4237 } 4238 4239 // Alpha 4240 if (a - 4.0 <= 0.0 || zprf <= 2.0 || (a - zprf) < 2.0) 4241 { 4242 sba = 1.0e+75; 4243 ba = 1.0e+75; 4244 } 4245 else 4246 { 4247 barrs(idnint(zprf - 2.), idnint(a - 4.), 2, 4, &ba, &omegaa); 4248 ba = max(ba, 0.1); 4249 sba = sa + ba; 4250 } 4251 4252 // He3 4253 if (a - 3.0 <= 0.0 || zprf <= 2.0 || (a - zprf) < 1.0) 4254 { 4255 sbhe = 1.0e+75; 4256 bhe = 1.0e+75; 4257 } 4258 else 4259 { 4260 barrs(idnint(zprf - 2.), idnint(a - 3.), 2, 3, &bhe, &omegahe); 4261 bhe = max(bhe, 0.1); 4262 sbhe = she + bhe; 4263 } 4264 4265 // Dealing with particle-unbound systems 4266 emin = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); 4267 4268 if (emin <= 0.0) 4269 { 4270 *sortie = 1; 4271 unbound(sn, 4272 sp, 4273 sd, 4274 st, 4275 she, 4276 sa, 4277 bp, 4278 bd, 4279 bt, 4280 bhe, 4281 ba, 4282 &probf, 4283 &probn, 4284 &probp, 4285 &probd, 4286 &probt, 4287 &probhe, 4288 &proba, 4289 &probimf, 4290 &probg, 4291 &ecn, 4292 &ecp, 4293 &ecd, 4294 &ect, 4295 &eche, 4296 &eca); 4297 goto direct70; 4298 } 4299 // 4300 k = idnint(zprf); 4301 j = idnint(a - zprf); 4302 if (fiss->ifis > 0) 4303 { 4304 // now ef is calculated from efa that depends on the subroutine 4305 // barfit which takes into account the modification on the ang. mom. 4306 // note *** shell correction (ecgnz) 4307 il = idnint(jprf); 4308 barfit(k, k + j, il, &sbfis, &segs, &selmax); 4309 if ((fiss->optshp == 1) || (fiss->optshp == 3)) 4310 { 4311 ef = G4double(sbfis) - ecld->ecgnz[j][k]; 4312 // JLRS - Nov 2016 - Corrected values of fission barriers for actinides 4313 if (k == 90) 4314 { 4315 if (mod(j, 2) == 1) 4316 { 4317 ef = ef * (4.5114 - 2.2687 * (a - zprf) / zprf); 4318 } 4319 else 4320 { 4321 ef = ef * (3.3931 - 1.5338 * (a - zprf) / zprf); 4322 } 4323 } 4324 if (k == 92) 4325 { 4326 if ((a - zprf) / zprf > 1.52) 4327 ef = ef * (1.1222 - 0.10886 * (a - zprf) / zprf) - 0.1; 4328 } 4329 if (k >= 94 && k <= 98 && j < 158) 4330 { // Data in this range have been 4331 // tested e-e 4332 if (mod(j, 2) == 0 && mod(k, 2) == 0) 4333 { 4334 if (k >= 94) 4335 { 4336 ef = ef - (11.54108 * (a - zprf) / zprf - 18.074); 4337 } 4338 } 4339 // O-O 4340 if (mod(j, 2) == 1 && mod(k, 2) == 1) 4341 { 4342 if (k >= 95) 4343 { 4344 ef = ef - (14.567 * (a - zprf) / zprf - 23.266); 4345 } 4346 } 4347 // Odd A 4348 if (mod(j, 2) == 0 && mod(k, 2) == 1) 4349 { 4350 if (j >= 144) 4351 { 4352 ef = ef - (13.662 * (a - zprf) / zprf - 21.656); 4353 } 4354 } 4355 4356 if (mod(j, 2) == 1 && mod(k, 2) == 0) 4357 { 4358 if (j >= 144) 4359 { 4360 ef = ef - (13.662 * (a - zprf) / zprf - 21.656); 4361 } 4362 } 4363 } 4364 } 4365 else 4366 { 4367 ef = G4double(sbfis); 4368 } 4369 // 4370 // TO AVOID NEGATIVE VALUES FOR IMPOSSIBLE NUCLEI 4371 // THE FISSION BARRIER IS SET TO ZERO IF SMALLER THAN ZERO. 4372 // 4373 if (ef < 0.0) 4374 ef = 0.0; 4375 fb->efa[j][k] = ef; 4376 // 4377 // Hyper-fission barrier 4378 // 4379 if (NbLam0 > 0) 4380 { 4381 ef = ef + 0.51 * (1115. - 938. + sn - slamb0) / std::pow(a, 2. / 3.); 4382 } 4383 // 4384 // Set fission barrier 4385 // 4386 (*ef_par) = ef; 4387 // 4388 // calculation of surface and curvature integrals needed to 4389 // to calculate the level density parameter at the saddle point 4390 xx = fissility((k + j), k, NbLam0, sn, slamb0, fiss->optxfis); 4391 y = 1.00 - xx; 4392 if (y < 0.0) 4393 y = 0.0; 4394 if (y > 1.0) 4395 y = 1.0; 4396 bssp = bipol(1, y); 4397 bksp = bipol(2, y); 4398 } 4399 else 4400 { 4401 ef = 1.0e40; 4402 sbfis = 1.0e40; 4403 bssp = 1.0; 4404 bksp = 1.0; 4405 } 4406 // 4407 // COMPOUND NUCLEUS LEVEL DENSITY 4408 // 4409 // AK 2007 - Now DENSNIV called with correct BS, BK 4410 4411 afp = idnint(a); 4412 iz = idnint(zprf); 4413 in = afp - iz; 4414 bshell = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz]; 4415 defbet = ecld->beta2[in][iz]; 4416 4417 iinert = 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a, 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4418 erot = jprf * jprf * 197.328 * 197.328 / (2. * iinert); 4419 erotcn = erot; 4420 4421 bsbkbc(a, zprf, &bscn, &bkcn, &bccn); 4422 4423 // if(ee > erot+emin){ 4424 densniv( 4425 a, zprf, ee, 0.0, &densg, bshell, bscn, bkcn, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprf, 0, &qrcn); 4426 ftcn = temp; 4427 /* 4428 //ecorcn = ecor; 4429 }else{ 4430 // If EE < EROT, only gamma emission can take place 4431 probf = 0.0; 4432 probp = 0.0; 4433 probd = 0.0; 4434 probt = 0.0; 4435 probn = 0.0; 4436 probhe = 0.0; 4437 proba = 0.0; 4438 probg = 1.0; 4439 probimf = 0.0; 4440 //c JLRS 03/2017 - Added this calculation 4441 //C According to A. Ignatyuk, GG : 4442 //C Here BS=BK=1, as this was assumed in the parameterization 4443 pa = (ald->av)*a + (ald->as)*std::pow(a,2./3.) + 4444 (ald->ak)*std::pow(a,1./3.); gamma = 2.5 * pa * std::pow(a,-4./3.); gfactor 4445 = 1.+gamma*ecld->ecgnz[in][iz]; if(gfactor<=0.){ gfactor = 0.0; 4446 } 4447 // 4448 gtemp = 17.60/(std::pow(a,0.699) * std::sqrt(gfactor)); 4449 ecg = 4.0 * gtemp; 4450 // 4451 goto direct70; 4452 } 4453 */ 4454 4455 // --------------------------------------------------------------- 4456 // LEVEL DENSITIES AND TEMPERATURES OF THE FINAL STATES 4457 // --------------------------------------------------------------- 4458 // 4459 // MVR - in case of charged particle emission temperature 4460 // comes from random kinetic energy from a Maxwelliam distribution 4461 // if option imaxwell = 1 (otherwise E=2T) 4462 // 4463 // AK - LEVEL DENSITY AND TEMPERATURE AT THE SADDLE POINT -> now calculated 4464 // in the subroutine FISSION_WIDTH 4465 // 4466 // 4467 // LEVEL DENSITY AND TEMPERATURE IN THE NEUTRON DAUGHTER 4468 // 4469 // KHS, AK 2007 - Reduction of angular momentum due to orbital angular 4470 // momentum of emitted fragment JLRS Nov-2016 - Added these caculations in 4471 // abla++ 4472 4473 if (in >= 2) 4474 { 4475 ind = idnint(a) - idnint(zprf) - 1; 4476 izd = idnint(zprf); 4477 if (jprf > 0.10) 4478 { 4479 lorb(a, a - 1., jprf, ee - sn, &dlout, &sdlout); 4480 djprf = gausshaz(1, dlout, sdlout); 4481 if (IDjprf == 1) 4482 djprf = 0.0; 4483 jprfn = jprf + djprf; 4484 jprfn = dint(std::abs(jprfn)); // The nucleus just turns the other way around 4485 } 4486 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4487 defbet = ecld->beta2[ind][izd]; 4488 4489 iinert = 4490 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 1., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4491 erotn = jprfn * jprfn * 197.328 * 197.328 / (2. * iinert); 4492 bsbkbc(a - 1., zprf, &bs, &bk, &bc); 4493 4494 // level density and temperature in the neutron daughter 4495 densniv(a - 1.0, 4496 zprf, 4497 ee, 4498 sn, 4499 &densn, 4500 bshell, 4501 bs, 4502 bk, 4503 &temp, 4504 fiss->optshp, 4505 fiss->optcol, 4506 defbet, 4507 &ecor, 4508 jprfn, 4509 0, 4510 &qr); 4511 nt = temp; 4512 ecn = 0.0; 4513 if (densn > 0.) 4514 { 4515 G4int IS = 0; 4516 if (imaxwell == 1) 4517 { 4518 rnt = nt; 4519 dir1234: 4520 ecn = fvmaxhaz_neut(rnt); 4521 IS++; 4522 if (IS > 100) 4523 { 4524 std::cout << "WARNING: FVMAXHAZ_NEUT CALLED MORE THAN 100 TIMES" << std::endl; 4525 goto exi1000; 4526 } 4527 if (ecn > (ee - sn)) 4528 { 4529 if ((ee - sn) < rnt) 4530 ecn = ee - sn; 4531 else 4532 goto dir1234; 4533 } 4534 if (ecn <= 0.0) 4535 goto dir1234; 4536 } 4537 else 4538 { 4539 ecn = 2.0 * nt; 4540 } 4541 } 4542 } 4543 else 4544 { 4545 densn = 0.0; 4546 ecn = 0.0; 4547 nt = 0.0; 4548 } 4549 exi1000: 4550 4551 // LEVEL DENSITY AND TEMPERATURE IN THE PROTON DAUGHTER 4552 // 4553 // Reduction of angular momentum due to orbital angular momentum of emitted 4554 // fragment 4555 if (iz >= 2) 4556 { 4557 ind = idnint(a) - idnint(zprf); 4558 izd = idnint(zprf) - 1; 4559 if (jprf > 0.10) 4560 { 4561 lorb(a, a - 1., jprf, ee - sbp, &dlout, &sdlout); 4562 djprf = gausshaz(1, dlout, sdlout); 4563 if (IDjprf == 1) 4564 djprf = 0.0; 4565 jprfp = jprf + djprf; 4566 jprfp = dint(std::abs(jprfp)); // The nucleus just turns the other way around 4567 } 4568 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4569 defbet = ecld->beta2[ind][izd]; 4570 4571 iinert = 4572 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 1., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4573 erotp = jprfp * jprfp * 197.328 * 197.328 / (2. * iinert); 4574 4575 bsbkbc(a - 1., zprf - 1., &bs, &bk, &bc); 4576 4577 // level density and temperature in the proton daughter 4578 densniv(a - 1.0, 4579 zprf - 1.0, 4580 ee, 4581 sbp, 4582 &densp, 4583 bshell, 4584 bs, 4585 bk, 4586 &temp, 4587 fiss->optshp, 4588 fiss->optcol, 4589 defbet, 4590 &ecor, 4591 jprfp, 4592 0, 4593 &qr); 4594 pt = temp; 4595 ecp = 0.; 4596 if (densp > 0.) 4597 { 4598 G4int IS = 0; 4599 if (imaxwell == 1) 4600 { 4601 rpt = pt; 4602 dir1235: 4603 ecp = fvmaxhaz(rpt); 4604 IS++; 4605 if (IS > 100) 4606 { 4607 std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; 4608 goto exi1001; 4609 } 4610 if (ecp > (ee - sbp)) 4611 { 4612 if ((ee - sbp) < rpt) 4613 ecp = ee - sbp; 4614 else 4615 goto dir1235; 4616 } 4617 if (ecp <= 0.0) 4618 goto dir1235; 4619 ecp = ecp + bp; 4620 } 4621 else 4622 { 4623 ecp = 2.0 * pt + bp; 4624 } 4625 } 4626 } 4627 else 4628 { 4629 densp = 0.0; 4630 ecp = 0.0; 4631 pt = 0.0; 4632 } 4633 exi1001: 4634 4635 // FINAL LEVEL DENSITY AND TEMPERATURE AFTER DEUTERON EMISSION 4636 // 4637 // Reduction of angular momentum due to orbital angular momentum of emitted 4638 // fragment 4639 if ((in >= 2) && (iz >= 2)) 4640 { 4641 ind = idnint(a) - idnint(zprf) - 1; 4642 izd = idnint(zprf) - 1; 4643 if (jprf > 0.10) 4644 { 4645 lorb(a, a - 2., jprf, ee - sbd, &dlout, &sdlout); 4646 djprf = gausshaz(1, dlout, sdlout); 4647 if (IDjprf == 1) 4648 djprf = 0.0; 4649 jprfd = jprf + djprf; 4650 jprfd = dint(std::abs(jprfd)); // The nucleus just turns the other way around 4651 } 4652 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4653 defbet = ecld->beta2[ind][izd]; 4654 4655 iinert = 4656 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 2., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4657 erotd = jprfd * jprfd * 197.328 * 197.328 / (2. * iinert); 4658 4659 bsbkbc(a - 2., zprf - 1., &bs, &bk, &bc); 4660 4661 // level density and temperature in the deuteron daughter 4662 densniv(a - 2.0, 4663 zprf - 1.0e0, 4664 ee, 4665 sbd, 4666 &densd, 4667 bshell, 4668 bs, 4669 bk, 4670 &temp, 4671 fiss->optshp, 4672 fiss->optcol, 4673 defbet, 4674 &ecor, 4675 jprfd, 4676 0, 4677 &qr); 4678 4679 dt = temp; 4680 ecd = 0.0; 4681 if (densd > 0.) 4682 { 4683 G4int IS = 0; 4684 if (imaxwell == 1) 4685 { 4686 rdt = dt; 4687 dir1236: 4688 ecd = fvmaxhaz(rdt); 4689 IS++; 4690 if (IS > 100) 4691 { 4692 std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; 4693 goto exi1002; 4694 } 4695 if (ecd > (ee - sbd)) 4696 { 4697 if ((ee - sbd) < rdt) 4698 ecd = ee - sbd; 4699 else 4700 goto dir1236; 4701 } 4702 if (ecd <= 0.0) 4703 goto dir1236; 4704 ecd = ecd + bd; 4705 } 4706 else 4707 { 4708 ecd = 2.0 * dt + bd; 4709 } 4710 } 4711 } 4712 else 4713 { 4714 densd = 0.0; 4715 ecd = 0.0; 4716 dt = 0.0; 4717 } 4718 exi1002: 4719 4720 // FINAL LEVEL DENSITY AND TEMPERATURE AFTER TRITON EMISSION 4721 // 4722 // Reduction of angular momentum due to orbital angular momentum of emitted 4723 // fragment 4724 if ((in >= 3) && (iz >= 2)) 4725 { 4726 ind = idnint(a) - idnint(zprf) - 2; 4727 izd = idnint(zprf) - 1; 4728 if (jprf > 0.10) 4729 { 4730 lorb(a, a - 3., jprf, ee - sbt, &dlout, &sdlout); 4731 djprf = gausshaz(1, dlout, sdlout); 4732 if (IDjprf == 1) 4733 djprf = 0.0; 4734 jprft = jprf + djprf; 4735 jprft = dint(std::abs(jprft)); // The nucleus just turns the other way around 4736 } 4737 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4738 defbet = ecld->beta2[ind][izd]; 4739 4740 iinert = 4741 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 3., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4742 erott = jprft * jprft * 197.328 * 197.328 / (2. * iinert); 4743 4744 bsbkbc(a - 3., zprf - 1., &bs, &bk, &bc); 4745 4746 // level density and temperature in the triton daughter 4747 densniv(a - 3.0, 4748 zprf - 1.0, 4749 ee, 4750 sbt, 4751 &denst, 4752 bshell, 4753 bs, 4754 bk, 4755 &temp, 4756 fiss->optshp, 4757 fiss->optcol, 4758 defbet, 4759 &ecor, 4760 jprft, 4761 0, 4762 &qr); 4763 4764 tt = temp; 4765 ect = 0.; 4766 if (denst > 0.) 4767 { 4768 G4int IS = 0; 4769 if (imaxwell == 1) 4770 { 4771 rtt = tt; 4772 dir1237: 4773 ect = fvmaxhaz(rtt); 4774 IS++; 4775 if (IS > 100) 4776 { 4777 std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; 4778 goto exi1003; 4779 } 4780 if (ect > (ee - sbt)) 4781 { 4782 if ((ee - sbt) < rtt) 4783 ect = ee - sbt; 4784 else 4785 goto dir1237; 4786 } 4787 if (ect <= 0.0) 4788 goto dir1237; 4789 ect = ect + bt; 4790 } 4791 else 4792 { 4793 ect = 2.0 * tt + bt; 4794 } 4795 } 4796 } 4797 else 4798 { 4799 denst = 0.0; 4800 ect = 0.0; 4801 tt = 0.0; 4802 } 4803 exi1003: 4804 4805 // LEVEL DENSITY AND TEMPERATURE IN THE ALPHA DAUGHTER 4806 // 4807 // Reduction of angular momentum due to orbital angular momentum of emitted 4808 // fragment 4809 if ((in >= 3) && (iz >= 3)) 4810 { 4811 ind = idnint(a) - idnint(zprf) - 2; 4812 izd = idnint(zprf) - 2; 4813 if (jprf > 0.10) 4814 { 4815 lorb(a, a - 4., jprf, ee - sba, &dlout, &sdlout); 4816 djprf = gausshaz(1, dlout, sdlout); 4817 if (IDjprf == 1) 4818 djprf = 0.0; 4819 jprfa = jprf + djprf; 4820 jprfa = dint(std::abs(jprfa)); // The nucleus just turns the other way around 4821 } 4822 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4823 defbet = ecld->beta2[ind][izd]; 4824 4825 iinert = 4826 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 4., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4827 erota = jprfa * jprfa * 197.328 * 197.328 / (2. * iinert); 4828 4829 bsbkbc(a - 4., zprf - 2., &bs, &bk, &bc); 4830 4831 // level density and temperature in the alpha daughter 4832 densniv(a - 4.0, 4833 zprf - 2.0, 4834 ee, 4835 sba, 4836 &densa, 4837 bshell, 4838 bs, 4839 bk, 4840 &temp, 4841 fiss->optshp, 4842 fiss->optcol, 4843 defbet, 4844 &ecor, 4845 jprfa, 4846 0, 4847 &qr); 4848 4849 at = temp; 4850 eca = 0.0; 4851 if (densa > 0.) 4852 { 4853 G4int IS = 0; 4854 if (imaxwell == 1) 4855 { 4856 rat = at; 4857 dir1238: 4858 eca = fvmaxhaz(rat); 4859 IS++; 4860 if (IS > 100) 4861 { 4862 std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; 4863 goto exi1004; 4864 } 4865 if (eca > (ee - sba)) 4866 { 4867 if ((ee - sba) < rat) 4868 eca = ee - sba; 4869 else 4870 goto dir1238; 4871 } 4872 if (eca <= 0.0) 4873 goto dir1238; 4874 eca = eca + ba; 4875 } 4876 else 4877 { 4878 eca = 2.0 * at + ba; 4879 } 4880 } 4881 } 4882 else 4883 { 4884 densa = 0.0; 4885 eca = 0.0; 4886 at = 0.0; 4887 } 4888 exi1004: 4889 4890 // FINAL LEVEL DENSITY AND TEMPERATURE AFTER 3HE EMISSION 4891 // 4892 // Reduction of angular momentum due to orbital angular momentum of emitted 4893 // fragment 4894 if ((in >= 2) && (iz >= 3)) 4895 { 4896 ind = idnint(a) - idnint(zprf) - 1; 4897 izd = idnint(zprf) - 2; 4898 if (jprf > 0.10) 4899 { 4900 lorb(a, a - 3., jprf, ee - sbhe, &dlout, &sdlout); 4901 djprf = gausshaz(1, dlout, sdlout); 4902 if (IDjprf == 1) 4903 djprf = 0.0; 4904 jprfhe = jprf + djprf; 4905 jprfhe = dint(std::abs(jprfhe)); // The nucleus just turns the other way around 4906 } 4907 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4908 defbet = ecld->beta2[ind][izd]; 4909 4910 iinert = 4911 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 3., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4912 erothe = jprfhe * jprfhe * 197.328 * 197.328 / (2. * iinert); 4913 4914 bsbkbc(a - 3., zprf - 2., &bs, &bk, &bc); 4915 4916 // level density and temperature in the he3 daughter 4917 densniv(a - 3.0, 4918 zprf - 2.0, 4919 ee, 4920 sbhe, 4921 &denshe, 4922 bshell, 4923 bs, 4924 bk, 4925 &temp, 4926 fiss->optshp, 4927 fiss->optcol, 4928 defbet, 4929 &ecor, 4930 jprfhe, 4931 0, 4932 &qr); 4933 4934 het = temp; 4935 eche = 0.0; 4936 if (denshe > 0.) 4937 { 4938 G4int IS = 0; 4939 if (imaxwell == 1) 4940 { 4941 rhet = het; 4942 dir1239: 4943 eche = fvmaxhaz(rhet); 4944 IS++; 4945 if (IS > 100) 4946 { 4947 std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; 4948 goto exi1005; 4949 } 4950 if (eche > (ee - sbhe)) 4951 { 4952 if ((ee - sbhe) < rhet) 4953 eche = ee - sbhe; 4954 else 4955 goto dir1239; 4956 } 4957 if (eche <= 0.0) 4958 goto dir1239; 4959 eche = eche + bhe; 4960 } 4961 else 4962 { 4963 eche = 2.0 * het + bhe; 4964 } 4965 } 4966 } 4967 else 4968 { 4969 denshe = 0.0; 4970 eche = 0.0; 4971 het = 0.0; 4972 } 4973 exi1005: 4974 4975 // LEVEL DENSITY AND TEMPERATURE IN THE LAMBDA0 DAUGHTER 4976 // 4977 // - Reduction of angular momentum due to orbital angular momentum of emitted 4978 // fragment JLRS Jun-2017 - Added these caculations in abla++ 4979 4980 if (in >= 2 && NbLam0 > 0) 4981 { 4982 ind = idnint(a) - idnint(zprf) - 1; 4983 izd = idnint(zprf); 4984 if (jprf > 0.10) 4985 { 4986 lorb(a, a - 1., jprf, ee - slamb0, &dlout, &sdlout); 4987 djprf = gausshaz(1, dlout, sdlout); 4988 if (IDjprf == 1) 4989 djprf = 0.0; 4990 jprflamb0 = jprf + djprf; 4991 jprflamb0 = dint(std::abs(jprflamb0)); // The nucleus just turns the other way around 4992 } 4993 bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; 4994 defbet = ecld->beta2[ind][izd]; 4995 4996 iinert = 4997 0.4 * 931.49 * 1.16 * 1.16 * std::pow(a - 1., 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * pi)) * defbet); 4998 erotlamb0 = jprflamb0 * jprflamb0 * 197.328 * 197.328 / (2. * iinert); 4999 bsbkbc(a - 1., zprf, &bs, &bk, &bc); 5000 5001 // level density and temperature in the neutron daughter 5002 densniv(a - 1.0, 5003 zprf, 5004 ee, 5005 slamb0, 5006 &denslamb0, 5007 bshell, 5008 bs, 5009 bk, 5010 &temp, 5011 fiss->optshp, 5012 fiss->optcol, 5013 defbet, 5014 &ecor, 5015 jprflamb0, 5016 0, 5017 &qr); 5018 lamb0t = temp; 5019 eclamb0 = 0.0; 5020 if (denslamb0 > 0.) 5021 { 5022 G4int IS = 0; 5023 if (imaxwell == 1) 5024 { 5025 rlamb0t = lamb0t; 5026 dir1240: 5027 eclamb0 = fvmaxhaz_neut(rlamb0t); 5028 IS++; 5029 if (IS > 100) 5030 { 5031 std::cout << "WARNING: FVMAXHAZ_NEUT CALLED MORE THAN 100 TIMES" << std::endl; 5032 goto exi1006; 5033 } 5034 if (eclamb0 > (ee - slamb0)) 5035 { 5036 if ((ee - slamb0) < rlamb0t) 5037 eclamb0 = ee - slamb0; 5038 else 5039 goto dir1240; 5040 } 5041 if (eclamb0 <= 0.0) 5042 goto dir1240; 5043 } 5044 else 5045 { 5046 eclamb0 = 2.0 * lamb0t; 5047 } 5048 } 5049 } 5050 else 5051 { 5052 denslamb0 = 0.0; 5053 eclamb0 = 0.0; 5054 lamb0t = 0.0; 5055 } 5056 exi1006: 5057 5058 // Decay widths for particles 5059 if (densg > 0.) 5060 { 5061 // 5062 // CALCULATION OF THE PARTIAL DECAY WIDTH 5063 // USED FOR BOTH THE TIME SCALE AND THE EVAPORATION DECAY WIDTH 5064 // 5065 // AKAP = HBAR**2/(2* MN * R_0**2) = 10 MEV *** input param *** 5066 // 5067 // AK, KHS 2005 - Energy-dependen inverse cross sections included, influence 5068 // of 5069 // Coulomb barrier for LCP, tunnelling for LCP 5070 // JLRS 2017 - Implementation in abla++ 5071 5072 if (densn <= 0.0) 5073 { 5074 gn = 0.0; 5075 } 5076 else 5077 { 5078 gn = width(a, zprf, 1.0, 0.0, nt, 0.0, sn, ee - erotn) * densn / densg; 5079 } 5080 if (densp <= 0.0) 5081 { 5082 gp = 0.0; 5083 } 5084 else 5085 { 5086 gp = width(a, zprf, 1.0, 1.0, pt, bp, sbp, ee - erotp) * densp / densg * pen(a, 1.0, omegap, pt); 5087 } 5088 if (densd <= 0.0) 5089 { 5090 gd = 0.0; 5091 } 5092 else 5093 { 5094 gd = width(a, zprf, 2.0, 1.0, dt, bd, sbd, ee - erotd) * densd / densg * pen(a, 2.0, omegad, dt); 5095 } 5096 if (denst <= 0.0) 5097 { 5098 gt = 0.0; 5099 } 5100 else 5101 { 5102 gt = width(a, zprf, 3.0, 1.0, tt, bt, sbt, ee - erott) * denst / densg * pen(a, 3.0, omegat, tt); 5103 } 5104 if (denshe <= 0.0) 5105 { 5106 ghe = 0.0; 5107 } 5108 else 5109 { 5110 ghe = width(a, zprf, 3.0, 2.0, het, bhe, sbhe, ee - erothe) * denshe / densg * pen(a, 3.0, omegahe, het); 5111 } 5112 if (densa <= 0.0) 5113 { 5114 ga = 0.0; 5115 } 5116 else 5117 { 5118 ga = width(a, zprf, 4.0, 2.0, at, ba, sba, ee - erota) * densa / densg * pen(a, 4.0, omegaa, at); 5119 } 5120 if (denslamb0 <= 0.0) 5121 { 5122 glamb0 = 0.0; 5123 } 5124 else 5125 { 5126 glamb0 = width(a, zprf, 1.0, -2.0, lamb0t, 0.0, slamb0, ee - erotlamb0) * denslamb0 / densg; 5127 } 5128 5129 // ************************** 5130 // * Treatment of IMFs * 5131 // * KHS, AK, MVR 2005-2006 * 5132 // ************************** 5133 5134 G4int izcn = 0, incn = 0, inmin = 0, inmax = 0, inmi = 0, inma = 0; 5135 G4double aimf, mares, maimf; 5136 5137 if (fimf_allowed == 0 || zprf <= 5.0 || a <= 7.0) 5138 { 5139 gimf = 0.0; 5140 } 5141 else 5142 { 5143 // Estimate the total decay width for IMFs (Z >= 3) 5144 // By using the logarithmic slope between GIMF3 and GIMF5 5145 5146 mglms(a, zprf, opt->optshpimf, &mazz); 5147 5148 gimf3 = 0.0; 5149 zimf = 3.0; 5150 izimf = 3; 5151 // *** Find the limits that both IMF and partner are bound : 5152 izcn = idnint(zprf); // Z of CN 5153 incn = idnint(a) - izcn; // N of CN 5154 5155 isostab_lim(izimf, &inmin, 5156 &inmax); // Bound isotopes for IZIMF from INMIN to INIMFMA 5157 isostab_lim(izcn - izimf, 5158 &inmi, 5159 &inma); // Daughter nucleus after IMF emission, 5160 // limits of bound isotopes 5161 inmin = max(inmin, incn - inma); // Both IMF and daughter must be bound 5162 inmax = min(inmax, incn - inmi); // " 5163 5164 inmax = max(inmax, inmin); // In order to keep the variables below 5165 5166 for (G4int iaimf = izimf + inmin; iaimf <= izimf + inmax; iaimf++) 5167 { 5168 aimf = G4double(iaimf); 5169 if (aimf >= a || zimf >= zprf) 5170 { 5171 width_imf = 0.0; 5172 } 5173 else 5174 { 5175 // Q-values 5176 mglms(a - aimf, zprf - zimf, opt->optshpimf, &mares); 5177 mglms(aimf, zimf, opt->optshpimf, &maimf); 5178 // Bass barrier 5179 barrs(idnint(zprf - zimf), idnint(a - aimf), izimf, idnint(aimf), &bimf, &omegaimf); 5180 sbimf = maimf + mares - mazz + bimf + getdeltabinding(a, NbLam0); 5181 // Rotation energy 5182 defbetimf = ecld->beta2[idnint(aimf - zimf)][idnint(zimf)] + 5183 ecld->beta2[idnint(a - aimf - zprf + zimf)][idnint(zprf - zimf)]; 5184 5185 iinert = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(a, 5.0 / 3.0) * 5186 (std::pow(aimf, 5.0 / 3.0) + std::pow(a - aimf, 5.0 / 3.0)) + 5187 931.490 * 1.160 * 1.160 * aimf * (a - aimf) / a * 5188 (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)) * 5189 (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)); 5190 5191 erot = jprf * jprf * 197.328 * 197.328 / (2.0 * iinert); 5192 5193 // Width 5194 if (densg == 0.0 || ee < (sbimf + erot)) 5195 { 5196 width_imf = 0.0; 5197 } 5198 else 5199 { 5200 // To take into account that at the barrier the system is deformed: 5201 // BSIMF = ((A-AIMF)**(2.D0/3.D0) + 5202 // AIMF**(2.D0/3.D0))/A**(2.D0/3.D0) 5203 bsimf = bscn; 5204 densniv( 5205 a, zprf, ee, sbimf, &densimf, 0.0, bsimf, 1.0, &timf, 0, 0, defbetimf, &ecor, jprf, 2, &qr); 5206 5207 imfarg = (sbimf + erotcn - erot) / timf; 5208 if (imfarg > 200.0) 5209 imfarg = 200.0; 5210 5211 // For IMF - The available phase space is given by the level 5212 // densities in CN at the barrier; applaying MOrretto -> 5213 // G=WIDTH*ro_CN(E-SBIMF)/ro_CN(E). Constant temperature 5214 // approximation: ro(E+dE)/ro(E)=exp(dE/T) Ratio DENSIMF/DENSCN is 5215 // included to take into account that at the barrier system is 5216 // deformed. If (above) BSIMF = 1 no deformation is considered and 5217 // this ratio is equal to 1. 5218 width_imf = 0.0; 5219 // 5220 width_imf = 5221 width(a, zprf, aimf, zimf, timf, bimf, sbimf, ee - erot) * std::exp(-imfarg) * qr / qrcn; 5222 } // if densg 5223 } // if aimf 5224 gimf3 = gimf3 + width_imf; 5225 } // for IAIMF 5226 5227 // zimf = 5 5228 gimf5 = 0.0; 5229 zimf = 5.0; 5230 izimf = 5; 5231 // *** Find the limits that both IMF and partner are bound : 5232 izcn = idnint(zprf); // Z of CN 5233 incn = idnint(a) - izcn; // N of CN 5234 5235 isostab_lim(izimf, &inmin, 5236 &inmax); // Bound isotopes for IZIMF from INMIN to INIMFMA 5237 isostab_lim(izcn - izimf, 5238 &inmi, 5239 &inma); // Daughter nucleus after IMF emission, 5240 // limits of bound isotopes 5241 inmin = max(inmin, incn - inma); // Both IMF and daughter must be bound 5242 inmax = min(inmax, incn - inmi); // " 5243 5244 inmax = max(inmax, inmin); // In order to keep the variables below 5245 5246 for (G4int iaimf = izimf + inmin; iaimf <= izimf + inmax; iaimf++) 5247 { 5248 aimf = G4double(iaimf); 5249 if (aimf >= a || zimf >= zprf) 5250 { 5251 width_imf = 0.0; 5252 } 5253 else 5254 { 5255 // Q-values 5256 mglms(a - aimf, zprf - zimf, opt->optshpimf, &mares); 5257 mglms(aimf, zimf, opt->optshpimf, &maimf); 5258 // Bass barrier 5259 barrs(idnint(zprf - zimf), idnint(a - aimf), izimf, idnint(aimf), &bimf, &omegaimf); 5260 sbimf = maimf + mares - mazz + bimf + getdeltabinding(a, NbLam0); 5261 // Rotation energy 5262 defbetimf = ecld->beta2[idnint(aimf - zimf)][idnint(zimf)] + 5263 ecld->beta2[idnint(a - aimf - zprf + zimf)][idnint(zprf - zimf)]; 5264 5265 iinert = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(a, 5.0 / 3.0) * 5266 (std::pow(aimf, 5.0 / 3.0) + std::pow(a - aimf, 5.0 / 3.0)) + 5267 931.490 * 1.160 * 1.160 * aimf * (a - aimf) / a * 5268 (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)) * 5269 (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)); 5270 5271 erot = jprf * jprf * 197.328 * 197.328 / (2.0 * iinert); 5272 // 5273 // Width 5274 if (densg == 0.0 || ee < (sbimf + erot)) 5275 { 5276 width_imf = 0.0; 5277 } 5278 else 5279 { 5280 // To take into account that at the barrier the system is deformed: 5281 // BSIMF = ((A-AIMF)**(2.D0/3.D0) + 5282 // AIMF**(2.D0/3.D0))/A**(2.D0/3.D0) 5283 bsimf = bscn; 5284 densniv( 5285 a, zprf, ee, sbimf, &densimf, 0.0, bsimf, 1.0, &timf, 0, 0, defbetimf, &ecor, jprf, 2, &qr); 5286 // 5287 imfarg = (sbimf + erotcn - erot) / timf; 5288 if (imfarg > 200.0) 5289 imfarg = 200.0; 5290 // 5291 // For IMF - The available phase space is given by the level 5292 // densities in CN at the barrier; applaying MOrretto -> 5293 // G=WIDTH*ro_CN(E-SBIMF)/ro_CN(E). Constant temperature 5294 // approximation: ro(E+dE)/ro(E)=exp(dE/T) Ratio DENSIMF/DENSCN is 5295 // included to take into account that at the barrier system is 5296 // deformed. If (above) BSIMF = 1 no deformation is considered and 5297 // this ratio is equal to 1. 5298 width_imf = 0.0; 5299 width_imf = width(a, zprf, aimf, zimf, timf, bimf, sbimf, ee - erot) * std::exp(-imfarg) * qr / 5300 qrcn; //*densimf/densg; 5301 } // if densg 5302 } // if aimf 5303 gimf5 = gimf5 + width_imf; 5304 } // for IAIMF 5305 // It is assumed that GIMFi = A_IMF*ZIMF**B_IMF; to get the total GIMF one 5306 // integrates Int(A_IMF*ZIMF**B_IMF)(3->ZPRF) 5307 5308 if (gimf3 <= 0.0 || gimf5 <= 0.0) 5309 { 5310 gimf = 0.0; 5311 b_imf = -100.0; 5312 a_imf = 0.0; 5313 } 5314 else 5315 { 5316 // 5317 b_imf = (std::log10(gimf3) - std::log10(gimf5)) / (std::log10(3.0) - std::log10(5.0)); 5318 // 5319 if (b_imf >= -1.01) 5320 b_imf = -1.01; 5321 if (b_imf <= -100.0) 5322 { 5323 b_imf = -100.0; 5324 a_imf = 0.0; 5325 gimf = 0.0; 5326 goto direct2007; 5327 } 5328 // 5329 a_imf = gimf3 / std::pow(3.0, b_imf); 5330 gimf = a_imf * (std::pow(zprf, b_imf + 1.0) - std::pow(3.0, b_imf + 1.0)) / (b_imf + 1.0); 5331 } 5332 5333 direct2007: 5334 if (gimf < 1.e-10) 5335 gimf = 0.0; 5336 } // if fimf_allowed 5337 // 5338 // c JLRS 2016 - Added this calculation 5339 // C AK 2004 - Gamma width 5340 // C According to A. Ignatyuk, GG : 5341 // C Here BS=BK=1, as this was assumed in the parameterization 5342 pa = (ald->av) * a + (ald->as) * std::pow(a, 2. / 3.) + (ald->ak) * std::pow(a, 1. / 3.); 5343 gamma = 2.5 * pa * std::pow(a, -4. / 3.); 5344 gfactor = 1. + gamma * ecld->ecgnz[in][iz]; 5345 if (gfactor <= 0.) 5346 { 5347 gfactor = 0.0; 5348 } 5349 // 5350 gtemp = 17.60 / (std::pow(a, 0.699) * std::sqrt(gfactor)); 5351 // 5352 // C If one switches gammas off, one should also switch off tunneling 5353 // through the fission barrier. 5354 gg = 0.624e-9 * std::pow(a, 1.6) * std::pow(gtemp, 5.); 5355 // gammaemission==1 5356 // C For fission fragments, GG is ~ 2 times larger than for 5357 // c "oridnary" nuclei (A. Ignatyuk, private communication). 5358 if (gammaemission == 1) 5359 { 5360 gg = 2.0 * gg; 5361 } 5362 ecg = 4.0 * gtemp; 5363 // 5364 // 5365 gsum = ga + ghe + gd + gt + gp + gn + gimf + gg + glamb0; 5366 5367 // std::cout << gn << " " << gd << " " << gp << std::endl; 5368 5369 if (gsum > 0.0) 5370 { 5371 ts1 = hbar / gsum; 5372 } 5373 else 5374 { 5375 ts1 = 1.0e99; 5376 goto direct69; 5377 } 5378 // 5379 // Case of nuclei below Businaro-Gallone mass asymmetry point 5380 if (fiss->ifis == 0 || (zprf * zprf / a <= 22.74 && zprf < 60.)) 5381 { 5382 goto direct69; 5383 } 5384 // 5385 // Calculation of the fission decay width 5386 // Deformation is calculated using the fissility 5387 // 5388 defbet = y; 5389 fission_width(zprf, a, ee, bssp, bksp, ef, y, &gf, &temp, jprf, 0, 1, fiss->optcol, fiss->optshp, densg); 5390 ft = temp; 5391 // 5392 // Case of very heavy nuclei that have no fission barrier 5393 // For them fission is the only decay channel available 5394 if (ef <= 0.0) 5395 { 5396 probf = 1.0; 5397 probp = 0.0; 5398 probd = 0.0; 5399 probt = 0.0; 5400 probn = 0.0; 5401 probhe = 0.0; 5402 proba = 0.0; 5403 probg = 0.0; 5404 probimf = 0.0; 5405 problamb0 = 0.0; 5406 goto direct70; 5407 } 5408 5409 if (fiss->bet <= 0.) 5410 { 5411 gtotal = ga + ghe + gp + gd + gt + gn + gg + gimf + gf + glamb0; 5412 if (gtotal <= 0.0) 5413 { 5414 probf = 0.0; 5415 probp = 0.0; 5416 probd = 0.0; 5417 probt = 0.0; 5418 probn = 0.0; 5419 probhe = 0.0; 5420 proba = 0.0; 5421 probg = 0.0; 5422 probimf = 0.0; 5423 problamb0 = 0.0; 5424 goto direct70; 5425 } 5426 else 5427 { 5428 probf = gf / gtotal; 5429 probn = gn / gtotal; 5430 probp = gp / gtotal; 5431 probd = gd / gtotal; 5432 probt = gt / gtotal; 5433 probhe = ghe / gtotal; 5434 proba = ga / gtotal; 5435 probg = gg / gtotal; 5436 probimf = gimf / gtotal; 5437 problamb0 = glamb0 / gtotal; 5438 goto direct70; 5439 } 5440 } 5441 } 5442 else 5443 { 5444 goto direct69; 5445 } 5446 // 5447 if (inum > ilast) 5448 { // new event means reset the time scale 5449 tsum = 0.; 5450 } 5451 // 5452 // kramers factor for the dynamical hindrances of fission 5453 fomega_sp(a, y, &mfcd, &omegasp, &homegasp); 5454 cf = cram((NbLam0 > 0 ? fiss->bethyp : fiss->bet), homegasp); 5455 // 5456 // We calculate the transient time 5457 fomega_gs(a, zprf, &k1, &omegags, &homegags); 5458 tauc = tau((NbLam0 > 0 ? fiss->bethyp : fiss->bet), homegags, ef, ft); 5459 gf = gf * cf; 5460 // 5461 /* 5462 c The subroutine part_fiss calculates the fission width GFF that corresponds 5463 to the time c dependence of the probability distribution obtained by solving 5464 the FOKKER-PLANCK eq c using a nucleus potential that is approximated by a 5465 parabola. It also gives the c decay time for this step T_LAPSE that includes 5466 all particle decay channels and the c fission channel. And it decides whether 5467 the nucleus decays by particle evaporation c CHOICE_FISSPART = 1 or fission 5468 CHOICE_FISSPART = 2 5469 */ 5470 // 5471 part_fiss((NbLam0 > 0 ? fiss->bethyp : fiss->bet), gsum, gf, y, tauc, ts1, tsum, &choice_fisspart, zprf, a, ft, &t_lapse, &gff); 5472 gf = gff; 5473 // 5474 // We accumulate in TSUM the mean decay for this step including all particle 5475 // decay channels and fission 5476 tsum = tsum + t_lapse; 5477 5478 // If fission occurs 5479 if (choice_fisspart == 2) 5480 { 5481 probf = 1.0; 5482 probp = 0.0; 5483 probd = 0.0; 5484 probt = 0.0; 5485 probn = 0.0; 5486 probhe = 0.0; 5487 proba = 0.0; 5488 probg = 0.0; 5489 probimf = 0.0; 5490 problamb0 = 0.0; 5491 goto direct70; 5492 } 5493 else 5494 { 5495 // If particle evaporation occurs 5496 // The probabilities for the different decays are calculated taking into 5497 // account the fission width GFF that corresponds to this step 5498 5499 gtotal = ga + ghe + gp + gd + gt + gn + gimf + gg + glamb0; 5500 if (gtotal <= 0.0) 5501 { 5502 probf = 0.0; 5503 probp = 0.0; 5504 probd = 0.0; 5505 probt = 0.0; 5506 probn = 0.0; 5507 probhe = 0.0; 5508 proba = 0.0; 5509 probg = 0.0; 5510 probimf = 0.0; 5511 problamb0 = 0.0; 5512 goto direct70; 5513 } 5514 else 5515 { 5516 probf = 0.0; 5517 probn = gn / gtotal; 5518 probp = gp / gtotal; 5519 probd = gd / gtotal; 5520 probt = gt / gtotal; 5521 probhe = ghe / gtotal; 5522 proba = ga / gtotal; 5523 probg = gg / gtotal; 5524 probimf = gimf / gtotal; 5525 problamb0 = glamb0 / gtotal; 5526 goto direct70; 5527 } 5528 } 5529 // 5530 direct69: 5531 gtotal = ga + ghe + gp + gd + gt + gn + gg + gimf + glamb0; 5532 if (gtotal <= 0.0) 5533 { 5534 probf = 0.0; 5535 probp = 0.0; 5536 probd = 0.0; 5537 probt = 0.0; 5538 probn = 0.0; 5539 probhe = 0.0; 5540 proba = 0.0; 5541 probg = 0.0; 5542 probimf = 0.0; 5543 problamb0 = 0.0; 5544 } 5545 else 5546 { 5547 probf = 0.0; 5548 probn = gn / gtotal; 5549 probp = gp / gtotal; 5550 probd = gd / gtotal; 5551 probt = gt / gtotal; 5552 probhe = ghe / gtotal; 5553 proba = ga / gtotal; 5554 probg = gg / gtotal; 5555 probimf = gimf / gtotal; 5556 problamb0 = glamb0 / gtotal; 5557 } 5558 5559 direct70: 5560 ptotl = probp + probd + probt + probn + probhe + proba + probg + probimf + probf + problamb0; 5561 // 5562 ee = eer; 5563 ilast = inum; 5564 5565 // Return values: 5566 (*probp_par) = probp; 5567 (*probd_par) = probd; 5568 (*probt_par) = probt; 5569 (*probn_par) = probn; 5570 (*probhe_par) = probhe; 5571 (*proba_par) = proba; 5572 (*probg_par) = probg; 5573 (*probimf_par) = probimf; 5574 (*problamb0_par) = problamb0; 5575 (*probf_par) = probf; 5576 (*ptotl_par) = ptotl; 5577 (*sn_par) = sn; 5578 (*sp_par) = sp; 5579 (*sd_par) = sd; 5580 (*st_par) = st; 5581 (*she_par) = she; 5582 (*sa_par) = sa; 5583 (*slamb0_par) = slamb0; 5584 (*sbp_par) = sbp; 5585 (*sbd_par) = sbd; 5586 (*sbt_par) = sbt; 5587 (*sbhe_par) = sbhe; 5588 (*sba_par) = sba; 5589 (*ecn_par) = ecn; 5590 (*ecp_par) = ecp; 5591 (*ecd_par) = ecd; 5592 (*ect_par) = ect; 5593 (*eche_par) = eche; 5594 (*eca_par) = eca; 5595 (*ecg_par) = ecg; 5596 (*eclamb0_par) = eclamb0; 5597 (*bp_par) = bp; 5598 (*bd_par) = bd; 5599 (*bt_par) = bt; 5600 (*bhe_par) = bhe; 5601 (*ba_par) = ba; 5602 (*tcn) = ftcn; 5603 (*ts1_par) = ts1; 5604 (*jprfn_par) = jprfn; 5605 (*jprfp_par) = jprfp; 5606 (*jprfd_par) = jprfd; 5607 (*jprft_par) = jprft; 5608 (*jprfhe_par) = jprfhe; 5609 (*jprfa_par) = jprfa; 5610 (*jprflamb0_par) = jprflamb0; 5611 (*tsum_par) = tsum; 5612 return; 5613 } 5614 5615 void G4Abla::densniv(G4double a, 5616 G4double z, 5617 G4double ee, 5618 G4double esous, 5619 G4double* dens, 5620 G4double bshell, 5621 G4double bsin, 5622 G4double bkin, 5623 G4double* temp, 5624 G4int optshp, 5625 G4int optcol, 5626 G4double defbet, 5627 G4double* ecor, 5628 G4double jprf, 5629 G4int ifis, 5630 G4double* qr) 5631 { 5632 // 1498 C 5633 // 1499 C INPUT: 5634 // 1500 C A,EE,ESOUS,OPTSHP,BS,BK,BSHELL,DEFBET 5635 // 1501 C 5636 // 1502 C LEVEL DENSITY PARAMETERS 5637 // 1503 C COMMON /ALD/ AV,AS,AK,OPTAFAN 5638 // 1504 C AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE 5639 // 1505 C LEVEL DENSITY PARAMETER 5640 // 1506 C OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1 5641 // 1507 C RECOMMENDED IS OPTAFAN = 0 5642 // 1508 5643 // C--------------------------------------------------------------------- 5644 // 1509 C OUTPUT: DENS,TEMP 5645 // 1510 C 5646 // 1511 C 5647 // ____________________________________________________________________ 1512 5648 // C / 1513 C / PROCEDURE FOR CALCULATING THE STATE DENSITY OF A 5649 // COMPOUND NUCLEUS 1514 C 5650 // /____________________________________________________________________ 5651 // 1515 C 5652 // 1516 INTEGER AFP,IZ,OPTSHP,OPTCOL,J,OPTAFAN 5653 // 1517 REAL*8 5654 // A,EE,ESOUS,DENS,E,Y0,Y1,Y2,Y01,Y11,Y21,PA,BS,BK,TEMP 1518 5655 // C=====INSERTED BY KUDYAEV=============================================== 5656 // 1519 COMMON /ALD/ AV,AS,AK,OPTAFAN 5657 // 1520 REAL*8 5658 // ECR,ER,DELTAU,Z,DELTPP,PARA,PARZ,FE,HE,ECOR,ECOR1,Pi6 5659 // 1521 REAL*8 5660 // BSHELL,DELTA0,AV,AK,AS,PONNIV,PONFE,DEFBET,QR,SIG,FP 1522 5661 // C======================================================================= 5662 // 1523 C 5663 // 1524 C 5664 // 1525 5665 // C----------------------------------------------------------------------- 5666 // 1526 C A MASS NUMBER OF THE DAUGHTER NUCLEUS 5667 // 1527 C EE EXCITATION ENERGY OF THE MOTHER NUCLEUS 5668 // 1528 C ESOUS SEPARATION ENERGY PLUS EFFECTIVE COULOMB 5669 // BARRIER 5670 // 1529 C DENS STATE DENSITY OF DAUGHTER NUCLEUS AT 5671 // EE-ESOUS-EC 1530 C BSHELL SHELL CORRECTION 1531 C TEMP 5672 // NUCLEAR TEMPERATURE 1532 C E LOCAL EXCITATION ENERGY OF THE 5673 // DAUGHTER NUCLEUS 1533 C E1 LOCAL HELP VARIABLE 5674 // 1534 C Y0,Y1,Y2,Y01,Y11,Y21 5675 // 1535 C LOCAL HELP VARIABLES 5676 // 1536 C PA LOCAL STATE-DENSITY PARAMETER 5677 // 1537 C EC KINETIC ENERGY OF EMITTED PARTICLE 5678 // WITHOUT 1538 C COULOMB REPULSION 1539 C IDEN 5679 // FAKTOR FOR SUBSTRACTING KINETIC ENERGY IDEN*TEMP 1540 C DELTA0 5680 // PAIRING GAP 12 FOR GROUND STATE 1541 C 14 FOR 5681 // SADDLE POINT 1542 C EITERA HELP VARIABLE FOR 5682 // TEMPERATURE ITERATION 1543 5683 // C----------------------------------------------------------------------- 5684 // 1544 C 5685 // 1545 C 5686 G4double delta0 = 0.0; 5687 G4double deltau = 0.0; 5688 G4double deltpp = 0.0; 5689 G4double e = 0.0; 5690 G4double e0 = 0.0; 5691 G4double ecor1 = 0.0; 5692 G4double ecr = 10.0; 5693 G4double fe = 0.0; 5694 G4double he = 0.0; 5695 G4double pa = 0.0; 5696 G4double para = 0.0; 5697 G4double parz = 0.0; 5698 G4double ponfe = 0.0; 5699 G4double ponniv = 0.0; 5700 G4double fqr = 1.0; 5701 G4double y01 = 0.0; 5702 G4double y11 = 0.0; 5703 G4double y2 = 0.0; 5704 G4double y21 = 0.0; 5705 G4double y1 = 0.0; 5706 G4double y0 = 0.0; 5707 G4double fnorm = 0.0; 5708 G4double fp_per = 0.; 5709 G4double fp_par = 0.; 5710 G4double sig_per = 0.; 5711 G4double sig_par = 0.; 5712 G4double sigma2; 5713 G4double jfact = 1.; 5714 G4double erot = 0.; 5715 G4double fdens = 0.; 5716 G4double fecor = 0.; 5717 G4double BSHELLCT = 0.; 5718 G4double gamma = 0.; 5719 G4double ftemp = 0.0; 5720 G4double tempct = 0.0; 5721 G4double densfm = 0.0; 5722 G4double densct = 0.0; 5723 G4double ein = 0.; 5724 G4double elim; 5725 G4double tfm; 5726 G4double bs = bsin; 5727 G4double bk = bkin; 5728 G4int IPARITE; 5729 G4int IOPTCT = fiss->optct; 5730 // 5731 G4double pi6 = std::pow(3.1415926535, 2) / 6.0; 5732 G4double pi = 3.1415926535; 5733 // 5734 G4int afp = idnint(a); 5735 G4int iz = idnint(z); 5736 G4int in = afp - iz; 5737 // 5738 if (ifis != 1) 5739 { 5740 BSHELLCT = ecld->ecgnz[in][iz]; 5741 } 5742 else 5743 { 5744 BSHELLCT = 0.0; 5745 } 5746 if (afp <= 20) 5747 BSHELLCT = 0.0; 5748 // 5749 parite(a, ¶); 5750 if (para < 0.0) 5751 { 5752 // Odd A 5753 IPARITE = 1; 5754 } 5755 else 5756 { 5757 // Even A 5758 parite(z, &parz); 5759 if (parz > 0.0) 5760 { 5761 // Even Z, even N 5762 IPARITE = 2; 5763 } 5764 else 5765 { 5766 // Odd Z, odd N 5767 IPARITE = 0; 5768 } 5769 } 5770 // 5771 ein = ee - esous; 5772 // 5773 if (ein > 1.e30) 5774 { 5775 fdens = 0.0; 5776 ftemp = 0.5; 5777 goto densniv100; 5778 } 5779 // 5780 e = ee - esous; 5781 // 5782 if (e < 0.0 && ifis != 1) 5783 { // TUNNELING 5784 fdens = 0.0; 5785 densfm = 0.0; 5786 densct = 0.0; 5787 if (ald->optafan == 1) 5788 { 5789 pa = (ald->av) * a + (ald->as) * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * std::pow(a, (1.e0 / 3.e0)); 5790 } 5791 else 5792 { 5793 pa = (ald->av) * a + (ald->as) * bsin * std::pow(a, (2.e0 / 3.e0)) + 5794 (ald->ak) * bkin * std::pow(a, (1.e0 / 3.e0)); 5795 } 5796 gamma = 2.5 * pa * std::pow(a, -4.0 / 3.0); 5797 fecor = 0.0; 5798 goto densniv100; 5799 } 5800 // 5801 if (ifis == 0 && bs != 1.0) 5802 { 5803 // - With increasing excitation energy system in getting less and less 5804 // deformed: 5805 G4double ponq = (e - 100.0) / 5.0; 5806 if (ponq > 700.0) 5807 ponq = 700.0; 5808 bs = 1.0 / (1.0 + std::exp(-ponq)) + 1.0 / (1.0 + std::exp(ponq)) * bsin; 5809 bk = 1.0 / (1.0 + std::exp(-ponq)) + 1.0 / (1.0 + std::exp(ponq)) * bkin; 5810 } 5811 // 5812 // level density parameter 5813 if (ald->optafan == 1) 5814 { 5815 pa = (ald->av) * a + (ald->as) * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * std::pow(a, (1.e0 / 3.e0)); 5816 } 5817 else 5818 { 5819 pa = (ald->av) * a + (ald->as) * bs * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * bk * std::pow(a, (1.e0 / 3.e0)); 5820 } 5821 // 5822 gamma = 2.5 * pa * std::pow(a, -4.0 / 3.0); 5823 // 5824 // AK - 2009 - trial, in order to have transition to constant-temperature 5825 // approach Idea - at the phase transition superfluid-normal fluid, TCT = 5826 // TEMP, and this determines critical energy for pairing. 5827 if (a > 0.0) 5828 { 5829 ecr = pa * 17.60 / (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)) * 17.60 / 5830 (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)); 5831 } 5832 5833 // pairing corrections 5834 if (ifis == 1) 5835 { 5836 delta0 = 14; 5837 } 5838 else 5839 { 5840 delta0 = 12; 5841 } 5842 5843 // shell corrections 5844 if (optshp > 0) 5845 { 5846 deltau = bshell; 5847 if (optshp == 2) 5848 { 5849 deltau = 0.0; 5850 } 5851 if (optshp >= 2) 5852 { 5853 // pairing energy shift with condensation energy a.r.j. 10.03.97 5854 // deltpp = -0.25e0* (delta0/pow(sqrt(a),2)) * pa /pi6 5855 // + 2.e0*delta0/sqrt(a); 5856 deltpp = -0.25e0 * std::pow((delta0 / std::sqrt(a)), 2) * pa / pi6 + 22.34e0 * std::pow(a, -0.464) - 0.235; 5857 // Odd A 5858 if (IPARITE == 1) 5859 { 5860 // e = e - delta0/sqrt(a); 5861 e = e - (0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * a); //-30./a;//FIXME 5862 } 5863 // Even Z, even N 5864 if (IPARITE == 2) 5865 { 5866 e = e - (22.34 * std::pow(a, -0.464) - 0.235); //-30./a;//FIXME 5867 } 5868 // Odd Z, odd N 5869 if (IPARITE == 0) 5870 { 5871 if (in == iz) 5872 { 5873 // e = e; 5874 } 5875 else 5876 { 5877 // e = e-30./a; 5878 } 5879 } 5880 } 5881 else 5882 { 5883 deltpp = 0.0; 5884 } 5885 } 5886 else 5887 { 5888 deltau = 0.0; 5889 deltpp = 0.0; 5890 } 5891 5892 if (e < 0.0) 5893 { 5894 e = 0.0; 5895 ftemp = 0.5; 5896 } 5897 5898 // washing out is made stronger 5899 ponfe = -2.5 * pa * e * std::pow(a, (-4.0 / 3.0)); 5900 5901 if (ponfe < -700.0) 5902 { 5903 ponfe = -700.0; 5904 } 5905 fe = 1.0 - std::exp(ponfe); 5906 if (e < ecr) 5907 { 5908 // priv. comm. k.-h. schmidt 5909 he = 1.0 - std::pow((1.0 - e / ecr), 2); 5910 } 5911 else 5912 { 5913 he = 1.0; 5914 } 5915 // Excitation energy corrected for pairing and shell effects 5916 // washing out with excitation energy is included. 5917 fecor = e + deltau * fe + deltpp * he; 5918 if (fecor <= 0.1) 5919 { 5920 fecor = 0.1; 5921 } 5922 // iterative procedure according to grossjean and feldmeier 5923 // to avoid the singularity e = 0 5924 if (ee < 5.0) 5925 { 5926 y1 = std::sqrt(pa * fecor); 5927 for (G4int j = 0; j < 5; j++) 5928 { 5929 y2 = pa * fecor * (1.e0 - std::exp(-y1)); 5930 y1 = std::sqrt(y2); 5931 } 5932 y0 = pa / y1; 5933 ftemp = 1.0 / y0; 5934 fdens = std::exp(y0 * fecor) / 5935 (std::pow((std::pow(fecor, 3) * y0), 0.5) * std::pow((1.0 - 0.5 * y0 * fecor * std::exp(-y1)), 0.5)) * 5936 std::exp(y1) * (1.0 - std::exp(-y1)) * 0.1477045; 5937 if (fecor < 1.0) 5938 { 5939 ecor1 = 1.0; 5940 y11 = std::sqrt(pa * ecor1); 5941 for (G4int j = 0; j < 7; j++) 5942 { 5943 y21 = pa * ecor1 * (1.0 - std::exp(-y11)); 5944 y11 = std::sqrt(y21); 5945 } 5946 5947 y01 = pa / y11; 5948 fdens = fdens * std::pow((y01 / y0), 1.5); 5949 ftemp = ftemp * std::pow((y01 / y0), 1.5); 5950 } 5951 } 5952 else 5953 { 5954 ponniv = 2.0 * std::sqrt(pa * fecor); 5955 if (ponniv > 700.0) 5956 { 5957 ponniv = 700.0; 5958 } 5959 // fermi gas state density 5960 fdens = 0.1477045 * std::exp(ponniv) / (std::pow(pa, 0.25) * std::pow(fecor, 1.25)); 5961 ftemp = std::sqrt(fecor / pa); 5962 } 5963 // 5964 densfm = fdens; 5965 tfm = ftemp; 5966 // 5967 if (IOPTCT == 0) 5968 goto densniv100; 5969 tempct = 17.60 / (std::pow(a, 0.699) * std::sqrt(1. + gamma * BSHELLCT)); 5970 // tempct = 1.0 / ( (0.0570 + 0.00193*BSHELLCT) * pow(a,0.6666667)); // from 5971 // PRC 80 (2009) 054310 5972 5973 // - CONSTANT-TEMPERATURE LEVEL DENSITY PARAMETER (ONLY AT LOW ENERGIES) 5974 if (e < 30.) 5975 { 5976 if (a > 0.0) 5977 { 5978 if (optshp >= 2) 5979 { 5980 // Parametrization of CT model by Ignatyuk; note that E0 is shifted to 5981 // correspond to pairing shift in Fermi-gas model (there, energy is 5982 // shifted taking odd-odd nuclei 5983 // as bassis) 5984 // e-o, o-e 5985 if (IPARITE == 1) 5986 { 5987 e0 = 0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * a; 5988 } 5989 // e-e 5990 if (IPARITE == 2) 5991 { 5992 e0 = 22.34 * std::pow(a, -0.464) - 0.235; 5993 } 5994 // o-o 5995 if (IPARITE == 0) 5996 { 5997 e0 = 0.0; 5998 } 5999 6000 ponniv = (ein - e0) / tempct; 6001 if (ifis != 1) 6002 ponniv = max(0.0, (ein - e0) / tempct); 6003 if (ponniv > 700.0) 6004 { 6005 ponniv = 700.0; 6006 } 6007 densct = std::exp(ponniv) / tempct * std::exp(0.079 * BSHELLCT / tempct); 6008 6009 elim = ein; 6010 6011 if (elim >= ecr && densfm <= densct) 6012 { 6013 fdens = densfm; 6014 // IREGCT = 0; 6015 } 6016 else 6017 { 6018 fdens = densct; 6019 // IREGCT = 1; 6020 // ecor = min(ein-e0,0.10); 6021 } 6022 if (elim >= ecr && tfm >= tempct) 6023 { 6024 ftemp = tfm; 6025 } 6026 else 6027 { 6028 ftemp = tempct; 6029 } 6030 } 6031 else 6032 { 6033 // Case of no pairing considered 6034 // ETEST = PA * TEMPCT**2 6035 ponniv = (ein) / tempct; 6036 if (ponniv > 700.0) 6037 { 6038 ponniv = 700.0; 6039 } 6040 densct = std::exp(ponniv) / tempct; 6041 6042 if (ein >= ecr && densfm <= densct) 6043 { 6044 fdens = densfm; 6045 ftemp = tfm; 6046 // IREGCT = 0; 6047 } 6048 else 6049 { 6050 fdens = densct; 6051 ftemp = tempct; 6052 // ECOR = DMIN1(EIN,0.1D0) 6053 } 6054 6055 if (ein >= ecr && tfm >= tempct) 6056 { 6057 ftemp = tfm; 6058 } 6059 else 6060 { 6061 ftemp = tempct; 6062 } 6063 } 6064 } 6065 } 6066 6067 densniv100: 6068 6069 if (fdens == 0.0) 6070 { 6071 if (a > 0.0) 6072 { 6073 // Parametrization of CT model by Ignatyuk done for masses > 20 6074 ftemp = 17.60 / (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)); 6075 // ftemp = 1.0 / ( (0.0570 + 0.00193*BSHELLCT) * pow(a,0.6666667)); // 6076 // from PRC 80 (2009) 054310 6077 } 6078 else 6079 { 6080 ftemp = 0.5; 6081 } 6082 } 6083 // 6084 // spin cutoff parameter 6085 /* 6086 C PERPENDICULAR AND PARALLEL MOMENT OF INERTIA 6087 c fnorm = R0*M0/hbar**2 = 1.16fm*931.49MeV/c**2 /(6.582122e-22 MeVs)**2 and is 6088 c in units 1/MeV 6089 */ 6090 fnorm = std::pow(1.16, 2) * 931.49 * 1.e-2 / (9.0 * std::pow(6.582122, 2)); 6091 6092 if (ifis == 0 || ifis == 2) 6093 { 6094 /* 6095 C GROUND STATE: 6096 C FP_PER ~ 1+0.5*alpha2, FP_PAR ~ 1-alpha2 (Hasse & Myers, Geom. relat. 6097 macr. nucl. phys.) C alpha2 = sqrt(5/(4*pi))*beta2 6098 */ 6099 fp_per = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 + 0.50 * defbet * std::sqrt(5.0 / (4.0 * pi))); 6100 fp_par = 0.40 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 - defbet * std::sqrt(5.0 / (4.0 * pi))); 6101 } 6102 else 6103 { 6104 if (ifis == 1) 6105 { 6106 /* 6107 C SADDLE POINT 6108 C See Hasse&Myer, p. 100 6109 C Perpendicular moment of inertia 6110 */ 6111 fp_per = 2.0 / 5.0 * std::pow(a, 5.0 / 3.0) * fnorm * 6112 (1.0 + 7.0 / 6.0 * defbet * (1.0 + 1396.0 / 255.0 * defbet)); 6113 // Parallel moment of inertia 6114 fp_par = 2.0 / 5.0 * std::pow(a, 5.0 / 3.0) * fnorm * 6115 (1.0 - 7.0 / 3.0 * defbet * (1.0 - 389.0 / 255.0 * defbet)); 6116 } 6117 else 6118 { 6119 if (ifis == 20) 6120 { 6121 // IMF - two fragments in contact; it is asumed that both are spherical. 6122 // See Hasse&Myers, p.106 6123 // Here, DEFBET = R1/R2, where R1 and R2 are radii of IMF and its 6124 // partner Perpendicular moment of inertia 6125 fp_per = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * 3.50 * (1.0 + std::pow(defbet, 5.)) / 6126 std::pow(1.0 + defbet * defbet * defbet, 5.0 / 3.0); 6127 fp_par = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 + std::pow(defbet, 5.0)) / 6128 std::pow(1.0 + defbet * defbet * defbet, 5.0 / 3.0); 6129 } 6130 } 6131 } 6132 if (fp_par < 0.0) 6133 fp_par = 0.0; 6134 if (fp_per < 0.0) 6135 fp_per = 0.0; 6136 // 6137 sig_per = std::sqrt(fp_per * ftemp); 6138 sig_par = std::sqrt(fp_par * ftemp); 6139 // 6140 sigma2 = sig_per * sig_per + sig_par * sig_par; 6141 jfact = (2. * jprf + 1.) * std::exp(-1. * jprf * (jprf + 1.0) / (2.0 * sigma2)) / 6142 (std::sqrt(8.0 * 3.1415) * std::pow(sigma2, 1.5)); 6143 erot = jprf * jprf / (2.0 * std::sqrt(fp_par * fp_par + fp_per * fp_per)); 6144 // 6145 // collective enhancement 6146 if (optcol == 1) 6147 { 6148 qrot(z, a, defbet, sig_per, fecor - erot, &fqr); 6149 } 6150 else 6151 { 6152 fqr = 1.0; 6153 } 6154 // 6155 fdens = fdens * fqr * jfact; 6156 // 6157 if (fdens < 1e-300) 6158 fdens = 0.0; 6159 // 6160 *dens = fdens; 6161 *ecor = fecor; 6162 *temp = ftemp; 6163 *qr = fqr; 6164 } 6165 6166 void G4Abla::qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u, G4double* qr) 6167 { 6168 /* 6169 C QROT INCLUDING DAMPING 6170 C 6171 C INPUT: Z,A,DEFBET,SIG,U 6172 C 6173 C OUTPUT: QR - COLLECTIVE ENHANCEMENT FACTOR 6174 C 6175 C SEE JUNGHANS ET AL., NUCL. PHYS. A 629 (1998) 635 6176 C 6177 C 6178 C FR(U) EXPONENTIAL FUNCTION TO DEFINE DAMPING 6179 C UCR CRITICAL ENERGY FOR DAMPING 6180 C DCR WIDTH OF DAMPING 6181 C DEFBET BETA-DEFORMATION ! 6182 C SIG PERPENDICULAR SPIN CUTOFF FACTOR 6183 C U ENERGY 6184 C QR COEFFICIENT OF COLLECTIVE ENHANCEMENT 6185 C A MASS NUMBER 6186 C Z CHARGE NUMBER 6187 C 6188 */ 6189 // JLRS: July 2016: new values for the collective parameters 6190 // 6191 6192 G4double ucr = fiss->ucr; // Critical energy for damping. 6193 G4double dcr = fiss->dcr; // Width of damping. 6194 G4double ponq = 0.0, dn = 0.0, n = 0.0, dz = 0.0; 6195 G4int distn, distz, ndist, zdist; 6196 G4int nmn[8] = { 2, 8, 14, 20, 28, 50, 82, 126 }; 6197 G4int nmz[8] = { 2, 8, 14, 20, 28, 50, 82, 126 }; 6198 // 6199 sig = sig * sig; 6200 // 6201 if (std::abs(bet) <= 0.15) 6202 { 6203 goto qrot10; 6204 } 6205 else 6206 { 6207 goto qrot11; 6208 } 6209 // 6210 qrot10: 6211 n = a - z; 6212 distn = 10000000; 6213 distz = 10000000; 6214 6215 for (G4int i = 0; i < 8; i++) 6216 { 6217 ndist = std::fabs(idnint(n) - nmn[i]); 6218 if (ndist < distn) 6219 distn = ndist; 6220 zdist = std::fabs(idnint(z) - nmz[i]); 6221 if (zdist < distz) 6222 distz = zdist; 6223 } 6224 6225 dz = G4float(distz); 6226 dn = G4float(distn); 6227 6228 bet = 0.022 + 0.003 * dn + 0.002 * dz; 6229 6230 sig = 75.0 * std::pow(bet, 2.) * sig; 6231 6232 // NO VIBRATIONAL ENHANCEMENT 6233 qrot11: 6234 ponq = (u - ucr) / dcr; 6235 6236 if (ponq > 700.0) 6237 { 6238 ponq = 700.0; 6239 } 6240 if (sig < 1.0) 6241 { 6242 sig = 1.0; 6243 } 6244 (*qr) = 1.0 / (1.0 + std::exp(ponq)) * (sig - 1.0) + 1.0; 6245 6246 if ((*qr) < 1.0) 6247 { 6248 (*qr) = 1.0; 6249 } 6250 6251 return; 6252 } 6253 6254 void G4Abla::lpoly(G4double x, G4int n, G4double pl[]) 6255 { 6256 // THIS SUBROUTINE CALCULATES THE ORDINARY LEGENDRE POLYNOMIALS OF 6257 // ORDER 0 TO N-1 OF ARGUMENT X AND STORES THEM IN THE VECTOR PL. 6258 // THEY ARE CALCULATED BY RECURSION RELATION FROM THE FIRST TWO 6259 // POLYNOMIALS. 6260 // WRITTEN BY A.J.SIERK LANL T-9 FEBRUARY, 1984 6261 // NOTE: PL AND X MUST BE DOUBLE PRECISION ON 32-BIT COMPUTERS! 6262 6263 pl[0] = 1.0; 6264 pl[1] = x; 6265 6266 for (G4int i = 2; i < n; i++) 6267 { 6268 pl[i] = ((2 * G4double(i + 1) - 3.0) * x * pl[i - 1] - (G4double(i + 1) - 2.0) * pl[i - 2]) / 6269 (G4double(i + 1) - 1.0); 6270 } 6271 } 6272 6273 G4double G4Abla::eflmac(G4int ia, G4int iz, G4int flag, G4int optshp) 6274 { 6275 // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS. 6276 // SWITCH FOR PAIRING INCLUDED AS WELL. 6277 // BINDING = EFLMAC(IA,IZ,0,OPTSHP) 6278 // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C 6279 // A.J. 15.07.96 6280 6281 // this function will calculate the liquid-drop nuclear mass for spheri 6282 // configuration according to the preprint NUCLEAR GROUND-STATE 6283 // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. 6284 // All constants are taken from this publication for consistency. 6285 6286 // Parameters: 6287 // a: nuclear mass number 6288 // z: nuclear charge 6289 // flag: 0 - return mass excess 6290 // otherwise - return pairing (= -1/2 dpn + 1/2 (Dp + Dn)) 6291 6292 G4double eflmacResult = 0.0; 6293 6294 if (ia == 0) 6295 return eflmacResult; 6296 6297 G4int in = 0; 6298 G4double z = 0.0, n = 0.0, a = 0.0, av = 0.0, as = 0.0; 6299 G4double a0 = 0.0, c1 = 0.0, c4 = 0.0, b1 = 0.0, b3 = 0.0; 6300 G4double ff = 0.0, ca = 0.0, w = 0.0, efl = 0.0; 6301 G4double r0 = 0.0, kf = 0.0, ks = 0.0; 6302 G4double kv = 0.0, rp = 0.0, ay = 0.0, aden = 0.0, x0 = 0.0, y0 = 0.0; 6303 G4double esq = 0.0, ael = 0.0, i = 0.0, e0 = 0.0; 6304 G4double pi = 3.141592653589793238e0; 6305 6306 // fundamental constants 6307 // electronic charge squared 6308 esq = 1.4399764; 6309 6310 // constants from considerations other than nucl. masses 6311 // electronic binding 6312 ael = 1.433e-5; 6313 6314 // proton rms radius 6315 rp = 0.8; 6316 6317 // nuclear radius constant 6318 r0 = 1.16; 6319 6320 // range of yukawa-plus-expon. potential 6321 ay = 0.68; 6322 6323 // range of yukawa function used to generate 6324 // nuclear charge distribution 6325 aden = 0.70; 6326 6327 // wigner constant 6328 w = 30.0; 6329 6330 // adjusted parameters 6331 // volume energy 6332 av = 16.00126; 6333 6334 // volume asymmetry 6335 kv = 1.92240; 6336 6337 // surface energy 6338 as = 21.18466; 6339 6340 // surface asymmetry 6341 ks = 2.345; 6342 // a^0 constant 6343 a0 = 2.615; 6344 6345 // charge asymmetry 6346 ca = 0.10289; 6347 6348 z = G4double(iz); 6349 a = G4double(ia); 6350 in = ia - iz; 6351 n = G4double(in); 6352 6353 if (flag == 1) 6354 { 6355 goto eflmac311; 6356 } 6357 6358 if (iz < 13 && in < 3) 6359 { 6360 if (masses->mexpiop[in][iz] == 1) 6361 { 6362 return masses->bind[in][iz]; 6363 } 6364 } 6365 6366 eflmac311: 6367 6368 c1 = 3.0 / 5.0 * esq / r0; 6369 c4 = 5.0 / 4.0 * std::pow((3.0 / (2.0 * pi)), (2.0 / 3.0)) * c1; 6370 kf = std::pow((9.0 * pi * z / (4.0 * a)), (1.0 / 3.0)) / r0; 6371 6372 ff = -1.0 / 8.0 * rp * rp * esq / std::pow(r0, 3) * 6373 (145.0 / 48.0 - 327.0 / 2880.0 * std::pow(kf, 2) * std::pow(rp, 2) + 6374 1527.0 / 1209600.0 * std::pow(kf, 4) * std::pow(rp, 4)); 6375 i = (n - z) / a; 6376 6377 x0 = r0 * std::pow(a, (1.0 / 3.0)) / ay; 6378 y0 = r0 * std::pow(a, (1.0 / 3.0)) / aden; 6379 6380 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); 6381 6382 b3 = 1.0 - 5.0 / std::pow(y0, 2) * 6383 (1.0 - 15.0 / (8.0 * y0) + 21.0 / (8.0 * std::pow(y0, 3)) - 6384 3.0 / 4.0 * (1.0 + 9.0 / (2.0 * y0) + 7.0 / std::pow(y0, 2) + 7.0 / (2.0 * std::pow(y0, 3))) * 6385 std::exp(-2.0 * y0)); 6386 6387 // now calculation of total binding energy a.j. 16.7.96 6388 6389 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 + 6390 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)) + 6391 ff * std::pow(z, 2) / a - ca * (n - z) - ael * std::pow(z, (2.39e0)); 6392 6393 efl = efl + w * std::abs(i); 6394 6395 // pairing is made optional 6396 if (optshp >= 2) 6397 { 6398 // average pairing 6399 if (in == iz && (mod(in, 2) == 1) && (mod(iz, 2) == 1) && in > 0.) 6400 { 6401 efl = efl + w / a; 6402 } 6403 6404 // AK 2008 - Parametrization of CT model by Ignatyuk; 6405 // The following part has been introduced in order to have correspondance 6406 // between pairing in masses and level densities; 6407 // AK 2010 note that E0 is shifted to correspond to pairing shift in 6408 // Fermi-gas model (there, energy is shifted taking odd-odd nuclei 6409 // as bassis) 6410 6411 G4double para = 0.; 6412 parite(a, ¶); 6413 6414 if (para < 0.0) 6415 { 6416 // e-o, o-e 6417 e0 = 0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * (a); 6418 } 6419 else 6420 { 6421 G4double parz = 0.; 6422 parite(z, &parz); 6423 if (parz > 0.0) 6424 { 6425 // e-e 6426 e0 = 22.34 * std::pow(a, -0.464) - 0.235; 6427 } 6428 else 6429 { 6430 // o-o 6431 e0 = 0.0; 6432 } 6433 } 6434 efl = efl - e0; 6435 // end if for pairing term 6436 } 6437 6438 eflmacResult = efl; 6439 6440 return eflmacResult; 6441 } 6442 6443 void G4Abla::appariem(G4double a, G4double z, G4double* del) 6444 { 6445 // CALCUL DE LA CORRECTION, DUE A L'APPARIEMENT, DE L'ENERGIE DE 6446 // LIAISON D'UN NOYAU 6447 // PROCEDURE FOR CALCULATING THE PAIRING CORRECTION TO THE BINDING 6448 // ENERGY OF A SPECIFIC NUCLEUS 6449 6450 G4double para = 0.0, parz = 0.0; 6451 // A MASS NUMBER 6452 // Z NUCLEAR CHARGE 6453 // PARA HELP VARIABLE FOR PARITY OF A 6454 // PARZ HELP VARIABLE FOR PARITY OF Z 6455 // DEL PAIRING CORRECTION 6456 6457 parite(a, ¶); 6458 6459 if (para < 0.0) 6460 { 6461 (*del) = 0.0; 6462 } 6463 else 6464 { 6465 parite(z, &parz); 6466 if (parz > 0.0) 6467 { 6468 (*del) = -12.0 / std::sqrt(a); 6469 } 6470 else 6471 { 6472 (*del) = 12.0 / std::sqrt(a); 6473 } 6474 } 6475 } 6476 6477 void G4Abla::parite(G4double n, G4double* par) 6478 { 6479 // CALCUL DE LA PARITE DU NOMBRE N 6480 // 6481 // PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N. 6482 // RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN 6483 6484 G4double n1 = 0.0, n2 = 0.0, n3 = 0.0; 6485 6486 // N NUMBER TO BE TESTED 6487 // N1,N2 HELP VARIABLES 6488 // PAR HELP VARIABLE FOR PARITY OF N 6489 6490 n3 = G4double(idnint(n)); 6491 n1 = n3 / 2.0; 6492 n2 = n1 - dint(n1); 6493 6494 if (n2 > 0.0) 6495 { 6496 (*par) = -1.0; 6497 } 6498 else 6499 { 6500 (*par) = 1.0; 6501 } 6502 } 6503 6504 G4double G4Abla::tau(G4double bet, G4double homega, G4double ef, G4double t) 6505 { 6506 // INPUT : BET, HOMEGA, EF, T 6507 // OUTPUT: TAU - RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED 6508 // 90 PERCENT OF ITS FINAL VALUE 6509 // 6510 // BETA - NUCLEAR VISCOSITY 6511 // HOMEGA - CURVATURE OF POTENTIAL 6512 // EF - FISSION BARRIER 6513 // T - NUCLEAR TEMPERATURE 6514 6515 G4double tauResult = 0.0; 6516 6517 G4double tlim = 8.e0 * ef; 6518 if (t > tlim) 6519 { 6520 t = tlim; 6521 } 6522 // 6523 if (bet / (std::sqrt(2.0) * 10.0 * (homega / 6.582122)) <= 1.0) 6524 { 6525 tauResult = std::log(10.0 * ef / t) / (bet * 1.0e21); 6526 } 6527 else 6528 { 6529 tauResult = std::log(10.0 * ef / t) / (2.0 * std::pow((10.0 * homega / 6.582122), 2)) * (bet * 1.0e-21); 6530 } // end if 6531 6532 return tauResult; 6533 } 6534 6535 G4double G4Abla::cram(G4double bet, G4double homega) 6536 { 6537 // INPUT : BET, HOMEGA NUCLEAR VISCOSITY + CURVATURE OF POTENTIAL 6538 // OUTPUT: KRAMERS FAKTOR - REDUCTION OF THE FISSION PROBABILITY 6539 // INDEPENDENT OF EXCITATION ENERGY 6540 6541 G4double rel = bet / (20.0 * homega / 6.582122); 6542 G4double cramResult = std::sqrt(1.0 + std::pow(rel, 2)) - rel; 6543 // limitation introduced 6.1.2000 by khs 6544 6545 if (cramResult > 1.0) 6546 { 6547 cramResult = 1.0; 6548 } 6549 6550 return cramResult; 6551 } 6552 6553 G4double G4Abla::bipol(G4int iflag, G4double y) 6554 { 6555 // CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS 6556 // RELATIVE TO THE SPHERICAL CONFIGURATION 6557 // BASED ON MYERS, DROPLET MODEL FOR ARBITRARY SHAPES 6558 6559 // INPUT: IFLAG - 0/1 BK/BS CALCULATION 6560 // Y - (1 - X) COMPLEMENT OF THE FISSILITY 6561 6562 // LINEAR INTERPOLATION OF BS BK TABLE 6563 6564 G4int i = 0; 6565 6566 G4double bipolResult = 0.0; 6567 6568 const G4int bsbkSize = 54; 6569 6570 G4double bk[bsbkSize] = { 6571 0.0, 1.00000, 1.00087, 1.00352, 1.00799, 1.01433, 1.02265, 1.03306, 1.04576, 1.06099, 1.07910, 6572 1.10056, 1.12603, 1.15651, 1.19348, 1.23915, 1.29590, 1.35951, 1.41013, 1.44103, 1.46026, 1.47339, 6573 1.48308, 1.49068, 1.49692, 1.50226, 1.50694, 1.51114, 1.51502, 1.51864, 1.52208, 1.52539, 1.52861, 6574 1.53177, 1.53490, 1.53803, 1.54117, 1.54473, 1.54762, 1.55096, 1.55440, 1.55798, 1.56173, 1.56567, 6575 1.56980, 1.57413, 1.57860, 1.58301, 1.58688, 1.58688, 1.58688, 1.58740, 1.58740, 0.0 6576 }; // Zeroes at bk[0], and at 6577 // the end added by PK 6578 6579 G4double bs[bsbkSize] = { 0.0, 1.00000, 1.00086, 1.00338, 1.00750, 1.01319, 1.02044, 1.02927, 1.03974, 6580 1.05195, 1.06604, 1.08224, 1.10085, 1.12229, 1.14717, 1.17623, 1.20963, 1.24296, 6581 1.26532, 1.27619, 1.28126, 1.28362, 1.28458, 1.28477, 1.28450, 1.28394, 1.28320, 6582 1.28235, 1.28141, 1.28042, 1.27941, 1.27837, 1.27732, 1.27627, 1.27522, 1.27418, 6583 1.27314, 1.27210, 1.27108, 1.27006, 1.26906, 1.26806, 1.26707, 1.26610, 1.26514, 6584 1.26418, 1.26325, 1.26233, 1.26147, 1.26147, 1.26147, 1.25992, 1.25992, 0.0 }; 6585 6586 i = idint(y / (2.0e-02)) + 1; 6587 6588 if ((i + 1) >= bsbkSize) 6589 { 6590 if (verboseLevel > 2) 6591 { 6592 // G4cout <<"G4Abla error: index " << i + 1 << " is greater than array 6593 // size permits." << G4endl; 6594 } 6595 bipolResult = 0.0; 6596 } 6597 else 6598 { 6599 if (iflag == 1) 6600 { 6601 bipolResult = bs[i] + (bs[i + 1] - bs[i]) / 2.0e-02 * (y - 2.0e-02 * (i - 1)); 6602 } 6603 else 6604 { 6605 bipolResult = bk[i] + (bk[i + 1] - bk[i]) / 2.0e-02 * (y - 2.0e-02 * (i - 1)); 6606 } 6607 } 6608 6609 return bipolResult; 6610 } 6611 6612 void G4Abla::fomega_sp(G4double AF, G4double Y, G4double* MFCD, G4double* sOMEGA, G4double* sHOMEGA) 6613 { 6614 /* 6615 c Y 1 - Fissility 6616 c OMEGA Frequency at the ground state, in units 1.e-21 s 6617 */ 6618 G4double OMEGA, HOMEGA, ES0, MR02; 6619 6620 ES0 = 20.760 * std::pow(AF, 2.0 / 3.0); 6621 // In units 1.e-42 MeVs**2; r0 = 1.175e-15 m, 6622 // u=931.49MeV/c**2=103.4MeV*s**2/m**2 divided by 1.e-4 to go from 1.e-46 6623 // to 1.e-42 6624 MR02 = std::pow(AF, 5.0 / 3.0) * 1.0340 * 0.010 * 1.175 * 1.175; 6625 // Determination of the inertia of the fission collective degree of freedom 6626 (*MFCD) = MR02 * 3.0 / 10.0 * (1.0 + 3.0 * Y); 6627 // Omega at saddle 6628 OMEGA = std::sqrt(ES0 / MR02) * std::sqrt(8.0 / 3.0 * Y * (1.0 + 304.0 * Y / 255.0)); 6629 // 6630 HOMEGA = 6.58122 * OMEGA / 10.0; 6631 // 6632 (*sOMEGA) = OMEGA; 6633 (*sHOMEGA) = HOMEGA; 6634 // 6635 return; 6636 } 6637 6638 void G4Abla::fomega_gs(G4double AF, G4double ZF, G4double* K1, G4double* sOMEGA, G4double* sHOMEGA) 6639 { 6640 /* 6641 c Y 1 - Fissility 6642 c OMEGA Frequency at the ground state, in units 1.e-21 s 6643 */ 6644 G4double OMEGA, HOMEGA, MR02, MINERT, C, fk1; 6645 // 6646 MR02 = std::pow(AF, 5.0 / 3.0) * 1.0340 * 0.01 * 1.175 * 1.175; 6647 MINERT = 3. * MR02 / 10.0; 6648 C = 17.9439 * (1. - 1.7826 * std::pow((AF - 2.0 * ZF) / AF, 2)); 6649 fk1 = 0.4 * C * std::pow(AF, 2.0 / 3.0) - 0.1464 * std::pow(ZF, 2) / std::pow(AF, 1. / 3.); 6650 OMEGA = std::sqrt(fk1 / MINERT); 6651 HOMEGA = 6.58122 * OMEGA / 10.0; 6652 // 6653 (*K1) = fk1; 6654 (*sOMEGA) = OMEGA; 6655 (*sHOMEGA) = HOMEGA; 6656 // 6657 return; 6658 } 6659 6660 void G4Abla::barrs(G4int Z1, G4int A1, G4int Z2, G4int A2, G4double* sBARR, G4double* sOMEGA) 6661 { /* 6662 C AK 2004 - Barriers for LCP and IMF are calculated now 6663 according to the C Bass model (Nucl. Phys. A (1974)) 6664 C KHS 2007 - To speed up, barriers are read from tabels; in 6665 case thermal C expansion is considered, barriers 6666 are calculated. C INPUT: C EA - Excitation energy per 6667 nucleon C Z11, A11 - Charge and mass of daughter nucleus C 6668 Z22, A22 - Charge and mass of LCP or IMF 6669 C 6670 C OUTPUT: 6671 C BARR - Barrier 6672 C OMEGA - Curvature of the potential 6673 C 6674 C BASS MODEL NPA 1974 - used only if expansion is considered 6675 (OPTEXP=1) C or one wants this model 6676 explicitly (OPTBAR=1) C October 2011 - AK - new 6677 parametrization of the barrier and its position, C see W.W. Qu 6678 et al., NPA 868 (2011) 1; this is now C default option 6679 (OPTBAR=0) 6680 c 6681 c November 2016 - JLRS - Added this function from abla07v4 6682 c 6683 */ 6684 G4double BARR, OMEGA, RMAX; 6685 RMAX = 1.1 * (ecld->rms[A1 - Z1][Z1] + ecld->rms[A2 - Z2][Z2]) + 2.8; 6686 BARR = 1.345 * Z1 * Z2 / RMAX; 6687 // C Omega according to Avishai: 6688 OMEGA = 4.5 / 197.3287; 6689 6690 // if(Z1<60){ 6691 // if(Z2==1 && A2==2) BARR = BARR * 1.1; 6692 // if(Z2==1 && A2==3) BARR = BARR * 1.1; 6693 // if(Z2==2 && A2==3) BARR = BARR * 1.3; 6694 // if(Z2==2 && A2==4) BARR = BARR * 1.1; 6695 // } 6696 6697 (*sOMEGA) = OMEGA; 6698 (*sBARR) = BARR; 6699 // 6700 return; 6701 } 6702 6703 void G4Abla::barfit(G4int iz, G4int ia, G4int il, G4double* sbfis, G4double* segs, G4double* selmax) 6704 { 6705 // 2223 C VERSION FOR 32BIT COMPUTER 6706 // 2224 C THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE 6707 // 2225 C GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM 6708 // 2226 C AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF 6709 // 2227 C H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC 6710 // 2228 C NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR 6711 // 2229 C MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY 6712 // 2230 C 2*PI). 6713 // 2231 C 6714 // 2232 C THE FISSION BARRIER FO IL = 0 IS CALCULATED FROM A 7TH 6715 // 2233 C ORDER FIT IN TWO VARIABLES TO 638 CALCULATED FISSION 6716 // 2234 C BARRIERS FOR Z VALUES FROM 20 TO 110. THESE 638 BARRIERS 6717 // ARE 2235 C FIT WITH AN RMS DEVIATION OF 0.10 MEV BY THIS 49-PARAMETER 6718 // 2236 C FUNCTION. 6719 // 2237 C IF BARFIT IS CALLED WITH (IZ,IA) VALUES OUTSIDE THE RANGE 6720 // OF 2238 C THE BARRIER HEIGHT IS SET TO 0.0, AND A MESSAGE IS PRINTED 6721 // 2239 C ON THE DEFAULT OUTPUT FILE. 6722 // 2240 C 6723 // 2241 C FOR IL VALUES NOT EQUAL TO ZERO, THE VALUES OF L AT 6724 // WHICH 2242 C THE BARRIER IS 80% AND 20% OF THE L=0 VALUE ARE 6725 // RESPECTIVELY 6726 // 2243 C FIT TO 20-PARAMETER FUNCTIONS OF Z AND A, OVER A MORE 6727 // 2244 C RESTRICTED RANGE OF A VALUES, THAN IS THE CASE FOR L = 0. 6728 // 2245 C THE VALUE OF L WHERE THE BARRIER DISAPPEARS, LMAX IS FIT 6729 // TO 2246 C A 24-PARAMETER FUNCTION OF Z AND A, WITH THE SAME RANGE OF 6730 // 2247 C Z AND A VALUES AS L-80 AND L-20. 6731 // 2248 C ONCE AGAIN, IF AN (IZ,IA) PAIR IS OUTSIDE OF THE RANGE 6732 // OF 2249 C VALIDITY OF THE FIT, THE BARRIER VALUE IS SET TO 0.0 AND A 6733 // 2250 C MESSAGE IS PRINTED. THESE THREE VALUES (BFIS(L=0),L-80, 6734 // AND 2251 C L-20) AND THE CONSTRINTS OF BFIS = 0 AND D(BFIS)/DL = 0 AT 6735 // 2252 C L = LMAX AND L=0 LEAD TO A FIFTH-ORDER FIT TO BFIS(L) FOR 6736 // 2253 C L>L-20. THE FIRST THREE CONSTRAINTS LEAD TO A THIRD-ORDER 6737 // FIT 2254 C FOR THE REGION L < L-20. 2255 C 2256 C THE 6738 // GROUND STATE ENERGIES ARE CALCULATED FROM A 2257 C 120-PARAMETER FIT 6739 // IN Z, A, AND L TO 214 GROUND-STATE ENERGIES 2258 C FOR 36 DIFFERENT Z 6740 // AND A VALUES. 6741 // 2259 C (THE RANGE OF Z AND A IS THE SAME AS FOR L-80, L-20, AND 6742 // 2260 C L-MAX) 6743 // 2261 C 6744 // 2262 C THE CALCULATED BARRIERS FROM WHICH THE FITS WERE MADE 6745 // WERE 2263 C CALCULATED IN 1983-1984 BY A. J. SIERK OF LOS 6746 // ALAMOS 2264 C NATIONAL LABORATORY GROUP T-9, USING 6747 // YUKAWA-PLUS-EXPONENTIAL 6748 // 2265 C G4DOUBLE FOLDED NUCLEAR ENERGY, EXACT COULOMB DIFFUSENESS 6749 // 2266 C CORRECTIONS, AND DIFFUSE-MATTER MOMENTS OF INERTIA. 6750 // 2267 C THE PARAMETERS OF THE MODEL R-0 = 1.16 FM, AS 21.13 MEV, 6751 // 2268 C KAPPA-S = 2.3, A = 0.68 FM. 6752 // 2269 C THE DIFFUSENESS OF THE MATTER AND CHARGE DISTRIBUTIONS 6753 // USED 2270 C CORRESPONDS TO A SURFACE DIFFUSENESS PARAMETER 6754 // (DEFINED BY 2271 C MYERS) OF 0.99 FM. THE CALCULATED BARRIERS FOR L = 6755 // 0 ARE 2272 C ACCURATE TO A LITTLE LESS THAN 0.1 MEV; THE OUTPUT 6756 // FROM 2273 C THIS SUBROUTINE IS A LITTLE LESS ACCURATE. WORST 6757 // ERRORS MAY BE 6758 // 2274 C AS LARGE AS 0.5 MEV; CHARACTERISTIC UNCERTAINY IS IN THE 6759 // RANGE 6760 // 2275 C OF 0.1-0.2 MEV. THE RMS DEVIATION OF THE GROUND-STATE FIT 6761 // 2276 C FROM THE 214 INPUT VALUES IS 0.20 MEV. THE MAXIMUM ERROR 6762 // 2277 C OCCURS FOR LIGHT NUCLEI IN THE REGION WHERE THE GROUND 6763 // STATE 6764 // 2278 C IS PROLATE, AND MAY BE GREATER THAN 1.0 MEV FOR VERY 6765 // NEUTRON 6766 // 2279 C DEFICIENT NUCLEI, WITH L NEAR LMAX. FOR MOST NUCLEI LIKELY 6767 // TO 2280 C BE ENCOUNTERED IN REAL EXPERIMENTS, THE MAXIMUM ERROR IS 6768 // 2281 C CLOSER TO 0.5 MEV, AGAIN FOR LIGHT NUCLEI AND L NEAR LMAX. 6769 // 2282 C 6770 // 2283 C WRITTEN BY A. J. SIERK, LANL T-9 6771 // 2284 C VERSION 1.0 FEBRUARY, 1984 6772 // 2285 C 6773 // 2286 C THE FOLLOWING IS NECESSARY FOR 32-BIT MACHINES LIKE DEC 6774 // VAX, 2287 C IBM, ETC 6775 6776 G4double pa[7], pz[7], pl[10]; 6777 for (G4int init_i = 0; init_i < 7; init_i++) 6778 { 6779 pa[init_i] = 0.0; 6780 pz[init_i] = 0.0; 6781 } 6782 for (G4int init_i = 0; init_i < 10; init_i++) 6783 { 6784 pl[init_i] = 0.0; 6785 } 6786 6787 G4double a = 0.0, z = 0.0, amin = 0.0, amax = 0.0, amin2 = 0.0; 6788 G4double amax2 = 0.0, aa = 0.0, zz = 0.0, bfis = 0.0; 6789 G4double bfis0 = 0.0, ell = 0.0, el = 0.0, egs = 0.0, el80 = 0.0, el20 = 0.0; 6790 G4double elmax = 0.0, sel80 = 0.0, sel20 = 0.0, x = 0.0, y = 0.0, q = 0.0, qa = 0.0, qb = 0.0; 6791 G4double aj = 0.0, ak = 0.0, a1 = 0.0, a2 = 0.0; 6792 6793 G4int i = 0, j = 0, k = 0, m = 0; 6794 G4int l = 0; 6795 6796 G4double emncof[4][5] = { { -9.01100e+2, -1.40818e+3, 2.77000e+3, -7.06695e+2, 8.89867e+2 }, 6797 { 1.35355e+4, -2.03847e+4, 1.09384e+4, -4.86297e+3, -6.18603e+2 }, 6798 { -3.26367e+3, 1.62447e+3, 1.36856e+3, 1.31731e+3, 1.53372e+2 }, 6799 { 7.48863e+3, -1.21581e+4, 5.50281e+3, -1.33630e+3, 5.05367e-2 } }; 6800 6801 G4double elmcof[4][5] = { { 1.84542e+3, -5.64002e+3, 5.66730e+3, -3.15150e+3, 9.54160e+2 }, 6802 { -2.24577e+3, 8.56133e+3, -9.67348e+3, 5.81744e+3, -1.86997e+3 }, 6803 { 2.79772e+3, -8.73073e+3, 9.19706e+3, -4.91900e+3, 1.37283e+3 }, 6804 { -3.01866e+1, 1.41161e+3, -2.85919e+3, 2.13016e+3, -6.49072e+2 } }; 6805 6806 G4double emxcof[4][6] = { { 9.43596e4, -2.241997e5, 2.223237e5, -1.324408e5, 4.68922e4, -8.83568e3 }, 6807 { -1.655827e5, 4.062365e5, -4.236128e5, 2.66837e5, -9.93242e4, 1.90644e4 }, 6808 { 1.705447e5, -4.032e5, 3.970312e5, -2.313704e5, 7.81147e4, -1.322775e4 }, 6809 { -9.274555e4, 2.278093e5, -2.422225e5, 1.55431e5, -5.78742e4, 9.97505e3 } }; 6810 6811 G4double elzcof[7][7] = { 6812 { 5.11819909e+5, -1.30303186e+6, 1.90119870e+6, -1.20628242e+6, 5.68208488e+5, 5.48346483e+4, -2.45883052e+4 }, 6813 { -1.13269453e+6, 2.97764590e+6, -4.54326326e+6, 3.00464870e+6, -1.44989274e+6, -1.02026610e+5, 6.27959815e+4 }, 6814 { 1.37543304e+6, -3.65808988e+6, 5.47798999e+6, -3.78109283e+6, 1.84131765e+6, 1.53669695e+4, -6.96817834e+4 }, 6815 { -8.56559835e+5, 2.48872266e+6, -4.07349128e+6, 3.12835899e+6, -1.62394090e+6, 1.19797378e+5, 4.25737058e+4 }, 6816 { 3.28723311e+5, -1.09892175e+6, 2.03997269e+6, -1.77185718e+6, 9.96051545e+5, -1.53305699e+5, -1.12982954e+4 }, 6817 { 4.15850238e+4, 7.29653408e+4, -4.93776346e+5, 6.01254680e+5, -4.01308292e+5, 9.65968391e+4, -3.49596027e+3 }, 6818 { -1.82751044e+5, 3.91386300e+5, -3.03639248e+5, 1.15782417e+5, -4.24399280e+3, -6.11477247e+3, 3.66982647e+2 } 6819 }; 6820 6821 const G4int sizex = 5; 6822 const G4int sizey = 6; 6823 const G4int sizez = 4; 6824 6825 G4double egscof[sizey][sizey][sizez]; 6826 6827 G4double egs1[sizey][sizex] = { { 1.927813e5, 7.666859e5, 6.628436e5, 1.586504e5, -7.786476e3 }, 6828 { -4.499687e5, -1.784644e6, -1.546968e6, -4.020658e5, -3.929522e3 }, 6829 { 4.667741e5, 1.849838e6, 1.641313e6, 5.229787e5, 5.928137e4 }, 6830 { -3.017927e5, -1.206483e6, -1.124685e6, -4.478641e5, -8.682323e4 }, 6831 { 1.226517e5, 5.015667e5, 5.032605e5, 2.404477e5, 5.603301e4 }, 6832 { -1.752824e4, -7.411621e4, -7.989019e4, -4.175486e4, -1.024194e4 } }; 6833 6834 G4double egs2[sizey][sizex] = { { -6.459162e5, -2.903581e6, -3.048551e6, -1.004411e6, -6.558220e4 }, 6835 { 1.469853e6, 6.564615e6, 6.843078e6, 2.280839e6, 1.802023e5 }, 6836 { -1.435116e6, -6.322470e6, -6.531834e6, -2.298744e6, -2.639612e5 }, 6837 { 8.665296e5, 3.769159e6, 3.899685e6, 1.520520e6, 2.498728e5 }, 6838 { -3.302885e5, -1.429313e6, -1.512075e6, -6.744828e5, -1.398771e5 }, 6839 { 4.958167e4, 2.178202e5, 2.400617e5, 1.167815e5, 2.663901e4 } }; 6840 6841 G4double egs3[sizey][sizex] = { { 3.117030e5, 1.195474e6, 9.036289e5, 6.876190e4, -6.814556e4 }, 6842 { -7.394913e5, -2.826468e6, -2.152757e6, -2.459553e5, 1.101414e5 }, 6843 { 7.918994e5, 3.030439e6, 2.412611e6, 5.228065e5, 8.542465e3 }, 6844 { -5.421004e5, -2.102672e6, -1.813959e6, -6.251700e5, -1.184348e5 }, 6845 { 2.370771e5, 9.459043e5, 9.026235e5, 4.116799e5, 1.001348e5 }, 6846 { -4.227664e4, -1.738756e5, -1.795906e5, -9.292141e4, -2.397528e4 } }; 6847 6848 G4double egs4[sizey][sizex] = { { -1.072763e5, -5.973532e5, -6.151814e5, 7.371898e4, 1.255490e5 }, 6849 { 2.298769e5, 1.265001e6, 1.252798e6, -2.306276e5, -2.845824e5 }, 6850 { -2.093664e5, -1.100874e6, -1.009313e6, 2.705945e5, 2.506562e5 }, 6851 { 1.274613e5, 6.190307e5, 5.262822e5, -1.336039e5, -1.115865e5 }, 6852 { -5.715764e4, -2.560989e5, -2.228781e5, -3.222789e3, 1.575670e4 }, 6853 { 1.189447e4, 5.161815e4, 4.870290e4, 1.266808e4, 2.069603e3 } }; 6854 6855 for (i = 0; i < sizey; i++) 6856 { 6857 for (j = 0; j < sizex; j++) 6858 { 6859 egscof[i][j][0] = egs1[i][j]; 6860 egscof[i][j][1] = egs2[i][j]; 6861 egscof[i][j][2] = egs3[i][j]; 6862 egscof[i][j][3] = egs4[i][j]; 6863 } 6864 } 6865 6866 // the program starts here 6867 if (iz < 19 || iz > 122) 6868 { 6869 goto barfit900; 6870 } 6871 6872 if (iz > 122 && il > 0) 6873 { 6874 goto barfit902; 6875 } 6876 6877 z = G4double(iz); 6878 a = G4double(ia); 6879 el = G4double(il); 6880 amin = 1.2e0 * z + 0.01e0 * z * z; 6881 amax = 5.8e0 * z - 0.024e0 * z * z; 6882 6883 if (a < amin || a > amax) 6884 { 6885 goto barfit910; 6886 } 6887 6888 // angul.mom.zero barrier 6889 aa = 2.5e-3 * a; 6890 zz = 1.0e-2 * z; 6891 ell = 1.0e-2 * el; 6892 bfis0 = 0.0; 6893 lpoly(zz, 7, pz); 6894 lpoly(aa, 7, pa); 6895 6896 for (i = 0; i < 7; i++) 6897 { // do 10 i=1,7 6898 for (j = 0; j < 7; j++) 6899 { // do 10 j=1,7 6900 bfis0 = bfis0 + elzcof[j][i] * pz[i] * pa[j]; 6901 } 6902 } 6903 6904 bfis = bfis0; 6905 6906 (*sbfis) = bfis; 6907 egs = 0.0; 6908 (*segs) = egs; 6909 6910 // values of l at which the barrier 6911 // is 20%(el20) and 80%(el80) of l=0 value 6912 amin2 = 1.4e0 * z + 0.009e0 * z * z; 6913 amax2 = 20.e0 + 3.0e0 * z; 6914 6915 if ((a < amin2 - 5.e0 || a > amax2 + 10.e0) && il > 0) 6916 { 6917 goto barfit920; 6918 } 6919 6920 lpoly(zz, 5, pz); 6921 lpoly(aa, 4, pa); 6922 el80 = 0.0; 6923 el20 = 0.0; 6924 elmax = 0.0; 6925 6926 for (i = 0; i < 4; i++) 6927 { 6928 for (j = 0; j < 5; j++) 6929 { 6930 el80 = el80 + elmcof[i][j] * pz[j] * pa[i]; 6931 el20 = el20 + emncof[i][j] * pz[j] * pa[i]; 6932 } 6933 } 6934 6935 sel80 = el80; 6936 sel20 = el20; 6937 6938 // value of l (elmax) where barrier disapp. 6939 lpoly(zz, 6, pz); 6940 lpoly(ell, 9, pl); 6941 6942 for (i = 0; i < 4; i++) 6943 { // do 30 i= 1,4 6944 for (j = 0; j < 6; j++) 6945 { // do 30 j=1,6 6946 elmax = elmax + emxcof[i][j] * pz[j] * pa[i]; 6947 } 6948 } 6949 6950 (*selmax) = elmax; 6951 6952 // value of barrier at ang.mom. l 6953 if (il < 1) 6954 { 6955 return; 6956 } 6957 6958 x = sel20 / (*selmax); 6959 y = sel80 / (*selmax); 6960 6961 if (el <= sel20) 6962 { 6963 // low l 6964 q = 0.2 / (std::pow(sel20, 2) * std::pow(sel80, 2) * (sel20 - sel80)); 6965 qa = q * (4.0 * std::pow(sel80, 3) - std::pow(sel20, 3)); 6966 qb = -q * (4.0 * std::pow(sel80, 2) - std::pow(sel20, 2)); 6967 bfis = bfis * (1.0 + qa * std::pow(el, 2) + qb * std::pow(el, 3)); 6968 } 6969 else 6970 { 6971 // high l 6972 aj = (-20.0 * std::pow(x, 5) + 25.e0 * std::pow(x, 4) - 4.0) * std::pow((y - 1.0), 2) * y * y; 6973 ak = (-20.0 * std::pow(y, 5) + 25.0 * std::pow(y, 4) - 1.0) * std::pow((x - 1.0), 2) * x * x; 6974 q = 0.2 / (std::pow((y - x) * ((1.0 - x) * (1.0 - y) * x * y), 2)); 6975 qa = q * (aj * y - ak * x); 6976 qb = -q * (aj * (2.0 * y + 1.0) - ak * (2.0 * x + 1.0)); 6977 z = el / (*selmax); 6978 a1 = 4.0 * std::pow(z, 5) - 5.0 * std::pow(z, 4) + 1.0; 6979 a2 = qa * (2.e0 * z + 1.e0); 6980 bfis = bfis * (a1 + (z - 1.e0) * (a2 + qb * z) * z * z * (z - 1.e0)); 6981 } 6982 6983 if (bfis <= 0.0) 6984 { 6985 bfis = 0.0; 6986 } 6987 6988 if (el > (*selmax)) 6989 { 6990 bfis = 0.0; 6991 } 6992 (*sbfis) = bfis; 6993 6994 // now calculate rotating ground state energy 6995 if (el > (*selmax)) 6996 { 6997 return; 6998 } 6999 7000 for (k = 0; k < 4; k++) 7001 { 7002 for (l = 0; l < 6; l++) 7003 { 7004 for (m = 0; m < 5; m++) 7005 { 7006 egs = egs + egscof[l][m][k] * pz[l] * pa[k] * pl[2 * m]; 7007 } 7008 } 7009 } 7010 7011 (*segs) = egs; 7012 if ((*segs) < 0.0) 7013 { 7014 (*segs) = 0.0; 7015 } 7016 7017 return; 7018 7019 barfit900: // continue 7020 (*sbfis) = 0.0; 7021 // for z<19 sbfis set to 1.0e3 7022 if (iz < 19) 7023 { 7024 (*sbfis) = 1.0e3; 7025 } 7026 (*segs) = 0.0; 7027 (*selmax) = 0.0; 7028 return; 7029 7030 barfit902: 7031 (*sbfis) = 0.0; 7032 (*segs) = 0.0; 7033 (*selmax) = 0.0; 7034 return; 7035 7036 barfit910: 7037 (*sbfis) = 0.0; 7038 (*segs) = 0.0; 7039 (*selmax) = 0.0; 7040 return; 7041 7042 barfit920: 7043 (*sbfis) = 0.0; 7044 (*segs) = 0.0; 7045 (*selmax) = 0.0; 7046 return; 7047 } 7048 7049 G4double G4Abla::erf(G4double x) 7050 { 7051 G4double ferf; 7052 7053 if (x < 0.) 7054 { 7055 ferf = -gammp(0.5, x * x); 7056 } 7057 else 7058 { 7059 ferf = gammp(0.5, x * x); 7060 ; 7061 } 7062 return ferf; 7063 } 7064 7065 G4double G4Abla::gammp(G4double a, G4double x) 7066 { 7067 G4double fgammp; 7068 G4double gammcf, gamser, gln = 0.; 7069 7070 if (x < 0.0 || a <= 0.0) 7071 std::cout << "G4Abla::gammp = bad arguments in gammp" << std::endl; 7072 if (x < a + 1.) 7073 { 7074 gser(&gamser, a, x, gln); 7075 fgammp = gamser; 7076 } 7077 else 7078 { 7079 gcf(&gammcf, a, x, gln); 7080 fgammp = 1. - gammcf; 7081 } 7082 return fgammp; 7083 } 7084 7085 void G4Abla::gcf(G4double* gammcf, G4double a, G4double x, G4double gln) 7086 { 7087 G4double fgammcf, del; 7088 G4double eps = 3e-7; 7089 G4double fpmin = 1e-30; 7090 G4int itmax = 100; 7091 G4double an, b, c, d, h; 7092 7093 gln = gammln(a); 7094 b = x + 1. - a; 7095 c = 1. / fpmin; 7096 d = 1. / b; 7097 h = d; 7098 for (G4int i = 1; i <= itmax; i++) 7099 { 7100 an = -i * (i - a); 7101 b = b + 2.; 7102 d = an * d + b; 7103 if (std::fabs(d) < fpmin) 7104 d = fpmin; 7105 c = b + an / c; 7106 if (std::fabs(c) < fpmin) 7107 c = fpmin; 7108 d = 1.0 / d; 7109 del = d * c; 7110 h = h * del; 7111 if (std::fabs(del - 1.) < eps) 7112 goto dir1; 7113 } 7114 std::cout << "a too large, ITMAX too small in gcf" << std::endl; 7115 dir1: 7116 fgammcf = std::exp(-x + a * std::log(x) - gln) * h; 7117 (*gammcf) = fgammcf; 7118 return; 7119 } 7120 7121 void G4Abla::gser(G4double* gamser, G4double a, G4double x, G4double gln) 7122 { 7123 G4double fgamser, ap, sum, del; 7124 G4double eps = 3e-7; 7125 G4int itmax = 100; 7126 7127 gln = gammln(a); 7128 if (x <= 0.) 7129 { 7130 if (x < 0.) 7131 std::cout << "G4Abla::gser = x < 0 in gser" << std::endl; 7132 (*gamser) = 0.0; 7133 return; 7134 } 7135 ap = a; 7136 sum = 1. / a; 7137 del = sum; 7138 for (G4int n = 0; n < itmax; n++) 7139 { 7140 ap = ap + 1.; 7141 del = del * x / ap; 7142 sum = sum + del; 7143 if (std::fabs(del) < std::fabs(sum) * eps) 7144 goto dir1; 7145 } 7146 std::cout << "a too large, ITMAX too small in gser" << std::endl; 7147 dir1: 7148 fgamser = sum * std::exp(-x + a * std::log(x) - gln); 7149 (*gamser) = fgamser; 7150 return; 7151 } 7152 7153 G4double G4Abla::gammln(G4double xx) 7154 { 7155 G4double fgammln, x, ser, tmp, y; 7156 G4double cof[6] = { 76.18009172947146, -86.50532032941677, 24.01409824083091, 7157 -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5 }; 7158 G4double stp = 2.5066282746310005; 7159 7160 x = xx; 7161 y = x; 7162 tmp = x + 5.5; 7163 tmp = (x + 0.5) * std::log(tmp) - tmp; 7164 ser = 1.000000000190015; 7165 for (G4int j = 0; j < 6; j++) 7166 { 7167 y = y + 1.; 7168 ser = ser + cof[j] / y; 7169 } 7170 7171 return fgammln = tmp + std::log(stp * ser / x); 7172 } 7173 7174 G4double G4Abla::fd(G4double E) 7175 { 7176 // DISTRIBUTION DE MAXWELL 7177 7178 return (E * std::exp(-E)); 7179 } 7180 7181 G4double G4Abla::f(G4double E) 7182 { 7183 // FONCTION INTEGRALE DE FD(E) 7184 return (1.0 - (E + 1.0) * std::exp(-E)); 7185 } 7186 7187 G4double G4Abla::fmaxhaz(G4double x) 7188 { 7189 return (-x * std::log(G4AblaRandom::flat()) - x * std::log(G4AblaRandom::flat()) - 7190 x * std::log(G4AblaRandom::flat())); 7191 } 7192 7193 G4double G4Abla::fmaxhaz_old(G4double T) 7194 { 7195 // tirage aleatoire dans une maxwellienne 7196 // t : temperature 7197 // 7198 // declaration des variables 7199 // 7200 7201 const G4int pSize = 101; 7202 G4double p[pSize]; 7203 7204 // ial generateur pour le cascade (et les iy pour eviter les correlations) 7205 G4int i = 0; 7206 G4int itest = 0; 7207 // programme principal 7208 7209 // calcul des p(i) par approximation de newton 7210 p[pSize - 1] = 8.0; 7211 G4double x = 0.1; 7212 G4double x1 = 0.0; 7213 G4double y = 0.0; 7214 7215 if (itest == 1) 7216 { 7217 goto fmaxhaz120; 7218 } 7219 7220 for (i = 1; i <= 99; i++) 7221 { 7222 fmaxhaz20: 7223 x1 = x - (f(x) - G4double(i) / 100.0) / fd(x); 7224 x = x1; 7225 if (std::fabs(f(x) - G4double(i) / 100.0) < 1e-5) 7226 { 7227 goto fmaxhaz100; 7228 } 7229 goto fmaxhaz20; 7230 fmaxhaz100: 7231 p[i] = x; 7232 } // end do 7233 7234 // itest = 1; 7235 itest = 0; 7236 // tirage aleatoire et calcul du x correspondant 7237 // par regression lineaire 7238 fmaxhaz120: 7239 y = G4AblaRandom::flat(); 7240 i = nint(y * 100); 7241 7242 // 2590 c ici on evite froidement les depassements de tableaux....(a.b. 7243 // 3/9/99) 7244 if (i == 0) 7245 { 7246 goto fmaxhaz120; 7247 } 7248 7249 if (i == 1) 7250 { 7251 x = p[i] * y * 100; 7252 } 7253 else 7254 { 7255 x = (p[i] - p[i - 1]) * (y * 100 - i) + p[i]; 7256 } 7257 7258 return (x * T); 7259 } 7260 7261 void G4Abla::guet(G4double* x_par, G4double* z_par, G4double* find_par) 7262 { 7263 // TABLE DE MASSES ET FORMULE DE MASSE TIRE DU PAPIER DE BRACK-GUET 7264 // Gives the theoritical value for mass excess... 7265 // Revisee pour x, z flottants 25/4/2002 7266 7267 // real*8 x,z 7268 // dimension q(0:50,0:70) 7269 G4double x = (*x_par); 7270 G4double z = (*z_par); 7271 G4double find = (*find_par); 7272 7273 const G4int qrows = 50; 7274 const G4int qcols = 70; 7275 G4double q[qrows][qcols]; 7276 for (G4int init_i = 0; init_i < qrows; init_i++) 7277 { 7278 for (G4int init_j = 0; init_j < qcols; init_j++) 7279 { 7280 q[init_i][init_j] = 0.0; 7281 } 7282 } 7283 7284 G4int ix = G4int(std::floor(x + 0.5)); 7285 G4int iz = G4int(std::floor(z + 0.5)); 7286 G4double zz = iz; 7287 G4double xx = ix; 7288 find = 0.0; 7289 G4double avol = 15.776; 7290 G4double asur = -17.22; 7291 G4double ac = -10.24; 7292 G4double azer = 8.0; 7293 G4double xjj = -30.03; 7294 G4double qq = -35.4; 7295 G4double c1 = -0.737; 7296 G4double c2 = 1.28; 7297 7298 if (ix <= 7) 7299 { 7300 q[0][1] = 939.50; 7301 q[1][1] = 938.21; 7302 q[1][2] = 1876.1; 7303 q[1][3] = 2809.39; 7304 q[2][4] = 3728.34; 7305 q[2][3] = 2809.4; 7306 q[2][5] = 4668.8; 7307 q[2][6] = 5606.5; 7308 q[3][5] = 4669.1; 7309 q[3][6] = 5602.9; 7310 q[3][7] = 6535.27; 7311 q[4][6] = 5607.3; 7312 q[4][7] = 6536.1; 7313 q[5][7] = 6548.3; 7314 find = q[iz][ix]; 7315 } 7316 else 7317 { 7318 G4double xneu = xx - zz; 7319 G4double si = (xneu - zz) / xx; 7320 G4double x13 = std::pow(xx, .333); 7321 G4double ee1 = c1 * zz * zz / x13; 7322 G4double ee2 = c2 * zz * zz / xx; 7323 G4double aux = 1. + (9. * xjj / 4. / qq / x13); 7324 G4double ee3 = xjj * xx * si * si / aux; 7325 G4double ee4 = avol * xx + asur * (std::pow(xx, .666)) + ac * x13 + azer; 7326 G4double tota = ee1 + ee2 + ee3 + ee4; 7327 find = 939.55 * xneu + 938.77 * zz - tota; 7328 } 7329 7330 (*x_par) = x; 7331 (*z_par) = z; 7332 (*find_par) = find; 7333 } 7334 // 7335 7336 void G4Abla::FillData(G4int IMULTBU, G4int IEV_TAB) 7337 { 7338 7339 const G4double c = 29.9792458; 7340 const G4double fmp = 938.27231, fmn = 939.56563, fml = 1115.683; 7341 7342 varntp->ntrack = IMULTBU + IEV_TAB; 7343 7344 for (G4int i = 0; i < IMULTBU; i++) 7345 { 7346 7347 G4int iz = nint(BU_TAB[i][7]); 7348 G4int ia = nint(BU_TAB[i][8]); 7349 G4int is = nint(BU_TAB[i][11]); 7350 7351 Ainit = Ainit + ia; 7352 Zinit = Zinit + iz; 7353 Sinit = Sinit - is; 7354 7355 varntp->zvv.push_back(iz); 7356 varntp->avv.push_back(ia); 7357 varntp->svv.push_back(-1 * is); 7358 varntp->itypcasc.push_back(0); 7359 7360 G4double v2 = BU_TAB[i][4] * BU_TAB[i][4] + BU_TAB[i][5] * BU_TAB[i][5] + BU_TAB[i][6] * BU_TAB[i][6]; 7361 G4double gamma = std::sqrt(1.0 - v2 / (c * c)); 7362 G4double avvmass = iz * fmp + (ia - iz - is) * fmn + is * fml + eflmac(ia, iz, 0, 3); 7363 G4double etot = avvmass / gamma; 7364 varntp->pxlab.push_back(etot * BU_TAB[i][4] / c); 7365 varntp->pylab.push_back(etot * BU_TAB[i][5] / c); 7366 varntp->pzlab.push_back(etot * BU_TAB[i][6] / c); 7367 varntp->enerj.push_back(etot - avvmass); 7368 } 7369 7370 for (G4int i = 0; i < IEV_TAB; i++) 7371 { 7372 7373 G4int iz = nint(EV_TAB[i][0]); 7374 G4int ia = nint(EV_TAB[i][1]); 7375 G4int is = EV_TAB[i][5]; 7376 7377 varntp->itypcasc.push_back(0); 7378 7379 if (ia > 0) 7380 { // normal particles 7381 varntp->zvv.push_back(iz); 7382 varntp->avv.push_back(ia); 7383 varntp->svv.push_back(-1 * is); 7384 Ainit = Ainit + ia; 7385 Zinit = Zinit + iz; 7386 Sinit = Sinit - is; 7387 G4double v2 = EV_TAB[i][2] * EV_TAB[i][2] + EV_TAB[i][3] * EV_TAB[i][3] + EV_TAB[i][4] * EV_TAB[i][4]; 7388 G4double gamma = std::sqrt(1.0 - v2 / (c * c)); 7389 G4double avvmass = iz * fmp + (ia - iz - is) * fmn + is * fml + eflmac(ia, iz, 0, 3); 7390 G4double etot = avvmass / gamma; 7391 varntp->pxlab.push_back(etot * EV_TAB[i][2] / c); 7392 varntp->pylab.push_back(etot * EV_TAB[i][3] / c); 7393 varntp->pzlab.push_back(etot * EV_TAB[i][4] / c); 7394 varntp->enerj.push_back(etot - avvmass); 7395 } 7396 else if (ia == -2) 7397 { // lambda0 7398 varntp->zvv.push_back(0); 7399 varntp->avv.push_back(1); 7400 varntp->svv.push_back(-1); 7401 Ainit = Ainit + 1; 7402 Sinit = Sinit - 1; 7403 G4double v2 = EV_TAB[i][2] * EV_TAB[i][2] + EV_TAB[i][3] * EV_TAB[i][3] + EV_TAB[i][4] * EV_TAB[i][4]; 7404 G4double gamma = std::sqrt(1.0 - v2 / (c * c)); 7405 G4double avvmass = fml; 7406 G4double etot = avvmass / gamma; 7407 varntp->pxlab.push_back(etot * EV_TAB[i][2] / c); 7408 varntp->pylab.push_back(etot * EV_TAB[i][3] / c); 7409 varntp->pzlab.push_back(etot * EV_TAB[i][4] / c); 7410 varntp->enerj.push_back(etot - avvmass); 7411 } 7412 else 7413 { // photons 7414 varntp->zvv.push_back(iz); 7415 varntp->avv.push_back(ia); 7416 varntp->svv.push_back(0); 7417 Ainit = Ainit + ia; 7418 Zinit = Zinit + iz; 7419 Sinit = Sinit - is; 7420 varntp->pxlab.push_back(EV_TAB[i][2]); 7421 varntp->pylab.push_back(EV_TAB[i][3]); 7422 varntp->pzlab.push_back(EV_TAB[i][4]); 7423 varntp->enerj.push_back( 7424 std::sqrt(EV_TAB[i][2] * EV_TAB[i][2] + EV_TAB[i][3] * EV_TAB[i][3] + EV_TAB[i][4] * EV_TAB[i][4])); 7425 } 7426 } 7427 // 7428 return; 7429 } 7430 7431 // Utilities 7432 7433 G4double G4Abla::min(G4double a, G4double b) 7434 { 7435 if (a < b) 7436 { 7437 return a; 7438 } 7439 else 7440 { 7441 return b; 7442 } 7443 } 7444 7445 G4int G4Abla::min(G4int a, G4int b) 7446 { 7447 if (a < b) 7448 { 7449 return a; 7450 } 7451 else 7452 { 7453 return b; 7454 } 7455 } 7456 7457 G4double G4Abla::max(G4double a, G4double b) 7458 { 7459 if (a > b) 7460 { 7461 return a; 7462 } 7463 else 7464 { 7465 return b; 7466 } 7467 } 7468 7469 G4int G4Abla::max(G4int a, G4int b) 7470 { 7471 if (a > b) 7472 { 7473 return a; 7474 } 7475 else 7476 { 7477 return b; 7478 } 7479 } 7480 7481 G4double G4Abla::DSIGN(G4double a, G4double b) 7482 { 7483 // A function that assigns the sign of the second argument to the 7484 // absolute value of the first 7485 7486 if (b >= 0) 7487 { 7488 return std::abs(a); 7489 } 7490 else 7491 { 7492 return -1.0 * std::abs(a); 7493 } 7494 return 0; 7495 } 7496 7497 G4int G4Abla::ISIGN(G4int a, G4int b) 7498 { 7499 // A function that assigns the sign of the second argument to the 7500 // absolute value of the first 7501 7502 if (b >= 0) 7503 { 7504 return std::abs(a); 7505 } 7506 else 7507 { 7508 return -1 * std::abs(a); 7509 } 7510 return 0; 7511 } 7512 7513 G4int G4Abla::nint(G4double number) 7514 { 7515 G4double intpart = 0.0; 7516 G4double fractpart = 0.0; 7517 fractpart = std::modf(number, &intpart); 7518 if (number == 0) 7519 { 7520 return 0; 7521 } 7522 if (number > 0) 7523 { 7524 if (fractpart < 0.5) 7525 { 7526 return G4int(std::floor(number)); 7527 } 7528 else 7529 { 7530 return G4int(std::ceil(number)); 7531 } 7532 } 7533 if (number < 0) 7534 { 7535 if (fractpart < -0.5) 7536 { 7537 return G4int(std::floor(number)); 7538 } 7539 else 7540 { 7541 return G4int(std::ceil(number)); 7542 } 7543 } 7544 7545 return G4int(std::floor(number)); 7546 } 7547 7548 G4int G4Abla::secnds(G4int x) 7549 { 7550 time_t mytime; 7551 tm* mylocaltime; 7552 7553 time(&mytime); 7554 mylocaltime = localtime(&mytime); 7555 7556 if (x == 0) 7557 { 7558 return (mylocaltime->tm_hour * 60 * 60 + mylocaltime->tm_min * 60 + mylocaltime->tm_sec); 7559 } 7560 else 7561 { 7562 return G4int(mytime - x); 7563 } 7564 } 7565 7566 G4int G4Abla::mod(G4int a, G4int b) 7567 { 7568 if (b != 0) 7569 { 7570 return a % b; 7571 } 7572 else 7573 { 7574 return 0; 7575 } 7576 } 7577 7578 G4double G4Abla::dint(G4double x) 7579 { 7580 G4double value = 0.0; 7581 /* 7582 if(a < 0.0) { 7583 value = double(std::ceil(a)); 7584 } 7585 else { 7586 value = double(std::floor(a)); 7587 } 7588 */ 7589 if (x - std::floor(x) <= std::ceil(x) - x) 7590 value = G4double(std::floor(x)); 7591 else 7592 value = G4double(std::ceil(x)); 7593 7594 return value; 7595 } 7596 7597 G4int G4Abla::idint(G4double x) 7598 { 7599 G4int value = 0; 7600 if (x - std::floor(x) <= std::ceil(x) - x) 7601 value = G4int(std::floor(x)); 7602 else 7603 value = G4int(std::ceil(x)); 7604 7605 return value; 7606 } 7607 7608 G4int G4Abla::idnint(G4double x) 7609 { 7610 if (x - std::floor(x) <= std::ceil(x) - x) 7611 return G4int(std::floor(x)); 7612 else 7613 return G4int(std::ceil(x)); 7614 } 7615 7616 G4double G4Abla::dmin1(G4double a, G4double b, G4double c) 7617 { 7618 if (a < b && a < c) 7619 { 7620 return a; 7621 } 7622 if (b < a && b < c) 7623 { 7624 return b; 7625 } 7626 if (c < a && c < b) 7627 { 7628 return c; 7629 } 7630 return a; 7631 } 7632 7633 G4double G4Abla::utilabs(G4double a) { return std::abs(a); } 7634 7635 G4double G4Abla::width(G4double AMOTHER, 7636 G4double ZMOTHER, 7637 G4double APART, 7638 G4double ZPART, 7639 G4double TEMP, 7640 G4double B1, 7641 G4double SB1, 7642 G4double EXC) 7643 { 7644 /* 7645 * Implemented by JLRS for Abla c++: 06/11/2016 7646 * 7647 C Last update: 7648 C 28/10/13 - JLRS - from abrablav4 (AK) 7649 */ 7650 G4int IZPART, IAPART, NMOTHER; 7651 G4double B, HBAR, PI, RGEOM, MPART, SB; 7652 G4double BKONST, C, C2, G, APARTNER, MU; 7653 G4double INT1, INT2, INT3, AKONST, EARG, R0, MPARTNER; 7654 G4double AEXP; 7655 G4double ARG; 7656 G4double PAR_A1 = 0., PAR_B1 = 0., FACT = 1.; 7657 G4double fwidth = 0.; 7658 G4int idlamb0 = 0; 7659 PI = 3.141592654; 7660 7661 if (ZPART == -2.) 7662 { 7663 ZPART = 0.; 7664 idlamb0 = 1; 7665 } 7666 7667 IZPART = idnint(ZPART); 7668 IAPART = idnint(APART); 7669 7670 B = B1; 7671 SB = SB1; 7672 NMOTHER = idnint(AMOTHER - ZMOTHER); 7673 7674 PAR_A1 = 0.0; 7675 PAR_B1 = 0.0; 7676 7677 if (SB > EXC) 7678 { 7679 return fwidth = 0.0; 7680 } 7681 else 7682 { 7683 // in MeV*s 7684 HBAR = 6.582122e-22; 7685 // HBAR2 = HBAR * HBAR 7686 // in m/s 7687 C = 2.99792458e8; 7688 C2 = C * C; 7689 APARTNER = AMOTHER - APART; 7690 MPARTNER = APARTNER * 931.49 / C2; 7691 7692 // g=(2s+1) 7693 if (IAPART == 1 && IZPART == 0) 7694 { 7695 G = 2.0; 7696 MPART = 939.56 / C2; 7697 if (idlamb0 == 1) 7698 MPART = 1115.683 / C2; 7699 } 7700 else 7701 { 7702 if (IAPART == 1 && IZPART == 1) 7703 { 7704 G = 2.0; 7705 MPART = 938.27 / C2; 7706 } 7707 else 7708 { 7709 if (IAPART == 2 && IZPART == 0) 7710 { 7711 G = 1.0; 7712 MPART = 2. * 939.56 / C2; 7713 } 7714 else 7715 { 7716 if (IAPART == 2 && IZPART == 1) 7717 { 7718 G = 3.0; 7719 MPART = 1876.10 / C2; 7720 } 7721 else 7722 { 7723 if (IAPART == 3 && IZPART == 1) 7724 { 7725 G = 2.0; 7726 MPART = 2809.39 / C2; 7727 } 7728 else 7729 { 7730 if (IAPART == 3 && IZPART == 2) 7731 { 7732 G = 2.0; 7733 MPART = 2809.37 / C2; 7734 } 7735 else 7736 { 7737 if (IAPART == 4 && IZPART == 2) 7738 { 7739 G = 1.0; 7740 MPART = 3728.35 / C2; 7741 } 7742 else 7743 { 7744 // IMF 7745 G = 1.0; 7746 MPART = APART * 931.49 / C2; 7747 } 7748 } 7749 } 7750 } 7751 } 7752 } 7753 } // end g 7754 7755 // Relative mass in MeV*s^2/m^2 7756 MU = MPARTNER * MPART / (MPARTNER + MPART); 7757 // in m 7758 R0 = 1.16e-15; 7759 7760 RGEOM = R0 * (std::pow(APART, 1.0 / 3.0) + std::pow(AMOTHER - APART, 1.0 / 3.0)); 7761 7762 // in m*sqrt(MeV) 7763 AKONST = HBAR * std::sqrt(1.0 / MU); 7764 7765 // in 1/(MeV*m^2) 7766 BKONST = MPART / (PI * PI * HBAR * HBAR); 7767 // 7768 // USING ANALYTICAL APPROXIMATION 7769 7770 INT1 = 2.0 * std::pow(TEMP, 3.) / (2.0 * TEMP + B); 7771 7772 ARG = std::sqrt(B / TEMP); 7773 EARG = (erf(ARG) - 1.0); 7774 if (std::abs(EARG) < 1.e-9) 7775 EARG = 0.0; 7776 if (B == 0.0) 7777 { 7778 INT2 = 0.5 * std::sqrt(PI) * std::pow(TEMP, 3.0 / 2.0); 7779 } 7780 else 7781 { 7782 AEXP = B / TEMP; 7783 if (AEXP > 700.0) 7784 AEXP = 700.0; 7785 INT2 = (2.0 * B * B + TEMP * B) / std::sqrt(B) + 7786 std::exp(AEXP) * std::sqrt(PI / (4.0 * TEMP)) * (4.0 * B * B + 4.0 * B * TEMP - TEMP * TEMP) * EARG; 7787 if (INT2 < 0.0) 7788 INT2 = 0.0; 7789 // For very low temperatures when EARG=0, INT2 get unreasonably high 7790 // values comming from the first term. Therefore, for these cases INT2 is 7791 // set to 0. 7792 if (EARG == 0.0) 7793 INT2 = 0.0; 7794 } // if B 7795 7796 INT3 = 2.0 * TEMP * TEMP * TEMP / (2.0 * TEMP * TEMP + 4.0 * B * TEMP + B * B); 7797 7798 if (IZPART < -1.0 && ZMOTHER < 151.0) 7799 { 7800 // IF(IZPART.LT.1)THEN 7801 // For neutrons, the width is given by a mean value between geometrical 7802 // and QM values; Only QM contribution (Rgeom -> Rgeom + Rlamda) seems to 7803 // be too strong for neutrons 7804 fwidth = PI * BKONST * G * 7805 std::sqrt((RGEOM * RGEOM * INT1 + 2.0 * AKONST * RGEOM * INT2 + AKONST * AKONST * INT3) * RGEOM * 7806 RGEOM * INT1); 7807 } 7808 else 7809 { 7810 fwidth = PI * BKONST * G * (RGEOM * RGEOM * INT1 + 2.0 * AKONST * RGEOM * INT2 + AKONST * AKONST * INT3); 7811 } 7812 7813 // To correct for too high values of analytical width compared to 7814 // numerical solution for energies close to the particle threshold: 7815 if (IZPART < 3.0) 7816 { 7817 if (AMOTHER < 155.0) 7818 { 7819 PAR_A1 = std::exp(2.302585 * 0.2083 * std::exp(-0.01548472 * AMOTHER)) - 0.05; 7820 PAR_B1 = 0.59939389 + 0.00915657 * AMOTHER; 7821 } 7822 else 7823 { 7824 if (AMOTHER > 154.0 && AMOTHER < 195.0) 7825 { 7826 PAR_A1 = 1.0086961 - 8.629e-5 * AMOTHER; 7827 PAR_B1 = 1.5329331 + 0.00302074 * AMOTHER; 7828 } 7829 else 7830 { 7831 if (AMOTHER > 194.0 && AMOTHER < 208.0) 7832 { 7833 PAR_A1 = 9.8356347 - 0.09294663 * AMOTHER + 2.441e-4 * AMOTHER * AMOTHER; 7834 PAR_B1 = 7.7701987 - 0.02897401 * AMOTHER; 7835 } 7836 else 7837 { 7838 if (AMOTHER > 207.0 && AMOTHER < 228.0) 7839 { 7840 PAR_A1 = 15.107385 - 0.12414415 * AMOTHER + 2.7222e-4 * AMOTHER * AMOTHER; 7841 PAR_B1 = -64.078009 + 0.56813179 * AMOTHER - 0.00121078 * AMOTHER * AMOTHER; 7842 } 7843 else 7844 { 7845 if (AMOTHER > 227.0) 7846 { 7847 if (mod(NMOTHER, 2) == 0 && NMOTHER > 147.) 7848 { 7849 PAR_A1 = 2.0 * (0.9389118 + 6.4559e-5 * AMOTHER); 7850 } 7851 else 7852 { 7853 if (mod(NMOTHER, 2) == 1) 7854 PAR_A1 = 3.0 * (0.9389118 + 6.4559e-5 * AMOTHER); 7855 } 7856 PAR_B1 = 2.1507177 + 0.00146119 * AMOTHER; 7857 } 7858 } 7859 } 7860 } 7861 } 7862 FACT = std::exp((2.302585 * PAR_A1 * std::exp(-PAR_B1 * (EXC - SB)))); 7863 if (FACT < 1.0) 7864 FACT = 1.0; 7865 if (IZPART < -1. && ZMOTHER < 151.0) 7866 { 7867 // IF(IZPART.LT.1)THEN 7868 fwidth = fwidth / std::sqrt(FACT); 7869 } 7870 else 7871 { 7872 fwidth = fwidth / FACT; 7873 } 7874 } // if IZPART<3.0 7875 7876 if (fwidth <= 0.0) 7877 { 7878 std::cout << "LOOK IN PARTICLE_WIDTH!" << std::endl; 7879 std::cout << "ACN,APART :" << AMOTHER << APART << std::endl; 7880 std::cout << "EXC,TEMP,B,SB :" << EXC << " " << TEMP << " " << B << " " << SB << std::endl; 7881 std::cout << "INTi, i=1-3 :" << INT1 << " " << INT2 << " " << INT3 << std::endl; 7882 std::cout << " " << std::endl; 7883 } 7884 7885 } // if SB>EXC 7886 return fwidth; 7887 } 7888 7889 G4double G4Abla::pen(G4double A, G4double ap, G4double omega, G4double T) 7890 { 7891 // JLRS: 06/11/2016 7892 // CORRECTIONS FOR BARRIER PENETRATION 7893 // AK, KHS 2005 - Energy-dependen inverse cross sections included, influence 7894 // of 7895 // Coulomb barrier for LCP, tunnelling for LCP 7896 7897 G4double fpen = 0., MU, HO; 7898 7899 // REDUCED MASSES (IN MeV/C**2) 7900 MU = (A - ap) * ap / A; 7901 7902 // ENERGY OF THE INVERSE PARABOLA AT THE POTENTIAL BARRIER (hbar*omega); 7903 // HERE hbar = 197.3287 fm*MeV/c, omega is in c/fm 7904 HO = 197.3287 * omega; 7905 7906 if (T <= 0.0) 7907 { 7908 fpen = 0.0; 7909 } 7910 else 7911 { 7912 fpen = std::pow(10.0, 4.e-4 * std::pow(T / (HO * HO * std::pow(MU, 0.25)), -4.3 / 2.3026)); 7913 } 7914 7915 return fpen; 7916 } 7917 7918 void G4Abla::bsbkbc(G4double A, G4double Z, G4double* BS, G4double* BK, G4double* BC) 7919 { 7920 // Calculate BS and BK needed for a level-density parameter: 7921 // BETA2 and BETA4 = quadrupole and hexadecapole deformation 7922 7923 G4double PI = 3.14159265; 7924 G4int IZ = idnint(Z); 7925 G4int IN = idnint(A - Z); 7926 // alphaN = sqrt(2*N/(4*pi))*BetaN 7927 G4double ALPHA2 = std::sqrt(5.0 / (4.0 * PI)) * ecld->beta2[IN][IZ]; 7928 G4double ALPHA4 = std::sqrt(9.0 / (4.0 * PI)) * ecld->beta4[IN][IZ]; 7929 7930 (*BS) = 1.0 + 0.4 * ALPHA2 * ALPHA2 - 4.0 / 105.0 * ALPHA2 * ALPHA2 * ALPHA2 - 7931 66.0 / 175.0 * ALPHA2 * ALPHA2 * ALPHA2 * ALPHA2 - 4.0 / 35.0 * ALPHA2 * ALPHA2 * ALPHA4 + ALPHA4 * ALPHA4; 7932 7933 (*BK) = 1.0 + 0.4 * ALPHA2 * ALPHA2 + 16.0 / 105.0 * ALPHA2 * ALPHA2 * ALPHA2 - 7934 82.0 / 175.0 * ALPHA2 * ALPHA2 * ALPHA2 * ALPHA2 + 2.0 / 35.0 * ALPHA2 * ALPHA2 * ALPHA4 + ALPHA4 * ALPHA4; 7935 7936 (*BC) = 0.0; 7937 7938 return; 7939 } 7940 7941 G4double G4Abla::fvmaxhaz(G4double T) 7942 { 7943 // Random generator according to a distribution similar to a 7944 // Maxwell distribution with quantum-mech. x-section for charged particles 7945 // according to KHS 7946 // Y = X**(1.5E0) / (B+X) * EXP(-X/T) (approximation:) 7947 7948 return ( 7949 3.0 * T * 7950 std::pow(-1. * std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()), 7951 0.333333)); 7952 } 7953 7954 G4double 7955 G4Abla::func_trans(G4double TIME, G4double ZF, G4double AF, G4double bet, G4double Y, G4double FT, G4double T_0) 7956 { 7957 /* 7958 c This function determines the fission width as a function o time 7959 c according to the analytical solution of the FPE for the probability 7960 distribution c at the barrier when the nucleus potential is aproximated by a 7961 parabolic c potential. It is taken from S. Chandrasekhar, Rev. Mod. Phys. 15 7962 (1943) 1 7963 c 7964 c***********************INPUT PARAMETERS********************************* 7965 c Time Time at which we evaluate the fission width 7966 c ZF Z of nucleus 7967 C AF A of nucleus 7968 c BET Reduced dissipation coefficient 7969 c FT Nuclear temperature 7970 C************************************************************************** 7971 C********************************OUTPUT*********************************** 7972 C Fission decay width at the corresponding time of the decay cascade 7973 C************************************************************************* 7974 c****************************OTHER VARIABLES****************************** 7975 C SIGMA_SQR Square of the width of the prob. distribution 7976 C XB Deformation of the nucleus at the saddle point 7977 c NORM Normalization factor of the probability distribution 7978 c W Probability distribution at the saddle deformation XB 7979 c W_INFIN Probability distr. at XB at infinite time 7980 c MFCD Mass of the fission collective degree of freedom 7981 C************************************************************************* 7982 */ 7983 G4double PI = 3.14159; 7984 G4double DEFO_INIT, OMEGA, HOMEGA, OMEGA_GS, HOMEGA_GS, K1, MFCD; 7985 G4double BET1, XACT, SIGMA_SQR, W_EXP, XB, NORM, SIGMA_SQR_INF, W_INFIN, W; 7986 G4double FUNC_TRANS, LOG_SLOPE_INF, LOG_SLOPE_ABS; 7987 // 7988 // Influence of initial deformation 7989 // Initial alpha2 deformation (GS) 7990 DEFO_INIT = std::sqrt(5.0 / (4.0 * PI)) * ecld->beta2[fiss->at - fiss->zt][fiss->zt]; 7991 // 7992 fomega_sp(AF, Y, &MFCD, &OMEGA, &HOMEGA); 7993 fomega_gs(AF, ZF, &K1, &OMEGA_GS, &HOMEGA_GS); 7994 // 7995 // Determination of the square of the width of the probability distribution 7996 // For the overdamped regime BET**2 > 4*OMEGA**2 7997 if ((bet * bet) > 4.0 * OMEGA_GS * OMEGA_GS) 7998 { 7999 BET1 = std::sqrt(bet * bet - 4.0 * OMEGA_GS * OMEGA_GS); 8000 // 8001 // REMEMBER THAT HOMEGA IS ACTUALLY HBAR*HOMEGA1=1MeV 8002 // SO THAT HOMEGA1 = HOMEGA/HBAR 8003 // 8004 SIGMA_SQR = 8005 (FT / K1) * 8006 (1.0 - 8007 ((2.0 * bet * bet / (BET1 * BET1) * 8008 (0.5 * (std::exp(0.50 * (BET1 - bet) * 1.e21 * TIME) - std::exp(0.5 * (-BET1 - bet) * 1.e21 * TIME))) * 8009 (0.5 * (std::exp(0.50 * (BET1 - bet) * 1.e21 * TIME) - std::exp(0.5 * (-BET1 - bet) * 1.e21 * TIME)))) + 8010 (bet / BET1 * 0.50 * (std::exp((BET1 - bet) * 1.e21 * TIME) - std::exp((-BET1 - bet) * 1.e21 * TIME))) + 8011 1. * std::exp(-bet * 1.e21 * TIME))); 8012 // 8013 // Evolution of the mean x-value (KHS March 2006) 8014 XACT = DEFO_INIT * std::exp(-0.5 * (bet - BET1) * 1.e21 * (TIME - T_0)); 8015 // 8016 } 8017 else 8018 { 8019 // For the underdamped regime BET**2 < 4*HOMEGA**2 BET1 becomes a complex 8020 // number and the expression with sinh and cosh can be transformed in one 8021 // with sin and cos 8022 BET1 = std::sqrt(4.0 * OMEGA_GS * OMEGA_GS - bet * bet); 8023 SIGMA_SQR = FT / K1 * 8024 (1. - std::exp(-1.0 * bet * 1.e21 * TIME) * 8025 (bet * bet / (BET1 * BET1) * (1. - std::cos(BET1 * 1.e21 * TIME)) + 8026 bet / BET1 * std::sin(BET1 * 1.e21 * TIME) + 1.0)); 8027 XACT = DEFO_INIT * std::cos(0.5 * BET1 * 1.e21 * (TIME - T_0)) * std::exp(-bet * 1.e21 * (TIME - T_0)); 8028 } 8029 8030 // Determination of the deformation at the saddle point according to 8031 // "Geometrical relationships of Macroscopic Nucl. Phys." from Hass and Myers 8032 // page 100 This corresponds to alpha2 deformation. 8033 XB = 7. / 3. * Y - 938. / 765. * Y * Y + 9.499768 * Y * Y * Y - 8.050944 * Y * Y * Y * Y; 8034 // 8035 // Determination of the probability distribution at the saddle deformation 8036 // 8037 if (SIGMA_SQR > 0.0) 8038 { 8039 NORM = 1. / std::sqrt(2. * PI * SIGMA_SQR); 8040 // 8041 W_EXP = -1. * (XB - XACT) * (XB - XACT) / (2.0 * SIGMA_SQR); 8042 if (W_EXP < (-708.0)) 8043 W_EXP = -708.0; 8044 W = NORM * std::exp(W_EXP) * FT / (K1 * SIGMA_SQR); 8045 } 8046 else 8047 { 8048 W = 0.0; 8049 } 8050 // 8051 // Determination of the fission decay width, we assume we are in the 8052 // overdamped regime 8053 // 8054 SIGMA_SQR_INF = FT / K1; 8055 W_EXP = -XB * XB / (2.0 * SIGMA_SQR_INF); 8056 if (W_EXP < (-708.0)) 8057 W_EXP = -708.0; 8058 W_INFIN = std::exp(W_EXP) / std::sqrt(2.0 * PI * SIGMA_SQR_INF); 8059 FUNC_TRANS = W / W_INFIN; 8060 // 8061 // Correction for the variation of the mean velocity at the fission barrier 8062 // (see B. Jurado et al, Nucl. Phys. A747, p. 14) 8063 // 8064 LOG_SLOPE_INF = cram(bet, HOMEGA) * bet * MFCD * OMEGA / FT; 8065 LOG_SLOPE_ABS = (XB - XACT) / SIGMA_SQR - XB / SIGMA_SQR_INF + cram(bet, HOMEGA) * bet * MFCD * OMEGA / FT; 8066 // 8067 FUNC_TRANS = FUNC_TRANS * LOG_SLOPE_ABS / LOG_SLOPE_INF; 8068 // 8069 return FUNC_TRANS; 8070 } 8071 8072 void G4Abla::part_fiss(G4double BET, 8073 G4double GP, 8074 G4double GF, 8075 G4double Y, 8076 G4double TAUF, 8077 G4double TS1, 8078 G4double TSUM, 8079 G4int* CHOICE, 8080 G4double ZF, 8081 G4double AF, 8082 G4double FT, 8083 G4double* T_LAPSE, 8084 G4double* GF_LOC) 8085 { 8086 /* 8087 C THIS SUBROUTINE IS AIMED TO CHOOSE BETWEEN PARTICLE EMISSION 8088 C AND FISSION 8089 C WE USE MONTE-CARLO METHODS AND SAMPLE TIME BETWEEN T=0 AND T=1.5*TAUF 8090 c TO SIMULATE THE TRANSIENT TIME WITH 30 STEPS (0.05*TAUF EACH) 8091 C FOR t>1.5*TAUF , GF=CONSTANT=ASYMPTOTICAL VALUE (INCLUDING KRAMERS 8092 FACTOR) 8093 c------------------------------------------------------------------------ 8094 c Modifications introduced by BEATRIZ JURADO 18/10/01: 8095 c 1. Now this subrutine is included in the rutine direct 8096 c 2. TSUM does not include the current particle decay time 8097 C 3. T_LAPSE is the time until decay, taken as an output variable 8098 C 4. GF_LOC is also taken as an output variable 8099 C 5. BET (Diss. Coeff.) and HOMEGA (Frequency at the ground state 8100 c are included as input variables because they are needed for FUNC_TRANS 8101 C----------------------------------------------------------------------- 8102 C ON INPUT: 8103 C GP Partial particle decay width 8104 C GF Asymptotic value of Gamma-f, including Kramers 8105 factor C AF Mass number of nucleus C TAUF 8106 Transient time C TS1 Partial particle decay time for the 8107 next step C TSUM Total sum of partial particle decay 8108 times, including C the next expected one, which 8109 is in competition C with fission now C ZF 8110 Z of nucleus C AF A of nucleus 8111 C----------------------------------------------------------------------- 8112 C ON OUTPUT: 8113 C CHOICE Key for decay mode: 0 = no decay (only internal) 8114 C 1 = evaporation 8115 C 2 = fission 8116 C----------------------------------------------------------------------- 8117 C VARIABLES: 8118 C GP Partial particle decay width 8119 C GF Asymptotic value of Gamma-f, including Kramers 8120 factor C TAUF Transient time C TS1 Partial particle 8121 decay time C TSUM Total sum of partial particle decay 8122 times C CHOICE Key for decay mode C ZF Z of nucleus 8123 C AF A of nucleus 8124 C FT Used for Fermi function in FUNC_TRANS 8125 C STEP_LENGTH Step in time to sample different decays 8126 C BEGIN_TIME Total sum of partial particle decay times, 8127 excluding C the next expected one, which is in 8128 competition C with fission now C LOC_TIME_BEGIN 8129 Begin of time interval considered in one step C LOC_TIME_END End 8130 of time interval considered in one step C GF_LOC In-grow 8131 function for fission width, c normalized to 8132 asymptotic value C TS2 Effective partial fission decay 8133 time in one time step C HBAR hbar C T_LAPSE 8134 Effective decay time in one time step C REAC_PROB Reaction 8135 probability in one time step C X Help variable for 8136 random generator 8137 C------------------------------------------------------------------------ 8138 */ 8139 G4double K1, OMEGA, HOMEGA, t_0, STEP_LENGTH, LOC_TIME_BEGIN, LOC_TIME_END = 0., BEGIN_TIME = 0., FISS_PROB, X, TS2, 8140 LAMBDA, REAC_PROB; 8141 G4double HBAR = 6.582122e-22; 8142 G4int fchoice = 0; 8143 G4double fGF_LOC = 0., fT_LAPSE = 0.; 8144 // 8145 if (GF <= 0.0) 8146 { 8147 *CHOICE = 1; 8148 *T_LAPSE = TS1; 8149 *GF_LOC = 0.0; 8150 goto direct107; 8151 } 8152 // 8153 fomega_gs(AF, ZF, &K1, &OMEGA, &HOMEGA); 8154 // 8155 // **************************************************************** 8156 // Calculation of the shift in time due to the initial conditions 8157 // 8158 // Overdamped regime 8159 if (BET * BET > 4.0 * OMEGA * OMEGA) 8160 { 8161 // REMEMBER THAT HOMEGA IS ACTUALLY HBAR*HOMEGA1=1MeV 8162 // SO THAT HOMEGA1 = HOMEGA/HBAR 8163 // Additional factor 1/16 proposed by KHS on 14/7/2010. Takes into 8164 // account the fact that the curvature of the potential is ~16 times 8165 // larger than what predicted by the liquid drop model, because of 8166 // shell effects. 8167 t_0 = BET * 1.e21 * HBAR * HBAR / (4. * HOMEGA * FT) / 16.; 8168 } 8169 else 8170 { 8171 // Underdamped regime 8172 if (((2. * FT - HOMEGA / 16.) > 0.000001) && BET > 0.0) 8173 { 8174 // Additional factor 1/16 proposed by KHS on 14/7/2010. Takes into 8175 // account the fact that the curvature of the potential is ~16 times 8176 // larger than what predicted by the liquid drop model, because of 8177 // shell effects. 8178 t_0 = (std::log(2. * FT / (2. * FT - HOMEGA / 16.))) / (BET * 1.e21); 8179 } 8180 else 8181 { 8182 // Neglect fission transients if the time shift t_0 is too 8183 // large. Suppresses large, spurious fission cross section at very 8184 // low excitation energy in p+Ta. 8185 // 8186 fchoice = 0; 8187 goto direct106; 8188 } 8189 } 8190 // ********************************************************************+ 8191 fchoice = 0; 8192 STEP_LENGTH = 1.5 * TAUF / 50.; 8193 // 8194 // AT FIRST WE CACULATE THE REAL CURRENT TIME 8195 // TSUM includes only the time elapsed in the previous steps 8196 // 8197 BEGIN_TIME = TSUM + t_0; 8198 // 8199 if (BEGIN_TIME < 0.0) 8200 std::cout << "CURRENT TIME < 0" << BEGIN_TIME << std::endl; 8201 // 8202 if (BEGIN_TIME < 1.50 * TAUF) 8203 { 8204 LOC_TIME_BEGIN = BEGIN_TIME; 8205 // 8206 while ((LOC_TIME_BEGIN < 1.5 * TAUF) && fchoice == 0) 8207 { 8208 8209 LOC_TIME_END = LOC_TIME_BEGIN + STEP_LENGTH; 8210 // 8211 // NOW WE ESTIMATE THE MEAN VALUE OF THE FISSION WIDTH WITHIN THE SMALL 8212 // INTERVAL 8213 fGF_LOC = (func_trans(LOC_TIME_BEGIN, ZF, AF, BET, Y, FT, t_0) + 8214 func_trans(LOC_TIME_END, ZF, AF, BET, Y, FT, t_0)) / 8215 2.0; 8216 // 8217 fGF_LOC = fGF_LOC * GF; 8218 8219 // TS2 IS THE MEAN DECAY TIME OF THE FISSION CHANNEL 8220 if (fGF_LOC > 0.0) 8221 { 8222 TS2 = HBAR / fGF_LOC; 8223 } 8224 else 8225 { 8226 TS2 = 0.0; 8227 } 8228 // 8229 if (TS2 > 0.0) 8230 { 8231 LAMBDA = 1.0 / TS1 + 1.0 / TS2; 8232 } 8233 else 8234 { 8235 LAMBDA = 1.0 / TS1; 8236 } 8237 // 8238 // This is the probability to survive the decay at this step 8239 REAC_PROB = std::exp(-1.0 * STEP_LENGTH * LAMBDA); 8240 // I GENERATE A RANDOM NUMBER 8241 X = G4AblaRandom::flat(); 8242 if (X > REAC_PROB) 8243 { 8244 // THEN THE EVAPORATION OR FISSION HAS OCCURED 8245 FISS_PROB = fGF_LOC / (fGF_LOC + GP); 8246 X = G4AblaRandom::flat(); 8247 // WRITE(6,*)'X=',X 8248 if (X < FISS_PROB) 8249 { 8250 // FISSION OCCURED 8251 fchoice = 2; 8252 } 8253 else 8254 { 8255 // EVAPORATION OCCURED 8256 fchoice = 1; 8257 } 8258 } // if x 8259 LOC_TIME_BEGIN = LOC_TIME_END; 8260 } // while 8261 // Take the real decay time of this decay step 8262 fT_LAPSE = LOC_TIME_END - BEGIN_TIME; 8263 } // if BEGIN_TIME 8264 // 8265 // NOW, IF NOTHING HAPPENED DURING TRANSIENT TIME 8266 direct106: 8267 if (fchoice == 0) 8268 { 8269 fGF_LOC = GF; 8270 FISS_PROB = GF / (GF + GP); 8271 8272 // Added for cases where already at the beginning BEGIN_TIME > 1.5d0*TAUF 8273 if (GF > 0.0) 8274 { 8275 TS2 = HBAR / GF; 8276 } 8277 else 8278 { 8279 TS2 = 0.0; 8280 } 8281 8282 if (TS2 > 0.0) 8283 { 8284 LAMBDA = 1. / TS1 + 1. / TS2; 8285 } 8286 else 8287 { 8288 LAMBDA = 1. / TS1; 8289 } 8290 // 8291 X = G4AblaRandom::flat(); 8292 8293 if (X < FISS_PROB) 8294 { 8295 // FISSION OCCURED 8296 fchoice = 2; 8297 } 8298 else 8299 { 8300 // EVAPORATION OCCURED 8301 fchoice = 1; 8302 } 8303 // 8304 // TIRAGE ALEATOIRE DANS UNE EXPONENTIELLLE : Y=EXP(-X/T) 8305 // EXPOHAZ=-T*LOG(HAZ(K)) 8306 fT_LAPSE = fT_LAPSE - 1.0 / LAMBDA * std::log(G4AblaRandom::flat()); 8307 } 8308 // 8309 direct107: 8310 8311 (*T_LAPSE) = fT_LAPSE; 8312 (*GF_LOC) = fGF_LOC; 8313 (*CHOICE) = fchoice; 8314 return; 8315 } 8316 8317 G4double G4Abla::tunnelling(G4double A, 8318 G4double ZPRF, 8319 G4double Y, 8320 G4double EE, 8321 G4double EF, 8322 G4double TEMP, 8323 G4double DENSG, 8324 G4double DENSF, 8325 G4double ENH_FACT) 8326 { 8327 // Subroutine to caluclate fission width with included effects 8328 // of tunnelling through the fission barrier 8329 8330 G4double PI = 3.14159; 8331 G4int IZ, IN; 8332 G4double MFCD, OMEGA, HOMEGA1, HOMEGA2 = 0., GFTUN; 8333 G4double E1, E2, EXP_FACT, CORR_FUNCT, FACT1, FACT2, FACT3; 8334 8335 IZ = idnint(ZPRF); 8336 IN = idnint(A - ZPRF); 8337 8338 // For low energies system "sees" LD barrier 8339 fomega_sp(A, Y, &MFCD, &OMEGA, &HOMEGA1); 8340 8341 if (mod(IN, 2) == 0 && mod(IZ, 2) == 0) 8342 { // e-e 8343 // Due to pairing gap, even-even nuclei cannot tunnel for excitation energy 8344 // lower than pairing gap (no levels at which system can be) 8345 EE = EE - 12.0 / std::sqrt(A); 8346 HOMEGA2 = 1.04; 8347 } 8348 8349 if (mod(IN, 2) == 1 && mod(IZ, 2) == 1) 8350 { // o-o 8351 HOMEGA2 = 0.65; 8352 } 8353 8354 if (mod(IN, 2) == 1 && mod(IZ, 2) == 0) 8355 { // o-e 8356 HOMEGA2 = 0.8; 8357 } 8358 8359 if (mod(IN, 2) == 0 && mod(IZ, 2) == 1) 8360 { // e-0 8361 HOMEGA2 = 0.8; 8362 } 8363 8364 E1 = EF + HOMEGA1 / 2.0 / PI * std::log(HOMEGA1 * (2.0 * PI + HOMEGA2) / 4.0 / PI / PI); 8365 8366 E2 = EF + HOMEGA2 / (2.0 * PI) * std::log(1.0 + 2.0 * PI / HOMEGA2); 8367 8368 // AKH May 2013 - Due to approximations in the analytical integration, at 8369 // energies just above barrier Pf was to low, at energies below barrier it was 8370 // somewhat higher. LInes below are supposed to correct for this. Factor 0.20 8371 // in EXP_FACT comes from the slope of the Pf(Eexc) (Gavron's data) around 8372 // fission barrier. 8373 EXP_FACT = (EE - EF) / (HOMEGA2 / (2.0 * PI)); 8374 if (EXP_FACT > 700.0) 8375 EXP_FACT = 700.0; 8376 CORR_FUNCT = HOMEGA1 * (1.0 - 1.0 / (1.0 + std::exp(EXP_FACT))); 8377 if (mod(IN, 2) == 0 && mod(IZ, 2) == 0) 8378 { 8379 CORR_FUNCT = HOMEGA1 * (1.0 - 1.0 / (1.0 + std::exp(EXP_FACT))); 8380 } 8381 8382 FACT1 = HOMEGA1 / (2.0 * PI * TEMP + HOMEGA1); 8383 FACT2 = (2.0 * PI / (2.0 * PI + HOMEGA2) - HOMEGA1 * (2.0 * PI + HOMEGA2) / 4.0 / PI / PI) / (E2 - E1); 8384 FACT3 = HOMEGA2 / (2.0 * PI * TEMP - HOMEGA2); 8385 8386 if (EE < E1) 8387 { 8388 GFTUN = FACT1 * 8389 (std::exp(EE / TEMP) * std::exp(2.0 * PI * (EE - EF) / HOMEGA1) - std::exp(-2.0 * PI * EF / HOMEGA1)); 8390 } 8391 else 8392 { 8393 if (EE >= E1 && EE < E2) 8394 { 8395 GFTUN = std::exp(EE / TEMP) * (0.50 + FACT2 * (EE - EF - TEMP)) - 8396 std::exp(E1 / TEMP) * (0.5 + FACT2 * (E1 - EF - TEMP)) + 8397 FACT1 * (std::exp(E1 / TEMP) * std::exp(2.0 * PI * (E1 - EF) / HOMEGA1) - 8398 std::exp(-2.0 * PI * EF / HOMEGA1)); 8399 } 8400 else 8401 { 8402 GFTUN = std::exp(EE / TEMP) * (1.0 + FACT3 * std::exp(-2.0 * PI * (EE - EF) / HOMEGA2)) - 8403 std::exp(E2 / TEMP) * (1.0 + FACT3 * std::exp(-2.0 * PI * (E2 - EF) / HOMEGA2)) + 8404 std::exp(E2 / TEMP) * (0.5 + FACT2 * (E2 - EF - TEMP)) - 8405 std::exp(E1 / TEMP) * (0.5 + FACT2 * (E1 - EF - TEMP)) + 8406 FACT1 * (std::exp(E1 / TEMP) * std::exp(2.0 * PI * (E1 - EF) / HOMEGA1) - 8407 std::exp(-2.0 * PI * EF / HOMEGA1)); 8408 } 8409 } 8410 GFTUN = GFTUN / std::exp(EE / TEMP) * DENSF * ENH_FACT / DENSG / 2.0 / PI; 8411 GFTUN = GFTUN * CORR_FUNCT; 8412 return GFTUN; 8413 } 8414 8415 void G4Abla::fission_width(G4double ZPRF, 8416 G4double A, 8417 G4double EE, 8418 G4double BS, 8419 G4double BK, 8420 G4double EF, 8421 G4double Y, 8422 G4double* GF, 8423 G4double* TEMP, 8424 G4double JPR, 8425 G4int IEROT, 8426 G4int FF_ALLOWED, 8427 G4int OPTCOL, 8428 G4int OPTSHP, 8429 G4double DENSG) 8430 { 8431 // 8432 G4double FNORM, MASS_ASYM_SADD_B, FP_PER, FP_PAR, SIG_PER_SP, SIG_PAR_SP; 8433 G4double Z2OVERA, ftemp, fgf, DENSF, ECOR, EROT, qr; 8434 G4double DCR, UCR, ENH_FACTA, ENH_FACTB, ENH_FACT, PONFE; 8435 G4double PI = 3.14159; 8436 8437 DCR = fiss->dcr; 8438 UCR = fiss->ucr; 8439 Z2OVERA = ZPRF * ZPRF / A; 8440 8441 // Nuclei below Businaro-Gallone point do not go through fission 8442 if ((ZPRF <= 55.0) || (FF_ALLOWED == 0)) 8443 { 8444 (*GF) = 0.0; 8445 (*TEMP) = 0.5; 8446 return; 8447 } 8448 8449 // Level density above SP 8450 // Saddle-point deformation is defbet as above. But, FP_PER and FP_PAR 8451 // are calculated for fission in DENSNIV acc to Myers and Hasse, and their 8452 // parametrization is done as function of y 8453 densniv(A, ZPRF, EE, EF, &DENSF, 0.0, BS, BK, &ftemp, OPTSHP, 0, Y, &ECOR, JPR, 1, &qr); 8454 8455 if (OPTCOL == 0) 8456 { 8457 fgf = DENSF / DENSG / PI / 2.0 * ftemp; 8458 (*TEMP) = ftemp; 8459 (*GF) = fgf; 8460 return; 8461 } 8462 8463 // FP = 2/5*M0*R0**2/HBAR**2 * A**(5/3) * (1 + DEFBET/3) 8464 // FP is used to calculate the spin-cutoff parameter SIG=FP*TEMP/hbar**2; 8465 // hbar**2 is, therefore, included in FP in order to avoid problems with large 8466 // exponents The factor fnorm inlcudes then R0, M0 and hbar**2 - fnorm = 8467 // R0*M0/hbar**2 = 1.2fm*931.49MeV/c**2 /(6.582122e-22 MeVs)**2 and is in 8468 // units 1/MeV 8469 FNORM = 1.2 * 1.2 * 931.49 * 1.e-2 / (9.0 * 6.582122 * 6.582122); 8470 // FP_PER ~ 1+7*y/6, FP_PAR ~ 1-7*y/3 (Hasse & Myers, Geom. relat. macr. nucl. 8471 // phys.) Perpendicular moment of inertia 8472 FP_PER = 2.0 / 5.0 * std::pow(A, 5.0 / 3.0) * FNORM * (1. + 7.0 / 6.0 * Y * (1.0 + 1396.0 / 255. * Y)); 8473 8474 // AK - Jan 2011 - following line is needed, as for these nuclei it seems that 8475 // FP_PER calculated according to above formula has too large values, leading 8476 // to too large ENH_FACT 8477 if (Z2OVERA <= 30.0) 8478 FP_PER = 6.50; 8479 8480 // Parallel moment of inertia 8481 FP_PAR = 2.0 / 5.0 * std::pow(A, 5.0 / 3.0) * FNORM * (1.0 - 7.0 / 3.0 * Y * (1.0 - 389.0 / 255.0 * Y)); 8482 if (FP_PAR < 0.0) 8483 FP_PAR = 0.0; 8484 8485 EROT = JPR * JPR / (2.0 * std::sqrt(FP_PAR * FP_PAR + FP_PER * FP_PER)); 8486 if (IEROT == 1) 8487 EROT = 0.0; 8488 8489 // Perpendicular spin cut-off parameter 8490 SIG_PER_SP = std::sqrt(FP_PER * ftemp); 8491 8492 if (SIG_PER_SP < 1.0) 8493 SIG_PER_SP = 1.0; 8494 8495 // Parallel spin cut-off parameter 8496 SIG_PAR_SP = std::sqrt(FP_PAR * ftemp); 8497 ENH_FACT = 1.0; 8498 // 8499 if (A > 223.0) 8500 { 8501 MASS_ASYM_SADD_B = 2.0; 8502 } 8503 else 8504 { 8505 MASS_ASYM_SADD_B = 1.0; 8506 } 8507 8508 // actinides with low barriers 8509 if (Z2OVERA > 35. && Z2OVERA <= (110. * 110. / 298.0)) 8510 { 8511 // Barrier A is axial asymmetric 8512 ENH_FACTA = std::sqrt(8.0 * PI) * SIG_PER_SP * SIG_PER_SP * SIG_PAR_SP; 8513 // Barrier B is axial symmetric 8514 ENH_FACTB = MASS_ASYM_SADD_B * SIG_PER_SP * SIG_PER_SP; 8515 // Total enhancement 8516 ENH_FACT = ENH_FACTA * ENH_FACTB / (ENH_FACTA + ENH_FACTB); 8517 } 8518 else 8519 { 8520 // nuclei with high fission barriers (only barrier B plays a role, axial 8521 // symmetric) 8522 if (Z2OVERA <= 35.) 8523 { 8524 ENH_FACT = MASS_ASYM_SADD_B * SIG_PER_SP * SIG_PER_SP; 8525 } 8526 else 8527 { 8528 // super-heavy nuclei (only barrier A plays a role, axial asymmetric) 8529 ENH_FACT = std::sqrt(8.0 * PI) * SIG_PER_SP * SIG_PER_SP * SIG_PAR_SP; 8530 } 8531 } 8532 8533 // Fading-out with excitation energy above the saddle point: 8534 PONFE = (ECOR - UCR - EROT) / DCR; 8535 if (PONFE > 700.) 8536 PONFE = 700.0; 8537 // Fading-out according to Junghans: 8538 ENH_FACT = 1.0 / (1.0 + std::exp(PONFE)) * ENH_FACT + 1.0; 8539 8540 if (ENH_FACT < 1.0) 8541 ENH_FACT = 1.0; 8542 fgf = DENSF / DENSG / PI / 2.0 * ftemp * ENH_FACT; 8543 8544 // Tunneling 8545 if (EE < EF) 8546 { 8547 fgf = tunnelling(A, ZPRF, Y, EE, EF, ftemp, DENSG, DENSF, ENH_FACT); 8548 } 8549 // 8550 (*GF) = fgf; 8551 (*TEMP) = ftemp; 8552 return; 8553 } 8554 8555 void G4Abla::lorb(G4double AMOTHER, 8556 G4double ADAUGHTER, 8557 G4double LMOTHER, 8558 G4double EEFINAL, 8559 G4double* LORBITAL, 8560 G4double* SIGMA_LORBITAL) 8561 { 8562 8563 G4double AFRAGMENT, S4FINAL, ALEVDENS; 8564 G4double THETA_MOTHER, THETA_ORBITAL; 8565 8566 /* 8567 C Values on input: 8568 C AMOTHER mass of mother nucleus 8569 C ADAUGHTER mass of daughter fragment 8570 C LMOTHER angular momentum of mother (may be real) 8571 C EEFINAL excitation energy after emission 8572 C (sum of daughter and fragment) 8573 C 8574 C Values on output: 8575 C LORBITAL mean value of orbital angular momentum 8576 C (assumed to be fully aligned with LMOTHER) 8577 C SIGMA_LORBITAL standard deviation of the orbital angular momentum 8578 */ 8579 if (EEFINAL <= 0.01) 8580 EEFINAL = 0.01; 8581 AFRAGMENT = AMOTHER - ADAUGHTER; 8582 ALEVDENS = 0.073 * AMOTHER + 0.095 * std::pow(AMOTHER, 2.0 / 3.0); 8583 S4FINAL = ALEVDENS * EEFINAL; 8584 if (S4FINAL <= 0.0 || S4FINAL > 100000.) 8585 { 8586 std::cout << "S4FINAL:" << S4FINAL << ALEVDENS << EEFINAL << idnint(AMOTHER) << idnint(AFRAGMENT) << std::endl; 8587 } 8588 THETA_MOTHER = 0.0111 * std::pow(AMOTHER, 1.66667); 8589 THETA_ORBITAL = 0.0323 / std::pow(AMOTHER, 2.) * 8590 std::pow(std::pow(AFRAGMENT, 0.33333) + std::pow(ADAUGHTER, 0.33333), 2.) * AFRAGMENT * ADAUGHTER * 8591 (AFRAGMENT + ADAUGHTER); 8592 8593 *LORBITAL = -1. * THETA_ORBITAL * (LMOTHER / THETA_MOTHER + std::sqrt(S4FINAL) / (ALEVDENS * LMOTHER)); 8594 8595 *SIGMA_LORBITAL = std::sqrt(std::sqrt(S4FINAL) * THETA_ORBITAL / ALEVDENS); 8596 8597 return; 8598 } 8599 8600 // Random generator according to a distribution similar to a 8601 // Maxwell distribution with quantum-mech. x-section for neutrons according to 8602 // KHS 8603 // Y = SQRT(X) * EXP(-X/T) (approximation:) 8604 G4double G4Abla::fvmaxhaz_neut(G4double x) 8605 { 8606 8607 return (2.0 * x * std::sqrt(std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()))); 8608 } 8609 8610 void G4Abla::imf(G4double ACN, 8611 G4double ZCN, 8612 G4double TEMP, 8613 G4double EE, 8614 G4double* ZIMF, 8615 G4double* AIMF, 8616 G4double* BIMF, 8617 G4double* SBIMF, 8618 G4double* TIMF, 8619 G4double JPRF) 8620 { 8621 // input variables (compound nucleus) Acn, Zcn, Temp, EE 8622 // output variable (IMF) Zimf,Aimf,Bimf,Sbimf,IRNDM 8623 // 8624 // SBIMF = separation energy + coulomb barrier 8625 // 8626 // SDW(Z) is the sum over all isotopes for a given Z of the decay widths 8627 // DW(Z,A) is the decay width of a certain nuclide 8628 // 8629 // Last update: 8630 // 28/10/13 - JLRS - from abrablav4 (AK) 8631 // 13/11/16 - JLRS - Included this function in Abla++ 8632 8633 G4int IZIMFMAX = 0; 8634 G4int iz = 0, in = 0, IZIMF = 0, INMI = 0, INMA = 0, IZCN = 0, INCN = 0, INIMFMI = 0, INIMFMA = 0, ILIMMAX = 0, 8635 INNMAX = 0, INMIN = 0, IAIMF = 0, IZSTOP = 3, IZMEM = 0, IA = 0, INMINMEM = 0, INMAXMEM = 0, IIA = 0; 8636 G4double BS = 0, BK = 0, BC = 0, BSHELL = 0, DEFBET = 0, DEFBETIMF = 0, EROT = 0, MAIMF = 0, MAZ = 0, MARES = 0, 8637 AIMF_1, OMEGAP = 0, fBIMF = 0.0, BSIMF = 0, A1PAR = 0, A2PAR = 0, SUM_A, EEDAUG; 8638 G4double DENSCN = 0, TEMPCN = 0, ECOR = 0, IINERT = 0, EROTCN = 0, WIDTH_IMF = 0.0, WIDTH1 = 0, IMFARG = 0, QR = 0, 8639 QRCN = 0, DENSIMF = 0, fTIMF = 0, fZIMF = 0, fAIMF = 0.0, NIMF = 0, fSBIMF = 0; 8640 G4double PI = 3.141592653589793238; 8641 G4double ZIMF_1 = 0.0; 8642 G4double SDWprevious = 0, SUMDW_TOT = 0, SUM_Z = 0, X = 0, SUMDW_N_TOT = 0, XX = 0; 8643 G4double SDW[98]; 8644 G4double DW[98][251]; 8645 G4double BBIMF[98][251]; 8646 G4double SSBIMF[98][251]; 8647 G4int OPTSHPIMF = opt->optshpimf; 8648 8649 // Initialization 8650 for (G4int ia = 0; ia < 98; ia++) 8651 for (G4int ib = 0; ib < 251; ib++) 8652 { 8653 BBIMF[ia][ib] = 0.0; 8654 SSBIMF[ia][ib] = 0.0; 8655 } 8656 8657 // take the half of the CN and transform it in integer (floor it) 8658 IZIMFMAX = idnint(ZCN / 2.0); 8659 8660 if (IZIMFMAX < 3) 8661 { 8662 std::cout << "CHARGE_IMF line 46" << std::endl; 8663 std::cout << "Problem: IZIMFMAX < 3 " << std::endl; 8664 std::cout << "ZCN,IZIMFMAX," << ZCN << "," << IZIMFMAX << std::endl; 8665 } 8666 8667 iz = idnint(ZCN); 8668 in = idnint(ACN) - iz; 8669 BSHELL = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz]; 8670 DEFBET = ecld->beta2[in][iz]; 8671 8672 bsbkbc(ACN, ZCN, &BS, &BK, &BC); 8673 8674 densniv(ACN, ZCN, EE, 0.0, &DENSCN, BSHELL, BS, BK, &TEMPCN, 0, 0, DEFBET, &ECOR, JPRF, 0, &QRCN); 8675 8676 IINERT = 0.4 * 931.49 * 1.16 * 1.16 * std::pow(ACN, 5.0 / 3.0) * (1.0 + 0.5 * std::sqrt(5. / (4. * PI)) * DEFBET); 8677 EROTCN = JPRF * JPRF * 197.328 * 197.328 / (2. * IINERT); 8678 // 8679 for (IZIMF = 3; IZIMF <= IZIMFMAX; IZIMF++) 8680 { 8681 8682 SDW[IZIMF] = 0.0; 8683 ZIMF_1 = 1.0 * IZIMF; 8684 8685 // *** Find the limits that both IMF and partner are bound : 8686 8687 isostab_lim(IZIMF, &INIMFMI, 8688 &INIMFMA); // Bound isotopes for IZIMF from INMIN to INIMFMA 8689 // Idea - very proton-rich nuclei can live long enough to evaporate IMF 8690 // before decaying: 8691 INIMFMI = max(1, INIMFMI - 2); 8692 8693 IZCN = idnint(ZCN); // Z of CN 8694 INCN = idnint(ACN) - IZCN; // N of CN 8695 8696 isostab_lim(IZCN - IZIMF, 8697 &INMI, 8698 &INMA); // Daughter nucleus after IMF emission, 8699 // limits of bound isotopes 8700 INMI = max(1, INMI - 2); 8701 INMIN = max(INIMFMI, INCN - INMA); // Both IMF and daughter must be bound 8702 INNMAX = min(INIMFMA, INCN - INMI); // " 8703 8704 ILIMMAX = max(INNMAX, INMIN); // In order to keep the variables below 8705 // *** 8706 8707 for (G4int INIMF = INMIN; INIMF <= ILIMMAX; INIMF++) 8708 { // Range of possible IMF isotopes 8709 IAIMF = IZIMF + INIMF; 8710 DW[IZIMF][IAIMF] = 0.0; 8711 AIMF_1 = 1.0 * (IAIMF); 8712 8713 // Q-values 8714 mglms(ACN - AIMF_1, ZCN - ZIMF_1, OPTSHPIMF, &MARES); 8715 mglms(AIMF_1, ZIMF_1, OPTSHPIMF, &MAIMF); 8716 mglms(ACN, ZCN, OPTSHPIMF, &MAZ); 8717 8718 // Barrier 8719 if (ACN <= AIMF_1) 8720 { 8721 SSBIMF[IZIMF][IAIMF] = 1.e37; 8722 } 8723 else 8724 { 8725 barrs(idnint(ZCN - ZIMF_1), idnint(ACN - AIMF_1), idnint(ZIMF_1), idnint(AIMF_1), &fBIMF, &OMEGAP); 8726 SSBIMF[IZIMF][IAIMF] = MAIMF + MARES - MAZ + fBIMF; 8727 BBIMF[IZIMF][IAIMF] = fBIMF; 8728 } 8729 8730 // ***** Width ********************* 8731 DEFBETIMF = ecld->beta2[idnint(AIMF_1 - ZIMF_1)][idnint(ZIMF_1)] + 8732 ecld->beta2[idnint(ACN - AIMF_1 - ZCN + ZIMF_1)][idnint(ZCN - ZIMF_1)]; 8733 8734 IINERT = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(ACN, 5.0 / 3.0) * 8735 (std::pow(AIMF_1, 5.0 / 3.0) + std::pow(ACN - AIMF_1, 5.0 / 3.0)) + 8736 931.490 * 1.160 * 1.160 * AIMF_1 * (ACN - AIMF_1) / ACN * 8737 (std::pow(AIMF_1, 1.0 / 3.0) + std::pow(ACN - AIMF_1, 1.0 / 3.0)) * 8738 (std::pow(AIMF_1, 1.0 / 3.0) + std::pow(ACN - AIMF_1, 1.0 / 3.0)); 8739 8740 EROT = JPRF * JPRF * 197.328 * 197.328 / (2.0 * IINERT); 8741 8742 // IF(IEROT.EQ.1) EROT = 0.D0 8743 if (EE < (SSBIMF[IZIMF][IAIMF] + EROT) || DENSCN <= 0.0) 8744 { 8745 WIDTH_IMF = 0.0; 8746 // PRINT*,IDNINT(ACN),IDNINT(ZCN),IZIMF,IAIMF 8747 } 8748 else 8749 { 8750 // here the temperature at "saddle point" is used 8751 // Increase of the level densitiy at the barrier due to deformation; see 8752 // comment in ABLA 8753 // BSIMF = ((ACN-AIMF_1)**(2.D0/3.D0) + AIMF_1**(2.D0/3.D0))/ 8754 // & ACN**(2.D0/3.D0) 8755 BSIMF = BS; 8756 densniv(ACN, 8757 ZCN, 8758 EE, 8759 SSBIMF[IZIMF][IAIMF], 8760 &DENSIMF, 8761 0.0, 8762 BSIMF, 8763 1.0, 8764 &fTIMF, 8765 0, 8766 0, 8767 DEFBETIMF, 8768 &ECOR, 8769 JPRF, 8770 2, 8771 &QR); 8772 IMFARG = (SSBIMF[IZIMF][IAIMF] + EROTCN - EROT) / fTIMF; 8773 if (IMFARG > 200.0) 8774 IMFARG = 200.0; 8775 8776 WIDTH1 = width(ACN, ZCN, AIMF_1, ZIMF_1, fTIMF, fBIMF, SSBIMF[IZIMF][IAIMF], EE - EROT); 8777 8778 WIDTH_IMF = WIDTH1 * std::exp(-IMFARG) * QR / QRCN; 8779 8780 if (WIDTH_IMF <= 0.0) 8781 { 8782 std::cout << "GAMMA_IMF=0 -> LOOK IN GAMMA_IMF CALCULATIONS!" << std::endl; 8783 std::cout << "ACN,ZCN,AIMF,ZIMF:" << idnint(ACN) << "," << idnint(ZCN) << "," << idnint(AIMF_1) 8784 << "," << idnint(ZIMF_1) << std::endl; 8785 std::cout << "SSBIMF,TIMF :" << SSBIMF[IZIMF][IAIMF] << "," << fTIMF << std::endl; 8786 std::cout << "DEXP(-IMFARG) = " << std::exp(-IMFARG) << std::endl; 8787 std::cout << "WIDTH1 =" << WIDTH1 << std::endl; 8788 } 8789 } // if ee 8790 8791 SDW[IZIMF] = SDW[IZIMF] + WIDTH_IMF; 8792 8793 DW[IZIMF][IAIMF] = WIDTH_IMF; 8794 8795 } // for INIMF 8796 } // for IZIMF 8797 // End loop to calculate the decay widths ************************ 8798 // *************************************************************** 8799 8800 // Loop to calculate where the gamma of IMF has the minimum ****** 8801 SDWprevious = 1.e20; 8802 IZSTOP = 0; 8803 8804 for (G4int III_ZIMF = 3; III_ZIMF <= IZIMFMAX; III_ZIMF++) 8805 { 8806 8807 if (SDW[III_ZIMF] == 0.0) 8808 { 8809 IZSTOP = III_ZIMF - 1; 8810 goto imfs30; 8811 } 8812 8813 if (SDW[III_ZIMF] > SDWprevious) 8814 { 8815 IZSTOP = III_ZIMF - 1; 8816 goto imfs30; 8817 } 8818 else 8819 { 8820 SDWprevious = SDW[III_ZIMF]; 8821 } 8822 8823 } // for III_ZIMF 8824 8825 imfs30: 8826 8827 if (IZSTOP <= 6) 8828 { 8829 IZSTOP = IZIMFMAX; 8830 goto imfs15; 8831 } 8832 8833 A1PAR = std::log10(SDW[IZSTOP] / SDW[IZSTOP - 2]) / std::log10((1.0 * IZSTOP) / (1.0 * IZSTOP - 2.0)); 8834 A2PAR = std::log10(SDW[IZSTOP]) - A1PAR * std::log10(1.0 * (IZSTOP)); 8835 if (A2PAR > 0.) 8836 A2PAR = -1. * A2PAR; 8837 if (A1PAR > 0.) 8838 A1PAR = -1. * A1PAR; 8839 8840 // End loop to calculate where gamma of IMF has the minimum 8841 8842 for (G4int II_ZIMF = IZSTOP; II_ZIMF <= IZIMFMAX; II_ZIMF++) 8843 { 8844 SDW[II_ZIMF] = std::pow(10.0, A2PAR) * std::pow(1.0 * II_ZIMF, A1PAR); // Power-low 8845 if (SDW[II_ZIMF] < 0.0) 8846 SDW[II_ZIMF] = 0.0; 8847 } 8848 8849 imfs15: 8850 8851 // Sum of all decay widths (for normalisation) 8852 SUMDW_TOT = 0.0; 8853 for (G4int I_ZIMF = 3; I_ZIMF <= IZIMFMAX; I_ZIMF++) 8854 { 8855 SUMDW_TOT = SUMDW_TOT + SDW[I_ZIMF]; 8856 } 8857 if (SUMDW_TOT <= 0.0) 8858 { 8859 std::cout << "*********************" << std::endl; 8860 std::cout << "IMF function" << std::endl; 8861 std::cout << "SUM of decay widths = " << SUMDW_TOT << " IZIMFMAX = " << IZIMFMAX << std::endl; 8862 std::cout << "IZSTOP = " << IZSTOP << std::endl; 8863 } 8864 8865 // End of Sum of all decay widths (for normalisation) 8866 8867 // Loop to sample the nuclide that is emitted ******************** 8868 // ------- sample Z ----------- 8869 imfs10: 8870 X = haz(1) * SUMDW_TOT; 8871 8872 // IF(X.EQ.0.D0) PRINT*,'WARNING: X=0',XRNDM,SUMDW_TOT 8873 SUM_Z = 0.0; 8874 fZIMF = 0.0; 8875 IZMEM = 0; 8876 8877 for (G4int IZ = 3; IZ <= IZIMFMAX; IZ++) 8878 { 8879 SUM_Z = SUM_Z + SDW[IZ]; 8880 if (X < SUM_Z) 8881 { 8882 fZIMF = 1.0 * IZ; 8883 IZMEM = IZ; 8884 goto imfs20; 8885 } 8886 } // for IZ 8887 8888 imfs20: 8889 8890 // ------- sample N ----------- 8891 8892 isostab_lim(IZMEM, &INMINMEM, &INMAXMEM); 8893 INMINMEM = max(1, INMINMEM - 2); 8894 8895 isostab_lim(IZCN - IZMEM, &INMI, 8896 &INMA); // Daughter nucleus after IMF emission, 8897 INMI = max(1, INMI - 2); 8898 // limits of bound isotopes 8899 8900 INMINMEM = max(INMINMEM, INCN - INMA); // Both IMF and daughter must be bound 8901 INMAXMEM = min(INMAXMEM, INCN - INMI); // " 8902 8903 INMAXMEM = max(INMINMEM, INMAXMEM); 8904 8905 IA = 0; 8906 SUMDW_N_TOT = 0.0; 8907 for (G4int IIINIMF = INMINMEM; IIINIMF <= INMAXMEM; IIINIMF++) 8908 { 8909 IA = IZMEM + IIINIMF; 8910 if (IZMEM >= 3 && IZMEM <= 95 && IA >= 4 && IA <= 250) 8911 { 8912 SUMDW_N_TOT = SUMDW_N_TOT + DW[IZMEM][IA]; 8913 } 8914 else 8915 { 8916 std::cout << "CHARGE IMF OUT OF RANGE" << IZMEM << ", " << IA << ", " << idnint(ACN) << ", " << idnint(ZCN) 8917 << ", " << TEMP << std::endl; 8918 } 8919 } 8920 8921 XX = haz(1) * SUMDW_N_TOT; 8922 IIA = 0; 8923 SUM_A = 0.0; 8924 for (G4int IINIMF = INMINMEM; IINIMF <= INMAXMEM; IINIMF++) 8925 { 8926 IIA = IZMEM + IINIMF; 8927 // SUM_A = SUM_A + DW[IZ][IIA]; //FIXME 8928 SUM_A = SUM_A + DW[IZMEM][IIA]; 8929 if (XX < SUM_A) 8930 { 8931 fAIMF = G4double(IIA); 8932 goto imfs25; 8933 } 8934 } 8935 8936 imfs25: 8937 // CHECK POINT 1 8938 NIMF = fAIMF - fZIMF; 8939 8940 if ((ACN - ZCN - NIMF) <= 0.0 || (ZCN - fZIMF) <= 0.0) 8941 { 8942 std::cout << "IMF Partner unstable:" << std::endl; 8943 std::cout << "System: Acn,Zcn,NCN:" << std::endl; 8944 std::cout << idnint(ACN) << ", " << idnint(ZCN) << ", " << idnint(ACN - ZCN) << std::endl; 8945 std::cout << "IMF: A,Z,N:" << std::endl; 8946 std::cout << idnint(fAIMF) << ", " << idnint(fZIMF) << ", " << idnint(fAIMF - fZIMF) << std::endl; 8947 std::cout << "Partner: A,Z,N:" << std::endl; 8948 std::cout << idnint(ACN - fAIMF) << ", " << idnint(ZCN - fZIMF) << ", " << idnint(ACN - ZCN - NIMF) 8949 << std::endl; 8950 std::cout << "----nmin,nmax" << INMINMEM << ", " << INMAXMEM << std::endl; 8951 std::cout << "----- warning: Zimf=" << fZIMF << " Aimf=" << fAIMF << std::endl; 8952 std::cout << "----- look in subroutine IMF" << std::endl; 8953 std::cout << "ACN,ZCN,ZIMF,AIMF,temp,EE,JPRF::" << ACN << ", " << ZCN << ", " << fZIMF << ", " << fAIMF << ", " 8954 << TEMP << ", " << EE << ", " << JPRF << std::endl; 8955 std::cout << "-IZSTOP,IZIMFMAX:" << IZSTOP << ", " << IZIMFMAX << std::endl; 8956 std::cout << "----X,SUM_Z,SUMDW_TOT:" << X << ", " << SUM_Z << ", " << SUMDW_TOT << std::endl; 8957 // for(int III_ZIMF=3;III_ZIMF<=IZIMFMAX;III_ZIMF++) 8958 // std::cout << "-**Z,SDW:" << III_ZIMF << ", " << SDW[III_ZIMF] << 8959 // std::endl; 8960 8961 goto imfs10; 8962 } 8963 if (fZIMF >= ZCN || fAIMF >= ACN || fZIMF <= 2 || fAIMF <= 3) 8964 { 8965 std::cout << "----nmin,nmax" << INMINMEM << ", " << INMAXMEM << std::endl; 8966 std::cout << "----- warning: Zimf=" << fZIMF << " Aimf=" << fAIMF << std::endl; 8967 std::cout << "----- look in subroutine IMF" << std::endl; 8968 std::cout << "ACN,ZCN,ZIMF,AIMF,temp,EE,JPRF:" << ACN << ", " << ZCN << ", " << fZIMF << ", " << fAIMF << ", " 8969 << TEMP << ", " << EE << ", " << JPRF << std::endl; 8970 std::cout << "-IZSTOP,IZIMFMAX:" << IZSTOP << ", " << IZIMFMAX << std::endl; 8971 std::cout << "----X,SUM_Z,SUMDW_TOT:" << X << ", " << SUM_Z << ", " << SUMDW_TOT << std::endl; 8972 for (int III_ZIMF = 3; III_ZIMF <= IZIMFMAX; III_ZIMF++) 8973 std::cout << "-**Z,SDW:" << III_ZIMF << ", " << SDW[III_ZIMF] << std::endl; 8974 8975 fZIMF = 3.0; // provisorisch AK 8976 fAIMF = 4.0; 8977 } 8978 8979 // Characteristics of selected IMF (AIMF, ZIMF, BIMF, SBIMF, TIMF) 8980 fSBIMF = SSBIMF[idnint(fZIMF)][idnint(fAIMF)]; 8981 fBIMF = BBIMF[idnint(fZIMF)][idnint(fAIMF)]; 8982 8983 if ((ZCN - fZIMF) <= 0.0) 8984 std::cout << "CHARGE_IMF ZIMF > ZCN" << std::endl; 8985 if ((ACN - fAIMF) <= 0.0) 8986 std::cout << "CHARGE_IMF AIMF > ACN" << std::endl; 8987 8988 BSHELL = ecld->ecgnz[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)] - 8989 ecld->vgsld[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)]; 8990 8991 DEFBET = ecld->beta2[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)]; 8992 EEDAUG = (EE - fSBIMF) * (ACN - fAIMF) / ACN; 8993 bsbkbc(ACN - fAIMF, ZCN - fZIMF, &BS, &BK, &BC); 8994 densniv(ACN - fAIMF, ZCN - fZIMF, EEDAUG, 0.0, &DENSIMF, BSHELL, BS, BK, &fTIMF, 0, 0, DEFBET, &ECOR, 0.0, 0, &QR); 8995 8996 if (fSBIMF > EE) 8997 { 8998 std::cout << "----- warning: EE=" << EE << "," 8999 << " S+Bimf=" << fSBIMF << std::endl; 9000 std::cout << "----- look in subroutine IMF" << std::endl; 9001 std::cout << "IMF will be resampled" << std::endl; 9002 goto imfs10; 9003 } 9004 (*ZIMF) = fZIMF; 9005 (*AIMF) = fAIMF; 9006 (*SBIMF) = fSBIMF; 9007 (*BIMF) = fBIMF; 9008 (*TIMF) = fTIMF; 9009 return; 9010 } 9011 9012 void G4Abla::isostab_lim(G4int z, G4int* nmin, G4int* nmax) 9013 { 9014 9015 G4int VISOSTAB[191][2] = { 9016 { 0, 7 }, { 1, 8 }, { 1, 9 }, { 2, 12 }, { 2, 14 }, { 2, 16 }, { 3, 18 }, { 4, 22 }, 9017 { 6, 22 }, { 6, 28 }, { 7, 28 }, { 7, 30 }, { 8, 28 }, { 8, 36 }, { 10, 38 }, { 10, 40 }, 9018 { 11, 38 }, { 10, 42 }, { 13, 50 }, { 14, 50 }, { 15, 52 }, { 16, 52 }, { 17, 54 }, { 18, 54 }, 9019 { 19, 60 }, { 19, 62 }, { 21, 64 }, { 20, 66 }, { 23, 66 }, { 24, 70 }, { 25, 70 }, { 26, 74 }, 9020 { 27, 78 }, { 29, 82 }, { 33, 82 }, { 31, 82 }, { 35, 82 }, { 34, 84 }, { 40, 84 }, { 36, 86 }, 9021 { 40, 92 }, { 38, 96 }, { 42, 102 }, { 42, 102 }, { 44, 102 }, { 42, 106 }, { 47, 112 }, { 44, 114 }, 9022 { 49, 116 }, { 46, 118 }, { 52, 120 }, { 52, 124 }, { 55, 126 }, { 54, 126 }, { 57, 126 }, { 57, 126 }, 9023 { 60, 126 }, { 58, 130 }, { 62, 132 }, { 60, 140 }, { 67, 138 }, { 64, 142 }, { 67, 144 }, { 68, 146 }, 9024 { 70, 148 }, { 70, 152 }, { 73, 152 }, { 72, 154 }, { 75, 156 }, { 77, 162 }, { 79, 164 }, { 78, 164 }, 9025 { 82, 166 }, { 80, 166 }, { 85, 168 }, { 83, 176 }, { 87, 178 }, { 88, 178 }, { 91, 182 }, { 90, 184 }, 9026 { 96, 184 }, { 95, 184 }, { 99, 184 }, { 98, 184 }, { 105, 194 }, { 102, 194 }, { 108, 196 }, { 106, 198 }, 9027 { 115, 204 }, { 110, 206 }, { 119, 210 }, { 114, 210 }, { 124, 210 }, { 117, 212 }, { 130, 212 } 9028 }; 9029 9030 if (z < 0) 9031 { 9032 *nmin = 0; 9033 *nmax = 0; 9034 } 9035 else 9036 { 9037 if (z == 0) 9038 { 9039 *nmin = 1; 9040 *nmax = 1; 9041 // AK (Dez2010) - Just to avoid numerical problems 9042 } 9043 else 9044 { 9045 if (z > 95) 9046 { 9047 *nmin = 130; 9048 *nmax = 200; 9049 } 9050 else 9051 { 9052 *nmin = VISOSTAB[z - 1][0]; 9053 *nmax = VISOSTAB[z - 1][1]; 9054 } 9055 } 9056 } 9057 9058 return; 9059 } 9060 9061 void G4Abla::evap_postsaddle(G4double A, 9062 G4double Z, 9063 G4double EXC, 9064 G4double* E_scission_post, 9065 G4double* A_scission, 9066 G4double* Z_scission, 9067 G4double& vx_eva, 9068 G4double& vy_eva, 9069 G4double& vz_eva, 9070 G4int* NbLam0_par) 9071 { 9072 9073 // AK 2006 - Now in case of fission deexcitation between saddle and scission 9074 // is explicitly calculated. Langevin calculations made by P. 9075 // Nadtochy used to parametrise saddle-to-scission time 9076 9077 G4double af, zf, ee; 9078 G4double epsiln = 0.0, probp = 0.0, probd = 0.0, probt = 0.0, probn = 0.0, probhe = 0.0, proba = 0.0, probg = 0.0, 9079 probimf = 0.0, problamb0 = 0.0, ptotl = 0.0, tcn = 0.0; 9080 G4double sn = 0.0, sbp = 0.0, sbd = 0.0, sbt = 0.0, sbhe = 0.0, sba = 0.0, x = 0.0, amoins = 0.0, zmoins = 0.0, 9081 sp = 0.0, sd = 0.0, st = 0.0, she = 0.0, sa = 0.0, slamb0 = 0.0; 9082 G4double ecn = 0.0, ecp = 0.0, ecd = 0.0, ect = 0.0, eche = 0.0, eca = 0.0, ecg = 0.0, eclamb0 = 0.0, bp = 0.0, 9083 bd = 0.0, bt = 0.0, bhe = 0.0, ba = 0.0; 9084 9085 G4double xcv = 0., ycv = 0., zcv = 0., VXOUT = 0., VYOUT = 0., VZOUT = 0.; 9086 9087 G4double jprfn = 0.0, jprfp = 0.0, jprfd = 0.0, jprft = 0.0, jprfhe = 0.0, jprfa = 0.0, jprflamb0 = 0.0; 9088 G4double ctet1 = 0.0, stet1 = 0.0, phi1 = 0.0; 9089 G4double rnd = 0.0; 9090 9091 G4int itest = 0, sortie = 0; 9092 G4double probf = 0.0; 9093 9094 G4double ef = 0.0; 9095 G4double pc = 0.0; 9096 9097 G4double time, tauf, tau0, a0, a1, emin, ts1, tsum = 0.; 9098 G4int inttype = 0, inum = 0, gammadecay = 0, flamb0decay = 0; 9099 G4double pleva = 0.0; 9100 G4double pxeva = 0.0; 9101 G4double pyeva = 0.0; 9102 G4double pteva = 0.0; 9103 G4double etot = 0.0; 9104 G4int NbLam0 = (*NbLam0_par); 9105 9106 const G4double c = 29.9792458; 9107 const G4double mu = 931.494; 9108 const G4double mu2 = 931.494 * 931.494; 9109 9110 vx_eva = 0.; 9111 vy_eva = 0.; 9112 vz_eva = 0.; 9113 IEV_TAB_SSC = 0; 9114 9115 af = dint(A); 9116 zf = dint(Z); 9117 ee = EXC; 9118 9119 fiss->ifis = 0; 9120 opt->optimfallowed = 0; 9121 gammaemission = 0; 9122 // Initialsation 9123 time = 0.0; 9124 9125 // in sec 9126 tau0 = 1.0e-21; 9127 a0 = 0.66482503 - 3.4678935 * std::exp(-0.0104002 * ee); 9128 a1 = 5.6846e-04 + 0.00574515 * std::exp(-0.01114307 * ee); 9129 tauf = (a0 + a1 * zf * zf / std::pow(af, 0.3333333)) * tau0; 9130 // 9131 post10: 9132 direct(zf, 9133 af, 9134 ee, 9135 0., 9136 &probp, 9137 &probd, 9138 &probt, 9139 &probn, 9140 &probhe, 9141 &proba, 9142 &probg, 9143 &probimf, 9144 &probf, 9145 &problamb0, 9146 &ptotl, 9147 &sn, 9148 &sbp, 9149 &sbd, 9150 &sbt, 9151 &sbhe, 9152 &sba, 9153 &slamb0, 9154 &ecn, 9155 &ecp, 9156 &ecd, 9157 &ect, 9158 &eche, 9159 &eca, 9160 &ecg, 9161 &eclamb0, 9162 &bp, 9163 &bd, 9164 &bt, 9165 &bhe, 9166 &ba, 9167 &sp, 9168 &sd, 9169 &st, 9170 &she, 9171 &sa, 9172 &ef, 9173 &ts1, 9174 inttype, 9175 inum, 9176 itest, 9177 &sortie, 9178 &tcn, 9179 &jprfn, 9180 &jprfp, 9181 &jprfd, 9182 &jprft, 9183 &jprfhe, 9184 &jprfa, 9185 &jprflamb0, 9186 &tsum, 9187 NbLam0); //:::FIXME::: Call 9188 // 9189 // HERE THE FINAL STEPS OF THE EVAPORATION ARE CALCULATED 9190 // 9191 if (ptotl <= 0.) 9192 goto post100; 9193 9194 emin = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); 9195 9196 if (emin > 1e30) 9197 std::cout << "ERROR AT THE EXIT OF EVAPORA,E>1.D30,AF" << std::endl; 9198 9199 if (sortie == 1) 9200 { 9201 if (probn != 0.0) 9202 { 9203 amoins = 1.0; 9204 zmoins = 0.0; 9205 epsiln = sn + ecn; 9206 pc = std::sqrt(std::pow((1.0 + ecn / 9.3956e2), 2.) - 1.0) * 9.3956e2; 9207 gammadecay = 0; 9208 flamb0decay = 0; 9209 } 9210 else if (probp != 0.0) 9211 { 9212 amoins = 1.0; 9213 zmoins = 1.0; 9214 epsiln = sp + ecp; 9215 pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2.) - 1.0) * 9.3827e2; 9216 gammadecay = 0; 9217 flamb0decay = 0; 9218 } 9219 else if (probd != 0.0) 9220 { 9221 amoins = 2.0; 9222 zmoins = 1.0; 9223 epsiln = sd + ecd; 9224 pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; 9225 gammadecay = 0; 9226 flamb0decay = 0; 9227 } 9228 else if (probt != 0.0) 9229 { 9230 amoins = 3.0; 9231 zmoins = 1.0; 9232 epsiln = st + ect; 9233 pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; 9234 gammadecay = 0; 9235 flamb0decay = 0; 9236 } 9237 else if (probhe != 0.0) 9238 { 9239 amoins = 3.0; 9240 zmoins = 2.0; 9241 epsiln = she + eche; 9242 pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; 9243 gammadecay = 0; 9244 flamb0decay = 0; 9245 } 9246 else 9247 { 9248 if (proba != 0.0) 9249 { 9250 amoins = 4.0; 9251 zmoins = 2.0; 9252 epsiln = sa + eca; 9253 pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; 9254 gammadecay = 0; 9255 flamb0decay = 0; 9256 } 9257 } 9258 goto post99; 9259 } 9260 9261 // IRNDM = IRNDM+1; 9262 // 9263 // HERE THE NORMAL EVAPORATION CASCADE STARTS 9264 // RANDOM NUMBER FOR THE EVAPORATION 9265 9266 // random number for the evaporation 9267 x = G4AblaRandom::flat() * ptotl; 9268 9269 itest = 0; 9270 if (x < proba) 9271 { 9272 // alpha evaporation 9273 amoins = 4.0; 9274 zmoins = 2.0; 9275 epsiln = sa + eca; 9276 pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; 9277 gammadecay = 0; 9278 flamb0decay = 0; 9279 } 9280 else if (x < proba + probhe) 9281 { 9282 // He3 evaporation 9283 amoins = 3.0; 9284 zmoins = 2.0; 9285 epsiln = she + eche; 9286 pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; 9287 gammadecay = 0; 9288 flamb0decay = 0; 9289 } 9290 else if (x < proba + probhe + probt) 9291 { 9292 // triton evaporation 9293 amoins = 3.0; 9294 zmoins = 1.0; 9295 epsiln = st + ect; 9296 pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; 9297 gammadecay = 0; 9298 flamb0decay = 0; 9299 } 9300 else if (x < proba + probhe + probt + probd) 9301 { 9302 // deuteron evaporation 9303 amoins = 2.0; 9304 zmoins = 1.0; 9305 epsiln = sd + ecd; 9306 pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; 9307 gammadecay = 0; 9308 flamb0decay = 0; 9309 } 9310 else if (x < proba + probhe + probt + probd + probp) 9311 { 9312 // proton evaporation 9313 amoins = 1.0; 9314 zmoins = 1.0; 9315 epsiln = sp + ecp; 9316 pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2) - 1.0) * 9.3827e2; 9317 gammadecay = 0; 9318 flamb0decay = 0; 9319 } 9320 else if (x < proba + probhe + probt + probd + probp + probn) 9321 { 9322 // neutron evaporation 9323 amoins = 1.0; 9324 zmoins = 0.0; 9325 epsiln = sn + ecn; 9326 pc = std::sqrt(std::pow((1.0 + ecn / 9.3956e2), 2.) - 1.0) * 9.3956e2; 9327 gammadecay = 0; 9328 flamb0decay = 0; 9329 } 9330 else if (x < proba + probhe + probt + probd + probp + probn + problamb0) 9331 { 9332 // lambda0 evaporation 9333 amoins = 1.0; 9334 zmoins = 0.0; 9335 epsiln = slamb0 + eclamb0; 9336 pc = std::sqrt(std::pow((1.0 + (eclamb0) / 11.1568e2), 2.) - 1.0) * 11.1568e2; 9337 opt->nblan0 = opt->nblan0 - 1; 9338 NbLam0 = NbLam0 - 1; 9339 gammadecay = 0; 9340 flamb0decay = 1; 9341 } 9342 else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg) 9343 { 9344 // gamma evaporation 9345 amoins = 0.0; 9346 zmoins = 0.0; 9347 epsiln = ecg; 9348 pc = ecg; 9349 gammadecay = 1; 9350 flamb0decay = 0; 9351 if (probp == 0.0 && probn == 0.0 && probd == 0.0 && probt == 0.0 && proba == 0.0 && probhe == 0.0 && 9352 problamb0 == 0.0 && probimf == 0.0 && probf == 0.0) 9353 { 9354 // ee = ee-epsiln; 9355 // if(ee<=0.01) ee = 0.010; 9356 goto post100; 9357 } 9358 } 9359 9360 // CALCULATION OF THE DAUGHTER NUCLEUS 9361 // 9362 post99: 9363 9364 if (gammadecay == 1 && ee <= 0.01 + epsiln) 9365 { 9366 epsiln = ee - 0.01; 9367 time = tauf + 1.; 9368 } 9369 9370 af = af - amoins; 9371 zf = zf - zmoins; 9372 ee = ee - epsiln; 9373 9374 if (ee <= 0.01) 9375 ee = 0.010; 9376 9377 if (af < 2.5) 9378 goto post100; 9379 9380 time = time + ts1; 9381 9382 // Determination of x,y,z components of momentum from known emission momentum 9383 if (flamb0decay == 1) 9384 { 9385 EV_TAB_SSC[IEV_TAB_SSC][0] = 0.; 9386 EV_TAB_SSC[IEV_TAB_SSC][1] = -2.; 9387 EV_TAB_SSC[IEV_TAB_SSC][5] = 1.; 9388 } 9389 else 9390 { 9391 EV_TAB_SSC[IEV_TAB_SSC][0] = zmoins; 9392 EV_TAB_SSC[IEV_TAB_SSC][1] = amoins; 9393 EV_TAB_SSC[IEV_TAB_SSC][5] = 0.; 9394 } 9395 9396 rnd = G4AblaRandom::flat(); 9397 ctet1 = 2.0 * rnd - 1.0; // z component: uniform probability between -1 and 1 9398 stet1 = std::sqrt(1.0 - std::pow(ctet1, 2)); // component perpendicular to z 9399 rnd = G4AblaRandom::flat(); 9400 phi1 = rnd * 2.0 * 3.141592654; // angle in x-y plane: uniform probability between 0 and 2*pi 9401 xcv = stet1 * std::cos(phi1); // x component 9402 ycv = stet1 * std::sin(phi1); // y component 9403 zcv = ctet1; // z component 9404 // In the CM system 9405 if (gammadecay == 0) 9406 { 9407 // Light particle 9408 G4double ETOT_LP = std::sqrt(pc * pc + amoins * amoins * mu2); 9409 if (flamb0decay == 1) 9410 ETOT_LP = std::sqrt(pc * pc + 1115.683 * 1115.683); 9411 EV_TAB_SSC[IEV_TAB_SSC][2] = c * pc * xcv / ETOT_LP; 9412 EV_TAB_SSC[IEV_TAB_SSC][3] = c * pc * ycv / ETOT_LP; 9413 EV_TAB_SSC[IEV_TAB_SSC][4] = c * pc * zcv / ETOT_LP; 9414 } 9415 else 9416 { 9417 // gamma ray 9418 EV_TAB_SSC[IEV_TAB_SSC][2] = pc * xcv; 9419 EV_TAB_SSC[IEV_TAB_SSC][3] = pc * ycv; 9420 EV_TAB_SSC[IEV_TAB_SSC][4] = pc * zcv; 9421 } 9422 lorentz_boost(vx_eva, 9423 vy_eva, 9424 vz_eva, 9425 EV_TAB_SSC[IEV_TAB_SSC][2], 9426 EV_TAB_SSC[IEV_TAB_SSC][3], 9427 EV_TAB_SSC[IEV_TAB_SSC][4], 9428 &VXOUT, 9429 &VYOUT, 9430 &VZOUT); 9431 EV_TAB_SSC[IEV_TAB_SSC][2] = VXOUT; 9432 EV_TAB_SSC[IEV_TAB_SSC][3] = VYOUT; 9433 EV_TAB_SSC[IEV_TAB_SSC][4] = VZOUT; 9434 9435 // Heavy residue 9436 if (gammadecay == 0) 9437 { 9438 G4double v2 = std::pow(EV_TAB_SSC[IEV_TAB_SSC][2], 2.) + std::pow(EV_TAB_SSC[IEV_TAB_SSC][3], 2.) + 9439 std::pow(EV_TAB_SSC[IEV_TAB_SSC][4], 2.); 9440 G4double gamma = 1.0 / std::sqrt(1.0 - v2 / (c * c)); 9441 G4double etot_lp = amoins * mu * gamma; 9442 pxeva = pxeva - EV_TAB_SSC[IEV_TAB_SSC][2] * etot_lp / c; 9443 pyeva = pyeva - EV_TAB_SSC[IEV_TAB_SSC][3] * etot_lp / c; 9444 pleva = pleva - EV_TAB_SSC[IEV_TAB_SSC][4] * etot_lp / c; 9445 } 9446 else 9447 { 9448 // in case of gammas, EV_TEMP contains momentum components and not velocity 9449 pxeva = pxeva - EV_TAB_SSC[IEV_TAB_SSC][2]; 9450 pyeva = pyeva - EV_TAB_SSC[IEV_TAB_SSC][3]; 9451 pleva = pleva - EV_TAB_SSC[IEV_TAB_SSC][4]; 9452 } 9453 pteva = std::sqrt(pxeva * pxeva + pyeva * pyeva); 9454 // To be checked: 9455 etot = std::sqrt(pleva * pleva + pteva * pteva + af * af * mu2); 9456 vx_eva = c * pxeva / etot; // recoil velocity components of residue due to evaporation 9457 vy_eva = c * pyeva / etot; 9458 vz_eva = c * pleva / etot; 9459 9460 IEV_TAB_SSC = IEV_TAB_SSC + 1; 9461 9462 if (time < tauf) 9463 goto post10; 9464 // 9465 post100: 9466 // 9467 *A_scission = af; 9468 *Z_scission = zf; 9469 *E_scission_post = ee; 9470 *NbLam0_par = NbLam0; 9471 return; 9472 } 9473 9474 G4double G4Abla::getdeltabinding(G4double A, G4int H) 9475 { 9476 if (A < 1.) 9477 return (1. * H) / A * (10.68 * A - 21.27 * std::pow(A, 2. / 3.)) * 10.; 9478 return (1. * H) / A * (10.68 * A - 21.27 * std::pow(A, 2. / 3.)); 9479 } 9480 9481 G4double G4Abla::gethyperseparation(G4double A, G4double Z, G4int ny) 9482 { 9483 if (A < 1.) 9484 return 1.e38; 9485 // For light nuclei we take experimental values 9486 // Journal of Physics G, Nucl Part Phys 32,363 (2006) 9487 if (ny == 1) 9488 { 9489 if (Z == 1 && A == 4) 9490 return 2.04; 9491 else if (Z == 2 && A == 4) 9492 return 2.39; 9493 else if (Z == 2 && A == 5) 9494 return 3.12; 9495 else if (Z == 2 && A == 6) 9496 return 4.18; 9497 else if (Z == 2 && A == 7) 9498 return 5.23; 9499 else if (Z == 2 && A == 8) 9500 return 7.16; 9501 else if (Z == 3 && A == 6) 9502 return 4.50; 9503 else if (Z == 3 && A == 7) 9504 return 5.58; 9505 else if (Z == 3 && A == 8) 9506 return 6.80; 9507 else if (Z == 3 && A == 9) 9508 return 8.50; 9509 else if (Z == 4 && A == 7) 9510 return 5.16; 9511 else if (Z == 4 && A == 8) 9512 return 6.84; 9513 else if (Z == 4 && A == 9) 9514 return 6.71; 9515 else if (Z == 4 && A == 10) 9516 return 9.11; 9517 else if (Z == 5 && A == 9) 9518 return 8.29; 9519 else if (Z == 5 && A == 10) 9520 return 9.01; 9521 else if (Z == 5 && A == 11) 9522 return 10.29; 9523 else if (Z == 5 && A == 12) 9524 return 11.43; 9525 else if (Z == 6 && A == 12) 9526 return 10.95; 9527 else if (Z == 6 && A == 13) 9528 return 11.81; 9529 else if (Z == 6 && A == 14) 9530 return 12.50; 9531 else if (Z == 7 && A == 14) 9532 return 12.17; 9533 else if (Z == 7 && A == 15) 9534 return 13.59; 9535 else if (Z == 8 && A == 16) 9536 return 12.50; 9537 else if (Z == 8 && A == 17) 9538 return 13.59; 9539 else if (Z == 14 && A == 28) 9540 return 16.0; 9541 else if (Z == 39 && A == 89) 9542 return 22.1; 9543 else if (Z == 57 && A == 139) 9544 return 23.8; 9545 else if (Z == 82 && A == 208) 9546 return 26.5; 9547 } // ny==1 9548 // For other nuclei we take Bethe-Weizsacker mass formula 9549 return gethyperbinding(A, Z, ny) - gethyperbinding(A - 1., Z, ny - 1); 9550 } 9551 9552 G4double G4Abla::gethyperbinding(G4double A, G4double Z, G4int ny) 9553 { 9554 // 9555 // Bethe-Weizsacker mass formula 9556 // Journal of Physics G, Nucl Part Phys 32,363 (2006) 9557 // 9558 if (A < 2 || Z < 2) 9559 return 0.; 9560 G4double N = A - Z - 1. * ny; 9561 G4double be = 0., my = 1115.683, av = 15.77, as = 18.34, ac = 0.71, asym = 23.21, k = 17., c = 30., D = 0.; 9562 if (mod(N, 2) == 1 && mod(Z, 2) == 1) 9563 D = -12. / std::sqrt(A); 9564 if (mod(N, 2) == 0 && mod(Z, 2) == 0) 9565 D = 12. / std::sqrt(A); 9566 // 9567 G4double deltanew = (1. - std::exp(-1. * A / c)) * D; 9568 // 9569 be = av * A - as * std::pow(A, 2. / 3.) - ac * Z * (Z - 1.) / std::pow(A, 1. / 3.) - 9570 asym * (N - Z) * (N - Z) / ((1. + std::exp(-1. * A / k)) * A) + deltanew + 9571 ny * (0.0335 * my - 26.7 - 48.7 / std::pow(A, 2.0 / 3.0)); 9572 return be; 9573 } 9574 9575 void G4Abla::unbound(G4double SN, 9576 G4double SP, 9577 G4double SD, 9578 G4double ST, 9579 G4double SHE, 9580 G4double SA, 9581 G4double BP, 9582 G4double BD, 9583 G4double BT, 9584 G4double BHE, 9585 G4double BA, 9586 G4double* PROBF, 9587 G4double* PROBN, 9588 G4double* PROBP, 9589 G4double* PROBD, 9590 G4double* PROBT, 9591 G4double* PROBHE, 9592 G4double* PROBA, 9593 G4double* PROBIMF, 9594 G4double* PROBG, 9595 G4double* ECN, 9596 G4double* ECP, 9597 G4double* ECD, 9598 G4double* ECT, 9599 G4double* ECHE, 9600 G4double* ECA) 9601 { 9602 G4double SBP = SP + BP; 9603 G4double SBD = SD + BD; 9604 G4double SBT = ST + BT; 9605 G4double SBHE = SHE + BHE; 9606 G4double SBA = SA + BA; 9607 9608 G4double e = dmin1(SBP, SBD, SBT); 9609 e = dmin1(SBHE, SN, e); 9610 e = dmin1(SBHE, SBA, e); 9611 // 9612 if (SN == e) 9613 { 9614 *ECN = (-1.0) * SN; 9615 *ECP = 0.0; 9616 *ECD = 0.0; 9617 *ECT = 0.0; 9618 *ECHE = 0.0; 9619 *ECA = 0.0; 9620 *PROBN = 1.0; 9621 *PROBP = 0.0; 9622 *PROBD = 0.0; 9623 *PROBT = 0.0; 9624 *PROBHE = 0.0; 9625 *PROBA = 0.0; 9626 *PROBIMF = 0.0; 9627 *PROBF = 0.0; 9628 *PROBG = 0.0; 9629 } 9630 else if (SBP == e) 9631 { 9632 *ECN = 0.0; 9633 *ECP = (-1.0) * SP + BP; 9634 *ECD = 0.0; 9635 *ECT = 0.0; 9636 *ECHE = 0.0; 9637 *ECA = 0.0; 9638 *PROBN = 0.0; 9639 *PROBP = 1.0; 9640 *PROBD = 0.0; 9641 *PROBT = 0.0; 9642 *PROBHE = 0.0; 9643 *PROBA = 0.0; 9644 *PROBIMF = 0.0; 9645 *PROBF = 0.0; 9646 *PROBG = 0.0; 9647 } 9648 else if (SBD == e) 9649 { 9650 *ECN = 0.0; 9651 *ECD = (-1.0) * SD + BD; 9652 *ECP = 0.0; 9653 *ECT = 0.0; 9654 *ECHE = 0.0; 9655 *ECA = 0.0; 9656 *PROBN = 0.0; 9657 *PROBP = 0.0; 9658 *PROBD = 1.0; 9659 *PROBT = 0.0; 9660 *PROBHE = 0.0; 9661 *PROBA = 0.0; 9662 *PROBIMF = 0.0; 9663 *PROBF = 0.0; 9664 *PROBG = 0.0; 9665 } 9666 else if (SBT == e) 9667 { 9668 *ECN = 0.0; 9669 *ECT = (-1.0) * ST + BT; 9670 *ECD = 0.0; 9671 *ECP = 0.0; 9672 *ECHE = 0.0; 9673 *ECA = 0.0; 9674 *PROBN = 0.0; 9675 *PROBP = 0.0; 9676 *PROBD = 0.0; 9677 *PROBT = 1.0; 9678 *PROBHE = 0.0; 9679 *PROBA = 0.0; 9680 *PROBIMF = 0.0; 9681 *PROBF = 0.0; 9682 *PROBG = 0.0; 9683 } 9684 else if (SBHE == e) 9685 { 9686 *ECN = 0.0; 9687 *ECHE = (-1.0) * SHE + BHE; 9688 *ECD = 0.0; 9689 *ECT = 0.0; 9690 *ECP = 0.0; 9691 *ECA = 0.0; 9692 *PROBN = 0.0; 9693 *PROBP = 0.0; 9694 *PROBD = 0.0; 9695 *PROBT = 0.0; 9696 *PROBHE = 1.0; 9697 *PROBA = 0.0; 9698 *PROBIMF = 0.0; 9699 *PROBF = 0.0; 9700 *PROBG = 0.0; 9701 } 9702 else 9703 { 9704 if (SBA == e) 9705 { 9706 *ECN = 0.0; 9707 *ECA = (-1.0) * SA + BA; 9708 *ECD = 0.0; 9709 *ECT = 0.0; 9710 *ECHE = 0.0; 9711 *ECP = 0.0; 9712 *PROBN = 0.0; 9713 *PROBP = 0.0; 9714 *PROBD = 0.0; 9715 *PROBT = 0.0; 9716 *PROBHE = 0.0; 9717 *PROBA = 1.0; 9718 *PROBIMF = 0.0; 9719 *PROBF = 0.0; 9720 *PROBG = 0.0; 9721 } 9722 } 9723 9724 return; 9725 } 9726 9727 void G4Abla::fissionDistri(G4double& A, 9728 G4double& Z, 9729 G4double& E, 9730 G4double& a1, 9731 G4double& z1, 9732 G4double& e1, 9733 G4double& v1, 9734 G4double& a2, 9735 G4double& z2, 9736 G4double& e2, 9737 G4double& v2, 9738 G4double& vx_eva_sc, 9739 G4double& vy_eva_sc, 9740 G4double& vz_eva_sc, 9741 G4int* NbLam0_par) 9742 { 9743 9744 /* 9745 Last update: 9746 9747 21/01/17 - J.L.R.S. - Implementation of this fission model in C++ 9748 9749 9750 Authors: K.-H. Schmidt, A. Kelic, M. V. Ricciardi,J. Benlliure, and 9751 J.L.Rodriguez-Sanchez(1995 - 2017) 9752 9753 On input: A, Z, E (mass, atomic number and exc. energy of compound nucleus 9754 before fission) 9755 On output: Ai, Zi, Ei (mass, atomic number and (absolute) exc. energy of 9756 fragment 1 and 2 after fission) 9757 9758 */ 9759 /* This program calculates isotopic distributions of fission fragments */ 9760 /* with a semiempirical model */ 9761 /* The width and eventually a shift in N/Z (polarization) follows the */ 9762 /* following rules: */ 9763 /* */ 9764 /* The line N/Z following UCD has an angle of atan(Zcn/Ncn) */ 9765 /* to the horizontal axis on a chart of nuclides. */ 9766 /* (For 238U the angle is 32.2 deg.) */ 9767 /* */ 9768 /* The following relations hold: (from Armbruster) 9769 c 9770 c sigma(N) (A=const) = sigma(Z) (A=const) 9771 c sigma(A) (N=const) = sigma(Z) (N=const) 9772 c sigma(A) (Z=const) = sigma(N) (Z=const) 9773 c 9774 c From this we get: 9775 c sigma(Z) (N=const) * N = sigma(N) (Z=const) * Z 9776 c sigma(A) (Z=const) = sigma(Z) (A=const) * A/Z 9777 c sigma(N) (Z=const) = sigma(Z) (A=const) * A/Z 9778 c Z*sigma(N) (Z=const) = N*sigma(Z) (N=const) = A*sigma(Z) (A=const) */ 9779 // 9780 9781 /* Model parameters: 9782 C These parameters have been adjusted to the compound nucleus 238U. 9783 c For the fission of another compound nucleus, it might be 9784 c necessary to slightly adjust some parameter values. 9785 c The most important ones are 9786 C Delta_U1_shell_max and 9787 c Delta_u2_shell. 9788 */ 9789 G4double Nheavy1_in; // 'position of shell for Standard 1' 9790 Nheavy1_in = 83.0; 9791 9792 G4double Zheavy1_in; // 'position of shell for Standard 1' 9793 Zheavy1_in = 50.0; 9794 9795 G4double Nheavy2; // 'position of heavy peak valley 2' 9796 Nheavy2 = 89.0; 9797 9798 G4double Delta_U1_shell_max; // 'Shell effect for valley 1' 9799 Delta_U1_shell_max = -2.45; 9800 9801 G4double U1NZ_SLOPE; // Reduction of shell effect with distance to 132Sn 9802 U1NZ_SLOPE = 0.2; 9803 9804 G4double Delta_U2_shell; // 'Shell effect for valley 2' 9805 Delta_U2_shell = -2.45; 9806 9807 G4double X_s2s; // 'Ratio (C_sad/C_scis) of curvature of potential' 9808 X_s2s = 0.8; 9809 9810 G4double hbom1, hbom2, hbom3; // 'Curvature of potential at saddle' 9811 hbom1 = 0.2; // hbom1 is hbar * omega1 / (2 pi) !!! 9812 hbom2 = 0.2; // hbom2 is hbar * omega2 / (2 pi) !!! 9813 hbom3 = 0.2; // hbom3 is hbar * omega3 / (2 pi) !!! 9814 9815 G4double Fwidth_asymm1, Fwidth_asymm2, Fwidth_symm; 9816 // 'Factors for widths of distr. valley 1 and 2' 9817 Fwidth_asymm1 = 0.65; 9818 Fwidth_asymm2 = 0.65; 9819 Fwidth_symm = 1.16; 9820 9821 G4double xLevdens; // 'Parameter x: a = A/x' 9822 xLevdens = 10.75; 9823 // The value of 1/0.093 = 10.75 is consistent with the 9824 // systematics of the mass widths of Ref. (RuI97). 9825 9826 G4double FGAMMA; // 'Factor to gamma' 9827 FGAMMA = 1.; // Theoretical expectation, not adjusted to data. 9828 // Additional factor to attenuation coefficient of shell effects 9829 // with increasing excitation energy 9830 9831 G4double FGAMMA1; // 'Factor to gamma_heavy1' 9832 FGAMMA1 = 2.; 9833 // Adjusted to reduce the weight of Standard 1 with increasing 9834 // excitation energies, as required by experimental data. 9835 9836 G4double FREDSHELL; 9837 FREDSHELL = 0.; 9838 // Adjusted to the reduced attenuation of shells in the superfluid region. 9839 // If FGAMMA is modified, 9840 // FGAMMA * FREADSHELL should remain constant (0.65) to keep 9841 // the attenuation of the shell effects below the critical 9842 // pairing energy ECRIT unchanged, which has been carefully 9843 // adjusted to the mass yields of Vives and Zoeller in this 9844 // energy range. A high value of FGAMMA leads ot a stronger 9845 // attenuation of shell effects above the superfluid region. 9846 9847 G4double Ecrit; 9848 Ecrit = 5.; 9849 // The value of ECRIT determines the transition from a weak 9850 // decrease of the shell effect below ECRIT to a stronger 9851 // decrease above the superfluid range. 9852 const G4double d = 2.0; // 'Surface distance of scission configuration' 9853 // d = 2.0; 9854 // Charge polarisation from Wagemanns p. 397: 9855 G4double cpol1; // Charge polarisation standard I 9856 cpol1 = 0.35; // calculated internally with shells 9857 G4double cpol2; // Charge polarisation standard II 9858 cpol2 = 0.; // calculated internally from LDM 9859 G4double Friction_factor; 9860 Friction_factor = 1.0; 9861 G4double Nheavy1; // position of valley St 1 in Z and N 9862 G4double Delta_U1, Delta_U2; // used shell effects 9863 G4double cN_asymm1_shell, cN_asymm2_shell; 9864 G4double gamma, gamma_heavy1, gamma_heavy2; // fading of shells 9865 G4double E_saddle_scission; // friction from saddle to scission 9866 G4double Ysymm = 0.; // Yield of symmetric mode 9867 G4double Yasymm1 = 0.; // Yield of asymmetric mode 1 9868 G4double Yasymm2 = 0.; // Yield of asymmetric mode 2 9869 G4double Nheavy1_eff; // Effective position of valley 1 9870 G4double Nheavy2_eff; // Effective position of valley 2 9871 G4double eexc1_saddle; // Excitation energy above saddle 1 9872 G4double eexc2_saddle; // Excitation energy above saddle 2 9873 G4double EEXC_MAX; // Excitation energy above lowest saddle 9874 G4double r_e_o; // Even-odd effect in Z 9875 G4double cN_symm; // Curvature of symmetric valley 9876 G4double CZ; // Curvature of Z distribution for fixed A 9877 G4double Nheavy2_NZ; // Position of Shell 2, combined N and Z 9878 G4double N; 9879 G4double Aheavy1, Aheavy2; 9880 G4double Sasymm1 = 0., Sasymm2 = 0., Ssymm = 0., Ysum = 0., Yasymm = 0.; 9881 G4double Ssymm_mode1, Ssymm_mode2; 9882 G4double wNasymm1_saddle, wNasymm2_saddle, wNsymm_saddle; 9883 G4double wNasymm2_scission, wNsymm_scission; 9884 G4double wNasymm1, wNasymm2, wNsymm; 9885 G4int imode; 9886 G4double rmode; 9887 G4double ZA1width; 9888 G4double N1r, N2r, A1r, N1, N2; 9889 G4double Zsymm, Nsymm; 9890 G4double N1mean, N1width; 9891 G4double dUeff; 9892 /* effective shell effect at lowest barrier */ 9893 G4double Eld; 9894 /* Excitation energy with respect to ld barrier */ 9895 G4double re1, re2, re3; 9896 G4double eps1, eps2; 9897 G4double Z1UCD, Z2UCD; 9898 G4double beta = 0., beta1 = 0., beta2 = 0.; 9899 // double betacomplement; 9900 G4double DN1_POL; 9901 /* shift of most probable neutron number for given Z, 9902 according to polarization */ 9903 G4int i_help; 9904 G4double A_levdens; 9905 /* level-density parameter */ 9906 // double A_levdens_light1,A_levdens_light2; 9907 G4double A_levdens_heavy1, A_levdens_heavy2; 9908 9909 G4double R0 = 1.16; 9910 9911 G4double epsilon_1_saddle, epsilon0_1_saddle; 9912 G4double epsilon_2_saddle, epsilon0_2_saddle, epsilon_symm_saddle; 9913 G4double epsilon_1_scission; //,epsilon0_1_scission; 9914 G4double epsilon_2_scission; //,epsilon0_2_scission; 9915 G4double epsilon_symm_scission; 9916 /* modified energy */ 9917 G4double E_eff1_saddle, E_eff2_saddle; 9918 G4double Epot0_mode1_saddle, Epot0_mode2_saddle, Epot0_symm_saddle; 9919 G4double Epot_mode1_saddle, Epot_mode2_saddle, Epot_symm_saddle; 9920 G4double E_defo, E_defo1, E_defo2, E_scission_pre = 0., E_scission_post; 9921 G4double E_asym; 9922 G4double E1exc = 0., E2exc = 0.; 9923 G4double E1exc_sigma, E2exc_sigma; 9924 G4double TKER; 9925 G4double EkinR1, EkinR2; 9926 G4double MassCurv_scis, MassCurv_sadd; 9927 G4double cN_symm_sadd; 9928 G4double Nheavy1_shell, Nheavy2_shell; 9929 G4double wNasymm1_scission; 9930 G4double Aheavy1_eff, Aheavy2_eff; 9931 G4double Z1rr, Z1r; 9932 G4double E_HELP; 9933 G4double Z_scission, N_scission, A_scission; 9934 G4double Z2_over_A_eff; 9935 G4double beta1gs = 0., beta2gs = 0., betags = 0.; 9936 G4double sigZmin; // 'Minimum neutron width for constant Z' 9937 G4double DSN132, Delta_U1_shell, E_eff0_saddle; //,e_scission; 9938 G4int NbLam0 = (*NbLam0_par); 9939 // 9940 sigZmin = 0.5; 9941 N = A - Z; /* neutron number of the fissioning nucleus */ 9942 // 9943 cN_asymm1_shell = 0.700 * N / Z; 9944 cN_asymm2_shell = 0.040 * N / Z; 9945 9946 //********************************************************************* 9947 9948 DSN132 = Nheavy1_in - N / Z * Zheavy1_in; 9949 Aheavy1 = Nheavy1_in + Zheavy1_in + 0.340 * DSN132; 9950 /* Neutron number of valley Standard 1 */ 9951 /* It is assumed that the 82-neutron shell effect is stronger than 9952 c the 50-proton shell effect. Therefore, the deviation in N/Z of 9953 c the fissioning nucleus from the N/Z of 132Sn will 9954 c change the position of the combined shell in mass. For neutron- 9955 c deficient fissioning nuclei, the mass will increase and vice 9956 c versa. */ 9957 9958 Delta_U1_shell = Delta_U1_shell_max + U1NZ_SLOPE * std::abs(DSN132); 9959 Delta_U1_shell = min(0., Delta_U1_shell); 9960 /* Empirical reduction of shell effect with distance in N/Z of CN to 132Sn */ 9961 /* Fits (239U,n)f and 226Th e.-m.-induced fission */ 9962 9963 Nheavy1 = N / A * Aheavy1; /* UCD */ 9964 Aheavy2 = Nheavy2 * A / N; 9965 9966 Zsymm = Z / 2.0; /* proton number in symmetric fission (centre) */ 9967 Nsymm = N / 2.0; 9968 A_levdens = A / xLevdens; 9969 gamma = A_levdens / (0.40 * std::pow(A, 1.3333)) * FGAMMA; 9970 A_levdens_heavy1 = Aheavy1 / xLevdens; 9971 gamma_heavy1 = A_levdens_heavy1 / (0.40 * std::pow(Aheavy1, 1.3333)) * FGAMMA * FGAMMA1; 9972 A_levdens_heavy2 = Aheavy2 / xLevdens; 9973 gamma_heavy2 = A_levdens_heavy2 / (0.40 * std::pow(Aheavy2, 1.3333)) * FGAMMA; 9974 9975 // Energy dissipated from saddle to scission 9976 // F. Rejmund et al., Nucl. Phys. A 678 (2000) 215, fig. 4 b */ 9977 E_saddle_scission = (-24. + 0.02227 * Z * Z / std::pow(A, 0.33333)) * Friction_factor; 9978 E_saddle_scission = max(0.0, E_saddle_scission); 9979 9980 // Fit to experimental result on curvature of potential at saddle 9981 // Parametrization of T. Enqvist according to Mulgin et al. 1998 9982 // MassCurv taken at scission. */ 9983 9984 Z2_over_A_eff = Z * Z / A; 9985 9986 if (Z2_over_A_eff < 34.0) 9987 MassCurv_scis = std::pow(10., -1.093364 + 0.082933 * Z2_over_A_eff - 0.0002602 * Z2_over_A_eff * Z2_over_A_eff); 9988 else 9989 MassCurv_scis = std::pow(10., 3.053536 - 0.056477 * Z2_over_A_eff + 0.0002454 * Z2_over_A_eff * Z2_over_A_eff); 9990 9991 // to do: 9992 // fix the X with the channel intensities of 226Th (KHS at SEYSSINS,1998) 9993 // replace then (all) cN_symm by cN_symm_saddle (at least for Yields) 9994 MassCurv_sadd = X_s2s * MassCurv_scis; 9995 9996 cN_symm = 8.0 / std::pow(N, 2.) * MassCurv_scis; 9997 cN_symm_sadd = 8.0 / std::pow(N, 2.) * MassCurv_sadd; 9998 9999 Nheavy1_shell = Nheavy1; 10000 10001 if (E < 100.0) 10002 Nheavy1_eff = (cN_symm_sadd * Nsymm + 10003 cN_asymm1_shell * Uwash(E / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) * Nheavy1_shell) / 10004 (cN_symm_sadd + cN_asymm1_shell * Uwash(E / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1)); 10005 else 10006 Nheavy1_eff = (cN_symm_sadd * Nsymm + cN_asymm1_shell * Nheavy1_shell) / (cN_symm_sadd + cN_asymm1_shell); 10007 10008 /* Position of Standard II defined by neutron shell */ 10009 Nheavy2_NZ = Nheavy2; 10010 Nheavy2_shell = Nheavy2_NZ; 10011 if (E < 100.) 10012 Nheavy2_eff = (cN_symm_sadd * Nsymm + 10013 cN_asymm2_shell * Uwash(E / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) * Nheavy2_shell) / 10014 (cN_symm_sadd + cN_asymm2_shell * Uwash(E / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2)); 10015 else 10016 Nheavy2_eff = (cN_symm_sadd * Nsymm + cN_asymm2_shell * Nheavy2_shell) / (cN_symm_sadd + cN_asymm2_shell); 10017 10018 Delta_U1 = Delta_U1_shell + (Nheavy1_shell - Nheavy1_eff) * (Nheavy1_shell - Nheavy1_eff) * 10019 cN_asymm1_shell; /* shell effect in valley of mode 1 */ 10020 Delta_U1 = min(Delta_U1, 0.0); 10021 Delta_U2 = Delta_U2_shell + (Nheavy2_shell - Nheavy2_eff) * (Nheavy2_shell - Nheavy2_eff) * 10022 cN_asymm2_shell; /* shell effect in valley of mode 2 */ 10023 Delta_U2 = min(Delta_U2, 0.0); 10024 10025 // liquid drop energies at the centres of the different shell effects 10026 // with respect to liquid drop at symmetry 10027 Epot0_mode1_saddle = (Nheavy1_eff - Nsymm) * (Nheavy1_eff - Nsymm) * cN_symm_sadd; 10028 Epot0_mode2_saddle = (Nheavy2_eff - Nsymm) * (Nheavy2_eff - Nsymm) * cN_symm_sadd; 10029 Epot0_symm_saddle = 0.0; 10030 10031 // energies including shell effects at the centres of the different 10032 // shell effects with respect to liquid drop at symmetry */ 10033 Epot_mode1_saddle = Epot0_mode1_saddle + Delta_U1; 10034 Epot_mode2_saddle = Epot0_mode2_saddle + Delta_U2; 10035 Epot_symm_saddle = Epot0_symm_saddle; 10036 10037 // minimum of potential with respect to ld potential at symmetry 10038 dUeff = min(Epot_mode1_saddle, Epot_mode2_saddle); 10039 dUeff = min(dUeff, Epot_symm_saddle); 10040 dUeff = dUeff - Epot_symm_saddle; 10041 10042 Eld = E + dUeff; 10043 // E = energy above lowest effective barrier 10044 // Eld = energy above liquid-drop barrier 10045 // Due to this treatment the energy E on input means the excitation 10046 // energy above the lowest saddle. */ 10047 10048 // excitation energies at saddle modes 1 and 2 without shell effect */ 10049 epsilon0_1_saddle = Eld - Epot0_mode1_saddle; 10050 epsilon0_2_saddle = Eld - Epot0_mode2_saddle; 10051 10052 // excitation energies at saddle modes 1 and 2 with shell effect */ 10053 epsilon_1_saddle = Eld - Epot_mode1_saddle; 10054 epsilon_2_saddle = Eld - Epot_mode2_saddle; 10055 10056 epsilon_symm_saddle = Eld - Epot_symm_saddle; 10057 // epsilon_symm_saddle = Eld - dUeff; 10058 10059 eexc1_saddle = epsilon_1_saddle; 10060 eexc2_saddle = epsilon_2_saddle; 10061 10062 // EEXC_MAX is energy above the lowest saddle */ 10063 EEXC_MAX = max(eexc1_saddle, eexc2_saddle); 10064 EEXC_MAX = max(EEXC_MAX, Eld); 10065 10066 // excitation energy at scission */ 10067 epsilon_1_scission = Eld + E_saddle_scission - Epot_mode1_saddle; 10068 epsilon_2_scission = Eld + E_saddle_scission - Epot_mode2_saddle; 10069 10070 // excitation energy of symmetric fragment at scission */ 10071 epsilon_symm_scission = Eld + E_saddle_scission - Epot_symm_saddle; 10072 10073 // calculate widhts at the saddle 10074 E_eff1_saddle = 10075 epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1); 10076 10077 if (E_eff1_saddle < A_levdens * hbom1 * hbom1) 10078 E_eff1_saddle = A_levdens * hbom1 * hbom1; 10079 10080 wNasymm1_saddle = std::sqrt( 10081 0.50 * std::sqrt(1.0 / A_levdens * E_eff1_saddle) / 10082 (cN_asymm1_shell * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) + cN_symm_sadd)); 10083 10084 E_eff2_saddle = 10085 epsilon0_2_saddle - Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2); 10086 10087 if (E_eff2_saddle < A_levdens * hbom2 * hbom2) 10088 E_eff2_saddle = A_levdens * hbom2 * hbom2; 10089 10090 wNasymm2_saddle = std::sqrt( 10091 0.50 * std::sqrt(1.0 / A_levdens * E_eff2_saddle) / 10092 (cN_asymm2_shell * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) + cN_symm_sadd)); 10093 10094 E_eff0_saddle = epsilon_symm_saddle; 10095 if (E_eff0_saddle < A_levdens * hbom3 * hbom3) 10096 E_eff0_saddle = A_levdens * hbom3 * hbom3; 10097 10098 wNsymm_saddle = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * E_eff0_saddle) / cN_symm_sadd); 10099 10100 if (epsilon_symm_scission > 0.0) 10101 { 10102 E_HELP = max(E_saddle_scission, epsilon_symm_scission); 10103 wNsymm_scission = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * (E_HELP)) / cN_symm); 10104 } 10105 else 10106 { 10107 wNsymm_scission = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * E_saddle_scission) / cN_symm); 10108 } 10109 10110 // Calculate widhts at the scission point: 10111 // fits of ref. Beizin 1991 (Plots by Sergei Zhdanov) 10112 10113 if (E_saddle_scission == 0.0) 10114 { 10115 wNasymm1_scission = wNasymm1_saddle; 10116 wNasymm2_scission = wNasymm2_saddle; 10117 } 10118 else 10119 { 10120 if (Nheavy1_eff > 75.0) 10121 { 10122 wNasymm1_scission = std::sqrt(21.0) * N / A; 10123 wNasymm2_scission = max(12.8 - 1.0 * (92.0 - Nheavy2_eff), 1.0) * N / A; 10124 } 10125 else 10126 { 10127 wNasymm1_scission = wNasymm1_saddle; 10128 wNasymm2_scission = wNasymm2_saddle; 10129 } 10130 } 10131 10132 wNasymm1_scission = max(wNasymm1_scission, wNasymm1_saddle); 10133 wNasymm2_scission = max(wNasymm2_scission, wNasymm2_saddle); 10134 10135 wNasymm1 = wNasymm1_scission * Fwidth_asymm1; 10136 wNasymm2 = wNasymm2_scission * Fwidth_asymm2; 10137 wNsymm = wNsymm_scission * Fwidth_symm; 10138 10139 // mass and charge of fragments using UCD, needed for level densities 10140 Aheavy1_eff = Nheavy1_eff * A / N; 10141 Aheavy2_eff = Nheavy2_eff * A / N; 10142 10143 A_levdens_heavy1 = Aheavy1_eff / xLevdens; 10144 A_levdens_heavy2 = Aheavy2_eff / xLevdens; 10145 gamma_heavy1 = A_levdens_heavy1 / (0.40 * std::pow(Aheavy1_eff, 1.3333)) * FGAMMA * FGAMMA1; 10146 gamma_heavy2 = A_levdens_heavy2 / (0.40 * std::pow(Aheavy2_eff, 1.3333)) * FGAMMA; 10147 10148 if (epsilon_symm_saddle < A_levdens * hbom3 * hbom3) 10149 Ssymm = 2.0 * std::sqrt(A_levdens * A_levdens * hbom3 * hbom3) + 10150 (epsilon_symm_saddle - A_levdens * hbom3 * hbom3) / hbom3; 10151 else 10152 Ssymm = 2.0 * std::sqrt(A_levdens * epsilon_symm_saddle); 10153 10154 Ysymm = 1.0; 10155 10156 if (epsilon0_1_saddle < A_levdens * hbom1 * hbom1) 10157 Ssymm_mode1 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom1 * hbom1) + 10158 (epsilon0_1_saddle - A_levdens * hbom1 * hbom1) / hbom1; 10159 else 10160 Ssymm_mode1 = 2.0 * std::sqrt(A_levdens * epsilon0_1_saddle); 10161 10162 if (epsilon0_2_saddle < A_levdens * hbom2 * hbom2) 10163 Ssymm_mode2 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom2 * hbom2) + 10164 (epsilon0_2_saddle - A_levdens * hbom2 * hbom2) / hbom2; 10165 else 10166 Ssymm_mode2 = 2.0 * std::sqrt(A_levdens * epsilon0_2_saddle); 10167 10168 if (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) < 10169 A_levdens * hbom1 * hbom1) 10170 Sasymm1 = 10171 2.0 * std::sqrt(A_levdens * A_levdens * hbom1 * hbom1) + 10172 (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) - 10173 A_levdens * hbom1 * hbom1) / 10174 hbom1; 10175 else 10176 Sasymm1 = 2.0 * std::sqrt(A_levdens * 10177 (epsilon0_1_saddle - 10178 Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1))); 10179 10180 if (epsilon0_2_saddle - Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) < 10181 A_levdens * hbom2 * hbom2) 10182 Sasymm2 = 10183 2.0 * std::sqrt(A_levdens * A_levdens * hbom2 * hbom2) + 10184 (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) - 10185 A_levdens * hbom2 * hbom2) / 10186 hbom2; 10187 else 10188 Sasymm2 = 2.0 * std::sqrt(A_levdens * 10189 (epsilon0_2_saddle - 10190 Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2))); 10191 10192 Yasymm1 = (std::exp(Sasymm1 - Ssymm) - std::exp(Ssymm_mode1 - Ssymm)) * wNasymm1_saddle / wNsymm_saddle * 2.0; 10193 10194 Yasymm2 = (std::exp(Sasymm2 - Ssymm) - std::exp(Ssymm_mode2 - Ssymm)) * wNasymm2_saddle / wNsymm_saddle * 2.0; 10195 10196 Ysum = Ysymm + Yasymm1 + Yasymm2; /* normalize */ 10197 10198 if (Ysum > 0.00) 10199 { 10200 Ysymm = Ysymm / Ysum; 10201 Yasymm1 = Yasymm1 / Ysum; 10202 Yasymm2 = Yasymm2 / Ysum; 10203 Yasymm = Yasymm1 + Yasymm2; 10204 } 10205 else 10206 { 10207 Ysymm = 0.0; 10208 Yasymm1 = 0.0; 10209 Yasymm2 = 0.0; 10210 // search minimum threshold and attribute all events to this mode */ 10211 if ((epsilon_symm_saddle < epsilon_1_saddle) && (epsilon_symm_saddle < epsilon_2_saddle)) 10212 Ysymm = 1.0; 10213 else if (epsilon_1_saddle < epsilon_2_saddle) 10214 Yasymm1 = 1.0; 10215 else 10216 Yasymm2 = 1.0; 10217 } 10218 // even-odd effect 10219 // Parametrization from Rejmund et al. 10220 if (mod(Z, 2.0) == 0) 10221 r_e_o = std::pow(10.0, -0.0170 * (E_saddle_scission + Eld) * (E_saddle_scission + Eld)); 10222 else 10223 r_e_o = 0.0; 10224 10225 /* ------------------------------------------------------- 10226 c selecting the fission mode using the yields at scission 10227 c ------------------------------------------------------- 10228 c random decision: symmetric or asymmetric 10229 c IMODE = 1 means asymmetric fission, mode 1 10230 c IMODE = 2 means asymmetric fission, mode 2 10231 c IMODE = 3 means symmetric fission 10232 c testcase: 238U, E*= 6 MeV : 6467 8781 4752 (20000) 10233 c 127798 176480 95722 (400000) 10234 c 319919 440322 239759 (1000000) 10235 c E*=12 MeV : 153407 293063 553530 (1000000) */ 10236 10237 fiss321: // rmode = DBLE(HAZ(k)) 10238 rmode = G4AblaRandom::flat(); 10239 if (rmode < Yasymm1) 10240 imode = 1; 10241 else if ((rmode > Yasymm1) && (rmode < Yasymm)) 10242 imode = 2; 10243 else 10244 imode = 3; 10245 10246 // determine parameters of the neutron distribution of each mode 10247 // at scission 10248 10249 if (imode == 1) 10250 { 10251 N1mean = Nheavy1_eff; 10252 N1width = wNasymm1; 10253 } 10254 else 10255 { 10256 if (imode == 2) 10257 { 10258 N1mean = Nheavy2_eff; 10259 N1width = wNasymm2; 10260 } 10261 else 10262 { 10263 // if( imode == 3 ) then 10264 N1mean = Nsymm; 10265 N1width = wNsymm; 10266 } 10267 } 10268 10269 // N2mean needed by CZ below 10270 // N2mean = N - N1mean; 10271 10272 // fission mode found, then the determination of the 10273 // neutron numbers N1 and N2 at scission by randon decision 10274 N1r = 1.0; 10275 N2r = 1.0; 10276 while (N1r < 5.0 || N2r < 5.0) 10277 { 10278 // N1r = DBLE(GaussHaz(k,sngl(N1mean), sngl(N1width) )) 10279 // N1r = N1mean+G4AblaRandom::gaus(N1width);// 10280 N1r = gausshaz(0, N1mean, N1width); 10281 N2r = N - N1r; 10282 } 10283 10284 // -------------------------------------------------- 10285 // first approximation of fission fragments using UCD at saddle 10286 // -------------------------------------------------- 10287 Z1UCD = Z / N * N1r; 10288 Z2UCD = Z / N * N2r; 10289 A1r = A / N * N1r; 10290 // 10291 // -------------------------- 10292 // deformations: starting ... 10293 // -------------------------- */ 10294 if (imode == 1) 10295 { 10296 // --- N = 82 */ 10297 E_scission_pre = max(epsilon_1_scission, 1.0); 10298 // ! Eexc at scission, neutron evaporation from saddle to scission not 10299 // considered */ 10300 if (N1mean > N * 0.50) 10301 { 10302 beta1 = 0.0; /* 1. fragment is spherical */ 10303 beta2 = 0.55; /* 2. fragment is deformed 0.5*/ 10304 } 10305 else 10306 { 10307 beta1 = 0.55; /* 1. fragment is deformed 0.5*/ 10308 beta2 = 0.00; /* 2. fragment is spherical */ 10309 } 10310 } 10311 if (imode == 2) 10312 { 10313 // --- N appr. 86 */ 10314 E_scission_pre = max(epsilon_2_scission, 1.0); 10315 if (N1mean > N * 0.50) 10316 { 10317 beta1 = (N1r - 92.0) * 0.030 + 0.60; 10318 10319 beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; 10320 beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; 10321 10322 beta1 = max(beta1, beta1gs); 10323 beta2 = 1.0 - beta1; 10324 beta2 = max(beta2, beta2gs); 10325 } 10326 else 10327 { 10328 10329 beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; 10330 beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; 10331 10332 beta2 = (N2r - 92.0) * 0.030 + 0.60; 10333 beta2 = max(beta2, beta2gs); 10334 beta1 = 1.0 - beta2; 10335 beta1 = max(beta1, beta1gs); 10336 } 10337 } 10338 beta = 0.0; 10339 if (imode == 3) 10340 { 10341 // if( imode >0 ){ 10342 // --- Symmetric fission channel 10343 // the fit function for beta is the deformation for optimum energy 10344 // at the scission point, d = 2 10345 // beta : deformation of symmetric fragments 10346 // beta1 : deformation of first fragment 10347 // beta2 : deformation of second fragment 10348 betags = ecld->beta2[idint(Nsymm)][idint(Zsymm)]; 10349 beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; 10350 beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; 10351 beta = max(0.177963 + 0.0153241 * Zsymm - 1.62037e-4 * Zsymm * Zsymm, betags); 10352 beta1 = max(0.177963 + 0.0153241 * Z1UCD - 1.62037e-4 * Z1UCD * Z1UCD, beta1gs); 10353 beta2 = max(0.177963 + 0.0153241 * Z2UCD - 1.62037e-4 * Z2UCD * Z2UCD, beta2gs); 10354 10355 E_asym = frldm(Z1UCD, N1r, beta1) + frldm(Z2UCD, N2r, beta2) + 10356 ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, 2.0) - 2.0 * frldm(Zsymm, Nsymm, beta) - 10357 ecoul(Zsymm, Nsymm, beta, Zsymm, Nsymm, beta, 2.0); 10358 E_scission_pre = max(epsilon_symm_scission - E_asym, 1.); 10359 } 10360 // ----------------------- 10361 // ... end of deformations 10362 // ----------------------- 10363 10364 // ------------------------------------------ 10365 // evaporation from saddle to scission ... 10366 // ------------------------------------------ 10367 if (E_scission_pre > 5. && NbLam0 < 1) 10368 { 10369 evap_postsaddle( 10370 A, Z, E_scission_pre, &E_scission_post, &A_scission, &Z_scission, vx_eva_sc, vy_eva_sc, vz_eva_sc, &NbLam0); 10371 N_scission = A_scission - Z_scission; 10372 } 10373 else 10374 { 10375 A_scission = A; 10376 Z_scission = Z; 10377 E_scission_post = E_scission_pre; 10378 N_scission = A_scission - Z_scission; 10379 } 10380 // --------------------------------------------------- 10381 // second approximation of fission fragments using UCD 10382 // --------------------------------------------------- */ 10383 // 10384 N1r = N1r * N_scission / N; 10385 N2r = N2r * N_scission / N; 10386 Z1UCD = Z1UCD * Z_scission / Z; 10387 Z2UCD = Z2UCD * Z_scission / Z; 10388 A1r = Z1UCD + N1r; 10389 10390 // --------------------------------------------------------- 10391 // determination of the charge and mass of the fragments ... 10392 // --------------------------------------------------------- 10393 10394 // - CZ is the curvature of charge distribution for fixed mass, 10395 // common to all modes, gives the width of the charge distribution. 10396 // The physics picture behind is that the division of the 10397 // fissioning nucleus in N and Z is slow when mass transport from 10398 // one nascent fragment to the other is concerned but fast when the 10399 // N/Z degree of freedom is concernded. In addition, the potential 10400 // minima in direction of mass transport are broad compared to the 10401 // potential minimum in N/Z direction. 10402 // The minima in direction of mass transport are calculated 10403 // by the liquid-drop (LD) potential (for superlong mode), 10404 // by LD + N=82 shell (for standard 1 mode) and 10405 // by LD + N=86 shell (for standard 2 mode). 10406 // Since the variation of N/Z is fast, it can quickly adjust to 10407 // the potential and is thus determined close to scission. 10408 // Thus, we calculate the mean N/Z and its width for fixed mass 10409 // at scission. 10410 // For the SL mode, the mean N/Z is calculated by the 10411 // minimum of the potential at scission as a function of N/Z for 10412 // fixed mass. 10413 // For the S1 and S2 modes, this correlation is imposed by the 10414 // empirical charge polarisation. 10415 // For the SL mode, the fluctuation in this width is calculated 10416 // from the curvature of the potential at scission as a function 10417 // of N/Z. This value is also used for the widths of S1 and S2. 10418 10419 // Polarisation assumed for standard I and standard II: 10420 // Z - Zucd = cpol (for A = const); 10421 // from this we get (see remarks above) 10422 // Z - Zucd = Acn/Ncn * cpol (for N = const) */ 10423 // 10424 CZ = (frldm(Z1UCD - 1.0, N1r + 1.0, beta1) + frldm(Z2UCD + 1.0, N2r - 1.0, beta2) + 10425 frldm(Z1UCD + 1.0, N1r - 1.0, beta1) + frldm(Z2UCD - 1.0, N2r + 1.0, beta2) + 10426 ecoul(Z1UCD - 1.0, N1r + 1.0, beta1, Z2UCD + 1.0, N2r - 1.0, beta2, 2.0) + 10427 ecoul(Z1UCD + 1.0, N1r - 1.0, beta1, Z2UCD - 1.0, N2r + 1.0, beta2, 2.0) - 10428 2.0 * ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, 2.0) - 2.0 * frldm(Z1UCD, N1r, beta1) - 10429 2.0 * frldm(Z2UCD, N2r, beta2)) * 10430 0.50; 10431 // 10432 if (1.0 / A_levdens * E_scission_post < 0.0) 10433 std::cout << "DSQRT 1 < 0" << A_levdens << " " << E_scission_post << std::endl; 10434 10435 if (0.50 * std::sqrt(1.0 / A_levdens * E_scission_post) / CZ < 0.0) 10436 { 10437 std::cout << "DSQRT 2 < 0 " << CZ << std::endl; 10438 std::cout << "This event was not considered" << std::endl; 10439 goto fiss321; 10440 } 10441 10442 ZA1width = std::sqrt(0.5 * std::sqrt(1.0 / A_levdens * E_scission_post) / CZ); 10443 10444 // Minimum width in N/Z imposed. 10445 // Value of minimum width taken from 235U(nth,f) data 10446 // sigma_Z(A=const) = 0.4 to 0.5 (from Lang paper Nucl Phys. A345 (1980) 10447 // 34) sigma_N(Z=const) = 0.45 * A/Z (= 1.16 for 238U) 10448 // therefore: SIGZMIN = 1.16 10449 // Physics; variation in N/Z for fixed A assumed. 10450 // Thermal energy at scission is reduced by 10451 // pre-scission neutron evaporation" 10452 10453 ZA1width = max(ZA1width, sigZmin); 10454 10455 if (imode == 1 && cpol1 != 0.0) 10456 { 10457 // --- asymmetric fission, mode 1 */ 10458 G4int IS = 0; 10459 fiss2801: 10460 Z1rr = Z1UCD - cpol1 * A_scission / N_scission; 10461 // Z1r = DBLE(GaussHaz(k,sngl(Z1rr), sngl(ZA1width) )); 10462 // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width);// 10463 Z1r = gausshaz(0, Z1rr, ZA1width); 10464 IS = IS + 1; 10465 if (IS > 100) 10466 { 10467 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 10468 "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" 10469 << std::endl; 10470 Z1r = Z1rr; 10471 } 10472 if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || Z1r < 1.0) 10473 goto fiss2801; 10474 N1r = A1r - Z1r; 10475 } 10476 else 10477 { 10478 if (imode == 2 && cpol2 != 0.0) 10479 { 10480 // --- asymmetric fission, mode 2 */ 10481 G4int IS = 0; 10482 fiss2802: 10483 Z1rr = Z1UCD - cpol2 * A_scission / N_scission; 10484 // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width);// 10485 Z1r = gausshaz(0, Z1rr, ZA1width); 10486 IS = IS + 1; 10487 if (IS > 100) 10488 { 10489 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 10490 "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" 10491 << std::endl; 10492 Z1r = Z1rr; 10493 } 10494 if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || Z1r < 1.0) 10495 goto fiss2802; 10496 N1r = A1r - Z1r; 10497 } 10498 else 10499 { 10500 // Otherwise do; /* Imode = 3 in any case; imode = 1 and 2 for CPOL = 10501 // 0 */ 10502 // and symmetric case */ 10503 // We treat a simultaneous split in Z and N to determine 10504 // polarisation */ 10505 10506 re1 = frldm(Z1UCD - 1.0, N1r + 1.0, beta1) + frldm(Z2UCD + 1.0, N2r - 1.0, beta2) + 10507 ecoul(Z1UCD - 1.0, N1r + 1.0, beta1, Z2UCD + 1.0, N2r - 1.0, beta2, d); /* d = 2 fm */ 10508 re2 = frldm(Z1UCD, N1r, beta1) + frldm(Z2UCD, N2r, beta2) + 10509 ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, d); /* d = 2 fm */ 10510 re3 = frldm(Z1UCD + 1.0, N1r - 1.0, beta1) + frldm(Z2UCD - 1.0, N2r + 1.0, beta2) + 10511 ecoul(Z1UCD + 1.0, N1r - 1.0, beta1, Z2UCD - 1.0, N2r + 1.0, beta2, d); /* d = 2 fm */ 10512 eps2 = (re1 - 2.0 * re2 + re3) / 2.0; 10513 eps1 = (re3 - re1) / 2.0; 10514 DN1_POL = -eps1 / (2.0 * eps2); 10515 // 10516 Z1rr = Z1UCD + DN1_POL; 10517 10518 // Polarization of Standard 1 from shell effects around 132Sn 10519 if (imode == 1) 10520 { 10521 if (Z1rr > 50.0) 10522 { 10523 DN1_POL = DN1_POL - 0.6 * Uwash(E_scission_post, Ecrit, FREDSHELL, gamma); 10524 Z1rr = Z1UCD + DN1_POL; 10525 if (Z1rr < 50.) 10526 Z1rr = 50.0; 10527 } 10528 else 10529 { 10530 DN1_POL = DN1_POL + 0.60 * Uwash(E_scission_post, Ecrit, FREDSHELL, gamma); 10531 Z1rr = Z1UCD + DN1_POL; 10532 if (Z1rr > 50.0) 10533 Z1rr = 50.0; 10534 } 10535 } 10536 10537 G4int IS = 0; 10538 fiss2803: 10539 // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width); 10540 Z1r = gausshaz(0, Z1rr, ZA1width); 10541 IS = IS + 1; 10542 if (IS > 100) 10543 { 10544 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 10545 "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" 10546 << std::endl; 10547 Z1r = Z1rr; 10548 } 10549 10550 if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || (Z1r < 1.0)) 10551 goto fiss2803; 10552 N1r = A1r - Z1r; 10553 } 10554 } 10555 10556 // ------------------------------------------ 10557 // Integer proton number with even-odd effect 10558 // ------------------------------------------ 10559 even_odd(Z1r, r_e_o, i_help); 10560 10561 z1 = G4double(i_help); 10562 z2 = dint(Z_scission) - z1; 10563 N1 = dint(N1r); 10564 N2 = dint(N_scission) - N1; 10565 a1 = z1 + N1; 10566 a2 = z2 + N2; 10567 10568 if ((z1 < 0) || (z2 < 0) || (a1 < 0) || (a2 < 0)) 10569 { 10570 std::cout << " -------------------------------" << std::endl; 10571 std::cout << " Z, A, N : " << Z << " " << A << " " << N << std::endl; 10572 std::cout << z1 << " " << z2 << " " << a1 << " " << a2 << std::endl; 10573 std::cout << E_scission_post << " " << A_levdens << " " << CZ << std::endl; 10574 10575 std::cout << " -------------------------------" << std::endl; 10576 } 10577 10578 // ----------------------- 10579 // excitation energies ... 10580 // ----------------------- 10581 // 10582 if (imode == 1) 10583 { 10584 // ---- N = 82 10585 if (N1mean > N * 0.50) 10586 { 10587 // (a) 1. fragment is spherical and 2. fragment is deformed */ 10588 E_defo = 0.0; 10589 beta2gs = ecld->beta2[idint(N2)][idint(z2)]; 10590 if (beta2 < beta2gs) 10591 beta2 = beta2gs; 10592 E1exc = E_scission_pre * a1 / A + E_defo; 10593 E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); 10594 E2exc = E_scission_pre * a2 / A + E_defo; 10595 } 10596 else 10597 { 10598 // (b) 1. fragment is deformed and 2. fragment is spherical */ 10599 beta1gs = ecld->beta2[idint(N1)][idint(z1)]; 10600 if (beta1 < beta1gs) 10601 beta1 = beta1gs; 10602 E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); 10603 E1exc = E_scission_pre * a1 / A + E_defo; 10604 E_defo = 0.0; 10605 E2exc = E_scission_pre * a2 / A + E_defo; 10606 } 10607 } 10608 10609 if (imode == 2) 10610 { 10611 // --- N appr. 86 */ 10612 if (N1mean > N * 0.5) 10613 { 10614 /* 2. fragment is spherical */ 10615 beta1gs = ecld->beta2[idint(N1)][idint(z1)]; 10616 if (beta1 < beta1gs) 10617 beta1 = beta1gs; 10618 E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); 10619 E1exc = E_scission_pre * a1 / A + E_defo; 10620 beta2gs = ecld->beta2[idint(N2)][idint(z2)]; 10621 if (beta2 < beta2gs) 10622 beta2 = beta2gs; 10623 E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); 10624 E2exc = E_scission_pre * a2 / A + E_defo; 10625 } 10626 else 10627 { 10628 /* 1. fragment is spherical */ 10629 beta2gs = ecld->beta2[idint(N2)][idint(z2)]; 10630 if (beta2 < beta2gs) 10631 beta2 = beta2gs; 10632 E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); 10633 E2exc = E_scission_pre * a2 / A + E_defo; 10634 beta1gs = ecld->beta2[idint(N1)][idint(z1)]; 10635 if (beta1 < beta1gs) 10636 beta1 = beta1gs; 10637 E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); 10638 E1exc = E_scission_pre * a1 / A + E_defo; 10639 } 10640 } 10641 10642 if (imode == 3) 10643 { 10644 // --- Symmetric fission channel 10645 beta1gs = ecld->beta2[idint(N1)][idint(z1)]; 10646 if (beta1 < beta1gs) 10647 beta1 = beta1gs; 10648 beta2gs = ecld->beta2[idint(N2)][idint(z2)]; 10649 if (beta2 < beta2gs) 10650 beta2 = beta2gs; 10651 E_defo1 = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); 10652 E_defo2 = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); 10653 E1exc = E_scission_pre * a1 / A + E_defo1; 10654 E2exc = E_scission_pre * a2 / A + E_defo2; 10655 } 10656 10657 // pre-neutron-emission total kinetic energy */ 10658 TKER = (z1 * z2 * 1.440) / (R0 * std::pow(a1, 0.333330) * (1.0 + 2.0 / 3.0 * beta1) + 10659 R0 * std::pow(a2, 0.333330) * (1.0 + 2.0 / 3.0 * beta2) + 2.0); 10660 // Pre-neutron-emission kinetic energies of the fragments */ 10661 EkinR1 = TKER * a2 / A; 10662 EkinR2 = TKER * a1 / A; 10663 v1 = std::sqrt(EkinR1 / a1) * 1.3887; 10664 v2 = std::sqrt(EkinR2 / a2) * 1.3887; 10665 10666 // Extracted from Lang et al. Nucl. Phys. A 345 (1980) 34 */ 10667 E1exc_sigma = 5.50; 10668 E2exc_sigma = 5.50; 10669 10670 fis987: 10671 // e1 = E1exc+G4AblaRandom::gaus(E1exc_sigma);// 10672 e1 = gausshaz(0, E1exc, E1exc_sigma); 10673 if (e1 < 0.) 10674 goto fis987; 10675 fis988: 10676 // e2 = E2exc+G4AblaRandom::gaus(E2exc_sigma);// 10677 e2 = gausshaz(0, E2exc, E2exc_sigma); 10678 if (e2 < 0.) 10679 goto fis988; 10680 10681 (*NbLam0_par) = NbLam0; 10682 return; 10683 } 10684 10685 void G4Abla::even_odd(G4double r_origin, G4double r_even_odd, G4int& i_out) 10686 { 10687 // Procedure to calculate I_OUT from R_IN in a way that 10688 // on the average a flat distribution in R_IN results in a 10689 // fluctuating distribution in I_OUT with an even-odd effect as 10690 // given by R_EVEN_ODD 10691 10692 // /* ------------------------------------------------------------ */ 10693 // /* EXAMPLES : */ 10694 // /* ------------------------------------------------------------ */ 10695 // /* If R_EVEN_ODD = 0 : */ 10696 // /* CEIL(R_IN) ---- */ 10697 // /* */ 10698 // /* R_IN -> */ 10699 // /* (somewhere in between CEIL(R_IN) and FLOOR(R_IN)) */ */ 10700 // /* */ 10701 // /* FLOOR(R_IN) ---- --> I_OUT */ 10702 // /* ------------------------------------------------------------ */ 10703 // /* If R_EVEN_ODD > 0 : */ 10704 // /* The interval for the above treatment is */ 10705 // /* larger for FLOOR(R_IN) = even and */ 10706 // /* smaller for FLOOR(R_IN) = odd */ 10707 // /* For R_EVEN_ODD < 0 : just opposite treatment */ 10708 // /* ------------------------------------------------------------ */ 10709 10710 // /* ------------------------------------------------------------ */ 10711 // /* On input: R_ORIGIN nuclear charge (real number) */ 10712 // /* R_EVEN_ODD requested even-odd effect */ 10713 // /* Intermediate quantity: R_IN = R_ORIGIN + 0.5 */ 10714 // /* On output: I_OUT nuclear charge (integer) */ 10715 // /* ------------------------------------------------------------ */ 10716 10717 // G4double R_ORIGIN,R_IN,R_EVEN_ODD,R_REST,R_HELP; 10718 G4double r_in = 0.0, r_rest = 0.0, r_help = 0.0; 10719 G4double r_floor = 0.0; 10720 G4double r_middle = 0.0; 10721 // G4int I_OUT,N_FLOOR; 10722 G4int n_floor = 0; 10723 10724 r_in = r_origin + 0.5; 10725 r_floor = (G4double)((G4int)(r_in)); 10726 if (r_even_odd < 0.001) 10727 { 10728 i_out = (G4int)(r_floor); 10729 } 10730 else 10731 { 10732 r_rest = r_in - r_floor; 10733 r_middle = r_floor + 0.5; 10734 n_floor = (G4int)(r_floor); 10735 if (n_floor % 2 == 0) 10736 { 10737 // even before modif. 10738 r_help = r_middle + (r_rest - 0.5) * (1.0 - r_even_odd); 10739 } 10740 else 10741 { 10742 // odd before modification 10743 r_help = r_middle + (r_rest - 0.5) * (1.0 + r_even_odd); 10744 } 10745 i_out = (G4int)(r_help); 10746 } 10747 } 10748 10749 double G4Abla::umass(G4double z, G4double n, G4double beta) 10750 { 10751 // liquid-drop mass, Myers & Swiatecki, Lysekil, 1967 10752 // pure liquid drop, without pairing and shell effects 10753 10754 // On input: Z nuclear charge of nucleus 10755 // N number of neutrons in nucleus 10756 // beta deformation of nucleus 10757 // On output: binding energy of nucleus 10758 10759 G4double a = 0.0, fumass = 0.0; 10760 G4double alpha = 0.0; 10761 G4double xcom = 0.0, xvs = 0.0, xe = 0.0; 10762 const G4double pi = 3.1416; 10763 10764 a = n + z; 10765 alpha = (std::sqrt(5.0 / (4.0 * pi))) * beta; 10766 10767 xcom = 1.0 - 1.7826 * ((a - 2.0 * z) / a) * ((a - 2.0 * z) / a); 10768 // factor for asymmetry dependence of surface and volume term 10769 xvs = -xcom * (15.4941 * a - 17.9439 * std::pow(a, 2.0 / 3.0) * (1.0 + 0.4 * alpha * alpha)); 10770 // sum of volume and surface energy 10771 xe = z * z * (0.7053 / (std::pow(a, 1.0 / 3.0)) * (1.0 - 0.2 * alpha * alpha) - 1.1529 / a); 10772 fumass = xvs + xe; 10773 10774 return fumass; 10775 } 10776 10777 double G4Abla::ecoul(G4double z1, G4double n1, G4double beta1, G4double z2, G4double n2, G4double beta2, G4double d) 10778 { 10779 // Coulomb potential between two nuclei 10780 // surfaces are in a distance of d 10781 // in a tip to tip configuration 10782 10783 // approximate formulation 10784 // On input: Z1 nuclear charge of first nucleus 10785 // N1 number of neutrons in first nucleus 10786 // beta1 deformation of first nucleus 10787 // Z2 nuclear charge of second nucleus 10788 // N2 number of neutrons in second nucleus 10789 // beta2 deformation of second nucleus 10790 // d distance of surfaces of the nuclei 10791 10792 // G4double Z1,N1,beta1,Z2,N2,beta2,d,ecoul; 10793 G4double fecoul = 0; 10794 G4double dtot = 0; 10795 const G4double r0 = 1.16; 10796 10797 dtot = r0 * (std::pow((z1 + n1), 1.0 / 3.0) * (1.0 + 0.6666667 * beta1) + 10798 std::pow((z2 + n2), 1.0 / 3.0) * (1.0 + 0.6666667 * beta2)) + 10799 d; 10800 fecoul = z1 * z2 * 1.44 / dtot; 10801 10802 return fecoul; 10803 } 10804 10805 G4double G4Abla::Uwash(G4double E, G4double Ecrit, G4double Freduction, G4double gamma) 10806 { 10807 // E excitation energy 10808 // Ecrit critical pairing energy 10809 // Freduction reduction factor for shell washing in superfluid region 10810 G4double R_wash, uwash; 10811 if (E < Ecrit) 10812 R_wash = std::exp(-E * Freduction * gamma); 10813 else 10814 R_wash = std::exp(-Ecrit * Freduction * gamma - (E - Ecrit) * gamma); 10815 10816 uwash = R_wash; 10817 return uwash; 10818 } 10819 10820 G4double G4Abla::frldm(G4double z, G4double n, G4double beta) 10821 { 10822 10823 // Liquid-drop mass, Myers & Swiatecki, Lysekil, 1967 10824 // pure liquid drop, without pairing and shell effects 10825 // 10826 // On input: Z nuclear charge of nucleus 10827 // N number of neutrons in nucleus 10828 // beta deformation of nucleus 10829 // On output: binding energy of nucleus 10830 // The idea is to use FRLDM model for beta=0 and using Lysekil 10831 // model to get the deformation energy 10832 10833 G4double a; 10834 a = n + z; 10835 return eflmac_profi(a, z) + umass(z, n, beta) - umass(z, n, 0.0); 10836 } 10837 10838 //********************************************************************** 10839 // * 10840 // * this function will calculate the liquid-drop nuclear mass for spheri 10841 // * configuration according to the preprint NUCLEAR GROUND-STATE 10842 // * MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. 10843 // * All constants are taken from this publication for consistency. 10844 // * 10845 // * Parameters: 10846 // * a: nuclear mass number 10847 // * z: nuclear charge 10848 // ********************************************************************** 10849 10850 G4double G4Abla::eflmac_profi(G4double ia, G4double iz) 10851 { 10852 // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS. 10853 // SWITCH FOR PAIRING INCLUDED AS WELL. 10854 // BINDING = EFLMAC(IA,IZ,0,OPTSHP) 10855 // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C 10856 // A.J. 15.07.96 10857 10858 // this function will calculate the liquid-drop nuclear mass for spheri 10859 // configuration according to the preprint NUCLEAR GROUND-STATE 10860 // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. 10861 // All constants are taken from this publication for consistency. 10862 10863 // Parameters: 10864 // a: nuclear mass number 10865 // z: nuclear charge 10866 10867 G4double eflmacResult = 0.0; 10868 10869 G4int in = 0; 10870 G4double z = 0.0, n = 0.0, a = 0.0, av = 0.0, as = 0.0; 10871 G4double a0 = 0.0, c1 = 0.0, c4 = 0.0, b1 = 0.0, b3 = 0.0; 10872 G4double ff = 0.0, ca = 0.0, w = 0.0, efl = 0.0; 10873 G4double r0 = 0.0, kf = 0.0, ks = 0.0; 10874 G4double kv = 0.0, rp = 0.0, ay = 0.0, aden = 0.0, x0 = 0.0, y0 = 0.0; 10875 G4double esq = 0.0, ael = 0.0, i = 0.0; 10876 G4double pi = 3.141592653589793238e0; 10877 10878 // fundamental constants 10879 // electronic charge squared 10880 esq = 1.4399764; 10881 10882 // constants from considerations other than nucl. masses 10883 // electronic binding 10884 ael = 1.433e-5; 10885 10886 // proton rms radius 10887 rp = 0.8; 10888 10889 // nuclear radius constant 10890 r0 = 1.16; 10891 10892 // range of yukawa-plus-expon. potential 10893 ay = 0.68; 10894 10895 // range of yukawa function used to generate 10896 // nuclear charge distribution 10897 aden = 0.70; 10898 10899 // wigner constant 10900 w = 30.0; 10901 10902 // adjusted parameters 10903 // volume energy 10904 av = 16.00126; 10905 10906 // volume asymmetry 10907 kv = 1.92240; 10908 10909 // surface energy 10910 as = 21.18466; 10911 10912 // surface asymmetry 10913 ks = 2.345; 10914 // a^0 constant 10915 a0 = 2.615; 10916 10917 // charge asymmetry 10918 ca = 0.10289; 10919 10920 z = G4double(iz); 10921 a = G4double(ia); 10922 in = ia - iz; 10923 n = G4double(in); 10924 10925 c1 = 3.0 / 5.0 * esq / r0; 10926 c4 = 5.0 / 4.0 * std::pow((3.0 / (2.0 * pi)), (2.0 / 3.0)) * c1; 10927 kf = std::pow((9.0 * pi * z / (4.0 * a)), (1.0 / 3.0)) / r0; 10928 10929 ff = -1.0 / 8.0 * rp * rp * esq / std::pow(r0, 3) * 10930 (145.0 / 48.0 - 327.0 / 2880.0 * std::pow(kf, 2) * std::pow(rp, 2) + 10931 1527.0 / 1209600.0 * std::pow(kf, 4) * std::pow(rp, 4)); 10932 10933 i = (n - z) / a; 10934 10935 x0 = r0 * std::pow(a, (1.0 / 3.0)) / ay; 10936 y0 = r0 * std::pow(a, (1.0 / 3.0)) / aden; 10937 10938 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); 10939 10940 b3 = 1.0 - 5.0 / std::pow(y0, 2) * 10941 (1.0 - 15.0 / (8.0 * y0) + 21.0 / (8.0 * std::pow(y0, 3)) - 10942 3.0 / 4.0 * (1.0 + 9.0 / (2.0 * y0) + 7.0 / std::pow(y0, 2) + 7.0 / (2.0 * std::pow(y0, 3))) * 10943 std::exp(-2.0 * y0)); 10944 10945 // now calculation of total binding energy 10946 10947 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 + 10948 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)) + 10949 ff * std::pow(z, 2) / a - ca * (n - z) - ael * std::pow(z, (2.39e0)); 10950 10951 efl = efl + w * utilabs(i); 10952 10953 eflmacResult = efl; 10954 10955 return eflmacResult; 10956 } 10957 // 10958 // 10959 // 10960 void G4Abla::unstable_nuclei(G4int AFP, 10961 G4int ZFP, 10962 G4int* AFPNEW, 10963 G4int* ZFPNEW, 10964 G4int& IOUNSTABLE, 10965 G4double VX, 10966 G4double VY, 10967 G4double VZ, 10968 G4double* VP1X, 10969 G4double* VP1Y, 10970 G4double* VP1Z, 10971 G4double BU_TAB_TEMP[indexpart][6], 10972 G4int* ILOOP) 10973 { 10974 // 10975 G4int INMIN, INMAX, NDIF = 0, IMEM; 10976 G4int NEVA = 0, PEVA = 0; 10977 G4double VP2X, VP2Y, VP2Z; 10978 10979 *AFPNEW = AFP; 10980 *ZFPNEW = ZFP; 10981 IOUNSTABLE = 0; 10982 *ILOOP = 0; 10983 IMEM = 0; 10984 for (G4int i = 0; i < indexpart; i++) 10985 { 10986 BU_TAB_TEMP[i][0] = 0.0; 10987 BU_TAB_TEMP[i][1] = 0.0; 10988 BU_TAB_TEMP[i][2] = 0.0; 10989 BU_TAB_TEMP[i][3] = 0.0; 10990 BU_TAB_TEMP[i][4] = 0.0; 10991 // BU_TAB_TEMP[i][5] = 0.0; 10992 } 10993 *VP1X = 0.0; 10994 *VP1Y = 0.0; 10995 *VP1Z = 0.0; 10996 10997 if (AFP == 0 && ZFP == 0) 10998 { 10999 // PRINT*,'UNSTABLE NUCLEI, AFP=0, ZFP=0' 11000 return; 11001 } 11002 if ((AFP == 1 && ZFP == 0) || (AFP == 1 && ZFP == 1) || (AFP == 2 && ZFP == 1) || (AFP == 3 && ZFP == 1) || 11003 (AFP == 3 && ZFP == 2) || (AFP == 4 && ZFP == 2) || (AFP == 6 && ZFP == 2) || (AFP == 8 && ZFP == 2)) 11004 { 11005 *VP1X = VX; 11006 *VP1Y = VY; 11007 *VP1Z = VZ; 11008 return; 11009 } 11010 11011 if ((AFP - ZFP) == 0 && ZFP > 1) 11012 { 11013 for (G4int I = 0; I <= AFP - 2; I++) 11014 { 11015 unstable_tke(G4double(AFP - I), 11016 G4double(AFP - I), 11017 G4double(AFP - I - 1), 11018 G4double(AFP - I - 1), 11019 VX, 11020 VY, 11021 VZ, 11022 &(*VP1X), 11023 &(*VP1Y), 11024 &(*VP1Z), 11025 &VP2X, 11026 &VP2Y, 11027 &VP2Z); 11028 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11029 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11030 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11031 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11032 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11033 *ILOOP = *ILOOP + 1; 11034 VX = *VP1X; 11035 VY = *VP1Y; 11036 VZ = *VP1Z; 11037 } 11038 // PEVA = PEVA + ZFP - 1; 11039 AFP = 1; 11040 ZFP = 1; 11041 IOUNSTABLE = 1; 11042 } 11043 // 11044 //*** Find the limits nucleus is bound : 11045 isostab_lim(ZFP, &INMIN, &INMAX); 11046 NDIF = AFP - ZFP; 11047 if (NDIF < INMIN) 11048 { 11049 // Proton unbound 11050 IOUNSTABLE = 1; 11051 for (G4int I = 1; I <= 10; I++) 11052 { 11053 isostab_lim(ZFP - I, &INMIN, &INMAX); 11054 if (INMIN <= NDIF) 11055 { 11056 IMEM = I; 11057 ZFP = ZFP - I; 11058 AFP = ZFP + NDIF; 11059 PEVA = I; 11060 goto u10; 11061 } 11062 } 11063 // 11064 u10: 11065 for (G4int I = 0; I < IMEM; I++) 11066 { 11067 unstable_tke(G4double(NDIF + ZFP + IMEM - I), 11068 G4double(ZFP + IMEM - I), 11069 G4double(NDIF + ZFP + IMEM - I - 1), 11070 G4double(ZFP + IMEM - I - 1), 11071 VX, 11072 VY, 11073 VZ, 11074 &(*VP1X), 11075 &(*VP1Y), 11076 &(*VP1Z), 11077 &VP2X, 11078 &VP2Y, 11079 &VP2Z); 11080 BU_TAB_TEMP[I + 1 + *ILOOP][0] = 1.0; 11081 BU_TAB_TEMP[I + 1 + *ILOOP][1] = 1.0; 11082 BU_TAB_TEMP[I + 1 + *ILOOP][2] = VP2X; 11083 BU_TAB_TEMP[I + 1 + *ILOOP][3] = VP2Y; 11084 BU_TAB_TEMP[I + 1 + *ILOOP][4] = VP2Z; 11085 VX = *VP1X; 11086 VY = *VP1Y; 11087 VZ = *VP1Z; 11088 } 11089 *ILOOP = *ILOOP + IMEM; 11090 } 11091 if (NDIF > INMAX) 11092 { 11093 // Neutron unbound 11094 NEVA = NDIF - INMAX; 11095 AFP = ZFP + INMAX; 11096 IOUNSTABLE = 1; 11097 for (G4int I = 0; I < NEVA; I++) 11098 { 11099 unstable_tke(G4double(ZFP + NDIF - I), 11100 G4double(ZFP), 11101 G4double(ZFP + NDIF - I - 1), 11102 G4double(ZFP), 11103 VX, 11104 VY, 11105 VZ, 11106 &(*VP1X), 11107 &(*VP1Y), 11108 &(*VP1Z), 11109 &VP2X, 11110 &VP2Y, 11111 &VP2Z); 11112 11113 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11114 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11115 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11116 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11117 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11118 *ILOOP = *ILOOP + 1; 11119 VX = *VP1X; 11120 VY = *VP1Y; 11121 VZ = *VP1Z; 11122 } 11123 } 11124 11125 if ((AFP >= 2) && (ZFP == 0)) 11126 { 11127 for (G4int I = 0; I <= AFP - 2; I++) 11128 { 11129 unstable_tke(G4double(AFP - I), 11130 G4double(ZFP), 11131 G4double(AFP - I - 1), 11132 G4double(ZFP), 11133 VX, 11134 VY, 11135 VZ, 11136 &(*VP1X), 11137 &(*VP1Y), 11138 &(*VP1Z), 11139 &VP2X, 11140 &VP2Y, 11141 &VP2Z); 11142 11143 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11144 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11145 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11146 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11147 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11148 *ILOOP = *ILOOP + 1; 11149 VX = *VP1X; 11150 VY = *VP1Y; 11151 VZ = *VP1Z; 11152 } 11153 11154 // NEVA = NEVA + (AFP - 1); 11155 AFP = 1; 11156 ZFP = 0; 11157 IOUNSTABLE = 1; 11158 } 11159 if (AFP < ZFP) 11160 { 11161 std::cout << "WARNING - BU UNSTABLE: AF < ZF" << std::endl; 11162 AFP = 0; 11163 ZFP = 0; 11164 IOUNSTABLE = 1; 11165 } 11166 if ((AFP >= 4) && (ZFP == 1)) 11167 { 11168 // Heavy residue is treated as 3H and the rest of mass is emitted as 11169 // neutrons: 11170 for (G4int I = 0; I < AFP - 3; I++) 11171 { 11172 unstable_tke(G4double(AFP - I), 11173 G4double(ZFP), 11174 G4double(AFP - I - 1), 11175 G4double(ZFP), 11176 VX, 11177 VY, 11178 VZ, 11179 &(*VP1X), 11180 &(*VP1Y), 11181 &(*VP1Z), 11182 &VP2X, 11183 &VP2Y, 11184 &VP2Z); 11185 11186 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11187 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11188 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11189 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11190 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11191 *ILOOP = *ILOOP + 1; 11192 VX = *VP1X; 11193 VY = *VP1Y; 11194 VZ = *VP1Z; 11195 } 11196 11197 // NEVA = NEVA + (AFP - 3); 11198 AFP = 3; 11199 ZFP = 1; 11200 IOUNSTABLE = 1; 11201 } 11202 11203 if ((AFP == 4) && (ZFP == 3)) 11204 { 11205 // 4Li -> 3He + p -> 11206 AFP = 3; 11207 ZFP = 2; 11208 // PEVA = PEVA + 1; 11209 IOUNSTABLE = 1; 11210 unstable_tke(4.0, 3.0, 3.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11211 11212 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11213 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11214 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11215 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11216 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11217 *ILOOP = *ILOOP + 1; 11218 } 11219 if ((AFP == 5) && (ZFP == 2)) 11220 { 11221 // 5He -> 4He + n -> 11222 AFP = 4; 11223 ZFP = 2; 11224 // NEVA = NEVA + 1; 11225 IOUNSTABLE = 1; 11226 unstable_tke(5.0, 2.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11227 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11228 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11229 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11230 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11231 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11232 *ILOOP = *ILOOP + 1; 11233 } 11234 11235 if ((AFP == 5) && (ZFP == 3)) 11236 { 11237 // 5Li -> 4He + p 11238 AFP = 4; 11239 ZFP = 2; 11240 // PEVA = PEVA + 1; 11241 IOUNSTABLE = 1; 11242 unstable_tke(5.0, 3.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11243 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11244 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11245 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11246 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11247 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11248 *ILOOP = *ILOOP + 1; 11249 } 11250 11251 if ((AFP == 6) && (ZFP == 4)) 11252 { 11253 // 6Be -> 4He + 2p (velocity in two steps: 6Be->5Li->4He) 11254 AFP = 4; 11255 ZFP = 2; 11256 // PEVA = PEVA + 2; 11257 IOUNSTABLE = 1; 11258 // 6Be -> 5Li + p 11259 unstable_tke(6.0, 4.0, 5.0, 3.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11260 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11261 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11262 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11263 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11264 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11265 *ILOOP = *ILOOP + 1; 11266 VX = *VP1X; 11267 VY = *VP1Y; 11268 VZ = *VP1Z; 11269 11270 // 5Li -> 4He + p 11271 unstable_tke(5.0, 3.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11272 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11273 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11274 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11275 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11276 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11277 *ILOOP = *ILOOP + 1; 11278 } 11279 if ((AFP == 7) && (ZFP == 2)) 11280 { 11281 // 7He -> 6He + n 11282 AFP = 6; 11283 ZFP = 2; 11284 // NEVA = NEVA + 1; 11285 IOUNSTABLE = 1; 11286 unstable_tke(7.0, 2.0, 6.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11287 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11288 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11289 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11290 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11291 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11292 *ILOOP = *ILOOP + 1; 11293 } 11294 11295 if ((AFP == 7) && (ZFP == 5)) 11296 { 11297 // 7B -> 6Be + p -> 4He + 3p 11298 for (int I = 0; I <= AFP - 5; I++) 11299 { 11300 unstable_tke(double(AFP - I), 11301 double(ZFP - I), 11302 double(AFP - I - 1), 11303 double(ZFP - I - 1), 11304 VX, 11305 VY, 11306 VZ, 11307 &(*VP1X), 11308 &(*VP1Y), 11309 &(*VP1Z), 11310 &VP2X, 11311 &VP2Y, 11312 &VP2Z); 11313 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11314 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11315 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11316 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11317 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11318 *ILOOP = *ILOOP + 1; 11319 VX = *VP1X; 11320 VY = *VP1Y; 11321 VZ = *VP1Z; 11322 } 11323 11324 AFP = 4; 11325 ZFP = 2; 11326 // PEVA = PEVA + 3; 11327 IOUNSTABLE = 1; 11328 } 11329 if ((AFP == 8) && (ZFP == 4)) 11330 { 11331 // 8Be -> 4He + 4He 11332 AFP = 4; 11333 ZFP = 2; 11334 IOUNSTABLE = 1; 11335 unstable_tke(8.0, 4.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11336 BU_TAB_TEMP[*ILOOP][0] = 2.0; 11337 BU_TAB_TEMP[*ILOOP][1] = 4.0; 11338 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11339 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11340 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11341 *ILOOP = *ILOOP + 1; 11342 } 11343 if ((AFP == 8) && (ZFP == 6)) 11344 { 11345 // 8C -> 2p + 6Be 11346 AFP = 6; 11347 ZFP = 4; 11348 // PEVA = PEVA + 2; 11349 IOUNSTABLE = 1; 11350 11351 unstable_tke(8.0, 6.0, 7.0, 5.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11352 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11353 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11354 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11355 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11356 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11357 *ILOOP = *ILOOP + 1; 11358 VX = *VP1X; 11359 VY = *VP1Y; 11360 VZ = *VP1Z; 11361 11362 unstable_tke(7.0, 5.0, 6.0, 4.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11363 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11364 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11365 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11366 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11367 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11368 *ILOOP = *ILOOP + 1; 11369 VX = *VP1X; 11370 VY = *VP1Y; 11371 VZ = *VP1Z; 11372 } 11373 11374 if ((AFP == 9) && (ZFP == 2)) 11375 { 11376 // 9He -> 8He + n 11377 AFP = 8; 11378 ZFP = 2; 11379 // NEVA = NEVA + 1; 11380 IOUNSTABLE = 1; 11381 11382 unstable_tke(9.0, 2.0, 8.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11383 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11384 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11385 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11386 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11387 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11388 *ILOOP = *ILOOP + 1; 11389 VX = *VP1X; 11390 VY = *VP1Y; 11391 VZ = *VP1Z; 11392 } 11393 11394 if ((AFP == 9) && (ZFP == 5)) 11395 { 11396 // 9B -> 4He + 4He + p -> 11397 AFP = 4; 11398 ZFP = 2; 11399 // PEVA = PEVA + 1; 11400 IOUNSTABLE = 1; 11401 unstable_tke(9.0, 5.0, 8.0, 4.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11402 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11403 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11404 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11405 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11406 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11407 *ILOOP = *ILOOP + 1; 11408 VX = *VP1X; 11409 VY = *VP1Y; 11410 VZ = *VP1Z; 11411 11412 unstable_tke(8.0, 4.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11413 BU_TAB_TEMP[*ILOOP][0] = 2.0; 11414 BU_TAB_TEMP[*ILOOP][1] = 4.0; 11415 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11416 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11417 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11418 *ILOOP = *ILOOP + 1; 11419 VX = *VP1X; 11420 VY = *VP1Y; 11421 VZ = *VP1Z; 11422 } 11423 11424 if ((AFP == 10) && (ZFP == 2)) 11425 { 11426 // 10He -> 8He + 2n 11427 AFP = 8; 11428 ZFP = 2; 11429 // NEVA = NEVA + 2; 11430 IOUNSTABLE = 1; 11431 // 10He -> 9He + n 11432 unstable_tke(10.0, 2.0, 9.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11433 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11434 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11435 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11436 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11437 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11438 *ILOOP = *ILOOP + 1; 11439 VX = *VP1X; 11440 VY = *VP1Y; 11441 VZ = *VP1Z; 11442 11443 // 9He -> 8He + n 11444 unstable_tke(9.0, 2.0, 8.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11445 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11446 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11447 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11448 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11449 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11450 *ILOOP = *ILOOP + 1; 11451 VX = *VP1X; 11452 VY = *VP1Y; 11453 VZ = *VP1Z; 11454 } 11455 if ((AFP == 10) && (ZFP == 3)) 11456 { 11457 // 10Li -> 9Li + n -> 11458 AFP = 9; 11459 ZFP = 3; 11460 // NEVA = NEVA + 1; 11461 IOUNSTABLE = 1; 11462 unstable_tke(10.0, 3.0, 9.0, 3.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11463 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11464 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11465 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11466 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11467 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11468 *ILOOP = *ILOOP + 1; 11469 VX = *VP1X; 11470 VY = *VP1Y; 11471 VZ = *VP1Z; 11472 } 11473 if ((AFP == 10) && (ZFP == 7)) 11474 { 11475 // 10N -> 9C + p -> 11476 AFP = 9; 11477 ZFP = 6; 11478 // PEVA = PEVA + 1; 11479 IOUNSTABLE = 1; 11480 unstable_tke(10.0, 7.0, 9.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11481 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11482 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11483 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11484 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11485 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11486 *ILOOP = *ILOOP + 1; 11487 VX = *VP1X; 11488 VY = *VP1Y; 11489 VZ = *VP1Z; 11490 } 11491 11492 if ((AFP == 11) && (ZFP == 7)) 11493 { 11494 // 11N -> 10C + p -> 11495 AFP = 10; 11496 ZFP = 6; 11497 // PEVA = PEVA + 1; 11498 IOUNSTABLE = 1; 11499 unstable_tke(11.0, 7.0, 10.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11500 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11501 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11502 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11503 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11504 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11505 *ILOOP = *ILOOP + 1; 11506 VX = *VP1X; 11507 VY = *VP1Y; 11508 VZ = *VP1Z; 11509 } 11510 if ((AFP == 12) && (ZFP == 8)) 11511 { 11512 // 12O -> 10C + 2p -> 11513 AFP = 10; 11514 ZFP = 6; 11515 // PEVA = PEVA + 2; 11516 IOUNSTABLE = 1; 11517 11518 unstable_tke(12.0, 8.0, 11.0, 7.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11519 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11520 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11521 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11522 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11523 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11524 *ILOOP = *ILOOP + 1; 11525 VX = *VP1X; 11526 VY = *VP1Y; 11527 VZ = *VP1Z; 11528 11529 unstable_tke(11.0, 7.0, 10.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11530 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11531 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11532 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11533 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11534 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11535 *ILOOP = *ILOOP + 1; 11536 VX = *VP1X; 11537 VY = *VP1Y; 11538 VZ = *VP1Z; 11539 } 11540 if ((AFP == 15) && (ZFP == 9)) 11541 { 11542 // 15F -> 14O + p -> 11543 AFP = 14; 11544 ZFP = 8; 11545 // PEVA = PEVA + 1; 11546 IOUNSTABLE = 1; 11547 unstable_tke(15.0, 9.0, 14.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11548 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11549 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11550 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11551 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11552 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11553 *ILOOP = *ILOOP + 1; 11554 VX = *VP1X; 11555 VY = *VP1Y; 11556 VZ = *VP1Z; 11557 } 11558 11559 if ((AFP == 16) && (ZFP == 9)) 11560 { 11561 // 16F -> 15O + p -> 11562 AFP = 15; 11563 ZFP = 8; 11564 // PEVA = PEVA + 1; 11565 IOUNSTABLE = 1; 11566 unstable_tke(16.0, 9.0, 15.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11567 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11568 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11569 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11570 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11571 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11572 *ILOOP = *ILOOP + 1; 11573 VX = *VP1X; 11574 VY = *VP1Y; 11575 VZ = *VP1Z; 11576 } 11577 11578 if ((AFP == 16) && (ZFP == 10)) 11579 { 11580 // 16Ne -> 14O + 2p -> 11581 AFP = 14; 11582 ZFP = 8; 11583 // PEVA = PEVA + 2; 11584 IOUNSTABLE = 1; 11585 unstable_tke(16.0, 10.0, 15.0, 9.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11586 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11587 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11588 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11589 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11590 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11591 *ILOOP = *ILOOP + 1; 11592 VX = *VP1X; 11593 VY = *VP1Y; 11594 VZ = *VP1Z; 11595 11596 unstable_tke(15.0, 9.0, 14.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11597 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11598 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11599 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11600 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11601 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11602 *ILOOP = *ILOOP + 1; 11603 VX = *VP1X; 11604 VY = *VP1Y; 11605 VZ = *VP1Z; 11606 } 11607 if ((AFP == 18) && (ZFP == 11)) 11608 { 11609 // 18Na -> 17Ne + p -> 11610 AFP = 17; 11611 ZFP = 10; 11612 // PEVA = PEVA + 1; 11613 IOUNSTABLE = 1; 11614 unstable_tke(18.0, 11.0, 17.0, 10.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11615 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11616 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11617 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11618 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11619 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11620 *ILOOP = *ILOOP + 1; 11621 VX = *VP1X; 11622 VY = *VP1Y; 11623 VZ = *VP1Z; 11624 } 11625 if ((AFP == 19) && (ZFP == 11)) 11626 { 11627 // 19Na -> 18Ne + p -> 11628 AFP = 18; 11629 ZFP = 10; 11630 // PEVA = PEVA + 1; 11631 IOUNSTABLE = 1; 11632 unstable_tke(19.0, 11.0, 18.0, 10.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); 11633 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11634 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11635 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11636 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11637 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11638 *ILOOP = *ILOOP + 1; 11639 VX = *VP1X; 11640 VY = *VP1Y; 11641 VZ = *VP1Z; 11642 } 11643 if (ZFP >= 4 && (AFP - ZFP) == 1) 11644 { 11645 // Heavy residue is treated as 3He 11646 NEVA = AFP - 3; 11647 PEVA = ZFP - 2; 11648 11649 for (G4int I = 0; I < NEVA; I++) 11650 { 11651 unstable_tke(G4double(AFP - I), 11652 G4double(ZFP), 11653 G4double(AFP - I - 1), 11654 G4double(ZFP), 11655 VX, 11656 VY, 11657 VZ, 11658 &(*VP1X), 11659 &(*VP1Y), 11660 &(*VP1Z), 11661 &VP2X, 11662 &VP2Y, 11663 &VP2Z); 11664 BU_TAB_TEMP[*ILOOP][0] = 0.0; 11665 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11666 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11667 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11668 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11669 *ILOOP = *ILOOP + 1; 11670 VX = *VP1X; 11671 VY = *VP1Y; 11672 VZ = *VP1Z; 11673 } 11674 for (G4int I = 0; I < PEVA; I++) 11675 { 11676 unstable_tke(G4double(AFP - NEVA - I), 11677 G4double(ZFP - I), 11678 G4double(AFP - NEVA - I - 1), 11679 G4double(ZFP - I - 1), 11680 VX, 11681 VY, 11682 VZ, 11683 &(*VP1X), 11684 &(*VP1Y), 11685 &(*VP1Z), 11686 &VP2X, 11687 &VP2Y, 11688 &VP2Z); 11689 BU_TAB_TEMP[*ILOOP][0] = 1.0; 11690 BU_TAB_TEMP[*ILOOP][1] = 1.0; 11691 BU_TAB_TEMP[*ILOOP][2] = VP2X; 11692 BU_TAB_TEMP[*ILOOP][3] = VP2Y; 11693 BU_TAB_TEMP[*ILOOP][4] = VP2Z; 11694 *ILOOP = *ILOOP + 1; 11695 VX = *VP1X; 11696 VY = *VP1Y; 11697 VZ = *VP1Z; 11698 } 11699 11700 AFP = 3; 11701 ZFP = 2; 11702 IOUNSTABLE = 1; 11703 } 11704 // 11705 *AFPNEW = AFP; 11706 *ZFPNEW = ZFP; 11707 return; 11708 } 11709 11710 // 11711 // 11712 void G4Abla::unstable_tke(G4double ain, 11713 G4double zin, 11714 G4double anew, 11715 G4double znew, 11716 G4double vxin, 11717 G4double vyin, 11718 G4double vzin, 11719 G4double* v1x, 11720 G4double* v1y, 11721 G4double* v1z, 11722 G4double* v2x, 11723 G4double* v2y, 11724 G4double* v2z) 11725 { 11726 // 11727 G4double EKIN_P1 = 0., ekin_tot = 0.; 11728 G4double PX1, PX2, PY1, PY2, PZ1, PZ2, PTOT; 11729 G4double RNDT, CTET1, STET1, RNDP, PHI1, ETOT_P1, ETOT_P2; 11730 G4double MASS, MASS1, MASS2; 11731 G4double vxout = 0., vyout = 0., vzout = 0.; 11732 G4int iain, izin, ianew, iznew, inin, innew; 11733 // 11734 G4double C = 29.97924580; // cm/ns 11735 G4double AMU = 931.4940; // MeV/C^2 11736 // 11737 iain = idnint(ain); 11738 izin = idnint(zin); 11739 inin = iain - izin; 11740 ianew = idnint(anew); 11741 iznew = idnint(znew); 11742 innew = ianew - iznew; 11743 // 11744 if (ain == 0) 11745 return; 11746 // 11747 if (izin > 12) 11748 { 11749 mglms(ain, zin, 3, &MASS); 11750 mglms(anew, znew, 3, &MASS1); 11751 mglms(ain - anew, zin - znew, 3, &MASS2); 11752 ekin_tot = MASS - MASS1 - MASS2; 11753 } 11754 else 11755 { 11756 // ekin_tot = 11757 // MEXP(ININ,IZIN)-(MEXP(INNEW,IZNEW)+MEXP(ININ-INNEW,IZIN-IZNEW)); 11758 ekin_tot = 11759 masses->massexp[inin][izin] - (masses->massexp[innew][iznew] + masses->massexp[inin - innew][izin - iznew]); 11760 if (izin > 12) 11761 std::cout << "*** ZIN > 12 ***" << izin << std::endl; 11762 } 11763 11764 if (ekin_tot < 0.00) 11765 { 11766 // if( iain.ne.izin .and. izin.ne.0 ){ 11767 // print *,"Negative Q-value in UNSTABLE_TKE" 11768 // print *,"ekin_tot=",ekin_tot 11769 // print *,"ain,zin=",ain,zin,MEXP(ININ,IZIN) 11770 // print *,"anew,znew=",anew,znew,MEXP(INNEW,IZNEW) 11771 // print * 11772 // } 11773 ekin_tot = 0.0; 11774 } 11775 // 11776 EKIN_P1 = ekin_tot * (ain - anew) / ain; 11777 ETOT_P1 = EKIN_P1 + anew * AMU; 11778 PTOT = anew * AMU * std::sqrt((EKIN_P1 / (anew * AMU) + 1.0) * (EKIN_P1 / (anew * AMU) + 1.0) - 1.0); // MeV/C 11779 // 11780 RNDT = G4AblaRandom::flat(); 11781 CTET1 = 2.0 * RNDT - 1.0; 11782 STET1 = std::sqrt(1.0 - CTET1 * CTET1); 11783 RNDP = G4AblaRandom::flat(); 11784 PHI1 = RNDP * 2.0 * 3.141592654; 11785 PX1 = PTOT * STET1 * std::cos(PHI1); 11786 PY1 = PTOT * STET1 * std::sin(PHI1); 11787 PZ1 = PTOT * CTET1; 11788 *v1x = C * PX1 / ETOT_P1; 11789 *v1y = C * PY1 / ETOT_P1; 11790 *v1z = C * PZ1 / ETOT_P1; 11791 lorentz_boost(vxin, vyin, vzin, *v1x, *v1y, *v1z, &vxout, &vyout, &vzout); 11792 *v1x = vxout; 11793 *v1y = vyout; 11794 *v1z = vzout; 11795 // 11796 PX2 = -PX1; 11797 PY2 = -PY1; 11798 PZ2 = -PZ1; 11799 ETOT_P2 = (ekin_tot - EKIN_P1) + (ain - anew) * AMU; 11800 *v2x = C * PX2 / ETOT_P2; 11801 *v2y = C * PY2 / ETOT_P2; 11802 *v2z = C * PZ2 / ETOT_P2; 11803 lorentz_boost(vxin, vyin, vzin, *v2x, *v2y, *v2z, &vxout, &vyout, &vzout); 11804 *v2x = vxout; 11805 *v2y = vyout; 11806 *v2z = vzout; 11807 // 11808 return; 11809 } 11810 // 11811 //************************************************************************** 11812 // 11813 void G4Abla::lorentz_boost(G4double VXRIN, 11814 G4double VYRIN, 11815 G4double VZRIN, 11816 G4double VXIN, 11817 G4double VYIN, 11818 G4double VZIN, 11819 G4double* VXOUT, 11820 G4double* VYOUT, 11821 G4double* VZOUT) 11822 { 11823 // 11824 // Calculate velocities of a given fragment from frame 1 into frame 2. 11825 // Frame 1 is moving with velocity v=(vxr,vyr,vzr) relative to frame 2. 11826 // Velocity of the fragment in frame 1 -> vxin,vyin,vzin 11827 // Velocity of the fragment in frame 2 -> vxout,vyout,vzout 11828 // 11829 G4double VXR, VYR, VZR; 11830 G4double GAMMA, VR, C, CC, DENO, VXNOM, VYNOM, VZNOM; 11831 // 11832 C = 29.9792458; // cm/ns 11833 CC = C * C; 11834 // 11835 // VXR,VYR,VZR are velocities of frame 1 relative to frame 2; to go from 1 to 11836 // 2 we need to multiply them by -1 11837 VXR = -1.0 * VXRIN; 11838 VYR = -1.0 * VYRIN; 11839 VZR = -1.0 * VZRIN; 11840 // 11841 VR = std::sqrt(VXR * VXR + VYR * VYR + VZR * VZR); 11842 if (VR < 1e-9) 11843 { 11844 *VXOUT = VXIN; 11845 *VYOUT = VYIN; 11846 *VZOUT = VZIN; 11847 return; 11848 } 11849 GAMMA = 1.0 / std::sqrt(1.0 - VR * VR / CC); 11850 DENO = 1.0 - VXR * VXIN / CC - VYR * VYIN / CC - VZR * VZIN / CC; 11851 11852 // X component 11853 VXNOM = -GAMMA * VXR + (1.0 + (GAMMA - 1.0) * VXR * VXR / (VR * VR)) * VXIN + 11854 (GAMMA - 1.0) * VXR * VYR / (VR * VR) * VYIN + (GAMMA - 1.0) * VXR * VZR / (VR * VR) * VZIN; 11855 11856 *VXOUT = VXNOM / (GAMMA * DENO); 11857 11858 // Y component 11859 VYNOM = -GAMMA * VYR + (1.0 + (GAMMA - 1.0) * VYR * VYR / (VR * VR)) * VYIN + 11860 (GAMMA - 1.0) * VXR * VYR / (VR * VR) * VXIN + (GAMMA - 1.0) * VYR * VZR / (VR * VR) * VZIN; 11861 11862 *VYOUT = VYNOM / (GAMMA * DENO); 11863 11864 // Z component 11865 VZNOM = -GAMMA * VZR + (1.0 + (GAMMA - 1.0) * VZR * VZR / (VR * VR)) * VZIN + 11866 (GAMMA - 1.0) * VXR * VZR / (VR * VR) * VXIN + (GAMMA - 1.0) * VYR * VZR / (VR * VR) * VYIN; 11867 11868 *VZOUT = VZNOM / (GAMMA * DENO); 11869 11870 return; 11871 } 11872 11873 void G4Abla::fission(G4double AF, 11874 G4double ZF, 11875 G4double EE, 11876 G4double JPRF, 11877 G4double* VX1_FISSION_par, 11878 G4double* VY1_FISSION_par, 11879 G4double* VZ1_FISSION_par, 11880 G4double* VX2_FISSION_par, 11881 G4double* VY2_FISSION_par, 11882 G4double* VZ2_FISSION_par, 11883 G4int* ZFP1, 11884 G4int* AFP1, 11885 G4int* SFP1, 11886 G4int* ZFP2, 11887 G4int* AFP2, 11888 G4int* SFP2, 11889 G4int* imode_par, 11890 G4double* VX_EVA_SC_par, 11891 G4double* VY_EVA_SC_par, 11892 G4double* VZ_EVA_SC_par, 11893 G4double EV_TEMP[indexpart][6], 11894 G4int* IEV_TAB_FIS_par, 11895 G4int* NbLam0_par) 11896 { 11897 /// 11898 G4double EFF1 = 0., EFF2 = 0., VFF1 = 0., VFF2 = 0., AF1 = 0., ZF1 = 0., AF2 = 0., ZF2 = 0., AFF1 = 0., ZFF1 = 0., 11899 AFF2 = 0., ZFF2 = 0., vz1_eva = 0., vx1_eva = 0., vy1_eva = 0., vz2_eva = 0., vx2_eva = 0., vy2_eva = 0., 11900 vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0., VXOUT = 0., VYOUT = 0., VZOUT = 0., VX2OUT = 0., 11901 VY2OUT = 0., VZ2OUT = 0.; 11902 G4int IEV_TAB_FIS = 0, IEV_TAB_TEMP = 0; 11903 G4double EV_TEMP1[indexpart][6], EV_TEMP2[indexpart][6], mtota = 0.; 11904 G4int inttype = 0, inum = 0; 11905 IEV_TAB_SSC = 0; 11906 (*imode_par) = 0; 11907 G4int NbLam0 = (*NbLam0_par); 11908 11909 for (G4int I1 = 0; I1 < indexpart; I1++) 11910 for (G4int I2 = 0; I2 < 6; I2++) 11911 { 11912 EV_TEMP[I1][I2] = 0.0; 11913 EV_TEMP1[I1][I2] = 0.0; 11914 EV_TEMP2[I1][I2] = 0.0; 11915 } 11916 11917 G4double et = EE - JPRF * JPRF * 197. * 197. / (2. * 0.4 * 931. * std::pow(AF, 5.0 / 3.0) * 1.16 * 1.16); 11918 11919 fissionDistri(AF, ZF, et, AF1, ZF1, EFF1, VFF1, AF2, ZF2, EFF2, VFF2, vx_eva_sc, vy_eva_sc, vz_eva_sc, &NbLam0); 11920 11921 // Lambda particles 11922 G4int NbLam1 = 0; 11923 G4int NbLam2 = 0; 11924 G4double pbH = (AF1 - ZF1) / (AF1 - ZF1 + AF2 - ZF2); 11925 for (G4int i = 0; i < NbLam0; i++) 11926 { 11927 if (G4AblaRandom::flat() < pbH) 11928 { 11929 NbLam1++; 11930 } 11931 else 11932 { 11933 NbLam2++; 11934 } 11935 } 11936 // Copy of the evaporated particles from saddle to scission 11937 for (G4int IJ = 0; IJ < IEV_TAB_SSC; IJ++) 11938 { 11939 EV_TEMP[IJ][0] = EV_TAB_SSC[IJ][0]; 11940 EV_TEMP[IJ][1] = EV_TAB_SSC[IJ][1]; 11941 EV_TEMP[IJ][2] = EV_TAB_SSC[IJ][2]; 11942 EV_TEMP[IJ][3] = EV_TAB_SSC[IJ][3]; 11943 EV_TEMP[IJ][4] = EV_TAB_SSC[IJ][4]; 11944 EV_TEMP[IJ][5] = EV_TAB_SSC[IJ][5]; 11945 } 11946 IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_SSC; 11947 11948 // Velocities 11949 G4double VZ1_FISSION = (2.0 * G4AblaRandom::flat() - 1.0) * VFF1; 11950 G4double VPERP1 = std::sqrt(VFF1 * VFF1 - VZ1_FISSION * VZ1_FISSION); 11951 G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; 11952 G4double VX1_FISSION = VPERP1 * std::sin(ALPHA1); 11953 G4double VY1_FISSION = VPERP1 * std::cos(ALPHA1); 11954 G4double VX2_FISSION = -VX1_FISSION / VFF1 * VFF2; 11955 G4double VY2_FISSION = -VY1_FISSION / VFF1 * VFF2; 11956 G4double VZ2_FISSION = -VZ1_FISSION / VFF1 * VFF2; 11957 // 11958 // Fission fragment 1 11959 if ((ZF1 <= 0.0) || (AF1 <= 0.0) || (AF1 < ZF1)) 11960 { 11961 std::cout << "F1 unphysical: " << ZF << " " << AF << " " << EE << " " << ZF1 << " " << AF1 << std::endl; 11962 } 11963 else 11964 { 11965 // fission and IMF emission are not allowed 11966 opt->optimfallowed = 0; // IMF is not allowed 11967 fiss->ifis = 0; // fission is not allowed 11968 gammaemission = 1; 11969 G4int FF11 = 0, FIMF11 = 0; 11970 G4double ZIMFF1 = 0., AIMFF1 = 0., TKEIMF1 = 0., JPRFOUT = 0.; 11971 // 11972 evapora(ZF1, 11973 AF1, 11974 &EFF1, 11975 0., 11976 &ZFF1, 11977 &AFF1, 11978 &mtota, 11979 &vz1_eva, 11980 &vx1_eva, 11981 &vy1_eva, 11982 &FF11, 11983 &FIMF11, 11984 &ZIMFF1, 11985 &AIMFF1, 11986 &TKEIMF1, 11987 &JPRFOUT, 11988 &inttype, 11989 &inum, 11990 EV_TEMP1, 11991 &IEV_TAB_TEMP, 11992 &NbLam1); 11993 11994 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 11995 { 11996 EV_TEMP[IJ + IEV_TAB_FIS][0] = EV_TEMP1[IJ][0]; 11997 EV_TEMP[IJ + IEV_TAB_FIS][1] = EV_TEMP1[IJ][1]; 11998 // Lorentz kinematics 11999 // EV_TEMP(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 12000 // EV_TEMP(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 12001 // EV_TEMP(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 12002 // Lorentz transformation 12003 lorentz_boost(VX1_FISSION, 12004 VY1_FISSION, 12005 VZ1_FISSION, 12006 EV_TEMP1[IJ][2], 12007 EV_TEMP1[IJ][3], 12008 EV_TEMP1[IJ][4], 12009 &VXOUT, 12010 &VYOUT, 12011 &VZOUT); 12012 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 12013 EV_TEMP[IJ + IEV_TAB_FIS][2] = VX2OUT; 12014 EV_TEMP[IJ + IEV_TAB_FIS][3] = VY2OUT; 12015 EV_TEMP[IJ + IEV_TAB_FIS][4] = VZ2OUT; 12016 // 12017 } 12018 IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_TEMP; 12019 } 12020 // 12021 // Fission fragment 2 12022 if ((ZF2 <= 0.0) || (AF2 <= 0.0) || (AF2 < ZF2)) 12023 { 12024 std::cout << "F2 unphysical: " << ZF << " " << AF << " " << EE << " " << ZF2 << " " << AF2 << std::endl; 12025 } 12026 else 12027 { 12028 // fission and IMF emission are not allowed 12029 opt->optimfallowed = 0; // IMF is not allowed 12030 fiss->ifis = 0; // fission is not allowed 12031 gammaemission = 1; 12032 G4int FF22 = 0, FIMF22 = 0; 12033 G4double ZIMFF2 = 0., AIMFF2 = 0., TKEIMF2 = 0., JPRFOUT = 0.; 12034 // 12035 evapora(ZF2, 12036 AF2, 12037 &EFF2, 12038 0., 12039 &ZFF2, 12040 &AFF2, 12041 &mtota, 12042 &vz2_eva, 12043 &vx2_eva, 12044 &vy2_eva, 12045 &FF22, 12046 &FIMF22, 12047 &ZIMFF2, 12048 &AIMFF2, 12049 &TKEIMF2, 12050 &JPRFOUT, 12051 &inttype, 12052 &inum, 12053 EV_TEMP2, 12054 &IEV_TAB_TEMP, 12055 &NbLam2); 12056 12057 for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) 12058 { 12059 EV_TEMP[IJ + IEV_TAB_FIS][0] = EV_TEMP2[IJ][0]; 12060 EV_TEMP[IJ + IEV_TAB_FIS][1] = EV_TEMP2[IJ][1]; 12061 // Lorentz kinematics 12062 // EV_TEMP(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF 12063 // EV_TEMP(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF 12064 // EV_TEMP(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF 12065 // Lorentz transformation 12066 lorentz_boost(VX2_FISSION, 12067 VY2_FISSION, 12068 VZ2_FISSION, 12069 EV_TEMP2[IJ][2], 12070 EV_TEMP2[IJ][3], 12071 EV_TEMP2[IJ][4], 12072 &VXOUT, 12073 &VYOUT, 12074 &VZOUT); 12075 lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); 12076 EV_TEMP[IJ + IEV_TAB_FIS][2] = VX2OUT; 12077 EV_TEMP[IJ + IEV_TAB_FIS][3] = VY2OUT; 12078 EV_TEMP[IJ + IEV_TAB_FIS][4] = VZ2OUT; 12079 // 12080 } 12081 IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_TEMP; 12082 } 12083 // 12084 // Lorentz kinematics 12085 // vx1_fission = vx1_fission + vx1_eva 12086 // vy1_fission = vy1_fission + vy1_eva 12087 // vz1_fission = vz1_fission + vz1_eva 12088 // vx2_fission = vx2_fission + vx2_eva 12089 // vy2_fission = vy2_fission + vy2_eva 12090 // vz2_fission = vz2_fission + vz2_eva 12091 // The v_eva_sc contribution is considered in the calling subroutine 12092 // Lorentz transformations 12093 lorentz_boost(vx1_eva, vy1_eva, vz1_eva, VX1_FISSION, VY1_FISSION, VZ1_FISSION, &VXOUT, &VYOUT, &VZOUT); 12094 VX1_FISSION = VXOUT; 12095 VY1_FISSION = VYOUT; 12096 VZ1_FISSION = VZOUT; 12097 lorentz_boost(vx2_eva, vy2_eva, vz2_eva, VX2_FISSION, VY2_FISSION, VZ2_FISSION, &VXOUT, &VYOUT, &VZOUT); 12098 VX2_FISSION = VXOUT; 12099 VY2_FISSION = VYOUT; 12100 VZ2_FISSION = VZOUT; 12101 // 12102 (*ZFP1) = idnint(ZFF1); 12103 (*AFP1) = idnint(AFF1); 12104 (*SFP1) = NbLam1; 12105 (*VX1_FISSION_par) = VX1_FISSION; 12106 (*VY1_FISSION_par) = VY1_FISSION; 12107 (*VZ1_FISSION_par) = VZ1_FISSION; 12108 (*VX_EVA_SC_par) = vx_eva_sc; 12109 (*VY_EVA_SC_par) = vy_eva_sc; 12110 (*VZ_EVA_SC_par) = vz_eva_sc; 12111 (*ZFP2) = idnint(ZFF2); 12112 (*AFP2) = idnint(AFF2); 12113 (*SFP2) = NbLam2; 12114 (*VX2_FISSION_par) = VX2_FISSION; 12115 (*VY2_FISSION_par) = VY2_FISSION; 12116 (*VZ2_FISSION_par) = VZ2_FISSION; 12117 (*IEV_TAB_FIS_par) = IEV_TAB_FIS; 12118 (*NbLam0_par) = NbLam1 + NbLam2; 12119 if (NbLam0 > (NbLam1 + NbLam2)) 12120 varntp->kfis = 25; 12121 return; 12122 } 12123 //************************************************************************* 12124 // 12125 void G4Abla::tke_bu(G4double Z, G4double A, G4double ZALL, G4double AAL, G4double* VX, G4double* VY, G4double* VZ) 12126 { 12127 12128 G4double V_over_V0, R0, RALL, RHAZ, R, TKE, Ekin, V, VPERP, ALPHA1; 12129 12130 V_over_V0 = 6.0; 12131 R0 = 1.16; 12132 12133 if (Z < 1.0) 12134 { 12135 *VX = 0.0; 12136 *VY = 0.0; 12137 *VZ = 0.0; 12138 return; 12139 } 12140 12141 RALL = R0 * std::pow(V_over_V0, 1.0 / 3.0) * std::pow(AAL, 1.0 / 3.0); 12142 RHAZ = G4double(haz(1)); 12143 R = std::pow(RHAZ, 1.0 / 3.0) * RALL; 12144 TKE = 1.44 * Z * ZALL * R * R * (1.0 - A / AAL) * (1.0 - A / AAL) / std::pow(RALL, 3.0); 12145 12146 Ekin = TKE * (AAL - A) / AAL; 12147 // print*,'!!!',IDNINT(AAl),IDNINT(A),IDNINT(ZALL),IDNINT(Z) 12148 V = std::sqrt(Ekin / A) * 1.3887; 12149 *VZ = (2.0 * G4double(haz(1)) - 1.0) * V; 12150 VPERP = std::sqrt(V * V - (*VZ) * (*VZ)); 12151 ALPHA1 = G4double(haz(1)) * 2.0 * 3.142; 12152 *VX = VPERP * std::sin(ALPHA1); 12153 *VY = VPERP * std::cos(ALPHA1); 12154 return; 12155 } 12156 12157 G4double G4Abla::haz(G4int k) 12158 { 12159 // const G4int pSize = 110; 12160 // static G4ThreadLocal G4double p[pSize]; 12161 static G4ThreadLocal G4int ix = 0; 12162 static G4ThreadLocal G4double x = 0.0, y = 0.0; 12163 // k =< -1 on initialise 12164 // k = -1 c'est reproductible 12165 // k < -1 || k > -1 ce n'est pas reproductible 12166 /* 12167 // Zero is invalid random seed. Set proper value from our random seed 12168 collection: if(ix == 0) { 12169 // ix = hazard->ial; 12170 } 12171 */ 12172 if (k <= -1) 12173 { // then 12174 if (k == -1) 12175 { // then 12176 ix = 0; 12177 } 12178 else 12179 { 12180 x = 0.0; 12181 y = secnds(G4int(x)); 12182 ix = G4int(y * 100 + 43543000); 12183 if (mod(ix, 2) == 0) 12184 { 12185 ix = ix + 1; 12186 } 12187 } 12188 } 12189 12190 return G4AblaRandom::flat(); 12191 } 12192 12193 // Random generator according to the 12194 // powerfunction y = x**(lambda) in the range from xmin to xmax 12195 // xmin, xmax and y are integers. 12196 // lambda must be different from -1 ! 12197 G4int G4Abla::IPOWERLIMHAZ(G4double lambda, G4int xmin, G4int xmax) 12198 { 12199 G4double y, l_plus, rxmin, rxmax; 12200 l_plus = lambda + 1.; 12201 rxmin = G4double(xmin) - 0.5; 12202 rxmax = G4double(xmax) + 0.5; 12203 // y=(HAZ(k)*(rxmax**l_plus-rxmin**l_plus)+ 12204 // rxmin**l_plus)**(1.E0/l_plus) 12205 y = std::pow(G4AblaRandom::flat() * (std::pow(rxmax, l_plus) - std::pow(rxmin, l_plus)) + std::pow(rxmin, l_plus), 12206 1.0 / l_plus); 12207 return nint(y); 12208 } 12209 12210 void G4Abla::AMOMENT(G4double AABRA, G4double APRF, G4int IMULTIFR, G4double* PX, G4double* PY, G4double* PZ) 12211 { 12212 12213 G4int ISIGOPT = 0; 12214 G4double GOLDHA_BU = 0., GOLDHA = 0.; 12215 G4double PI = 3.141592653589793; 12216 // nu = 1.d0 12217 12218 // G4double BETAP = sqrt(1.0 - 1.0/sqrt(1.0+EAP/931.494)); 12219 // G4double GAMMAP = 1.0 / sqrt(1. - BETAP*BETAP); 12220 // G4double FACT_PROJ = (GAMMAP + 1.) / (BETAP * GAMMAP); 12221 12222 // G4double R = 1.160 * pow(APRF,1.0/3.0); 12223 12224 // G4double RNDT = double(haz(1)); 12225 // G4double CTET = 2.0*RNDT-1.0; 12226 // G4double TETA = acos(CTET); 12227 // G4double RNDP = double(haz(1)); 12228 // G4double PHI = RNDP*2.0*PI; 12229 // G4double STET = sqrt(1.0-CTET*CTET); 12230 // RX = R * STET * DCOS(PHI) 12231 // RY = R * STET * DSIN(PHI) 12232 // RZ = R * CTET 12233 12234 // G4double RZ = 0.0; 12235 // G4double RY = R * sin(PHI); 12236 // G4double RX = R * cos(PHI); 12237 12238 // In MeV/C 12239 G4double V0_over_VBU = 1.0 / 6.0; 12240 G4double SIGMA_0 = 118.50; 12241 G4double Efermi = 5.0 * SIGMA_0 * SIGMA_0 / (2.0 * 931.4940); 12242 12243 if (IMULTIFR == 1) 12244 { 12245 if (ISIGOPT == 0) 12246 { 12247 // "Fermi model" picture: 12248 // Influence of expansion: 12249 SIGMA_0 = SIGMA_0 * std::pow(V0_over_VBU, 1.0 / 3.0); 12250 // To take into account the influence of thermal motion of nucleons (see 12251 // W. Bauer, PRC 51 (1995) 803) 12252 // Efermi = 5.D0 * SIGMA_0 * SIGMA_0 / (2.D0 * 931.49D0) 12253 12254 GOLDHA_BU = SIGMA_0 * std::sqrt((APRF * (AABRA - APRF)) / (AABRA - 1.0)); 12255 GOLDHA = 12256 GOLDHA_BU * std::sqrt(1.0 + 5.0 * PI * PI / 12.0 * (T_freeze_out / Efermi) * (T_freeze_out / Efermi)); 12257 // PRINT*,'AFTER BU fermi:',IDNINT(AABRA),IDNINT(APRF),GOLDHA, 12258 // & GOLDHA_BU 12259 } 12260 else 12261 { 12262 // Thermal equilibrium picture (<=> to Boltzmann distribution in momentum 12263 // with sigma2=M*T) The factor (AABRA-APRF)/AP comes from momentum 12264 // conservation: 12265 GOLDHA_BU = std::sqrt(APRF * T_freeze_out * 931.494 * (AABRA - APRF) / AABRA); 12266 GOLDHA = GOLDHA_BU; 12267 // PRINT*,'AFTER BU therm:',IDNINT(AABRA),IDNINT(APRF),GOLDHA, 12268 // & GOLDHA_BU 12269 } 12270 } 12271 else 12272 { 12273 GOLDHA = SIGMA_0 * std::sqrt((APRF * (AABRA - APRF)) / (AABRA - 1.0)); 12274 } 12275 12276 G4int IS = 0; 12277 mom123: 12278 *PX = G4double(gausshaz(1, 0.0, GOLDHA)); 12279 IS = IS + 1; 12280 if (IS > 100) 12281 { 12282 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 12283 "CALCULATING PX IN Rn07.FOR. A VALUE WILL BE FORCED." 12284 << std::endl; 12285 *PX = (AABRA - 1.0) * 931.4940; 12286 } 12287 if (std::abs(*PX) >= AABRA * 931.494) 12288 { 12289 // PRINT*,'VX > C',PX,IDNINT(APRF) 12290 goto mom123; 12291 } 12292 IS = 0; 12293 mom456: 12294 *PY = G4double(gausshaz(1, 0.0, GOLDHA)); 12295 IS = IS + 1; 12296 if (IS > 100) 12297 { 12298 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 12299 "CALCULATING PY IN Rn07.FOR. A VALUE WILL BE FORCED." 12300 << std::endl; 12301 *PY = (AABRA - 1.0) * 931.4940; 12302 } 12303 if (std::abs(*PY) >= AABRA * 931.494) 12304 { 12305 // PRINT*,'VX > C',PX,IDNINT(APRF) 12306 goto mom456; 12307 } 12308 IS = 0; 12309 mom789: 12310 *PZ = G4double(gausshaz(1, 0.0, GOLDHA)); 12311 IS = IS + 1; 12312 if (IS > 100) 12313 { 12314 std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " 12315 "CALCULATING PZ IN Rn07.FOR. A VALUE WILL BE FORCED." 12316 << std::endl; 12317 *PZ = (AABRA - 1.0) * 931.4940; 12318 } 12319 if (std::abs(*PZ) >= AABRA * 931.494) 12320 { 12321 // PRINT*,'VX > C',PX,IDNINT(APRF) 12322 goto mom789; 12323 } 12324 return; 12325 } 12326 12327 G4double G4Abla::gausshaz(G4int k, G4double xmoy, G4double sig) 12328 { 12329 // Gaussian random numbers: 12330 12331 // 1005 C*** TIRAGE ALEATOIRE DANS UNE GAUSSIENNE DE LARGEUR SIG ET 12332 // MOYENNE XMOY 12333 static G4ThreadLocal G4int iset = 0; 12334 static G4ThreadLocal G4double v1, v2, r, fac, gset, fgausshaz; 12335 12336 if (iset == 0) 12337 { // then 12338 do 12339 { 12340 v1 = 2.0 * haz(k) - 1.0; 12341 v2 = 2.0 * haz(k) - 1.0; 12342 r = std::pow(v1, 2) + std::pow(v2, 2); 12343 } while (r >= 1); 12344 12345 fac = std::sqrt(-2. * std::log(r) / r); 12346 gset = v1 * fac; 12347 fgausshaz = v2 * fac * sig + xmoy; 12348 iset = 1; 12349 } 12350 else 12351 { 12352 fgausshaz = gset * sig + xmoy; 12353 iset = 0; 12354 } 12355 return fgausshaz; 12356 } 12357