// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // ABLAXX statistical de-excitation model // Jose Luis Rodriguez, UDC (translation from ABLA07 and contact person) // Pekka Kaitaniemi, HIP (initial translation of ablav3p) // Aleksandra Kelic, GSI (ABLA07 code) // Davide Mancusi, CEA (contact person INCL) // Aatos Heikkinen, HIP (project coordination) // #include "globals.hh" #include #include #include #include "G4Abla.hh" #include "G4AblaDataDefs.hh" #include "G4AblaDataFile.hh" #include "G4AblaRandom.hh" G4Abla::G4Abla(G4VarNtp* aVarntp) { verboseLevel = 0; ilast = 0; varntp = static_cast(aVarntp); // Output data structure verboseLevel = 0; gammaemission = 0; // 0 presaddle, 1 postsaddle T_freeze_out = 0.; Ainit = 0; Zinit = 0; Sinit = 0; ald = std::make_unique(); ec2sub = std::make_unique(); ecld = std::make_unique(); masses = std::make_unique(); fb = std::make_unique(); fiss = std::make_unique(); opt = std::make_unique(); } void G4Abla::setVerboseLevel(G4int level) { verboseLevel = level; } // Main interface to the evaporation without lambda evaporation void G4Abla::DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ, G4double excitationEnergy, G4double angularMomentum, G4double momX, G4double momY, G4double momZ, G4int eventnumber) { DeexcitationAblaxx(nucleusA, nucleusZ, excitationEnergy, angularMomentum, momX, momY, momZ, eventnumber, 0); } // Main interface to the evaporation with lambda emission void G4Abla::DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ, G4double excitationEnergy, G4double angularMomentum, G4double momX, G4double momY, G4double momZ, G4int eventnumber, G4int nucleusS) { const G4double amu = 931.4940; // MeV/C^2 const G4double C = 29.9792458; // cm/ns SetParametersG4(nucleusZ, nucleusA); mult10: G4int IS = 0; varntp->clear(); // Clean up an initialize ABLA output. if (nucleusS > 0) nucleusS = 0; // S=1 from INCL ???? G4int NbLam0 = std::abs(nucleusS); Ainit = -1 * nucleusA; Zinit = -1 * nucleusZ; Sinit = -1 * nucleusS; G4double aff = 0.0; G4double zff = 0.0; G4int ZFP1 = 0, AFP1 = 0, AFPIMF = 0, ZFPIMF = 0, ZFP2 = 0, AFP2 = 0, SFP1 = 0, SFP2 = 0, SFPIMF = 0; G4double vx_eva = 0.0, vy_eva = 0.0, vz_eva = 0.0; G4double VX_PREF = 0., VY_PREF = 0., VZ_PREF = 00, VP1X, VP1Y, VP1Z, VXOUT, VYOUT, VZOUT, V_CM[3], VFP1_CM[3], VFP2_CM[3], VIMF_CM[3], VX2OUT, VY2OUT, VZ2OUT; G4double zf = 0.0, af = 0.0, mtota = 0.0, tkeimf = 0.0, jprf0 = 0.; G4int ff = 0, afpnew = 0, zfpnew = 0, aprfp = 0, zprfp = 0, IOUNSTABLE = 0, ILOOP = 0, IEV_TAB = 0, IEV_TAB_TEMP = 0; G4int fimf = 0, INMIN = 0, INMAX = 0; G4int ftype = 0; //,ftype1=0; G4int inum = eventnumber; G4int inttype = 0; opt->optimfallowed = 1; if (fiss->zt > 56) { fiss->ifis = 1; } else { fiss->ifis = 0; } if (NbLam0 > 0) { opt->nblan0 = NbLam0; } G4double aprf = (G4double)nucleusA; G4double zprf = (G4double)nucleusZ; G4double ee = excitationEnergy; G4double jprf = angularMomentum; // actually root-mean-squared G4double pxrem = momX; G4double pyrem = momY; G4double pzrem = momZ; G4double zimf, aimf; gammaemission = 0; G4double T_init = 0., T_diff = 0., a_tilda = 0., a_tilda_BU = 0., EE_diff = 0., EINCL = 0., A_FINAL = 0., Z_FINAL = 0., E_FINAL = 0.; G4double A_diff = 0., ASLOPE1, ASLOPE2, A_ACC, ABU_SLOPE, ABU_SUM = 0., AMEM = 0., ZMEM = 0., EMEM = 0., JMEM = 0., 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., Z_Breakup_sum = 0., A_Breakup, Z_Breakup, N_Breakup, G_SYMM, CZ, Sigma_Z, Z_Breakup_Mean, ZTEMP = 0., ATEMP = 0.; G4double ETOT_PRF = 0.0, PXPRFP = 0., PYPRFP = 0., PZPRFP = 0., PPRFP = 0., VX1_BU = 0., VY1_BU = 0., VZ1_BU = 0., VBU2 = 0., GAMMA_REL = 1.0, Eexc_BU_SUM = 0., VX_BU_SUM = 0., VY_BU_SUM = 0., VZ_BU_SUM = 0., E_tot_BU = 0., EKIN_BU = 0., ZIMFBU = 0., AIMFBU = 0., ZFFBU = 0., AFFBU = 0., AFBU = 0., ZFBU = 0., EEBU = 0., TKEIMFBU = 0., vx_evabu = 0., vy_evabu = 0., vz_evabu = 0., Bvalue_BU = 0., P_BU = 0., ETOT_BU = 1., PX_BU = 0., PY_BU = 0., PZ_BU = 0., VX2_BU = 0., VY2_BU = 0., VZ2_BU = 0.; G4int ABU_DIFF, ZBU_DIFF, NBU_DIFF; G4int INEWLOOP = 0, ILOOPBU = 0; G4double BU_TAB_TEMP[indexpart][6], BU_TAB_TEMP1[indexpart][6]; G4double EV_TAB_TEMP[indexpart][6], EV_TEMP[indexpart][6]; G4int IMEM_BU[indexpart], IMEM = 0; if (nucleusA < 1) { std::cout << "Error - Remnant with a mass number A below 1." << std::endl; // INCL_ERROR("Remnant with a mass number A below 1."); return; } for (G4int j = 0; j < 3; j++) { V_CM[j] = 0.; VFP1_CM[j] = 0.; VFP2_CM[j] = 0.; VIMF_CM[j] = 0.; } for (G4int I1 = 0; I1 < indexpart; I1++) { for (G4int I2 = 0; I2 < 12; I2++) BU_TAB[I1][I2] = 0.0; for (G4int I2 = 0; I2 < 6; I2++) { BU_TAB_TEMP[I1][I2] = 0.0; BU_TAB_TEMP1[I1][I2] = 0.0; EV_TAB_TEMP[I1][I2] = 0.0; EV_TAB[I1][I2] = 0.0; EV_TAB_SSC[I1][I2] = 0.0; EV_TEMP[I1][I2] = 0.0; } } G4int idebug = 0; if (idebug == 1) { zprf = 81.; aprf = 201.; // ee = 86.5877686; ee = 100.0; jprf = 10.; zf = 0.; af = 0.; mtota = 0.; ff = 1; inttype = 0; // inum = 2; } // G4double AAINCL = aprf; G4double ZAINCL = zprf; EINCL = ee; // // Velocity after the first stage of reaction (INCL) // For coupling with INCL, comment the lines below, and use output // of INCL as pxincl, pyincl,pzincl // G4double pincl = std::sqrt(pxrem * pxrem + pyrem * pyrem + pzrem * pzrem); // PPRFP is in MeV/c G4double ETOT_incl = std::sqrt(pincl * pincl + (AAINCL * amu) * (AAINCL * amu)); G4double VX_incl = C * pxrem / ETOT_incl; G4double VY_incl = C * pyrem / ETOT_incl; G4double VZ_incl = C * pzrem / ETOT_incl; // // Multiplicity in the break-up event G4int IMULTBU = 0; G4int IMULTIFR = 0; G4int I_Breakup = 0; G4int NbLamprf = 0; IEV_TAB = 0; /* C Set maximum temperature for sequential decay (evaporation) C Remove additional energy by simultaneous break up C (vaporisation or multi-fragmentation) C Idea: If the temperature of the projectile spectator exceeds c the limiting temperature T_freeze_out, the additional C energy which is present in the spectator is used for C a stage of simultaneous break up. It is either the C simultaneous emission of a gaseous phase or the simultaneous C emission of several intermediate-mass fragments. Only one C piece of the projectile spectator (assumed to be the largest C one) is kept track. C MVR, KHS, October 2001 C KHS, AK 2007 - Masses from the power low; slope parameter dependent on C energy per nucleon; symmtery-energy coeff. dependent on C energy per nucleon. c Clear BU_TAB (array of multifragmentation products) */ if (T_freeze_out_in >= 0.0) { T_freeze_out = T_freeze_out_in; } else { T_freeze_out = max(9.33 * std::exp(-0.00282 * AAINCL), 5.5); // ! See: J. Natowitz et al, PRC65 (2002) 034618 // T_freeze_out=DMAX1(9.0D0*DEXP(-0.001D0*AAABRA), // & 5.5D0) } // a_tilda = ald->av * aprf + ald->as * std::pow(aprf, 2.0 / 3.0) + ald->ak * std::pow(aprf, 1.0 / 3.0); T_init = std::sqrt(EINCL / a_tilda); T_diff = T_init - T_freeze_out; if (T_diff > 0.1 && zprf > 2. && (aprf - zprf) > 0.) { // T_Diff is set to be larger than 0.1 MeV in order to avoid strange cases // for which T_Diff is of the order of 1.e-3 and less. varntp->kfis = 10; for (G4int i = 0; i < 5; i++) { EE_diff = EINCL - a_tilda * T_freeze_out * T_freeze_out; // Energy removed 10*5/T_init per nucleon removed in // simultaneous breakup adjusted to frag. xsections 238U // (1AGeV) + Pb data, KHS Dec. 2005 // This should maybe be re-checked, in a meanwhile several things in // break-up description have changed (AK). A_diff = dint(EE_diff / (8.0 * 5.0 / T_freeze_out)); if (A_diff > AAINCL) A_diff = AAINCL; A_FINAL = AAINCL - A_diff; a_tilda = ald->av * A_FINAL + ald->as * std::pow(A_FINAL, 2.0 / 3.0) + ald->ak * std::pow(A_FINAL, 1.0 / 3.0); E_FINAL = a_tilda * T_freeze_out * T_freeze_out; if (A_FINAL < 4.0) { // To avoid numerical problems EE_diff = EINCL - E_FINAL; A_FINAL = 1.0; Z_FINAL = 1.0; E_FINAL = 0.0; goto mul4325; } } mul4325: // The idea is similar to Z determination of multifragment - Z of "heavy" // partner is not fixed by the A/Z of the prefragment, but randomly picked // from Gaussian Z_FINAL_MEAN = dint(zprf * A_FINAL / (aprf)); Z_FINAL = dint(zprf * A_FINAL / (aprf)); if (E_FINAL < 0.0) E_FINAL = 0.0; aprf = A_FINAL; zprf = Z_FINAL; ee = E_FINAL; A_diff = AAINCL - aprf; // Creation of multifragmentation products by breakup if (A_diff <= 1.0) { aprf = AAINCL; zprf = ZAINCL; ee = EINCL; IMULTIFR = 0; goto mult7777; } else if (A_diff > 1.0) { A_ACC = 0.0; // Energy-dependence of the slope parameter, acc. to A. Botvina, fits also // to exp. data (see e.g. Sfienti et al, NPA 2007) ASLOPE1 = -2.400; // e*/a=7 -2.4 ASLOPE2 = -1.200; // e*/a=3 -1.2 a_tilda = ald->av * AAINCL + ald->as * std::pow(AAINCL, 2.0 / 3.0) + ald->ak * std::pow(AAINCL, 1.0 / 3.0); E_FINAL = a_tilda * T_freeze_out * T_freeze_out; ABU_SLOPE = (ASLOPE1 - ASLOPE2) / 4.0 * (E_FINAL / AAINCL) + ASLOPE1 - (ASLOPE1 - ASLOPE2) * 7.0 / 4.0; // Botvina et al, PRC 74 (2006) 044609, fig. 5 for B0=18 MeV // ABU_SLOPE = 5.57489D0-2.08149D0*(E_FINAL/AAABRA)+ // & 0.3552D0*(E_FINAL/AAABRA)**2-0.024927D0*(E_FINAL/AAABRA)**3+ // & 7.268D-4*(E_FINAL/AAABRA)**4 // They fit with A**(-tau) and here is done A**(tau) // ABU_SLOPE = ABU_SLOPE*(-1.D0) // ABU_SLOPE = -2.60D0 // print*,ABU_SLOPE,(E_FINAL/AAABRA) if (ABU_SLOPE > -1.01) ABU_SLOPE = -1.01; I_Breakup = 0; Z_Breakup_sum = Z_FINAL; ABU_SUM = 0.0; ZBU_SUM = 0.0; for (G4int i = 0; i < 100; i++) { IS = 0; mult4326: A_Breakup = dint(G4double(IPOWERLIMHAZ(ABU_SLOPE, 1, idnint(A_diff)))); // Power law with exponent ABU_SLOPE IS = IS + 1; if (IS > 100) { std::cout << "WARNING: IPOWERLIMHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING A_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED: " << A_Breakup << std::endl; goto mult10; } if (A_Breakup > AAINCL) goto mult4326; if (A_Breakup <= 0.0) { std::cout << "A_BREAKUP <= 0 " << std::endl; goto mult10; } A_ACC = A_ACC + A_Breakup; if (A_ACC <= A_diff) { Z_Breakup_Mean = dint(A_Breakup * ZAINCL / AAINCL); Z_Breakup_sum = Z_Breakup_sum + Z_Breakup_Mean; // // See G.A. Souliotis et al, PRC 75 (2007) 011601R (Fig. 2) G_SYMM = 34.2281 - 5.14037 * E_FINAL / AAINCL; if (E_FINAL / AAINCL < 2.0) G_SYMM = 25.0; if (E_FINAL / AAINCL > 4.0) G_SYMM = 15.0; // G_SYMM = 23.6; G_SYMM = 25.0; // 25 CZ = 2.0 * G_SYMM * 4.0 / A_Breakup; // 2*CZ=d^2(Esym)/dZ^2, Esym=Gamma*(A-2Z)**2/A // gamma = 23.6D0 is the symmetry-energy coefficient G4int IIS = 0; Sigma_Z = std::sqrt(T_freeze_out / CZ); IS = 0; mult4333: Z_Breakup = dint(G4double(gausshaz(1, Z_Breakup_Mean, Sigma_Z))); IS = IS + 1; // if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING Z_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE " "DICED: " << A_Breakup << " " << Z_Breakup << std::endl; goto mult10; } if (Z_Breakup < 0.0) goto mult4333; if ((A_Breakup - Z_Breakup) < 0.0) goto mult4333; if ((A_Breakup - Z_Breakup) == 0.0 && Z_Breakup != 1.0) goto mult4333; if (Z_Breakup >= ZAINCL) { IIS = IIS + 1; if (IIS > 10) { std::cout << "Z_BREAKUP RESAMPLED MORE THAN 10 TIMES; EVENT WILL " "BE RESAMPLED AGAIN " << std::endl; goto mult10; } goto mult4333; } // *** Find the limits that fragment is bound : isostab_lim(idnint(Z_Breakup), &INMIN, &INMAX); // INMIN = MAX(1,INMIN-2) if (Z_Breakup > 2.0) { if (idnint(A_Breakup - Z_Breakup) < INMIN || idnint(A_Breakup - Z_Breakup) > (INMAX + 5)) { // PRINT*,'N_Breakup >< NMAX', // & IDNINT(Z_Breakup),IDNINT(A_Breakup-Z_Breakup),INMIN,INMAX goto mult4343; } } mult4343: // We consider all products, also nucleons created in the break-up // I_Breakup = I_Breakup + 1;// moved below N_Breakup = A_Breakup - Z_Breakup; BU_TAB[I_Breakup][0] = dint(Z_Breakup); // Mass of break-up product BU_TAB[I_Breakup][1] = dint(A_Breakup); // Z of break-up product ABU_SUM = ABU_SUM + BU_TAB[i][1]; ZBU_SUM = ZBU_SUM + BU_TAB[i][0]; // // Break-up products are given zero angular momentum (simplification) BU_TAB[I_Breakup][3] = 0.0; I_Breakup = I_Breakup + 1; IMULTBU = IMULTBU + 1; } else { // There are A_DIFF - A_ACC nucleons lost by breakup, but they do // not end up in multifragmentation products. This is a deficiency // of the Monte-Carlo method applied above to determine the sizes // of the fragments according to the power law. // print*,'Deficiency',IDNINT(A_DIFF-A_ACC) goto mult4327; } // if(A_ACC<=A_diff) } // for // mult4327: // IMULTIFR = 1; } // if(A_diff>1.0) mult4327: IMULTIFR = 1; // "Missing" A and Z picked from the power law: ABU_DIFF = idnint(ABU_SUM + aprf - AAINCL); ZBU_DIFF = idnint(ZBU_SUM + zprf - ZAINCL); NBU_DIFF = idnint((ABU_SUM - ZBU_SUM) + (aprf - zprf) - (AAINCL - ZAINCL)); // if (IMULTBU > 200) std::cout << "WARNING - MORE THAN 200 BU " << IMULTBU << std::endl; if (IMULTBU < 1) std::cout << "WARNING - LESS THAN 1 BU " << IMULTBU << std::endl; //,AABRA,ZABRA,IDNINT(APRF),IDNINT(ZPRF),ABU_DIFF,ZBU_DIFF G4int IPROBA = 0; for (G4int i = 0; i < IMULTBU; i++) IMEM_BU[i] = 0; while (NBU_DIFF != 0 && ZBU_DIFF != 0) { // (APRF,ZPRF) is also inlcuded in this game, as from time to time the // program is entering into endless loop, as it can not find proper // nucleus for adapting A and Z. IS = 0; mult5555: G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); IPROBA = IPROBA + 1; IS = IS + 1; if (IS > 100) { std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." << std::endl; goto mult10; } G4int IEL = G4int(RHAZ); if (IMEM_BU[IEL] == 1) goto mult5555; if (!(IEL < 200)) std::cout << "5555:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL < 0) std::cout << "5555:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL <= IMULTBU) { N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0] - DSIGN(1.0, G4double(NBU_DIFF))); } else if (IEL > IMULTBU) { N_Breakup = dint(aprf - zprf - DSIGN(1.0, G4double(NBU_DIFF))); } if (N_Breakup < 0.0) { IMEM_BU[IEL] = 1; goto mult5555; } if (IEL <= IMULTBU) { ZTEMP = dint(BU_TAB[IEL][0] - DSIGN(1.0, G4double(ZBU_DIFF))); } else if (IEL > IMULTBU) { ZTEMP = dint(zprf - DSIGN(1.0, G4double(ZBU_DIFF))); } if (ZTEMP < 0.0) { IMEM_BU[IEL] = 1; goto mult5555; } if (ZTEMP < 1.0 && N_Breakup < 1.0) { IMEM_BU[IEL] = 1; goto mult5555; } // Nuclei with A=Z and Z>1 are allowed in this stage, as otherwise, // for more central collisions there is not enough mass which can be // shufeled in order to conserve A and Z. These are mostly nuclei with // Z=2 and in less extent 3, 4 or 5. // IF(ZTEMP.GT.1.D0 .AND. N_Breakup.EQ.0.D0) THEN // GOTO 5555 // ENDIF if (IEL <= IMULTBU) { BU_TAB[IEL][0] = dint(ZTEMP); BU_TAB[IEL][1] = dint(ZTEMP + N_Breakup); } else if (IEL > IMULTBU) { zprf = dint(ZTEMP); aprf = dint(ZTEMP + N_Breakup); } NBU_DIFF = NBU_DIFF - ISIGN(1, NBU_DIFF); ZBU_DIFF = ZBU_DIFF - ISIGN(1, ZBU_DIFF); } // while IPROBA = 0; for (G4int i = 0; i < IMULTBU; i++) IMEM_BU[i] = 0; if (NBU_DIFF != 0 && ZBU_DIFF == 0) { while (NBU_DIFF > 0 || NBU_DIFF < 0) { IS = 0; mult5556: G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." << std::endl; goto mult10; } G4int IEL = G4int(RHAZ); if (IMEM_BU[IEL] == 1) goto mult5556; // IPROBA = IPROBA + 1; if (IPROBA > IMULTBU + 1 && NBU_DIFF > 0) { std::cout << "###',IPROBA,IMULTBU,NBU_DIFF,ZBU_DIFF,T_freeze_out" << std::endl; IPROBA = IPROBA + 1; if (IEL <= IMULTBU) { BU_TAB[IEL][1] = dint(BU_TAB[IEL][1] - G4double(NBU_DIFF)); } else { if (IEL > IMULTBU) aprf = dint(aprf - G4double(NBU_DIFF)); } goto mult5432; } if (!(IEL < 200)) std::cout << "5556:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL < 0) std::cout << "5556:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL <= IMULTBU) { N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0] - DSIGN(1.0, G4double(NBU_DIFF))); } else if (IEL > IMULTBU) { N_Breakup = dint(aprf - zprf - DSIGN(1.0, G4double(NBU_DIFF))); } if (N_Breakup < 0.0) { IMEM_BU[IEL] = 1; goto mult5556; } if (IEL <= IMULTBU) { ATEMP = dint(BU_TAB[IEL][0] + N_Breakup); } else if (IEL > IMULTBU) { ATEMP = dint(zprf + N_Breakup); } if ((ATEMP - N_Breakup) < 1.0 && N_Breakup < 1.0) { IMEM_BU[IEL] = 1; goto mult5556; } // IF((ATEMP - N_Breakup).GT.1.D0 .AND. // & N_Breakup.EQ.0.D0) THEN // IMEM_BU(IEL) = 1 // GOTO 5556 // ENDIF if (IEL <= IMULTBU) BU_TAB[IEL][1] = dint(BU_TAB[IEL][0] + N_Breakup); else if (IEL > IMULTBU) aprf = dint(zprf + N_Breakup); // NBU_DIFF = NBU_DIFF - ISIGN(1, NBU_DIFF); } // while(NBU_DIFF > 0 || NBU_DIFF < 0) IPROBA = 0; for (G4int i = 0; i < IMULTBU; i++) IMEM_BU[i] = 0; } else { // if(NBU_DIFF != 0 && ZBU_DIFF == 0) if (ZBU_DIFF != 0 && NBU_DIFF == 0) { while (ZBU_DIFF > 0 || ZBU_DIFF < 0) { IS = 0; mult5557: G4double RHAZ = G4AblaRandom::flat() * G4double(IMULTBU); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: HAZ CALLED MORE THAN 100 TIMES WHEN CALCULATING " "N_BREAKUP IN Rn07.FOR. NEW EVENT WILL BE DICED." << std::endl; goto mult10; } G4int IEL = G4int(RHAZ); if (IMEM_BU[IEL] == 1) goto mult5557; // IPROBA = IPROBA + 1; if (IPROBA > IMULTBU + 1 && ZBU_DIFF > 0) { std::cout << "###',IPROBA,IMULTBU,NBU_DIFF,ZBU_DIFF,T_freeze_out" << std::endl; IPROBA = IPROBA + 1; if (IEL <= IMULTBU) { N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0]); BU_TAB[IEL][0] = dint(BU_TAB[IEL][0] - G4double(ZBU_DIFF)); BU_TAB[IEL][1] = dint(BU_TAB[IEL][0] + N_Breakup); } else { if (IEL > IMULTBU) { N_Breakup = aprf - zprf; zprf = dint(zprf - G4double(ZBU_DIFF)); aprf = dint(zprf + N_Breakup); } } goto mult5432; } if (!(IEL < 200)) std::cout << "5557:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL < 0) std::cout << "5557:" << IEL << RHAZ << IMULTBU << std::endl; if (IEL <= IMULTBU) { N_Breakup = dint(BU_TAB[IEL][1] - BU_TAB[IEL][0]); ZTEMP = dint(BU_TAB[IEL][0] - DSIGN(1.0, G4double(ZBU_DIFF))); } else if (IEL > IMULTBU) { N_Breakup = dint(aprf - zprf); ZTEMP = dint(zprf - DSIGN(1.0, G4double(ZBU_DIFF))); } ATEMP = dint(ZTEMP + N_Breakup); if (ZTEMP < 0.0) { IMEM_BU[IEL] = 1; goto mult5557; } if ((ATEMP - ZTEMP) < 0.0) { IMEM_BU[IEL] = 1; goto mult5557; } if ((ATEMP - ZTEMP) < 1.0 && ZTEMP < 1.0) { IMEM_BU[IEL] = 1; goto mult5557; } if (IEL <= IMULTBU) { BU_TAB[IEL][0] = dint(ZTEMP); BU_TAB[IEL][1] = dint(ZTEMP + N_Breakup); } else { if (IEL > IMULTBU) { zprf = dint(ZTEMP); aprf = dint(ZTEMP + N_Breakup); } } ZBU_DIFF = ZBU_DIFF - ISIGN(1, ZBU_DIFF); } // while } // if(ZBU_DIFF != 0 && NBU_DIFF == 0) } // if(NBU_DIFF != 0 && ZBU_DIFF == 0) mult5432: // Looking for the heaviest fragment among all multifragmentation events, // and "giving" excitation energy to fragments ZMEM = 0.0; for (G4int i = 0; i < IMULTBU; i++) { // For particles with Z>2 we calculate excitation energy from freeze-out // temperature. // For particels with Z<3 we assume that they form a gas, and that // temperature results in kinetic energy (which is sampled from Maxwell // distribution with T=Tfreeze-out) and not excitation energy. if (BU_TAB[i][0] > 2.0) { a_tilda_BU = ald->av * BU_TAB[i][1] + ald->as * std::pow(BU_TAB[i][1], 2.0 / 3.0) + ald->ak * std::pow(BU_TAB[i][1], 1.0 / 3.0); BU_TAB[i][2] = a_tilda_BU * T_freeze_out * T_freeze_out; // E* of break-up product } else { BU_TAB[i][2] = 0.0; } // if (BU_TAB[i][0] > ZMEM) { IMEM = i; ZMEM = BU_TAB[i][0]; AMEM = BU_TAB[i][1]; EMEM = BU_TAB[i][2]; JMEM = BU_TAB[i][3]; } } // for IMULTBU if (zprf < ZMEM) { BU_TAB[IMEM][0] = zprf; BU_TAB[IMEM][1] = aprf; BU_TAB[IMEM][2] = ee; BU_TAB[IMEM][3] = jprf; zprf = ZMEM; aprf = AMEM; aprfp = idnint(aprf); zprfp = idnint(zprf); ee = EMEM; jprf = JMEM; } // Just for checking: ABU_SUM = aprf; ZBU_SUM = zprf; for (G4int i = 0; i < IMULTBU; i++) { ABU_SUM = ABU_SUM + BU_TAB[i][1]; ZBU_SUM = ZBU_SUM + BU_TAB[i][0]; } ABU_DIFF = idnint(ABU_SUM - AAINCL); ZBU_DIFF = idnint(ZBU_SUM - ZAINCL); // if (ABU_DIFF != 0 || ZBU_DIFF != 0) std::cout << "Problem of mass in BU " << ABU_DIFF << " " << ZBU_DIFF << std::endl; PX_BU_SUM = 0.0; PY_BU_SUM = 0.0; PZ_BU_SUM = 0.0; // Momenta of break-up products are calculated. They are all given in the // rest frame of the primary prefragment (i.e. after incl): Goldhaber model // **************************************** "Heavy" residue AMOMENT(AAINCL, aprf, 1, &PXPRFP, &PYPRFP, &PZPRFP); PPRFP = std::sqrt(PXPRFP * PXPRFP + PYPRFP * PYPRFP + PZPRFP * PZPRFP); // ******************************************************** // PPRFP is in MeV/c ETOT_PRF = std::sqrt(PPRFP * PPRFP + (aprf * amu) * (aprf * amu)); VX_PREF = C * PXPRFP / ETOT_PRF; VY_PREF = C * PYPRFP / ETOT_PRF; VZ_PREF = C * PZPRFP / ETOT_PRF; // Contribution from Coulomb repulsion ******************** tke_bu(zprf, aprf, ZAINCL, AAINCL, &VX1_BU, &VY1_BU, &VZ1_BU); // Lorentz kinematics // VX_PREF = VX_PREF + VX1_BU // VY_PREF = VY_PREF + VY1_BU // VZ_PREF = VZ_PREF + VZ1_BU // Lorentz transformation lorentz_boost(VX1_BU, VY1_BU, VZ1_BU, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); VX_PREF = VXOUT; VY_PREF = VYOUT; VZ_PREF = VZOUT; // Total momentum: Goldhaber + Coulomb VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_PRF = aprf * amu / GAMMA_REL; PXPRFP = ETOT_PRF * VX_PREF / C; PYPRFP = ETOT_PRF * VY_PREF / C; PZPRFP = ETOT_PRF * VZ_PREF / C; // ******************************************************** // Momentum: Total width of abrasion and breakup assumed to be given // by Fermi momenta of nucleons // ***************************************** PX_BU_SUM = PXPRFP; PY_BU_SUM = PYPRFP; PZ_BU_SUM = PZPRFP; Eexc_BU_SUM = ee; Bvalue_BU = eflmac(idnint(aprf), idnint(zprf), 1, 0); for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) { // For bu products: Bvalue_BU = Bvalue_BU + eflmac(idnint(BU_TAB[I_Breakup][1]), idnint(BU_TAB[I_Breakup][0]), 1, 0); Eexc_BU_SUM = Eexc_BU_SUM + BU_TAB[I_Breakup][2]; AMOMENT(AAINCL, BU_TAB[I_Breakup][1], 1, &PX_BU, &PY_BU, &PZ_BU); P_BU = std::sqrt(PX_BU * PX_BU + PY_BU * PY_BU + PZ_BU * PZ_BU); // ******************************************************* // PPRFP is in MeV/c ETOT_BU = std::sqrt(P_BU * P_BU + (BU_TAB[I_Breakup][1] * amu) * (BU_TAB[I_Breakup][1] * amu)); BU_TAB[I_Breakup][4] = C * PX_BU / ETOT_BU; // Velocity in x BU_TAB[I_Breakup][5] = C * PY_BU / ETOT_BU; // Velocity in y BU_TAB[I_Breakup][6] = C * PZ_BU / ETOT_BU; // Velocity in z // Contribution from Coulomb repulsion: tke_bu(BU_TAB[I_Breakup][0], BU_TAB[I_Breakup][1], ZAINCL, AAINCL, &VX2_BU, &VY2_BU, &VZ2_BU); // Lorentz kinematics // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) + VX2_BU ! velocity // change by Coulomb repulsion BU_TAB(I_Breakup,6) = // BU_TAB(I_Breakup,6) + VY2_BU BU_TAB(I_Breakup,7) = // BU_TAB(I_Breakup,7) + VZ2_BU // Lorentz transformation lorentz_boost(VX2_BU, VY2_BU, VZ2_BU, BU_TAB[I_Breakup][4], BU_TAB[I_Breakup][5], BU_TAB[I_Breakup][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[I_Breakup][4] = VXOUT; BU_TAB[I_Breakup][5] = VYOUT; BU_TAB[I_Breakup][6] = VZOUT; // Total momentum: Goldhaber + Coulomb VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; PX_BU_SUM = PX_BU_SUM + PX_BU; PY_BU_SUM = PY_BU_SUM + PY_BU; PZ_BU_SUM = PZ_BU_SUM + PZ_BU; } // for I_Breakup // In the frame of source (i.e. prefragment after abrasion or INCL) P_BU_SUM = std::sqrt(PX_BU_SUM * PX_BU_SUM + PY_BU_SUM * PY_BU_SUM + PZ_BU_SUM * PZ_BU_SUM); // ******************************************************** // PPRFP is in MeV/c ETOT_SUM = std::sqrt(P_BU_SUM * P_BU_SUM + (AAINCL * amu) * (AAINCL * amu)); VX_BU_SUM = C * PX_BU_SUM / ETOT_SUM; VY_BU_SUM = C * PY_BU_SUM / ETOT_SUM; VZ_BU_SUM = C * PZ_BU_SUM / ETOT_SUM; // Lorentz kinematics - DM 17/5/2010 // VX_PREF = VX_PREF - VX_BU_SUM // VY_PREF = VY_PREF - VY_BU_SUM // VZ_PREF = VZ_PREF - VZ_BU_SUM // Lorentz transformation lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); VX_PREF = VXOUT; VY_PREF = VYOUT; VZ_PREF = VZOUT; VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_PRF = aprf * amu / GAMMA_REL; PXPRFP = ETOT_PRF * VX_PREF / C; PYPRFP = ETOT_PRF * VY_PREF / C; PZPRFP = ETOT_PRF * VZ_PREF / C; PX_BU_SUM = 0.0; PY_BU_SUM = 0.0; PZ_BU_SUM = 0.0; PX_BU_SUM = PXPRFP; PY_BU_SUM = PYPRFP; PZ_BU_SUM = PZPRFP; E_tot_BU = ETOT_PRF; EKIN_BU = aprf * amu / GAMMA_REL - aprf * amu; for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) { // Lorentz kinematics - DM 17/5/2010 // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) - VX_BU_SUM // BU_TAB(I_Breakup,6) = BU_TAB(I_Breakup,6) - VY_BU_SUM // BU_TAB(I_Breakup,7) = BU_TAB(I_Breakup,7) - VZ_BU_SUM // Lorentz transformation lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, BU_TAB[I_Breakup][4], BU_TAB[I_Breakup][5], BU_TAB[I_Breakup][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[I_Breakup][4] = VXOUT; BU_TAB[I_Breakup][5] = VYOUT; BU_TAB[I_Breakup][6] = VZOUT; VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; EKIN_BU = EKIN_BU + BU_TAB[I_Breakup][1] * amu / GAMMA_REL - BU_TAB[I_Breakup][1] * amu; PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; E_tot_BU = E_tot_BU + ETOT_BU; PX_BU_SUM = PX_BU_SUM + PX_BU; PY_BU_SUM = PY_BU_SUM + PY_BU; PZ_BU_SUM = PZ_BU_SUM + PZ_BU; } // for I_Breakup if (std::abs(PX_BU_SUM) > 10. || std::abs(PY_BU_SUM) > 10. || std::abs(PZ_BU_SUM) > 10.) { // In the frame of source (i.e. prefragment after INCL) P_BU_SUM = std::sqrt(PX_BU_SUM * PX_BU_SUM + PY_BU_SUM * PY_BU_SUM + PZ_BU_SUM * PZ_BU_SUM); // ******************************************************** // PPRFP is in MeV/c ETOT_SUM = std::sqrt(P_BU_SUM * P_BU_SUM + (AAINCL * amu) * (AAINCL * amu)); VX_BU_SUM = C * PX_BU_SUM / ETOT_SUM; VY_BU_SUM = C * PY_BU_SUM / ETOT_SUM; VZ_BU_SUM = C * PZ_BU_SUM / ETOT_SUM; // Lorentz kinematics // VX_PREF = VX_PREF - VX_BU_SUM // VY_PREF = VY_PREF - VY_BU_SUM // VZ_PREF = VZ_PREF - VZ_BU_SUM // Lorentz transformation lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); VX_PREF = VXOUT; VY_PREF = VYOUT; VZ_PREF = VZOUT; VBU2 = VX_PREF * VX_PREF + VY_PREF * VY_PREF + VZ_PREF * VZ_PREF; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_PRF = aprf * amu / GAMMA_REL; PXPRFP = ETOT_PRF * VX_PREF / C; PYPRFP = ETOT_PRF * VY_PREF / C; PZPRFP = ETOT_PRF * VZ_PREF / C; PX_BU_SUM = 0.0; PY_BU_SUM = 0.0; PZ_BU_SUM = 0.0; PX_BU_SUM = PXPRFP; PY_BU_SUM = PYPRFP; PZ_BU_SUM = PZPRFP; E_tot_BU = ETOT_PRF; EKIN_BU = aprf * amu / GAMMA_REL - aprf * amu; for (I_Breakup = 0; I_Breakup < IMULTBU; I_Breakup++) { // Lorentz kinematics - DM 17/5/2010 // BU_TAB(I_Breakup,5) = BU_TAB(I_Breakup,5) - VX_BU_SUM // BU_TAB(I_Breakup,6) = BU_TAB(I_Breakup,6) - VY_BU_SUM // BU_TAB(I_Breakup,7) = BU_TAB(I_Breakup,7) - VZ_BU_SUM // Lorentz transformation lorentz_boost(-VX_BU_SUM, -VY_BU_SUM, -VZ_BU_SUM, BU_TAB[I_Breakup][4], BU_TAB[I_Breakup][5], BU_TAB[I_Breakup][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[I_Breakup][4] = VXOUT; BU_TAB[I_Breakup][5] = VYOUT; BU_TAB[I_Breakup][6] = VZOUT; VBU2 = BU_TAB[I_Breakup][4] * BU_TAB[I_Breakup][4] + BU_TAB[I_Breakup][5] * BU_TAB[I_Breakup][5] + BU_TAB[I_Breakup][6] * BU_TAB[I_Breakup][6]; GAMMA_REL = std::sqrt(1.0 - VBU2 / (C * C)); ETOT_BU = BU_TAB[I_Breakup][1] * amu / GAMMA_REL; EKIN_BU = EKIN_BU + BU_TAB[I_Breakup][1] * amu / GAMMA_REL - BU_TAB[I_Breakup][1] * amu; PX_BU = ETOT_BU * BU_TAB[I_Breakup][4] / C; PY_BU = ETOT_BU * BU_TAB[I_Breakup][5] / C; PZ_BU = ETOT_BU * BU_TAB[I_Breakup][6] / C; E_tot_BU = E_tot_BU + ETOT_BU; PX_BU_SUM = PX_BU_SUM + PX_BU; PY_BU_SUM = PY_BU_SUM + PY_BU; PZ_BU_SUM = PZ_BU_SUM + PZ_BU; } // for I_Breakup } // if DABS(PX_BU_SUM).GT.10.d0 // // Find the limits that fragment is bound - only done for neutrons and // LCPs and for nuclei with A=Z, for other nuclei it will be done after // decay: INEWLOOP = 0; for (G4int i = 0; i < IMULTBU; i++) { if (BU_TAB[i][0] < 3.0 || BU_TAB[i][0] == BU_TAB[i][1]) { unstable_nuclei(idnint(BU_TAB[i][1]), idnint(BU_TAB[i][0]), &afpnew, &zfpnew, IOUNSTABLE, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VP1X, &VP1Y, &VP1Z, BU_TAB_TEMP, &ILOOP); if (IOUNSTABLE > 0) { // Properties of "heavy fragment": BU_TAB[i][1] = G4double(afpnew); BU_TAB[i][0] = G4double(zfpnew); BU_TAB[i][4] = VP1X; BU_TAB[i][5] = VP1Y; BU_TAB[i][6] = VP1Z; // Properties of "light" fragments: for (int IJ = 0; IJ < ILOOP; IJ++) { BU_TAB[IMULTBU + INEWLOOP + IJ][0] = BU_TAB_TEMP[IJ][0]; BU_TAB[IMULTBU + INEWLOOP + IJ][1] = BU_TAB_TEMP[IJ][1]; BU_TAB[IMULTBU + INEWLOOP + IJ][4] = BU_TAB_TEMP[IJ][2]; BU_TAB[IMULTBU + INEWLOOP + IJ][5] = BU_TAB_TEMP[IJ][3]; BU_TAB[IMULTBU + INEWLOOP + IJ][6] = BU_TAB_TEMP[IJ][4]; BU_TAB[IMULTBU + INEWLOOP + IJ][2] = 0.0; BU_TAB[IMULTBU + INEWLOOP + IJ][3] = 0.0; } // for ILOOP INEWLOOP = INEWLOOP + ILOOP; } // if IOUNSTABLE.GT.0 } // if BU_TAB[I_Breakup][0]<3.0 } // for IMULTBU // Increased array of BU_TAB IMULTBU = IMULTBU + INEWLOOP; // Evaporation from multifragmentation products opt->optimfallowed = 1; // IMF is allowed fiss->ifis = 0; // fission is not allowed gammaemission = 0; ILOOPBU = 0; // Arrays for lambda emission from breakup fragments G4double* problamb; problamb = new G4double[IMULTBU]; G4double sumN = aprf - zprf; for (G4int i = 0; i < IMULTBU; i++) sumN = sumN + BU_TAB[i][1] - BU_TAB[i][0]; for (G4int i = 0; i < IMULTBU; i++) { problamb[i] = (BU_TAB[i][1] - BU_TAB[i][0]) / sumN; } G4int* Nblamb; Nblamb = new G4int[IMULTBU]; for (G4int i = 0; i < IMULTBU; i++) Nblamb[i] = 0; for (G4int j = 0; j < NbLam0;) { G4double probtotal = (aprf - zprf) / sumN; G4double ran = G4AblaRandom::flat(); // Lambdas in the heavy breakup fragment if (ran <= probtotal) { NbLamprf++; goto directlamb0; } for (G4int i = 0; i < IMULTBU; i++) { // Lambdas in the light breakup residues if (probtotal < ran && ran <= probtotal + problamb[i]) { Nblamb[i] = Nblamb[i] + 1; goto directlamb0; } probtotal = probtotal + problamb[i]; } directlamb0: j++; } // for (G4int i = 0; i < IMULTBU; i++) { EEBU = BU_TAB[i][2]; BU_TAB[i][10] = BU_TAB[i][6]; G4double jprfbu = BU_TAB[i][9]; if (BU_TAB[i][0] > 2.0) { G4int nbl = Nblamb[i]; evapora(BU_TAB[i][0], BU_TAB[i][1], &EEBU, 0.0, &ZFBU, &AFBU, &mtota, &vz_evabu, &vx_evabu, &vy_evabu, &ff, &fimf, &ZIMFBU, &AIMFBU, &TKEIMFBU, &jprfbu, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &nbl); Nblamb[i] = nbl; BU_TAB[i][9] = jprfbu; // Velocities of evaporated particles (in the frame of the primary // prefragment) for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // Lorentz kinematics // DO IK = 3, 5, 1 // EV_TAB(IJ+IEV_TAB,IK) = EV_TEMP(IJ,IK) + // BU_TAB(I,IK+2) ENDDO // Lorentz transformation lorentz_boost(BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[IJ + IEV_TAB][2] = VXOUT; EV_TAB[IJ + IEV_TAB][3] = VYOUT; EV_TAB[IJ + IEV_TAB][4] = VZOUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; // All velocities in the frame of the "primary" prefragment (after INC) // Lorentz kinematics // BU_TAB(I,5) = BU_TAB(I,5) + VX_EVABU // BU_TAB(I,6) = BU_TAB(I,6) + VY_EVABU // BU_TAB(I,7) = BU_TAB(I,7) + VZ_EVABU // Lorentz transformation lorentz_boost( vx_evabu, vy_evabu, vz_evabu, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[i][4] = VXOUT; BU_TAB[i][5] = VYOUT; BU_TAB[i][6] = VZOUT; if (fimf == 0) { BU_TAB[i][7] = dint(ZFBU); BU_TAB[i][8] = dint(AFBU); BU_TAB[i][11] = nbl; } // if fimf==0 if (fimf == 1) { // PRINT*,'IMF EMISSION FROM BU PRODUCTS' // IMF emission: Heavy partner is not allowed to fission or to emitt // IMF. // double FEE = EEBU; G4int FFBU1 = 0; G4int FIMFBU1 = 0; opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF G4double EkinR1 = TKEIMFBU * AIMFBU / (AFBU + AIMFBU); G4double EkinR2 = TKEIMFBU * AFBU / (AFBU + AIMFBU); G4double V1 = std::sqrt(EkinR1 / AFBU) * 1.3887; G4double V2 = std::sqrt(EkinR2 / AIMFBU) * 1.3887; G4double VZ1_IMF = (2.0 * G4AblaRandom::flat() - 1.0) * V1; G4double VPERP1 = std::sqrt(V1 * V1 - VZ1_IMF * VZ1_IMF); G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; G4double VX1_IMF = VPERP1 * std::sin(ALPHA1); G4double VY1_IMF = VPERP1 * std::cos(ALPHA1); G4double VX2_IMF = -VX1_IMF / V1 * V2; G4double VY2_IMF = -VY1_IMF / V1 * V2; G4double VZ2_IMF = -VZ1_IMF / V1 * V2; G4double EEIMFP = EEBU * AFBU / (AFBU + AIMFBU); G4double EEIMF = EEBU * AIMFBU / (AFBU + AIMFBU); // Decay of heavy partner G4double IINERTTOT = 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(AIMFBU, 5.0 / 3.0) + std::pow(AFBU, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * AIMFBU * AFBU / (AIMFBU + AFBU) * (std::pow(AIMFBU, 1. / 3.) + std::pow(AFBU, 1. / 3.)) * (std::pow(AIMFBU, 1. / 3.) + std::pow(AFBU, 1. / 3.)); G4double JPRFHEAVY = BU_TAB[i][9] * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(AFBU, 5.0 / 3.0) / IINERTTOT; G4double JPRFLIGHT = BU_TAB[i][9] * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(AIMFBU, 5.0 / 3.0) / IINERTTOT; // Lorentz kinematics // BU_TAB(I,5) = BU_TAB(I,5) + VX1_IMF // BU_TAB(I,6) = BU_TAB(I,6) + VY1_IMF // BU_TAB(I,7) = BU_TAB(I,7) + VZ1_IMF // Lorentz transformation lorentz_boost( VX1_IMF, VY1_IMF, VZ1_IMF, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[i][4] = VXOUT; BU_TAB[i][5] = VYOUT; BU_TAB[i][6] = VZOUT; G4double vx1ev_imf = 0., vy1ev_imf = 0., vz1ev_imf = 0., zdummy = 0., adummy = 0., tkedummy = 0., jprf1 = 0.; // Lambda particles G4int NbLamH = 0; G4int NbLamimf = 0; G4double pbH = (AFBU - ZFBU) / (AFBU - ZFBU + AIMFBU - ZIMFBU); for (G4int j = 0; j < nbl; j++) { if (G4AblaRandom::flat() < pbH) { NbLamH++; } else { NbLamimf++; } } // Decay of IMF's partner: evapora(ZFBU, AFBU, &EEIMFP, JPRFHEAVY, &ZFFBU, &AFFBU, &mtota, &vz1ev_imf, &vx1ev_imf, &vy1ev_imf, &FFBU1, &FIMFBU1, &zdummy, &adummy, &tkedummy, &jprf1, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamH); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // Lorentz kinematics // DO IK = 3, 5, 1 // EV_TAB(IJ+IEV_TAB,IK) = EV_TEMP(IJ,IK) + // BU_TAB(I,IK+2) ENDDO // Lorentz transformation lorentz_boost(BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[IJ + IEV_TAB][2] = VXOUT; EV_TAB[IJ + IEV_TAB][3] = VYOUT; EV_TAB[IJ + IEV_TAB][4] = VZOUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; BU_TAB[i][7] = dint(ZFFBU); BU_TAB[i][8] = dint(AFFBU); BU_TAB[i][11] = NbLamH; // Lorentz kinematics // BU_TAB(I,5) = BU_TAB(I,5) + vx1ev_imf // BU_TAB(I,6) = BU_TAB(I,6) + vy1ev_imf // BU_TAB(I,7) = BU_TAB(I,7) + vz1ev_imf lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[i][4] = VXOUT; BU_TAB[i][5] = VYOUT; BU_TAB[i][6] = VZOUT; // For IMF - fission and IMF emission are not allowed G4int FFBU2 = 0; G4int FIMFBU2 = 0; opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // Decay of IMF G4double zffimf, affimf, zdummy1, adummy1, tkedummy1, jprf2, vx2ev_imf, vy2ev_imf, vz2ev_imf; evapora(ZIMFBU, AIMFBU, &EEIMF, JPRFLIGHT, &zffimf, &affimf, &mtota, &vz2ev_imf, &vx2ev_imf, &vy2ev_imf, &FFBU2, &FIMFBU2, &zdummy1, &adummy1, &tkedummy1, &jprf2, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamimf); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // Lorentz kinematics // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + BU_TAB(I,5) // +VX2_IMF EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + // BU_TAB(I,6) +VY2_IMF EV_TAB(IJ+IEV_TAB,5) = // EV_TEMP(IJ,5) + BU_TAB(I,7) +VZ2_IMF // Lorentz transformation lorentz_boost(BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TAB[IJ + IEV_TAB][2] = VX2OUT; EV_TAB[IJ + IEV_TAB][3] = VY2OUT; EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; BU_TAB[IMULTBU + ILOOPBU][0] = BU_TAB[i][0]; BU_TAB[IMULTBU + ILOOPBU][1] = BU_TAB[i][1]; BU_TAB[IMULTBU + ILOOPBU][2] = BU_TAB[i][2]; BU_TAB[IMULTBU + ILOOPBU][3] = BU_TAB[i][3]; BU_TAB[IMULTBU + ILOOPBU][7] = dint(zffimf); BU_TAB[IMULTBU + ILOOPBU][8] = dint(affimf); BU_TAB[IMULTBU + ILOOPBU][11] = NbLamimf; // Lorentz transformation lorentz_boost( VX2_IMF, VY2_IMF, VZ2_IMF, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx2ev_imf, vy2ev_imf, vz2ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); BU_TAB[IMULTBU + ILOOPBU][4] = VX2OUT; BU_TAB[IMULTBU + ILOOPBU][5] = VY2OUT; BU_TAB[IMULTBU + ILOOPBU][6] = VZ2OUT; ILOOPBU = ILOOPBU + 1; } // if fimf==1 } else { // if BU_TAB(I,1).GT.2.D0 // BU_TAB[i][0] = BU_TAB[i][0]; // BU_TAB[i][1] = BU_TAB[i][1]; // BU_TAB[i][2] = BU_TAB[i][2]; // BU_TAB[i][3] = BU_TAB[i][3]; BU_TAB[i][7] = BU_TAB[i][0]; BU_TAB[i][8] = BU_TAB[i][1]; // BU_TAB[i][4] = BU_TAB[i][4]; // BU_TAB[i][5] = BU_TAB[i][5]; // BU_TAB[i][6] = BU_TAB[i][6]; BU_TAB[i][11] = Nblamb[i]; } // if BU_TAB(I,1).GT.2.D0 } // for IMULTBU IMULTBU = IMULTBU + ILOOPBU; // // RESOLVE UNSTABLE NUCLEI // INEWLOOP = 0; ABU_SUM = 0.0; ZBU_SUM = 0.0; // for (G4int i = 0; i < IMULTBU; i++) { ABU_SUM = ABU_SUM + BU_TAB[i][8]; ZBU_SUM = ZBU_SUM + BU_TAB[i][7]; unstable_nuclei(idnint(BU_TAB[i][8]), idnint(BU_TAB[i][7]), &afpnew, &zfpnew, IOUNSTABLE, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VP1X, &VP1Y, &VP1Z, BU_TAB_TEMP1, &ILOOP); // From now on, all neutrons and LCP created in above subroutine are part // of the // BU_TAB array (see below - Properties of "light" fragments). Therefore, // NEVA, PEVA ... are not needed any more in the break-up stage. if (IOUNSTABLE > 0) { // Properties of "heavy fragment": ABU_SUM = ABU_SUM + G4double(afpnew) - BU_TAB[i][8]; ZBU_SUM = ZBU_SUM + G4double(zfpnew) - BU_TAB[i][7]; BU_TAB[i][8] = G4double(afpnew); BU_TAB[i][7] = G4double(zfpnew); BU_TAB[i][4] = VP1X; BU_TAB[i][5] = VP1Y; BU_TAB[i][6] = VP1Z; // Properties of "light" fragments: for (G4int IJ = 0; IJ < ILOOP; IJ++) { BU_TAB[IMULTBU + INEWLOOP + IJ][7] = BU_TAB_TEMP1[IJ][0]; BU_TAB[IMULTBU + INEWLOOP + IJ][8] = BU_TAB_TEMP1[IJ][1]; BU_TAB[IMULTBU + INEWLOOP + IJ][4] = BU_TAB_TEMP1[IJ][2]; BU_TAB[IMULTBU + INEWLOOP + IJ][5] = BU_TAB_TEMP1[IJ][3]; BU_TAB[IMULTBU + INEWLOOP + IJ][6] = BU_TAB_TEMP1[IJ][4]; BU_TAB[IMULTBU + INEWLOOP + IJ][2] = 0.0; BU_TAB[IMULTBU + INEWLOOP + IJ][3] = 0.0; BU_TAB[IMULTBU + INEWLOOP + IJ][0] = BU_TAB[i][0]; BU_TAB[IMULTBU + INEWLOOP + IJ][1] = BU_TAB[i][1]; BU_TAB[IMULTBU + INEWLOOP + IJ][11] = BU_TAB[i][11]; ABU_SUM = ABU_SUM + BU_TAB[IMULTBU + INEWLOOP + IJ][8]; ZBU_SUM = ZBU_SUM + BU_TAB[IMULTBU + INEWLOOP + IJ][7]; } // for ILOOP INEWLOOP = INEWLOOP + ILOOP; } // if(IOUNSTABLE>0) } // for IMULTBU unstable // Increased array of BU_TAB IMULTBU = IMULTBU + INEWLOOP; // Transform all velocities into the rest frame of the projectile lorentz_boost(VX_incl, VY_incl, VZ_incl, VX_PREF, VY_PREF, VZ_PREF, &VXOUT, &VYOUT, &VZOUT); VX_PREF = VXOUT; VY_PREF = VYOUT; VZ_PREF = VZOUT; for (G4int i = 0; i < IMULTBU; i++) { lorentz_boost(VX_incl, VY_incl, VZ_incl, BU_TAB[i][4], BU_TAB[i][5], BU_TAB[i][6], &VXOUT, &VYOUT, &VZOUT); BU_TAB[i][4] = VXOUT; BU_TAB[i][5] = VYOUT; BU_TAB[i][6] = VZOUT; } for (G4int i = 0; i < IEV_TAB; i++) { lorentz_boost(VX_incl, VY_incl, VZ_incl, EV_TAB[i][2], EV_TAB[i][3], EV_TAB[i][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[i][2] = VXOUT; EV_TAB[i][3] = VYOUT; EV_TAB[i][4] = VZOUT; } if (IMULTBU > 200) std::cout << "IMULTBU>200 " << IMULTBU << std::endl; delete[] problamb; delete[] Nblamb; } // if(T_diff>0.1) // End of multi-fragmentation mult7777: // Start basic de-excitation of fragments aprfp = idnint(aprf); zprfp = idnint(zprf); if (IMULTIFR == 0) { // These momenta are in the frame of the projectile (or target in case of // direct kinematics) VX_PREF = VX_incl; VY_PREF = VY_incl; VZ_PREF = VZ_incl; } // Lambdas after multi-fragmentation if (IMULTIFR == 1) { NbLam0 = NbLamprf; } // // CALL THE EVAPORATION SUBROUTINE // opt->optimfallowed = 1; // IMF is allowed fiss->ifis = 1; // fission is allowed fimf = 0; ff = 0; // To spare computing time; these events in any case cannot decay // IF(ZPRFP.LE.2.AND.ZPRFP.LT.APRFP)THEN FIXME: <= or < if (zprfp <= 2 && zprfp < aprfp) { zf = zprf; af = aprf; ee = 0.0; ff = 0; fimf = 0; ftype = 0; aimf = 0.0; zimf = 0.0; tkeimf = 0.0; vx_eva = 0.0; vy_eva = 0.0; vz_eva = 0.0; jprf0 = jprf; goto a1972; } // if(ZPRFP.LE.2.AND.ZPRFP.EQ.APRFP) if (zprfp <= 2 && zprfp == aprfp) { unstable_nuclei(aprfp, zprfp, &afpnew, &zfpnew, IOUNSTABLE, VX_PREF, VY_PREF, VZ_PREF, &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); af = G4double(afpnew); zf = G4double(zfpnew); VX_PREF = VP1X; VY_PREF = VP1Y; VZ_PREF = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 6; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; ee = 0.0; ff = 0; fimf = 0; ftype = 0; aimf = 0.0; zimf = 0.0; tkeimf = 0.0; vx_eva = 0.0; vy_eva = 0.0; vz_eva = 0.0; jprf0 = jprf; goto a1972; } // IF(ZPRFP.EQ.APRFP)THEN if (zprfp == aprfp) { unstable_nuclei(aprfp, zprfp, &afpnew, &zfpnew, IOUNSTABLE, VX_PREF, VY_PREF, VZ_PREF, &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); af = G4double(afpnew); zf = G4double(zfpnew); VX_PREF = VP1X; VY_PREF = VP1Y; VZ_PREF = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 6; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; ee = 0.0; ff = 0; fimf = 0; ftype = 0; aimf = 0.0; zimf = 0.0; tkeimf = 0.0; vx_eva = 0.0; vy_eva = 0.0; vz_eva = 0.0; jprf0 = jprf; goto a1972; } // evapora(zprf, aprf, &ee, jprf, &zf, &af, &mtota, &vz_eva, &vx_eva, &vy_eva, &ff, &fimf, &zimf, &aimf, &tkeimf, &jprf0, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLam0); // for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost( VX_PREF, VY_PREF, VZ_PREF, EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[IJ + IEV_TAB][2] = VXOUT; EV_TAB[IJ + IEV_TAB][3] = VYOUT; EV_TAB[IJ + IEV_TAB][4] = VZOUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; a1972: // vi_pref - velocity of the prefragment; vi_eva - recoil due to evaporation lorentz_boost(VX_PREF, VY_PREF, VZ_PREF, vx_eva, vy_eva, vz_eva, &VXOUT, &VYOUT, &VZOUT); V_CM[0] = VXOUT; V_CM[1] = VYOUT; V_CM[2] = VZOUT; // if (ff == 0 && fimf == 0) { // Evaporation of neutrons and LCP; no IMF, no fission ftype = 0; ZFP1 = idnint(zf); AFP1 = idnint(af); SFP1 = NbLam0; AFPIMF = 0; ZFPIMF = 0; SFPIMF = 0; ZFP2 = 0; AFP2 = 0; SFP2 = 0; VFP1_CM[0] = V_CM[0]; VFP1_CM[1] = V_CM[1]; VFP1_CM[2] = V_CM[2]; for (G4int j = 0; j < 3; j++) { VIMF_CM[j] = 0.0; VFP2_CM[j] = 0.0; } } // if (ff == 1 && fimf == 0) ftype = 1; // fission if (ff == 0 && fimf == 1) ftype = 2; // IMF emission // // AFP,ZFP IS THE FINAL FRAGMENT IF NO FISSION OR IMF EMISSION OCCURS // IN CASE OF FISSION IT IS THE NUCLEUS THAT UNDERGOES FISSION OR IMF // //***************** FISSION *************************************** // if (ftype == 1) { varntp->kfis = 1; if (NbLam0 > 0) varntp->kfis = 20; // ftype1=0; G4int IEV_TAB_FIS = 0, imode = 0; G4double vx1_fission = 0., vy1_fission = 0., vz1_fission = 0.; G4double vx2_fission = 0., vy2_fission = 0., vz2_fission = 0.; G4double vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0.; fission(af, zf, ee, jprf0, &vx1_fission, &vy1_fission, &vz1_fission, &vx2_fission, &vy2_fission, &vz2_fission, &ZFP1, &AFP1, &SFP1, &ZFP2, &AFP2, &SFP2, &imode, &vx_eva_sc, &vy_eva_sc, &vz_eva_sc, EV_TEMP, &IEV_TAB_FIS, &NbLam0); for (G4int IJ = 0; IJ < IEV_TAB_FIS; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // Lorentz kinematics // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost( V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[IJ + IEV_TAB][2] = VXOUT; EV_TAB[IJ + IEV_TAB][3] = VYOUT; EV_TAB[IJ + IEV_TAB][4] = VZOUT; } IEV_TAB = IEV_TAB + IEV_TAB_FIS; // if(imode==1) ftype1 = 1; // S1 mode // if(imode==2) ftype1 = 2; // S2 mode AFPIMF = 0; ZFPIMF = 0; SFPIMF = 0; // VX_EVA_SC,VY_EVA_SC,VZ_EVA_SC - recoil due to particle emisison // between saddle and scission // Lorentz kinematics // VFP1_CM(1) = V_CM(1) + VX1_FISSION + VX_EVA_SC ! Velocity of FF1 // in x VFP1_CM(2) = V_CM(2) + VY1_FISSION + VY_EVA_SC ! Velocity of // FF1 in y VFP1_CM(3) = V_CM(3) + VZ1_FISSION + VZ_EVA_SC ! Velocity // of FF1 in x lorentz_boost(vx1_fission, vy1_fission, vz1_fission, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP1_CM[0] = VX2OUT; VFP1_CM[1] = VY2OUT; VFP1_CM[2] = VZ2OUT; // Lorentz kinematics // VFP2_CM(1) = V_CM(1) + VX2_FISSION + VX_EVA_SC ! Velocity of FF2 // in x VFP2_CM(2) = V_CM(2) + VY2_FISSION + VY_EVA_SC ! Velocity of // FF2 in y VFP2_CM(3) = V_CM(3) + VZ2_FISSION + VZ_EVA_SC ! Velocity // of FF2 in x lorentz_boost(vx2_fission, vy2_fission, vz2_fission, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP2_CM[0] = VX2OUT; VFP2_CM[1] = VY2OUT; VFP2_CM[2] = VZ2OUT; //************** IMF EMISSION //************************************************ // } else if (ftype == 2) { // IMF emission: Heavy partner is allowed to fission and to emitt IMF, but // ONLY once. G4int FF11 = 0; G4int FIMF11 = 0; opt->optimfallowed = 1; // IMF is allowed fiss->ifis = 1; // fission is allowed // Lambda particles G4int NbLamH = 0; G4int NbLamimf = 0; G4double pbH = (af - zf) / (af - zf + aimf - zimf); // double pbL = aimf / (af+aimf); for (G4int i = 0; i < NbLam0; i++) { if (G4AblaRandom::flat() < pbH) { NbLamH++; } else { NbLamimf++; } } // // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF G4double EkinR1 = tkeimf * aimf / (af + aimf); G4double EkinR2 = tkeimf * af / (af + aimf); G4double V1 = std::sqrt(EkinR1 / af) * 1.3887; G4double V2 = std::sqrt(EkinR2 / aimf) * 1.3887; G4double VZ1_IMF = (2.0 * G4AblaRandom::flat() - 1.0) * V1; G4double VPERP1 = std::sqrt(V1 * V1 - VZ1_IMF * VZ1_IMF); G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; G4double VX1_IMF = VPERP1 * std::sin(ALPHA1); G4double VY1_IMF = VPERP1 * std::cos(ALPHA1); G4double VX2_IMF = -VX1_IMF / V1 * V2; G4double VY2_IMF = -VY1_IMF / V1 * V2; G4double VZ2_IMF = -VZ1_IMF / V1 * V2; G4double EEIMFP = ee * af / (af + aimf); G4double EEIMF = ee * aimf / (af + aimf); // Decay of heavy partner G4double IINERTTOT = 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(aimf, 5.0 / 3.0) + std::pow(af, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * aimf * af / (aimf + af) * (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)) * (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)); G4double JPRFHEAVY = jprf0 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(af, 5.0 / 3.0) / IINERTTOT; G4double JPRFLIGHT = jprf0 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(aimf, 5.0 / 3.0) / IINERTTOT; if (af < 2.0) std::cout << "RN117-4,AF,ZF,EE,JPRFheavy" << std::endl; G4double vx1ev_imf = 0., vy1ev_imf = 0., vz1ev_imf = 0., zdummy = 0., adummy = 0., tkedummy = 0., jprf1 = 0.; evapora(zf, af, &EEIMFP, JPRFHEAVY, &zff, &aff, &mtota, &vz1ev_imf, &vx1ev_imf, &vy1ev_imf, &FF11, &FIMF11, &zdummy, &adummy, &tkedummy, &jprf1, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamH); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost( V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TAB[IJ + IEV_TAB][2] = VX2OUT; EV_TAB[IJ + IEV_TAB][3] = VY2OUT; EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; // For IMF - fission and IMF emission are not allowed G4int FF22 = 0; G4int FIMF22 = 0; opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // Decay of IMF G4double zffimf, affimf, zdummy1 = 0., adummy1 = 0., tkedummy1 = 0., jprf2, vx2ev_imf, vy2ev_imf, vz2ev_imf; evapora(zimf, aimf, &EEIMF, JPRFLIGHT, &zffimf, &affimf, &mtota, &vz2ev_imf, &vx2ev_imf, &vy2ev_imf, &FF22, &FIMF22, &zdummy1, &adummy1, &tkedummy1, &jprf2, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamimf); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost( V_CM[0], V_CM[1], V_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TAB[IJ + IEV_TAB][2] = VX2OUT; EV_TAB[IJ + IEV_TAB][3] = VY2OUT; EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; // As IMF is not allowed to emit IMF, adummy1=zdummy1=0 AFPIMF = idnint(affimf); ZFPIMF = idnint(zffimf); SFPIMF = NbLamimf; // vi1_imf, vi2_imf - velocities of imf and partner from TKE; // vi1ev_imf, vi2_imf - recoil of partner and imf due to evaporation // Lorentz kinematics - DM 18/5/2010 // VIMF_CM(1) = V_CM(1) + VX2_IMF + VX2EV_IMF // VIMF_CM(2) = V_CM(2) + VY2_IMF + VY2EV_IMF // VIMF_CM(3) = V_CM(3) + VZ2_IMF + VZ2EV_IMF lorentz_boost(VX2_IMF, VY2_IMF, VZ2_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx2ev_imf, vy2ev_imf, vz2ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VIMF_CM[0] = VX2OUT; VIMF_CM[1] = VY2OUT; VIMF_CM[2] = VZ2OUT; // Lorentz kinematics // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP1_CM[0] = VX2OUT; VFP1_CM[1] = VY2OUT; VFP1_CM[2] = VZ2OUT; if (FF11 == 0 && FIMF11 == 0) { // heavy partner deexcites by emission of light particles AFP1 = idnint(aff); ZFP1 = idnint(zff); SFP1 = NbLamH; ZFP2 = 0; AFP2 = 0; SFP2 = 0; ftype = 2; AFPIMF = idnint(affimf); ZFPIMF = idnint(zffimf); SFPIMF = NbLamimf; for (G4int I = 0; I < 3; I++) VFP2_CM[I] = 0.0; } else if (FF11 == 1 && FIMF11 == 0) { // Heavy partner fissions varntp->kfis = 1; if (NbLam0 > 0) varntp->kfis = 20; // opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // zf = zff; af = aff; ee = EEIMFP; // ftype1=0; ftype = 21; G4int IEV_TAB_FIS = 0, imode = 0; G4double vx1_fission = 0., vy1_fission = 0., vz1_fission = 0.; G4double vx2_fission = 0., vy2_fission = 0., vz2_fission = 0.; G4double vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0.; fission(af, zf, ee, jprf1, &vx1_fission, &vy1_fission, &vz1_fission, &vx2_fission, &vy2_fission, &vz2_fission, &ZFP1, &AFP1, &SFP1, &ZFP2, &AFP2, &SFP2, &imode, &vx_eva_sc, &vy_eva_sc, &vz_eva_sc, EV_TEMP, &IEV_TAB_FIS, &NbLamH); for (int IJ = 0; IJ < IEV_TAB_FIS; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // Lorentz kinematics // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost(VFP1_CM[0], VFP1_CM[1], VFP1_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB[IJ + IEV_TAB][2] = VXOUT; EV_TAB[IJ + IEV_TAB][3] = VYOUT; EV_TAB[IJ + IEV_TAB][4] = VZOUT; } IEV_TAB = IEV_TAB + IEV_TAB_FIS; // if(imode==1) ftype1 = 1; // S1 mode // if(imode==2) ftype1 = 2; // S2 mode // Lorentz kinematics // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF + VX1_FISSION + // & VX_EVA_SC ! Velocity of FF1 in x // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF + VY1_FISSION + // & VY_EVA_SC ! Velocity of FF1 in y // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF + VZ1_FISSION + // & VZ_EVA_SC ! Velocity of FF1 in x lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); lorentz_boost(vx1_fission, vy1_fission, vz1_fission, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP1_CM[0] = VX2OUT; VFP1_CM[1] = VY2OUT; VFP1_CM[2] = VZ2OUT; // Lorentz kinematics // VFP2_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF + VX2_FISSION + // & VX_EVA_SC ! Velocity of FF2 in x // VFP2_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF + VY2_FISSION + // & VY_EVA_SC ! Velocity of FF2 in y // VFP2_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF + VZ2_FISSION + // & VZ_EVA_SC ! Velocity of FF2 in x lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); lorentz_boost(vx2_fission, vy2_fission, vz2_fission, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP2_CM[0] = VX2OUT; VFP2_CM[1] = VY2OUT; VFP2_CM[2] = VZ2OUT; } else if (FF11 == 0 && FIMF11 == 1) { // Heavy partner emits imf, consequtive imf emission or fission is not // allowed opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // zf = zff; af = aff; ee = EEIMFP; aimf = adummy; zimf = zdummy; tkeimf = tkedummy; FF11 = 0; FIMF11 = 0; ftype = 22; // Lambda particles G4int NbLamH1 = 0; G4int NbLamimf1 = 0; G4double pbH1 = (af - zf) / (af - zf + aimf - zimf); for (G4int i = 0; i < NbLamH; i++) { if (G4AblaRandom::flat() < pbH1) { NbLamH1++; } else { NbLamimf1++; } } // // Velocities of IMF and partner: 1 denotes partner, 2 denotes IMF EkinR1 = tkeimf * aimf / (af + aimf); EkinR2 = tkeimf * af / (af + aimf); V1 = std::sqrt(EkinR1 / af) * 1.3887; V2 = std::sqrt(EkinR2 / aimf) * 1.3887; G4double VZ1_IMFS = (2.0 * G4AblaRandom::flat() - 1.0) * V1; VPERP1 = std::sqrt(V1 * V1 - VZ1_IMFS * VZ1_IMFS); ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; G4double VX1_IMFS = VPERP1 * std::sin(ALPHA1); G4double VY1_IMFS = VPERP1 * std::cos(ALPHA1); G4double VX2_IMFS = -VX1_IMFS / V1 * V2; G4double VY2_IMFS = -VY1_IMFS / V1 * V2; G4double VZ2_IMFS = -VZ1_IMFS / V1 * V2; EEIMFP = ee * af / (af + aimf); EEIMF = ee * aimf / (af + aimf); // Decay of heavy partner IINERTTOT = 0.40 * 931.490 * 1.160 * 1.160 * (std::pow(aimf, 5.0 / 3.0) + std::pow(af, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * aimf * af / (aimf + af) * (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)) * (std::pow(aimf, 1. / 3.) + std::pow(af, 1. / 3.)); JPRFHEAVY = jprf1 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(af, 5.0 / 3.0) / IINERTTOT; JPRFLIGHT = jprf1 * 0.4 * 931.49 * 1.16 * 1.16 * std::pow(aimf, 5.0 / 3.0) / IINERTTOT; G4double zffs = 0., affs = 0., vx1ev_imfs = 0., vy1ev_imfs = 0., vz1ev_imfs = 0., jprf3 = 0.; evapora(zf, af, &EEIMFP, JPRFHEAVY, &zffs, &affs, &mtota, &vz1ev_imfs, &vx1ev_imfs, &vy1ev_imfs, &FF11, &FIMF11, &zdummy, &adummy, &tkedummy, &jprf3, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamH1); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost(VFP1_CM[0], VFP1_CM[1], VFP1_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imfs, vy1ev_imfs, vz1ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TAB[IJ + IEV_TAB][2] = VX2OUT; EV_TAB[IJ + IEV_TAB][3] = VY2OUT; EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; // For IMF - fission and IMF emission are not allowed opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed // FF22 = 0; FIMF22 = 0; // Decay of "second" IMF G4double zffimfs = 0., affimfs = 0., vx2ev_imfs = 0., vy2ev_imfs = 0., vz2ev_imfs = 0., jprf4 = 0.; evapora(zimf, aimf, &EEIMF, JPRFLIGHT, &zffimfs, &affimfs, &mtota, &vz2ev_imfs, &vx2ev_imfs, &vy2ev_imfs, &FF22, &FIMF22, &zdummy1, &adummy1, &tkedummy1, &jprf4, &inttype, &inum, EV_TEMP, &IEV_TAB_TEMP, &NbLamimf1); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TAB[IJ + IEV_TAB][0] = EV_TEMP[IJ][0]; EV_TAB[IJ + IEV_TAB][1] = EV_TEMP[IJ][1]; EV_TAB[IJ + IEV_TAB][5] = EV_TEMP[IJ][5]; // // EV_TAB(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TAB(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TAB(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost(VFP1_CM[0], VFP1_CM[1], VFP1_CM[2], EV_TEMP[IJ][2], EV_TEMP[IJ][3], EV_TEMP[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx2ev_imfs, vy2ev_imfs, vz2ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TAB[IJ + IEV_TAB][2] = VX2OUT; EV_TAB[IJ + IEV_TAB][3] = VY2OUT; EV_TAB[IJ + IEV_TAB][4] = VZ2OUT; } IEV_TAB = IEV_TAB + IEV_TAB_TEMP; AFP1 = idnint(affs); ZFP1 = idnint(zffs); SFP1 = NbLamH1; ZFP2 = idnint(zffimfs); AFP2 = idnint(affimfs); SFP2 = NbLamimf1; // Velocity of final heavy residue // Lorentz kinematics // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); lorentz_boost(VX1_IMFS, VY1_IMFS, VZ1_IMFS, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imfs, vy1ev_imfs, vz1ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP1_CM[0] = VX2OUT; VFP1_CM[1] = VY2OUT; VFP1_CM[2] = VZ2OUT; // Velocity of the second IMF // Lorentz kinematics // VFP1_CM(1) = V_CM(1) + VX1_IMF + VX1EV_IMF // VFP1_CM(2) = V_CM(2) + VY1_IMF + VY1EV_IMF // VFP1_CM(3) = V_CM(3) + VZ1_IMF + VZ1EV_IMF lorentz_boost(VX1_IMF, VY1_IMF, VZ1_IMF, V_CM[0], V_CM[1], V_CM[2], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx1ev_imf, vy1ev_imf, vz1ev_imf, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); lorentz_boost(VX2_IMFS, VY2_IMFS, VZ2_IMFS, VX2OUT, VY2OUT, VZ2OUT, &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx2ev_imfs, vy2ev_imfs, vz2ev_imfs, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); VFP2_CM[0] = VX2OUT; VFP2_CM[1] = VY2OUT; VFP2_CM[2] = VZ2OUT; } // second decay } // if(ftype == 2) // Only evaporation of light particles if (ftype != 1 && ftype != 21) { // ----------- RESOLVE UNSTABLE NUCLEI IOUNSTABLE = 0; unstable_nuclei(AFP1, ZFP1, &afpnew, &zfpnew, IOUNSTABLE, VFP1_CM[0], VFP1_CM[1], VFP1_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFP1 = afpnew; ZFP1 = zfpnew; VFP1_CM[0] = VP1X; VFP1_CM[1] = VP1Y; VFP1_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } if (ftype > 1) { IOUNSTABLE = 0; unstable_nuclei(AFPIMF, ZFPIMF, &afpnew, &zfpnew, IOUNSTABLE, VIMF_CM[0], VIMF_CM[1], VIMF_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFPIMF = afpnew; ZFPIMF = zfpnew; VIMF_CM[0] = VP1X; VIMF_CM[1] = VP1Y; VIMF_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } if (ftype > 2) { IOUNSTABLE = 0; unstable_nuclei(AFP2, ZFP2, &afpnew, &zfpnew, IOUNSTABLE, VFP2_CM[0], VFP2_CM[1], VFP2_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFP2 = afpnew; ZFP2 = zfpnew; VFP2_CM[0] = VP1X; VFP2_CM[1] = VP1Y; VFP2_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } } // ftype>2 } // ftype>1 } // For the case of fission: if (ftype == 1 || ftype == 21) { // ----------- RESOLVE UNSTABLE NUCLEI IOUNSTABLE = 0; // ----------- Fragment 1 unstable_nuclei(AFP1, ZFP1, &afpnew, &zfpnew, IOUNSTABLE, VFP1_CM[0], VFP1_CM[1], VFP1_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFP1 = afpnew; ZFP1 = zfpnew; VFP1_CM[0] = VP1X; VFP1_CM[1] = VP1Y; VFP1_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } IOUNSTABLE = 0; // ----------- Fragment 2 unstable_nuclei(AFP2, ZFP2, &afpnew, &zfpnew, IOUNSTABLE, VFP2_CM[0], VFP2_CM[1], VFP2_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFP2 = afpnew; ZFP2 = zfpnew; VFP2_CM[0] = VP1X; VFP2_CM[1] = VP1Y; VFP2_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } if (ftype == 21) { IOUNSTABLE = 0; // ----------- Fragment IMF unstable_nuclei(AFPIMF, ZFPIMF, &afpnew, &zfpnew, IOUNSTABLE, VIMF_CM[0], VIMF_CM[1], VIMF_CM[2], &VP1X, &VP1Y, &VP1Z, EV_TAB_TEMP, &ILOOP); if (IOUNSTABLE == 1) { AFPIMF = afpnew; ZFPIMF = zfpnew; VIMF_CM[0] = VP1X; VIMF_CM[1] = VP1Y; VIMF_CM[2] = VP1Z; for (G4int I = 0; I < ILOOP; I++) { for (G4int IJ = 0; IJ < 5; IJ++) EV_TAB[I + IEV_TAB][IJ] = EV_TAB_TEMP[I][IJ]; } IEV_TAB = IEV_TAB + ILOOP; } } // ftype=21 } // Cross check if ((ftype == 1 || ftype == 21) && (AFP2 <= 0 || AFP1 <= 0 || ZFP2 <= 0 || ZFP1 <= 0)) { std::cout << "ZFP1:" << ZFP1 << std::endl; std::cout << "AFP1:" << AFP1 << std::endl; std::cout << "ZFP2:" << ZFP2 << std::endl; std::cout << "AFP2:" << AFP2 << std::endl; } // Put heavy residues in the EV_TAB array EV_TAB[IEV_TAB][0] = ZFP1; EV_TAB[IEV_TAB][1] = AFP1; EV_TAB[IEV_TAB][5] = SFP1; EV_TAB[IEV_TAB][2] = VFP1_CM[0]; EV_TAB[IEV_TAB][3] = VFP1_CM[1]; EV_TAB[IEV_TAB][4] = VFP1_CM[2]; IEV_TAB = IEV_TAB + 1; if (AFP2 > 0) { EV_TAB[IEV_TAB][0] = ZFP2; EV_TAB[IEV_TAB][1] = AFP2; EV_TAB[IEV_TAB][5] = SFP2; EV_TAB[IEV_TAB][2] = VFP2_CM[0]; EV_TAB[IEV_TAB][3] = VFP2_CM[1]; EV_TAB[IEV_TAB][4] = VFP2_CM[2]; IEV_TAB = IEV_TAB + 1; } if (AFPIMF > 0) { EV_TAB[IEV_TAB][0] = ZFPIMF; EV_TAB[IEV_TAB][1] = AFPIMF; EV_TAB[IEV_TAB][5] = SFPIMF; EV_TAB[IEV_TAB][2] = VIMF_CM[0]; EV_TAB[IEV_TAB][3] = VIMF_CM[1]; EV_TAB[IEV_TAB][4] = VIMF_CM[2]; IEV_TAB = IEV_TAB + 1; } // Put the array of particles in the root file of INCL FillData(IMULTBU, IEV_TAB); return; } // Evaporation code void G4Abla::initEvapora() { // 40 C BFPRO,SNPRO,SPPRO,SHELL // 41 C // 42 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES // 43 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C // 44 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC. // 45 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION // 46 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII // 47 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141... // 48 C BFPRO - FISSION BARRIER OF THE PROJECTILE // 49 C SNPRO - NEUTRON SEPARATION ENERGY OF THE // PROJECTILE 50 C SPPRO - PROTON " " " " " // 51 C SHELL - GROUND STATE SHELL CORRECTION // 52 // C--------------------------------------------------------------------- // 53 C // 54 C ENERGIES WIDTHS AND CROSS SECTIONS FOR EM EXCITATION // 55 C COMMON /EMDPAR/ EGDR,EGQR,FWHMGDR,FWHMGQR,CREMDE1,CREMDE2, // 56 C AE1,BE1,CE1,AE2,BE2,CE2,SR1,SR2,XR // 57 C // 58 C EGDR,EGQR - MEAN ENERGY OF GDR AND GQR // 59 C FWHMGDR,FWHMGQR - FWHM OF GDR, GQR // 60 C CREMDE1,CREMDE2 - EM CROSS SECTION FOR E1 AND E2 // 61 C AE1,BE1,CE1 - ARRAYS TO CALCULATE // 62 C AE2,BE2,CE2 - THE EXCITATION ENERGY AFTER E.M. EXC. // 63 C SR1,SR2,XR - WITH MONTE CARLO // 64 // C--------------------------------------------------------------------- // 65 C // 66 C DEFORMATIONS AND G.S. SHELL EFFECTS // 67 C COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA // 68 C // 69 C ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL // G.S. // 70 C ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0) // 71 C VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE // 72 C ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT // BETA2!) 73 C BETA2 = SQRT(5/(4PI)) * ALPHA 74 // C--------------------------------------------------------------------- // 75 C // 76 C ARRAYS FOR EXCITATION ENERGY BY STATISTICAL HOLE ENERY // MODEL 77 C COMMON /EENUC/ SHE, XHE 78 C 79 C SHE, // XHE - ARRAYS TO CALCULATE THE EXC. ENERGY AFTER 80 C ABRASION BY // THE STATISTICAL HOLE ENERGY MODEL 81 // C--------------------------------------------------------------------- // 82 C // 83 C G.S. SHELL EFFECT // 84 C COMMON /EC2SUB/ ECNZ // 85 C // 86 C ECNZ G.S. SHELL EFFECT FOR THE MASSES (IDENTICAL TO ECGNZ) // 87 // C--------------------------------------------------------------------- // G4double MN = 939.5653301; G4double MP = 938.7829835; G4AblaDataFile* dataInterface = new G4AblaDataFile(); if (dataInterface->readData() == true) { if (verboseLevel > 0) { // G4cout <<"G4Abla: Datafiles read successfully." << G4endl; } } else { // G4Exception("ERROR: Failed to read datafiles."); } for (G4int z = 0; z < 99; z++) { // do 30 z = 0,98,1 for (G4int n = 0; n < 154; n++) { // do 31 n = 0,153,1 ecld->ecfnz[n][z] = 0.e0; ec2sub->ecnz[n][z] = dataInterface->getEcnz(n, z); ecld->ecgnz[n][z] = dataInterface->getEcnz(n, z); ecld->alpha[n][z] = dataInterface->getAlpha(n, z); ecld->vgsld[n][z] = dataInterface->getVgsld(n, z); ecld->rms[n][z] = dataInterface->getRms(n, z); } } for (G4int iz = 0; iz < zcolsbeta; iz++) for (G4int in = 0; in < nrowsbeta; in++) { ecld->beta2[in][iz] = dataInterface->getBeta2(in, iz); ecld->beta4[in][iz] = dataInterface->getBeta4(in, iz); } G4double mfrldm[lprows][lpcols]; // For 2 < Z < 12 we take "experimental" shell corrections instead of // calculated Read FRLDM tables for (G4int i = 1; i < lpcols; i++) { for (G4int j = 1; j < lprows; j++) { if (dataInterface->getMexpID(j, i) == 1) { masses->mexpiop[j][i] = 1; } else { masses->mexpiop[j][i] = 0; } // LD masses (even-odd effect is later considered according to Ignatyuk) if (i == 0 && j == 0) mfrldm[j][i] = 0.; else mfrldm[j][i] = MP * i + MN * j + eflmac(i + j, i, 1, 0); } } for (G4int i = 0; i < lpcols; i++) for (G4int j = 0; j < lprows; j++) masses->massexp[j][i] = dataInterface->getMexp(j, i); G4double e0 = 0.; for (G4int i = 1; i < lpcols; i++) { for (G4int j = 1; j < lprows; j++) { masses->bind[j][i] = 0.; if (masses->mexpiop[j][i] == 1) { if (j < 30) { ec2sub->ecnz[j][i] = 0.0; ecld->ecgnz[j][i] = ec2sub->ecnz[j][i]; masses->bind[j][i] = dataInterface->getMexp(j, i) - MP * i - MN * j; ecld->vgsld[j][i] = 0.; e0 = 0.; } else { // For these nuclei, we take "experimental" ground-state shell // corrections // // Parametrization of CT model by Ignatyuk; note that E0 is shifted to // correspond to pairing shift in Fermi-gas model (there, energy is // shifted taking odd-odd nuclei as bassis) G4double para = 0.; parite(j + i, ¶); if (para < 0.0) { // e-o, o-e e0 = 0.285 + 11.17 * std::pow(j + i, -0.464) - 0.390 - 0.00058 * (j + i); } else { G4double parz = 0.; parite(i, &parz); if (parz > 0.0) { // e-e e0 = 22.34 * std::pow(j + i, -0.464) - 0.235; } else { // o-o // // e0 = 0.0; } } // if ((j == i) && mod(j, 2) == 1 && mod(i, 2) == 1) { e0 = e0 - 30.0 * (1.0 / G4double(j + i)); } G4double delta_tot = ec2sub->ecnz[j][i] - ecld->vgsld[j][i]; ec2sub->ecnz[j][i] = dataInterface->getMexp(j, i) - (mfrldm[j][i] - e0); ecld->vgsld[j][i] = max(0.0, ec2sub->ecnz[j][i] - delta_tot); ecld->ecgnz[j][i] = ec2sub->ecnz[j][i]; } // if j } // if mexpiop } } // delete dataInterface; } void G4Abla::SetParametersG4(G4int z, G4int a) { // A and Z for the target fiss->at = a; fiss->zt = z; // switch-fission.1=on.0=off fiss->ifis = 1; // shell+pairing.0-1-2-3 fiss->optshp = 3; if (fiss->zt < 84 && fiss->zt > 60) fiss->optshp = 1; // optemd =0,1 0 no emd, 1 incl. emd opt->optemd = 1; // read(10,*,iostat=io) dum(10),optcha opt->optcha = 1; // shell+pairing.0-1-2-3 for IMFs opt->optshpimf = 0; opt->optimfallowed = 1; // collective enhancement switched on 1 or off 0 in densn (qr=val or =1.) fiss->optcol = 1; if (fiss->zt <= 28) { fiss->optcol = 0; fiss->optshp = 0; opt->optshpimf = 1; } else if (fiss->zt <= 58) { fiss->optcol = 0; fiss->optshp = 1; opt->optshpimf = 3; } // collective enhancement parameters fiss->ucr = 40.; fiss->dcr = 10.; // switch for temperature constant model (CTM) fiss->optct = 1; ald->optafan = 0; // nuclear.viscosity.(beta) fiss->bet = 4.5; fiss->bethyp = 28.0; fiss->optxfis = 3; // Level density parameters ald->av = 0.0730; ald->as = 0.0950; ald->ak = 0.0000; // Multi-fragmentation T_freeze_out_in = -6.5; } void G4Abla::SetParameters() { /* C IFIS = INTEGER SWITCH FOR FISSION C OPTSHP = INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY C =0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY C =1 SHELL , NO PAIRING CORRECTION C =2 PAIRING, NO SHELL CORRECTION C =3 SHELL AND PAIRING CORRECTION IN MASSES AND ENERGY C OPTCOL =0,1 COLLECTIVE ENHANCEMENT SWITCHED ON 1 OR OFF 0 IN DENSN C OPTAFAN=0,1 SWITCH FOR AF/AN = 1 IN DENSNIV 0 AF/AN>1 1 AF/AN=1 C BET = REAL REDUCED FRICTION COEFFICIENT / 10**(+21) S**(-1) C OPTXFIS= INTEGER 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV C FISSILITY PARAMETER. C C NUCLEAR LEVEL DENSITIES: C AV = REAL KOEFFICIENTS FOR CALCULATION OF A(TILDE) C AS = REAL LEVEL DENSITY PARAMETER C AK = REAL */ // switch-fission.1=on.0=off fiss->ifis = 1; // shell+pairing.0-1-2-3 fiss->optshp = 3; if (fiss->zt < 84 && fiss->zt > 56) fiss->optshp = 1; // optemd =0,1 0 no emd, 1 incl. emd opt->optemd = 1; // read(10,*,iostat=io) dum(10),optcha opt->optcha = 1; // shell+pairing.0-1-2-3 for IMFs opt->optshpimf = 0; opt->optimfallowed = 1; // nuclear.viscosity.(beta) fiss->bet = 4.5; // collective enhancement switched on 1 or off 0 in densn (qr=val or =1.) fiss->optcol = 1; if (fiss->zt <= 56) { fiss->optcol = 0; fiss->optshp = 3; } // collective enhancement parameters fiss->ucr = 40.; fiss->dcr = 10.; // switch for temperature constant model (CTM) fiss->optct = 1; ald->optafan = 0; ald->av = 0.0730; ald->as = 0.0950; ald->ak = 0.0000; fiss->optxfis = 3; // Multi-fragmentation T_freeze_out_in = -6.5; } void G4Abla::mglw(G4double a, G4double z, G4double* el) { // MODEL DE LA GOUTTE LIQUIDE DE C. F. WEIZSACKER. // USUALLY AN OBSOLETE OPTION G4double xv = 0.0, xs = 0.0, xc = 0.0, xa = 0.0; if ((a <= 0.01) || (z < 0.01)) { (*el) = 1.0e38; } else { xv = -15.56 * a; xs = 17.23 * std::pow(a, (2.0 / 3.0)); if (a > 1.0) { xc = 0.7 * z * (z - 1.0) * std::pow((a - 1.0), (-1.e0 / 3.e0)); } else { xc = 0.0; } } xa = 23.6 * (std::pow((a - 2.0 * z), 2) / a); (*el) = xv + xs + xc + xa; return; } void G4Abla::mglms(G4double a, G4double z, G4int refopt4, G4double* el) { // USING FUNCTION EFLMAC(IA,IZ,0) // // REFOPT4 = 0 : WITHOUT MICROSCOPIC CORRECTIONS // REFOPT4 = 1 : WITH SHELL CORRECTION // REFOPT4 = 2 : WITH PAIRING CORRECTION // REFOPT4 = 3 : WITH SHELL- AND PAIRING CORRECTION // 1839 // C----------------------------------------------------------------------- // 1840 C A1 LOCAL MASS NUMBER (INTEGER VARIABLE OF A) // 1841 C Z1 LOCAL NUCLEAR CHARGE (INTEGER VARIABLE OF Z) // 1842 C REFOPT4 OPTION, SPECIFYING THE MASS FORMULA (SEE // ABOVE) 1843 C A MASS NUMBER 1844 C Z // NUCLEAR CHARGE 1845 C DEL PAIRING CORRECTION 1846 // C EL BINDING ENERGY 1847 C ECNZ( , ) TABLE OF // SHELL CORRECTIONS 1848 // C----------------------------------------------------------------------- // 1849 C G4int a1 = idnint(a); G4int z1 = idnint(z); G4int n1 = a1 - z1; if ((a1 <= 0) || (z1 <= 0) || ((a1 - z1) <= 0)) { // then // modif pour recuperer une masse p et n correcte: (*el) = 1.e38; return; // goto mglms50; } else { // binding energy incl. pairing contr. is calculated from // function eflmac (*el) = eflmac(a1, z1, 0, refopt4); if (refopt4 > 0) { if (refopt4 != 2) { (*el) = (*el) + ec2sub->ecnz[a1 - z1][z1]; } } if (z1 >= 90) { if (n1 <= 145) { (*el) = (*el) + (12.552 - 0.1436 * z1); } else { if (n1 > 145 && n1 <= 152) { (*el) = (*el) + ((152.4 - 1.77 * z1) + (-0.972 + 0.0113 * z1) * n1); } } } } return; } G4double G4Abla::spdef(G4int a, G4int z, G4int optxfis) { // INPUT: A,Z,OPTXFIS MASS AND CHARGE OF A NUCLEUS, // OPTION FOR FISSILITY // OUTPUT: SPDEF // ALPHA2 SADDLE POINT DEF. COHEN&SWIATECKI ANN.PHYS. 22 (1963) 406 // RANGING FROM FISSILITY X=0.30 TO X=1.00 IN STEPS OF 0.02 G4int index = 0; G4double x = 0.0, v = 0.0, dx = 0.0; const G4int alpha2Size = 37; // The value 0.0 at alpha2[0] added by PK. G4double alpha2[alpha2Size] = { 0.0, 2.5464e0, 2.4944e0, 2.4410e0, 2.3915e0, 2.3482e0, 2.3014e0, 2.2479e0, 2.1982e0, 2.1432e0, 2.0807e0, 2.0142e0, 1.9419e0, 1.8714e0, 1.8010e0, 1.7272e0, 1.6473e0, 1.5601e0, 1.4526e0, 1.3164e0, 1.1391e0, 0.9662e0, 0.8295e0, 0.7231e0, 0.6360e0, 0.5615e0, 0.4953e0, 0.4354e0, 0.3799e0, 0.3274e0, 0.2779e0, 0.2298e0, 0.1827e0, 0.1373e0, 0.0901e0, 0.0430e0, 0.0000e0 }; dx = 0.02; x = fissility(a, z, 0, 0., 0., optxfis); v = (x - 0.3) / dx + 1.0; index = idnint(v); if (index < 1) { return (alpha2[1]); } if (index == 36) { return (alpha2[36]); } else { return (alpha2[index] + (alpha2[index + 1] - alpha2[index]) / dx * (x - (0.3e0 + dx * (index - 1)))); } return alpha2[0]; // The algorithm is not supposed to reach this point. } G4double G4Abla::fissility(G4int a, G4int z, G4int ny, G4double sn, G4double slam, G4int optxfis) { // CALCULATION OF FISSILITY PARAMETER // // INPUT: A,Z INTEGER MASS & CHARGE OF NUCLEUS // OPTXFIS = 0 : MYERS, SWIATECKI // 1 : DAHLINGER // 2 : ANDREYEV G4double aa = 0.0, zz = 0.0, i = 0.0, z2a, C_S, R, W, G, G1, G2, A_CC; G4double fissilityResult = 0.0; aa = G4double(a); zz = G4double(z); i = G4double(a - 2 * z) / aa; z2a = zz * zz / aa - ny * (1115. - 939. + sn - slam) / (0.7053 * std::pow(a, 2. / 3.)); // myers & swiatecki droplet modell if (optxfis == 0) { // then fissilityResult = std::pow(zz, 2) / aa / 50.8830e0 / (1.0e0 - 1.7826e0 * std::pow(i, 2)); } if (optxfis == 1) { // dahlinger fit: fissilityResult = std::pow(zz, 2) / aa * std::pow((49.22e0 * (1.e0 - 0.3803e0 * std::pow(i, 2) - 20.489e0 * std::pow(i, 4))), (-1)); } if (optxfis == 2) { // dubna fit: fissilityResult = std::pow(zz, 2) / aa / (48.e0 * (1.e0 - 17.22e0 * std::pow(i, 4))); } if (optxfis == 3) { // Fissiilty is calculated according to FRLDM, see Sierk, PRC 1984. C_S = 21.13 * (1.0 - 2.3 * i * i); R = 1.16 * std::pow(aa, 1.0 / 3.0); W = 0.704 / R; G1 = 1.0 - 15.0 / 8.0 * W + 21.0 / 8.0 * W * W * W; G2 = 1.0 + 9.0 / 2.0 * W + 7.0 * W * W + 7.0 / 2.0 * W * W * W; G = 1.0 - 5.0 * W * W * (G1 - 3.0 / 4.0 * G2 * std::exp(-2.0 / W)); A_CC = 3.0 / 5.0 * 1.44 * G / 1.16; fissilityResult = z2a * A_CC / (2.0 * C_S); } if (fissilityResult > 1.0) { fissilityResult = 1.0; } if (fissilityResult < 0.0) { fissilityResult = 0.0; } return fissilityResult; } void G4Abla::evapora(G4double zprf, G4double aprf, G4double* ee_par, G4double jprf_par, G4double* zf_par, G4double* af_par, G4double* mtota_par, G4double* vleva_par, G4double* vxeva_par, G4double* vyeva_par, G4int* ff_par, G4int* fimf_par, G4double* fzimf, G4double* faimf, G4double* tkeimf_par, G4double* jprfout, G4int* inttype_par, G4int* inum_par, G4double EV_TEMP[indexpart][6], G4int* iev_tab_temp_par, G4int* NbLam0_par) { G4double zf = zprf; G4double af = aprf; G4double ee = (*ee_par); G4double jprf = dint(jprf_par); G4double mtota = (*mtota_par); G4double vleva = 0.; G4double vxeva = 0.; G4double vyeva = 0.; G4int ff = (*ff_par); G4int fimf = (*fimf_par); G4double tkeimf = (*tkeimf_par); G4int inttype = (*inttype_par); G4int inum = (*inum_par); G4int NbLam0 = (*NbLam0_par); // 533 C // 534 C INPUT: // 535 C // 536 C ZPRF, APRF, EE(EE IS MODIFIED!), JPRF // 537 C // 538 C PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS // 539 C COMMON /ABRAMAIN/ // AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC, 540 C R_0,R_P,R_T, // IMAX,IRNDM,PI, 541 C BFPRO,SNPRO,SPPRO,SHELL // 542 C // 543 C AP,ZP,AT,ZT - PROJECTILE AND TARGET MASSES // 544 C EAP,BETA - BEAM ENERGY PER NUCLEON, V/C // 545 C BMAXNUC - MAX. IMPACT PARAMETER FOR NUCL. REAC. // 546 C CRTOT,CRNUC - TOTAL AND NUCLEAR REACTION CROSS SECTION // 547 C R_0,R_P,R_T, - RADIUS PARAMETER, PROJECTILE+ TARGET RADII // 548 C IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141... // 549 C BFPRO - FISSION BARRIER OF THE PROJECTILE // 550 C SNPRO - NEUTRON SEPARATION ENERGY OF THE // PROJECTILE 551 C SPPRO - PROTON " " " " " // 552 C SHELL - GROUND STATE SHELL CORRECTION // 553 C // 554 // C--------------------------------------------------------------------- // 555 C FISSION BARRIERS // 556 C COMMON /FB/ EFA // 557 C EFA - ARRAY OF FISSION BARRIERS // 558 // C--------------------------------------------------------------------- // 559 C OUTPUT: // 560 C ZF, AF, MTOTA, PLEVA, PTEVA, FF, INTTYPE, INUM // 561 C // 562 C ZF,AF - CHARGE AND MASS OF FINAL FRAGMENT AFTER // EVAPORATION 563 C MTOTA _ NUMBER OF EVAPORATED ALPHAS 564 C // PLEVA,PXEVA,PYEVA - MOMENTUM RECOIL BY EVAPORATION 565 C INTTYPE - // TYPE OF REACTION 0/1 NUCLEAR OR ELECTROMAGNETIC 566 C FF - 0/1 // NO FISSION / FISSION EVENT 567 C INUM - EVENTNUMBER 568 C // ____________________________________________________________________ 569 // C / 570 C / CALCUL DE LA MASSE ET CHARGE FINALES D'UNE CHAINE // D'EVAPORATION 571 C / // 572 C / PROCEDURE FOR CALCULATING THE FINAL MASS AND CHARGE VALUES // OF A // 573 C / SPECIFIC EVAPORATION CHAIN, STARTING POINT DEFINED BY // (APRF, ZPRF, 574 C / EE) 575 C / On ajoute les 3 // composantes de l'impulsion (PXEVA,PYEVA,PLEVA) // 576 C / (actuellement PTEVA n'est pas correct; mauvaise // norme...) 577 C // /____________________________________________________________________ // 578 C // 612 C // 613 // C----------------------------------------------------------------------- // 614 C IRNDM DUMMY ARGUMENT FOR RANDOM-NUMBER // FUNCTION 615 C SORTIE LOCAL HELP VARIABLE TO END THE // EVAPORATION CHAIN 616 C ZF NUCLEAR CHARGE OF THE // FRAGMENT 617 C ZPRF NUCLEAR CHARGE OF THE // PREFRAGMENT 618 C AF MASS NUMBER OF THE FRAGMENT 619 // C APRF MASS NUMBER OF THE PREFRAGMENT // 620 C EPSILN ENERGY BURNED IN EACH EVAPORATION STEP // 621 C MALPHA LOCAL MASS CONTRIBUTION TO MTOTA IN EACH // EVAPORATION 622 C STEP 623 C EE // EXCITATION ENERGY (VARIABLE) 624 C PROBP PROTON // EMISSION PROBABILITY 625 C PROBN NEUTRON EMISSION // PROBABILITY 626 C PROBA ALPHA-PARTICLE EMISSION // PROBABILITY 627 C PTOTL TOTAL EMISSION PROBABILITY 628 // C E LOWEST PARTICLE-THRESHOLD ENERGY 629 C SN // NEUTRON SEPARATION ENERGY 630 C SBP PROTON // SEPARATION ENERGY PLUS EFFECTIVE COULOMB 631 C BARRIER 632 C SBA // ALPHA-PARTICLE SEPARATION ENERGY PLUS EFFECTIVE 633 C COULOMB // BARRIER 634 C BP EFFECTIVE PROTON COULOMB BARRIER // 635 C BA EFFECTIVE ALPHA COULOMB BARRIER // 636 C MTOTA TOTAL MASS OF THE EVAPORATED ALPHA // PARTICLES 637 C X UNIFORM RANDOM NUMBER FOR // NUCLEAR CHARGE // 638 C AMOINS LOCAL MASS NUMBER OF EVAPORATED PARTICLE // 639 C ZMOINS LOCAL NUCLEAR CHARGE OF EVAPORATED PARTICLE // 640 C ECP KINETIC ENERGY OF PROTON WITHOUT COULOMB // 641 C REPULSION // 642 C ECN KINETIC ENERGY OF NEUTRON // 643 C ECA KINETIC ENERGY OF ALPHA PARTICLE WITHOUT // COULOMB 644 C REPULSION 645 C PLEVA // TRANSVERSAL RECOIL MOMENTUM OF EVAPORATION 646 C PTEVA LONGITUDINAL // RECOIL MOMENTUM OF EVAPORATION 647 C FF FISSION // FLAG 648 C INTTYPE INTERACTION TYPE FLAG // 649 C RNDX RECOIL MOMENTUM IN X-DIRECTION IN A // SINGLE STEP 650 C RNDY RECOIL MOMENTUM IN Y-DIRECTION // IN A SINGLE STEP 651 C RNDZ RECOIL MOMENTUM IN // Z-DIRECTION IN A SINGLE STEP // 652 C RNDN NORMALIZATION OF RECOIL MOMENTUM FOR // EACH STEP 653 // C----------------------------------------------------------------------- // 654 C // 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, probimf = 0.0, problamb0 = 0.0, ptotl = 0.0, e = 0.0, tcn = 0.0; 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, sp = 0.0, sd = 0.0, st = 0.0, she = 0.0, sa = 0.0, slamb0 = 0.0; 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, bd = 0.0, bt = 0.0, bhe = 0.0, ba = 0.0; G4double zimf = 0.0, aimf = 0.0, bimf = 0.0, sbimf = 0.0, timf = 0.0; G4int itest = 0, sortie = 0; G4double probf = 0.0; G4double ctet1 = 0.0, stet1 = 0.0, phi1 = 0.0; G4double rnd = 0.0; G4double ef = 0.0; G4double ts1 = 0.0; G4int fgamma = 0, gammadecay = 0, flamb0decay = 0; G4double pc = 0.0, malpha = 0.0; G4double jprfn = 0.0, jprfp = 0.0, jprfd = 0.0, jprft = 0.0, jprfhe = 0.0, jprfa = 0.0, jprflamb0 = 0.0; G4double tsum = 0.0; G4int twon; const G4double c = 29.9792458; const G4double mu = 931.494; const G4double mu2 = 931.494 * 931.494; G4double pleva = 0.0; G4double pxeva = 0.0; G4double pyeva = 0.0; G4int IEV_TAB_TEMP = 0; for (G4int I1 = 0; I1 < indexpart; I1++) for (G4int I2 = 0; I2 < 6; I2++) EV_TEMP[I1][I2] = 0.0; // ff = 0; itest = 0; // evapora10: // // calculation of the probabilities for the different decay channels // plus separation energies and kinetic energies of the particles // if (ee < 0. || zf < 3.) goto evapora100; direct(zf, af, ee, jprf, &probp, &probd, &probt, &probn, &probhe, &proba, &probg, &probimf, &probf, &problamb0, &ptotl, &sn, &sbp, &sbd, &sbt, &sbhe, &sba, &slamb0, &ecn, &ecp, &ecd, &ect, &eche, &eca, &ecg, &eclamb0, &bp, &bd, &bt, &bhe, &ba, &sp, &sd, &st, &she, &sa, &ef, &ts1, inttype, inum, itest, &sortie, &tcn, &jprfn, &jprfp, &jprfd, &jprft, &jprfhe, &jprfa, &jprflamb0, &tsum, NbLam0); // // HERE THE FINAL STEPS OF THE EVAPORATION ARE CALCULATED // if (ptotl == 0.0) goto evapora100; e = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); if (e > 1e30) std::cout << "ERROR AT THE EXIT OF EVAPORA,E>1.D30,AF=" << af << " ZF=" << zf << std::endl; if (sortie == 1) { if (probn != 0.0) { amoins = 1.0; zmoins = 0.0; epsiln = sn + ecn; pc = std::sqrt(std::pow((1.0 + (ecn) / 9.3956e2), 2.) - 1.0) * 9.3956e2; malpha = 0.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } else if (probp != 0.0) { amoins = 1.0; zmoins = 1.0; epsiln = sp + ecp; pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2.) - 1.0) * 9.3827e2; malpha = 0.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } else if (probd != 0.0) { amoins = 2.0; zmoins = 1.0; epsiln = sd + ecd; pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; malpha = 0.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } else if (probt != 0.0) { amoins = 3.0; zmoins = 1.0; epsiln = st + ect; pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; malpha = 0.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } else if (probhe != 0.0) { amoins = 3.0; zmoins = 2.0; epsiln = she + eche; pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; malpha = 0.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } else { if (proba != 0.0) { amoins = 4.0; zmoins = 2.0; epsiln = sa + eca; pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; malpha = 4.0; fgamma = 0; fimf = 0; flamb0decay = 0; gammadecay = 0; } } goto direct99; } // here the normal evaporation cascade starts // random number for the evaporation x = G4AblaRandom::flat() * ptotl; itest = 0; if (x < proba) { // alpha evaporation amoins = 4.0; zmoins = 2.0; epsiln = sa + eca; pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; malpha = 4.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprfa; } else if (x < proba + probhe) { // He3 evaporation amoins = 3.0; zmoins = 2.0; epsiln = she + eche; pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprfhe; } else if (x < proba + probhe + probt) { // triton evaporation amoins = 3.0; zmoins = 1.0; epsiln = st + ect; pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprft; } else if (x < proba + probhe + probt + probd) { // deuteron evaporation amoins = 2.0; zmoins = 1.0; epsiln = sd + ecd; pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprfd; } else if (x < proba + probhe + probt + probd + probp) { // proton evaporation amoins = 1.0; zmoins = 1.0; epsiln = sp + ecp; pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2) - 1.0) * 9.3827e2; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprfp; } else if (x < proba + probhe + probt + probd + probp + probn) { // neutron evaporation amoins = 1.0; zmoins = 0.0; epsiln = sn + ecn; pc = std::sqrt(std::pow((1.0 + (ecn) / 9.3956e2), 2.) - 1.0) * 9.3956e2; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 0; gammadecay = 0; jprf = jprfn; } else if (x < proba + probhe + probt + probd + probp + probn + problamb0) { // lambda0 evaporation amoins = 1.0; zmoins = 0.0; epsiln = slamb0 + eclamb0; pc = std::sqrt(std::pow((1.0 + (eclamb0) / 11.1568e2), 2.) - 1.0) * 11.1568e2; malpha = 0.0; fgamma = 0; fimf = 0; ff = 0; flamb0decay = 1; opt->nblan0 = opt->nblan0 - 1; NbLam0 = NbLam0 - 1; gammadecay = 0; jprf = jprflamb0; } else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg) { // gamma evaporation amoins = 0.0; zmoins = 0.0; epsiln = ecg; pc = ecg; malpha = 0.0; flamb0decay = 0; gammadecay = 1; // Next IF command is to shorten the calculations when gamma-emission is the // only possible channel if (probp == 0.0 && probn == 0.0 && probd == 0.0 && probt == 0.0 && proba == 0.0 && probhe == 0.0 && problamb0 == 0.0 && probimf == 0.0 && probf == 0.0) fgamma = 1; fimf = 0; ff = 0; } else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg + probimf) { // imf evaporation // AIMF and ZIMF obtained from complete procedure (integration over all // possible Gamma(IMF) and then randomly picked G4int iloop = 0; dir1973: imf(af, zf, tcn, ee, &zimf, &aimf, &bimf, &sbimf, &timf, jprf); iloop++; if (iloop > 100) std::cout << "Problem in EVAPORA: IMF called > 100 times" << std::endl; if (zimf >= (zf - 2.0)) goto dir1973; if (zimf > zf / 2.0) { zimf = zf - zimf; aimf = af - aimf; } // These cases should in principle never happen if (zimf == 0.0 || aimf == 0.0 || sbimf > ee) std::cout << "warning: Look in EVAPORA CALL IMF" << std::endl; // I sample the total kinetic energy consumed by the system of two nuclei // from the distribution determined with the temperature at saddle point // TKEIMF is the kinetic energy in the centre of mass of IMF and its partner G4int ii = 0; dir1235: tkeimf = fmaxhaz(timf); ii++; if (ii > 100) { tkeimf = min(2.0 * timf, ee - sbimf); goto dir1000; } if (tkeimf <= 0.0) goto dir1235; if (tkeimf > (ee - sbimf) && timf > 0.5) goto dir1235; dir1000: tkeimf = tkeimf + bimf; amoins = aimf; zmoins = zimf; epsiln = (sbimf - bimf) + tkeimf; pc = 0.0; malpha = 0.0; fgamma = 0; fimf = 1; ff = 0; flamb0decay = 0; gammadecay = 0; } else { // fission // in case of fission-events the fragment nucleus is the mother nucleus // before fission occurs with excitation energy above the fis.- barrier. // fission fragment mass distribution is calulated in subroutine fisdis amoins = 0.0; zmoins = 0.0; epsiln = ef; // malpha = 0.0; pc = 0.0; ff = 1; fimf = 0; fgamma = 0; flamb0decay = 0; gammadecay = 0; } // direct99: if (ee <= 0.01) ee = 0.01; // Davide Mancusi (DM) - 2010 if (gammadecay == 1 && ee < (epsiln + 0.010)) { epsiln = ee - 0.010; // fgamma = 1; } if (epsiln < 0.0) { std::cout << "***WARNING epsilon<0***" << std::endl; // epsiln=0.; // PRINT*,IDECAYMODE,IDNINT(AF),IDNINT(ZF),EE,EPSILN } // calculation of the daughter nucleus af = af - amoins; zf = zf - zmoins; ee = ee - epsiln; if (ee <= 0.01) ee = 0.01; mtota = mtota + malpha; // if(amoins==2 && zmoins==0)std::cout << ee << std::endl; secondneutron: if (amoins == 2 && zmoins == 0) { twon = 1; amoins = 1; } else { twon = 0; } // Determination of x,y,z components of momentum from known emission momentum // PC if (ff == 0 && fimf == 0) { // if (flamb0decay == 1) { EV_TEMP[IEV_TAB_TEMP][0] = 0.; EV_TEMP[IEV_TAB_TEMP][1] = -2; EV_TEMP[IEV_TAB_TEMP][5] = 1.; } else { EV_TEMP[IEV_TAB_TEMP][0] = zmoins; EV_TEMP[IEV_TAB_TEMP][1] = amoins; EV_TEMP[IEV_TAB_TEMP][5] = 0.; } rnd = G4AblaRandom::flat(); ctet1 = 2.0 * rnd - 1.0; // z component: uniform probability between -1 and 1 stet1 = std::sqrt(1.0 - std::pow(ctet1, 2)); // component perpendicular to z rnd = G4AblaRandom::flat(); phi1 = rnd * 2.0 * 3.141592654; // angle in x-y plane: uniform probability // between 0 and 2*pi G4double xcv = stet1 * std::cos(phi1); // x component G4double ycv = stet1 * std::sin(phi1); // y component G4double zcv = ctet1; // z component // In the CM system if (gammadecay == 0) { // Light particle G4double ETOT_LP = std::sqrt(pc * pc + amoins * amoins * mu2); if (flamb0decay == 1) ETOT_LP = std::sqrt(pc * pc + 1115.683 * 1115.683); EV_TEMP[IEV_TAB_TEMP][2] = c * pc * xcv / ETOT_LP; EV_TEMP[IEV_TAB_TEMP][3] = c * pc * ycv / ETOT_LP; EV_TEMP[IEV_TAB_TEMP][4] = c * pc * zcv / ETOT_LP; } else { // gamma ray EV_TEMP[IEV_TAB_TEMP][2] = pc * xcv; EV_TEMP[IEV_TAB_TEMP][3] = pc * ycv; EV_TEMP[IEV_TAB_TEMP][4] = pc * zcv; } G4double VXOUT = 0., VYOUT = 0., VZOUT = 0.; lorentz_boost(vxeva, vyeva, vleva, EV_TEMP[IEV_TAB_TEMP][2], EV_TEMP[IEV_TAB_TEMP][3], EV_TEMP[IEV_TAB_TEMP][4], &VXOUT, &VYOUT, &VZOUT); EV_TEMP[IEV_TAB_TEMP][2] = VXOUT; EV_TEMP[IEV_TAB_TEMP][3] = VYOUT; EV_TEMP[IEV_TAB_TEMP][4] = VZOUT; // Heavy residue if (gammadecay == 0) { G4double v2 = std::pow(EV_TEMP[IEV_TAB_TEMP][2], 2.) + std::pow(EV_TEMP[IEV_TAB_TEMP][3], 2.) + std::pow(EV_TEMP[IEV_TAB_TEMP][4], 2.); G4double gamma = 1.0 / std::sqrt(1.0 - v2 / (c * c)); G4double etot_lp = amoins * mu * gamma; pxeva = pxeva - EV_TEMP[IEV_TAB_TEMP][2] * etot_lp / c; pyeva = pyeva - EV_TEMP[IEV_TAB_TEMP][3] * etot_lp / c; pleva = pleva - EV_TEMP[IEV_TAB_TEMP][4] * etot_lp / c; } else { // in case of gammas, EV_TEMP contains momentum components and not // velocity pxeva = pxeva - EV_TEMP[IEV_TAB_TEMP][2]; pyeva = pyeva - EV_TEMP[IEV_TAB_TEMP][3]; pleva = pleva - EV_TEMP[IEV_TAB_TEMP][4]; } G4double pteva = std::sqrt(pxeva * pxeva + pyeva * pyeva); // To be checked: G4double etot = std::sqrt(pleva * pleva + pteva * pteva + af * af * mu2); vxeva = c * pxeva / etot; // recoil velocity components of residue due to evaporation vyeva = c * pyeva / etot; vleva = c * pleva / etot; IEV_TAB_TEMP = IEV_TAB_TEMP + 1; } if (twon == 1) { goto secondneutron; } // condition for end of evaporation if (zf < 3. || (ff == 1) || (fgamma == 1) || (fimf == 1)) { goto evapora100; } goto evapora10; evapora100: (*zf_par) = zf; (*af_par) = af; (*ee_par) = ee; (*faimf) = aimf; (*fzimf) = zimf; (*jprfout) = jprf; (*tkeimf_par) = tkeimf; (*mtota_par) = mtota; (*vleva_par) = vleva; (*vxeva_par) = vxeva; (*vyeva_par) = vyeva; (*ff_par) = ff; (*fimf_par) = fimf; (*inttype_par) = inttype; (*iev_tab_temp_par) = IEV_TAB_TEMP; (*inum_par) = inum; (*NbLam0_par) = NbLam0; return; } void G4Abla::direct(G4double zprf, G4double a, G4double ee, G4double jprf, G4double* probp_par, G4double* probd_par, G4double* probt_par, G4double* probn_par, G4double* probhe_par, G4double* proba_par, G4double* probg_par, G4double* probimf_par, G4double* probf_par, G4double* problamb0_par, G4double* ptotl_par, G4double* sn_par, G4double* sbp_par, G4double* sbd_par, G4double* sbt_par, G4double* sbhe_par, G4double* sba_par, G4double* slamb0_par, G4double* ecn_par, G4double* ecp_par, G4double* ecd_par, G4double* ect_par, G4double* eche_par, G4double* eca_par, G4double* ecg_par, G4double* eclamb0_par, G4double* bp_par, G4double* bd_par, G4double* bt_par, G4double* bhe_par, G4double* ba_par, G4double* sp_par, G4double* sd_par, G4double* st_par, G4double* she_par, G4double* sa_par, G4double* ef_par, G4double* ts1_par, G4int, G4int inum, G4int itest, G4int* sortie, G4double* tcn, G4double* jprfn_par, G4double* jprfp_par, G4double* jprfd_par, G4double* jprft_par, G4double* jprfhe_par, G4double* jprfa_par, G4double* jprflamb0_par, G4double* tsum_par, G4int NbLam0) { G4double probp = (*probp_par); G4double probd = (*probd_par); G4double probt = (*probt_par); G4double probn = (*probn_par); G4double probhe = (*probhe_par); G4double proba = (*proba_par); G4double probg = (*probg_par); G4double probimf = (*probimf_par); G4double probf = (*probf_par); G4double problamb0 = (*problamb0_par); G4double ptotl = (*ptotl_par); G4double sn = (*sn_par); G4double sp = (*sp_par); G4double sd = (*sd_par); G4double st = (*st_par); G4double she = (*she_par); G4double sa = (*sa_par); G4double slamb0 = 0.0; G4double sbp = (*sbp_par); G4double sbd = (*sbd_par); G4double sbt = (*sbt_par); G4double sbhe = (*sbhe_par); G4double sba = (*sba_par); G4double ecn = (*ecn_par); G4double ecp = (*ecp_par); G4double ecd = (*ecd_par); G4double ect = (*ect_par); G4double eche = (*eche_par); G4double eca = (*eca_par); G4double ecg = (*ecg_par); G4double eclamb0 = (*eclamb0_par); G4double bp = (*bp_par); G4double bd = (*bd_par); G4double bt = (*bt_par); G4double bhe = (*bhe_par); G4double ba = (*ba_par); G4double tsum = (*tsum_par); // CALCULATION OF PARTICLE-EMISSION PROBABILITIES & FISSION / // BASED ON THE SIMPLIFIED FORMULAS FOR THE DECAY WIDTH BY / // MORETTO, ROCHESTER MEETING TO AVOID COMPUTING TIME / // INTENSIVE INTEGRATION OF THE LEVEL DENSITIES / // USES EFFECTIVE COULOMB BARRIERS AND AN AVERAGE KINETIC ENERGY/ // OF THE EVAPORATED PARTICLES / // COLLECTIVE ENHANCMENT OF THE LEVEL DENSITY IS INCLUDED / // DYNAMICAL HINDRANCE OF FISSION IS INCLUDED BY A STEP FUNCTION/ // APPROXIMATION. SEE A.R. JUNGHANS DIPLOMA THESIS / // SHELL AND PAIRING STRUCTURES IN THE LEVEL DENSITY IS INCLUDED/ // INPUT: // ZPRF,A,EE CHARGE, MASS, EXCITATION ENERGY OF COMPOUND // NUCLEUS // JPRF ROOT-MEAN-SQUARED ANGULAR MOMENTUM // DEFORMATIONS AND G.S. SHELL EFFECTS // COMMON /ECLD/ ECGNZ,ECFNZ,VGSLD,ALPHA // ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S. // ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0) // VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE // ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!) // BETA2 = SQRT((4PI)/5) * ALPHA // OPTIONS AND PARAMETERS FOR FISSION CHANNEL // COMMON /FISS/ AKAP,BET,HOMEGA,KOEFF,IFIS, // OPTSHP,OPTXFIS,OPTLES,OPTCOL // // AKAP - HBAR**2/(2* MN * R_0**2) = 10 MEV, R_0 = 1.4 FM // BET - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1) // HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV // KOEFF - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0 // IFIS - 0/1 FISSION CHANNEL OFF/ON // OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY // = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY // = 1 SHELL , NO PAIRING // = 2 PAIRING, NO SHELL // = 3 SHELL AND PAIRING // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF // OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV // FISSILITY PARAMETER. // OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224 // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON // LEVEL DENSITY PARAMETERS // COMMON /ALD/ AV,AS,AK,OPTAFAN // AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE // LEVEL DENSITY PARAMETER // OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1 // RECOMMENDED IS OPTAFAN = 0 // FISSION BARRIERS // COMMON /FB/ EFA // EFA - ARRAY OF FISSION BARRIERS // OUTPUT: PROBN,PROBP,PROBA,PROBF,PTOTL: // - EMISSION PROBABILITIES FOR N EUTRON, P ROTON, A LPHA // PARTICLES, F ISSION AND NORMALISATION // SN,SBP,SBA: SEPARATION ENERGIES N P A // INCLUDING EFFECTIVE BARRIERS // ECN,ECP,ECA,BP,BA // - AVERAGE KINETIC ENERGIES (2*T) AND EFFECTIVE BARRIERS G4double bk = 0.0; G4double bksp = 0.0; G4double bc = 0.0; G4int afp = 0; G4double het = 0.0; G4double at = 0.0; G4double bs = 0.0; G4double bssp = 0.0; G4double bshell = 0.0; G4double cf = 0.0; G4double defbet = 0.0; G4double densa = 0.0; G4double denshe = 0.0; G4double densg = 0.0; G4double densn = 0.0; G4double densp = 0.0; G4double densd = 0.0; G4double denst = 0.0; G4double denslamb0 = 0.0; G4double eer = 0.0; G4double ecor = 0.0; G4double ef = 0.0; G4double ft = 0.0; G4double timf = 0.0; G4double qr = 0.0; G4double qrcn = 0.0; G4double omegap = 0.0; G4double omegad = 0.0; G4double omegat = 0.0; G4double omegahe = 0.0; G4double omegaa = 0.0; G4double ga = 0.0; G4double ghe = 0.0; G4double gf = 0.0; G4double gff = 0.0; G4double gn = 0.0; G4double gp = 0.0; G4double gd = 0.0; G4double gt = 0.0; G4double gg = 0.0; G4double glamb0 = 0.0; G4double gimf = 0.0; G4double gimf3 = 0.0; G4double gimf5 = 0.0; G4double bimf = 0.0; G4double bsimf = 0.0; G4double sbimf = 0.0; G4double densimf = 0.0; G4double defbetimf = 0.0; G4double b_imf = 0.0; G4double a_imf = 0.0; G4double omegaimf = 0.0; G4int izimf = 0; G4double zimf = 0.0; G4double gsum = 0.0; G4double gtotal = 0.0; G4double hbar = 6.582122e-22; G4double emin = 0.0; G4int il = 0; G4int choice_fisspart = 0; G4double t_lapse = 0.0; G4int imaxwell = 0; G4int in = 0; G4int iz = 0; G4int ind = 0; G4int izd = 0; G4int j = 0; G4int k = 0; G4double ma1z = 0.0; G4double mazz = 0.0; G4double ma2z = 0.0; G4double ma1z1 = 0.0; G4double ma2z1 = 0.0; G4double ma3z1 = 0.0; G4double ma3z2 = 0.0; G4double ma4z2 = 0.0; G4double maz = 0.0; G4double nt = 0.0; G4double pi = 3.1415926535; G4double pt = 0.0; G4double dt = 0.0; G4double tt = 0.0; G4double lamb0t = 0.0; G4double gtemp = 0.0; G4double rdt = 0.0; G4double rtt = 0.0; G4double rat = 0.0; G4double rhet = 0.0; G4double refmod = 0.0; G4double rnt = 0.0; G4double rpt = 0.0; G4double rlamb0t = 0.0; G4double sbfis = 1.e40; G4double segs = 0.0; G4double selmax = 0.0; G4double tauc = 0.0; G4double temp = 0.0; G4double ts1 = 0.0; G4double xx = 0.0; G4double y = 0.0; G4double k1 = 0.0; G4double omegasp = 0.0; G4double homegasp = 0.0; G4double omegags = 0.0; G4double homegags = 0.0; G4double pa = 0.0; G4double gamma = 0.0; G4double gfactor = 0.0; G4double bscn; G4double bkcn; G4double bccn; G4double ftcn = 0.0; G4double mfcd; G4double jprfn = jprf; G4double jprfp = jprf; G4double jprfd = jprf; G4double jprft = jprf; G4double jprfhe = jprf; G4double jprfa = jprf; G4double jprflamb0 = jprf; G4double djprf = 0.0; G4double dlout = 0.0; G4double sdlout = 0.0; G4double iinert = 0.0; G4double erot = 0.0; G4double erotn = 0.0; G4double erotp = 0.0; G4double erotd = 0.0; G4double erott = 0.0; G4double erothe = 0.0; G4double erota = 0.0; G4double erotlamb0 = 0.0; G4double erotcn = 0.0; // G4double ecorcn=0.0; G4double imfarg = 0.0; G4double width_imf = 0.0; G4int IDjprf = 0; G4int fimf_allowed = opt->optimfallowed; if (itest == 1) { } // Switch to calculate Maxwellian distribution of kinetic energies imaxwell = 1; *sortie = 0; // just a change of name until the end of this subroutine eer = ee; if (inum == 1) { ilast = 1; } // calculation of masses // refmod = 1 ==> myers,swiatecki model // refmod = 0 ==> weizsaecker model refmod = 1; // Default = 1 // if (refmod == 1) { mglms(a, zprf, fiss->optshp, &maz); mglms(a - 1.0, zprf, fiss->optshp, &ma1z); mglms(a - 2.0, zprf, fiss->optshp, &ma2z); mglms(a - 1.0, zprf - 1.0, fiss->optshp, &ma1z1); mglms(a - 2.0, zprf - 1.0, fiss->optshp, &ma2z1); mglms(a - 3.0, zprf - 1.0, fiss->optshp, &ma3z1); mglms(a - 3.0, zprf - 2.0, fiss->optshp, &ma3z2); mglms(a - 4.0, zprf - 2.0, fiss->optshp, &ma4z2); } else { mglw(a, zprf, &maz); mglw(a - 1.0, zprf, &ma1z); mglw(a - 1.0, zprf - 1.0, &ma1z1); mglw(a - 2.0, zprf - 1.0, &ma2z1); mglw(a - 3.0, zprf - 1.0, &ma3z1); mglw(a - 3.0, zprf - 2.0, &ma3z2); mglw(a - 4.0, zprf - 2.0, &ma4z2); } if ((a - 1.) == 3.0 && (zprf - 1.0) == 2.0) ma1z1 = -7.7181660; if ((a - 1.) == 4.0 && (zprf - 1.0) == 2.0) ma1z1 = -28.295992; // separation energies sn = ma1z - maz; sp = ma1z1 - maz; sd = ma2z1 - maz - 2.2246; st = ma3z1 - maz - 8.481977; she = ma3z2 - maz - 7.7181660; sa = ma4z2 - maz - 28.295992; // if (NbLam0 > 1) { sn = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0); sp = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf - 1., NbLam0); sd = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 2., zprf - 1., NbLam0); st = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 1., NbLam0); she = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 2., NbLam0); sa = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 4., zprf - 2., NbLam0); slamb0 = gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0 - 1); } if (NbLam0 == 1) { G4double deltasn = sn - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 1., zprf, 0)); G4double deltasp = sp - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 1., zprf - 1, 0)); G4double deltasd = sd - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 2., zprf - 1, 0)); G4double deltast = st - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 3., zprf - 1, 0)); G4double deltashe = she - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 3., zprf - 2, 0)); G4double deltasa = sa - (gethyperbinding(a, zprf, 0) - gethyperbinding(a - 4., zprf - 2, 0)); sn = deltasn + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf, NbLam0); sp = deltasp + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 1., zprf - 1., NbLam0); sd = deltasd + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 2., zprf - 1., NbLam0); st = deltast + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 1., NbLam0); she = deltashe + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 3., zprf - 2., NbLam0); sa = deltasa + gethyperbinding(a, zprf, NbLam0) - gethyperbinding(a - 4., zprf - 2., NbLam0); slamb0 = gethyperseparation(a, zprf, NbLam0); } // coulomb barriers // Proton if (zprf <= 1.0e0 || a <= 1.0e0 || (a - zprf) < 0.0) { sbp = 1.0e75; bp = 1.0e75; } else { barrs(idnint(zprf - 1.), idnint(a - 1.), 1, 1, &bp, &omegap); bp = max(bp, 0.1); sbp = sp + bp; } // Deuteron if (zprf <= 1.0e0 || a <= 2.0e0 || (a - zprf) < 1.0) { sbd = 1.0e75; bd = 1.0e75; } else { barrs(idnint(zprf - 1.), idnint(a - 2.), 1, 2, &bd, &omegad); bd = max(bd, 0.1); sbd = sd + bd; } // Triton if (zprf <= 1.0e0 || a <= 3.0e0 || (a - zprf) < 2.0) { sbt = 1.0e75; bt = 1.0e75; } else { barrs(idnint(zprf - 1.), idnint(a - 3.), 1, 3, &bt, &omegat); bt = max(bt, 0.1); sbt = st + bt; } // Alpha if (a - 4.0 <= 0.0 || zprf <= 2.0 || (a - zprf) < 2.0) { sba = 1.0e+75; ba = 1.0e+75; } else { barrs(idnint(zprf - 2.), idnint(a - 4.), 2, 4, &ba, &omegaa); ba = max(ba, 0.1); sba = sa + ba; } // He3 if (a - 3.0 <= 0.0 || zprf <= 2.0 || (a - zprf) < 1.0) { sbhe = 1.0e+75; bhe = 1.0e+75; } else { barrs(idnint(zprf - 2.), idnint(a - 3.), 2, 3, &bhe, &omegahe); bhe = max(bhe, 0.1); sbhe = she + bhe; } // Dealing with particle-unbound systems emin = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); if (emin <= 0.0) { *sortie = 1; unbound(sn, sp, sd, st, she, sa, bp, bd, bt, bhe, ba, &probf, &probn, &probp, &probd, &probt, &probhe, &proba, &probimf, &probg, &ecn, &ecp, &ecd, &ect, &eche, &eca); goto direct70; } // k = idnint(zprf); j = idnint(a - zprf); if (fiss->ifis > 0) { // now ef is calculated from efa that depends on the subroutine // barfit which takes into account the modification on the ang. mom. // note *** shell correction (ecgnz) il = idnint(jprf); barfit(k, k + j, il, &sbfis, &segs, &selmax); if ((fiss->optshp == 1) || (fiss->optshp == 3)) { ef = G4double(sbfis) - ecld->ecgnz[j][k]; // JLRS - Nov 2016 - Corrected values of fission barriers for actinides if (k == 90) { if (mod(j, 2) == 1) { ef = ef * (4.5114 - 2.2687 * (a - zprf) / zprf); } else { ef = ef * (3.3931 - 1.5338 * (a - zprf) / zprf); } } if (k == 92) { if ((a - zprf) / zprf > 1.52) ef = ef * (1.1222 - 0.10886 * (a - zprf) / zprf) - 0.1; } if (k >= 94 && k <= 98 && j < 158) { // Data in this range have been // tested e-e if (mod(j, 2) == 0 && mod(k, 2) == 0) { if (k >= 94) { ef = ef - (11.54108 * (a - zprf) / zprf - 18.074); } } // O-O if (mod(j, 2) == 1 && mod(k, 2) == 1) { if (k >= 95) { ef = ef - (14.567 * (a - zprf) / zprf - 23.266); } } // Odd A if (mod(j, 2) == 0 && mod(k, 2) == 1) { if (j >= 144) { ef = ef - (13.662 * (a - zprf) / zprf - 21.656); } } if (mod(j, 2) == 1 && mod(k, 2) == 0) { if (j >= 144) { ef = ef - (13.662 * (a - zprf) / zprf - 21.656); } } } } else { ef = G4double(sbfis); } // // TO AVOID NEGATIVE VALUES FOR IMPOSSIBLE NUCLEI // THE FISSION BARRIER IS SET TO ZERO IF SMALLER THAN ZERO. // if (ef < 0.0) ef = 0.0; fb->efa[j][k] = ef; // // Hyper-fission barrier // if (NbLam0 > 0) { ef = ef + 0.51 * (1115. - 938. + sn - slamb0) / std::pow(a, 2. / 3.); } // // Set fission barrier // (*ef_par) = ef; // // calculation of surface and curvature integrals needed to // to calculate the level density parameter at the saddle point xx = fissility((k + j), k, NbLam0, sn, slamb0, fiss->optxfis); y = 1.00 - xx; if (y < 0.0) y = 0.0; if (y > 1.0) y = 1.0; bssp = bipol(1, y); bksp = bipol(2, y); } else { ef = 1.0e40; sbfis = 1.0e40; bssp = 1.0; bksp = 1.0; } // // COMPOUND NUCLEUS LEVEL DENSITY // // AK 2007 - Now DENSNIV called with correct BS, BK afp = idnint(a); iz = idnint(zprf); in = afp - iz; bshell = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz]; defbet = ecld->beta2[in][iz]; 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); erot = jprf * jprf * 197.328 * 197.328 / (2. * iinert); erotcn = erot; bsbkbc(a, zprf, &bscn, &bkcn, &bccn); // if(ee > erot+emin){ densniv( a, zprf, ee, 0.0, &densg, bshell, bscn, bkcn, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprf, 0, &qrcn); ftcn = temp; /* //ecorcn = ecor; }else{ // If EE < EROT, only gamma emission can take place probf = 0.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 1.0; probimf = 0.0; //c JLRS 03/2017 - Added this calculation //C According to A. Ignatyuk, GG : //C Here BS=BK=1, as this was assumed in the parameterization pa = (ald->av)*a + (ald->as)*std::pow(a,2./3.) + (ald->ak)*std::pow(a,1./3.); gamma = 2.5 * pa * std::pow(a,-4./3.); gfactor = 1.+gamma*ecld->ecgnz[in][iz]; if(gfactor<=0.){ gfactor = 0.0; } // gtemp = 17.60/(std::pow(a,0.699) * std::sqrt(gfactor)); ecg = 4.0 * gtemp; // goto direct70; } */ // --------------------------------------------------------------- // LEVEL DENSITIES AND TEMPERATURES OF THE FINAL STATES // --------------------------------------------------------------- // // MVR - in case of charged particle emission temperature // comes from random kinetic energy from a Maxwelliam distribution // if option imaxwell = 1 (otherwise E=2T) // // AK - LEVEL DENSITY AND TEMPERATURE AT THE SADDLE POINT -> now calculated // in the subroutine FISSION_WIDTH // // // LEVEL DENSITY AND TEMPERATURE IN THE NEUTRON DAUGHTER // // KHS, AK 2007 - Reduction of angular momentum due to orbital angular // momentum of emitted fragment JLRS Nov-2016 - Added these caculations in // abla++ if (in >= 2) { ind = idnint(a) - idnint(zprf) - 1; izd = idnint(zprf); if (jprf > 0.10) { lorb(a, a - 1., jprf, ee - sn, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprfn = jprf + djprf; jprfn = dint(std::abs(jprfn)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erotn = jprfn * jprfn * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 1., zprf, &bs, &bk, &bc); // level density and temperature in the neutron daughter densniv(a - 1.0, zprf, ee, sn, &densn, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprfn, 0, &qr); nt = temp; ecn = 0.0; if (densn > 0.) { G4int IS = 0; if (imaxwell == 1) { rnt = nt; dir1234: ecn = fvmaxhaz_neut(rnt); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ_NEUT CALLED MORE THAN 100 TIMES" << std::endl; goto exi1000; } if (ecn > (ee - sn)) { if ((ee - sn) < rnt) ecn = ee - sn; else goto dir1234; } if (ecn <= 0.0) goto dir1234; } else { ecn = 2.0 * nt; } } } else { densn = 0.0; ecn = 0.0; nt = 0.0; } exi1000: // LEVEL DENSITY AND TEMPERATURE IN THE PROTON DAUGHTER // // Reduction of angular momentum due to orbital angular momentum of emitted // fragment if (iz >= 2) { ind = idnint(a) - idnint(zprf); izd = idnint(zprf) - 1; if (jprf > 0.10) { lorb(a, a - 1., jprf, ee - sbp, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprfp = jprf + djprf; jprfp = dint(std::abs(jprfp)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erotp = jprfp * jprfp * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 1., zprf - 1., &bs, &bk, &bc); // level density and temperature in the proton daughter densniv(a - 1.0, zprf - 1.0, ee, sbp, &densp, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprfp, 0, &qr); pt = temp; ecp = 0.; if (densp > 0.) { G4int IS = 0; if (imaxwell == 1) { rpt = pt; dir1235: ecp = fvmaxhaz(rpt); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; goto exi1001; } if (ecp > (ee - sbp)) { if ((ee - sbp) < rpt) ecp = ee - sbp; else goto dir1235; } if (ecp <= 0.0) goto dir1235; ecp = ecp + bp; } else { ecp = 2.0 * pt + bp; } } } else { densp = 0.0; ecp = 0.0; pt = 0.0; } exi1001: // FINAL LEVEL DENSITY AND TEMPERATURE AFTER DEUTERON EMISSION // // Reduction of angular momentum due to orbital angular momentum of emitted // fragment if ((in >= 2) && (iz >= 2)) { ind = idnint(a) - idnint(zprf) - 1; izd = idnint(zprf) - 1; if (jprf > 0.10) { lorb(a, a - 2., jprf, ee - sbd, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprfd = jprf + djprf; jprfd = dint(std::abs(jprfd)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erotd = jprfd * jprfd * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 2., zprf - 1., &bs, &bk, &bc); // level density and temperature in the deuteron daughter densniv(a - 2.0, zprf - 1.0e0, ee, sbd, &densd, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprfd, 0, &qr); dt = temp; ecd = 0.0; if (densd > 0.) { G4int IS = 0; if (imaxwell == 1) { rdt = dt; dir1236: ecd = fvmaxhaz(rdt); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; goto exi1002; } if (ecd > (ee - sbd)) { if ((ee - sbd) < rdt) ecd = ee - sbd; else goto dir1236; } if (ecd <= 0.0) goto dir1236; ecd = ecd + bd; } else { ecd = 2.0 * dt + bd; } } } else { densd = 0.0; ecd = 0.0; dt = 0.0; } exi1002: // FINAL LEVEL DENSITY AND TEMPERATURE AFTER TRITON EMISSION // // Reduction of angular momentum due to orbital angular momentum of emitted // fragment if ((in >= 3) && (iz >= 2)) { ind = idnint(a) - idnint(zprf) - 2; izd = idnint(zprf) - 1; if (jprf > 0.10) { lorb(a, a - 3., jprf, ee - sbt, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprft = jprf + djprf; jprft = dint(std::abs(jprft)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erott = jprft * jprft * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 3., zprf - 1., &bs, &bk, &bc); // level density and temperature in the triton daughter densniv(a - 3.0, zprf - 1.0, ee, sbt, &denst, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprft, 0, &qr); tt = temp; ect = 0.; if (denst > 0.) { G4int IS = 0; if (imaxwell == 1) { rtt = tt; dir1237: ect = fvmaxhaz(rtt); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; goto exi1003; } if (ect > (ee - sbt)) { if ((ee - sbt) < rtt) ect = ee - sbt; else goto dir1237; } if (ect <= 0.0) goto dir1237; ect = ect + bt; } else { ect = 2.0 * tt + bt; } } } else { denst = 0.0; ect = 0.0; tt = 0.0; } exi1003: // LEVEL DENSITY AND TEMPERATURE IN THE ALPHA DAUGHTER // // Reduction of angular momentum due to orbital angular momentum of emitted // fragment if ((in >= 3) && (iz >= 3)) { ind = idnint(a) - idnint(zprf) - 2; izd = idnint(zprf) - 2; if (jprf > 0.10) { lorb(a, a - 4., jprf, ee - sba, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprfa = jprf + djprf; jprfa = dint(std::abs(jprfa)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erota = jprfa * jprfa * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 4., zprf - 2., &bs, &bk, &bc); // level density and temperature in the alpha daughter densniv(a - 4.0, zprf - 2.0, ee, sba, &densa, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprfa, 0, &qr); at = temp; eca = 0.0; if (densa > 0.) { G4int IS = 0; if (imaxwell == 1) { rat = at; dir1238: eca = fvmaxhaz(rat); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; goto exi1004; } if (eca > (ee - sba)) { if ((ee - sba) < rat) eca = ee - sba; else goto dir1238; } if (eca <= 0.0) goto dir1238; eca = eca + ba; } else { eca = 2.0 * at + ba; } } } else { densa = 0.0; eca = 0.0; at = 0.0; } exi1004: // FINAL LEVEL DENSITY AND TEMPERATURE AFTER 3HE EMISSION // // Reduction of angular momentum due to orbital angular momentum of emitted // fragment if ((in >= 2) && (iz >= 3)) { ind = idnint(a) - idnint(zprf) - 1; izd = idnint(zprf) - 2; if (jprf > 0.10) { lorb(a, a - 3., jprf, ee - sbhe, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprfhe = jprf + djprf; jprfhe = dint(std::abs(jprfhe)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erothe = jprfhe * jprfhe * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 3., zprf - 2., &bs, &bk, &bc); // level density and temperature in the he3 daughter densniv(a - 3.0, zprf - 2.0, ee, sbhe, &denshe, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprfhe, 0, &qr); het = temp; eche = 0.0; if (denshe > 0.) { G4int IS = 0; if (imaxwell == 1) { rhet = het; dir1239: eche = fvmaxhaz(rhet); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ CALLED MORE THAN 100 TIMES" << std::endl; goto exi1005; } if (eche > (ee - sbhe)) { if ((ee - sbhe) < rhet) eche = ee - sbhe; else goto dir1239; } if (eche <= 0.0) goto dir1239; eche = eche + bhe; } else { eche = 2.0 * het + bhe; } } } else { denshe = 0.0; eche = 0.0; het = 0.0; } exi1005: // LEVEL DENSITY AND TEMPERATURE IN THE LAMBDA0 DAUGHTER // // - Reduction of angular momentum due to orbital angular momentum of emitted // fragment JLRS Jun-2017 - Added these caculations in abla++ if (in >= 2 && NbLam0 > 0) { ind = idnint(a) - idnint(zprf) - 1; izd = idnint(zprf); if (jprf > 0.10) { lorb(a, a - 1., jprf, ee - slamb0, &dlout, &sdlout); djprf = gausshaz(1, dlout, sdlout); if (IDjprf == 1) djprf = 0.0; jprflamb0 = jprf + djprf; jprflamb0 = dint(std::abs(jprflamb0)); // The nucleus just turns the other way around } bshell = ecld->ecgnz[ind][izd] - ecld->vgsld[ind][izd]; defbet = ecld->beta2[ind][izd]; iinert = 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); erotlamb0 = jprflamb0 * jprflamb0 * 197.328 * 197.328 / (2. * iinert); bsbkbc(a - 1., zprf, &bs, &bk, &bc); // level density and temperature in the neutron daughter densniv(a - 1.0, zprf, ee, slamb0, &denslamb0, bshell, bs, bk, &temp, fiss->optshp, fiss->optcol, defbet, &ecor, jprflamb0, 0, &qr); lamb0t = temp; eclamb0 = 0.0; if (denslamb0 > 0.) { G4int IS = 0; if (imaxwell == 1) { rlamb0t = lamb0t; dir1240: eclamb0 = fvmaxhaz_neut(rlamb0t); IS++; if (IS > 100) { std::cout << "WARNING: FVMAXHAZ_NEUT CALLED MORE THAN 100 TIMES" << std::endl; goto exi1006; } if (eclamb0 > (ee - slamb0)) { if ((ee - slamb0) < rlamb0t) eclamb0 = ee - slamb0; else goto dir1240; } if (eclamb0 <= 0.0) goto dir1240; } else { eclamb0 = 2.0 * lamb0t; } } } else { denslamb0 = 0.0; eclamb0 = 0.0; lamb0t = 0.0; } exi1006: // Decay widths for particles if (densg > 0.) { // // CALCULATION OF THE PARTIAL DECAY WIDTH // USED FOR BOTH THE TIME SCALE AND THE EVAPORATION DECAY WIDTH // // AKAP = HBAR**2/(2* MN * R_0**2) = 10 MEV *** input param *** // // AK, KHS 2005 - Energy-dependen inverse cross sections included, influence // of // Coulomb barrier for LCP, tunnelling for LCP // JLRS 2017 - Implementation in abla++ if (densn <= 0.0) { gn = 0.0; } else { gn = width(a, zprf, 1.0, 0.0, nt, 0.0, sn, ee - erotn) * densn / densg; } if (densp <= 0.0) { gp = 0.0; } else { gp = width(a, zprf, 1.0, 1.0, pt, bp, sbp, ee - erotp) * densp / densg * pen(a, 1.0, omegap, pt); } if (densd <= 0.0) { gd = 0.0; } else { gd = width(a, zprf, 2.0, 1.0, dt, bd, sbd, ee - erotd) * densd / densg * pen(a, 2.0, omegad, dt); } if (denst <= 0.0) { gt = 0.0; } else { gt = width(a, zprf, 3.0, 1.0, tt, bt, sbt, ee - erott) * denst / densg * pen(a, 3.0, omegat, tt); } if (denshe <= 0.0) { ghe = 0.0; } else { ghe = width(a, zprf, 3.0, 2.0, het, bhe, sbhe, ee - erothe) * denshe / densg * pen(a, 3.0, omegahe, het); } if (densa <= 0.0) { ga = 0.0; } else { ga = width(a, zprf, 4.0, 2.0, at, ba, sba, ee - erota) * densa / densg * pen(a, 4.0, omegaa, at); } if (denslamb0 <= 0.0) { glamb0 = 0.0; } else { glamb0 = width(a, zprf, 1.0, -2.0, lamb0t, 0.0, slamb0, ee - erotlamb0) * denslamb0 / densg; } // ************************** // * Treatment of IMFs * // * KHS, AK, MVR 2005-2006 * // ************************** G4int izcn = 0, incn = 0, inmin = 0, inmax = 0, inmi = 0, inma = 0; G4double aimf, mares, maimf; if (fimf_allowed == 0 || zprf <= 5.0 || a <= 7.0) { gimf = 0.0; } else { // Estimate the total decay width for IMFs (Z >= 3) // By using the logarithmic slope between GIMF3 and GIMF5 mglms(a, zprf, opt->optshpimf, &mazz); gimf3 = 0.0; zimf = 3.0; izimf = 3; // *** Find the limits that both IMF and partner are bound : izcn = idnint(zprf); // Z of CN incn = idnint(a) - izcn; // N of CN isostab_lim(izimf, &inmin, &inmax); // Bound isotopes for IZIMF from INMIN to INIMFMA isostab_lim(izcn - izimf, &inmi, &inma); // Daughter nucleus after IMF emission, // limits of bound isotopes inmin = max(inmin, incn - inma); // Both IMF and daughter must be bound inmax = min(inmax, incn - inmi); // " inmax = max(inmax, inmin); // In order to keep the variables below for (G4int iaimf = izimf + inmin; iaimf <= izimf + inmax; iaimf++) { aimf = G4double(iaimf); if (aimf >= a || zimf >= zprf) { width_imf = 0.0; } else { // Q-values mglms(a - aimf, zprf - zimf, opt->optshpimf, &mares); mglms(aimf, zimf, opt->optshpimf, &maimf); // Bass barrier barrs(idnint(zprf - zimf), idnint(a - aimf), izimf, idnint(aimf), &bimf, &omegaimf); sbimf = maimf + mares - mazz + bimf + getdeltabinding(a, NbLam0); // Rotation energy defbetimf = ecld->beta2[idnint(aimf - zimf)][idnint(zimf)] + ecld->beta2[idnint(a - aimf - zprf + zimf)][idnint(zprf - zimf)]; iinert = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(a, 5.0 / 3.0) * (std::pow(aimf, 5.0 / 3.0) + std::pow(a - aimf, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * aimf * (a - aimf) / a * (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)) * (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)); erot = jprf * jprf * 197.328 * 197.328 / (2.0 * iinert); // Width if (densg == 0.0 || ee < (sbimf + erot)) { width_imf = 0.0; } else { // To take into account that at the barrier the system is deformed: // BSIMF = ((A-AIMF)**(2.D0/3.D0) + // AIMF**(2.D0/3.D0))/A**(2.D0/3.D0) bsimf = bscn; densniv( a, zprf, ee, sbimf, &densimf, 0.0, bsimf, 1.0, &timf, 0, 0, defbetimf, &ecor, jprf, 2, &qr); imfarg = (sbimf + erotcn - erot) / timf; if (imfarg > 200.0) imfarg = 200.0; // For IMF - The available phase space is given by the level // densities in CN at the barrier; applaying MOrretto -> // G=WIDTH*ro_CN(E-SBIMF)/ro_CN(E). Constant temperature // approximation: ro(E+dE)/ro(E)=exp(dE/T) Ratio DENSIMF/DENSCN is // included to take into account that at the barrier system is // deformed. If (above) BSIMF = 1 no deformation is considered and // this ratio is equal to 1. width_imf = 0.0; // width_imf = width(a, zprf, aimf, zimf, timf, bimf, sbimf, ee - erot) * std::exp(-imfarg) * qr / qrcn; } // if densg } // if aimf gimf3 = gimf3 + width_imf; } // for IAIMF // zimf = 5 gimf5 = 0.0; zimf = 5.0; izimf = 5; // *** Find the limits that both IMF and partner are bound : izcn = idnint(zprf); // Z of CN incn = idnint(a) - izcn; // N of CN isostab_lim(izimf, &inmin, &inmax); // Bound isotopes for IZIMF from INMIN to INIMFMA isostab_lim(izcn - izimf, &inmi, &inma); // Daughter nucleus after IMF emission, // limits of bound isotopes inmin = max(inmin, incn - inma); // Both IMF and daughter must be bound inmax = min(inmax, incn - inmi); // " inmax = max(inmax, inmin); // In order to keep the variables below for (G4int iaimf = izimf + inmin; iaimf <= izimf + inmax; iaimf++) { aimf = G4double(iaimf); if (aimf >= a || zimf >= zprf) { width_imf = 0.0; } else { // Q-values mglms(a - aimf, zprf - zimf, opt->optshpimf, &mares); mglms(aimf, zimf, opt->optshpimf, &maimf); // Bass barrier barrs(idnint(zprf - zimf), idnint(a - aimf), izimf, idnint(aimf), &bimf, &omegaimf); sbimf = maimf + mares - mazz + bimf + getdeltabinding(a, NbLam0); // Rotation energy defbetimf = ecld->beta2[idnint(aimf - zimf)][idnint(zimf)] + ecld->beta2[idnint(a - aimf - zprf + zimf)][idnint(zprf - zimf)]; iinert = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(a, 5.0 / 3.0) * (std::pow(aimf, 5.0 / 3.0) + std::pow(a - aimf, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * aimf * (a - aimf) / a * (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)) * (std::pow(aimf, 1.0 / 3.0) + std::pow(a - aimf, 1.0 / 3.0)); erot = jprf * jprf * 197.328 * 197.328 / (2.0 * iinert); // // Width if (densg == 0.0 || ee < (sbimf + erot)) { width_imf = 0.0; } else { // To take into account that at the barrier the system is deformed: // BSIMF = ((A-AIMF)**(2.D0/3.D0) + // AIMF**(2.D0/3.D0))/A**(2.D0/3.D0) bsimf = bscn; densniv( a, zprf, ee, sbimf, &densimf, 0.0, bsimf, 1.0, &timf, 0, 0, defbetimf, &ecor, jprf, 2, &qr); // imfarg = (sbimf + erotcn - erot) / timf; if (imfarg > 200.0) imfarg = 200.0; // // For IMF - The available phase space is given by the level // densities in CN at the barrier; applaying MOrretto -> // G=WIDTH*ro_CN(E-SBIMF)/ro_CN(E). Constant temperature // approximation: ro(E+dE)/ro(E)=exp(dE/T) Ratio DENSIMF/DENSCN is // included to take into account that at the barrier system is // deformed. If (above) BSIMF = 1 no deformation is considered and // this ratio is equal to 1. width_imf = 0.0; width_imf = width(a, zprf, aimf, zimf, timf, bimf, sbimf, ee - erot) * std::exp(-imfarg) * qr / qrcn; //*densimf/densg; } // if densg } // if aimf gimf5 = gimf5 + width_imf; } // for IAIMF // It is assumed that GIMFi = A_IMF*ZIMF**B_IMF; to get the total GIMF one // integrates Int(A_IMF*ZIMF**B_IMF)(3->ZPRF) if (gimf3 <= 0.0 || gimf5 <= 0.0) { gimf = 0.0; b_imf = -100.0; a_imf = 0.0; } else { // b_imf = (std::log10(gimf3) - std::log10(gimf5)) / (std::log10(3.0) - std::log10(5.0)); // if (b_imf >= -1.01) b_imf = -1.01; if (b_imf <= -100.0) { b_imf = -100.0; a_imf = 0.0; gimf = 0.0; goto direct2007; } // a_imf = gimf3 / std::pow(3.0, b_imf); gimf = a_imf * (std::pow(zprf, b_imf + 1.0) - std::pow(3.0, b_imf + 1.0)) / (b_imf + 1.0); } direct2007: if (gimf < 1.e-10) gimf = 0.0; } // if fimf_allowed // // c JLRS 2016 - Added this calculation // C AK 2004 - Gamma width // C According to A. Ignatyuk, GG : // C Here BS=BK=1, as this was assumed in the parameterization pa = (ald->av) * a + (ald->as) * std::pow(a, 2. / 3.) + (ald->ak) * std::pow(a, 1. / 3.); gamma = 2.5 * pa * std::pow(a, -4. / 3.); gfactor = 1. + gamma * ecld->ecgnz[in][iz]; if (gfactor <= 0.) { gfactor = 0.0; } // gtemp = 17.60 / (std::pow(a, 0.699) * std::sqrt(gfactor)); // // C If one switches gammas off, one should also switch off tunneling // through the fission barrier. gg = 0.624e-9 * std::pow(a, 1.6) * std::pow(gtemp, 5.); // gammaemission==1 // C For fission fragments, GG is ~ 2 times larger than for // c "oridnary" nuclei (A. Ignatyuk, private communication). if (gammaemission == 1) { gg = 2.0 * gg; } ecg = 4.0 * gtemp; // // gsum = ga + ghe + gd + gt + gp + gn + gimf + gg + glamb0; // std::cout << gn << " " << gd << " " << gp << std::endl; if (gsum > 0.0) { ts1 = hbar / gsum; } else { ts1 = 1.0e99; goto direct69; } // // Case of nuclei below Businaro-Gallone mass asymmetry point if (fiss->ifis == 0 || (zprf * zprf / a <= 22.74 && zprf < 60.)) { goto direct69; } // // Calculation of the fission decay width // Deformation is calculated using the fissility // defbet = y; fission_width(zprf, a, ee, bssp, bksp, ef, y, &gf, &temp, jprf, 0, 1, fiss->optcol, fiss->optshp, densg); ft = temp; // // Case of very heavy nuclei that have no fission barrier // For them fission is the only decay channel available if (ef <= 0.0) { probf = 1.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 0.0; probimf = 0.0; problamb0 = 0.0; goto direct70; } if (fiss->bet <= 0.) { gtotal = ga + ghe + gp + gd + gt + gn + gg + gimf + gf + glamb0; if (gtotal <= 0.0) { probf = 0.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 0.0; probimf = 0.0; problamb0 = 0.0; goto direct70; } else { probf = gf / gtotal; probn = gn / gtotal; probp = gp / gtotal; probd = gd / gtotal; probt = gt / gtotal; probhe = ghe / gtotal; proba = ga / gtotal; probg = gg / gtotal; probimf = gimf / gtotal; problamb0 = glamb0 / gtotal; goto direct70; } } } else { goto direct69; } // if (inum > ilast) { // new event means reset the time scale tsum = 0.; } // // kramers factor for the dynamical hindrances of fission fomega_sp(a, y, &mfcd, &omegasp, &homegasp); cf = cram((NbLam0 > 0 ? fiss->bethyp : fiss->bet), homegasp); // // We calculate the transient time fomega_gs(a, zprf, &k1, &omegags, &homegags); tauc = tau((NbLam0 > 0 ? fiss->bethyp : fiss->bet), homegags, ef, ft); gf = gf * cf; // /* c The subroutine part_fiss calculates the fission width GFF that corresponds to the time c dependence of the probability distribution obtained by solving the FOKKER-PLANCK eq c using a nucleus potential that is approximated by a parabola. It also gives the c decay time for this step T_LAPSE that includes all particle decay channels and the c fission channel. And it decides whether the nucleus decays by particle evaporation c CHOICE_FISSPART = 1 or fission CHOICE_FISSPART = 2 */ // part_fiss((NbLam0 > 0 ? fiss->bethyp : fiss->bet), gsum, gf, y, tauc, ts1, tsum, &choice_fisspart, zprf, a, ft, &t_lapse, &gff); gf = gff; // // We accumulate in TSUM the mean decay for this step including all particle // decay channels and fission tsum = tsum + t_lapse; // If fission occurs if (choice_fisspart == 2) { probf = 1.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 0.0; probimf = 0.0; problamb0 = 0.0; goto direct70; } else { // If particle evaporation occurs // The probabilities for the different decays are calculated taking into // account the fission width GFF that corresponds to this step gtotal = ga + ghe + gp + gd + gt + gn + gimf + gg + glamb0; if (gtotal <= 0.0) { probf = 0.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 0.0; probimf = 0.0; problamb0 = 0.0; goto direct70; } else { probf = 0.0; probn = gn / gtotal; probp = gp / gtotal; probd = gd / gtotal; probt = gt / gtotal; probhe = ghe / gtotal; proba = ga / gtotal; probg = gg / gtotal; probimf = gimf / gtotal; problamb0 = glamb0 / gtotal; goto direct70; } } // direct69: gtotal = ga + ghe + gp + gd + gt + gn + gg + gimf + glamb0; if (gtotal <= 0.0) { probf = 0.0; probp = 0.0; probd = 0.0; probt = 0.0; probn = 0.0; probhe = 0.0; proba = 0.0; probg = 0.0; probimf = 0.0; problamb0 = 0.0; } else { probf = 0.0; probn = gn / gtotal; probp = gp / gtotal; probd = gd / gtotal; probt = gt / gtotal; probhe = ghe / gtotal; proba = ga / gtotal; probg = gg / gtotal; probimf = gimf / gtotal; problamb0 = glamb0 / gtotal; } direct70: ptotl = probp + probd + probt + probn + probhe + proba + probg + probimf + probf + problamb0; // ee = eer; ilast = inum; // Return values: (*probp_par) = probp; (*probd_par) = probd; (*probt_par) = probt; (*probn_par) = probn; (*probhe_par) = probhe; (*proba_par) = proba; (*probg_par) = probg; (*probimf_par) = probimf; (*problamb0_par) = problamb0; (*probf_par) = probf; (*ptotl_par) = ptotl; (*sn_par) = sn; (*sp_par) = sp; (*sd_par) = sd; (*st_par) = st; (*she_par) = she; (*sa_par) = sa; (*slamb0_par) = slamb0; (*sbp_par) = sbp; (*sbd_par) = sbd; (*sbt_par) = sbt; (*sbhe_par) = sbhe; (*sba_par) = sba; (*ecn_par) = ecn; (*ecp_par) = ecp; (*ecd_par) = ecd; (*ect_par) = ect; (*eche_par) = eche; (*eca_par) = eca; (*ecg_par) = ecg; (*eclamb0_par) = eclamb0; (*bp_par) = bp; (*bd_par) = bd; (*bt_par) = bt; (*bhe_par) = bhe; (*ba_par) = ba; (*tcn) = ftcn; (*ts1_par) = ts1; (*jprfn_par) = jprfn; (*jprfp_par) = jprfp; (*jprfd_par) = jprfd; (*jprft_par) = jprft; (*jprfhe_par) = jprfhe; (*jprfa_par) = jprfa; (*jprflamb0_par) = jprflamb0; (*tsum_par) = tsum; return; } void G4Abla::densniv(G4double a, G4double z, G4double ee, G4double esous, G4double* dens, G4double bshell, G4double bsin, G4double bkin, G4double* temp, G4int optshp, G4int optcol, G4double defbet, G4double* ecor, G4double jprf, G4int ifis, G4double* qr) { // 1498 C // 1499 C INPUT: // 1500 C A,EE,ESOUS,OPTSHP,BS,BK,BSHELL,DEFBET // 1501 C // 1502 C LEVEL DENSITY PARAMETERS // 1503 C COMMON /ALD/ AV,AS,AK,OPTAFAN // 1504 C AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE // 1505 C LEVEL DENSITY PARAMETER // 1506 C OPTAFAN - 0/1 AF/AN >=1 OR AF/AN ==1 // 1507 C RECOMMENDED IS OPTAFAN = 0 // 1508 // C--------------------------------------------------------------------- // 1509 C OUTPUT: DENS,TEMP // 1510 C // 1511 C // ____________________________________________________________________ 1512 // C / 1513 C / PROCEDURE FOR CALCULATING THE STATE DENSITY OF A // COMPOUND NUCLEUS 1514 C // /____________________________________________________________________ // 1515 C // 1516 INTEGER AFP,IZ,OPTSHP,OPTCOL,J,OPTAFAN // 1517 REAL*8 // A,EE,ESOUS,DENS,E,Y0,Y1,Y2,Y01,Y11,Y21,PA,BS,BK,TEMP 1518 // C=====INSERTED BY KUDYAEV=============================================== // 1519 COMMON /ALD/ AV,AS,AK,OPTAFAN // 1520 REAL*8 // ECR,ER,DELTAU,Z,DELTPP,PARA,PARZ,FE,HE,ECOR,ECOR1,Pi6 // 1521 REAL*8 // BSHELL,DELTA0,AV,AK,AS,PONNIV,PONFE,DEFBET,QR,SIG,FP 1522 // C======================================================================= // 1523 C // 1524 C // 1525 // C----------------------------------------------------------------------- // 1526 C A MASS NUMBER OF THE DAUGHTER NUCLEUS // 1527 C EE EXCITATION ENERGY OF THE MOTHER NUCLEUS // 1528 C ESOUS SEPARATION ENERGY PLUS EFFECTIVE COULOMB // BARRIER // 1529 C DENS STATE DENSITY OF DAUGHTER NUCLEUS AT // EE-ESOUS-EC 1530 C BSHELL SHELL CORRECTION 1531 C TEMP // NUCLEAR TEMPERATURE 1532 C E LOCAL EXCITATION ENERGY OF THE // DAUGHTER NUCLEUS 1533 C E1 LOCAL HELP VARIABLE // 1534 C Y0,Y1,Y2,Y01,Y11,Y21 // 1535 C LOCAL HELP VARIABLES // 1536 C PA LOCAL STATE-DENSITY PARAMETER // 1537 C EC KINETIC ENERGY OF EMITTED PARTICLE // WITHOUT 1538 C COULOMB REPULSION 1539 C IDEN // FAKTOR FOR SUBSTRACTING KINETIC ENERGY IDEN*TEMP 1540 C DELTA0 // PAIRING GAP 12 FOR GROUND STATE 1541 C 14 FOR // SADDLE POINT 1542 C EITERA HELP VARIABLE FOR // TEMPERATURE ITERATION 1543 // C----------------------------------------------------------------------- // 1544 C // 1545 C G4double delta0 = 0.0; G4double deltau = 0.0; G4double deltpp = 0.0; G4double e = 0.0; G4double e0 = 0.0; G4double ecor1 = 0.0; G4double ecr = 10.0; G4double fe = 0.0; G4double he = 0.0; G4double pa = 0.0; G4double para = 0.0; G4double parz = 0.0; G4double ponfe = 0.0; G4double ponniv = 0.0; G4double fqr = 1.0; G4double y01 = 0.0; G4double y11 = 0.0; G4double y2 = 0.0; G4double y21 = 0.0; G4double y1 = 0.0; G4double y0 = 0.0; G4double fnorm = 0.0; G4double fp_per = 0.; G4double fp_par = 0.; G4double sig_per = 0.; G4double sig_par = 0.; G4double sigma2; G4double jfact = 1.; G4double erot = 0.; G4double fdens = 0.; G4double fecor = 0.; G4double BSHELLCT = 0.; G4double gamma = 0.; G4double ftemp = 0.0; G4double tempct = 0.0; G4double densfm = 0.0; G4double densct = 0.0; G4double ein = 0.; G4double elim; G4double tfm; G4double bs = bsin; G4double bk = bkin; G4int IPARITE; G4int IOPTCT = fiss->optct; // G4double pi6 = std::pow(3.1415926535, 2) / 6.0; G4double pi = 3.1415926535; // G4int afp = idnint(a); G4int iz = idnint(z); G4int in = afp - iz; // if (ifis != 1) { BSHELLCT = ecld->ecgnz[in][iz]; } else { BSHELLCT = 0.0; } if (afp <= 20) BSHELLCT = 0.0; // parite(a, ¶); if (para < 0.0) { // Odd A IPARITE = 1; } else { // Even A parite(z, &parz); if (parz > 0.0) { // Even Z, even N IPARITE = 2; } else { // Odd Z, odd N IPARITE = 0; } } // ein = ee - esous; // if (ein > 1.e30) { fdens = 0.0; ftemp = 0.5; goto densniv100; } // e = ee - esous; // if (e < 0.0 && ifis != 1) { // TUNNELING fdens = 0.0; densfm = 0.0; densct = 0.0; if (ald->optafan == 1) { pa = (ald->av) * a + (ald->as) * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * std::pow(a, (1.e0 / 3.e0)); } else { pa = (ald->av) * a + (ald->as) * bsin * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * bkin * std::pow(a, (1.e0 / 3.e0)); } gamma = 2.5 * pa * std::pow(a, -4.0 / 3.0); fecor = 0.0; goto densniv100; } // if (ifis == 0 && bs != 1.0) { // - With increasing excitation energy system in getting less and less // deformed: G4double ponq = (e - 100.0) / 5.0; if (ponq > 700.0) ponq = 700.0; bs = 1.0 / (1.0 + std::exp(-ponq)) + 1.0 / (1.0 + std::exp(ponq)) * bsin; bk = 1.0 / (1.0 + std::exp(-ponq)) + 1.0 / (1.0 + std::exp(ponq)) * bkin; } // // level density parameter if (ald->optafan == 1) { pa = (ald->av) * a + (ald->as) * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * std::pow(a, (1.e0 / 3.e0)); } else { pa = (ald->av) * a + (ald->as) * bs * std::pow(a, (2.e0 / 3.e0)) + (ald->ak) * bk * std::pow(a, (1.e0 / 3.e0)); } // gamma = 2.5 * pa * std::pow(a, -4.0 / 3.0); // // AK - 2009 - trial, in order to have transition to constant-temperature // approach Idea - at the phase transition superfluid-normal fluid, TCT = // TEMP, and this determines critical energy for pairing. if (a > 0.0) { ecr = pa * 17.60 / (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)) * 17.60 / (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)); } // pairing corrections if (ifis == 1) { delta0 = 14; } else { delta0 = 12; } // shell corrections if (optshp > 0) { deltau = bshell; if (optshp == 2) { deltau = 0.0; } if (optshp >= 2) { // pairing energy shift with condensation energy a.r.j. 10.03.97 // deltpp = -0.25e0* (delta0/pow(sqrt(a),2)) * pa /pi6 // + 2.e0*delta0/sqrt(a); deltpp = -0.25e0 * std::pow((delta0 / std::sqrt(a)), 2) * pa / pi6 + 22.34e0 * std::pow(a, -0.464) - 0.235; // Odd A if (IPARITE == 1) { // e = e - delta0/sqrt(a); e = e - (0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * a); //-30./a;//FIXME } // Even Z, even N if (IPARITE == 2) { e = e - (22.34 * std::pow(a, -0.464) - 0.235); //-30./a;//FIXME } // Odd Z, odd N if (IPARITE == 0) { if (in == iz) { // e = e; } else { // e = e-30./a; } } } else { deltpp = 0.0; } } else { deltau = 0.0; deltpp = 0.0; } if (e < 0.0) { e = 0.0; ftemp = 0.5; } // washing out is made stronger ponfe = -2.5 * pa * e * std::pow(a, (-4.0 / 3.0)); if (ponfe < -700.0) { ponfe = -700.0; } fe = 1.0 - std::exp(ponfe); if (e < ecr) { // priv. comm. k.-h. schmidt he = 1.0 - std::pow((1.0 - e / ecr), 2); } else { he = 1.0; } // Excitation energy corrected for pairing and shell effects // washing out with excitation energy is included. fecor = e + deltau * fe + deltpp * he; if (fecor <= 0.1) { fecor = 0.1; } // iterative procedure according to grossjean and feldmeier // to avoid the singularity e = 0 if (ee < 5.0) { y1 = std::sqrt(pa * fecor); for (G4int j = 0; j < 5; j++) { y2 = pa * fecor * (1.e0 - std::exp(-y1)); y1 = std::sqrt(y2); } y0 = pa / y1; ftemp = 1.0 / y0; fdens = std::exp(y0 * fecor) / (std::pow((std::pow(fecor, 3) * y0), 0.5) * std::pow((1.0 - 0.5 * y0 * fecor * std::exp(-y1)), 0.5)) * std::exp(y1) * (1.0 - std::exp(-y1)) * 0.1477045; if (fecor < 1.0) { ecor1 = 1.0; y11 = std::sqrt(pa * ecor1); for (G4int j = 0; j < 7; j++) { y21 = pa * ecor1 * (1.0 - std::exp(-y11)); y11 = std::sqrt(y21); } y01 = pa / y11; fdens = fdens * std::pow((y01 / y0), 1.5); ftemp = ftemp * std::pow((y01 / y0), 1.5); } } else { ponniv = 2.0 * std::sqrt(pa * fecor); if (ponniv > 700.0) { ponniv = 700.0; } // fermi gas state density fdens = 0.1477045 * std::exp(ponniv) / (std::pow(pa, 0.25) * std::pow(fecor, 1.25)); ftemp = std::sqrt(fecor / pa); } // densfm = fdens; tfm = ftemp; // if (IOPTCT == 0) goto densniv100; tempct = 17.60 / (std::pow(a, 0.699) * std::sqrt(1. + gamma * BSHELLCT)); // tempct = 1.0 / ( (0.0570 + 0.00193*BSHELLCT) * pow(a,0.6666667)); // from // PRC 80 (2009) 054310 // - CONSTANT-TEMPERATURE LEVEL DENSITY PARAMETER (ONLY AT LOW ENERGIES) if (e < 30.) { if (a > 0.0) { if (optshp >= 2) { // Parametrization of CT model by Ignatyuk; note that E0 is shifted to // correspond to pairing shift in Fermi-gas model (there, energy is // shifted taking odd-odd nuclei // as bassis) // e-o, o-e if (IPARITE == 1) { e0 = 0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * a; } // e-e if (IPARITE == 2) { e0 = 22.34 * std::pow(a, -0.464) - 0.235; } // o-o if (IPARITE == 0) { e0 = 0.0; } ponniv = (ein - e0) / tempct; if (ifis != 1) ponniv = max(0.0, (ein - e0) / tempct); if (ponniv > 700.0) { ponniv = 700.0; } densct = std::exp(ponniv) / tempct * std::exp(0.079 * BSHELLCT / tempct); elim = ein; if (elim >= ecr && densfm <= densct) { fdens = densfm; // IREGCT = 0; } else { fdens = densct; // IREGCT = 1; // ecor = min(ein-e0,0.10); } if (elim >= ecr && tfm >= tempct) { ftemp = tfm; } else { ftemp = tempct; } } else { // Case of no pairing considered // ETEST = PA * TEMPCT**2 ponniv = (ein) / tempct; if (ponniv > 700.0) { ponniv = 700.0; } densct = std::exp(ponniv) / tempct; if (ein >= ecr && densfm <= densct) { fdens = densfm; ftemp = tfm; // IREGCT = 0; } else { fdens = densct; ftemp = tempct; // ECOR = DMIN1(EIN,0.1D0) } if (ein >= ecr && tfm >= tempct) { ftemp = tfm; } else { ftemp = tempct; } } } } densniv100: if (fdens == 0.0) { if (a > 0.0) { // Parametrization of CT model by Ignatyuk done for masses > 20 ftemp = 17.60 / (std::pow(a, 0.699) * std::sqrt(1.0 + gamma * BSHELLCT)); // ftemp = 1.0 / ( (0.0570 + 0.00193*BSHELLCT) * pow(a,0.6666667)); // // from PRC 80 (2009) 054310 } else { ftemp = 0.5; } } // // spin cutoff parameter /* C PERPENDICULAR AND PARALLEL MOMENT OF INERTIA c fnorm = R0*M0/hbar**2 = 1.16fm*931.49MeV/c**2 /(6.582122e-22 MeVs)**2 and is c in units 1/MeV */ fnorm = std::pow(1.16, 2) * 931.49 * 1.e-2 / (9.0 * std::pow(6.582122, 2)); if (ifis == 0 || ifis == 2) { /* C GROUND STATE: C FP_PER ~ 1+0.5*alpha2, FP_PAR ~ 1-alpha2 (Hasse & Myers, Geom. relat. macr. nucl. phys.) C alpha2 = sqrt(5/(4*pi))*beta2 */ fp_per = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 + 0.50 * defbet * std::sqrt(5.0 / (4.0 * pi))); fp_par = 0.40 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 - defbet * std::sqrt(5.0 / (4.0 * pi))); } else { if (ifis == 1) { /* C SADDLE POINT C See Hasse&Myer, p. 100 C Perpendicular moment of inertia */ fp_per = 2.0 / 5.0 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 + 7.0 / 6.0 * defbet * (1.0 + 1396.0 / 255.0 * defbet)); // Parallel moment of inertia fp_par = 2.0 / 5.0 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 - 7.0 / 3.0 * defbet * (1.0 - 389.0 / 255.0 * defbet)); } else { if (ifis == 20) { // IMF - two fragments in contact; it is asumed that both are spherical. // See Hasse&Myers, p.106 // Here, DEFBET = R1/R2, where R1 and R2 are radii of IMF and its // partner Perpendicular moment of inertia fp_per = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * 3.50 * (1.0 + std::pow(defbet, 5.)) / std::pow(1.0 + defbet * defbet * defbet, 5.0 / 3.0); fp_par = 0.4 * std::pow(a, 5.0 / 3.0) * fnorm * (1.0 + std::pow(defbet, 5.0)) / std::pow(1.0 + defbet * defbet * defbet, 5.0 / 3.0); } } } if (fp_par < 0.0) fp_par = 0.0; if (fp_per < 0.0) fp_per = 0.0; // sig_per = std::sqrt(fp_per * ftemp); sig_par = std::sqrt(fp_par * ftemp); // sigma2 = sig_per * sig_per + sig_par * sig_par; jfact = (2. * jprf + 1.) * std::exp(-1. * jprf * (jprf + 1.0) / (2.0 * sigma2)) / (std::sqrt(8.0 * 3.1415) * std::pow(sigma2, 1.5)); erot = jprf * jprf / (2.0 * std::sqrt(fp_par * fp_par + fp_per * fp_per)); // // collective enhancement if (optcol == 1) { qrot(z, a, defbet, sig_per, fecor - erot, &fqr); } else { fqr = 1.0; } // fdens = fdens * fqr * jfact; // if (fdens < 1e-300) fdens = 0.0; // *dens = fdens; *ecor = fecor; *temp = ftemp; *qr = fqr; } void G4Abla::qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u, G4double* qr) { /* C QROT INCLUDING DAMPING C C INPUT: Z,A,DEFBET,SIG,U C C OUTPUT: QR - COLLECTIVE ENHANCEMENT FACTOR C C SEE JUNGHANS ET AL., NUCL. PHYS. A 629 (1998) 635 C C C FR(U) EXPONENTIAL FUNCTION TO DEFINE DAMPING C UCR CRITICAL ENERGY FOR DAMPING C DCR WIDTH OF DAMPING C DEFBET BETA-DEFORMATION ! C SIG PERPENDICULAR SPIN CUTOFF FACTOR C U ENERGY C QR COEFFICIENT OF COLLECTIVE ENHANCEMENT C A MASS NUMBER C Z CHARGE NUMBER C */ // JLRS: July 2016: new values for the collective parameters // G4double ucr = fiss->ucr; // Critical energy for damping. G4double dcr = fiss->dcr; // Width of damping. G4double ponq = 0.0, dn = 0.0, n = 0.0, dz = 0.0; G4int distn, distz, ndist, zdist; G4int nmn[8] = { 2, 8, 14, 20, 28, 50, 82, 126 }; G4int nmz[8] = { 2, 8, 14, 20, 28, 50, 82, 126 }; // sig = sig * sig; // if (std::abs(bet) <= 0.15) { goto qrot10; } else { goto qrot11; } // qrot10: n = a - z; distn = 10000000; distz = 10000000; for (G4int i = 0; i < 8; i++) { ndist = std::fabs(idnint(n) - nmn[i]); if (ndist < distn) distn = ndist; zdist = std::fabs(idnint(z) - nmz[i]); if (zdist < distz) distz = zdist; } dz = G4float(distz); dn = G4float(distn); bet = 0.022 + 0.003 * dn + 0.002 * dz; sig = 75.0 * std::pow(bet, 2.) * sig; // NO VIBRATIONAL ENHANCEMENT qrot11: ponq = (u - ucr) / dcr; if (ponq > 700.0) { ponq = 700.0; } if (sig < 1.0) { sig = 1.0; } (*qr) = 1.0 / (1.0 + std::exp(ponq)) * (sig - 1.0) + 1.0; if ((*qr) < 1.0) { (*qr) = 1.0; } return; } void G4Abla::lpoly(G4double x, G4int n, G4double pl[]) { // THIS SUBROUTINE CALCULATES THE ORDINARY LEGENDRE POLYNOMIALS OF // ORDER 0 TO N-1 OF ARGUMENT X AND STORES THEM IN THE VECTOR PL. // THEY ARE CALCULATED BY RECURSION RELATION FROM THE FIRST TWO // POLYNOMIALS. // WRITTEN BY A.J.SIERK LANL T-9 FEBRUARY, 1984 // NOTE: PL AND X MUST BE DOUBLE PRECISION ON 32-BIT COMPUTERS! pl[0] = 1.0; pl[1] = x; for (G4int i = 2; i < n; i++) { pl[i] = ((2 * G4double(i + 1) - 3.0) * x * pl[i - 1] - (G4double(i + 1) - 2.0) * pl[i - 2]) / (G4double(i + 1) - 1.0); } } G4double G4Abla::eflmac(G4int ia, G4int iz, G4int flag, G4int optshp) { // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS. // SWITCH FOR PAIRING INCLUDED AS WELL. // BINDING = EFLMAC(IA,IZ,0,OPTSHP) // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C // A.J. 15.07.96 // this function will calculate the liquid-drop nuclear mass for spheri // configuration according to the preprint NUCLEAR GROUND-STATE // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. // All constants are taken from this publication for consistency. // Parameters: // a: nuclear mass number // z: nuclear charge // flag: 0 - return mass excess // otherwise - return pairing (= -1/2 dpn + 1/2 (Dp + Dn)) G4double eflmacResult = 0.0; if (ia == 0) return eflmacResult; G4int in = 0; G4double z = 0.0, n = 0.0, a = 0.0, av = 0.0, as = 0.0; G4double a0 = 0.0, c1 = 0.0, c4 = 0.0, b1 = 0.0, b3 = 0.0; G4double ff = 0.0, ca = 0.0, w = 0.0, efl = 0.0; G4double r0 = 0.0, kf = 0.0, ks = 0.0; G4double kv = 0.0, rp = 0.0, ay = 0.0, aden = 0.0, x0 = 0.0, y0 = 0.0; G4double esq = 0.0, ael = 0.0, i = 0.0, e0 = 0.0; G4double pi = 3.141592653589793238e0; // fundamental constants // electronic charge squared esq = 1.4399764; // constants from considerations other than nucl. masses // electronic binding ael = 1.433e-5; // proton rms radius rp = 0.8; // nuclear radius constant r0 = 1.16; // range of yukawa-plus-expon. potential ay = 0.68; // range of yukawa function used to generate // nuclear charge distribution aden = 0.70; // wigner constant w = 30.0; // adjusted parameters // volume energy av = 16.00126; // volume asymmetry kv = 1.92240; // surface energy as = 21.18466; // surface asymmetry ks = 2.345; // a^0 constant a0 = 2.615; // charge asymmetry ca = 0.10289; z = G4double(iz); a = G4double(ia); in = ia - iz; n = G4double(in); if (flag == 1) { goto eflmac311; } if (iz < 13 && in < 3) { if (masses->mexpiop[in][iz] == 1) { return masses->bind[in][iz]; } } eflmac311: c1 = 3.0 / 5.0 * esq / r0; c4 = 5.0 / 4.0 * std::pow((3.0 / (2.0 * pi)), (2.0 / 3.0)) * c1; kf = std::pow((9.0 * pi * z / (4.0 * a)), (1.0 / 3.0)) / r0; ff = -1.0 / 8.0 * rp * rp * esq / std::pow(r0, 3) * (145.0 / 48.0 - 327.0 / 2880.0 * std::pow(kf, 2) * std::pow(rp, 2) + 1527.0 / 1209600.0 * std::pow(kf, 4) * std::pow(rp, 4)); i = (n - z) / a; x0 = r0 * std::pow(a, (1.0 / 3.0)) / ay; y0 = r0 * std::pow(a, (1.0 / 3.0)) / aden; 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); b3 = 1.0 - 5.0 / std::pow(y0, 2) * (1.0 - 15.0 / (8.0 * y0) + 21.0 / (8.0 * std::pow(y0, 3)) - 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))) * std::exp(-2.0 * y0)); // now calculation of total binding energy a.j. 16.7.96 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 + 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)) + ff * std::pow(z, 2) / a - ca * (n - z) - ael * std::pow(z, (2.39e0)); efl = efl + w * std::abs(i); // pairing is made optional if (optshp >= 2) { // average pairing if (in == iz && (mod(in, 2) == 1) && (mod(iz, 2) == 1) && in > 0.) { efl = efl + w / a; } // AK 2008 - Parametrization of CT model by Ignatyuk; // The following part has been introduced in order to have correspondance // between pairing in masses and level densities; // AK 2010 note that E0 is shifted to correspond to pairing shift in // Fermi-gas model (there, energy is shifted taking odd-odd nuclei // as bassis) G4double para = 0.; parite(a, ¶); if (para < 0.0) { // e-o, o-e e0 = 0.285 + 11.17 * std::pow(a, -0.464) - 0.390 - 0.00058 * (a); } else { G4double parz = 0.; parite(z, &parz); if (parz > 0.0) { // e-e e0 = 22.34 * std::pow(a, -0.464) - 0.235; } else { // o-o e0 = 0.0; } } efl = efl - e0; // end if for pairing term } eflmacResult = efl; return eflmacResult; } void G4Abla::appariem(G4double a, G4double z, G4double* del) { // CALCUL DE LA CORRECTION, DUE A L'APPARIEMENT, DE L'ENERGIE DE // LIAISON D'UN NOYAU // PROCEDURE FOR CALCULATING THE PAIRING CORRECTION TO THE BINDING // ENERGY OF A SPECIFIC NUCLEUS G4double para = 0.0, parz = 0.0; // A MASS NUMBER // Z NUCLEAR CHARGE // PARA HELP VARIABLE FOR PARITY OF A // PARZ HELP VARIABLE FOR PARITY OF Z // DEL PAIRING CORRECTION parite(a, ¶); if (para < 0.0) { (*del) = 0.0; } else { parite(z, &parz); if (parz > 0.0) { (*del) = -12.0 / std::sqrt(a); } else { (*del) = 12.0 / std::sqrt(a); } } } void G4Abla::parite(G4double n, G4double* par) { // CALCUL DE LA PARITE DU NOMBRE N // // PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N. // RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN G4double n1 = 0.0, n2 = 0.0, n3 = 0.0; // N NUMBER TO BE TESTED // N1,N2 HELP VARIABLES // PAR HELP VARIABLE FOR PARITY OF N n3 = G4double(idnint(n)); n1 = n3 / 2.0; n2 = n1 - dint(n1); if (n2 > 0.0) { (*par) = -1.0; } else { (*par) = 1.0; } } G4double G4Abla::tau(G4double bet, G4double homega, G4double ef, G4double t) { // INPUT : BET, HOMEGA, EF, T // OUTPUT: TAU - RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED // 90 PERCENT OF ITS FINAL VALUE // // BETA - NUCLEAR VISCOSITY // HOMEGA - CURVATURE OF POTENTIAL // EF - FISSION BARRIER // T - NUCLEAR TEMPERATURE G4double tauResult = 0.0; G4double tlim = 8.e0 * ef; if (t > tlim) { t = tlim; } // if (bet / (std::sqrt(2.0) * 10.0 * (homega / 6.582122)) <= 1.0) { tauResult = std::log(10.0 * ef / t) / (bet * 1.0e21); } else { tauResult = std::log(10.0 * ef / t) / (2.0 * std::pow((10.0 * homega / 6.582122), 2)) * (bet * 1.0e-21); } // end if return tauResult; } G4double G4Abla::cram(G4double bet, G4double homega) { // INPUT : BET, HOMEGA NUCLEAR VISCOSITY + CURVATURE OF POTENTIAL // OUTPUT: KRAMERS FAKTOR - REDUCTION OF THE FISSION PROBABILITY // INDEPENDENT OF EXCITATION ENERGY G4double rel = bet / (20.0 * homega / 6.582122); G4double cramResult = std::sqrt(1.0 + std::pow(rel, 2)) - rel; // limitation introduced 6.1.2000 by khs if (cramResult > 1.0) { cramResult = 1.0; } return cramResult; } G4double G4Abla::bipol(G4int iflag, G4double y) { // CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS // RELATIVE TO THE SPHERICAL CONFIGURATION // BASED ON MYERS, DROPLET MODEL FOR ARBITRARY SHAPES // INPUT: IFLAG - 0/1 BK/BS CALCULATION // Y - (1 - X) COMPLEMENT OF THE FISSILITY // LINEAR INTERPOLATION OF BS BK TABLE G4int i = 0; G4double bipolResult = 0.0; const G4int bsbkSize = 54; G4double bk[bsbkSize] = { 0.0, 1.00000, 1.00087, 1.00352, 1.00799, 1.01433, 1.02265, 1.03306, 1.04576, 1.06099, 1.07910, 1.10056, 1.12603, 1.15651, 1.19348, 1.23915, 1.29590, 1.35951, 1.41013, 1.44103, 1.46026, 1.47339, 1.48308, 1.49068, 1.49692, 1.50226, 1.50694, 1.51114, 1.51502, 1.51864, 1.52208, 1.52539, 1.52861, 1.53177, 1.53490, 1.53803, 1.54117, 1.54473, 1.54762, 1.55096, 1.55440, 1.55798, 1.56173, 1.56567, 1.56980, 1.57413, 1.57860, 1.58301, 1.58688, 1.58688, 1.58688, 1.58740, 1.58740, 0.0 }; // Zeroes at bk[0], and at // the end added by PK G4double bs[bsbkSize] = { 0.0, 1.00000, 1.00086, 1.00338, 1.00750, 1.01319, 1.02044, 1.02927, 1.03974, 1.05195, 1.06604, 1.08224, 1.10085, 1.12229, 1.14717, 1.17623, 1.20963, 1.24296, 1.26532, 1.27619, 1.28126, 1.28362, 1.28458, 1.28477, 1.28450, 1.28394, 1.28320, 1.28235, 1.28141, 1.28042, 1.27941, 1.27837, 1.27732, 1.27627, 1.27522, 1.27418, 1.27314, 1.27210, 1.27108, 1.27006, 1.26906, 1.26806, 1.26707, 1.26610, 1.26514, 1.26418, 1.26325, 1.26233, 1.26147, 1.26147, 1.26147, 1.25992, 1.25992, 0.0 }; i = idint(y / (2.0e-02)) + 1; if ((i + 1) >= bsbkSize) { if (verboseLevel > 2) { // G4cout <<"G4Abla error: index " << i + 1 << " is greater than array // size permits." << G4endl; } bipolResult = 0.0; } else { if (iflag == 1) { bipolResult = bs[i] + (bs[i + 1] - bs[i]) / 2.0e-02 * (y - 2.0e-02 * (i - 1)); } else { bipolResult = bk[i] + (bk[i + 1] - bk[i]) / 2.0e-02 * (y - 2.0e-02 * (i - 1)); } } return bipolResult; } void G4Abla::fomega_sp(G4double AF, G4double Y, G4double* MFCD, G4double* sOMEGA, G4double* sHOMEGA) { /* c Y 1 - Fissility c OMEGA Frequency at the ground state, in units 1.e-21 s */ G4double OMEGA, HOMEGA, ES0, MR02; ES0 = 20.760 * std::pow(AF, 2.0 / 3.0); // In units 1.e-42 MeVs**2; r0 = 1.175e-15 m, // u=931.49MeV/c**2=103.4MeV*s**2/m**2 divided by 1.e-4 to go from 1.e-46 // to 1.e-42 MR02 = std::pow(AF, 5.0 / 3.0) * 1.0340 * 0.010 * 1.175 * 1.175; // Determination of the inertia of the fission collective degree of freedom (*MFCD) = MR02 * 3.0 / 10.0 * (1.0 + 3.0 * Y); // Omega at saddle OMEGA = std::sqrt(ES0 / MR02) * std::sqrt(8.0 / 3.0 * Y * (1.0 + 304.0 * Y / 255.0)); // HOMEGA = 6.58122 * OMEGA / 10.0; // (*sOMEGA) = OMEGA; (*sHOMEGA) = HOMEGA; // return; } void G4Abla::fomega_gs(G4double AF, G4double ZF, G4double* K1, G4double* sOMEGA, G4double* sHOMEGA) { /* c Y 1 - Fissility c OMEGA Frequency at the ground state, in units 1.e-21 s */ G4double OMEGA, HOMEGA, MR02, MINERT, C, fk1; // MR02 = std::pow(AF, 5.0 / 3.0) * 1.0340 * 0.01 * 1.175 * 1.175; MINERT = 3. * MR02 / 10.0; C = 17.9439 * (1. - 1.7826 * std::pow((AF - 2.0 * ZF) / AF, 2)); fk1 = 0.4 * C * std::pow(AF, 2.0 / 3.0) - 0.1464 * std::pow(ZF, 2) / std::pow(AF, 1. / 3.); OMEGA = std::sqrt(fk1 / MINERT); HOMEGA = 6.58122 * OMEGA / 10.0; // (*K1) = fk1; (*sOMEGA) = OMEGA; (*sHOMEGA) = HOMEGA; // return; } void G4Abla::barrs(G4int Z1, G4int A1, G4int Z2, G4int A2, G4double* sBARR, G4double* sOMEGA) { /* C AK 2004 - Barriers for LCP and IMF are calculated now according to the C Bass model (Nucl. Phys. A (1974)) C KHS 2007 - To speed up, barriers are read from tabels; in case thermal C expansion is considered, barriers are calculated. C INPUT: C EA - Excitation energy per nucleon C Z11, A11 - Charge and mass of daughter nucleus C Z22, A22 - Charge and mass of LCP or IMF C C OUTPUT: C BARR - Barrier C OMEGA - Curvature of the potential C C BASS MODEL NPA 1974 - used only if expansion is considered (OPTEXP=1) C or one wants this model explicitly (OPTBAR=1) C October 2011 - AK - new parametrization of the barrier and its position, C see W.W. Qu et al., NPA 868 (2011) 1; this is now C default option (OPTBAR=0) c c November 2016 - JLRS - Added this function from abla07v4 c */ G4double BARR, OMEGA, RMAX; RMAX = 1.1 * (ecld->rms[A1 - Z1][Z1] + ecld->rms[A2 - Z2][Z2]) + 2.8; BARR = 1.345 * Z1 * Z2 / RMAX; // C Omega according to Avishai: OMEGA = 4.5 / 197.3287; // if(Z1<60){ // if(Z2==1 && A2==2) BARR = BARR * 1.1; // if(Z2==1 && A2==3) BARR = BARR * 1.1; // if(Z2==2 && A2==3) BARR = BARR * 1.3; // if(Z2==2 && A2==4) BARR = BARR * 1.1; // } (*sOMEGA) = OMEGA; (*sBARR) = BARR; // return; } void G4Abla::barfit(G4int iz, G4int ia, G4int il, G4double* sbfis, G4double* segs, G4double* selmax) { // 2223 C VERSION FOR 32BIT COMPUTER // 2224 C THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE // 2225 C GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM // 2226 C AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF // 2227 C H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC // 2228 C NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR // 2229 C MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY // 2230 C 2*PI). // 2231 C // 2232 C THE FISSION BARRIER FO IL = 0 IS CALCULATED FROM A 7TH // 2233 C ORDER FIT IN TWO VARIABLES TO 638 CALCULATED FISSION // 2234 C BARRIERS FOR Z VALUES FROM 20 TO 110. THESE 638 BARRIERS // ARE 2235 C FIT WITH AN RMS DEVIATION OF 0.10 MEV BY THIS 49-PARAMETER // 2236 C FUNCTION. // 2237 C IF BARFIT IS CALLED WITH (IZ,IA) VALUES OUTSIDE THE RANGE // OF 2238 C THE BARRIER HEIGHT IS SET TO 0.0, AND A MESSAGE IS PRINTED // 2239 C ON THE DEFAULT OUTPUT FILE. // 2240 C // 2241 C FOR IL VALUES NOT EQUAL TO ZERO, THE VALUES OF L AT // WHICH 2242 C THE BARRIER IS 80% AND 20% OF THE L=0 VALUE ARE // RESPECTIVELY // 2243 C FIT TO 20-PARAMETER FUNCTIONS OF Z AND A, OVER A MORE // 2244 C RESTRICTED RANGE OF A VALUES, THAN IS THE CASE FOR L = 0. // 2245 C THE VALUE OF L WHERE THE BARRIER DISAPPEARS, LMAX IS FIT // TO 2246 C A 24-PARAMETER FUNCTION OF Z AND A, WITH THE SAME RANGE OF // 2247 C Z AND A VALUES AS L-80 AND L-20. // 2248 C ONCE AGAIN, IF AN (IZ,IA) PAIR IS OUTSIDE OF THE RANGE // OF 2249 C VALIDITY OF THE FIT, THE BARRIER VALUE IS SET TO 0.0 AND A // 2250 C MESSAGE IS PRINTED. THESE THREE VALUES (BFIS(L=0),L-80, // AND 2251 C L-20) AND THE CONSTRINTS OF BFIS = 0 AND D(BFIS)/DL = 0 AT // 2252 C L = LMAX AND L=0 LEAD TO A FIFTH-ORDER FIT TO BFIS(L) FOR // 2253 C L>L-20. THE FIRST THREE CONSTRAINTS LEAD TO A THIRD-ORDER // FIT 2254 C FOR THE REGION L < L-20. 2255 C 2256 C THE // GROUND STATE ENERGIES ARE CALCULATED FROM A 2257 C 120-PARAMETER FIT // IN Z, A, AND L TO 214 GROUND-STATE ENERGIES 2258 C FOR 36 DIFFERENT Z // AND A VALUES. // 2259 C (THE RANGE OF Z AND A IS THE SAME AS FOR L-80, L-20, AND // 2260 C L-MAX) // 2261 C // 2262 C THE CALCULATED BARRIERS FROM WHICH THE FITS WERE MADE // WERE 2263 C CALCULATED IN 1983-1984 BY A. J. SIERK OF LOS // ALAMOS 2264 C NATIONAL LABORATORY GROUP T-9, USING // YUKAWA-PLUS-EXPONENTIAL // 2265 C G4DOUBLE FOLDED NUCLEAR ENERGY, EXACT COULOMB DIFFUSENESS // 2266 C CORRECTIONS, AND DIFFUSE-MATTER MOMENTS OF INERTIA. // 2267 C THE PARAMETERS OF THE MODEL R-0 = 1.16 FM, AS 21.13 MEV, // 2268 C KAPPA-S = 2.3, A = 0.68 FM. // 2269 C THE DIFFUSENESS OF THE MATTER AND CHARGE DISTRIBUTIONS // USED 2270 C CORRESPONDS TO A SURFACE DIFFUSENESS PARAMETER // (DEFINED BY 2271 C MYERS) OF 0.99 FM. THE CALCULATED BARRIERS FOR L = // 0 ARE 2272 C ACCURATE TO A LITTLE LESS THAN 0.1 MEV; THE OUTPUT // FROM 2273 C THIS SUBROUTINE IS A LITTLE LESS ACCURATE. WORST // ERRORS MAY BE // 2274 C AS LARGE AS 0.5 MEV; CHARACTERISTIC UNCERTAINY IS IN THE // RANGE // 2275 C OF 0.1-0.2 MEV. THE RMS DEVIATION OF THE GROUND-STATE FIT // 2276 C FROM THE 214 INPUT VALUES IS 0.20 MEV. THE MAXIMUM ERROR // 2277 C OCCURS FOR LIGHT NUCLEI IN THE REGION WHERE THE GROUND // STATE // 2278 C IS PROLATE, AND MAY BE GREATER THAN 1.0 MEV FOR VERY // NEUTRON // 2279 C DEFICIENT NUCLEI, WITH L NEAR LMAX. FOR MOST NUCLEI LIKELY // TO 2280 C BE ENCOUNTERED IN REAL EXPERIMENTS, THE MAXIMUM ERROR IS // 2281 C CLOSER TO 0.5 MEV, AGAIN FOR LIGHT NUCLEI AND L NEAR LMAX. // 2282 C // 2283 C WRITTEN BY A. J. SIERK, LANL T-9 // 2284 C VERSION 1.0 FEBRUARY, 1984 // 2285 C // 2286 C THE FOLLOWING IS NECESSARY FOR 32-BIT MACHINES LIKE DEC // VAX, 2287 C IBM, ETC G4double pa[7], pz[7], pl[10]; for (G4int init_i = 0; init_i < 7; init_i++) { pa[init_i] = 0.0; pz[init_i] = 0.0; } for (G4int init_i = 0; init_i < 10; init_i++) { pl[init_i] = 0.0; } G4double a = 0.0, z = 0.0, amin = 0.0, amax = 0.0, amin2 = 0.0; G4double amax2 = 0.0, aa = 0.0, zz = 0.0, bfis = 0.0; G4double bfis0 = 0.0, ell = 0.0, el = 0.0, egs = 0.0, el80 = 0.0, el20 = 0.0; 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; G4double aj = 0.0, ak = 0.0, a1 = 0.0, a2 = 0.0; G4int i = 0, j = 0, k = 0, m = 0; G4int l = 0; G4double emncof[4][5] = { { -9.01100e+2, -1.40818e+3, 2.77000e+3, -7.06695e+2, 8.89867e+2 }, { 1.35355e+4, -2.03847e+4, 1.09384e+4, -4.86297e+3, -6.18603e+2 }, { -3.26367e+3, 1.62447e+3, 1.36856e+3, 1.31731e+3, 1.53372e+2 }, { 7.48863e+3, -1.21581e+4, 5.50281e+3, -1.33630e+3, 5.05367e-2 } }; G4double elmcof[4][5] = { { 1.84542e+3, -5.64002e+3, 5.66730e+3, -3.15150e+3, 9.54160e+2 }, { -2.24577e+3, 8.56133e+3, -9.67348e+3, 5.81744e+3, -1.86997e+3 }, { 2.79772e+3, -8.73073e+3, 9.19706e+3, -4.91900e+3, 1.37283e+3 }, { -3.01866e+1, 1.41161e+3, -2.85919e+3, 2.13016e+3, -6.49072e+2 } }; G4double emxcof[4][6] = { { 9.43596e4, -2.241997e5, 2.223237e5, -1.324408e5, 4.68922e4, -8.83568e3 }, { -1.655827e5, 4.062365e5, -4.236128e5, 2.66837e5, -9.93242e4, 1.90644e4 }, { 1.705447e5, -4.032e5, 3.970312e5, -2.313704e5, 7.81147e4, -1.322775e4 }, { -9.274555e4, 2.278093e5, -2.422225e5, 1.55431e5, -5.78742e4, 9.97505e3 } }; G4double elzcof[7][7] = { { 5.11819909e+5, -1.30303186e+6, 1.90119870e+6, -1.20628242e+6, 5.68208488e+5, 5.48346483e+4, -2.45883052e+4 }, { -1.13269453e+6, 2.97764590e+6, -4.54326326e+6, 3.00464870e+6, -1.44989274e+6, -1.02026610e+5, 6.27959815e+4 }, { 1.37543304e+6, -3.65808988e+6, 5.47798999e+6, -3.78109283e+6, 1.84131765e+6, 1.53669695e+4, -6.96817834e+4 }, { -8.56559835e+5, 2.48872266e+6, -4.07349128e+6, 3.12835899e+6, -1.62394090e+6, 1.19797378e+5, 4.25737058e+4 }, { 3.28723311e+5, -1.09892175e+6, 2.03997269e+6, -1.77185718e+6, 9.96051545e+5, -1.53305699e+5, -1.12982954e+4 }, { 4.15850238e+4, 7.29653408e+4, -4.93776346e+5, 6.01254680e+5, -4.01308292e+5, 9.65968391e+4, -3.49596027e+3 }, { -1.82751044e+5, 3.91386300e+5, -3.03639248e+5, 1.15782417e+5, -4.24399280e+3, -6.11477247e+3, 3.66982647e+2 } }; const G4int sizex = 5; const G4int sizey = 6; const G4int sizez = 4; G4double egscof[sizey][sizey][sizez]; G4double egs1[sizey][sizex] = { { 1.927813e5, 7.666859e5, 6.628436e5, 1.586504e5, -7.786476e3 }, { -4.499687e5, -1.784644e6, -1.546968e6, -4.020658e5, -3.929522e3 }, { 4.667741e5, 1.849838e6, 1.641313e6, 5.229787e5, 5.928137e4 }, { -3.017927e5, -1.206483e6, -1.124685e6, -4.478641e5, -8.682323e4 }, { 1.226517e5, 5.015667e5, 5.032605e5, 2.404477e5, 5.603301e4 }, { -1.752824e4, -7.411621e4, -7.989019e4, -4.175486e4, -1.024194e4 } }; G4double egs2[sizey][sizex] = { { -6.459162e5, -2.903581e6, -3.048551e6, -1.004411e6, -6.558220e4 }, { 1.469853e6, 6.564615e6, 6.843078e6, 2.280839e6, 1.802023e5 }, { -1.435116e6, -6.322470e6, -6.531834e6, -2.298744e6, -2.639612e5 }, { 8.665296e5, 3.769159e6, 3.899685e6, 1.520520e6, 2.498728e5 }, { -3.302885e5, -1.429313e6, -1.512075e6, -6.744828e5, -1.398771e5 }, { 4.958167e4, 2.178202e5, 2.400617e5, 1.167815e5, 2.663901e4 } }; G4double egs3[sizey][sizex] = { { 3.117030e5, 1.195474e6, 9.036289e5, 6.876190e4, -6.814556e4 }, { -7.394913e5, -2.826468e6, -2.152757e6, -2.459553e5, 1.101414e5 }, { 7.918994e5, 3.030439e6, 2.412611e6, 5.228065e5, 8.542465e3 }, { -5.421004e5, -2.102672e6, -1.813959e6, -6.251700e5, -1.184348e5 }, { 2.370771e5, 9.459043e5, 9.026235e5, 4.116799e5, 1.001348e5 }, { -4.227664e4, -1.738756e5, -1.795906e5, -9.292141e4, -2.397528e4 } }; G4double egs4[sizey][sizex] = { { -1.072763e5, -5.973532e5, -6.151814e5, 7.371898e4, 1.255490e5 }, { 2.298769e5, 1.265001e6, 1.252798e6, -2.306276e5, -2.845824e5 }, { -2.093664e5, -1.100874e6, -1.009313e6, 2.705945e5, 2.506562e5 }, { 1.274613e5, 6.190307e5, 5.262822e5, -1.336039e5, -1.115865e5 }, { -5.715764e4, -2.560989e5, -2.228781e5, -3.222789e3, 1.575670e4 }, { 1.189447e4, 5.161815e4, 4.870290e4, 1.266808e4, 2.069603e3 } }; for (i = 0; i < sizey; i++) { for (j = 0; j < sizex; j++) { egscof[i][j][0] = egs1[i][j]; egscof[i][j][1] = egs2[i][j]; egscof[i][j][2] = egs3[i][j]; egscof[i][j][3] = egs4[i][j]; } } // the program starts here if (iz < 19 || iz > 122) { goto barfit900; } if (iz > 122 && il > 0) { goto barfit902; } z = G4double(iz); a = G4double(ia); el = G4double(il); amin = 1.2e0 * z + 0.01e0 * z * z; amax = 5.8e0 * z - 0.024e0 * z * z; if (a < amin || a > amax) { goto barfit910; } // angul.mom.zero barrier aa = 2.5e-3 * a; zz = 1.0e-2 * z; ell = 1.0e-2 * el; bfis0 = 0.0; lpoly(zz, 7, pz); lpoly(aa, 7, pa); for (i = 0; i < 7; i++) { // do 10 i=1,7 for (j = 0; j < 7; j++) { // do 10 j=1,7 bfis0 = bfis0 + elzcof[j][i] * pz[i] * pa[j]; } } bfis = bfis0; (*sbfis) = bfis; egs = 0.0; (*segs) = egs; // values of l at which the barrier // is 20%(el20) and 80%(el80) of l=0 value amin2 = 1.4e0 * z + 0.009e0 * z * z; amax2 = 20.e0 + 3.0e0 * z; if ((a < amin2 - 5.e0 || a > amax2 + 10.e0) && il > 0) { goto barfit920; } lpoly(zz, 5, pz); lpoly(aa, 4, pa); el80 = 0.0; el20 = 0.0; elmax = 0.0; for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { el80 = el80 + elmcof[i][j] * pz[j] * pa[i]; el20 = el20 + emncof[i][j] * pz[j] * pa[i]; } } sel80 = el80; sel20 = el20; // value of l (elmax) where barrier disapp. lpoly(zz, 6, pz); lpoly(ell, 9, pl); for (i = 0; i < 4; i++) { // do 30 i= 1,4 for (j = 0; j < 6; j++) { // do 30 j=1,6 elmax = elmax + emxcof[i][j] * pz[j] * pa[i]; } } (*selmax) = elmax; // value of barrier at ang.mom. l if (il < 1) { return; } x = sel20 / (*selmax); y = sel80 / (*selmax); if (el <= sel20) { // low l q = 0.2 / (std::pow(sel20, 2) * std::pow(sel80, 2) * (sel20 - sel80)); qa = q * (4.0 * std::pow(sel80, 3) - std::pow(sel20, 3)); qb = -q * (4.0 * std::pow(sel80, 2) - std::pow(sel20, 2)); bfis = bfis * (1.0 + qa * std::pow(el, 2) + qb * std::pow(el, 3)); } else { // high l aj = (-20.0 * std::pow(x, 5) + 25.e0 * std::pow(x, 4) - 4.0) * std::pow((y - 1.0), 2) * y * y; ak = (-20.0 * std::pow(y, 5) + 25.0 * std::pow(y, 4) - 1.0) * std::pow((x - 1.0), 2) * x * x; q = 0.2 / (std::pow((y - x) * ((1.0 - x) * (1.0 - y) * x * y), 2)); qa = q * (aj * y - ak * x); qb = -q * (aj * (2.0 * y + 1.0) - ak * (2.0 * x + 1.0)); z = el / (*selmax); a1 = 4.0 * std::pow(z, 5) - 5.0 * std::pow(z, 4) + 1.0; a2 = qa * (2.e0 * z + 1.e0); bfis = bfis * (a1 + (z - 1.e0) * (a2 + qb * z) * z * z * (z - 1.e0)); } if (bfis <= 0.0) { bfis = 0.0; } if (el > (*selmax)) { bfis = 0.0; } (*sbfis) = bfis; // now calculate rotating ground state energy if (el > (*selmax)) { return; } for (k = 0; k < 4; k++) { for (l = 0; l < 6; l++) { for (m = 0; m < 5; m++) { egs = egs + egscof[l][m][k] * pz[l] * pa[k] * pl[2 * m]; } } } (*segs) = egs; if ((*segs) < 0.0) { (*segs) = 0.0; } return; barfit900: // continue (*sbfis) = 0.0; // for z<19 sbfis set to 1.0e3 if (iz < 19) { (*sbfis) = 1.0e3; } (*segs) = 0.0; (*selmax) = 0.0; return; barfit902: (*sbfis) = 0.0; (*segs) = 0.0; (*selmax) = 0.0; return; barfit910: (*sbfis) = 0.0; (*segs) = 0.0; (*selmax) = 0.0; return; barfit920: (*sbfis) = 0.0; (*segs) = 0.0; (*selmax) = 0.0; return; } G4double G4Abla::erf(G4double x) { G4double ferf; if (x < 0.) { ferf = -gammp(0.5, x * x); } else { ferf = gammp(0.5, x * x); ; } return ferf; } G4double G4Abla::gammp(G4double a, G4double x) { G4double fgammp; G4double gammcf, gamser, gln = 0.; if (x < 0.0 || a <= 0.0) std::cout << "G4Abla::gammp = bad arguments in gammp" << std::endl; if (x < a + 1.) { gser(&gamser, a, x, gln); fgammp = gamser; } else { gcf(&gammcf, a, x, gln); fgammp = 1. - gammcf; } return fgammp; } void G4Abla::gcf(G4double* gammcf, G4double a, G4double x, G4double gln) { G4double fgammcf, del; G4double eps = 3e-7; G4double fpmin = 1e-30; G4int itmax = 100; G4double an, b, c, d, h; gln = gammln(a); b = x + 1. - a; c = 1. / fpmin; d = 1. / b; h = d; for (G4int i = 1; i <= itmax; i++) { an = -i * (i - a); b = b + 2.; d = an * d + b; if (std::fabs(d) < fpmin) d = fpmin; c = b + an / c; if (std::fabs(c) < fpmin) c = fpmin; d = 1.0 / d; del = d * c; h = h * del; if (std::fabs(del - 1.) < eps) goto dir1; } std::cout << "a too large, ITMAX too small in gcf" << std::endl; dir1: fgammcf = std::exp(-x + a * std::log(x) - gln) * h; (*gammcf) = fgammcf; return; } void G4Abla::gser(G4double* gamser, G4double a, G4double x, G4double gln) { G4double fgamser, ap, sum, del; G4double eps = 3e-7; G4int itmax = 100; gln = gammln(a); if (x <= 0.) { if (x < 0.) std::cout << "G4Abla::gser = x < 0 in gser" << std::endl; (*gamser) = 0.0; return; } ap = a; sum = 1. / a; del = sum; for (G4int n = 0; n < itmax; n++) { ap = ap + 1.; del = del * x / ap; sum = sum + del; if (std::fabs(del) < std::fabs(sum) * eps) goto dir1; } std::cout << "a too large, ITMAX too small in gser" << std::endl; dir1: fgamser = sum * std::exp(-x + a * std::log(x) - gln); (*gamser) = fgamser; return; } G4double G4Abla::gammln(G4double xx) { G4double fgammln, x, ser, tmp, y; G4double cof[6] = { 76.18009172947146, -86.50532032941677, 24.01409824083091, -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5 }; G4double stp = 2.5066282746310005; x = xx; y = x; tmp = x + 5.5; tmp = (x + 0.5) * std::log(tmp) - tmp; ser = 1.000000000190015; for (G4int j = 0; j < 6; j++) { y = y + 1.; ser = ser + cof[j] / y; } return fgammln = tmp + std::log(stp * ser / x); } G4double G4Abla::fd(G4double E) { // DISTRIBUTION DE MAXWELL return (E * std::exp(-E)); } G4double G4Abla::f(G4double E) { // FONCTION INTEGRALE DE FD(E) return (1.0 - (E + 1.0) * std::exp(-E)); } G4double G4Abla::fmaxhaz(G4double x) { return (-x * std::log(G4AblaRandom::flat()) - x * std::log(G4AblaRandom::flat()) - x * std::log(G4AblaRandom::flat())); } G4double G4Abla::fmaxhaz_old(G4double T) { // tirage aleatoire dans une maxwellienne // t : temperature // // declaration des variables // const G4int pSize = 101; G4double p[pSize]; // ial generateur pour le cascade (et les iy pour eviter les correlations) G4int i = 0; G4int itest = 0; // programme principal // calcul des p(i) par approximation de newton p[pSize - 1] = 8.0; G4double x = 0.1; G4double x1 = 0.0; G4double y = 0.0; if (itest == 1) { goto fmaxhaz120; } for (i = 1; i <= 99; i++) { fmaxhaz20: x1 = x - (f(x) - G4double(i) / 100.0) / fd(x); x = x1; if (std::fabs(f(x) - G4double(i) / 100.0) < 1e-5) { goto fmaxhaz100; } goto fmaxhaz20; fmaxhaz100: p[i] = x; } // end do // itest = 1; itest = 0; // tirage aleatoire et calcul du x correspondant // par regression lineaire fmaxhaz120: y = G4AblaRandom::flat(); i = nint(y * 100); // 2590 c ici on evite froidement les depassements de tableaux....(a.b. // 3/9/99) if (i == 0) { goto fmaxhaz120; } if (i == 1) { x = p[i] * y * 100; } else { x = (p[i] - p[i - 1]) * (y * 100 - i) + p[i]; } return (x * T); } void G4Abla::guet(G4double* x_par, G4double* z_par, G4double* find_par) { // TABLE DE MASSES ET FORMULE DE MASSE TIRE DU PAPIER DE BRACK-GUET // Gives the theoritical value for mass excess... // Revisee pour x, z flottants 25/4/2002 // real*8 x,z // dimension q(0:50,0:70) G4double x = (*x_par); G4double z = (*z_par); G4double find = (*find_par); const G4int qrows = 50; const G4int qcols = 70; G4double q[qrows][qcols]; for (G4int init_i = 0; init_i < qrows; init_i++) { for (G4int init_j = 0; init_j < qcols; init_j++) { q[init_i][init_j] = 0.0; } } G4int ix = G4int(std::floor(x + 0.5)); G4int iz = G4int(std::floor(z + 0.5)); G4double zz = iz; G4double xx = ix; find = 0.0; G4double avol = 15.776; G4double asur = -17.22; G4double ac = -10.24; G4double azer = 8.0; G4double xjj = -30.03; G4double qq = -35.4; G4double c1 = -0.737; G4double c2 = 1.28; if (ix <= 7) { q[0][1] = 939.50; q[1][1] = 938.21; q[1][2] = 1876.1; q[1][3] = 2809.39; q[2][4] = 3728.34; q[2][3] = 2809.4; q[2][5] = 4668.8; q[2][6] = 5606.5; q[3][5] = 4669.1; q[3][6] = 5602.9; q[3][7] = 6535.27; q[4][6] = 5607.3; q[4][7] = 6536.1; q[5][7] = 6548.3; find = q[iz][ix]; } else { G4double xneu = xx - zz; G4double si = (xneu - zz) / xx; G4double x13 = std::pow(xx, .333); G4double ee1 = c1 * zz * zz / x13; G4double ee2 = c2 * zz * zz / xx; G4double aux = 1. + (9. * xjj / 4. / qq / x13); G4double ee3 = xjj * xx * si * si / aux; G4double ee4 = avol * xx + asur * (std::pow(xx, .666)) + ac * x13 + azer; G4double tota = ee1 + ee2 + ee3 + ee4; find = 939.55 * xneu + 938.77 * zz - tota; } (*x_par) = x; (*z_par) = z; (*find_par) = find; } // void G4Abla::FillData(G4int IMULTBU, G4int IEV_TAB) { const G4double c = 29.9792458; const G4double fmp = 938.27231, fmn = 939.56563, fml = 1115.683; varntp->ntrack = IMULTBU + IEV_TAB; for (G4int i = 0; i < IMULTBU; i++) { G4int iz = nint(BU_TAB[i][7]); G4int ia = nint(BU_TAB[i][8]); G4int is = nint(BU_TAB[i][11]); Ainit = Ainit + ia; Zinit = Zinit + iz; Sinit = Sinit - is; varntp->zvv.push_back(iz); varntp->avv.push_back(ia); varntp->svv.push_back(-1 * is); varntp->itypcasc.push_back(0); 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]; G4double gamma = std::sqrt(1.0 - v2 / (c * c)); G4double avvmass = iz * fmp + (ia - iz - is) * fmn + is * fml + eflmac(ia, iz, 0, 3); G4double etot = avvmass / gamma; varntp->pxlab.push_back(etot * BU_TAB[i][4] / c); varntp->pylab.push_back(etot * BU_TAB[i][5] / c); varntp->pzlab.push_back(etot * BU_TAB[i][6] / c); varntp->enerj.push_back(etot - avvmass); } for (G4int i = 0; i < IEV_TAB; i++) { G4int iz = nint(EV_TAB[i][0]); G4int ia = nint(EV_TAB[i][1]); G4int is = EV_TAB[i][5]; varntp->itypcasc.push_back(0); if (ia > 0) { // normal particles varntp->zvv.push_back(iz); varntp->avv.push_back(ia); varntp->svv.push_back(-1 * is); Ainit = Ainit + ia; Zinit = Zinit + iz; Sinit = Sinit - is; 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]; G4double gamma = std::sqrt(1.0 - v2 / (c * c)); G4double avvmass = iz * fmp + (ia - iz - is) * fmn + is * fml + eflmac(ia, iz, 0, 3); G4double etot = avvmass / gamma; varntp->pxlab.push_back(etot * EV_TAB[i][2] / c); varntp->pylab.push_back(etot * EV_TAB[i][3] / c); varntp->pzlab.push_back(etot * EV_TAB[i][4] / c); varntp->enerj.push_back(etot - avvmass); } else if (ia == -2) { // lambda0 varntp->zvv.push_back(0); varntp->avv.push_back(1); varntp->svv.push_back(-1); Ainit = Ainit + 1; Sinit = Sinit - 1; 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]; G4double gamma = std::sqrt(1.0 - v2 / (c * c)); G4double avvmass = fml; G4double etot = avvmass / gamma; varntp->pxlab.push_back(etot * EV_TAB[i][2] / c); varntp->pylab.push_back(etot * EV_TAB[i][3] / c); varntp->pzlab.push_back(etot * EV_TAB[i][4] / c); varntp->enerj.push_back(etot - avvmass); } else { // photons varntp->zvv.push_back(iz); varntp->avv.push_back(ia); varntp->svv.push_back(0); Ainit = Ainit + ia; Zinit = Zinit + iz; Sinit = Sinit - is; varntp->pxlab.push_back(EV_TAB[i][2]); varntp->pylab.push_back(EV_TAB[i][3]); varntp->pzlab.push_back(EV_TAB[i][4]); varntp->enerj.push_back( 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])); } } // return; } // Utilities G4double G4Abla::min(G4double a, G4double b) { if (a < b) { return a; } else { return b; } } G4int G4Abla::min(G4int a, G4int b) { if (a < b) { return a; } else { return b; } } G4double G4Abla::max(G4double a, G4double b) { if (a > b) { return a; } else { return b; } } G4int G4Abla::max(G4int a, G4int b) { if (a > b) { return a; } else { return b; } } G4double G4Abla::DSIGN(G4double a, G4double b) { // A function that assigns the sign of the second argument to the // absolute value of the first if (b >= 0) { return std::abs(a); } else { return -1.0 * std::abs(a); } return 0; } G4int G4Abla::ISIGN(G4int a, G4int b) { // A function that assigns the sign of the second argument to the // absolute value of the first if (b >= 0) { return std::abs(a); } else { return -1 * std::abs(a); } return 0; } G4int G4Abla::nint(G4double number) { G4double intpart = 0.0; G4double fractpart = 0.0; fractpart = std::modf(number, &intpart); if (number == 0) { return 0; } if (number > 0) { if (fractpart < 0.5) { return G4int(std::floor(number)); } else { return G4int(std::ceil(number)); } } if (number < 0) { if (fractpart < -0.5) { return G4int(std::floor(number)); } else { return G4int(std::ceil(number)); } } return G4int(std::floor(number)); } G4int G4Abla::secnds(G4int x) { time_t mytime; tm* mylocaltime; time(&mytime); mylocaltime = localtime(&mytime); if (x == 0) { return (mylocaltime->tm_hour * 60 * 60 + mylocaltime->tm_min * 60 + mylocaltime->tm_sec); } else { return G4int(mytime - x); } } G4int G4Abla::mod(G4int a, G4int b) { if (b != 0) { return a % b; } else { return 0; } } G4double G4Abla::dint(G4double x) { G4double value = 0.0; /* if(a < 0.0) { value = double(std::ceil(a)); } else { value = double(std::floor(a)); } */ if (x - std::floor(x) <= std::ceil(x) - x) value = G4double(std::floor(x)); else value = G4double(std::ceil(x)); return value; } G4int G4Abla::idint(G4double x) { G4int value = 0; if (x - std::floor(x) <= std::ceil(x) - x) value = G4int(std::floor(x)); else value = G4int(std::ceil(x)); return value; } G4int G4Abla::idnint(G4double x) { if (x - std::floor(x) <= std::ceil(x) - x) return G4int(std::floor(x)); else return G4int(std::ceil(x)); } G4double G4Abla::dmin1(G4double a, G4double b, G4double c) { if (a < b && a < c) { return a; } if (b < a && b < c) { return b; } if (c < a && c < b) { return c; } return a; } G4double G4Abla::utilabs(G4double a) { return std::abs(a); } G4double G4Abla::width(G4double AMOTHER, G4double ZMOTHER, G4double APART, G4double ZPART, G4double TEMP, G4double B1, G4double SB1, G4double EXC) { /* * Implemented by JLRS for Abla c++: 06/11/2016 * C Last update: C 28/10/13 - JLRS - from abrablav4 (AK) */ G4int IZPART, IAPART, NMOTHER; G4double B, HBAR, PI, RGEOM, MPART, SB; G4double BKONST, C, C2, G, APARTNER, MU; G4double INT1, INT2, INT3, AKONST, EARG, R0, MPARTNER; G4double AEXP; G4double ARG; G4double PAR_A1 = 0., PAR_B1 = 0., FACT = 1.; G4double fwidth = 0.; G4int idlamb0 = 0; PI = 3.141592654; if (ZPART == -2.) { ZPART = 0.; idlamb0 = 1; } IZPART = idnint(ZPART); IAPART = idnint(APART); B = B1; SB = SB1; NMOTHER = idnint(AMOTHER - ZMOTHER); PAR_A1 = 0.0; PAR_B1 = 0.0; if (SB > EXC) { return fwidth = 0.0; } else { // in MeV*s HBAR = 6.582122e-22; // HBAR2 = HBAR * HBAR // in m/s C = 2.99792458e8; C2 = C * C; APARTNER = AMOTHER - APART; MPARTNER = APARTNER * 931.49 / C2; // g=(2s+1) if (IAPART == 1 && IZPART == 0) { G = 2.0; MPART = 939.56 / C2; if (idlamb0 == 1) MPART = 1115.683 / C2; } else { if (IAPART == 1 && IZPART == 1) { G = 2.0; MPART = 938.27 / C2; } else { if (IAPART == 2 && IZPART == 0) { G = 1.0; MPART = 2. * 939.56 / C2; } else { if (IAPART == 2 && IZPART == 1) { G = 3.0; MPART = 1876.10 / C2; } else { if (IAPART == 3 && IZPART == 1) { G = 2.0; MPART = 2809.39 / C2; } else { if (IAPART == 3 && IZPART == 2) { G = 2.0; MPART = 2809.37 / C2; } else { if (IAPART == 4 && IZPART == 2) { G = 1.0; MPART = 3728.35 / C2; } else { // IMF G = 1.0; MPART = APART * 931.49 / C2; } } } } } } } // end g // Relative mass in MeV*s^2/m^2 MU = MPARTNER * MPART / (MPARTNER + MPART); // in m R0 = 1.16e-15; RGEOM = R0 * (std::pow(APART, 1.0 / 3.0) + std::pow(AMOTHER - APART, 1.0 / 3.0)); // in m*sqrt(MeV) AKONST = HBAR * std::sqrt(1.0 / MU); // in 1/(MeV*m^2) BKONST = MPART / (PI * PI * HBAR * HBAR); // // USING ANALYTICAL APPROXIMATION INT1 = 2.0 * std::pow(TEMP, 3.) / (2.0 * TEMP + B); ARG = std::sqrt(B / TEMP); EARG = (erf(ARG) - 1.0); if (std::abs(EARG) < 1.e-9) EARG = 0.0; if (B == 0.0) { INT2 = 0.5 * std::sqrt(PI) * std::pow(TEMP, 3.0 / 2.0); } else { AEXP = B / TEMP; if (AEXP > 700.0) AEXP = 700.0; INT2 = (2.0 * B * B + TEMP * B) / std::sqrt(B) + std::exp(AEXP) * std::sqrt(PI / (4.0 * TEMP)) * (4.0 * B * B + 4.0 * B * TEMP - TEMP * TEMP) * EARG; if (INT2 < 0.0) INT2 = 0.0; // For very low temperatures when EARG=0, INT2 get unreasonably high // values comming from the first term. Therefore, for these cases INT2 is // set to 0. if (EARG == 0.0) INT2 = 0.0; } // if B INT3 = 2.0 * TEMP * TEMP * TEMP / (2.0 * TEMP * TEMP + 4.0 * B * TEMP + B * B); if (IZPART < -1.0 && ZMOTHER < 151.0) { // IF(IZPART.LT.1)THEN // For neutrons, the width is given by a mean value between geometrical // and QM values; Only QM contribution (Rgeom -> Rgeom + Rlamda) seems to // be too strong for neutrons fwidth = PI * BKONST * G * std::sqrt((RGEOM * RGEOM * INT1 + 2.0 * AKONST * RGEOM * INT2 + AKONST * AKONST * INT3) * RGEOM * RGEOM * INT1); } else { fwidth = PI * BKONST * G * (RGEOM * RGEOM * INT1 + 2.0 * AKONST * RGEOM * INT2 + AKONST * AKONST * INT3); } // To correct for too high values of analytical width compared to // numerical solution for energies close to the particle threshold: if (IZPART < 3.0) { if (AMOTHER < 155.0) { PAR_A1 = std::exp(2.302585 * 0.2083 * std::exp(-0.01548472 * AMOTHER)) - 0.05; PAR_B1 = 0.59939389 + 0.00915657 * AMOTHER; } else { if (AMOTHER > 154.0 && AMOTHER < 195.0) { PAR_A1 = 1.0086961 - 8.629e-5 * AMOTHER; PAR_B1 = 1.5329331 + 0.00302074 * AMOTHER; } else { if (AMOTHER > 194.0 && AMOTHER < 208.0) { PAR_A1 = 9.8356347 - 0.09294663 * AMOTHER + 2.441e-4 * AMOTHER * AMOTHER; PAR_B1 = 7.7701987 - 0.02897401 * AMOTHER; } else { if (AMOTHER > 207.0 && AMOTHER < 228.0) { PAR_A1 = 15.107385 - 0.12414415 * AMOTHER + 2.7222e-4 * AMOTHER * AMOTHER; PAR_B1 = -64.078009 + 0.56813179 * AMOTHER - 0.00121078 * AMOTHER * AMOTHER; } else { if (AMOTHER > 227.0) { if (mod(NMOTHER, 2) == 0 && NMOTHER > 147.) { PAR_A1 = 2.0 * (0.9389118 + 6.4559e-5 * AMOTHER); } else { if (mod(NMOTHER, 2) == 1) PAR_A1 = 3.0 * (0.9389118 + 6.4559e-5 * AMOTHER); } PAR_B1 = 2.1507177 + 0.00146119 * AMOTHER; } } } } } FACT = std::exp((2.302585 * PAR_A1 * std::exp(-PAR_B1 * (EXC - SB)))); if (FACT < 1.0) FACT = 1.0; if (IZPART < -1. && ZMOTHER < 151.0) { // IF(IZPART.LT.1)THEN fwidth = fwidth / std::sqrt(FACT); } else { fwidth = fwidth / FACT; } } // if IZPART<3.0 if (fwidth <= 0.0) { std::cout << "LOOK IN PARTICLE_WIDTH!" << std::endl; std::cout << "ACN,APART :" << AMOTHER << APART << std::endl; std::cout << "EXC,TEMP,B,SB :" << EXC << " " << TEMP << " " << B << " " << SB << std::endl; std::cout << "INTi, i=1-3 :" << INT1 << " " << INT2 << " " << INT3 << std::endl; std::cout << " " << std::endl; } } // if SB>EXC return fwidth; } G4double G4Abla::pen(G4double A, G4double ap, G4double omega, G4double T) { // JLRS: 06/11/2016 // CORRECTIONS FOR BARRIER PENETRATION // AK, KHS 2005 - Energy-dependen inverse cross sections included, influence // of // Coulomb barrier for LCP, tunnelling for LCP G4double fpen = 0., MU, HO; // REDUCED MASSES (IN MeV/C**2) MU = (A - ap) * ap / A; // ENERGY OF THE INVERSE PARABOLA AT THE POTENTIAL BARRIER (hbar*omega); // HERE hbar = 197.3287 fm*MeV/c, omega is in c/fm HO = 197.3287 * omega; if (T <= 0.0) { fpen = 0.0; } else { fpen = std::pow(10.0, 4.e-4 * std::pow(T / (HO * HO * std::pow(MU, 0.25)), -4.3 / 2.3026)); } return fpen; } void G4Abla::bsbkbc(G4double A, G4double Z, G4double* BS, G4double* BK, G4double* BC) { // Calculate BS and BK needed for a level-density parameter: // BETA2 and BETA4 = quadrupole and hexadecapole deformation G4double PI = 3.14159265; G4int IZ = idnint(Z); G4int IN = idnint(A - Z); // alphaN = sqrt(2*N/(4*pi))*BetaN G4double ALPHA2 = std::sqrt(5.0 / (4.0 * PI)) * ecld->beta2[IN][IZ]; G4double ALPHA4 = std::sqrt(9.0 / (4.0 * PI)) * ecld->beta4[IN][IZ]; (*BS) = 1.0 + 0.4 * ALPHA2 * ALPHA2 - 4.0 / 105.0 * ALPHA2 * ALPHA2 * ALPHA2 - 66.0 / 175.0 * ALPHA2 * ALPHA2 * ALPHA2 * ALPHA2 - 4.0 / 35.0 * ALPHA2 * ALPHA2 * ALPHA4 + ALPHA4 * ALPHA4; (*BK) = 1.0 + 0.4 * ALPHA2 * ALPHA2 + 16.0 / 105.0 * ALPHA2 * ALPHA2 * ALPHA2 - 82.0 / 175.0 * ALPHA2 * ALPHA2 * ALPHA2 * ALPHA2 + 2.0 / 35.0 * ALPHA2 * ALPHA2 * ALPHA4 + ALPHA4 * ALPHA4; (*BC) = 0.0; return; } G4double G4Abla::fvmaxhaz(G4double T) { // Random generator according to a distribution similar to a // Maxwell distribution with quantum-mech. x-section for charged particles // according to KHS // Y = X**(1.5E0) / (B+X) * EXP(-X/T) (approximation:) return ( 3.0 * T * std::pow(-1. * std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()), 0.333333)); } G4double G4Abla::func_trans(G4double TIME, G4double ZF, G4double AF, G4double bet, G4double Y, G4double FT, G4double T_0) { /* c This function determines the fission width as a function o time c according to the analytical solution of the FPE for the probability distribution c at the barrier when the nucleus potential is aproximated by a parabolic c potential. It is taken from S. Chandrasekhar, Rev. Mod. Phys. 15 (1943) 1 c c***********************INPUT PARAMETERS********************************* c Time Time at which we evaluate the fission width c ZF Z of nucleus C AF A of nucleus c BET Reduced dissipation coefficient c FT Nuclear temperature C************************************************************************** C********************************OUTPUT*********************************** C Fission decay width at the corresponding time of the decay cascade C************************************************************************* c****************************OTHER VARIABLES****************************** C SIGMA_SQR Square of the width of the prob. distribution C XB Deformation of the nucleus at the saddle point c NORM Normalization factor of the probability distribution c W Probability distribution at the saddle deformation XB c W_INFIN Probability distr. at XB at infinite time c MFCD Mass of the fission collective degree of freedom C************************************************************************* */ G4double PI = 3.14159; G4double DEFO_INIT, OMEGA, HOMEGA, OMEGA_GS, HOMEGA_GS, K1, MFCD; G4double BET1, XACT, SIGMA_SQR, W_EXP, XB, NORM, SIGMA_SQR_INF, W_INFIN, W; G4double FUNC_TRANS, LOG_SLOPE_INF, LOG_SLOPE_ABS; // // Influence of initial deformation // Initial alpha2 deformation (GS) DEFO_INIT = std::sqrt(5.0 / (4.0 * PI)) * ecld->beta2[fiss->at - fiss->zt][fiss->zt]; // fomega_sp(AF, Y, &MFCD, &OMEGA, &HOMEGA); fomega_gs(AF, ZF, &K1, &OMEGA_GS, &HOMEGA_GS); // // Determination of the square of the width of the probability distribution // For the overdamped regime BET**2 > 4*OMEGA**2 if ((bet * bet) > 4.0 * OMEGA_GS * OMEGA_GS) { BET1 = std::sqrt(bet * bet - 4.0 * OMEGA_GS * OMEGA_GS); // // REMEMBER THAT HOMEGA IS ACTUALLY HBAR*HOMEGA1=1MeV // SO THAT HOMEGA1 = HOMEGA/HBAR // SIGMA_SQR = (FT / K1) * (1.0 - ((2.0 * bet * bet / (BET1 * BET1) * (0.5 * (std::exp(0.50 * (BET1 - bet) * 1.e21 * TIME) - std::exp(0.5 * (-BET1 - bet) * 1.e21 * TIME))) * (0.5 * (std::exp(0.50 * (BET1 - bet) * 1.e21 * TIME) - std::exp(0.5 * (-BET1 - bet) * 1.e21 * TIME)))) + (bet / BET1 * 0.50 * (std::exp((BET1 - bet) * 1.e21 * TIME) - std::exp((-BET1 - bet) * 1.e21 * TIME))) + 1. * std::exp(-bet * 1.e21 * TIME))); // // Evolution of the mean x-value (KHS March 2006) XACT = DEFO_INIT * std::exp(-0.5 * (bet - BET1) * 1.e21 * (TIME - T_0)); // } else { // For the underdamped regime BET**2 < 4*HOMEGA**2 BET1 becomes a complex // number and the expression with sinh and cosh can be transformed in one // with sin and cos BET1 = std::sqrt(4.0 * OMEGA_GS * OMEGA_GS - bet * bet); SIGMA_SQR = FT / K1 * (1. - std::exp(-1.0 * bet * 1.e21 * TIME) * (bet * bet / (BET1 * BET1) * (1. - std::cos(BET1 * 1.e21 * TIME)) + bet / BET1 * std::sin(BET1 * 1.e21 * TIME) + 1.0)); XACT = DEFO_INIT * std::cos(0.5 * BET1 * 1.e21 * (TIME - T_0)) * std::exp(-bet * 1.e21 * (TIME - T_0)); } // Determination of the deformation at the saddle point according to // "Geometrical relationships of Macroscopic Nucl. Phys." from Hass and Myers // page 100 This corresponds to alpha2 deformation. XB = 7. / 3. * Y - 938. / 765. * Y * Y + 9.499768 * Y * Y * Y - 8.050944 * Y * Y * Y * Y; // // Determination of the probability distribution at the saddle deformation // if (SIGMA_SQR > 0.0) { NORM = 1. / std::sqrt(2. * PI * SIGMA_SQR); // W_EXP = -1. * (XB - XACT) * (XB - XACT) / (2.0 * SIGMA_SQR); if (W_EXP < (-708.0)) W_EXP = -708.0; W = NORM * std::exp(W_EXP) * FT / (K1 * SIGMA_SQR); } else { W = 0.0; } // // Determination of the fission decay width, we assume we are in the // overdamped regime // SIGMA_SQR_INF = FT / K1; W_EXP = -XB * XB / (2.0 * SIGMA_SQR_INF); if (W_EXP < (-708.0)) W_EXP = -708.0; W_INFIN = std::exp(W_EXP) / std::sqrt(2.0 * PI * SIGMA_SQR_INF); FUNC_TRANS = W / W_INFIN; // // Correction for the variation of the mean velocity at the fission barrier // (see B. Jurado et al, Nucl. Phys. A747, p. 14) // LOG_SLOPE_INF = cram(bet, HOMEGA) * bet * MFCD * OMEGA / FT; LOG_SLOPE_ABS = (XB - XACT) / SIGMA_SQR - XB / SIGMA_SQR_INF + cram(bet, HOMEGA) * bet * MFCD * OMEGA / FT; // FUNC_TRANS = FUNC_TRANS * LOG_SLOPE_ABS / LOG_SLOPE_INF; // return FUNC_TRANS; } void G4Abla::part_fiss(G4double BET, G4double GP, G4double GF, G4double Y, G4double TAUF, G4double TS1, G4double TSUM, G4int* CHOICE, G4double ZF, G4double AF, G4double FT, G4double* T_LAPSE, G4double* GF_LOC) { /* C THIS SUBROUTINE IS AIMED TO CHOOSE BETWEEN PARTICLE EMISSION C AND FISSION C WE USE MONTE-CARLO METHODS AND SAMPLE TIME BETWEEN T=0 AND T=1.5*TAUF c TO SIMULATE THE TRANSIENT TIME WITH 30 STEPS (0.05*TAUF EACH) C FOR t>1.5*TAUF , GF=CONSTANT=ASYMPTOTICAL VALUE (INCLUDING KRAMERS FACTOR) c------------------------------------------------------------------------ c Modifications introduced by BEATRIZ JURADO 18/10/01: c 1. Now this subrutine is included in the rutine direct c 2. TSUM does not include the current particle decay time C 3. T_LAPSE is the time until decay, taken as an output variable C 4. GF_LOC is also taken as an output variable C 5. BET (Diss. Coeff.) and HOMEGA (Frequency at the ground state c are included as input variables because they are needed for FUNC_TRANS C----------------------------------------------------------------------- C ON INPUT: C GP Partial particle decay width C GF Asymptotic value of Gamma-f, including Kramers factor C AF Mass number of nucleus C TAUF Transient time C TS1 Partial particle decay time for the next step C TSUM Total sum of partial particle decay times, including C the next expected one, which is in competition C with fission now C ZF Z of nucleus C AF A of nucleus C----------------------------------------------------------------------- C ON OUTPUT: C CHOICE Key for decay mode: 0 = no decay (only internal) C 1 = evaporation C 2 = fission C----------------------------------------------------------------------- C VARIABLES: C GP Partial particle decay width C GF Asymptotic value of Gamma-f, including Kramers factor C TAUF Transient time C TS1 Partial particle decay time C TSUM Total sum of partial particle decay times C CHOICE Key for decay mode C ZF Z of nucleus C AF A of nucleus C FT Used for Fermi function in FUNC_TRANS C STEP_LENGTH Step in time to sample different decays C BEGIN_TIME Total sum of partial particle decay times, excluding C the next expected one, which is in competition C with fission now C LOC_TIME_BEGIN Begin of time interval considered in one step C LOC_TIME_END End of time interval considered in one step C GF_LOC In-grow function for fission width, c normalized to asymptotic value C TS2 Effective partial fission decay time in one time step C HBAR hbar C T_LAPSE Effective decay time in one time step C REAC_PROB Reaction probability in one time step C X Help variable for random generator C------------------------------------------------------------------------ */ G4double K1, OMEGA, HOMEGA, t_0, STEP_LENGTH, LOC_TIME_BEGIN, LOC_TIME_END = 0., BEGIN_TIME = 0., FISS_PROB, X, TS2, LAMBDA, REAC_PROB; G4double HBAR = 6.582122e-22; G4int fchoice = 0; G4double fGF_LOC = 0., fT_LAPSE = 0.; // if (GF <= 0.0) { *CHOICE = 1; *T_LAPSE = TS1; *GF_LOC = 0.0; goto direct107; } // fomega_gs(AF, ZF, &K1, &OMEGA, &HOMEGA); // // **************************************************************** // Calculation of the shift in time due to the initial conditions // // Overdamped regime if (BET * BET > 4.0 * OMEGA * OMEGA) { // REMEMBER THAT HOMEGA IS ACTUALLY HBAR*HOMEGA1=1MeV // SO THAT HOMEGA1 = HOMEGA/HBAR // Additional factor 1/16 proposed by KHS on 14/7/2010. Takes into // account the fact that the curvature of the potential is ~16 times // larger than what predicted by the liquid drop model, because of // shell effects. t_0 = BET * 1.e21 * HBAR * HBAR / (4. * HOMEGA * FT) / 16.; } else { // Underdamped regime if (((2. * FT - HOMEGA / 16.) > 0.000001) && BET > 0.0) { // Additional factor 1/16 proposed by KHS on 14/7/2010. Takes into // account the fact that the curvature of the potential is ~16 times // larger than what predicted by the liquid drop model, because of // shell effects. t_0 = (std::log(2. * FT / (2. * FT - HOMEGA / 16.))) / (BET * 1.e21); } else { // Neglect fission transients if the time shift t_0 is too // large. Suppresses large, spurious fission cross section at very // low excitation energy in p+Ta. // fchoice = 0; goto direct106; } } // ********************************************************************+ fchoice = 0; STEP_LENGTH = 1.5 * TAUF / 50.; // // AT FIRST WE CACULATE THE REAL CURRENT TIME // TSUM includes only the time elapsed in the previous steps // BEGIN_TIME = TSUM + t_0; // if (BEGIN_TIME < 0.0) std::cout << "CURRENT TIME < 0" << BEGIN_TIME << std::endl; // if (BEGIN_TIME < 1.50 * TAUF) { LOC_TIME_BEGIN = BEGIN_TIME; // while ((LOC_TIME_BEGIN < 1.5 * TAUF) && fchoice == 0) { LOC_TIME_END = LOC_TIME_BEGIN + STEP_LENGTH; // // NOW WE ESTIMATE THE MEAN VALUE OF THE FISSION WIDTH WITHIN THE SMALL // INTERVAL fGF_LOC = (func_trans(LOC_TIME_BEGIN, ZF, AF, BET, Y, FT, t_0) + func_trans(LOC_TIME_END, ZF, AF, BET, Y, FT, t_0)) / 2.0; // fGF_LOC = fGF_LOC * GF; // TS2 IS THE MEAN DECAY TIME OF THE FISSION CHANNEL if (fGF_LOC > 0.0) { TS2 = HBAR / fGF_LOC; } else { TS2 = 0.0; } // if (TS2 > 0.0) { LAMBDA = 1.0 / TS1 + 1.0 / TS2; } else { LAMBDA = 1.0 / TS1; } // // This is the probability to survive the decay at this step REAC_PROB = std::exp(-1.0 * STEP_LENGTH * LAMBDA); // I GENERATE A RANDOM NUMBER X = G4AblaRandom::flat(); if (X > REAC_PROB) { // THEN THE EVAPORATION OR FISSION HAS OCCURED FISS_PROB = fGF_LOC / (fGF_LOC + GP); X = G4AblaRandom::flat(); // WRITE(6,*)'X=',X if (X < FISS_PROB) { // FISSION OCCURED fchoice = 2; } else { // EVAPORATION OCCURED fchoice = 1; } } // if x LOC_TIME_BEGIN = LOC_TIME_END; } // while // Take the real decay time of this decay step fT_LAPSE = LOC_TIME_END - BEGIN_TIME; } // if BEGIN_TIME // // NOW, IF NOTHING HAPPENED DURING TRANSIENT TIME direct106: if (fchoice == 0) { fGF_LOC = GF; FISS_PROB = GF / (GF + GP); // Added for cases where already at the beginning BEGIN_TIME > 1.5d0*TAUF if (GF > 0.0) { TS2 = HBAR / GF; } else { TS2 = 0.0; } if (TS2 > 0.0) { LAMBDA = 1. / TS1 + 1. / TS2; } else { LAMBDA = 1. / TS1; } // X = G4AblaRandom::flat(); if (X < FISS_PROB) { // FISSION OCCURED fchoice = 2; } else { // EVAPORATION OCCURED fchoice = 1; } // // TIRAGE ALEATOIRE DANS UNE EXPONENTIELLLE : Y=EXP(-X/T) // EXPOHAZ=-T*LOG(HAZ(K)) fT_LAPSE = fT_LAPSE - 1.0 / LAMBDA * std::log(G4AblaRandom::flat()); } // direct107: (*T_LAPSE) = fT_LAPSE; (*GF_LOC) = fGF_LOC; (*CHOICE) = fchoice; return; } G4double G4Abla::tunnelling(G4double A, G4double ZPRF, G4double Y, G4double EE, G4double EF, G4double TEMP, G4double DENSG, G4double DENSF, G4double ENH_FACT) { // Subroutine to caluclate fission width with included effects // of tunnelling through the fission barrier G4double PI = 3.14159; G4int IZ, IN; G4double MFCD, OMEGA, HOMEGA1, HOMEGA2 = 0., GFTUN; G4double E1, E2, EXP_FACT, CORR_FUNCT, FACT1, FACT2, FACT3; IZ = idnint(ZPRF); IN = idnint(A - ZPRF); // For low energies system "sees" LD barrier fomega_sp(A, Y, &MFCD, &OMEGA, &HOMEGA1); if (mod(IN, 2) == 0 && mod(IZ, 2) == 0) { // e-e // Due to pairing gap, even-even nuclei cannot tunnel for excitation energy // lower than pairing gap (no levels at which system can be) EE = EE - 12.0 / std::sqrt(A); HOMEGA2 = 1.04; } if (mod(IN, 2) == 1 && mod(IZ, 2) == 1) { // o-o HOMEGA2 = 0.65; } if (mod(IN, 2) == 1 && mod(IZ, 2) == 0) { // o-e HOMEGA2 = 0.8; } if (mod(IN, 2) == 0 && mod(IZ, 2) == 1) { // e-0 HOMEGA2 = 0.8; } E1 = EF + HOMEGA1 / 2.0 / PI * std::log(HOMEGA1 * (2.0 * PI + HOMEGA2) / 4.0 / PI / PI); E2 = EF + HOMEGA2 / (2.0 * PI) * std::log(1.0 + 2.0 * PI / HOMEGA2); // AKH May 2013 - Due to approximations in the analytical integration, at // energies just above barrier Pf was to low, at energies below barrier it was // somewhat higher. LInes below are supposed to correct for this. Factor 0.20 // in EXP_FACT comes from the slope of the Pf(Eexc) (Gavron's data) around // fission barrier. EXP_FACT = (EE - EF) / (HOMEGA2 / (2.0 * PI)); if (EXP_FACT > 700.0) EXP_FACT = 700.0; CORR_FUNCT = HOMEGA1 * (1.0 - 1.0 / (1.0 + std::exp(EXP_FACT))); if (mod(IN, 2) == 0 && mod(IZ, 2) == 0) { CORR_FUNCT = HOMEGA1 * (1.0 - 1.0 / (1.0 + std::exp(EXP_FACT))); } FACT1 = HOMEGA1 / (2.0 * PI * TEMP + HOMEGA1); FACT2 = (2.0 * PI / (2.0 * PI + HOMEGA2) - HOMEGA1 * (2.0 * PI + HOMEGA2) / 4.0 / PI / PI) / (E2 - E1); FACT3 = HOMEGA2 / (2.0 * PI * TEMP - HOMEGA2); if (EE < E1) { GFTUN = FACT1 * (std::exp(EE / TEMP) * std::exp(2.0 * PI * (EE - EF) / HOMEGA1) - std::exp(-2.0 * PI * EF / HOMEGA1)); } else { if (EE >= E1 && EE < E2) { GFTUN = std::exp(EE / TEMP) * (0.50 + FACT2 * (EE - EF - TEMP)) - std::exp(E1 / TEMP) * (0.5 + FACT2 * (E1 - EF - TEMP)) + FACT1 * (std::exp(E1 / TEMP) * std::exp(2.0 * PI * (E1 - EF) / HOMEGA1) - std::exp(-2.0 * PI * EF / HOMEGA1)); } else { GFTUN = std::exp(EE / TEMP) * (1.0 + FACT3 * std::exp(-2.0 * PI * (EE - EF) / HOMEGA2)) - std::exp(E2 / TEMP) * (1.0 + FACT3 * std::exp(-2.0 * PI * (E2 - EF) / HOMEGA2)) + std::exp(E2 / TEMP) * (0.5 + FACT2 * (E2 - EF - TEMP)) - std::exp(E1 / TEMP) * (0.5 + FACT2 * (E1 - EF - TEMP)) + FACT1 * (std::exp(E1 / TEMP) * std::exp(2.0 * PI * (E1 - EF) / HOMEGA1) - std::exp(-2.0 * PI * EF / HOMEGA1)); } } GFTUN = GFTUN / std::exp(EE / TEMP) * DENSF * ENH_FACT / DENSG / 2.0 / PI; GFTUN = GFTUN * CORR_FUNCT; return GFTUN; } void G4Abla::fission_width(G4double ZPRF, G4double A, G4double EE, G4double BS, G4double BK, G4double EF, G4double Y, G4double* GF, G4double* TEMP, G4double JPR, G4int IEROT, G4int FF_ALLOWED, G4int OPTCOL, G4int OPTSHP, G4double DENSG) { // G4double FNORM, MASS_ASYM_SADD_B, FP_PER, FP_PAR, SIG_PER_SP, SIG_PAR_SP; G4double Z2OVERA, ftemp, fgf, DENSF, ECOR, EROT, qr; G4double DCR, UCR, ENH_FACTA, ENH_FACTB, ENH_FACT, PONFE; G4double PI = 3.14159; DCR = fiss->dcr; UCR = fiss->ucr; Z2OVERA = ZPRF * ZPRF / A; // Nuclei below Businaro-Gallone point do not go through fission if ((ZPRF <= 55.0) || (FF_ALLOWED == 0)) { (*GF) = 0.0; (*TEMP) = 0.5; return; } // Level density above SP // Saddle-point deformation is defbet as above. But, FP_PER and FP_PAR // are calculated for fission in DENSNIV acc to Myers and Hasse, and their // parametrization is done as function of y densniv(A, ZPRF, EE, EF, &DENSF, 0.0, BS, BK, &ftemp, OPTSHP, 0, Y, &ECOR, JPR, 1, &qr); if (OPTCOL == 0) { fgf = DENSF / DENSG / PI / 2.0 * ftemp; (*TEMP) = ftemp; (*GF) = fgf; return; } // FP = 2/5*M0*R0**2/HBAR**2 * A**(5/3) * (1 + DEFBET/3) // FP is used to calculate the spin-cutoff parameter SIG=FP*TEMP/hbar**2; // hbar**2 is, therefore, included in FP in order to avoid problems with large // exponents The factor fnorm inlcudes then R0, M0 and hbar**2 - fnorm = // R0*M0/hbar**2 = 1.2fm*931.49MeV/c**2 /(6.582122e-22 MeVs)**2 and is in // units 1/MeV FNORM = 1.2 * 1.2 * 931.49 * 1.e-2 / (9.0 * 6.582122 * 6.582122); // FP_PER ~ 1+7*y/6, FP_PAR ~ 1-7*y/3 (Hasse & Myers, Geom. relat. macr. nucl. // phys.) Perpendicular moment of inertia 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)); // AK - Jan 2011 - following line is needed, as for these nuclei it seems that // FP_PER calculated according to above formula has too large values, leading // to too large ENH_FACT if (Z2OVERA <= 30.0) FP_PER = 6.50; // Parallel moment of inertia 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)); if (FP_PAR < 0.0) FP_PAR = 0.0; EROT = JPR * JPR / (2.0 * std::sqrt(FP_PAR * FP_PAR + FP_PER * FP_PER)); if (IEROT == 1) EROT = 0.0; // Perpendicular spin cut-off parameter SIG_PER_SP = std::sqrt(FP_PER * ftemp); if (SIG_PER_SP < 1.0) SIG_PER_SP = 1.0; // Parallel spin cut-off parameter SIG_PAR_SP = std::sqrt(FP_PAR * ftemp); ENH_FACT = 1.0; // if (A > 223.0) { MASS_ASYM_SADD_B = 2.0; } else { MASS_ASYM_SADD_B = 1.0; } // actinides with low barriers if (Z2OVERA > 35. && Z2OVERA <= (110. * 110. / 298.0)) { // Barrier A is axial asymmetric ENH_FACTA = std::sqrt(8.0 * PI) * SIG_PER_SP * SIG_PER_SP * SIG_PAR_SP; // Barrier B is axial symmetric ENH_FACTB = MASS_ASYM_SADD_B * SIG_PER_SP * SIG_PER_SP; // Total enhancement ENH_FACT = ENH_FACTA * ENH_FACTB / (ENH_FACTA + ENH_FACTB); } else { // nuclei with high fission barriers (only barrier B plays a role, axial // symmetric) if (Z2OVERA <= 35.) { ENH_FACT = MASS_ASYM_SADD_B * SIG_PER_SP * SIG_PER_SP; } else { // super-heavy nuclei (only barrier A plays a role, axial asymmetric) ENH_FACT = std::sqrt(8.0 * PI) * SIG_PER_SP * SIG_PER_SP * SIG_PAR_SP; } } // Fading-out with excitation energy above the saddle point: PONFE = (ECOR - UCR - EROT) / DCR; if (PONFE > 700.) PONFE = 700.0; // Fading-out according to Junghans: ENH_FACT = 1.0 / (1.0 + std::exp(PONFE)) * ENH_FACT + 1.0; if (ENH_FACT < 1.0) ENH_FACT = 1.0; fgf = DENSF / DENSG / PI / 2.0 * ftemp * ENH_FACT; // Tunneling if (EE < EF) { fgf = tunnelling(A, ZPRF, Y, EE, EF, ftemp, DENSG, DENSF, ENH_FACT); } // (*GF) = fgf; (*TEMP) = ftemp; return; } void G4Abla::lorb(G4double AMOTHER, G4double ADAUGHTER, G4double LMOTHER, G4double EEFINAL, G4double* LORBITAL, G4double* SIGMA_LORBITAL) { G4double AFRAGMENT, S4FINAL, ALEVDENS; G4double THETA_MOTHER, THETA_ORBITAL; /* C Values on input: C AMOTHER mass of mother nucleus C ADAUGHTER mass of daughter fragment C LMOTHER angular momentum of mother (may be real) C EEFINAL excitation energy after emission C (sum of daughter and fragment) C C Values on output: C LORBITAL mean value of orbital angular momentum C (assumed to be fully aligned with LMOTHER) C SIGMA_LORBITAL standard deviation of the orbital angular momentum */ if (EEFINAL <= 0.01) EEFINAL = 0.01; AFRAGMENT = AMOTHER - ADAUGHTER; ALEVDENS = 0.073 * AMOTHER + 0.095 * std::pow(AMOTHER, 2.0 / 3.0); S4FINAL = ALEVDENS * EEFINAL; if (S4FINAL <= 0.0 || S4FINAL > 100000.) { std::cout << "S4FINAL:" << S4FINAL << ALEVDENS << EEFINAL << idnint(AMOTHER) << idnint(AFRAGMENT) << std::endl; } THETA_MOTHER = 0.0111 * std::pow(AMOTHER, 1.66667); THETA_ORBITAL = 0.0323 / std::pow(AMOTHER, 2.) * std::pow(std::pow(AFRAGMENT, 0.33333) + std::pow(ADAUGHTER, 0.33333), 2.) * AFRAGMENT * ADAUGHTER * (AFRAGMENT + ADAUGHTER); *LORBITAL = -1. * THETA_ORBITAL * (LMOTHER / THETA_MOTHER + std::sqrt(S4FINAL) / (ALEVDENS * LMOTHER)); *SIGMA_LORBITAL = std::sqrt(std::sqrt(S4FINAL) * THETA_ORBITAL / ALEVDENS); return; } // Random generator according to a distribution similar to a // Maxwell distribution with quantum-mech. x-section for neutrons according to // KHS // Y = SQRT(X) * EXP(-X/T) (approximation:) G4double G4Abla::fvmaxhaz_neut(G4double x) { return (2.0 * x * std::sqrt(std::log(G4AblaRandom::flat()) * std::log(G4AblaRandom::flat()))); } void G4Abla::imf(G4double ACN, G4double ZCN, G4double TEMP, G4double EE, G4double* ZIMF, G4double* AIMF, G4double* BIMF, G4double* SBIMF, G4double* TIMF, G4double JPRF) { // input variables (compound nucleus) Acn, Zcn, Temp, EE // output variable (IMF) Zimf,Aimf,Bimf,Sbimf,IRNDM // // SBIMF = separation energy + coulomb barrier // // SDW(Z) is the sum over all isotopes for a given Z of the decay widths // DW(Z,A) is the decay width of a certain nuclide // // Last update: // 28/10/13 - JLRS - from abrablav4 (AK) // 13/11/16 - JLRS - Included this function in Abla++ G4int IZIMFMAX = 0; G4int iz = 0, in = 0, IZIMF = 0, INMI = 0, INMA = 0, IZCN = 0, INCN = 0, INIMFMI = 0, INIMFMA = 0, ILIMMAX = 0, INNMAX = 0, INMIN = 0, IAIMF = 0, IZSTOP = 3, IZMEM = 0, IA = 0, INMINMEM = 0, INMAXMEM = 0, IIA = 0; G4double BS = 0, BK = 0, BC = 0, BSHELL = 0, DEFBET = 0, DEFBETIMF = 0, EROT = 0, MAIMF = 0, MAZ = 0, MARES = 0, AIMF_1, OMEGAP = 0, fBIMF = 0.0, BSIMF = 0, A1PAR = 0, A2PAR = 0, SUM_A, EEDAUG; G4double DENSCN = 0, TEMPCN = 0, ECOR = 0, IINERT = 0, EROTCN = 0, WIDTH_IMF = 0.0, WIDTH1 = 0, IMFARG = 0, QR = 0, QRCN = 0, DENSIMF = 0, fTIMF = 0, fZIMF = 0, fAIMF = 0.0, NIMF = 0, fSBIMF = 0; G4double PI = 3.141592653589793238; G4double ZIMF_1 = 0.0; G4double SDWprevious = 0, SUMDW_TOT = 0, SUM_Z = 0, X = 0, SUMDW_N_TOT = 0, XX = 0; G4double SDW[98]; G4double DW[98][251]; G4double BBIMF[98][251]; G4double SSBIMF[98][251]; G4int OPTSHPIMF = opt->optshpimf; // Initialization for (G4int ia = 0; ia < 98; ia++) for (G4int ib = 0; ib < 251; ib++) { BBIMF[ia][ib] = 0.0; SSBIMF[ia][ib] = 0.0; } // take the half of the CN and transform it in integer (floor it) IZIMFMAX = idnint(ZCN / 2.0); if (IZIMFMAX < 3) { std::cout << "CHARGE_IMF line 46" << std::endl; std::cout << "Problem: IZIMFMAX < 3 " << std::endl; std::cout << "ZCN,IZIMFMAX," << ZCN << "," << IZIMFMAX << std::endl; } iz = idnint(ZCN); in = idnint(ACN) - iz; BSHELL = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz]; DEFBET = ecld->beta2[in][iz]; bsbkbc(ACN, ZCN, &BS, &BK, &BC); densniv(ACN, ZCN, EE, 0.0, &DENSCN, BSHELL, BS, BK, &TEMPCN, 0, 0, DEFBET, &ECOR, JPRF, 0, &QRCN); 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); EROTCN = JPRF * JPRF * 197.328 * 197.328 / (2. * IINERT); // for (IZIMF = 3; IZIMF <= IZIMFMAX; IZIMF++) { SDW[IZIMF] = 0.0; ZIMF_1 = 1.0 * IZIMF; // *** Find the limits that both IMF and partner are bound : isostab_lim(IZIMF, &INIMFMI, &INIMFMA); // Bound isotopes for IZIMF from INMIN to INIMFMA // Idea - very proton-rich nuclei can live long enough to evaporate IMF // before decaying: INIMFMI = max(1, INIMFMI - 2); IZCN = idnint(ZCN); // Z of CN INCN = idnint(ACN) - IZCN; // N of CN isostab_lim(IZCN - IZIMF, &INMI, &INMA); // Daughter nucleus after IMF emission, // limits of bound isotopes INMI = max(1, INMI - 2); INMIN = max(INIMFMI, INCN - INMA); // Both IMF and daughter must be bound INNMAX = min(INIMFMA, INCN - INMI); // " ILIMMAX = max(INNMAX, INMIN); // In order to keep the variables below // *** for (G4int INIMF = INMIN; INIMF <= ILIMMAX; INIMF++) { // Range of possible IMF isotopes IAIMF = IZIMF + INIMF; DW[IZIMF][IAIMF] = 0.0; AIMF_1 = 1.0 * (IAIMF); // Q-values mglms(ACN - AIMF_1, ZCN - ZIMF_1, OPTSHPIMF, &MARES); mglms(AIMF_1, ZIMF_1, OPTSHPIMF, &MAIMF); mglms(ACN, ZCN, OPTSHPIMF, &MAZ); // Barrier if (ACN <= AIMF_1) { SSBIMF[IZIMF][IAIMF] = 1.e37; } else { barrs(idnint(ZCN - ZIMF_1), idnint(ACN - AIMF_1), idnint(ZIMF_1), idnint(AIMF_1), &fBIMF, &OMEGAP); SSBIMF[IZIMF][IAIMF] = MAIMF + MARES - MAZ + fBIMF; BBIMF[IZIMF][IAIMF] = fBIMF; } // ***** Width ********************* DEFBETIMF = ecld->beta2[idnint(AIMF_1 - ZIMF_1)][idnint(ZIMF_1)] + ecld->beta2[idnint(ACN - AIMF_1 - ZCN + ZIMF_1)][idnint(ZCN - ZIMF_1)]; IINERT = 0.40 * 931.490 * 1.160 * 1.160 * std::pow(ACN, 5.0 / 3.0) * (std::pow(AIMF_1, 5.0 / 3.0) + std::pow(ACN - AIMF_1, 5.0 / 3.0)) + 931.490 * 1.160 * 1.160 * AIMF_1 * (ACN - AIMF_1) / ACN * (std::pow(AIMF_1, 1.0 / 3.0) + std::pow(ACN - AIMF_1, 1.0 / 3.0)) * (std::pow(AIMF_1, 1.0 / 3.0) + std::pow(ACN - AIMF_1, 1.0 / 3.0)); EROT = JPRF * JPRF * 197.328 * 197.328 / (2.0 * IINERT); // IF(IEROT.EQ.1) EROT = 0.D0 if (EE < (SSBIMF[IZIMF][IAIMF] + EROT) || DENSCN <= 0.0) { WIDTH_IMF = 0.0; // PRINT*,IDNINT(ACN),IDNINT(ZCN),IZIMF,IAIMF } else { // here the temperature at "saddle point" is used // Increase of the level densitiy at the barrier due to deformation; see // comment in ABLA // BSIMF = ((ACN-AIMF_1)**(2.D0/3.D0) + AIMF_1**(2.D0/3.D0))/ // & ACN**(2.D0/3.D0) BSIMF = BS; densniv(ACN, ZCN, EE, SSBIMF[IZIMF][IAIMF], &DENSIMF, 0.0, BSIMF, 1.0, &fTIMF, 0, 0, DEFBETIMF, &ECOR, JPRF, 2, &QR); IMFARG = (SSBIMF[IZIMF][IAIMF] + EROTCN - EROT) / fTIMF; if (IMFARG > 200.0) IMFARG = 200.0; WIDTH1 = width(ACN, ZCN, AIMF_1, ZIMF_1, fTIMF, fBIMF, SSBIMF[IZIMF][IAIMF], EE - EROT); WIDTH_IMF = WIDTH1 * std::exp(-IMFARG) * QR / QRCN; if (WIDTH_IMF <= 0.0) { std::cout << "GAMMA_IMF=0 -> LOOK IN GAMMA_IMF CALCULATIONS!" << std::endl; std::cout << "ACN,ZCN,AIMF,ZIMF:" << idnint(ACN) << "," << idnint(ZCN) << "," << idnint(AIMF_1) << "," << idnint(ZIMF_1) << std::endl; std::cout << "SSBIMF,TIMF :" << SSBIMF[IZIMF][IAIMF] << "," << fTIMF << std::endl; std::cout << "DEXP(-IMFARG) = " << std::exp(-IMFARG) << std::endl; std::cout << "WIDTH1 =" << WIDTH1 << std::endl; } } // if ee SDW[IZIMF] = SDW[IZIMF] + WIDTH_IMF; DW[IZIMF][IAIMF] = WIDTH_IMF; } // for INIMF } // for IZIMF // End loop to calculate the decay widths ************************ // *************************************************************** // Loop to calculate where the gamma of IMF has the minimum ****** SDWprevious = 1.e20; IZSTOP = 0; for (G4int III_ZIMF = 3; III_ZIMF <= IZIMFMAX; III_ZIMF++) { if (SDW[III_ZIMF] == 0.0) { IZSTOP = III_ZIMF - 1; goto imfs30; } if (SDW[III_ZIMF] > SDWprevious) { IZSTOP = III_ZIMF - 1; goto imfs30; } else { SDWprevious = SDW[III_ZIMF]; } } // for III_ZIMF imfs30: if (IZSTOP <= 6) { IZSTOP = IZIMFMAX; goto imfs15; } A1PAR = std::log10(SDW[IZSTOP] / SDW[IZSTOP - 2]) / std::log10((1.0 * IZSTOP) / (1.0 * IZSTOP - 2.0)); A2PAR = std::log10(SDW[IZSTOP]) - A1PAR * std::log10(1.0 * (IZSTOP)); if (A2PAR > 0.) A2PAR = -1. * A2PAR; if (A1PAR > 0.) A1PAR = -1. * A1PAR; // End loop to calculate where gamma of IMF has the minimum for (G4int II_ZIMF = IZSTOP; II_ZIMF <= IZIMFMAX; II_ZIMF++) { SDW[II_ZIMF] = std::pow(10.0, A2PAR) * std::pow(1.0 * II_ZIMF, A1PAR); // Power-low if (SDW[II_ZIMF] < 0.0) SDW[II_ZIMF] = 0.0; } imfs15: // Sum of all decay widths (for normalisation) SUMDW_TOT = 0.0; for (G4int I_ZIMF = 3; I_ZIMF <= IZIMFMAX; I_ZIMF++) { SUMDW_TOT = SUMDW_TOT + SDW[I_ZIMF]; } if (SUMDW_TOT <= 0.0) { std::cout << "*********************" << std::endl; std::cout << "IMF function" << std::endl; std::cout << "SUM of decay widths = " << SUMDW_TOT << " IZIMFMAX = " << IZIMFMAX << std::endl; std::cout << "IZSTOP = " << IZSTOP << std::endl; } // End of Sum of all decay widths (for normalisation) // Loop to sample the nuclide that is emitted ******************** // ------- sample Z ----------- imfs10: X = haz(1) * SUMDW_TOT; // IF(X.EQ.0.D0) PRINT*,'WARNING: X=0',XRNDM,SUMDW_TOT SUM_Z = 0.0; fZIMF = 0.0; IZMEM = 0; for (G4int IZ = 3; IZ <= IZIMFMAX; IZ++) { SUM_Z = SUM_Z + SDW[IZ]; if (X < SUM_Z) { fZIMF = 1.0 * IZ; IZMEM = IZ; goto imfs20; } } // for IZ imfs20: // ------- sample N ----------- isostab_lim(IZMEM, &INMINMEM, &INMAXMEM); INMINMEM = max(1, INMINMEM - 2); isostab_lim(IZCN - IZMEM, &INMI, &INMA); // Daughter nucleus after IMF emission, INMI = max(1, INMI - 2); // limits of bound isotopes INMINMEM = max(INMINMEM, INCN - INMA); // Both IMF and daughter must be bound INMAXMEM = min(INMAXMEM, INCN - INMI); // " INMAXMEM = max(INMINMEM, INMAXMEM); IA = 0; SUMDW_N_TOT = 0.0; for (G4int IIINIMF = INMINMEM; IIINIMF <= INMAXMEM; IIINIMF++) { IA = IZMEM + IIINIMF; if (IZMEM >= 3 && IZMEM <= 95 && IA >= 4 && IA <= 250) { SUMDW_N_TOT = SUMDW_N_TOT + DW[IZMEM][IA]; } else { std::cout << "CHARGE IMF OUT OF RANGE" << IZMEM << ", " << IA << ", " << idnint(ACN) << ", " << idnint(ZCN) << ", " << TEMP << std::endl; } } XX = haz(1) * SUMDW_N_TOT; IIA = 0; SUM_A = 0.0; for (G4int IINIMF = INMINMEM; IINIMF <= INMAXMEM; IINIMF++) { IIA = IZMEM + IINIMF; // SUM_A = SUM_A + DW[IZ][IIA]; //FIXME SUM_A = SUM_A + DW[IZMEM][IIA]; if (XX < SUM_A) { fAIMF = G4double(IIA); goto imfs25; } } imfs25: // CHECK POINT 1 NIMF = fAIMF - fZIMF; if ((ACN - ZCN - NIMF) <= 0.0 || (ZCN - fZIMF) <= 0.0) { std::cout << "IMF Partner unstable:" << std::endl; std::cout << "System: Acn,Zcn,NCN:" << std::endl; std::cout << idnint(ACN) << ", " << idnint(ZCN) << ", " << idnint(ACN - ZCN) << std::endl; std::cout << "IMF: A,Z,N:" << std::endl; std::cout << idnint(fAIMF) << ", " << idnint(fZIMF) << ", " << idnint(fAIMF - fZIMF) << std::endl; std::cout << "Partner: A,Z,N:" << std::endl; std::cout << idnint(ACN - fAIMF) << ", " << idnint(ZCN - fZIMF) << ", " << idnint(ACN - ZCN - NIMF) << std::endl; std::cout << "----nmin,nmax" << INMINMEM << ", " << INMAXMEM << std::endl; std::cout << "----- warning: Zimf=" << fZIMF << " Aimf=" << fAIMF << std::endl; std::cout << "----- look in subroutine IMF" << std::endl; std::cout << "ACN,ZCN,ZIMF,AIMF,temp,EE,JPRF::" << ACN << ", " << ZCN << ", " << fZIMF << ", " << fAIMF << ", " << TEMP << ", " << EE << ", " << JPRF << std::endl; std::cout << "-IZSTOP,IZIMFMAX:" << IZSTOP << ", " << IZIMFMAX << std::endl; std::cout << "----X,SUM_Z,SUMDW_TOT:" << X << ", " << SUM_Z << ", " << SUMDW_TOT << std::endl; // for(int III_ZIMF=3;III_ZIMF<=IZIMFMAX;III_ZIMF++) // std::cout << "-**Z,SDW:" << III_ZIMF << ", " << SDW[III_ZIMF] << // std::endl; goto imfs10; } if (fZIMF >= ZCN || fAIMF >= ACN || fZIMF <= 2 || fAIMF <= 3) { std::cout << "----nmin,nmax" << INMINMEM << ", " << INMAXMEM << std::endl; std::cout << "----- warning: Zimf=" << fZIMF << " Aimf=" << fAIMF << std::endl; std::cout << "----- look in subroutine IMF" << std::endl; std::cout << "ACN,ZCN,ZIMF,AIMF,temp,EE,JPRF:" << ACN << ", " << ZCN << ", " << fZIMF << ", " << fAIMF << ", " << TEMP << ", " << EE << ", " << JPRF << std::endl; std::cout << "-IZSTOP,IZIMFMAX:" << IZSTOP << ", " << IZIMFMAX << std::endl; std::cout << "----X,SUM_Z,SUMDW_TOT:" << X << ", " << SUM_Z << ", " << SUMDW_TOT << std::endl; for (int III_ZIMF = 3; III_ZIMF <= IZIMFMAX; III_ZIMF++) std::cout << "-**Z,SDW:" << III_ZIMF << ", " << SDW[III_ZIMF] << std::endl; fZIMF = 3.0; // provisorisch AK fAIMF = 4.0; } // Characteristics of selected IMF (AIMF, ZIMF, BIMF, SBIMF, TIMF) fSBIMF = SSBIMF[idnint(fZIMF)][idnint(fAIMF)]; fBIMF = BBIMF[idnint(fZIMF)][idnint(fAIMF)]; if ((ZCN - fZIMF) <= 0.0) std::cout << "CHARGE_IMF ZIMF > ZCN" << std::endl; if ((ACN - fAIMF) <= 0.0) std::cout << "CHARGE_IMF AIMF > ACN" << std::endl; BSHELL = ecld->ecgnz[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)] - ecld->vgsld[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)]; DEFBET = ecld->beta2[idnint(ACN - ZCN - NIMF)][idnint(ZCN - fZIMF)]; EEDAUG = (EE - fSBIMF) * (ACN - fAIMF) / ACN; bsbkbc(ACN - fAIMF, ZCN - fZIMF, &BS, &BK, &BC); densniv(ACN - fAIMF, ZCN - fZIMF, EEDAUG, 0.0, &DENSIMF, BSHELL, BS, BK, &fTIMF, 0, 0, DEFBET, &ECOR, 0.0, 0, &QR); if (fSBIMF > EE) { std::cout << "----- warning: EE=" << EE << "," << " S+Bimf=" << fSBIMF << std::endl; std::cout << "----- look in subroutine IMF" << std::endl; std::cout << "IMF will be resampled" << std::endl; goto imfs10; } (*ZIMF) = fZIMF; (*AIMF) = fAIMF; (*SBIMF) = fSBIMF; (*BIMF) = fBIMF; (*TIMF) = fTIMF; return; } void G4Abla::isostab_lim(G4int z, G4int* nmin, G4int* nmax) { G4int VISOSTAB[191][2] = { { 0, 7 }, { 1, 8 }, { 1, 9 }, { 2, 12 }, { 2, 14 }, { 2, 16 }, { 3, 18 }, { 4, 22 }, { 6, 22 }, { 6, 28 }, { 7, 28 }, { 7, 30 }, { 8, 28 }, { 8, 36 }, { 10, 38 }, { 10, 40 }, { 11, 38 }, { 10, 42 }, { 13, 50 }, { 14, 50 }, { 15, 52 }, { 16, 52 }, { 17, 54 }, { 18, 54 }, { 19, 60 }, { 19, 62 }, { 21, 64 }, { 20, 66 }, { 23, 66 }, { 24, 70 }, { 25, 70 }, { 26, 74 }, { 27, 78 }, { 29, 82 }, { 33, 82 }, { 31, 82 }, { 35, 82 }, { 34, 84 }, { 40, 84 }, { 36, 86 }, { 40, 92 }, { 38, 96 }, { 42, 102 }, { 42, 102 }, { 44, 102 }, { 42, 106 }, { 47, 112 }, { 44, 114 }, { 49, 116 }, { 46, 118 }, { 52, 120 }, { 52, 124 }, { 55, 126 }, { 54, 126 }, { 57, 126 }, { 57, 126 }, { 60, 126 }, { 58, 130 }, { 62, 132 }, { 60, 140 }, { 67, 138 }, { 64, 142 }, { 67, 144 }, { 68, 146 }, { 70, 148 }, { 70, 152 }, { 73, 152 }, { 72, 154 }, { 75, 156 }, { 77, 162 }, { 79, 164 }, { 78, 164 }, { 82, 166 }, { 80, 166 }, { 85, 168 }, { 83, 176 }, { 87, 178 }, { 88, 178 }, { 91, 182 }, { 90, 184 }, { 96, 184 }, { 95, 184 }, { 99, 184 }, { 98, 184 }, { 105, 194 }, { 102, 194 }, { 108, 196 }, { 106, 198 }, { 115, 204 }, { 110, 206 }, { 119, 210 }, { 114, 210 }, { 124, 210 }, { 117, 212 }, { 130, 212 } }; if (z < 0) { *nmin = 0; *nmax = 0; } else { if (z == 0) { *nmin = 1; *nmax = 1; // AK (Dez2010) - Just to avoid numerical problems } else { if (z > 95) { *nmin = 130; *nmax = 200; } else { *nmin = VISOSTAB[z - 1][0]; *nmax = VISOSTAB[z - 1][1]; } } } return; } void G4Abla::evap_postsaddle(G4double A, G4double Z, G4double EXC, G4double* E_scission_post, G4double* A_scission, G4double* Z_scission, G4double& vx_eva, G4double& vy_eva, G4double& vz_eva, G4int* NbLam0_par) { // AK 2006 - Now in case of fission deexcitation between saddle and scission // is explicitly calculated. Langevin calculations made by P. // Nadtochy used to parametrise saddle-to-scission time G4double af, zf, ee; 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, probimf = 0.0, problamb0 = 0.0, ptotl = 0.0, tcn = 0.0; 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, sp = 0.0, sd = 0.0, st = 0.0, she = 0.0, sa = 0.0, slamb0 = 0.0; 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, bd = 0.0, bt = 0.0, bhe = 0.0, ba = 0.0; G4double xcv = 0., ycv = 0., zcv = 0., VXOUT = 0., VYOUT = 0., VZOUT = 0.; G4double jprfn = 0.0, jprfp = 0.0, jprfd = 0.0, jprft = 0.0, jprfhe = 0.0, jprfa = 0.0, jprflamb0 = 0.0; G4double ctet1 = 0.0, stet1 = 0.0, phi1 = 0.0; G4double rnd = 0.0; G4int itest = 0, sortie = 0; G4double probf = 0.0; G4double ef = 0.0; G4double pc = 0.0; G4double time, tauf, tau0, a0, a1, emin, ts1, tsum = 0.; G4int inttype = 0, inum = 0, gammadecay = 0, flamb0decay = 0; G4double pleva = 0.0; G4double pxeva = 0.0; G4double pyeva = 0.0; G4double pteva = 0.0; G4double etot = 0.0; G4int NbLam0 = (*NbLam0_par); const G4double c = 29.9792458; const G4double mu = 931.494; const G4double mu2 = 931.494 * 931.494; vx_eva = 0.; vy_eva = 0.; vz_eva = 0.; IEV_TAB_SSC = 0; af = dint(A); zf = dint(Z); ee = EXC; fiss->ifis = 0; opt->optimfallowed = 0; gammaemission = 0; // Initialsation time = 0.0; // in sec tau0 = 1.0e-21; a0 = 0.66482503 - 3.4678935 * std::exp(-0.0104002 * ee); a1 = 5.6846e-04 + 0.00574515 * std::exp(-0.01114307 * ee); tauf = (a0 + a1 * zf * zf / std::pow(af, 0.3333333)) * tau0; // post10: direct(zf, af, ee, 0., &probp, &probd, &probt, &probn, &probhe, &proba, &probg, &probimf, &probf, &problamb0, &ptotl, &sn, &sbp, &sbd, &sbt, &sbhe, &sba, &slamb0, &ecn, &ecp, &ecd, &ect, &eche, &eca, &ecg, &eclamb0, &bp, &bd, &bt, &bhe, &ba, &sp, &sd, &st, &she, &sa, &ef, &ts1, inttype, inum, itest, &sortie, &tcn, &jprfn, &jprfp, &jprfd, &jprft, &jprfhe, &jprfa, &jprflamb0, &tsum, NbLam0); //:::FIXME::: Call // // HERE THE FINAL STEPS OF THE EVAPORATION ARE CALCULATED // if (ptotl <= 0.) goto post100; emin = dmin1(sba, sbhe, dmin1(sbt, sbhe, dmin1(sn, sbp, sbd))); if (emin > 1e30) std::cout << "ERROR AT THE EXIT OF EVAPORA,E>1.D30,AF" << std::endl; if (sortie == 1) { if (probn != 0.0) { amoins = 1.0; zmoins = 0.0; epsiln = sn + ecn; pc = std::sqrt(std::pow((1.0 + ecn / 9.3956e2), 2.) - 1.0) * 9.3956e2; gammadecay = 0; flamb0decay = 0; } else if (probp != 0.0) { amoins = 1.0; zmoins = 1.0; epsiln = sp + ecp; pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2.) - 1.0) * 9.3827e2; gammadecay = 0; flamb0decay = 0; } else if (probd != 0.0) { amoins = 2.0; zmoins = 1.0; epsiln = sd + ecd; pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; gammadecay = 0; flamb0decay = 0; } else if (probt != 0.0) { amoins = 3.0; zmoins = 1.0; epsiln = st + ect; pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; gammadecay = 0; flamb0decay = 0; } else if (probhe != 0.0) { amoins = 3.0; zmoins = 2.0; epsiln = she + eche; pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; gammadecay = 0; flamb0decay = 0; } else { if (proba != 0.0) { amoins = 4.0; zmoins = 2.0; epsiln = sa + eca; pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; gammadecay = 0; flamb0decay = 0; } } goto post99; } // IRNDM = IRNDM+1; // // HERE THE NORMAL EVAPORATION CASCADE STARTS // RANDOM NUMBER FOR THE EVAPORATION // random number for the evaporation x = G4AblaRandom::flat() * ptotl; itest = 0; if (x < proba) { // alpha evaporation amoins = 4.0; zmoins = 2.0; epsiln = sa + eca; pc = std::sqrt(std::pow((1.0 + eca / 3.72834e3), 2) - 1.0) * 3.72834e3; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe) { // He3 evaporation amoins = 3.0; zmoins = 2.0; epsiln = she + eche; pc = std::sqrt(std::pow((1.0 + eche / 2.80826e3), 2) - 1.0) * 2.80826e3; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe + probt) { // triton evaporation amoins = 3.0; zmoins = 1.0; epsiln = st + ect; pc = std::sqrt(std::pow((1.0 + ect / 2.80828e3), 2) - 1.0) * 2.80828e3; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe + probt + probd) { // deuteron evaporation amoins = 2.0; zmoins = 1.0; epsiln = sd + ecd; pc = std::sqrt(std::pow((1.0 + ecd / 1.875358e3), 2) - 1.0) * 1.875358e3; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe + probt + probd + probp) { // proton evaporation amoins = 1.0; zmoins = 1.0; epsiln = sp + ecp; pc = std::sqrt(std::pow((1.0 + ecp / 9.3827e2), 2) - 1.0) * 9.3827e2; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe + probt + probd + probp + probn) { // neutron evaporation amoins = 1.0; zmoins = 0.0; epsiln = sn + ecn; pc = std::sqrt(std::pow((1.0 + ecn / 9.3956e2), 2.) - 1.0) * 9.3956e2; gammadecay = 0; flamb0decay = 0; } else if (x < proba + probhe + probt + probd + probp + probn + problamb0) { // lambda0 evaporation amoins = 1.0; zmoins = 0.0; epsiln = slamb0 + eclamb0; pc = std::sqrt(std::pow((1.0 + (eclamb0) / 11.1568e2), 2.) - 1.0) * 11.1568e2; opt->nblan0 = opt->nblan0 - 1; NbLam0 = NbLam0 - 1; gammadecay = 0; flamb0decay = 1; } else if (x < proba + probhe + probt + probd + probp + probn + problamb0 + probg) { // gamma evaporation amoins = 0.0; zmoins = 0.0; epsiln = ecg; pc = ecg; gammadecay = 1; flamb0decay = 0; if (probp == 0.0 && probn == 0.0 && probd == 0.0 && probt == 0.0 && proba == 0.0 && probhe == 0.0 && problamb0 == 0.0 && probimf == 0.0 && probf == 0.0) { // ee = ee-epsiln; // if(ee<=0.01) ee = 0.010; goto post100; } } // CALCULATION OF THE DAUGHTER NUCLEUS // post99: if (gammadecay == 1 && ee <= 0.01 + epsiln) { epsiln = ee - 0.01; time = tauf + 1.; } af = af - amoins; zf = zf - zmoins; ee = ee - epsiln; if (ee <= 0.01) ee = 0.010; if (af < 2.5) goto post100; time = time + ts1; // Determination of x,y,z components of momentum from known emission momentum if (flamb0decay == 1) { EV_TAB_SSC[IEV_TAB_SSC][0] = 0.; EV_TAB_SSC[IEV_TAB_SSC][1] = -2.; EV_TAB_SSC[IEV_TAB_SSC][5] = 1.; } else { EV_TAB_SSC[IEV_TAB_SSC][0] = zmoins; EV_TAB_SSC[IEV_TAB_SSC][1] = amoins; EV_TAB_SSC[IEV_TAB_SSC][5] = 0.; } rnd = G4AblaRandom::flat(); ctet1 = 2.0 * rnd - 1.0; // z component: uniform probability between -1 and 1 stet1 = std::sqrt(1.0 - std::pow(ctet1, 2)); // component perpendicular to z rnd = G4AblaRandom::flat(); phi1 = rnd * 2.0 * 3.141592654; // angle in x-y plane: uniform probability between 0 and 2*pi xcv = stet1 * std::cos(phi1); // x component ycv = stet1 * std::sin(phi1); // y component zcv = ctet1; // z component // In the CM system if (gammadecay == 0) { // Light particle G4double ETOT_LP = std::sqrt(pc * pc + amoins * amoins * mu2); if (flamb0decay == 1) ETOT_LP = std::sqrt(pc * pc + 1115.683 * 1115.683); EV_TAB_SSC[IEV_TAB_SSC][2] = c * pc * xcv / ETOT_LP; EV_TAB_SSC[IEV_TAB_SSC][3] = c * pc * ycv / ETOT_LP; EV_TAB_SSC[IEV_TAB_SSC][4] = c * pc * zcv / ETOT_LP; } else { // gamma ray EV_TAB_SSC[IEV_TAB_SSC][2] = pc * xcv; EV_TAB_SSC[IEV_TAB_SSC][3] = pc * ycv; EV_TAB_SSC[IEV_TAB_SSC][4] = pc * zcv; } lorentz_boost(vx_eva, vy_eva, vz_eva, EV_TAB_SSC[IEV_TAB_SSC][2], EV_TAB_SSC[IEV_TAB_SSC][3], EV_TAB_SSC[IEV_TAB_SSC][4], &VXOUT, &VYOUT, &VZOUT); EV_TAB_SSC[IEV_TAB_SSC][2] = VXOUT; EV_TAB_SSC[IEV_TAB_SSC][3] = VYOUT; EV_TAB_SSC[IEV_TAB_SSC][4] = VZOUT; // Heavy residue if (gammadecay == 0) { G4double v2 = std::pow(EV_TAB_SSC[IEV_TAB_SSC][2], 2.) + std::pow(EV_TAB_SSC[IEV_TAB_SSC][3], 2.) + std::pow(EV_TAB_SSC[IEV_TAB_SSC][4], 2.); G4double gamma = 1.0 / std::sqrt(1.0 - v2 / (c * c)); G4double etot_lp = amoins * mu * gamma; pxeva = pxeva - EV_TAB_SSC[IEV_TAB_SSC][2] * etot_lp / c; pyeva = pyeva - EV_TAB_SSC[IEV_TAB_SSC][3] * etot_lp / c; pleva = pleva - EV_TAB_SSC[IEV_TAB_SSC][4] * etot_lp / c; } else { // in case of gammas, EV_TEMP contains momentum components and not velocity pxeva = pxeva - EV_TAB_SSC[IEV_TAB_SSC][2]; pyeva = pyeva - EV_TAB_SSC[IEV_TAB_SSC][3]; pleva = pleva - EV_TAB_SSC[IEV_TAB_SSC][4]; } pteva = std::sqrt(pxeva * pxeva + pyeva * pyeva); // To be checked: etot = std::sqrt(pleva * pleva + pteva * pteva + af * af * mu2); vx_eva = c * pxeva / etot; // recoil velocity components of residue due to evaporation vy_eva = c * pyeva / etot; vz_eva = c * pleva / etot; IEV_TAB_SSC = IEV_TAB_SSC + 1; if (time < tauf) goto post10; // post100: // *A_scission = af; *Z_scission = zf; *E_scission_post = ee; *NbLam0_par = NbLam0; return; } G4double G4Abla::getdeltabinding(G4double A, G4int H) { if (A < 1.) return (1. * H) / A * (10.68 * A - 21.27 * std::pow(A, 2. / 3.)) * 10.; return (1. * H) / A * (10.68 * A - 21.27 * std::pow(A, 2. / 3.)); } G4double G4Abla::gethyperseparation(G4double A, G4double Z, G4int ny) { if (A < 1.) return 1.e38; // For light nuclei we take experimental values // Journal of Physics G, Nucl Part Phys 32,363 (2006) if (ny == 1) { if (Z == 1 && A == 4) return 2.04; else if (Z == 2 && A == 4) return 2.39; else if (Z == 2 && A == 5) return 3.12; else if (Z == 2 && A == 6) return 4.18; else if (Z == 2 && A == 7) return 5.23; else if (Z == 2 && A == 8) return 7.16; else if (Z == 3 && A == 6) return 4.50; else if (Z == 3 && A == 7) return 5.58; else if (Z == 3 && A == 8) return 6.80; else if (Z == 3 && A == 9) return 8.50; else if (Z == 4 && A == 7) return 5.16; else if (Z == 4 && A == 8) return 6.84; else if (Z == 4 && A == 9) return 6.71; else if (Z == 4 && A == 10) return 9.11; else if (Z == 5 && A == 9) return 8.29; else if (Z == 5 && A == 10) return 9.01; else if (Z == 5 && A == 11) return 10.29; else if (Z == 5 && A == 12) return 11.43; else if (Z == 6 && A == 12) return 10.95; else if (Z == 6 && A == 13) return 11.81; else if (Z == 6 && A == 14) return 12.50; else if (Z == 7 && A == 14) return 12.17; else if (Z == 7 && A == 15) return 13.59; else if (Z == 8 && A == 16) return 12.50; else if (Z == 8 && A == 17) return 13.59; else if (Z == 14 && A == 28) return 16.0; else if (Z == 39 && A == 89) return 22.1; else if (Z == 57 && A == 139) return 23.8; else if (Z == 82 && A == 208) return 26.5; } // ny==1 // For other nuclei we take Bethe-Weizsacker mass formula return gethyperbinding(A, Z, ny) - gethyperbinding(A - 1., Z, ny - 1); } G4double G4Abla::gethyperbinding(G4double A, G4double Z, G4int ny) { // // Bethe-Weizsacker mass formula // Journal of Physics G, Nucl Part Phys 32,363 (2006) // if (A < 2 || Z < 2) return 0.; G4double N = A - Z - 1. * ny; G4double be = 0., my = 1115.683, av = 15.77, as = 18.34, ac = 0.71, asym = 23.21, k = 17., c = 30., D = 0.; if (mod(N, 2) == 1 && mod(Z, 2) == 1) D = -12. / std::sqrt(A); if (mod(N, 2) == 0 && mod(Z, 2) == 0) D = 12. / std::sqrt(A); // G4double deltanew = (1. - std::exp(-1. * A / c)) * D; // be = av * A - as * std::pow(A, 2. / 3.) - ac * Z * (Z - 1.) / std::pow(A, 1. / 3.) - asym * (N - Z) * (N - Z) / ((1. + std::exp(-1. * A / k)) * A) + deltanew + ny * (0.0335 * my - 26.7 - 48.7 / std::pow(A, 2.0 / 3.0)); return be; } void G4Abla::unbound(G4double SN, G4double SP, G4double SD, G4double ST, G4double SHE, G4double SA, G4double BP, G4double BD, G4double BT, G4double BHE, G4double BA, G4double* PROBF, G4double* PROBN, G4double* PROBP, G4double* PROBD, G4double* PROBT, G4double* PROBHE, G4double* PROBA, G4double* PROBIMF, G4double* PROBG, G4double* ECN, G4double* ECP, G4double* ECD, G4double* ECT, G4double* ECHE, G4double* ECA) { G4double SBP = SP + BP; G4double SBD = SD + BD; G4double SBT = ST + BT; G4double SBHE = SHE + BHE; G4double SBA = SA + BA; G4double e = dmin1(SBP, SBD, SBT); e = dmin1(SBHE, SN, e); e = dmin1(SBHE, SBA, e); // if (SN == e) { *ECN = (-1.0) * SN; *ECP = 0.0; *ECD = 0.0; *ECT = 0.0; *ECHE = 0.0; *ECA = 0.0; *PROBN = 1.0; *PROBP = 0.0; *PROBD = 0.0; *PROBT = 0.0; *PROBHE = 0.0; *PROBA = 0.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } else if (SBP == e) { *ECN = 0.0; *ECP = (-1.0) * SP + BP; *ECD = 0.0; *ECT = 0.0; *ECHE = 0.0; *ECA = 0.0; *PROBN = 0.0; *PROBP = 1.0; *PROBD = 0.0; *PROBT = 0.0; *PROBHE = 0.0; *PROBA = 0.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } else if (SBD == e) { *ECN = 0.0; *ECD = (-1.0) * SD + BD; *ECP = 0.0; *ECT = 0.0; *ECHE = 0.0; *ECA = 0.0; *PROBN = 0.0; *PROBP = 0.0; *PROBD = 1.0; *PROBT = 0.0; *PROBHE = 0.0; *PROBA = 0.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } else if (SBT == e) { *ECN = 0.0; *ECT = (-1.0) * ST + BT; *ECD = 0.0; *ECP = 0.0; *ECHE = 0.0; *ECA = 0.0; *PROBN = 0.0; *PROBP = 0.0; *PROBD = 0.0; *PROBT = 1.0; *PROBHE = 0.0; *PROBA = 0.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } else if (SBHE == e) { *ECN = 0.0; *ECHE = (-1.0) * SHE + BHE; *ECD = 0.0; *ECT = 0.0; *ECP = 0.0; *ECA = 0.0; *PROBN = 0.0; *PROBP = 0.0; *PROBD = 0.0; *PROBT = 0.0; *PROBHE = 1.0; *PROBA = 0.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } else { if (SBA == e) { *ECN = 0.0; *ECA = (-1.0) * SA + BA; *ECD = 0.0; *ECT = 0.0; *ECHE = 0.0; *ECP = 0.0; *PROBN = 0.0; *PROBP = 0.0; *PROBD = 0.0; *PROBT = 0.0; *PROBHE = 0.0; *PROBA = 1.0; *PROBIMF = 0.0; *PROBF = 0.0; *PROBG = 0.0; } } return; } void G4Abla::fissionDistri(G4double& A, G4double& Z, G4double& E, G4double& a1, G4double& z1, G4double& e1, G4double& v1, G4double& a2, G4double& z2, G4double& e2, G4double& v2, G4double& vx_eva_sc, G4double& vy_eva_sc, G4double& vz_eva_sc, G4int* NbLam0_par) { /* Last update: 21/01/17 - J.L.R.S. - Implementation of this fission model in C++ Authors: K.-H. Schmidt, A. Kelic, M. V. Ricciardi,J. Benlliure, and J.L.Rodriguez-Sanchez(1995 - 2017) On input: A, Z, E (mass, atomic number and exc. energy of compound nucleus before fission) On output: Ai, Zi, Ei (mass, atomic number and (absolute) exc. energy of fragment 1 and 2 after fission) */ /* This program calculates isotopic distributions of fission fragments */ /* with a semiempirical model */ /* The width and eventually a shift in N/Z (polarization) follows the */ /* following rules: */ /* */ /* The line N/Z following UCD has an angle of atan(Zcn/Ncn) */ /* to the horizontal axis on a chart of nuclides. */ /* (For 238U the angle is 32.2 deg.) */ /* */ /* The following relations hold: (from Armbruster) c c sigma(N) (A=const) = sigma(Z) (A=const) c sigma(A) (N=const) = sigma(Z) (N=const) c sigma(A) (Z=const) = sigma(N) (Z=const) c c From this we get: c sigma(Z) (N=const) * N = sigma(N) (Z=const) * Z c sigma(A) (Z=const) = sigma(Z) (A=const) * A/Z c sigma(N) (Z=const) = sigma(Z) (A=const) * A/Z c Z*sigma(N) (Z=const) = N*sigma(Z) (N=const) = A*sigma(Z) (A=const) */ // /* Model parameters: C These parameters have been adjusted to the compound nucleus 238U. c For the fission of another compound nucleus, it might be c necessary to slightly adjust some parameter values. c The most important ones are C Delta_U1_shell_max and c Delta_u2_shell. */ G4double Nheavy1_in; // 'position of shell for Standard 1' Nheavy1_in = 83.0; G4double Zheavy1_in; // 'position of shell for Standard 1' Zheavy1_in = 50.0; G4double Nheavy2; // 'position of heavy peak valley 2' Nheavy2 = 89.0; G4double Delta_U1_shell_max; // 'Shell effect for valley 1' Delta_U1_shell_max = -2.45; G4double U1NZ_SLOPE; // Reduction of shell effect with distance to 132Sn U1NZ_SLOPE = 0.2; G4double Delta_U2_shell; // 'Shell effect for valley 2' Delta_U2_shell = -2.45; G4double X_s2s; // 'Ratio (C_sad/C_scis) of curvature of potential' X_s2s = 0.8; G4double hbom1, hbom2, hbom3; // 'Curvature of potential at saddle' hbom1 = 0.2; // hbom1 is hbar * omega1 / (2 pi) !!! hbom2 = 0.2; // hbom2 is hbar * omega2 / (2 pi) !!! hbom3 = 0.2; // hbom3 is hbar * omega3 / (2 pi) !!! G4double Fwidth_asymm1, Fwidth_asymm2, Fwidth_symm; // 'Factors for widths of distr. valley 1 and 2' Fwidth_asymm1 = 0.65; Fwidth_asymm2 = 0.65; Fwidth_symm = 1.16; G4double xLevdens; // 'Parameter x: a = A/x' xLevdens = 10.75; // The value of 1/0.093 = 10.75 is consistent with the // systematics of the mass widths of Ref. (RuI97). G4double FGAMMA; // 'Factor to gamma' FGAMMA = 1.; // Theoretical expectation, not adjusted to data. // Additional factor to attenuation coefficient of shell effects // with increasing excitation energy G4double FGAMMA1; // 'Factor to gamma_heavy1' FGAMMA1 = 2.; // Adjusted to reduce the weight of Standard 1 with increasing // excitation energies, as required by experimental data. G4double FREDSHELL; FREDSHELL = 0.; // Adjusted to the reduced attenuation of shells in the superfluid region. // If FGAMMA is modified, // FGAMMA * FREADSHELL should remain constant (0.65) to keep // the attenuation of the shell effects below the critical // pairing energy ECRIT unchanged, which has been carefully // adjusted to the mass yields of Vives and Zoeller in this // energy range. A high value of FGAMMA leads ot a stronger // attenuation of shell effects above the superfluid region. G4double Ecrit; Ecrit = 5.; // The value of ECRIT determines the transition from a weak // decrease of the shell effect below ECRIT to a stronger // decrease above the superfluid range. const G4double d = 2.0; // 'Surface distance of scission configuration' // d = 2.0; // Charge polarisation from Wagemanns p. 397: G4double cpol1; // Charge polarisation standard I cpol1 = 0.35; // calculated internally with shells G4double cpol2; // Charge polarisation standard II cpol2 = 0.; // calculated internally from LDM G4double Friction_factor; Friction_factor = 1.0; G4double Nheavy1; // position of valley St 1 in Z and N G4double Delta_U1, Delta_U2; // used shell effects G4double cN_asymm1_shell, cN_asymm2_shell; G4double gamma, gamma_heavy1, gamma_heavy2; // fading of shells G4double E_saddle_scission; // friction from saddle to scission G4double Ysymm = 0.; // Yield of symmetric mode G4double Yasymm1 = 0.; // Yield of asymmetric mode 1 G4double Yasymm2 = 0.; // Yield of asymmetric mode 2 G4double Nheavy1_eff; // Effective position of valley 1 G4double Nheavy2_eff; // Effective position of valley 2 G4double eexc1_saddle; // Excitation energy above saddle 1 G4double eexc2_saddle; // Excitation energy above saddle 2 G4double EEXC_MAX; // Excitation energy above lowest saddle G4double r_e_o; // Even-odd effect in Z G4double cN_symm; // Curvature of symmetric valley G4double CZ; // Curvature of Z distribution for fixed A G4double Nheavy2_NZ; // Position of Shell 2, combined N and Z G4double N; G4double Aheavy1, Aheavy2; G4double Sasymm1 = 0., Sasymm2 = 0., Ssymm = 0., Ysum = 0., Yasymm = 0.; G4double Ssymm_mode1, Ssymm_mode2; G4double wNasymm1_saddle, wNasymm2_saddle, wNsymm_saddle; G4double wNasymm2_scission, wNsymm_scission; G4double wNasymm1, wNasymm2, wNsymm; G4int imode; G4double rmode; G4double ZA1width; G4double N1r, N2r, A1r, N1, N2; G4double Zsymm, Nsymm; G4double N1mean, N1width; G4double dUeff; /* effective shell effect at lowest barrier */ G4double Eld; /* Excitation energy with respect to ld barrier */ G4double re1, re2, re3; G4double eps1, eps2; G4double Z1UCD, Z2UCD; G4double beta = 0., beta1 = 0., beta2 = 0.; // double betacomplement; G4double DN1_POL; /* shift of most probable neutron number for given Z, according to polarization */ G4int i_help; G4double A_levdens; /* level-density parameter */ // double A_levdens_light1,A_levdens_light2; G4double A_levdens_heavy1, A_levdens_heavy2; G4double R0 = 1.16; G4double epsilon_1_saddle, epsilon0_1_saddle; G4double epsilon_2_saddle, epsilon0_2_saddle, epsilon_symm_saddle; G4double epsilon_1_scission; //,epsilon0_1_scission; G4double epsilon_2_scission; //,epsilon0_2_scission; G4double epsilon_symm_scission; /* modified energy */ G4double E_eff1_saddle, E_eff2_saddle; G4double Epot0_mode1_saddle, Epot0_mode2_saddle, Epot0_symm_saddle; G4double Epot_mode1_saddle, Epot_mode2_saddle, Epot_symm_saddle; G4double E_defo, E_defo1, E_defo2, E_scission_pre = 0., E_scission_post; G4double E_asym; G4double E1exc = 0., E2exc = 0.; G4double E1exc_sigma, E2exc_sigma; G4double TKER; G4double EkinR1, EkinR2; G4double MassCurv_scis, MassCurv_sadd; G4double cN_symm_sadd; G4double Nheavy1_shell, Nheavy2_shell; G4double wNasymm1_scission; G4double Aheavy1_eff, Aheavy2_eff; G4double Z1rr, Z1r; G4double E_HELP; G4double Z_scission, N_scission, A_scission; G4double Z2_over_A_eff; G4double beta1gs = 0., beta2gs = 0., betags = 0.; G4double sigZmin; // 'Minimum neutron width for constant Z' G4double DSN132, Delta_U1_shell, E_eff0_saddle; //,e_scission; G4int NbLam0 = (*NbLam0_par); // sigZmin = 0.5; N = A - Z; /* neutron number of the fissioning nucleus */ // cN_asymm1_shell = 0.700 * N / Z; cN_asymm2_shell = 0.040 * N / Z; //********************************************************************* DSN132 = Nheavy1_in - N / Z * Zheavy1_in; Aheavy1 = Nheavy1_in + Zheavy1_in + 0.340 * DSN132; /* Neutron number of valley Standard 1 */ /* It is assumed that the 82-neutron shell effect is stronger than c the 50-proton shell effect. Therefore, the deviation in N/Z of c the fissioning nucleus from the N/Z of 132Sn will c change the position of the combined shell in mass. For neutron- c deficient fissioning nuclei, the mass will increase and vice c versa. */ Delta_U1_shell = Delta_U1_shell_max + U1NZ_SLOPE * std::abs(DSN132); Delta_U1_shell = min(0., Delta_U1_shell); /* Empirical reduction of shell effect with distance in N/Z of CN to 132Sn */ /* Fits (239U,n)f and 226Th e.-m.-induced fission */ Nheavy1 = N / A * Aheavy1; /* UCD */ Aheavy2 = Nheavy2 * A / N; Zsymm = Z / 2.0; /* proton number in symmetric fission (centre) */ Nsymm = N / 2.0; A_levdens = A / xLevdens; gamma = A_levdens / (0.40 * std::pow(A, 1.3333)) * FGAMMA; A_levdens_heavy1 = Aheavy1 / xLevdens; gamma_heavy1 = A_levdens_heavy1 / (0.40 * std::pow(Aheavy1, 1.3333)) * FGAMMA * FGAMMA1; A_levdens_heavy2 = Aheavy2 / xLevdens; gamma_heavy2 = A_levdens_heavy2 / (0.40 * std::pow(Aheavy2, 1.3333)) * FGAMMA; // Energy dissipated from saddle to scission // F. Rejmund et al., Nucl. Phys. A 678 (2000) 215, fig. 4 b */ E_saddle_scission = (-24. + 0.02227 * Z * Z / std::pow(A, 0.33333)) * Friction_factor; E_saddle_scission = max(0.0, E_saddle_scission); // Fit to experimental result on curvature of potential at saddle // Parametrization of T. Enqvist according to Mulgin et al. 1998 // MassCurv taken at scission. */ Z2_over_A_eff = Z * Z / A; if (Z2_over_A_eff < 34.0) MassCurv_scis = std::pow(10., -1.093364 + 0.082933 * Z2_over_A_eff - 0.0002602 * Z2_over_A_eff * Z2_over_A_eff); else MassCurv_scis = std::pow(10., 3.053536 - 0.056477 * Z2_over_A_eff + 0.0002454 * Z2_over_A_eff * Z2_over_A_eff); // to do: // fix the X with the channel intensities of 226Th (KHS at SEYSSINS,1998) // replace then (all) cN_symm by cN_symm_saddle (at least for Yields) MassCurv_sadd = X_s2s * MassCurv_scis; cN_symm = 8.0 / std::pow(N, 2.) * MassCurv_scis; cN_symm_sadd = 8.0 / std::pow(N, 2.) * MassCurv_sadd; Nheavy1_shell = Nheavy1; if (E < 100.0) Nheavy1_eff = (cN_symm_sadd * Nsymm + cN_asymm1_shell * Uwash(E / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) * Nheavy1_shell) / (cN_symm_sadd + cN_asymm1_shell * Uwash(E / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1)); else Nheavy1_eff = (cN_symm_sadd * Nsymm + cN_asymm1_shell * Nheavy1_shell) / (cN_symm_sadd + cN_asymm1_shell); /* Position of Standard II defined by neutron shell */ Nheavy2_NZ = Nheavy2; Nheavy2_shell = Nheavy2_NZ; if (E < 100.) Nheavy2_eff = (cN_symm_sadd * Nsymm + cN_asymm2_shell * Uwash(E / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) * Nheavy2_shell) / (cN_symm_sadd + cN_asymm2_shell * Uwash(E / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2)); else Nheavy2_eff = (cN_symm_sadd * Nsymm + cN_asymm2_shell * Nheavy2_shell) / (cN_symm_sadd + cN_asymm2_shell); Delta_U1 = Delta_U1_shell + (Nheavy1_shell - Nheavy1_eff) * (Nheavy1_shell - Nheavy1_eff) * cN_asymm1_shell; /* shell effect in valley of mode 1 */ Delta_U1 = min(Delta_U1, 0.0); Delta_U2 = Delta_U2_shell + (Nheavy2_shell - Nheavy2_eff) * (Nheavy2_shell - Nheavy2_eff) * cN_asymm2_shell; /* shell effect in valley of mode 2 */ Delta_U2 = min(Delta_U2, 0.0); // liquid drop energies at the centres of the different shell effects // with respect to liquid drop at symmetry Epot0_mode1_saddle = (Nheavy1_eff - Nsymm) * (Nheavy1_eff - Nsymm) * cN_symm_sadd; Epot0_mode2_saddle = (Nheavy2_eff - Nsymm) * (Nheavy2_eff - Nsymm) * cN_symm_sadd; Epot0_symm_saddle = 0.0; // energies including shell effects at the centres of the different // shell effects with respect to liquid drop at symmetry */ Epot_mode1_saddle = Epot0_mode1_saddle + Delta_U1; Epot_mode2_saddle = Epot0_mode2_saddle + Delta_U2; Epot_symm_saddle = Epot0_symm_saddle; // minimum of potential with respect to ld potential at symmetry dUeff = min(Epot_mode1_saddle, Epot_mode2_saddle); dUeff = min(dUeff, Epot_symm_saddle); dUeff = dUeff - Epot_symm_saddle; Eld = E + dUeff; // E = energy above lowest effective barrier // Eld = energy above liquid-drop barrier // Due to this treatment the energy E on input means the excitation // energy above the lowest saddle. */ // excitation energies at saddle modes 1 and 2 without shell effect */ epsilon0_1_saddle = Eld - Epot0_mode1_saddle; epsilon0_2_saddle = Eld - Epot0_mode2_saddle; // excitation energies at saddle modes 1 and 2 with shell effect */ epsilon_1_saddle = Eld - Epot_mode1_saddle; epsilon_2_saddle = Eld - Epot_mode2_saddle; epsilon_symm_saddle = Eld - Epot_symm_saddle; // epsilon_symm_saddle = Eld - dUeff; eexc1_saddle = epsilon_1_saddle; eexc2_saddle = epsilon_2_saddle; // EEXC_MAX is energy above the lowest saddle */ EEXC_MAX = max(eexc1_saddle, eexc2_saddle); EEXC_MAX = max(EEXC_MAX, Eld); // excitation energy at scission */ epsilon_1_scission = Eld + E_saddle_scission - Epot_mode1_saddle; epsilon_2_scission = Eld + E_saddle_scission - Epot_mode2_saddle; // excitation energy of symmetric fragment at scission */ epsilon_symm_scission = Eld + E_saddle_scission - Epot_symm_saddle; // calculate widhts at the saddle E_eff1_saddle = epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1); if (E_eff1_saddle < A_levdens * hbom1 * hbom1) E_eff1_saddle = A_levdens * hbom1 * hbom1; wNasymm1_saddle = std::sqrt( 0.50 * std::sqrt(1.0 / A_levdens * E_eff1_saddle) / (cN_asymm1_shell * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) + cN_symm_sadd)); E_eff2_saddle = epsilon0_2_saddle - Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2); if (E_eff2_saddle < A_levdens * hbom2 * hbom2) E_eff2_saddle = A_levdens * hbom2 * hbom2; wNasymm2_saddle = std::sqrt( 0.50 * std::sqrt(1.0 / A_levdens * E_eff2_saddle) / (cN_asymm2_shell * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) + cN_symm_sadd)); E_eff0_saddle = epsilon_symm_saddle; if (E_eff0_saddle < A_levdens * hbom3 * hbom3) E_eff0_saddle = A_levdens * hbom3 * hbom3; wNsymm_saddle = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * E_eff0_saddle) / cN_symm_sadd); if (epsilon_symm_scission > 0.0) { E_HELP = max(E_saddle_scission, epsilon_symm_scission); wNsymm_scission = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * (E_HELP)) / cN_symm); } else { wNsymm_scission = std::sqrt(0.50 * std::sqrt(1.0 / A_levdens * E_saddle_scission) / cN_symm); } // Calculate widhts at the scission point: // fits of ref. Beizin 1991 (Plots by Sergei Zhdanov) if (E_saddle_scission == 0.0) { wNasymm1_scission = wNasymm1_saddle; wNasymm2_scission = wNasymm2_saddle; } else { if (Nheavy1_eff > 75.0) { wNasymm1_scission = std::sqrt(21.0) * N / A; wNasymm2_scission = max(12.8 - 1.0 * (92.0 - Nheavy2_eff), 1.0) * N / A; } else { wNasymm1_scission = wNasymm1_saddle; wNasymm2_scission = wNasymm2_saddle; } } wNasymm1_scission = max(wNasymm1_scission, wNasymm1_saddle); wNasymm2_scission = max(wNasymm2_scission, wNasymm2_saddle); wNasymm1 = wNasymm1_scission * Fwidth_asymm1; wNasymm2 = wNasymm2_scission * Fwidth_asymm2; wNsymm = wNsymm_scission * Fwidth_symm; // mass and charge of fragments using UCD, needed for level densities Aheavy1_eff = Nheavy1_eff * A / N; Aheavy2_eff = Nheavy2_eff * A / N; A_levdens_heavy1 = Aheavy1_eff / xLevdens; A_levdens_heavy2 = Aheavy2_eff / xLevdens; gamma_heavy1 = A_levdens_heavy1 / (0.40 * std::pow(Aheavy1_eff, 1.3333)) * FGAMMA * FGAMMA1; gamma_heavy2 = A_levdens_heavy2 / (0.40 * std::pow(Aheavy2_eff, 1.3333)) * FGAMMA; if (epsilon_symm_saddle < A_levdens * hbom3 * hbom3) Ssymm = 2.0 * std::sqrt(A_levdens * A_levdens * hbom3 * hbom3) + (epsilon_symm_saddle - A_levdens * hbom3 * hbom3) / hbom3; else Ssymm = 2.0 * std::sqrt(A_levdens * epsilon_symm_saddle); Ysymm = 1.0; if (epsilon0_1_saddle < A_levdens * hbom1 * hbom1) Ssymm_mode1 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom1 * hbom1) + (epsilon0_1_saddle - A_levdens * hbom1 * hbom1) / hbom1; else Ssymm_mode1 = 2.0 * std::sqrt(A_levdens * epsilon0_1_saddle); if (epsilon0_2_saddle < A_levdens * hbom2 * hbom2) Ssymm_mode2 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom2 * hbom2) + (epsilon0_2_saddle - A_levdens * hbom2 * hbom2) / hbom2; else Ssymm_mode2 = 2.0 * std::sqrt(A_levdens * epsilon0_2_saddle); if (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) < A_levdens * hbom1 * hbom1) Sasymm1 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom1 * hbom1) + (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1) - A_levdens * hbom1 * hbom1) / hbom1; else Sasymm1 = 2.0 * std::sqrt(A_levdens * (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_1_saddle / A * Aheavy1, Ecrit, FREDSHELL, gamma_heavy1))); if (epsilon0_2_saddle - Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) < A_levdens * hbom2 * hbom2) Sasymm2 = 2.0 * std::sqrt(A_levdens * A_levdens * hbom2 * hbom2) + (epsilon0_1_saddle - Delta_U1 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2) - A_levdens * hbom2 * hbom2) / hbom2; else Sasymm2 = 2.0 * std::sqrt(A_levdens * (epsilon0_2_saddle - Delta_U2 * Uwash(epsilon_2_saddle / A * Aheavy2, Ecrit, FREDSHELL, gamma_heavy2))); Yasymm1 = (std::exp(Sasymm1 - Ssymm) - std::exp(Ssymm_mode1 - Ssymm)) * wNasymm1_saddle / wNsymm_saddle * 2.0; Yasymm2 = (std::exp(Sasymm2 - Ssymm) - std::exp(Ssymm_mode2 - Ssymm)) * wNasymm2_saddle / wNsymm_saddle * 2.0; Ysum = Ysymm + Yasymm1 + Yasymm2; /* normalize */ if (Ysum > 0.00) { Ysymm = Ysymm / Ysum; Yasymm1 = Yasymm1 / Ysum; Yasymm2 = Yasymm2 / Ysum; Yasymm = Yasymm1 + Yasymm2; } else { Ysymm = 0.0; Yasymm1 = 0.0; Yasymm2 = 0.0; // search minimum threshold and attribute all events to this mode */ if ((epsilon_symm_saddle < epsilon_1_saddle) && (epsilon_symm_saddle < epsilon_2_saddle)) Ysymm = 1.0; else if (epsilon_1_saddle < epsilon_2_saddle) Yasymm1 = 1.0; else Yasymm2 = 1.0; } // even-odd effect // Parametrization from Rejmund et al. if (mod(Z, 2.0) == 0) r_e_o = std::pow(10.0, -0.0170 * (E_saddle_scission + Eld) * (E_saddle_scission + Eld)); else r_e_o = 0.0; /* ------------------------------------------------------- c selecting the fission mode using the yields at scission c ------------------------------------------------------- c random decision: symmetric or asymmetric c IMODE = 1 means asymmetric fission, mode 1 c IMODE = 2 means asymmetric fission, mode 2 c IMODE = 3 means symmetric fission c testcase: 238U, E*= 6 MeV : 6467 8781 4752 (20000) c 127798 176480 95722 (400000) c 319919 440322 239759 (1000000) c E*=12 MeV : 153407 293063 553530 (1000000) */ fiss321: // rmode = DBLE(HAZ(k)) rmode = G4AblaRandom::flat(); if (rmode < Yasymm1) imode = 1; else if ((rmode > Yasymm1) && (rmode < Yasymm)) imode = 2; else imode = 3; // determine parameters of the neutron distribution of each mode // at scission if (imode == 1) { N1mean = Nheavy1_eff; N1width = wNasymm1; } else { if (imode == 2) { N1mean = Nheavy2_eff; N1width = wNasymm2; } else { // if( imode == 3 ) then N1mean = Nsymm; N1width = wNsymm; } } // N2mean needed by CZ below // N2mean = N - N1mean; // fission mode found, then the determination of the // neutron numbers N1 and N2 at scission by randon decision N1r = 1.0; N2r = 1.0; while (N1r < 5.0 || N2r < 5.0) { // N1r = DBLE(GaussHaz(k,sngl(N1mean), sngl(N1width) )) // N1r = N1mean+G4AblaRandom::gaus(N1width);// N1r = gausshaz(0, N1mean, N1width); N2r = N - N1r; } // -------------------------------------------------- // first approximation of fission fragments using UCD at saddle // -------------------------------------------------- Z1UCD = Z / N * N1r; Z2UCD = Z / N * N2r; A1r = A / N * N1r; // // -------------------------- // deformations: starting ... // -------------------------- */ if (imode == 1) { // --- N = 82 */ E_scission_pre = max(epsilon_1_scission, 1.0); // ! Eexc at scission, neutron evaporation from saddle to scission not // considered */ if (N1mean > N * 0.50) { beta1 = 0.0; /* 1. fragment is spherical */ beta2 = 0.55; /* 2. fragment is deformed 0.5*/ } else { beta1 = 0.55; /* 1. fragment is deformed 0.5*/ beta2 = 0.00; /* 2. fragment is spherical */ } } if (imode == 2) { // --- N appr. 86 */ E_scission_pre = max(epsilon_2_scission, 1.0); if (N1mean > N * 0.50) { beta1 = (N1r - 92.0) * 0.030 + 0.60; beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; beta1 = max(beta1, beta1gs); beta2 = 1.0 - beta1; beta2 = max(beta2, beta2gs); } else { beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; beta2 = (N2r - 92.0) * 0.030 + 0.60; beta2 = max(beta2, beta2gs); beta1 = 1.0 - beta2; beta1 = max(beta1, beta1gs); } } beta = 0.0; if (imode == 3) { // if( imode >0 ){ // --- Symmetric fission channel // the fit function for beta is the deformation for optimum energy // at the scission point, d = 2 // beta : deformation of symmetric fragments // beta1 : deformation of first fragment // beta2 : deformation of second fragment betags = ecld->beta2[idint(Nsymm)][idint(Zsymm)]; beta1gs = ecld->beta2[idint(N1r)][idint(Z1UCD)]; beta2gs = ecld->beta2[idint(N2r)][idint(Z2UCD)]; beta = max(0.177963 + 0.0153241 * Zsymm - 1.62037e-4 * Zsymm * Zsymm, betags); beta1 = max(0.177963 + 0.0153241 * Z1UCD - 1.62037e-4 * Z1UCD * Z1UCD, beta1gs); beta2 = max(0.177963 + 0.0153241 * Z2UCD - 1.62037e-4 * Z2UCD * Z2UCD, beta2gs); E_asym = frldm(Z1UCD, N1r, beta1) + frldm(Z2UCD, N2r, beta2) + ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, 2.0) - 2.0 * frldm(Zsymm, Nsymm, beta) - ecoul(Zsymm, Nsymm, beta, Zsymm, Nsymm, beta, 2.0); E_scission_pre = max(epsilon_symm_scission - E_asym, 1.); } // ----------------------- // ... end of deformations // ----------------------- // ------------------------------------------ // evaporation from saddle to scission ... // ------------------------------------------ if (E_scission_pre > 5. && NbLam0 < 1) { evap_postsaddle( A, Z, E_scission_pre, &E_scission_post, &A_scission, &Z_scission, vx_eva_sc, vy_eva_sc, vz_eva_sc, &NbLam0); N_scission = A_scission - Z_scission; } else { A_scission = A; Z_scission = Z; E_scission_post = E_scission_pre; N_scission = A_scission - Z_scission; } // --------------------------------------------------- // second approximation of fission fragments using UCD // --------------------------------------------------- */ // N1r = N1r * N_scission / N; N2r = N2r * N_scission / N; Z1UCD = Z1UCD * Z_scission / Z; Z2UCD = Z2UCD * Z_scission / Z; A1r = Z1UCD + N1r; // --------------------------------------------------------- // determination of the charge and mass of the fragments ... // --------------------------------------------------------- // - CZ is the curvature of charge distribution for fixed mass, // common to all modes, gives the width of the charge distribution. // The physics picture behind is that the division of the // fissioning nucleus in N and Z is slow when mass transport from // one nascent fragment to the other is concerned but fast when the // N/Z degree of freedom is concernded. In addition, the potential // minima in direction of mass transport are broad compared to the // potential minimum in N/Z direction. // The minima in direction of mass transport are calculated // by the liquid-drop (LD) potential (for superlong mode), // by LD + N=82 shell (for standard 1 mode) and // by LD + N=86 shell (for standard 2 mode). // Since the variation of N/Z is fast, it can quickly adjust to // the potential and is thus determined close to scission. // Thus, we calculate the mean N/Z and its width for fixed mass // at scission. // For the SL mode, the mean N/Z is calculated by the // minimum of the potential at scission as a function of N/Z for // fixed mass. // For the S1 and S2 modes, this correlation is imposed by the // empirical charge polarisation. // For the SL mode, the fluctuation in this width is calculated // from the curvature of the potential at scission as a function // of N/Z. This value is also used for the widths of S1 and S2. // Polarisation assumed for standard I and standard II: // Z - Zucd = cpol (for A = const); // from this we get (see remarks above) // Z - Zucd = Acn/Ncn * cpol (for N = const) */ // CZ = (frldm(Z1UCD - 1.0, N1r + 1.0, beta1) + frldm(Z2UCD + 1.0, N2r - 1.0, beta2) + frldm(Z1UCD + 1.0, N1r - 1.0, beta1) + frldm(Z2UCD - 1.0, N2r + 1.0, beta2) + ecoul(Z1UCD - 1.0, N1r + 1.0, beta1, Z2UCD + 1.0, N2r - 1.0, beta2, 2.0) + ecoul(Z1UCD + 1.0, N1r - 1.0, beta1, Z2UCD - 1.0, N2r + 1.0, beta2, 2.0) - 2.0 * ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, 2.0) - 2.0 * frldm(Z1UCD, N1r, beta1) - 2.0 * frldm(Z2UCD, N2r, beta2)) * 0.50; // if (1.0 / A_levdens * E_scission_post < 0.0) std::cout << "DSQRT 1 < 0" << A_levdens << " " << E_scission_post << std::endl; if (0.50 * std::sqrt(1.0 / A_levdens * E_scission_post) / CZ < 0.0) { std::cout << "DSQRT 2 < 0 " << CZ << std::endl; std::cout << "This event was not considered" << std::endl; goto fiss321; } ZA1width = std::sqrt(0.5 * std::sqrt(1.0 / A_levdens * E_scission_post) / CZ); // Minimum width in N/Z imposed. // Value of minimum width taken from 235U(nth,f) data // sigma_Z(A=const) = 0.4 to 0.5 (from Lang paper Nucl Phys. A345 (1980) // 34) sigma_N(Z=const) = 0.45 * A/Z (= 1.16 for 238U) // therefore: SIGZMIN = 1.16 // Physics; variation in N/Z for fixed A assumed. // Thermal energy at scission is reduced by // pre-scission neutron evaporation" ZA1width = max(ZA1width, sigZmin); if (imode == 1 && cpol1 != 0.0) { // --- asymmetric fission, mode 1 */ G4int IS = 0; fiss2801: Z1rr = Z1UCD - cpol1 * A_scission / N_scission; // Z1r = DBLE(GaussHaz(k,sngl(Z1rr), sngl(ZA1width) )); // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width);// Z1r = gausshaz(0, Z1rr, ZA1width); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" << std::endl; Z1r = Z1rr; } if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || Z1r < 1.0) goto fiss2801; N1r = A1r - Z1r; } else { if (imode == 2 && cpol2 != 0.0) { // --- asymmetric fission, mode 2 */ G4int IS = 0; fiss2802: Z1rr = Z1UCD - cpol2 * A_scission / N_scission; // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width);// Z1r = gausshaz(0, Z1rr, ZA1width); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" << std::endl; Z1r = Z1rr; } if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || Z1r < 1.0) goto fiss2802; N1r = A1r - Z1r; } else { // Otherwise do; /* Imode = 3 in any case; imode = 1 and 2 for CPOL = // 0 */ // and symmetric case */ // We treat a simultaneous split in Z and N to determine // polarisation */ re1 = frldm(Z1UCD - 1.0, N1r + 1.0, beta1) + frldm(Z2UCD + 1.0, N2r - 1.0, beta2) + ecoul(Z1UCD - 1.0, N1r + 1.0, beta1, Z2UCD + 1.0, N2r - 1.0, beta2, d); /* d = 2 fm */ re2 = frldm(Z1UCD, N1r, beta1) + frldm(Z2UCD, N2r, beta2) + ecoul(Z1UCD, N1r, beta1, Z2UCD, N2r, beta2, d); /* d = 2 fm */ re3 = frldm(Z1UCD + 1.0, N1r - 1.0, beta1) + frldm(Z2UCD - 1.0, N2r + 1.0, beta2) + ecoul(Z1UCD + 1.0, N1r - 1.0, beta1, Z2UCD - 1.0, N2r + 1.0, beta2, d); /* d = 2 fm */ eps2 = (re1 - 2.0 * re2 + re3) / 2.0; eps1 = (re3 - re1) / 2.0; DN1_POL = -eps1 / (2.0 * eps2); // Z1rr = Z1UCD + DN1_POL; // Polarization of Standard 1 from shell effects around 132Sn if (imode == 1) { if (Z1rr > 50.0) { DN1_POL = DN1_POL - 0.6 * Uwash(E_scission_post, Ecrit, FREDSHELL, gamma); Z1rr = Z1UCD + DN1_POL; if (Z1rr < 50.) Z1rr = 50.0; } else { DN1_POL = DN1_POL + 0.60 * Uwash(E_scission_post, Ecrit, FREDSHELL, gamma); Z1rr = Z1UCD + DN1_POL; if (Z1rr > 50.0) Z1rr = 50.0; } } G4int IS = 0; fiss2803: // Z1r = Z1rr+G4AblaRandom::gaus(ZA1width); Z1r = gausshaz(0, Z1rr, ZA1width); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING Z1R IN PROFI.FOR. A VALUE WILL BE FORCED" << std::endl; Z1r = Z1rr; } if ((utilabs(Z1rr - Z1r) > 3.0 * ZA1width) || (Z1r < 1.0)) goto fiss2803; N1r = A1r - Z1r; } } // ------------------------------------------ // Integer proton number with even-odd effect // ------------------------------------------ even_odd(Z1r, r_e_o, i_help); z1 = G4double(i_help); z2 = dint(Z_scission) - z1; N1 = dint(N1r); N2 = dint(N_scission) - N1; a1 = z1 + N1; a2 = z2 + N2; if ((z1 < 0) || (z2 < 0) || (a1 < 0) || (a2 < 0)) { std::cout << " -------------------------------" << std::endl; std::cout << " Z, A, N : " << Z << " " << A << " " << N << std::endl; std::cout << z1 << " " << z2 << " " << a1 << " " << a2 << std::endl; std::cout << E_scission_post << " " << A_levdens << " " << CZ << std::endl; std::cout << " -------------------------------" << std::endl; } // ----------------------- // excitation energies ... // ----------------------- // if (imode == 1) { // ---- N = 82 if (N1mean > N * 0.50) { // (a) 1. fragment is spherical and 2. fragment is deformed */ E_defo = 0.0; beta2gs = ecld->beta2[idint(N2)][idint(z2)]; if (beta2 < beta2gs) beta2 = beta2gs; E1exc = E_scission_pre * a1 / A + E_defo; E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); E2exc = E_scission_pre * a2 / A + E_defo; } else { // (b) 1. fragment is deformed and 2. fragment is spherical */ beta1gs = ecld->beta2[idint(N1)][idint(z1)]; if (beta1 < beta1gs) beta1 = beta1gs; E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); E1exc = E_scission_pre * a1 / A + E_defo; E_defo = 0.0; E2exc = E_scission_pre * a2 / A + E_defo; } } if (imode == 2) { // --- N appr. 86 */ if (N1mean > N * 0.5) { /* 2. fragment is spherical */ beta1gs = ecld->beta2[idint(N1)][idint(z1)]; if (beta1 < beta1gs) beta1 = beta1gs; E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); E1exc = E_scission_pre * a1 / A + E_defo; beta2gs = ecld->beta2[idint(N2)][idint(z2)]; if (beta2 < beta2gs) beta2 = beta2gs; E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); E2exc = E_scission_pre * a2 / A + E_defo; } else { /* 1. fragment is spherical */ beta2gs = ecld->beta2[idint(N2)][idint(z2)]; if (beta2 < beta2gs) beta2 = beta2gs; E_defo = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); E2exc = E_scission_pre * a2 / A + E_defo; beta1gs = ecld->beta2[idint(N1)][idint(z1)]; if (beta1 < beta1gs) beta1 = beta1gs; E_defo = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); E1exc = E_scission_pre * a1 / A + E_defo; } } if (imode == 3) { // --- Symmetric fission channel beta1gs = ecld->beta2[idint(N1)][idint(z1)]; if (beta1 < beta1gs) beta1 = beta1gs; beta2gs = ecld->beta2[idint(N2)][idint(z2)]; if (beta2 < beta2gs) beta2 = beta2gs; E_defo1 = frldm(z1, N1, beta1) - frldm(z1, N1, beta1gs); E_defo2 = frldm(z2, N2, beta2) - frldm(z2, N2, beta2gs); E1exc = E_scission_pre * a1 / A + E_defo1; E2exc = E_scission_pre * a2 / A + E_defo2; } // pre-neutron-emission total kinetic energy */ TKER = (z1 * z2 * 1.440) / (R0 * std::pow(a1, 0.333330) * (1.0 + 2.0 / 3.0 * beta1) + R0 * std::pow(a2, 0.333330) * (1.0 + 2.0 / 3.0 * beta2) + 2.0); // Pre-neutron-emission kinetic energies of the fragments */ EkinR1 = TKER * a2 / A; EkinR2 = TKER * a1 / A; v1 = std::sqrt(EkinR1 / a1) * 1.3887; v2 = std::sqrt(EkinR2 / a2) * 1.3887; // Extracted from Lang et al. Nucl. Phys. A 345 (1980) 34 */ E1exc_sigma = 5.50; E2exc_sigma = 5.50; fis987: // e1 = E1exc+G4AblaRandom::gaus(E1exc_sigma);// e1 = gausshaz(0, E1exc, E1exc_sigma); if (e1 < 0.) goto fis987; fis988: // e2 = E2exc+G4AblaRandom::gaus(E2exc_sigma);// e2 = gausshaz(0, E2exc, E2exc_sigma); if (e2 < 0.) goto fis988; (*NbLam0_par) = NbLam0; return; } void G4Abla::even_odd(G4double r_origin, G4double r_even_odd, G4int& i_out) { // Procedure to calculate I_OUT from R_IN in a way that // on the average a flat distribution in R_IN results in a // fluctuating distribution in I_OUT with an even-odd effect as // given by R_EVEN_ODD // /* ------------------------------------------------------------ */ // /* EXAMPLES : */ // /* ------------------------------------------------------------ */ // /* If R_EVEN_ODD = 0 : */ // /* CEIL(R_IN) ---- */ // /* */ // /* R_IN -> */ // /* (somewhere in between CEIL(R_IN) and FLOOR(R_IN)) */ */ // /* */ // /* FLOOR(R_IN) ---- --> I_OUT */ // /* ------------------------------------------------------------ */ // /* If R_EVEN_ODD > 0 : */ // /* The interval for the above treatment is */ // /* larger for FLOOR(R_IN) = even and */ // /* smaller for FLOOR(R_IN) = odd */ // /* For R_EVEN_ODD < 0 : just opposite treatment */ // /* ------------------------------------------------------------ */ // /* ------------------------------------------------------------ */ // /* On input: R_ORIGIN nuclear charge (real number) */ // /* R_EVEN_ODD requested even-odd effect */ // /* Intermediate quantity: R_IN = R_ORIGIN + 0.5 */ // /* On output: I_OUT nuclear charge (integer) */ // /* ------------------------------------------------------------ */ // G4double R_ORIGIN,R_IN,R_EVEN_ODD,R_REST,R_HELP; G4double r_in = 0.0, r_rest = 0.0, r_help = 0.0; G4double r_floor = 0.0; G4double r_middle = 0.0; // G4int I_OUT,N_FLOOR; G4int n_floor = 0; r_in = r_origin + 0.5; r_floor = (G4double)((G4int)(r_in)); if (r_even_odd < 0.001) { i_out = (G4int)(r_floor); } else { r_rest = r_in - r_floor; r_middle = r_floor + 0.5; n_floor = (G4int)(r_floor); if (n_floor % 2 == 0) { // even before modif. r_help = r_middle + (r_rest - 0.5) * (1.0 - r_even_odd); } else { // odd before modification r_help = r_middle + (r_rest - 0.5) * (1.0 + r_even_odd); } i_out = (G4int)(r_help); } } double G4Abla::umass(G4double z, G4double n, G4double beta) { // liquid-drop mass, Myers & Swiatecki, Lysekil, 1967 // pure liquid drop, without pairing and shell effects // On input: Z nuclear charge of nucleus // N number of neutrons in nucleus // beta deformation of nucleus // On output: binding energy of nucleus G4double a = 0.0, fumass = 0.0; G4double alpha = 0.0; G4double xcom = 0.0, xvs = 0.0, xe = 0.0; const G4double pi = 3.1416; a = n + z; alpha = (std::sqrt(5.0 / (4.0 * pi))) * beta; xcom = 1.0 - 1.7826 * ((a - 2.0 * z) / a) * ((a - 2.0 * z) / a); // factor for asymmetry dependence of surface and volume term xvs = -xcom * (15.4941 * a - 17.9439 * std::pow(a, 2.0 / 3.0) * (1.0 + 0.4 * alpha * alpha)); // sum of volume and surface energy xe = z * z * (0.7053 / (std::pow(a, 1.0 / 3.0)) * (1.0 - 0.2 * alpha * alpha) - 1.1529 / a); fumass = xvs + xe; return fumass; } double G4Abla::ecoul(G4double z1, G4double n1, G4double beta1, G4double z2, G4double n2, G4double beta2, G4double d) { // Coulomb potential between two nuclei // surfaces are in a distance of d // in a tip to tip configuration // approximate formulation // On input: Z1 nuclear charge of first nucleus // N1 number of neutrons in first nucleus // beta1 deformation of first nucleus // Z2 nuclear charge of second nucleus // N2 number of neutrons in second nucleus // beta2 deformation of second nucleus // d distance of surfaces of the nuclei // G4double Z1,N1,beta1,Z2,N2,beta2,d,ecoul; G4double fecoul = 0; G4double dtot = 0; const G4double r0 = 1.16; dtot = r0 * (std::pow((z1 + n1), 1.0 / 3.0) * (1.0 + 0.6666667 * beta1) + std::pow((z2 + n2), 1.0 / 3.0) * (1.0 + 0.6666667 * beta2)) + d; fecoul = z1 * z2 * 1.44 / dtot; return fecoul; } G4double G4Abla::Uwash(G4double E, G4double Ecrit, G4double Freduction, G4double gamma) { // E excitation energy // Ecrit critical pairing energy // Freduction reduction factor for shell washing in superfluid region G4double R_wash, uwash; if (E < Ecrit) R_wash = std::exp(-E * Freduction * gamma); else R_wash = std::exp(-Ecrit * Freduction * gamma - (E - Ecrit) * gamma); uwash = R_wash; return uwash; } G4double G4Abla::frldm(G4double z, G4double n, G4double beta) { // Liquid-drop mass, Myers & Swiatecki, Lysekil, 1967 // pure liquid drop, without pairing and shell effects // // On input: Z nuclear charge of nucleus // N number of neutrons in nucleus // beta deformation of nucleus // On output: binding energy of nucleus // The idea is to use FRLDM model for beta=0 and using Lysekil // model to get the deformation energy G4double a; a = n + z; return eflmac_profi(a, z) + umass(z, n, beta) - umass(z, n, 0.0); } //********************************************************************** // * // * this function will calculate the liquid-drop nuclear mass for spheri // * configuration according to the preprint NUCLEAR GROUND-STATE // * MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. // * All constants are taken from this publication for consistency. // * // * Parameters: // * a: nuclear mass number // * z: nuclear charge // ********************************************************************** G4double G4Abla::eflmac_profi(G4double ia, G4double iz) { // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS. // SWITCH FOR PAIRING INCLUDED AS WELL. // BINDING = EFLMAC(IA,IZ,0,OPTSHP) // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C // A.J. 15.07.96 // this function will calculate the liquid-drop nuclear mass for spheri // configuration according to the preprint NUCLEAR GROUND-STATE // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p. // All constants are taken from this publication for consistency. // Parameters: // a: nuclear mass number // z: nuclear charge G4double eflmacResult = 0.0; G4int in = 0; G4double z = 0.0, n = 0.0, a = 0.0, av = 0.0, as = 0.0; G4double a0 = 0.0, c1 = 0.0, c4 = 0.0, b1 = 0.0, b3 = 0.0; G4double ff = 0.0, ca = 0.0, w = 0.0, efl = 0.0; G4double r0 = 0.0, kf = 0.0, ks = 0.0; G4double kv = 0.0, rp = 0.0, ay = 0.0, aden = 0.0, x0 = 0.0, y0 = 0.0; G4double esq = 0.0, ael = 0.0, i = 0.0; G4double pi = 3.141592653589793238e0; // fundamental constants // electronic charge squared esq = 1.4399764; // constants from considerations other than nucl. masses // electronic binding ael = 1.433e-5; // proton rms radius rp = 0.8; // nuclear radius constant r0 = 1.16; // range of yukawa-plus-expon. potential ay = 0.68; // range of yukawa function used to generate // nuclear charge distribution aden = 0.70; // wigner constant w = 30.0; // adjusted parameters // volume energy av = 16.00126; // volume asymmetry kv = 1.92240; // surface energy as = 21.18466; // surface asymmetry ks = 2.345; // a^0 constant a0 = 2.615; // charge asymmetry ca = 0.10289; z = G4double(iz); a = G4double(ia); in = ia - iz; n = G4double(in); c1 = 3.0 / 5.0 * esq / r0; c4 = 5.0 / 4.0 * std::pow((3.0 / (2.0 * pi)), (2.0 / 3.0)) * c1; kf = std::pow((9.0 * pi * z / (4.0 * a)), (1.0 / 3.0)) / r0; ff = -1.0 / 8.0 * rp * rp * esq / std::pow(r0, 3) * (145.0 / 48.0 - 327.0 / 2880.0 * std::pow(kf, 2) * std::pow(rp, 2) + 1527.0 / 1209600.0 * std::pow(kf, 4) * std::pow(rp, 4)); i = (n - z) / a; x0 = r0 * std::pow(a, (1.0 / 3.0)) / ay; y0 = r0 * std::pow(a, (1.0 / 3.0)) / aden; 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); b3 = 1.0 - 5.0 / std::pow(y0, 2) * (1.0 - 15.0 / (8.0 * y0) + 21.0 / (8.0 * std::pow(y0, 3)) - 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))) * std::exp(-2.0 * y0)); // now calculation of total binding energy 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 + 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)) + ff * std::pow(z, 2) / a - ca * (n - z) - ael * std::pow(z, (2.39e0)); efl = efl + w * utilabs(i); eflmacResult = efl; return eflmacResult; } // // // void G4Abla::unstable_nuclei(G4int AFP, G4int ZFP, G4int* AFPNEW, G4int* ZFPNEW, G4int& IOUNSTABLE, G4double VX, G4double VY, G4double VZ, G4double* VP1X, G4double* VP1Y, G4double* VP1Z, G4double BU_TAB_TEMP[indexpart][6], G4int* ILOOP) { // G4int INMIN, INMAX, NDIF = 0, IMEM; G4int NEVA = 0, PEVA = 0; G4double VP2X, VP2Y, VP2Z; *AFPNEW = AFP; *ZFPNEW = ZFP; IOUNSTABLE = 0; *ILOOP = 0; IMEM = 0; for (G4int i = 0; i < indexpart; i++) { BU_TAB_TEMP[i][0] = 0.0; BU_TAB_TEMP[i][1] = 0.0; BU_TAB_TEMP[i][2] = 0.0; BU_TAB_TEMP[i][3] = 0.0; BU_TAB_TEMP[i][4] = 0.0; // BU_TAB_TEMP[i][5] = 0.0; } *VP1X = 0.0; *VP1Y = 0.0; *VP1Z = 0.0; if (AFP == 0 && ZFP == 0) { // PRINT*,'UNSTABLE NUCLEI, AFP=0, ZFP=0' return; } if ((AFP == 1 && ZFP == 0) || (AFP == 1 && ZFP == 1) || (AFP == 2 && ZFP == 1) || (AFP == 3 && ZFP == 1) || (AFP == 3 && ZFP == 2) || (AFP == 4 && ZFP == 2) || (AFP == 6 && ZFP == 2) || (AFP == 8 && ZFP == 2)) { *VP1X = VX; *VP1Y = VY; *VP1Z = VZ; return; } if ((AFP - ZFP) == 0 && ZFP > 1) { for (G4int I = 0; I <= AFP - 2; I++) { unstable_tke(G4double(AFP - I), G4double(AFP - I), G4double(AFP - I - 1), G4double(AFP - I - 1), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } // PEVA = PEVA + ZFP - 1; AFP = 1; ZFP = 1; IOUNSTABLE = 1; } // //*** Find the limits nucleus is bound : isostab_lim(ZFP, &INMIN, &INMAX); NDIF = AFP - ZFP; if (NDIF < INMIN) { // Proton unbound IOUNSTABLE = 1; for (G4int I = 1; I <= 10; I++) { isostab_lim(ZFP - I, &INMIN, &INMAX); if (INMIN <= NDIF) { IMEM = I; ZFP = ZFP - I; AFP = ZFP + NDIF; PEVA = I; goto u10; } } // u10: for (G4int I = 0; I < IMEM; I++) { unstable_tke(G4double(NDIF + ZFP + IMEM - I), G4double(ZFP + IMEM - I), G4double(NDIF + ZFP + IMEM - I - 1), G4double(ZFP + IMEM - I - 1), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[I + 1 + *ILOOP][0] = 1.0; BU_TAB_TEMP[I + 1 + *ILOOP][1] = 1.0; BU_TAB_TEMP[I + 1 + *ILOOP][2] = VP2X; BU_TAB_TEMP[I + 1 + *ILOOP][3] = VP2Y; BU_TAB_TEMP[I + 1 + *ILOOP][4] = VP2Z; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } *ILOOP = *ILOOP + IMEM; } if (NDIF > INMAX) { // Neutron unbound NEVA = NDIF - INMAX; AFP = ZFP + INMAX; IOUNSTABLE = 1; for (G4int I = 0; I < NEVA; I++) { unstable_tke(G4double(ZFP + NDIF - I), G4double(ZFP), G4double(ZFP + NDIF - I - 1), G4double(ZFP), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } } if ((AFP >= 2) && (ZFP == 0)) { for (G4int I = 0; I <= AFP - 2; I++) { unstable_tke(G4double(AFP - I), G4double(ZFP), G4double(AFP - I - 1), G4double(ZFP), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } // NEVA = NEVA + (AFP - 1); AFP = 1; ZFP = 0; IOUNSTABLE = 1; } if (AFP < ZFP) { std::cout << "WARNING - BU UNSTABLE: AF < ZF" << std::endl; AFP = 0; ZFP = 0; IOUNSTABLE = 1; } if ((AFP >= 4) && (ZFP == 1)) { // Heavy residue is treated as 3H and the rest of mass is emitted as // neutrons: for (G4int I = 0; I < AFP - 3; I++) { unstable_tke(G4double(AFP - I), G4double(ZFP), G4double(AFP - I - 1), G4double(ZFP), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } // NEVA = NEVA + (AFP - 3); AFP = 3; ZFP = 1; IOUNSTABLE = 1; } if ((AFP == 4) && (ZFP == 3)) { // 4Li -> 3He + p -> AFP = 3; ZFP = 2; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(4.0, 3.0, 3.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 5) && (ZFP == 2)) { // 5He -> 4He + n -> AFP = 4; ZFP = 2; // NEVA = NEVA + 1; IOUNSTABLE = 1; unstable_tke(5.0, 2.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 5) && (ZFP == 3)) { // 5Li -> 4He + p AFP = 4; ZFP = 2; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(5.0, 3.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 6) && (ZFP == 4)) { // 6Be -> 4He + 2p (velocity in two steps: 6Be->5Li->4He) AFP = 4; ZFP = 2; // PEVA = PEVA + 2; IOUNSTABLE = 1; // 6Be -> 5Li + p unstable_tke(6.0, 4.0, 5.0, 3.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; // 5Li -> 4He + p unstable_tke(5.0, 3.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 7) && (ZFP == 2)) { // 7He -> 6He + n AFP = 6; ZFP = 2; // NEVA = NEVA + 1; IOUNSTABLE = 1; unstable_tke(7.0, 2.0, 6.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 7) && (ZFP == 5)) { // 7B -> 6Be + p -> 4He + 3p for (int I = 0; I <= AFP - 5; I++) { unstable_tke(double(AFP - I), double(ZFP - I), double(AFP - I - 1), double(ZFP - I - 1), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } AFP = 4; ZFP = 2; // PEVA = PEVA + 3; IOUNSTABLE = 1; } if ((AFP == 8) && (ZFP == 4)) { // 8Be -> 4He + 4He AFP = 4; ZFP = 2; IOUNSTABLE = 1; unstable_tke(8.0, 4.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 2.0; BU_TAB_TEMP[*ILOOP][1] = 4.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; } if ((AFP == 8) && (ZFP == 6)) { // 8C -> 2p + 6Be AFP = 6; ZFP = 4; // PEVA = PEVA + 2; IOUNSTABLE = 1; unstable_tke(8.0, 6.0, 7.0, 5.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; unstable_tke(7.0, 5.0, 6.0, 4.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 9) && (ZFP == 2)) { // 9He -> 8He + n AFP = 8; ZFP = 2; // NEVA = NEVA + 1; IOUNSTABLE = 1; unstable_tke(9.0, 2.0, 8.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 9) && (ZFP == 5)) { // 9B -> 4He + 4He + p -> AFP = 4; ZFP = 2; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(9.0, 5.0, 8.0, 4.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; unstable_tke(8.0, 4.0, 4.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 2.0; BU_TAB_TEMP[*ILOOP][1] = 4.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 10) && (ZFP == 2)) { // 10He -> 8He + 2n AFP = 8; ZFP = 2; // NEVA = NEVA + 2; IOUNSTABLE = 1; // 10He -> 9He + n unstable_tke(10.0, 2.0, 9.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; // 9He -> 8He + n unstable_tke(9.0, 2.0, 8.0, 2.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 10) && (ZFP == 3)) { // 10Li -> 9Li + n -> AFP = 9; ZFP = 3; // NEVA = NEVA + 1; IOUNSTABLE = 1; unstable_tke(10.0, 3.0, 9.0, 3.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 10) && (ZFP == 7)) { // 10N -> 9C + p -> AFP = 9; ZFP = 6; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(10.0, 7.0, 9.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 11) && (ZFP == 7)) { // 11N -> 10C + p -> AFP = 10; ZFP = 6; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(11.0, 7.0, 10.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 12) && (ZFP == 8)) { // 12O -> 10C + 2p -> AFP = 10; ZFP = 6; // PEVA = PEVA + 2; IOUNSTABLE = 1; unstable_tke(12.0, 8.0, 11.0, 7.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; unstable_tke(11.0, 7.0, 10.0, 6.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 15) && (ZFP == 9)) { // 15F -> 14O + p -> AFP = 14; ZFP = 8; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(15.0, 9.0, 14.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 16) && (ZFP == 9)) { // 16F -> 15O + p -> AFP = 15; ZFP = 8; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(16.0, 9.0, 15.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 16) && (ZFP == 10)) { // 16Ne -> 14O + 2p -> AFP = 14; ZFP = 8; // PEVA = PEVA + 2; IOUNSTABLE = 1; unstable_tke(16.0, 10.0, 15.0, 9.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; unstable_tke(15.0, 9.0, 14.0, 8.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 18) && (ZFP == 11)) { // 18Na -> 17Ne + p -> AFP = 17; ZFP = 10; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(18.0, 11.0, 17.0, 10.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if ((AFP == 19) && (ZFP == 11)) { // 19Na -> 18Ne + p -> AFP = 18; ZFP = 10; // PEVA = PEVA + 1; IOUNSTABLE = 1; unstable_tke(19.0, 11.0, 18.0, 10.0, VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } if (ZFP >= 4 && (AFP - ZFP) == 1) { // Heavy residue is treated as 3He NEVA = AFP - 3; PEVA = ZFP - 2; for (G4int I = 0; I < NEVA; I++) { unstable_tke(G4double(AFP - I), G4double(ZFP), G4double(AFP - I - 1), G4double(ZFP), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 0.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } for (G4int I = 0; I < PEVA; I++) { unstable_tke(G4double(AFP - NEVA - I), G4double(ZFP - I), G4double(AFP - NEVA - I - 1), G4double(ZFP - I - 1), VX, VY, VZ, &(*VP1X), &(*VP1Y), &(*VP1Z), &VP2X, &VP2Y, &VP2Z); BU_TAB_TEMP[*ILOOP][0] = 1.0; BU_TAB_TEMP[*ILOOP][1] = 1.0; BU_TAB_TEMP[*ILOOP][2] = VP2X; BU_TAB_TEMP[*ILOOP][3] = VP2Y; BU_TAB_TEMP[*ILOOP][4] = VP2Z; *ILOOP = *ILOOP + 1; VX = *VP1X; VY = *VP1Y; VZ = *VP1Z; } AFP = 3; ZFP = 2; IOUNSTABLE = 1; } // *AFPNEW = AFP; *ZFPNEW = ZFP; return; } // // void G4Abla::unstable_tke(G4double ain, G4double zin, G4double anew, G4double znew, G4double vxin, G4double vyin, G4double vzin, G4double* v1x, G4double* v1y, G4double* v1z, G4double* v2x, G4double* v2y, G4double* v2z) { // G4double EKIN_P1 = 0., ekin_tot = 0.; G4double PX1, PX2, PY1, PY2, PZ1, PZ2, PTOT; G4double RNDT, CTET1, STET1, RNDP, PHI1, ETOT_P1, ETOT_P2; G4double MASS, MASS1, MASS2; G4double vxout = 0., vyout = 0., vzout = 0.; G4int iain, izin, ianew, iznew, inin, innew; // G4double C = 29.97924580; // cm/ns G4double AMU = 931.4940; // MeV/C^2 // iain = idnint(ain); izin = idnint(zin); inin = iain - izin; ianew = idnint(anew); iznew = idnint(znew); innew = ianew - iznew; // if (ain == 0) return; // if (izin > 12) { mglms(ain, zin, 3, &MASS); mglms(anew, znew, 3, &MASS1); mglms(ain - anew, zin - znew, 3, &MASS2); ekin_tot = MASS - MASS1 - MASS2; } else { // ekin_tot = // MEXP(ININ,IZIN)-(MEXP(INNEW,IZNEW)+MEXP(ININ-INNEW,IZIN-IZNEW)); ekin_tot = masses->massexp[inin][izin] - (masses->massexp[innew][iznew] + masses->massexp[inin - innew][izin - iznew]); if (izin > 12) std::cout << "*** ZIN > 12 ***" << izin << std::endl; } if (ekin_tot < 0.00) { // if( iain.ne.izin .and. izin.ne.0 ){ // print *,"Negative Q-value in UNSTABLE_TKE" // print *,"ekin_tot=",ekin_tot // print *,"ain,zin=",ain,zin,MEXP(ININ,IZIN) // print *,"anew,znew=",anew,znew,MEXP(INNEW,IZNEW) // print * // } ekin_tot = 0.0; } // EKIN_P1 = ekin_tot * (ain - anew) / ain; ETOT_P1 = EKIN_P1 + anew * AMU; PTOT = anew * AMU * std::sqrt((EKIN_P1 / (anew * AMU) + 1.0) * (EKIN_P1 / (anew * AMU) + 1.0) - 1.0); // MeV/C // RNDT = G4AblaRandom::flat(); CTET1 = 2.0 * RNDT - 1.0; STET1 = std::sqrt(1.0 - CTET1 * CTET1); RNDP = G4AblaRandom::flat(); PHI1 = RNDP * 2.0 * 3.141592654; PX1 = PTOT * STET1 * std::cos(PHI1); PY1 = PTOT * STET1 * std::sin(PHI1); PZ1 = PTOT * CTET1; *v1x = C * PX1 / ETOT_P1; *v1y = C * PY1 / ETOT_P1; *v1z = C * PZ1 / ETOT_P1; lorentz_boost(vxin, vyin, vzin, *v1x, *v1y, *v1z, &vxout, &vyout, &vzout); *v1x = vxout; *v1y = vyout; *v1z = vzout; // PX2 = -PX1; PY2 = -PY1; PZ2 = -PZ1; ETOT_P2 = (ekin_tot - EKIN_P1) + (ain - anew) * AMU; *v2x = C * PX2 / ETOT_P2; *v2y = C * PY2 / ETOT_P2; *v2z = C * PZ2 / ETOT_P2; lorentz_boost(vxin, vyin, vzin, *v2x, *v2y, *v2z, &vxout, &vyout, &vzout); *v2x = vxout; *v2y = vyout; *v2z = vzout; // return; } // //************************************************************************** // void G4Abla::lorentz_boost(G4double VXRIN, G4double VYRIN, G4double VZRIN, G4double VXIN, G4double VYIN, G4double VZIN, G4double* VXOUT, G4double* VYOUT, G4double* VZOUT) { // // Calculate velocities of a given fragment from frame 1 into frame 2. // Frame 1 is moving with velocity v=(vxr,vyr,vzr) relative to frame 2. // Velocity of the fragment in frame 1 -> vxin,vyin,vzin // Velocity of the fragment in frame 2 -> vxout,vyout,vzout // G4double VXR, VYR, VZR; G4double GAMMA, VR, C, CC, DENO, VXNOM, VYNOM, VZNOM; // C = 29.9792458; // cm/ns CC = C * C; // // VXR,VYR,VZR are velocities of frame 1 relative to frame 2; to go from 1 to // 2 we need to multiply them by -1 VXR = -1.0 * VXRIN; VYR = -1.0 * VYRIN; VZR = -1.0 * VZRIN; // VR = std::sqrt(VXR * VXR + VYR * VYR + VZR * VZR); if (VR < 1e-9) { *VXOUT = VXIN; *VYOUT = VYIN; *VZOUT = VZIN; return; } GAMMA = 1.0 / std::sqrt(1.0 - VR * VR / CC); DENO = 1.0 - VXR * VXIN / CC - VYR * VYIN / CC - VZR * VZIN / CC; // X component VXNOM = -GAMMA * VXR + (1.0 + (GAMMA - 1.0) * VXR * VXR / (VR * VR)) * VXIN + (GAMMA - 1.0) * VXR * VYR / (VR * VR) * VYIN + (GAMMA - 1.0) * VXR * VZR / (VR * VR) * VZIN; *VXOUT = VXNOM / (GAMMA * DENO); // Y component VYNOM = -GAMMA * VYR + (1.0 + (GAMMA - 1.0) * VYR * VYR / (VR * VR)) * VYIN + (GAMMA - 1.0) * VXR * VYR / (VR * VR) * VXIN + (GAMMA - 1.0) * VYR * VZR / (VR * VR) * VZIN; *VYOUT = VYNOM / (GAMMA * DENO); // Z component VZNOM = -GAMMA * VZR + (1.0 + (GAMMA - 1.0) * VZR * VZR / (VR * VR)) * VZIN + (GAMMA - 1.0) * VXR * VZR / (VR * VR) * VXIN + (GAMMA - 1.0) * VYR * VZR / (VR * VR) * VYIN; *VZOUT = VZNOM / (GAMMA * DENO); return; } void G4Abla::fission(G4double AF, G4double ZF, G4double EE, G4double JPRF, G4double* VX1_FISSION_par, G4double* VY1_FISSION_par, G4double* VZ1_FISSION_par, G4double* VX2_FISSION_par, G4double* VY2_FISSION_par, G4double* VZ2_FISSION_par, G4int* ZFP1, G4int* AFP1, G4int* SFP1, G4int* ZFP2, G4int* AFP2, G4int* SFP2, G4int* imode_par, G4double* VX_EVA_SC_par, G4double* VY_EVA_SC_par, G4double* VZ_EVA_SC_par, G4double EV_TEMP[indexpart][6], G4int* IEV_TAB_FIS_par, G4int* NbLam0_par) { /// G4double EFF1 = 0., EFF2 = 0., VFF1 = 0., VFF2 = 0., AF1 = 0., ZF1 = 0., AF2 = 0., ZF2 = 0., AFF1 = 0., ZFF1 = 0., AFF2 = 0., ZFF2 = 0., vz1_eva = 0., vx1_eva = 0., vy1_eva = 0., vz2_eva = 0., vx2_eva = 0., vy2_eva = 0., vx_eva_sc = 0., vy_eva_sc = 0., vz_eva_sc = 0., VXOUT = 0., VYOUT = 0., VZOUT = 0., VX2OUT = 0., VY2OUT = 0., VZ2OUT = 0.; G4int IEV_TAB_FIS = 0, IEV_TAB_TEMP = 0; G4double EV_TEMP1[indexpart][6], EV_TEMP2[indexpart][6], mtota = 0.; G4int inttype = 0, inum = 0; IEV_TAB_SSC = 0; (*imode_par) = 0; G4int NbLam0 = (*NbLam0_par); for (G4int I1 = 0; I1 < indexpart; I1++) for (G4int I2 = 0; I2 < 6; I2++) { EV_TEMP[I1][I2] = 0.0; EV_TEMP1[I1][I2] = 0.0; EV_TEMP2[I1][I2] = 0.0; } G4double et = EE - JPRF * JPRF * 197. * 197. / (2. * 0.4 * 931. * std::pow(AF, 5.0 / 3.0) * 1.16 * 1.16); fissionDistri(AF, ZF, et, AF1, ZF1, EFF1, VFF1, AF2, ZF2, EFF2, VFF2, vx_eva_sc, vy_eva_sc, vz_eva_sc, &NbLam0); // Lambda particles G4int NbLam1 = 0; G4int NbLam2 = 0; G4double pbH = (AF1 - ZF1) / (AF1 - ZF1 + AF2 - ZF2); for (G4int i = 0; i < NbLam0; i++) { if (G4AblaRandom::flat() < pbH) { NbLam1++; } else { NbLam2++; } } // Copy of the evaporated particles from saddle to scission for (G4int IJ = 0; IJ < IEV_TAB_SSC; IJ++) { EV_TEMP[IJ][0] = EV_TAB_SSC[IJ][0]; EV_TEMP[IJ][1] = EV_TAB_SSC[IJ][1]; EV_TEMP[IJ][2] = EV_TAB_SSC[IJ][2]; EV_TEMP[IJ][3] = EV_TAB_SSC[IJ][3]; EV_TEMP[IJ][4] = EV_TAB_SSC[IJ][4]; EV_TEMP[IJ][5] = EV_TAB_SSC[IJ][5]; } IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_SSC; // Velocities G4double VZ1_FISSION = (2.0 * G4AblaRandom::flat() - 1.0) * VFF1; G4double VPERP1 = std::sqrt(VFF1 * VFF1 - VZ1_FISSION * VZ1_FISSION); G4double ALPHA1 = G4AblaRandom::flat() * 2. * 3.142; G4double VX1_FISSION = VPERP1 * std::sin(ALPHA1); G4double VY1_FISSION = VPERP1 * std::cos(ALPHA1); G4double VX2_FISSION = -VX1_FISSION / VFF1 * VFF2; G4double VY2_FISSION = -VY1_FISSION / VFF1 * VFF2; G4double VZ2_FISSION = -VZ1_FISSION / VFF1 * VFF2; // // Fission fragment 1 if ((ZF1 <= 0.0) || (AF1 <= 0.0) || (AF1 < ZF1)) { std::cout << "F1 unphysical: " << ZF << " " << AF << " " << EE << " " << ZF1 << " " << AF1 << std::endl; } else { // fission and IMF emission are not allowed opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed gammaemission = 1; G4int FF11 = 0, FIMF11 = 0; G4double ZIMFF1 = 0., AIMFF1 = 0., TKEIMF1 = 0., JPRFOUT = 0.; // evapora(ZF1, AF1, &EFF1, 0., &ZFF1, &AFF1, &mtota, &vz1_eva, &vx1_eva, &vy1_eva, &FF11, &FIMF11, &ZIMFF1, &AIMFF1, &TKEIMF1, &JPRFOUT, &inttype, &inum, EV_TEMP1, &IEV_TAB_TEMP, &NbLam1); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TEMP[IJ + IEV_TAB_FIS][0] = EV_TEMP1[IJ][0]; EV_TEMP[IJ + IEV_TAB_FIS][1] = EV_TEMP1[IJ][1]; // Lorentz kinematics // EV_TEMP(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TEMP(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TEMP(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost(VX1_FISSION, VY1_FISSION, VZ1_FISSION, EV_TEMP1[IJ][2], EV_TEMP1[IJ][3], EV_TEMP1[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TEMP[IJ + IEV_TAB_FIS][2] = VX2OUT; EV_TEMP[IJ + IEV_TAB_FIS][3] = VY2OUT; EV_TEMP[IJ + IEV_TAB_FIS][4] = VZ2OUT; // } IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_TEMP; } // // Fission fragment 2 if ((ZF2 <= 0.0) || (AF2 <= 0.0) || (AF2 < ZF2)) { std::cout << "F2 unphysical: " << ZF << " " << AF << " " << EE << " " << ZF2 << " " << AF2 << std::endl; } else { // fission and IMF emission are not allowed opt->optimfallowed = 0; // IMF is not allowed fiss->ifis = 0; // fission is not allowed gammaemission = 1; G4int FF22 = 0, FIMF22 = 0; G4double ZIMFF2 = 0., AIMFF2 = 0., TKEIMF2 = 0., JPRFOUT = 0.; // evapora(ZF2, AF2, &EFF2, 0., &ZFF2, &AFF2, &mtota, &vz2_eva, &vx2_eva, &vy2_eva, &FF22, &FIMF22, &ZIMFF2, &AIMFF2, &TKEIMF2, &JPRFOUT, &inttype, &inum, EV_TEMP2, &IEV_TAB_TEMP, &NbLam2); for (G4int IJ = 0; IJ < IEV_TAB_TEMP; IJ++) { EV_TEMP[IJ + IEV_TAB_FIS][0] = EV_TEMP2[IJ][0]; EV_TEMP[IJ + IEV_TAB_FIS][1] = EV_TEMP2[IJ][1]; // Lorentz kinematics // EV_TEMP(IJ+IEV_TAB,3) = EV_TEMP(IJ,3) + VX_PREF // EV_TEMP(IJ+IEV_TAB,4) = EV_TEMP(IJ,4) + VY_PREF // EV_TEMP(IJ+IEV_TAB,5) = EV_TEMP(IJ,5) + VZ_PREF // Lorentz transformation lorentz_boost(VX2_FISSION, VY2_FISSION, VZ2_FISSION, EV_TEMP2[IJ][2], EV_TEMP2[IJ][3], EV_TEMP2[IJ][4], &VXOUT, &VYOUT, &VZOUT); lorentz_boost(vx_eva_sc, vy_eva_sc, vz_eva_sc, VXOUT, VYOUT, VZOUT, &VX2OUT, &VY2OUT, &VZ2OUT); EV_TEMP[IJ + IEV_TAB_FIS][2] = VX2OUT; EV_TEMP[IJ + IEV_TAB_FIS][3] = VY2OUT; EV_TEMP[IJ + IEV_TAB_FIS][4] = VZ2OUT; // } IEV_TAB_FIS = IEV_TAB_FIS + IEV_TAB_TEMP; } // // Lorentz kinematics // vx1_fission = vx1_fission + vx1_eva // vy1_fission = vy1_fission + vy1_eva // vz1_fission = vz1_fission + vz1_eva // vx2_fission = vx2_fission + vx2_eva // vy2_fission = vy2_fission + vy2_eva // vz2_fission = vz2_fission + vz2_eva // The v_eva_sc contribution is considered in the calling subroutine // Lorentz transformations lorentz_boost(vx1_eva, vy1_eva, vz1_eva, VX1_FISSION, VY1_FISSION, VZ1_FISSION, &VXOUT, &VYOUT, &VZOUT); VX1_FISSION = VXOUT; VY1_FISSION = VYOUT; VZ1_FISSION = VZOUT; lorentz_boost(vx2_eva, vy2_eva, vz2_eva, VX2_FISSION, VY2_FISSION, VZ2_FISSION, &VXOUT, &VYOUT, &VZOUT); VX2_FISSION = VXOUT; VY2_FISSION = VYOUT; VZ2_FISSION = VZOUT; // (*ZFP1) = idnint(ZFF1); (*AFP1) = idnint(AFF1); (*SFP1) = NbLam1; (*VX1_FISSION_par) = VX1_FISSION; (*VY1_FISSION_par) = VY1_FISSION; (*VZ1_FISSION_par) = VZ1_FISSION; (*VX_EVA_SC_par) = vx_eva_sc; (*VY_EVA_SC_par) = vy_eva_sc; (*VZ_EVA_SC_par) = vz_eva_sc; (*ZFP2) = idnint(ZFF2); (*AFP2) = idnint(AFF2); (*SFP2) = NbLam2; (*VX2_FISSION_par) = VX2_FISSION; (*VY2_FISSION_par) = VY2_FISSION; (*VZ2_FISSION_par) = VZ2_FISSION; (*IEV_TAB_FIS_par) = IEV_TAB_FIS; (*NbLam0_par) = NbLam1 + NbLam2; if (NbLam0 > (NbLam1 + NbLam2)) varntp->kfis = 25; return; } //************************************************************************* // void G4Abla::tke_bu(G4double Z, G4double A, G4double ZALL, G4double AAL, G4double* VX, G4double* VY, G4double* VZ) { G4double V_over_V0, R0, RALL, RHAZ, R, TKE, Ekin, V, VPERP, ALPHA1; V_over_V0 = 6.0; R0 = 1.16; if (Z < 1.0) { *VX = 0.0; *VY = 0.0; *VZ = 0.0; return; } RALL = R0 * std::pow(V_over_V0, 1.0 / 3.0) * std::pow(AAL, 1.0 / 3.0); RHAZ = G4double(haz(1)); R = std::pow(RHAZ, 1.0 / 3.0) * RALL; TKE = 1.44 * Z * ZALL * R * R * (1.0 - A / AAL) * (1.0 - A / AAL) / std::pow(RALL, 3.0); Ekin = TKE * (AAL - A) / AAL; // print*,'!!!',IDNINT(AAl),IDNINT(A),IDNINT(ZALL),IDNINT(Z) V = std::sqrt(Ekin / A) * 1.3887; *VZ = (2.0 * G4double(haz(1)) - 1.0) * V; VPERP = std::sqrt(V * V - (*VZ) * (*VZ)); ALPHA1 = G4double(haz(1)) * 2.0 * 3.142; *VX = VPERP * std::sin(ALPHA1); *VY = VPERP * std::cos(ALPHA1); return; } G4double G4Abla::haz(G4int k) { // const G4int pSize = 110; // static G4ThreadLocal G4double p[pSize]; static G4ThreadLocal G4int ix = 0; static G4ThreadLocal G4double x = 0.0, y = 0.0; // k =< -1 on initialise // k = -1 c'est reproductible // k < -1 || k > -1 ce n'est pas reproductible /* // Zero is invalid random seed. Set proper value from our random seed collection: if(ix == 0) { // ix = hazard->ial; } */ if (k <= -1) { // then if (k == -1) { // then ix = 0; } else { x = 0.0; y = secnds(G4int(x)); ix = G4int(y * 100 + 43543000); if (mod(ix, 2) == 0) { ix = ix + 1; } } } return G4AblaRandom::flat(); } // Random generator according to the // powerfunction y = x**(lambda) in the range from xmin to xmax // xmin, xmax and y are integers. // lambda must be different from -1 ! G4int G4Abla::IPOWERLIMHAZ(G4double lambda, G4int xmin, G4int xmax) { G4double y, l_plus, rxmin, rxmax; l_plus = lambda + 1.; rxmin = G4double(xmin) - 0.5; rxmax = G4double(xmax) + 0.5; // y=(HAZ(k)*(rxmax**l_plus-rxmin**l_plus)+ // rxmin**l_plus)**(1.E0/l_plus) y = std::pow(G4AblaRandom::flat() * (std::pow(rxmax, l_plus) - std::pow(rxmin, l_plus)) + std::pow(rxmin, l_plus), 1.0 / l_plus); return nint(y); } void G4Abla::AMOMENT(G4double AABRA, G4double APRF, G4int IMULTIFR, G4double* PX, G4double* PY, G4double* PZ) { G4int ISIGOPT = 0; G4double GOLDHA_BU = 0., GOLDHA = 0.; G4double PI = 3.141592653589793; // nu = 1.d0 // G4double BETAP = sqrt(1.0 - 1.0/sqrt(1.0+EAP/931.494)); // G4double GAMMAP = 1.0 / sqrt(1. - BETAP*BETAP); // G4double FACT_PROJ = (GAMMAP + 1.) / (BETAP * GAMMAP); // G4double R = 1.160 * pow(APRF,1.0/3.0); // G4double RNDT = double(haz(1)); // G4double CTET = 2.0*RNDT-1.0; // G4double TETA = acos(CTET); // G4double RNDP = double(haz(1)); // G4double PHI = RNDP*2.0*PI; // G4double STET = sqrt(1.0-CTET*CTET); // RX = R * STET * DCOS(PHI) // RY = R * STET * DSIN(PHI) // RZ = R * CTET // G4double RZ = 0.0; // G4double RY = R * sin(PHI); // G4double RX = R * cos(PHI); // In MeV/C G4double V0_over_VBU = 1.0 / 6.0; G4double SIGMA_0 = 118.50; G4double Efermi = 5.0 * SIGMA_0 * SIGMA_0 / (2.0 * 931.4940); if (IMULTIFR == 1) { if (ISIGOPT == 0) { // "Fermi model" picture: // Influence of expansion: SIGMA_0 = SIGMA_0 * std::pow(V0_over_VBU, 1.0 / 3.0); // To take into account the influence of thermal motion of nucleons (see // W. Bauer, PRC 51 (1995) 803) // Efermi = 5.D0 * SIGMA_0 * SIGMA_0 / (2.D0 * 931.49D0) GOLDHA_BU = SIGMA_0 * std::sqrt((APRF * (AABRA - APRF)) / (AABRA - 1.0)); GOLDHA = GOLDHA_BU * std::sqrt(1.0 + 5.0 * PI * PI / 12.0 * (T_freeze_out / Efermi) * (T_freeze_out / Efermi)); // PRINT*,'AFTER BU fermi:',IDNINT(AABRA),IDNINT(APRF),GOLDHA, // & GOLDHA_BU } else { // Thermal equilibrium picture (<=> to Boltzmann distribution in momentum // with sigma2=M*T) The factor (AABRA-APRF)/AP comes from momentum // conservation: GOLDHA_BU = std::sqrt(APRF * T_freeze_out * 931.494 * (AABRA - APRF) / AABRA); GOLDHA = GOLDHA_BU; // PRINT*,'AFTER BU therm:',IDNINT(AABRA),IDNINT(APRF),GOLDHA, // & GOLDHA_BU } } else { GOLDHA = SIGMA_0 * std::sqrt((APRF * (AABRA - APRF)) / (AABRA - 1.0)); } G4int IS = 0; mom123: *PX = G4double(gausshaz(1, 0.0, GOLDHA)); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING PX IN Rn07.FOR. A VALUE WILL BE FORCED." << std::endl; *PX = (AABRA - 1.0) * 931.4940; } if (std::abs(*PX) >= AABRA * 931.494) { // PRINT*,'VX > C',PX,IDNINT(APRF) goto mom123; } IS = 0; mom456: *PY = G4double(gausshaz(1, 0.0, GOLDHA)); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING PY IN Rn07.FOR. A VALUE WILL BE FORCED." << std::endl; *PY = (AABRA - 1.0) * 931.4940; } if (std::abs(*PY) >= AABRA * 931.494) { // PRINT*,'VX > C',PX,IDNINT(APRF) goto mom456; } IS = 0; mom789: *PZ = G4double(gausshaz(1, 0.0, GOLDHA)); IS = IS + 1; if (IS > 100) { std::cout << "WARNING: GAUSSHAZ CALLED MORE THAN 100 TIMES WHEN " "CALCULATING PZ IN Rn07.FOR. A VALUE WILL BE FORCED." << std::endl; *PZ = (AABRA - 1.0) * 931.4940; } if (std::abs(*PZ) >= AABRA * 931.494) { // PRINT*,'VX > C',PX,IDNINT(APRF) goto mom789; } return; } G4double G4Abla::gausshaz(G4int k, G4double xmoy, G4double sig) { // Gaussian random numbers: // 1005 C*** TIRAGE ALEATOIRE DANS UNE GAUSSIENNE DE LARGEUR SIG ET // MOYENNE XMOY static G4ThreadLocal G4int iset = 0; static G4ThreadLocal G4double v1, v2, r, fac, gset, fgausshaz; if (iset == 0) { // then do { v1 = 2.0 * haz(k) - 1.0; v2 = 2.0 * haz(k) - 1.0; r = std::pow(v1, 2) + std::pow(v2, 2); } while (r >= 1); fac = std::sqrt(-2. * std::log(r) / r); gset = v1 * fac; fgausshaz = v2 * fac * sig + xmoy; iset = 1; } else { fgausshaz = gset * sig + xmoy; iset = 0; } return fgausshaz; }