Import Geant4 11.4.0 source tree
This commit is contained in:
@@ -6,6 +6,9 @@ It must **not** be used as a substitute for writing good git commit messages!
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
## 2025-08-03 Jose Luis Rodriguez Sanchez (hadr-abla-V11-03-00)
|
||||
- Added a new description for fission barriers based on PRC 111, 064606 (2025).
|
||||
|
||||
## 2024-09-02 Gabriele Cosmo (hadr-abla-V11-02-06)
|
||||
- Fixed reported Coverity defects for uninitialised data in G4Abla.
|
||||
|
||||
|
||||
@@ -33,516 +33,482 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "globals.hh"
|
||||
#include <memory>
|
||||
|
||||
#include "G4AblaDataDefs.hh"
|
||||
#include "G4AblaRandom.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
#include <memory>
|
||||
|
||||
/**
|
||||
* Class containing ABLA++ de-excitation code.
|
||||
*/
|
||||
|
||||
class G4Abla {
|
||||
|
||||
public:
|
||||
/**
|
||||
* This constructor is used by standalone test driver and the Geant4
|
||||
* interface.
|
||||
*
|
||||
* @param aHazard random seeds
|
||||
* @param aVolant data structure for ABLA output
|
||||
* @param aVarNtp data structure for transfering ABLA output to Geant4
|
||||
* interface
|
||||
*/
|
||||
G4Abla(G4VarNtp *aVarntp);
|
||||
|
||||
/**
|
||||
* Basic destructor.
|
||||
*/
|
||||
~G4Abla() = default;
|
||||
|
||||
/// \brief Dummy copy constructor
|
||||
G4Abla(G4Abla const &other);
|
||||
|
||||
/// \brief Dummy assignment operator
|
||||
G4Abla &operator=(G4Abla const &other);
|
||||
|
||||
/**
|
||||
* Set verbosity level.
|
||||
*/
|
||||
void setVerboseLevel(G4int level);
|
||||
|
||||
/**
|
||||
* Main interface to the de-excitation code.
|
||||
*
|
||||
* @param nucleusA mass number of the nucleus
|
||||
* @param nucleusZ charge number of the nucleus
|
||||
* @param excitationEnergy excitation energy of the nucleus
|
||||
* @param angularMomentum angular momentum of the nucleus (produced as output
|
||||
* by INCL4)
|
||||
* @param momX momentum x-component
|
||||
* @param momY momentum y-component
|
||||
* @param momZ momentum z-component
|
||||
* @param eventnumber number of the event
|
||||
*/
|
||||
void DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ,
|
||||
G4double excitationEnergy, G4double angularMomentum,
|
||||
G4double momX, G4double momY, G4double momZ,
|
||||
G4int eventnumber);
|
||||
|
||||
/**
|
||||
* Main interface to the de-excitation code for hyper-nuclei.
|
||||
*
|
||||
* @param nucleusA mass number of the nucleus
|
||||
* @param nucleusZ charge number of the nucleus
|
||||
* @param excitationEnergy excitation energy of the nucleus
|
||||
* @param angularMomentum angular momentum of the nucleus (produced as output
|
||||
* by INCL)
|
||||
* @param momX momentum x-component
|
||||
* @param momY momentum y-component
|
||||
* @param momZ momentum z-component
|
||||
* @param eventnumber number of the event
|
||||
* @param nucleusS is the strange number
|
||||
*/
|
||||
void DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ,
|
||||
G4double excitationEnergy, G4double angularMomentum,
|
||||
G4double momX, G4double momY, G4double momZ,
|
||||
G4int eventnumber, G4int nucleusS);
|
||||
|
||||
// Evaporation
|
||||
public:
|
||||
/**
|
||||
* Initialize ABLA evaporation code.
|
||||
*
|
||||
*/
|
||||
void initEvapora();
|
||||
|
||||
/**
|
||||
* Initialize ABLA parameters.
|
||||
*
|
||||
*/
|
||||
void SetParameters();
|
||||
void SetParametersG4(G4int z, G4int a);
|
||||
|
||||
/**
|
||||
* Coefficient of collective enhancement including damping
|
||||
* Input: z,a,bet,sig,u
|
||||
* Output: qr - collective enhancement factor
|
||||
* See junghans et al., nucl. phys. a 629 (1998) 635
|
||||
* @param z charge number
|
||||
* @param a mass number
|
||||
* @param bet beta deformation
|
||||
* @param sig perpendicular spin cut-off factor
|
||||
* @param u Energy
|
||||
* @return Coefficient of collective enhancement
|
||||
*/
|
||||
void qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u,
|
||||
G4double *qr);
|
||||
|
||||
/**
|
||||
* Model de la goutte liquide de c. f. weizsacker.
|
||||
* usually an obsolete option
|
||||
*/
|
||||
void mglw(G4double a, G4double z, G4double *el);
|
||||
|
||||
/**
|
||||
* Mglms
|
||||
*/
|
||||
void mglms(G4double a, G4double z, G4int refopt4, G4double *el);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
G4double spdef(G4int a, G4int z, G4int optxfis);
|
||||
|
||||
/**
|
||||
* Calculation of fissility parameter
|
||||
*/
|
||||
G4double fissility(G4int a, G4int z, G4int ny, G4double sn, G4double slam,
|
||||
G4int optxfis);
|
||||
|
||||
/**
|
||||
* Main evaporation routine.
|
||||
*/
|
||||
void evapora(G4double zprf, G4double aprf, G4double *ee_par, G4double jprf,
|
||||
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);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission probabilities.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of fission and the particle emission probabilities after
|
||||
* fission.
|
||||
*/
|
||||
void fission(G4double AF, G4double ZF, G4double EE, G4double JPRF,
|
||||
G4double *VX1_FISSION, G4double *VY1_FISSION,
|
||||
G4double *VZ1_FISSION, G4double *VX2_FISSION,
|
||||
G4double *VY2_FISSION, G4double *VZ2_FISSION, G4int *ZFP1,
|
||||
G4int *AFP1, G4int *SFP1, G4int *ZFP2, G4int *AFP2, G4int *SFP2,
|
||||
G4int *imode, G4double *VX_EVA_SC, G4double *VY_EVA_SC,
|
||||
G4double *VZ_EVA_SC, G4double EV_TEMP[indexpart][6],
|
||||
G4int *IEV_TAB_FIS, G4int *NbLam0);
|
||||
|
||||
/**
|
||||
* Calculation of lorentz's boost
|
||||
*/
|
||||
void lorentz_boost(G4double VXRIN, G4double VYRIN, G4double VZRIN,
|
||||
G4double VXIN, G4double VYIN, G4double VZIN,
|
||||
G4double *VXOUT, G4double *VYOUT, G4double *VZOUT);
|
||||
|
||||
/**
|
||||
* Calculation of unstable nuclei
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of unstable nuclei tke
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of tke for breakup fragments
|
||||
*/
|
||||
void tke_bu(G4double Z, G4double A, G4double ZALL, G4double AAL, G4double *VX,
|
||||
G4double *VY, G4double *VZ);
|
||||
|
||||
/**
|
||||
* Calculation of the angular momentum of breakup fragments
|
||||
* according to Goldhaber model
|
||||
*/
|
||||
void AMOMENT(G4double AABRA, G4double APRF, G4int IMULTIFR, G4double *PX,
|
||||
G4double *PY, G4double *PZ);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission barriers.
|
||||
*/
|
||||
void barrs(G4int Z1, G4int A1, G4int Z2, G4int A2, G4double *sBARR,
|
||||
G4double *sOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission between the saddle and scission point.
|
||||
*/
|
||||
void evap_postsaddle(G4double A, G4double Z, G4double E_scission_pre,
|
||||
G4double *E_scission_post, G4double *A_scission,
|
||||
G4double *Z_scission, G4double &vx_eva, G4double &vy_eva,
|
||||
G4double &vz_eva, G4int *NbLam0_par);
|
||||
|
||||
/**
|
||||
* Calculation of imfs.
|
||||
*/
|
||||
void imf(G4double ACN, G4double ZCN, G4double TEMP, G4double EE,
|
||||
G4double *ZIMF, G4double *AIMF, G4double *BIMF, G4double *SBIMF,
|
||||
G4double *TIMF, G4double JPRF);
|
||||
|
||||
/**
|
||||
* Calculation of omega at saddle point.
|
||||
*/
|
||||
void fomega_sp(G4double AF, G4double Y, G4double *MFCD, G4double *sOMEGA,
|
||||
G4double *sHOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of omega at ground state.
|
||||
*/
|
||||
void fomega_gs(G4double AF, G4double ZF, G4double *K1, G4double *sOMEGA,
|
||||
G4double *sHOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of tunnelling effect in fission.
|
||||
*/
|
||||
G4double tunnelling(G4double A, G4double ZPRF, G4double Y, G4double EE,
|
||||
G4double EF, G4double TEMP, G4double DENSG,
|
||||
G4double DENSF, G4double ENH_FACT);
|
||||
|
||||
/**
|
||||
* Calculation of fission width at the saddle point according to B&W.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of unbound nuclei.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of the fission distribution.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of even-odd effects in fission.
|
||||
*/
|
||||
void even_odd(G4double r_origin, G4double r_even_odd, G4int &i_out);
|
||||
|
||||
/**
|
||||
* Functions for the fission model.
|
||||
*/
|
||||
G4double umass(G4double z, G4double n, G4double beta);
|
||||
G4double ecoul(G4double z1, G4double n1, G4double beta1, G4double z2,
|
||||
G4double n2, G4double beta2, G4double d);
|
||||
G4double Uwash(G4double E, G4double Ecrit, G4double Freduction,
|
||||
G4double gamma);
|
||||
G4double frldm(G4double z, G4double n, G4double beta);
|
||||
G4double eflmac_profi(G4double a, G4double z);
|
||||
G4double gausshaz(G4int k, G4double xmoy, G4double sig);
|
||||
G4double haz(G4int k);
|
||||
|
||||
/**
|
||||
* Level density parameters.
|
||||
*/
|
||||
void densniv(G4double a, G4double z, G4double ee, G4double ef, G4double *dens,
|
||||
G4double bshell, G4double bs, G4double bk, G4double *temp,
|
||||
G4int optshp, G4int optcol, G4double defbet, G4double *ecor,
|
||||
G4double jprf, G4int ifis, G4double *qr);
|
||||
|
||||
/**
|
||||
* Calculation of the fission probability modified by transient time effects.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
G4double func_trans(G4double TIME, G4double ZF, G4double AF, G4double BET,
|
||||
G4double Y, G4double FT, G4double T_0);
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
void lpoly(G4double x, G4int n, G4double pl[]);
|
||||
|
||||
/**
|
||||
* This function will calculate the liquid-drop nuclear mass for spheri
|
||||
* configuration according to the preprint NUCLEAR GROUND-STATE
|
||||
* MASSES and DEFORMATIONS by P. Mo"ller et al. from August 16, 1993 p.
|
||||
* All constants are taken from this publication for consistency.
|
||||
*/
|
||||
G4double eflmac(G4int ia, G4int iz, G4int flag, G4int optshp);
|
||||
|
||||
/**
|
||||
* Procedure for calculating the pairing correction to the binding
|
||||
* energy of a specific nucleus.
|
||||
*/
|
||||
void appariem(G4double a, G4double z, G4double *del);
|
||||
|
||||
/**
|
||||
* PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N.
|
||||
* RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN
|
||||
*/
|
||||
void parite(G4double n, G4double *par);
|
||||
|
||||
/**
|
||||
* RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED
|
||||
* 90 PERCENT OF ITS FINAL VALUE
|
||||
*/
|
||||
G4double tau(G4double bet, G4double homega, G4double ef, G4double t);
|
||||
|
||||
/**
|
||||
* KRAMERS FAKTOR - REDUCTION OF THE FISSION PROBABILITY
|
||||
* INDEPENDENT OF EXCITATION ENERGY
|
||||
*/
|
||||
G4double cram(G4double bet, G4double homega);
|
||||
|
||||
/**
|
||||
* CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS
|
||||
* RELATIVE TO THE SPHERICAL CONFIGURATION
|
||||
* BASED ON MYERS, DROPLET MODEL FOR ARBITRARY SHAPES
|
||||
*/
|
||||
G4double bipol(G4int iflag, G4double y);
|
||||
|
||||
/**
|
||||
* THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE
|
||||
* GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM
|
||||
* AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF
|
||||
* H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC
|
||||
* NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR
|
||||
* MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY
|
||||
* 2*PI).
|
||||
*/
|
||||
void barfit(G4int iz, G4int ia, G4int il, G4double *sbfis, G4double *segs,
|
||||
G4double *selmax);
|
||||
|
||||
/**
|
||||
* Calculation of decay widths for light particles.
|
||||
*/
|
||||
G4double width(G4double AMOTHER, G4double ZMOTHER, G4double APART,
|
||||
G4double ZPART, G4double TEMP, G4double B1, G4double SB1,
|
||||
G4double EXC);
|
||||
|
||||
/**
|
||||
* Calculation of penetration factors for light charged particles.
|
||||
*/
|
||||
G4double pen(G4double A, G4double ap, G4double omega, G4double T);
|
||||
|
||||
/**
|
||||
* Calculation of mean value of orbital angular momentum.
|
||||
*/
|
||||
void lorb(G4double AMOTHER, G4double ADAUGHTER, G4double LMOTHER,
|
||||
G4double EEFINAL, G4double *LORBITAL, G4double *SIGMA_LORBITAL);
|
||||
|
||||
/**
|
||||
* Calculation of BS and BK for the nuclear-level density.
|
||||
*/
|
||||
void bsbkbc(G4double A, G4double Z, G4double *BS, G4double *BK, G4double *BC);
|
||||
|
||||
/**
|
||||
* Special functions used for the emission of particles.
|
||||
*/
|
||||
G4double erf(G4double x);
|
||||
|
||||
G4double gammp(G4double a, G4double x);
|
||||
|
||||
void gcf(G4double *gammcf, G4double a, G4double x, G4double gln);
|
||||
|
||||
void gser(G4double *gamser, G4double a, G4double x, G4double gln);
|
||||
|
||||
G4double fvmaxhaz(G4double T);
|
||||
|
||||
G4double fvmaxhaz_neut(G4double x);
|
||||
|
||||
/**
|
||||
* Random numbers.
|
||||
*/
|
||||
void standardRandom(G4double *rndm, G4long *seed);
|
||||
|
||||
/**
|
||||
* LOGARITHM OF THE GAMM FUNCTION
|
||||
*/
|
||||
G4double gammln(G4double xx);
|
||||
|
||||
/**
|
||||
* DISTRIBUTION DE MAXWELL
|
||||
*/
|
||||
G4double fd(G4double E);
|
||||
|
||||
/**
|
||||
*FONCTION INTEGRALE DE FD(E)
|
||||
*/
|
||||
G4double f(G4double E);
|
||||
|
||||
/**
|
||||
* tirage aleatoire dans une maxwellienne
|
||||
*/
|
||||
G4double fmaxhaz(G4double T);
|
||||
|
||||
/**
|
||||
* tirage aleatoire dans une maxwellienne
|
||||
*/
|
||||
G4double fmaxhaz_old(G4double T);
|
||||
|
||||
/**
|
||||
* Random generator according to the
|
||||
powerfunction y = x**(lambda) in the range from xmin to xmax
|
||||
*/
|
||||
G4int IPOWERLIMHAZ(G4double lambda, G4int xmin, G4int xmax);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void guet(G4double *x_par, G4double *z_par, G4double *find_par);
|
||||
|
||||
/**
|
||||
* Limits of existing nuclei
|
||||
*/
|
||||
void isostab_lim(G4int z, G4int *nmin, G4int *nmax);
|
||||
|
||||
/**
|
||||
* Fill the data array for INCL
|
||||
*/
|
||||
void FillData(G4int IMULTBU, G4int IEV_TAB);
|
||||
|
||||
/**
|
||||
* Separation energies of lambda
|
||||
*/
|
||||
G4double gethyperseparation(G4double A, G4double Z, G4int ny);
|
||||
|
||||
/**
|
||||
* Separation energies of for other particles for hypernuclei
|
||||
*/
|
||||
G4double getdeltabinding(G4double a, G4int nblamb);
|
||||
G4double gethyperbinding(G4double A, G4double Z, G4int ny);
|
||||
|
||||
public:
|
||||
// Utils
|
||||
G4int min(G4int a, G4int b);
|
||||
G4double min(G4double a, G4double b);
|
||||
G4int max(G4int a, G4int b);
|
||||
G4double max(G4double a, G4double b);
|
||||
G4double DSIGN(G4double a, G4double b);
|
||||
G4int ISIGN(G4int a, G4int b);
|
||||
G4int nint(G4double number);
|
||||
G4int secnds(G4int x);
|
||||
G4int mod(G4int a, G4int b);
|
||||
G4double dmod(G4double a, G4double b);
|
||||
G4double dint(G4double a);
|
||||
G4int idint(G4double a);
|
||||
G4int idnint(G4double value);
|
||||
G4double utilabs(G4double a);
|
||||
G4double dmin1(G4double a, G4double b, G4double c);
|
||||
|
||||
private:
|
||||
G4int verboseLevel;
|
||||
G4int ilast;
|
||||
G4double T_freeze_out_in;
|
||||
G4int IEV_TAB_SSC;
|
||||
G4double BU_TAB[indexpart][12], EV_TAB[indexpart][6], EV_TAB_SSC[indexpart][6];
|
||||
G4int gammaemission;
|
||||
G4double T_freeze_out;
|
||||
std::unique_ptr<G4Ald> ald;
|
||||
std::unique_ptr<G4Ec2sub> ec2sub;
|
||||
std::unique_ptr<G4Ecld> ecld;
|
||||
std::unique_ptr<G4Mexp> masses;
|
||||
std::unique_ptr<G4Fb> fb;
|
||||
std::unique_ptr<G4Fiss> fiss;
|
||||
std::unique_ptr<G4Opt> opt;
|
||||
G4VarNtp *varntp;
|
||||
G4int Ainit, Zinit, Sinit;
|
||||
class G4Abla
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* This constructor is used by standalone test driver and the Geant4
|
||||
* interface.
|
||||
*
|
||||
* @param aHazard random seeds
|
||||
* @param aVolant data structure for ABLA output
|
||||
* @param aVarNtp data structure for transfering ABLA output to Geant4
|
||||
* interface
|
||||
*/
|
||||
G4Abla(G4VarNtp* aVarntp);
|
||||
|
||||
/**
|
||||
* Basic destructor.
|
||||
*/
|
||||
~G4Abla() = default;
|
||||
|
||||
/// \brief Dummy copy constructor
|
||||
G4Abla(G4Abla const& other);
|
||||
|
||||
/// \brief Dummy assignment operator
|
||||
G4Abla& operator=(G4Abla const& other);
|
||||
|
||||
/**
|
||||
* Set verbosity level.
|
||||
*/
|
||||
void setVerboseLevel(G4int level);
|
||||
|
||||
/**
|
||||
* Main interface to the de-excitation code.
|
||||
*
|
||||
* @param nucleusA mass number of the nucleus
|
||||
* @param nucleusZ charge number of the nucleus
|
||||
* @param excitationEnergy excitation energy of the nucleus
|
||||
* @param angularMomentum angular momentum of the nucleus (produced as output
|
||||
* by INCL4)
|
||||
* @param momX momentum x-component
|
||||
* @param momY momentum y-component
|
||||
* @param momZ momentum z-component
|
||||
* @param eventnumber number of the event
|
||||
*/
|
||||
void DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ, G4double excitationEnergy,
|
||||
G4double angularMomentum, G4double momX, G4double momY, G4double momZ,
|
||||
G4int eventnumber);
|
||||
|
||||
/**
|
||||
* Main interface to the de-excitation code for hyper-nuclei.
|
||||
*
|
||||
* @param nucleusA mass number of the nucleus
|
||||
* @param nucleusZ charge number of the nucleus
|
||||
* @param excitationEnergy excitation energy of the nucleus
|
||||
* @param angularMomentum angular momentum of the nucleus (produced as output
|
||||
* by INCL)
|
||||
* @param momX momentum x-component
|
||||
* @param momY momentum y-component
|
||||
* @param momZ momentum z-component
|
||||
* @param eventnumber number of the event
|
||||
* @param nucleusS is the strange number
|
||||
*/
|
||||
void DeexcitationAblaxx(G4int nucleusA, G4int nucleusZ, G4double excitationEnergy,
|
||||
G4double angularMomentum, G4double momX, G4double momY, G4double momZ,
|
||||
G4int eventnumber, G4int nucleusS);
|
||||
|
||||
// Evaporation
|
||||
public:
|
||||
/**
|
||||
* Initialize ABLA evaporation code.
|
||||
*
|
||||
*/
|
||||
void initEvapora();
|
||||
|
||||
/**
|
||||
* Initialize ABLA parameters.
|
||||
*
|
||||
*/
|
||||
void SetParameters();
|
||||
void SetParametersG4(G4int z, G4int a);
|
||||
|
||||
/**
|
||||
* Coefficient of collective enhancement including damping
|
||||
* Input: z,a,bet,sig,u
|
||||
* Output: qr - collective enhancement factor
|
||||
* See junghans et al., nucl. phys. a 629 (1998) 635
|
||||
* @param z charge number
|
||||
* @param a mass number
|
||||
* @param bet beta deformation
|
||||
* @param sig perpendicular spin cut-off factor
|
||||
* @param u Energy
|
||||
* @return Coefficient of collective enhancement
|
||||
*/
|
||||
void qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u, G4double* qr);
|
||||
|
||||
/**
|
||||
* Model de la goutte liquide de c. f. weizsacker.
|
||||
* usually an obsolete option
|
||||
*/
|
||||
void mglw(G4double a, G4double z, G4double* el);
|
||||
|
||||
/**
|
||||
* Mglms
|
||||
*/
|
||||
void mglms(G4double a, G4double z, G4int refopt4, G4double* el);
|
||||
|
||||
/**
|
||||
* Calculation of fissility parameter
|
||||
*/
|
||||
G4double fissility(G4int a, G4int z, G4int ny, G4double sn, G4double slam, G4int optxfis);
|
||||
|
||||
/**
|
||||
* Main evaporation routine.
|
||||
*/
|
||||
void evapora(G4double zprf, G4double aprf, G4double* ee_par, G4double jprf, 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);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission probabilities.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of fission and the particle emission probabilities after
|
||||
* fission.
|
||||
*/
|
||||
void fission(G4double AF, G4double ZF, G4double EE, G4double JPRF, G4double* VX1_FISSION,
|
||||
G4double* VY1_FISSION, G4double* VZ1_FISSION, G4double* VX2_FISSION,
|
||||
G4double* VY2_FISSION, G4double* VZ2_FISSION, G4int* ZFP1, G4int* AFP1,
|
||||
G4int* SFP1, G4int* ZFP2, G4int* AFP2, G4int* SFP2, G4int* imode,
|
||||
G4double* VX_EVA_SC, G4double* VY_EVA_SC, G4double* VZ_EVA_SC,
|
||||
G4double EV_TEMP[indexpart][6], G4int* IEV_TAB_FIS, G4int* NbLam0);
|
||||
|
||||
/**
|
||||
* Calculation of lorentz's boost
|
||||
*/
|
||||
void lorentz_boost(G4double VXRIN, G4double VYRIN, G4double VZRIN, G4double VXIN, G4double VYIN,
|
||||
G4double VZIN, G4double* VXOUT, G4double* VYOUT, G4double* VZOUT);
|
||||
|
||||
/**
|
||||
* Calculation of unstable nuclei
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of unstable nuclei tke
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of tke for breakup fragments
|
||||
*/
|
||||
void tke_bu(G4double Z, G4double A, G4double ZALL, G4double AAL, G4double* VX, G4double* VY,
|
||||
G4double* VZ);
|
||||
|
||||
/**
|
||||
* Calculation of the angular momentum of breakup fragments
|
||||
* according to Goldhaber model
|
||||
*/
|
||||
void AMOMENT(G4double AABRA, G4double APRF, G4int IMULTIFR, G4double* PX, G4double* PY,
|
||||
G4double* PZ);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission barriers.
|
||||
*/
|
||||
void barrs(G4int Z1, G4int A1, G4int Z2, G4int A2, G4double* sBARR, G4double* sOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of particle emission between the saddle and scission point.
|
||||
*/
|
||||
void evap_postsaddle(G4double A, G4double Z, G4double E_scission_pre, G4double* E_scission_post,
|
||||
G4double* A_scission, G4double* Z_scission, G4double& vx_eva,
|
||||
G4double& vy_eva, G4double& vz_eva, G4int* NbLam0_par);
|
||||
|
||||
/**
|
||||
* Calculation of imfs.
|
||||
*/
|
||||
void imf(G4double ACN, G4double ZCN, G4double TEMP, G4double EE, G4double* ZIMF, G4double* AIMF,
|
||||
G4double* BIMF, G4double* SBIMF, G4double* TIMF, G4double JPRF);
|
||||
|
||||
/**
|
||||
* Calculation of omega at saddle point.
|
||||
*/
|
||||
void fomega_sp(G4double AF, G4double Y, G4double* MFCD, G4double* sOMEGA, G4double* sHOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of omega at ground state.
|
||||
*/
|
||||
void fomega_gs(G4double AF, G4double ZF, G4double* K1, G4double* sOMEGA, G4double* sHOMEGA);
|
||||
|
||||
/**
|
||||
* Calculation of tunnelling effect in fission.
|
||||
*/
|
||||
G4double tunnelling(G4double A, G4double ZPRF, G4double Y, G4double EE, G4double EF,
|
||||
G4double TEMP, G4double DENSG, G4double DENSF, G4double ENH_FACT);
|
||||
|
||||
/**
|
||||
* Calculation of fission width at the saddle point according to B&W.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of unbound nuclei.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of the fission distribution.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
/**
|
||||
* Calculation of even-odd effects in fission.
|
||||
*/
|
||||
void even_odd(G4double r_origin, G4double r_even_odd, G4int& i_out);
|
||||
|
||||
/**
|
||||
* Functions for the fission model.
|
||||
*/
|
||||
G4double umass(G4double z, G4double n, G4double beta);
|
||||
G4double ecoul(G4double z1, G4double n1, G4double beta1, G4double z2, G4double n2,
|
||||
G4double beta2, G4double d);
|
||||
G4double Uwash(G4double E, G4double Ecrit, G4double Freduction, G4double gamma);
|
||||
G4double frldm(G4double z, G4double n, G4double beta);
|
||||
G4double eflmac_profi(G4double a, G4double z);
|
||||
G4double gausshaz(G4int k, G4double xmoy, G4double sig);
|
||||
G4double haz(G4int k);
|
||||
|
||||
/**
|
||||
* Level density parameters.
|
||||
*/
|
||||
void densniv(G4double a, G4double z, G4double ee, G4double ef, G4double* dens, G4double bshell,
|
||||
G4double bs, G4double bk, G4double* temp, G4int optshp, G4int optcol,
|
||||
G4double defbet, G4double* ecor, G4double jprf, G4int ifis, G4double* qr);
|
||||
|
||||
/**
|
||||
* Calculation of the fission probability modified by transient time effects.
|
||||
*/
|
||||
void 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);
|
||||
|
||||
G4double func_trans(G4double TIME, G4double ZF, G4double AF, G4double BET, G4double Y,
|
||||
G4double FT, G4double T_0);
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
void lpoly(G4double x, G4int n, G4double pl[]);
|
||||
|
||||
/**
|
||||
* This function will calculate the liquid-drop nuclear mass for spheri
|
||||
* configuration according to the preprint NUCLEAR GROUND-STATE
|
||||
* MASSES and DEFORMATIONS by P. Mo"ller et al. from August 16, 1993 p.
|
||||
* All constants are taken from this publication for consistency.
|
||||
*/
|
||||
G4double eflmac(G4int ia, G4int iz, G4int flag, G4int optshp);
|
||||
|
||||
/**
|
||||
* Procedure for calculating the pairing correction to the binding
|
||||
* energy of a specific nucleus.
|
||||
*/
|
||||
void appariem(G4double a, G4double z, G4double* del);
|
||||
|
||||
/**
|
||||
* PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N.
|
||||
* RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN
|
||||
*/
|
||||
void parite(G4double n, G4double* par);
|
||||
|
||||
/**
|
||||
* RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED
|
||||
* 90 PERCENT OF ITS FINAL VALUE
|
||||
*/
|
||||
G4double tau(G4double bet, G4double homega, G4double ef, G4double t);
|
||||
|
||||
/**
|
||||
* KRAMERS FAKTOR - REDUCTION OF THE FISSION PROBABILITY
|
||||
* INDEPENDENT OF EXCITATION ENERGY
|
||||
*/
|
||||
G4double cram(G4double bet, G4double homega);
|
||||
|
||||
/**
|
||||
* CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS
|
||||
* RELATIVE TO THE SPHERICAL CONFIGURATION
|
||||
* BASED ON MYERS, DROPLET MODEL FOR ARBITRARY SHAPES
|
||||
*/
|
||||
G4double bipol(G4int iflag, G4double y);
|
||||
|
||||
/**
|
||||
* THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE
|
||||
* GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM
|
||||
* AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF
|
||||
* H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC
|
||||
* NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR
|
||||
* MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY
|
||||
* 2*PI).
|
||||
*/
|
||||
void barfit(G4int iz, G4int ia, G4int il, G4double* sbfis, G4double* segs, G4double* selmax);
|
||||
|
||||
/**
|
||||
* Calculation of decay widths for light particles.
|
||||
*/
|
||||
G4double width(G4double AMOTHER, G4double ZMOTHER, G4double APART, G4double ZPART,
|
||||
G4double TEMP, G4double B1, G4double SB1, G4double EXC);
|
||||
|
||||
/**
|
||||
* Calculation of penetration factors for light charged particles.
|
||||
*/
|
||||
G4double pen(G4double A, G4double ap, G4double omega, G4double T);
|
||||
|
||||
/**
|
||||
* Calculation of mean value of orbital angular momentum.
|
||||
*/
|
||||
void lorb(G4double AMOTHER, G4double ADAUGHTER, G4double LMOTHER, G4double EEFINAL,
|
||||
G4double* LORBITAL, G4double* SIGMA_LORBITAL);
|
||||
|
||||
/**
|
||||
* Calculation of BS and BK for the nuclear-level density.
|
||||
*/
|
||||
void bsbkbc(G4double A, G4double Z, G4double* BS, G4double* BK, G4double* BC);
|
||||
|
||||
/**
|
||||
* Special functions used for the emission of particles.
|
||||
*/
|
||||
G4double erf(G4double x);
|
||||
|
||||
G4double gammp(G4double a, G4double x);
|
||||
|
||||
void gcf(G4double* gammcf, G4double a, G4double x, G4double gln);
|
||||
|
||||
void gser(G4double* gamser, G4double a, G4double x, G4double gln);
|
||||
|
||||
G4double fvmaxhaz(G4double T);
|
||||
|
||||
G4double fvmaxhaz_neut(G4double x);
|
||||
|
||||
/**
|
||||
* Random numbers.
|
||||
*/
|
||||
void standardRandom(G4double* rndm, G4long* seed);
|
||||
|
||||
/**
|
||||
* LOGARITHM OF THE GAMM FUNCTION
|
||||
*/
|
||||
G4double gammln(G4double xx);
|
||||
|
||||
/**
|
||||
* DISTRIBUTION DE MAXWELL
|
||||
*/
|
||||
G4double fd(G4double E);
|
||||
|
||||
/**
|
||||
*FONCTION INTEGRALE DE FD(E)
|
||||
*/
|
||||
G4double f(G4double E);
|
||||
|
||||
/**
|
||||
* tirage aleatoire dans une maxwellienne
|
||||
*/
|
||||
G4double fmaxhaz(G4double T);
|
||||
|
||||
/**
|
||||
* tirage aleatoire dans une maxwellienne
|
||||
*/
|
||||
G4double fmaxhaz_old(G4double T);
|
||||
|
||||
/**
|
||||
* Random generator according to the
|
||||
powerfunction y = x**(lambda) in the range from xmin to xmax
|
||||
*/
|
||||
G4int IPOWERLIMHAZ(G4double lambda, G4int xmin, G4int xmax);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void guet(G4double* x_par, G4double* z_par, G4double* find_par);
|
||||
|
||||
/**
|
||||
* Limits of existing nuclei
|
||||
*/
|
||||
void isostab_lim(G4int z, G4int* nmin, G4int* nmax);
|
||||
|
||||
/**
|
||||
* Fill the data array for INCL
|
||||
*/
|
||||
void FillData(G4int IMULTBU, G4int IEV_TAB);
|
||||
|
||||
/**
|
||||
* Separation energies of lambda
|
||||
*/
|
||||
G4double gethyperseparation(G4double A, G4double Z, G4int ny);
|
||||
|
||||
/**
|
||||
* Separation energies of for other particles for hypernuclei
|
||||
*/
|
||||
G4double getdeltabinding(G4double a, G4int nblamb);
|
||||
G4double gethyperbinding(G4double A, G4double Z, G4int ny);
|
||||
|
||||
public:
|
||||
// Utils
|
||||
G4int min(G4int a, G4int b);
|
||||
G4double min(G4double a, G4double b);
|
||||
G4int max(G4int a, G4int b);
|
||||
G4double max(G4double a, G4double b);
|
||||
G4double DSIGN(G4double a, G4double b);
|
||||
G4int ISIGN(G4int a, G4int b);
|
||||
G4int nint(G4double number);
|
||||
G4int secnds(G4int x);
|
||||
G4int mod(G4int a, G4int b);
|
||||
G4double dmod(G4double a, G4double b);
|
||||
G4double dint(G4double a);
|
||||
G4int idint(G4double a);
|
||||
G4int idnint(G4double value);
|
||||
G4double utilabs(G4double a);
|
||||
G4double dmin1(G4double a, G4double b, G4double c);
|
||||
|
||||
private:
|
||||
G4int verboseLevel;
|
||||
G4int ilast;
|
||||
G4double T_freeze_out_in;
|
||||
G4int IEV_TAB_SSC;
|
||||
G4double BU_TAB[indexpart][12], EV_TAB[indexpart][6], EV_TAB_SSC[indexpart][6];
|
||||
G4int gammaemission;
|
||||
G4double T_freeze_out;
|
||||
std::unique_ptr<G4Ald> ald;
|
||||
std::unique_ptr<G4Ec2sub> ec2sub;
|
||||
std::unique_ptr<G4Ecld> ecld;
|
||||
std::unique_ptr<G4Mexp> masses;
|
||||
std::unique_ptr<G4Fb> fb;
|
||||
std::unique_ptr<G4Fiss> fiss;
|
||||
std::unique_ptr<G4Opt> opt;
|
||||
G4VarNtp* varntp;
|
||||
G4int Ainit, Zinit, Sinit;
|
||||
};
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "globals.hh"
|
||||
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
|
||||
constexpr const G4int nrows = 180;
|
||||
constexpr const G4int zcols = 122;
|
||||
|
||||
@@ -51,219 +51,232 @@ constexpr const G4int indexpart = 300;
|
||||
|
||||
// Data structures needed by ABLA evaporation code
|
||||
|
||||
class G4Mexp {
|
||||
class G4Mexp
|
||||
{
|
||||
public:
|
||||
G4Mexp() {};
|
||||
|
||||
public:
|
||||
G4Mexp(){};
|
||||
~G4Mexp() = default;
|
||||
|
||||
virtual ~G4Mexp() = default;
|
||||
|
||||
G4double massexp[lprows][lpcols] = {{0.}};
|
||||
G4double bind[lprows][lpcols] = {{0.}};
|
||||
G4int mexpiop[lprows][lpcols] = {{0}};
|
||||
G4double massexp[lprows][lpcols] = {{0.}};
|
||||
G4double bind[lprows][lpcols] = {{0.}};
|
||||
G4int mexpiop[lprows][lpcols] = {{0}};
|
||||
};
|
||||
|
||||
class G4Ec2sub {
|
||||
public:
|
||||
G4Ec2sub(){};
|
||||
class G4Ec2sub
|
||||
{
|
||||
public:
|
||||
G4Ec2sub() {};
|
||||
|
||||
virtual ~G4Ec2sub() = default;
|
||||
~G4Ec2sub() = default;
|
||||
|
||||
G4double ecnz[nrows][zcols] = {{0.}};
|
||||
G4double ecnz[nrows][zcols] = {{0.}};
|
||||
};
|
||||
|
||||
class G4Ald {
|
||||
public:
|
||||
G4Ald() : av(0.0), as(0.0), ak(0.0), optafan(0.0){};
|
||||
class G4Ald
|
||||
{
|
||||
public:
|
||||
G4Ald() : av(0.0), as(0.0), ak(0.0), optafan(0.0) {};
|
||||
|
||||
virtual ~G4Ald() = default;
|
||||
~G4Ald() = default;
|
||||
|
||||
G4double av, as, ak, optafan = 0.;
|
||||
G4double av, as, ak, optafan = 0.;
|
||||
};
|
||||
|
||||
/**
|
||||
* Shell corrections and deformations.
|
||||
**/
|
||||
|
||||
class G4Ecld {
|
||||
class G4Ecld
|
||||
{
|
||||
public:
|
||||
G4Ecld() {};
|
||||
~G4Ecld() = default;
|
||||
|
||||
public:
|
||||
G4Ecld(){};
|
||||
virtual ~G4Ecld() = default;
|
||||
/**
|
||||
* Ground state shell correction frldm for a spherical ground state.
|
||||
*/
|
||||
G4double ecgnz[nrows][zcols] = {{0.}};
|
||||
|
||||
/**
|
||||
* Ground state shell correction frldm for a spherical ground state.
|
||||
*/
|
||||
G4double ecgnz[nrows][zcols] = {{0.}};
|
||||
/**
|
||||
* Shell correction for the saddle point (now: == 0).
|
||||
*/
|
||||
G4double ecfnz[nrows][zcols] = {{0.}};
|
||||
|
||||
/**
|
||||
* Shell correction for the saddle point (now: == 0).
|
||||
*/
|
||||
G4double ecfnz[nrows][zcols] = {{0.}};
|
||||
/**
|
||||
* Difference between deformed ground state and ldm value.
|
||||
*/
|
||||
G4double vgsld[nrows][zcols] = {{0.}};
|
||||
|
||||
/**
|
||||
* Difference between deformed ground state and ldm value.
|
||||
*/
|
||||
G4double vgsld[nrows][zcols] = {{0.}};
|
||||
/**
|
||||
* Alpha ground state deformation (this is not beta2!)
|
||||
* beta2 = std::sqrt(5/(4pi)) * alpha
|
||||
*/
|
||||
G4double alpha[nrows][zcols] = {{0.}};
|
||||
|
||||
/**
|
||||
* Alpha ground state deformation (this is not beta2!)
|
||||
* beta2 = std::sqrt(5/(4pi)) * alpha
|
||||
*/
|
||||
G4double alpha[nrows][zcols] = {{0.}};
|
||||
/**
|
||||
* RMS function for lcp emission barriers
|
||||
*/
|
||||
G4double rms[nrows][zcols] = {{0.}};
|
||||
|
||||
/**
|
||||
* RMS function for lcp emission barriers
|
||||
*/
|
||||
G4double rms[nrows][zcols] = {{0.}};
|
||||
/**
|
||||
* Beta2 deformations
|
||||
*/
|
||||
G4double beta2[nrowsbeta][zcolsbeta] = {{0.}};
|
||||
|
||||
/**
|
||||
* Beta2 deformations
|
||||
*/
|
||||
G4double beta2[nrowsbeta][zcolsbeta] = {{0.}};
|
||||
|
||||
/**
|
||||
* Beta4 deformations
|
||||
*/
|
||||
G4double beta4[nrowsbeta][zcolsbeta] = {{0.}};
|
||||
/**
|
||||
* Beta4 deformations
|
||||
*/
|
||||
G4double beta4[nrowsbeta][zcolsbeta] = {{0.}};
|
||||
};
|
||||
|
||||
class G4Fiss {
|
||||
/**
|
||||
* Options and parameters for fission channel.
|
||||
*/
|
||||
class G4Fiss
|
||||
{
|
||||
/**
|
||||
* Options and parameters for fission channel.
|
||||
*/
|
||||
|
||||
public:
|
||||
G4Fiss()
|
||||
: bet(0.0), bethyp(0.0), ifis(0.0), ucr(0.0), dcr(0.0), optshp(0), optxfis(0),
|
||||
optct(0), optcol(0), at(0), zt(0){};
|
||||
public:
|
||||
G4Fiss()
|
||||
: bet(0.0),
|
||||
bethyp(0.0),
|
||||
ifis(0.0),
|
||||
ucr(0.0),
|
||||
dcr(0.0),
|
||||
optshp(0),
|
||||
optxfis(0),
|
||||
optct(0),
|
||||
optcol(0),
|
||||
at(0),
|
||||
zt(0) {};
|
||||
|
||||
virtual ~G4Fiss() = default;
|
||||
~G4Fiss() = default;
|
||||
|
||||
G4double bet, bethyp, ifis, ucr, dcr;
|
||||
G4int optshp, optxfis, optct, optcol, at, zt;
|
||||
G4double bet, bethyp, ifis, ucr, dcr;
|
||||
G4int optshp, optxfis, optct, optcol, at, zt;
|
||||
};
|
||||
|
||||
/**
|
||||
* Fission barriers.
|
||||
*/
|
||||
|
||||
class G4Fb {
|
||||
class G4Fb
|
||||
{
|
||||
public:
|
||||
G4Fb() {};
|
||||
~G4Fb() = default;
|
||||
|
||||
public:
|
||||
G4Fb(){};
|
||||
virtual ~G4Fb() = default;
|
||||
|
||||
G4double efa[nrows][zcols] = {{0.}};
|
||||
G4double efa[nrows][zcols] = {{0.}};
|
||||
};
|
||||
|
||||
/**
|
||||
* Options
|
||||
*/
|
||||
|
||||
class G4Opt {
|
||||
class G4Opt
|
||||
{
|
||||
public:
|
||||
G4Opt() : optemd(0), optcha(0), optshpimf(0), optimfallowed(0), nblan0(0) {};
|
||||
|
||||
public:
|
||||
G4Opt() : optemd(0), optcha(0), optshpimf(0), optimfallowed(0), nblan0(0){};
|
||||
|
||||
virtual ~G4Opt() = default;
|
||||
~G4Opt() = default;
|
||||
|
||||
G4int optemd, optcha, optshpimf, optimfallowed, nblan0;
|
||||
G4int optemd, optcha, optshpimf, optimfallowed, nblan0;
|
||||
};
|
||||
|
||||
class G4VarNtp {
|
||||
public:
|
||||
G4VarNtp() { clear(); };
|
||||
class G4VarNtp
|
||||
{
|
||||
public:
|
||||
G4VarNtp() { clear(); };
|
||||
|
||||
virtual ~G4VarNtp() = default;
|
||||
~G4VarNtp() = default;
|
||||
|
||||
void clear() {
|
||||
ntrack = 0;
|
||||
kfis = 0;
|
||||
itypcasc.clear();
|
||||
avv.clear();
|
||||
zvv.clear();
|
||||
svv.clear();
|
||||
enerj.clear();
|
||||
pxlab.clear();
|
||||
pylab.clear();
|
||||
pzlab.clear();
|
||||
}
|
||||
void clear()
|
||||
{
|
||||
ntrack = 0;
|
||||
kfis = 0;
|
||||
itypcasc.clear();
|
||||
avv.clear();
|
||||
zvv.clear();
|
||||
svv.clear();
|
||||
enerj.clear();
|
||||
pxlab.clear();
|
||||
pylab.clear();
|
||||
pzlab.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fission 1/0=Y/N.
|
||||
*/
|
||||
G4int kfis;
|
||||
/**
|
||||
* Fission 1/0=Y/N.
|
||||
*/
|
||||
G4int kfis;
|
||||
|
||||
/**
|
||||
* Excit energy at fis.
|
||||
*/
|
||||
G4double estfis = 0.;
|
||||
/**
|
||||
* Excit energy at fis.
|
||||
*/
|
||||
G4double estfis = 0.;
|
||||
|
||||
/**
|
||||
* Z of fiss nucleus.
|
||||
*/
|
||||
G4int izfis = 0;
|
||||
/**
|
||||
* Z of fiss nucleus.
|
||||
*/
|
||||
G4int izfis = 0;
|
||||
|
||||
/**
|
||||
* A of fiss nucleus.
|
||||
*/
|
||||
G4int iafis = 0;
|
||||
/**
|
||||
* A of fiss nucleus.
|
||||
*/
|
||||
G4int iafis = 0;
|
||||
|
||||
/**
|
||||
* Number of particles.
|
||||
*/
|
||||
G4int ntrack;
|
||||
/**
|
||||
* Number of particles.
|
||||
*/
|
||||
G4int ntrack;
|
||||
|
||||
/**
|
||||
* Does this nucleus require Fermi break-up treatment? Only
|
||||
* applicable when used together with Geant4.
|
||||
* true = do fermi break-up (and skip ABLA part)
|
||||
* false = use ABLA
|
||||
*/
|
||||
G4bool needsFermiBreakup = false;
|
||||
/**
|
||||
* Does this nucleus require Fermi break-up treatment? Only
|
||||
* applicable when used together with Geant4.
|
||||
* true = do fermi break-up (and skip ABLA part)
|
||||
* false = use ABLA
|
||||
*/
|
||||
G4bool needsFermiBreakup = false;
|
||||
|
||||
/**
|
||||
* emitted in cascade (0) or evaporation (1).
|
||||
*/
|
||||
std::vector<G4int> itypcasc;
|
||||
/**
|
||||
* emitted in cascade (0) or evaporation (1).
|
||||
*/
|
||||
std::vector<G4int> itypcasc;
|
||||
|
||||
/**
|
||||
* A (-1 for pions).
|
||||
*/
|
||||
std::vector<G4int> avv;
|
||||
/**
|
||||
* A (-1 for pions).
|
||||
*/
|
||||
std::vector<G4int> avv;
|
||||
|
||||
/**
|
||||
* Z
|
||||
*/
|
||||
std::vector<G4int> zvv;
|
||||
/**
|
||||
* Z
|
||||
*/
|
||||
std::vector<G4int> zvv;
|
||||
|
||||
/**
|
||||
* S (-1 for lambda_0).
|
||||
*/
|
||||
std::vector<G4int> svv;
|
||||
/**
|
||||
* S (-1 for lambda_0).
|
||||
*/
|
||||
std::vector<G4int> svv;
|
||||
|
||||
/**
|
||||
* Kinetic energy.
|
||||
*/
|
||||
std::vector<G4double> enerj;
|
||||
/**
|
||||
* Kinetic energy.
|
||||
*/
|
||||
std::vector<G4double> enerj;
|
||||
|
||||
/**
|
||||
* Momentum.
|
||||
*/
|
||||
std::vector<G4double> plab;
|
||||
std::vector<G4double> pxlab;
|
||||
std::vector<G4double> pylab;
|
||||
std::vector<G4double> pzlab;
|
||||
/**
|
||||
* Momentum.
|
||||
*/
|
||||
std::vector<G4double> plab;
|
||||
std::vector<G4double> pxlab;
|
||||
std::vector<G4double> pylab;
|
||||
std::vector<G4double> pzlab;
|
||||
|
||||
/**
|
||||
* Theta angle.
|
||||
*/
|
||||
std::vector<G4double> tetlab;
|
||||
|
||||
/**
|
||||
* Phi angle.
|
||||
*/
|
||||
std::vector<G4double> philab;
|
||||
/**
|
||||
* Theta angle.
|
||||
*/
|
||||
std::vector<G4double> tetlab;
|
||||
|
||||
/**
|
||||
* Phi angle.
|
||||
*/
|
||||
std::vector<G4double> philab;
|
||||
};
|
||||
|
||||
@@ -39,17 +39,17 @@
|
||||
/**
|
||||
* Read ABLA data from files.
|
||||
*/
|
||||
class G4AblaDataFile : public G4AblaVirtualData {
|
||||
class G4AblaDataFile : public G4AblaVirtualData
|
||||
{
|
||||
public:
|
||||
G4AblaDataFile();
|
||||
virtual ~G4AblaDataFile() = default;
|
||||
|
||||
public:
|
||||
G4AblaDataFile();
|
||||
virtual ~G4AblaDataFile() = default;
|
||||
/**
|
||||
* Read all data from files.
|
||||
*/
|
||||
G4bool readData();
|
||||
|
||||
/**
|
||||
* Read all data from files.
|
||||
*/
|
||||
G4bool readData();
|
||||
|
||||
private:
|
||||
G4int verboseLevel;
|
||||
private:
|
||||
G4int verboseLevel;
|
||||
};
|
||||
|
||||
@@ -33,8 +33,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "globals.hh"
|
||||
|
||||
#include "G4Abla.hh"
|
||||
#include "G4Fragment.hh"
|
||||
#include "G4HadFinalState.hh"
|
||||
@@ -42,41 +40,42 @@
|
||||
#include "G4Nucleus.hh"
|
||||
#include "G4ReactionProduct.hh"
|
||||
#include "G4VPreCompoundModel.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
class G4ExcitationHandler;
|
||||
class G4HadFinalState;
|
||||
|
||||
class G4AblaInterface : public G4VPreCompoundModel {
|
||||
public:
|
||||
G4AblaInterface(G4ExcitationHandler *ptr = nullptr);
|
||||
virtual ~G4AblaInterface();
|
||||
class G4AblaInterface : public G4VPreCompoundModel
|
||||
{
|
||||
public:
|
||||
G4AblaInterface(G4ExcitationHandler* ptr = nullptr);
|
||||
virtual ~G4AblaInterface();
|
||||
|
||||
virtual G4ReactionProductVector *DeExcite(G4Fragment &aFragment);
|
||||
virtual G4ReactionProductVector* DeExcite(G4Fragment& aFragment);
|
||||
|
||||
virtual G4HadFinalState *ApplyYourself(G4HadProjectile const &,
|
||||
G4Nucleus &) final;
|
||||
virtual G4HadFinalState* ApplyYourself(G4HadProjectile const&, G4Nucleus&) final;
|
||||
|
||||
virtual void BuildPhysicsTable(const G4ParticleDefinition &) final;
|
||||
virtual void BuildPhysicsTable(const G4ParticleDefinition&) final;
|
||||
|
||||
virtual void InitialiseModel() final;
|
||||
virtual void InitialiseModel() final;
|
||||
|
||||
virtual void ModelDescription(std::ostream &outFile) const;
|
||||
virtual void ModelDescription(std::ostream& outFile) const;
|
||||
|
||||
virtual void DeExciteModelDescription(std::ostream &outFile) const;
|
||||
virtual void DeExciteModelDescription(std::ostream& outFile) const;
|
||||
|
||||
private:
|
||||
G4HadFinalState applyYourselfResult;
|
||||
G4VarNtp *ablaResult;
|
||||
G4Abla *theABLAModel;
|
||||
G4long eventNumber;
|
||||
G4int secID; // Creator model ID for the secondaries created by ABLA
|
||||
private:
|
||||
G4HadFinalState applyYourselfResult;
|
||||
G4VarNtp* ablaResult;
|
||||
G4Abla* theABLAModel;
|
||||
G4long eventNumber;
|
||||
G4int secID; // Creator model ID for the secondaries created by ABLA
|
||||
|
||||
G4bool isInitialised;
|
||||
G4bool isInitialised;
|
||||
|
||||
/// \brief Convert an Abla particle to a G4DynamicParticle
|
||||
G4ReactionProduct *toG4Particle(G4int A, G4int Z, G4int S, G4double kinE,
|
||||
G4double px, G4double py, G4double pz) const;
|
||||
/// \brief Convert an Abla particle to a G4DynamicParticle
|
||||
G4ReactionProduct* toG4Particle(G4int A, G4int Z, G4int S, G4double kinE, G4double px,
|
||||
G4double py, G4double pz) const;
|
||||
|
||||
/// \brief Convert A, Z and S to a G4ParticleDefinition
|
||||
G4ParticleDefinition *toG4ParticleDefinition(G4int A, G4int Z, G4int S) const;
|
||||
/// \brief Convert A, Z and S to a G4ParticleDefinition
|
||||
G4ParticleDefinition* toG4ParticleDefinition(G4int A, G4int Z, G4int S) const;
|
||||
};
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "globals.hh"
|
||||
|
||||
namespace G4AblaRandom {
|
||||
namespace G4AblaRandom
|
||||
{
|
||||
G4double flat();
|
||||
}
|
||||
|
||||
@@ -42,111 +42,112 @@
|
||||
* G4AblaDataFile
|
||||
*/
|
||||
|
||||
class G4AblaVirtualData {
|
||||
protected:
|
||||
/**
|
||||
* Constructor, destructor
|
||||
*/
|
||||
G4AblaVirtualData();
|
||||
class G4AblaVirtualData
|
||||
{
|
||||
protected:
|
||||
/**
|
||||
* Constructor, destructor
|
||||
*/
|
||||
G4AblaVirtualData();
|
||||
|
||||
virtual ~G4AblaVirtualData() = default;
|
||||
virtual ~G4AblaVirtualData() = default;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Set the value of Alpha.
|
||||
*/
|
||||
G4bool setAlpha(G4int A, G4int Z, G4double value);
|
||||
public:
|
||||
/**
|
||||
* Set the value of Alpha.
|
||||
*/
|
||||
G4bool setAlpha(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of Ecnz.
|
||||
*/
|
||||
G4bool setEcnz(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of Ecnz.
|
||||
*/
|
||||
G4bool setEcnz(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of Vgsld.
|
||||
*/
|
||||
G4bool setVgsld(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of Vgsld.
|
||||
*/
|
||||
G4bool setVgsld(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of RMS.
|
||||
*/
|
||||
G4bool setRms(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of RMS.
|
||||
*/
|
||||
G4bool setRms(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of experimental masses.
|
||||
*/
|
||||
G4bool setMexp(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of experimental masses.
|
||||
*/
|
||||
G4bool setMexp(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of experimental masses ID.
|
||||
*/
|
||||
G4bool setMexpID(G4int A, G4int Z, G4int value);
|
||||
/**
|
||||
* Set the value of experimental masses ID.
|
||||
*/
|
||||
G4bool setMexpID(G4int A, G4int Z, G4int value);
|
||||
|
||||
/**
|
||||
* Set the value of beta2 deformation.
|
||||
*/
|
||||
G4bool setBeta2(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of beta2 deformation.
|
||||
*/
|
||||
G4bool setBeta2(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Set the value of beta4 deformation.
|
||||
*/
|
||||
G4bool setBeta4(G4int A, G4int Z, G4double value);
|
||||
/**
|
||||
* Set the value of beta4 deformation.
|
||||
*/
|
||||
G4bool setBeta4(G4int A, G4int Z, G4double value);
|
||||
|
||||
/**
|
||||
* Get the value of Alpha.
|
||||
*/
|
||||
G4double getAlpha(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of Alpha.
|
||||
*/
|
||||
G4double getAlpha(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of Ecnz.
|
||||
*/
|
||||
G4double getEcnz(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of Ecnz.
|
||||
*/
|
||||
G4double getEcnz(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of Vgsld.
|
||||
*/
|
||||
G4double getVgsld(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of Vgsld.
|
||||
*/
|
||||
G4double getVgsld(G4int A, G4int Z);
|
||||
|
||||
/*
|
||||
* Get the value of RMS.
|
||||
*/
|
||||
G4double getRms(G4int A, G4int Z);
|
||||
/*
|
||||
* Get the value of RMS.
|
||||
*/
|
||||
G4double getRms(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of experimental masses.
|
||||
*/
|
||||
G4double getMexp(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of experimental masses.
|
||||
*/
|
||||
G4double getMexp(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of experimental masses ID.
|
||||
*/
|
||||
G4int getMexpID(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of experimental masses ID.
|
||||
*/
|
||||
G4int getMexpID(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of beta2 deformation.
|
||||
*/
|
||||
G4double getBeta2(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of beta2 deformation.
|
||||
*/
|
||||
G4double getBeta2(G4int A, G4int Z);
|
||||
|
||||
/**
|
||||
* Get the value of beta4 deformation.
|
||||
*/
|
||||
G4double getBeta4(G4int A, G4int Z);
|
||||
/**
|
||||
* Get the value of beta4 deformation.
|
||||
*/
|
||||
G4double getBeta4(G4int A, G4int Z);
|
||||
|
||||
virtual G4bool readData() = 0;
|
||||
virtual G4bool readData() = 0;
|
||||
|
||||
private:
|
||||
static const G4int sRows = 180;
|
||||
static const G4int sCols = 122;
|
||||
private:
|
||||
static const G4int sRows = 180;
|
||||
static const G4int sCols = 122;
|
||||
|
||||
static const G4int betaRows = sCols + sRows;
|
||||
static const G4int betaCols = 137;
|
||||
static const G4int betaRows = sCols + sRows;
|
||||
static const G4int betaCols = 137;
|
||||
|
||||
G4double alpha[sRows][sCols];
|
||||
G4double ecnz[sRows][sCols];
|
||||
G4double vgsld[sRows][sCols];
|
||||
G4double rms[sRows][sCols];
|
||||
G4double mexp[sRows][sCols];
|
||||
G4int mexpid[sRows][sCols];
|
||||
G4double beta2[betaRows][betaCols];
|
||||
G4double beta4[betaRows][betaCols];
|
||||
G4double alpha[sRows][sCols];
|
||||
G4double ecnz[sRows][sCols];
|
||||
G4double vgsld[sRows][sCols];
|
||||
G4double rms[sRows][sCols];
|
||||
G4double mexp[sRows][sCols];
|
||||
G4int mexpid[sRows][sCols];
|
||||
G4double beta2[betaRows][betaCols];
|
||||
G4double beta4[betaRows][betaCols];
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -32,6 +32,7 @@
|
||||
//
|
||||
|
||||
#include "G4AblaDataFile.hh"
|
||||
|
||||
#include "G4AblaDataDefs.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
@@ -40,154 +41,144 @@
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
G4AblaDataFile::G4AblaDataFile() { verboseLevel = 0; }
|
||||
G4AblaDataFile::G4AblaDataFile()
|
||||
{
|
||||
verboseLevel = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all data from files.
|
||||
*/
|
||||
G4bool G4AblaDataFile::readData()
|
||||
{
|
||||
if (!G4FindDataDir("G4ABLADATA"))
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << " Data missing: set environment variable G4ABLADATA\n"
|
||||
<< " to point to the directory containing data files needed\n"
|
||||
<< " by the ABLA model" << G4endl;
|
||||
G4Exception("G4AblaDataFile::readData()", "ABLA_001", FatalException, ed);
|
||||
if (!G4FindDataDir("G4ABLADATA")) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << " Data missing: set environment variable G4ABLADATA\n"
|
||||
<< " to point to the directory containing data files needed\n"
|
||||
<< " by the ABLA model" << G4endl;
|
||||
G4Exception("G4AblaDataFile::readData()", "ABLA_001", FatalException, ed);
|
||||
}
|
||||
G4String dataPath(G4FindDataDir("G4ABLADATA"));
|
||||
|
||||
G4String flAlphaFile(dataPath + "/flalpha.dat");
|
||||
G4String frldmFile(dataPath + "/frldm.dat");
|
||||
G4String vgsldFile(dataPath + "/vgsld.dat");
|
||||
G4String rmsFile(dataPath + "/rms.dat");
|
||||
G4String defoFile(dataPath + "/defo.dat");
|
||||
G4String massFile(dataPath + "/mass2020.dat");
|
||||
|
||||
if (verboseLevel > 1) {
|
||||
// G4cout <<"Data path = " << dataPath << G4endl;
|
||||
// G4cout <<"FlAlphaFile = " << flAlphaFile << G4endl;
|
||||
// G4cout <<"FrldmFile = " << frldmFile << G4endl;
|
||||
// G4cout <<"VgsldFile = " << vgsldFile << G4endl;
|
||||
}
|
||||
|
||||
std::ifstream flalphain(flAlphaFile.c_str());
|
||||
std::ifstream frldmin(frldmFile.c_str());
|
||||
std::ifstream vgsldin(vgsldFile.c_str());
|
||||
std::ifstream rmsin(rmsFile.c_str());
|
||||
std::ifstream defoin(defoFile.c_str());
|
||||
std::ifstream massin(massFile.c_str());
|
||||
|
||||
if (!massin.is_open()) {
|
||||
massFile = dataPath + "/mass2016.dat";
|
||||
massin.close();
|
||||
massin.open(massFile.c_str());
|
||||
std::cout << "Mass evaluation file mass2020.dat not found, current file: " << massFile.c_str()
|
||||
<< std::endl;
|
||||
|
||||
if (!massin.is_open()) {
|
||||
massFile = dataPath + "/mass2003.dat";
|
||||
massin.close();
|
||||
massin.open(massFile.c_str());
|
||||
std::cout << "Mass evaluation file mass2016.dat not found, current file: " << massFile.c_str()
|
||||
<< std::endl;
|
||||
}
|
||||
G4String dataPath(G4FindDataDir("G4ABLADATA"));
|
||||
}
|
||||
|
||||
G4String flAlphaFile(dataPath + "/flalpha.dat");
|
||||
G4String frldmFile(dataPath + "/frldm.dat");
|
||||
G4String vgsldFile(dataPath + "/vgsld.dat");
|
||||
G4String rmsFile(dataPath + "/rms.dat");
|
||||
G4String defoFile(dataPath + "/defo.dat");
|
||||
G4String massFile(dataPath + "/mass2020.dat");
|
||||
std::filebuf* buf1 = flalphain.rdbuf();
|
||||
std::filebuf* buf2 = frldmin.rdbuf();
|
||||
std::filebuf* buf3 = vgsldin.rdbuf();
|
||||
std::filebuf* buf4 = rmsin.rdbuf();
|
||||
std::filebuf* buf5 = defoin.rdbuf();
|
||||
std::filebuf* buf6 = massin.rdbuf();
|
||||
if (!((buf1->is_open()) && (buf2->is_open()) && (buf3->is_open()) && (buf4->is_open())
|
||||
&& (buf5->is_open()) && (buf6->is_open())))
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Data missing: could not find ABLA data file in " << dataPath
|
||||
<< "defined by environment variable G4ABLADATA" << G4endl;
|
||||
G4Exception("G4AblaDataFile::readData()", "ABLA", FatalException, ed);
|
||||
}
|
||||
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
// G4cout <<"Data path = " << dataPath << G4endl;
|
||||
// G4cout <<"FlAlphaFile = " << flAlphaFile << G4endl;
|
||||
// G4cout <<"FrldmFile = " << frldmFile << G4endl;
|
||||
// G4cout <<"VgsldFile = " << vgsldFile << G4endl;
|
||||
G4double fflalpha, ffrldm, fvgsld, frms;
|
||||
G4int fj = 0, fk = 0, a2, a3, a4;
|
||||
G4double fbeta2, fbeta4;
|
||||
G4double a7;
|
||||
const G4int rows = 99;
|
||||
const G4int cols = 154;
|
||||
const G4int rowsbeta = 137;
|
||||
const G4int colsbeta = 251;
|
||||
|
||||
for (G4int i = 0; i < zcols; i++) {
|
||||
for (G4int j = 0; j < nrows; j++) {
|
||||
setAlpha(j, i, 0.0);
|
||||
setEcnz(j, i, 0.0);
|
||||
setVgsld(j, i, 0.0);
|
||||
setRms(j, i, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
std::ifstream flalphain(flAlphaFile.c_str());
|
||||
std::ifstream frldmin(frldmFile.c_str());
|
||||
std::ifstream vgsldin(vgsldFile.c_str());
|
||||
std::ifstream rmsin(rmsFile.c_str());
|
||||
std::ifstream defoin(defoFile.c_str());
|
||||
std::ifstream massin(massFile.c_str());
|
||||
|
||||
if (!massin.is_open())
|
||||
{
|
||||
massFile = dataPath + "/mass2016.dat";
|
||||
massin.close();
|
||||
massin.open(massFile.c_str());
|
||||
std::cout << "Mass evaluation file mass2020.dat not found, current file: " << massFile.c_str() << std::endl;
|
||||
|
||||
if (!massin.is_open())
|
||||
{
|
||||
massFile = dataPath + "/mass2003.dat";
|
||||
massin.close();
|
||||
massin.open(massFile.c_str());
|
||||
std::cout << "Mass evaluation file mass2016.dat not found, current file: " << massFile.c_str() << std::endl;
|
||||
}
|
||||
for (G4int i = 0; i < rows; i++) {
|
||||
for (G4int j = 0; j < cols; j++) {
|
||||
flalphain >> fflalpha;
|
||||
frldmin >> ffrldm;
|
||||
vgsldin >> fvgsld;
|
||||
rmsin >> frms;
|
||||
setAlpha(j, i, fflalpha);
|
||||
setEcnz(j, i, ffrldm);
|
||||
setVgsld(j, i, fvgsld);
|
||||
setRms(j, i, frms);
|
||||
}
|
||||
}
|
||||
|
||||
std::filebuf* buf1 = flalphain.rdbuf();
|
||||
std::filebuf* buf2 = frldmin.rdbuf();
|
||||
std::filebuf* buf3 = vgsldin.rdbuf();
|
||||
std::filebuf* buf4 = rmsin.rdbuf();
|
||||
std::filebuf* buf5 = defoin.rdbuf();
|
||||
std::filebuf* buf6 = massin.rdbuf();
|
||||
if (!((buf1->is_open()) && (buf2->is_open()) && (buf3->is_open()) && (buf4->is_open()) && (buf5->is_open()) &&
|
||||
(buf6->is_open())))
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "Data missing: could not find ABLA data file in " << dataPath
|
||||
<< "defined by environment variable G4ABLADATA" << G4endl;
|
||||
G4Exception("G4AblaDataFile::readData()", "ABLA", FatalException, ed);
|
||||
}
|
||||
|
||||
G4double fflalpha, ffrldm, fvgsld, frms;
|
||||
G4int fj = 0, fk = 0, a2, a3, a4;
|
||||
G4double fbeta2, fbeta4;
|
||||
G4double a7;
|
||||
const G4int rows = 99;
|
||||
const G4int cols = 154;
|
||||
const G4int rowsbeta = 137;
|
||||
const G4int colsbeta = 251;
|
||||
|
||||
for (G4int i = 0; i < zcols; i++)
|
||||
{
|
||||
for (G4int j = 0; j < nrows; j++)
|
||||
{
|
||||
setAlpha(j, i, 0.0);
|
||||
setEcnz(j, i, 0.0);
|
||||
setVgsld(j, i, 0.0);
|
||||
setRms(j, i, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
for (G4int i = 0; i < rows; i++)
|
||||
{
|
||||
for (G4int j = 0; j < cols; j++)
|
||||
{
|
||||
flalphain >> fflalpha;
|
||||
frldmin >> ffrldm;
|
||||
vgsldin >> fvgsld;
|
||||
rmsin >> frms;
|
||||
setAlpha(j, i, fflalpha);
|
||||
setEcnz(j, i, ffrldm);
|
||||
setVgsld(j, i, fvgsld);
|
||||
setRms(j, i, frms);
|
||||
}
|
||||
}
|
||||
|
||||
for (G4int i = 0; i < rowsbeta; i++)
|
||||
{
|
||||
for (G4int j = 0; j < colsbeta; j++)
|
||||
{
|
||||
setBeta2(j, i, 0.0);
|
||||
setBeta4(j, i, 0.0);
|
||||
}
|
||||
for (G4int i = 0; i < rowsbeta; i++) {
|
||||
for (G4int j = 0; j < colsbeta; j++) {
|
||||
setBeta2(j, i, 0.0);
|
||||
setBeta4(j, i, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
defoin >> fj >> fk >> fbeta2 >> fbeta4;
|
||||
while (!defoin.eof()) {
|
||||
setBeta2(fk, fj, fbeta2);
|
||||
setBeta4(fk, fj, fbeta4);
|
||||
defoin >> fj >> fk >> fbeta2 >> fbeta4;
|
||||
while (!defoin.eof())
|
||||
{
|
||||
setBeta2(fk, fj, fbeta2);
|
||||
setBeta4(fk, fj, fbeta4);
|
||||
defoin >> fj >> fk >> fbeta2 >> fbeta4;
|
||||
}
|
||||
}
|
||||
|
||||
for (G4int i = 0; i < zcols; i++)
|
||||
{
|
||||
for (G4int j = 0; j < nrows; j++)
|
||||
{
|
||||
setMexp(j, i, 0.0);
|
||||
setMexpID(j, i, 0);
|
||||
}
|
||||
for (G4int i = 0; i < zcols; i++) {
|
||||
for (G4int j = 0; j < nrows; j++) {
|
||||
setMexp(j, i, 0.0);
|
||||
setMexpID(j, i, 0);
|
||||
}
|
||||
}
|
||||
massin >> a2 >> a3 >> a4 >> a7;
|
||||
while (!massin.eof()) {
|
||||
//
|
||||
if (a3 < lpcols) {
|
||||
setMexpID(a2, a3, 1);
|
||||
setMexp(a2, a3, 938.7829835 * a3 + 939.5653301 * a2 - 1. * a4 * a7 / 1000.);
|
||||
}
|
||||
massin >> a2 >> a3 >> a4 >> a7;
|
||||
while (!massin.eof())
|
||||
{
|
||||
//
|
||||
if (a3 < lpcols)
|
||||
{
|
||||
setMexpID(a2, a3, 1);
|
||||
setMexp(a2, a3, 938.7829835 * a3 + 939.5653301 * a2 - 1. * a4 * a7 / 1000.);
|
||||
}
|
||||
massin >> a2 >> a3 >> a4 >> a7;
|
||||
}
|
||||
}
|
||||
|
||||
flalphain.close();
|
||||
frldmin.close();
|
||||
vgsldin.close();
|
||||
rmsin.close();
|
||||
defoin.close();
|
||||
massin.close();
|
||||
flalphain.close();
|
||||
frldmin.close();
|
||||
vgsldin.close();
|
||||
rmsin.close();
|
||||
defoin.close();
|
||||
massin.close();
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -31,11 +31,8 @@
|
||||
// Aatos Heikkinen, HIP (project coordination)
|
||||
//
|
||||
|
||||
#include "globals.hh"
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
#include "G4AblaInterface.hh"
|
||||
|
||||
#include "G4DoubleHyperDoubleNeutron.hh"
|
||||
#include "G4DoubleHyperH4.hh"
|
||||
#include "G4DynamicParticle.hh"
|
||||
@@ -51,236 +48,229 @@
|
||||
#include "G4ReactionProduct.hh"
|
||||
#include "G4ReactionProductVector.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
G4AblaInterface::G4AblaInterface(G4ExcitationHandler* ptr)
|
||||
: G4VPreCompoundModel(ptr, "ABLAXX")
|
||||
, ablaResult(new G4VarNtp)
|
||||
, theABLAModel(new G4Abla(ablaResult))
|
||||
, eventNumber(0)
|
||||
, secID(-1)
|
||||
, isInitialised(false)
|
||||
: G4VPreCompoundModel(ptr, "ABLAXX"),
|
||||
ablaResult(new G4VarNtp),
|
||||
theABLAModel(new G4Abla(ablaResult)),
|
||||
eventNumber(0),
|
||||
secID(-1),
|
||||
isInitialised(false)
|
||||
{
|
||||
secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName());
|
||||
// G4cout << "### NEW PrecompoundModel " << this << G4endl;
|
||||
if (!ptr)
|
||||
SetExcitationHandler(new G4ExcitationHandler);
|
||||
InitialiseModel();
|
||||
G4cout << G4endl << "G4AblaInterface::InitialiseModel() was right." << G4endl;
|
||||
secID = G4PhysicsModelCatalog::GetModelID("model_" + GetModelName());
|
||||
// G4cout << "### NEW PrecompoundModel " << this << G4endl;
|
||||
if (!ptr) SetExcitationHandler(new G4ExcitationHandler);
|
||||
InitialiseModel();
|
||||
G4cout << G4endl << "G4AblaInterface::InitialiseModel() was right." << G4endl;
|
||||
}
|
||||
|
||||
G4AblaInterface::~G4AblaInterface()
|
||||
{
|
||||
applyYourselfResult.Clear();
|
||||
delete ablaResult;
|
||||
delete theABLAModel;
|
||||
delete GetExcitationHandler();
|
||||
applyYourselfResult.Clear();
|
||||
delete ablaResult;
|
||||
delete theABLAModel;
|
||||
delete GetExcitationHandler();
|
||||
}
|
||||
|
||||
void G4AblaInterface::BuildPhysicsTable(const G4ParticleDefinition&) { InitialiseModel(); }
|
||||
void G4AblaInterface::BuildPhysicsTable(const G4ParticleDefinition&)
|
||||
{
|
||||
InitialiseModel();
|
||||
}
|
||||
|
||||
void G4AblaInterface::InitialiseModel()
|
||||
{
|
||||
if (isInitialised)
|
||||
return;
|
||||
isInitialised = true;
|
||||
theABLAModel->initEvapora();
|
||||
theABLAModel->SetParameters();
|
||||
GetExcitationHandler()->Initialise();
|
||||
if (isInitialised) return;
|
||||
isInitialised = true;
|
||||
theABLAModel->initEvapora();
|
||||
theABLAModel->SetParameters();
|
||||
GetExcitationHandler()->Initialise();
|
||||
}
|
||||
|
||||
G4HadFinalState* G4AblaInterface::ApplyYourself(const G4HadProjectile& thePrimary, G4Nucleus& theNucleus)
|
||||
G4HadFinalState* G4AblaInterface::ApplyYourself(const G4HadProjectile& thePrimary,
|
||||
G4Nucleus& theNucleus)
|
||||
{
|
||||
// This method is adapted from G4PreCompoundModel::ApplyYourself,
|
||||
// and it is used only by Binary Cascade (BIC) when the latter is coupled with
|
||||
// Abla for nuclear de-excitation. This method allows BIC+ABLA to be used also
|
||||
// for proton and neutron projectile with kinetic energies below 45 MeV, by
|
||||
// creating a "compound" nucleus made by the system "target nucleus +
|
||||
// projectile", before calling the DeExcite method.
|
||||
const G4ParticleDefinition* primary = thePrimary.GetDefinition();
|
||||
if (primary != G4Neutron::Definition() && primary != G4Proton::Definition())
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4AblaModel is used for ";
|
||||
if (primary)
|
||||
ed << primary->GetParticleName();
|
||||
G4Exception("G4AblaInterface::ApplyYourself()", "had040", FatalException, ed, "");
|
||||
return nullptr;
|
||||
}
|
||||
// This method is adapted from G4PreCompoundModel::ApplyYourself,
|
||||
// and it is used only by Binary Cascade (BIC) when the latter is coupled with
|
||||
// Abla for nuclear de-excitation. This method allows BIC+ABLA to be used also
|
||||
// for proton and neutron projectile with kinetic energies below 45 MeV, by
|
||||
// creating a "compound" nucleus made by the system "target nucleus +
|
||||
// projectile", before calling the DeExcite method.
|
||||
const G4ParticleDefinition* primary = thePrimary.GetDefinition();
|
||||
if (primary != G4Neutron::Definition() && primary != G4Proton::Definition()) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4AblaModel is used for ";
|
||||
if (primary) ed << primary->GetParticleName();
|
||||
G4Exception("G4AblaInterface::ApplyYourself()", "had040", FatalException, ed, "");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
G4int Zp = 0;
|
||||
G4int Ap = 1;
|
||||
if (primary == G4Proton::Definition())
|
||||
Zp = 1;
|
||||
G4double timePrimary = thePrimary.GetGlobalTime();
|
||||
G4int A = theNucleus.GetA_asInt();
|
||||
G4int Z = theNucleus.GetZ_asInt();
|
||||
G4LorentzVector p = thePrimary.Get4Momentum();
|
||||
G4double mass = G4NucleiProperties::GetNuclearMass(A, Z);
|
||||
p += G4LorentzVector(0.0, 0.0, 0.0, mass);
|
||||
G4int Zp = 0;
|
||||
G4int Ap = 1;
|
||||
if (primary == G4Proton::Definition()) Zp = 1;
|
||||
G4double timePrimary = thePrimary.GetGlobalTime();
|
||||
G4int A = theNucleus.GetA_asInt();
|
||||
G4int Z = theNucleus.GetZ_asInt();
|
||||
G4LorentzVector p = thePrimary.Get4Momentum();
|
||||
G4double mass = G4NucleiProperties::GetNuclearMass(A, Z);
|
||||
p += G4LorentzVector(0.0, 0.0, 0.0, mass);
|
||||
|
||||
G4Fragment anInitialState(A + Ap, Z + Zp, p);
|
||||
anInitialState.SetNumberOfExcitedParticle(1, Zp);
|
||||
anInitialState.SetNumberOfHoles(1, Zp);
|
||||
anInitialState.SetCreationTime(thePrimary.GetGlobalTime());
|
||||
anInitialState.SetCreatorModelID(secID);
|
||||
G4Fragment anInitialState(A + Ap, Z + Zp, p);
|
||||
anInitialState.SetNumberOfExcitedParticle(1, Zp);
|
||||
anInitialState.SetNumberOfHoles(1, Zp);
|
||||
anInitialState.SetCreationTime(thePrimary.GetGlobalTime());
|
||||
anInitialState.SetCreatorModelID(secID);
|
||||
|
||||
G4ReactionProductVector* deExciteResult = DeExcite(anInitialState);
|
||||
G4ReactionProductVector* deExciteResult = DeExcite(anInitialState);
|
||||
|
||||
applyYourselfResult.Clear();
|
||||
applyYourselfResult.SetStatusChange(stopAndKill);
|
||||
for (auto const& prod : *deExciteResult)
|
||||
{
|
||||
G4DynamicParticle* aNewDP =
|
||||
new G4DynamicParticle(prod->GetDefinition(), prod->GetTotalEnergy(), prod->GetMomentum());
|
||||
G4HadSecondary aNew = G4HadSecondary(aNewDP);
|
||||
G4double time = std::max(prod->GetFormationTime(), 0.0);
|
||||
aNew.SetTime(timePrimary + time);
|
||||
aNew.SetCreatorModelID(prod->GetCreatorModelID());
|
||||
delete prod;
|
||||
applyYourselfResult.AddSecondary(aNew);
|
||||
}
|
||||
delete deExciteResult;
|
||||
return &applyYourselfResult;
|
||||
applyYourselfResult.Clear();
|
||||
applyYourselfResult.SetStatusChange(stopAndKill);
|
||||
for (auto const& prod : *deExciteResult) {
|
||||
G4DynamicParticle* aNewDP =
|
||||
new G4DynamicParticle(prod->GetDefinition(), prod->GetTotalEnergy(), prod->GetMomentum());
|
||||
G4HadSecondary aNew = G4HadSecondary(aNewDP);
|
||||
G4double time = std::max(prod->GetFormationTime(), 0.0);
|
||||
aNew.SetTime(timePrimary + time);
|
||||
aNew.SetCreatorModelID(prod->GetCreatorModelID());
|
||||
delete prod;
|
||||
applyYourselfResult.AddSecondary(aNew);
|
||||
}
|
||||
delete deExciteResult;
|
||||
return &applyYourselfResult;
|
||||
}
|
||||
|
||||
G4ReactionProductVector* G4AblaInterface::DeExcite(G4Fragment& aFragment)
|
||||
{
|
||||
if (!isInitialised)
|
||||
InitialiseModel();
|
||||
if (!isInitialised) InitialiseModel();
|
||||
|
||||
ablaResult->clear();
|
||||
ablaResult->clear();
|
||||
|
||||
const G4int ARem = aFragment.GetA_asInt();
|
||||
const G4int ZRem = aFragment.GetZ_asInt();
|
||||
const G4int SRem = -aFragment.GetNumberOfLambdas(); // Strangeness = - (Number of lambdas)
|
||||
const G4double eStarRem = aFragment.GetExcitationEnergy() / MeV;
|
||||
const G4double jRem = aFragment.GetAngularMomentum().mag() / hbar_Planck;
|
||||
const G4LorentzVector& pRem = aFragment.GetMomentum();
|
||||
const G4double pxRem = pRem.x() / MeV;
|
||||
const G4double pyRem = pRem.y() / MeV;
|
||||
const G4double pzRem = pRem.z() / MeV;
|
||||
const G4int ARem = aFragment.GetA_asInt();
|
||||
const G4int ZRem = aFragment.GetZ_asInt();
|
||||
const G4int SRem = -aFragment.GetNumberOfLambdas(); // Strangeness = - (Number of lambdas)
|
||||
const G4double eStarRem = aFragment.GetExcitationEnergy() / MeV;
|
||||
const G4double jRem = aFragment.GetAngularMomentum().mag() / hbar_Planck;
|
||||
const G4LorentzVector& pRem = aFragment.GetMomentum();
|
||||
const G4double pxRem = pRem.x() / MeV;
|
||||
const G4double pyRem = pRem.y() / MeV;
|
||||
const G4double pzRem = pRem.z() / MeV;
|
||||
|
||||
++eventNumber;
|
||||
++eventNumber;
|
||||
|
||||
theABLAModel->DeexcitationAblaxx(ARem, ZRem, eStarRem, jRem, pxRem, pyRem, pzRem, (G4int)eventNumber, SRem);
|
||||
theABLAModel->DeexcitationAblaxx(ARem, ZRem, eStarRem, jRem, pxRem, pyRem, pzRem,
|
||||
(G4int)eventNumber, SRem);
|
||||
|
||||
G4ReactionProductVector* result = new G4ReactionProductVector;
|
||||
G4ReactionProductVector* result = new G4ReactionProductVector;
|
||||
|
||||
for (G4int j = 0; j < ablaResult->ntrack; ++j)
|
||||
{ // Copy ABLA result to the EventInfo
|
||||
G4ReactionProduct* product = toG4Particle(ablaResult->avv[j],
|
||||
ablaResult->zvv[j],
|
||||
ablaResult->svv[j],
|
||||
ablaResult->enerj[j],
|
||||
ablaResult->pxlab[j],
|
||||
ablaResult->pylab[j],
|
||||
ablaResult->pzlab[j]);
|
||||
if (product)
|
||||
{
|
||||
product->SetCreatorModelID(secID);
|
||||
result->push_back(product);
|
||||
}
|
||||
for (G4int j = 0; j < ablaResult->ntrack; ++j) { // Copy ABLA result to the EventInfo
|
||||
G4ReactionProduct* product =
|
||||
toG4Particle(ablaResult->avv[j], ablaResult->zvv[j], ablaResult->svv[j], ablaResult->enerj[j],
|
||||
ablaResult->pxlab[j], ablaResult->pylab[j], ablaResult->pzlab[j]);
|
||||
if (product) {
|
||||
product->SetCreatorModelID(secID);
|
||||
result->push_back(product);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
G4ParticleDefinition* G4AblaInterface::toG4ParticleDefinition(G4int A, G4int Z, G4int S) const
|
||||
{
|
||||
if (A == 1 && Z == 1 && S == 0)
|
||||
return G4Proton::Proton();
|
||||
else if (A == 1 && Z == 0 && S == 0)
|
||||
return G4Neutron::Neutron();
|
||||
else if (A == 1 && Z == 0 && S == -1)
|
||||
return G4Lambda::Lambda();
|
||||
else if (A == -1 && Z == 1 && S == 0)
|
||||
return G4PionPlus::PionPlus();
|
||||
else if (A == -1 && Z == -1 && S == 0)
|
||||
return G4PionMinus::PionMinus();
|
||||
else if (A == -1 && Z == 0 && S == 0)
|
||||
return G4PionZero::PionZero();
|
||||
else if (A == 0 && Z == 0 && S == 0)
|
||||
return G4Gamma::Gamma();
|
||||
else if (A == 2 && Z == 1 && S == 0)
|
||||
return G4Deuteron::Deuteron();
|
||||
else if (A == 3 && Z == 1 && S == 0)
|
||||
return G4Triton::Triton();
|
||||
else if (A == 3 && Z == 2 && S == 0)
|
||||
return G4He3::He3();
|
||||
else if (A == 3 && Z == 1 && S == -1)
|
||||
return G4HyperTriton::Definition();
|
||||
else if (A == 4 && Z == 2 && S == 0)
|
||||
return G4Alpha::Alpha();
|
||||
else if (A == 4 && Z == 1 && S == -1)
|
||||
return G4HyperH4::Definition();
|
||||
else if (A == 4 && Z == 2 && S == -1)
|
||||
return G4HyperAlpha::Definition();
|
||||
else if (A == 4 && Z == 1 && S == -2)
|
||||
return G4DoubleHyperH4::Definition();
|
||||
else if (A == 4 && Z == 0 && S == -2)
|
||||
return G4DoubleHyperDoubleNeutron::Definition();
|
||||
else if (A == 5 && Z == 2 && S == -1)
|
||||
return G4HyperHe5::Definition();
|
||||
else if (A > 0 && Z > 0 && A > Z)
|
||||
{ // Returns ground state ion definition.
|
||||
auto ionfromtable = G4IonTable::GetIonTable()->GetIon(Z, A, std::abs(S), 0); // S is the number of lambdas
|
||||
if (ionfromtable)
|
||||
return ionfromtable;
|
||||
else
|
||||
{
|
||||
G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S
|
||||
<< " to G4ParticleDefinition, trouble ahead" << G4endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // Error, unrecognized particle
|
||||
G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S
|
||||
<< " to G4ParticleDefinition, trouble ahead" << G4endl;
|
||||
return 0;
|
||||
if (A == 1 && Z == 1 && S == 0)
|
||||
return G4Proton::Proton();
|
||||
else if (A == 1 && Z == 0 && S == 0)
|
||||
return G4Neutron::Neutron();
|
||||
else if (A == 1 && Z == 0 && S == -1)
|
||||
return G4Lambda::Lambda();
|
||||
else if (A == -1 && Z == 1 && S == 0)
|
||||
return G4PionPlus::PionPlus();
|
||||
else if (A == -1 && Z == -1 && S == 0)
|
||||
return G4PionMinus::PionMinus();
|
||||
else if (A == -1 && Z == 0 && S == 0)
|
||||
return G4PionZero::PionZero();
|
||||
else if (A == 0 && Z == 0 && S == 0)
|
||||
return G4Gamma::Gamma();
|
||||
else if (A == 2 && Z == 1 && S == 0)
|
||||
return G4Deuteron::Deuteron();
|
||||
else if (A == 3 && Z == 1 && S == 0)
|
||||
return G4Triton::Triton();
|
||||
else if (A == 3 && Z == 2 && S == 0)
|
||||
return G4He3::He3();
|
||||
else if (A == 3 && Z == 1 && S == -1)
|
||||
return G4HyperTriton::Definition();
|
||||
else if (A == 4 && Z == 2 && S == 0)
|
||||
return G4Alpha::Alpha();
|
||||
else if (A == 4 && Z == 1 && S == -1)
|
||||
return G4HyperH4::Definition();
|
||||
else if (A == 4 && Z == 2 && S == -1)
|
||||
return G4HyperAlpha::Definition();
|
||||
else if (A == 4 && Z == 1 && S == -2)
|
||||
return G4DoubleHyperH4::Definition();
|
||||
else if (A == 4 && Z == 0 && S == -2)
|
||||
return G4DoubleHyperDoubleNeutron::Definition();
|
||||
else if (A == 5 && Z == 2 && S == -1)
|
||||
return G4HyperHe5::Definition();
|
||||
else if (A > 0 && Z > 0 && A > Z) { // Returns ground state ion definition.
|
||||
auto ionfromtable =
|
||||
G4IonTable::GetIonTable()->GetIon(Z, A, std::abs(S), 0); // S is the number of lambdas
|
||||
if (ionfromtable)
|
||||
return ionfromtable;
|
||||
else {
|
||||
G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S
|
||||
<< " to G4ParticleDefinition, trouble ahead" << G4endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else { // Error, unrecognized particle
|
||||
G4cout << "Can't convert particle with A=" << A << ", Z=" << Z << ", S=" << S
|
||||
<< " to G4ParticleDefinition, trouble ahead" << G4endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
G4ReactionProduct*
|
||||
G4AblaInterface::toG4Particle(G4int A, G4int Z, G4int S, G4double kinE, G4double px, G4double py, G4double pz) const
|
||||
G4ReactionProduct* G4AblaInterface::toG4Particle(G4int A, G4int Z, G4int S, G4double kinE,
|
||||
G4double px, G4double py, G4double pz) const
|
||||
{
|
||||
G4ParticleDefinition* def = toG4ParticleDefinition(A, Z, S);
|
||||
if (def == 0)
|
||||
{ // Check if we have a valid particle definition
|
||||
return 0;
|
||||
}
|
||||
G4ParticleDefinition* def = toG4ParticleDefinition(A, Z, S);
|
||||
if (def == 0) { // Check if we have a valid particle definition
|
||||
return 0;
|
||||
}
|
||||
|
||||
const G4double energy = kinE * MeV;
|
||||
const G4ThreeVector momentum(px, py, pz);
|
||||
const G4ThreeVector momentumDirection = momentum.unit();
|
||||
G4DynamicParticle p(def, momentumDirection, energy);
|
||||
G4ReactionProduct* r = new G4ReactionProduct(def);
|
||||
(*r) = p;
|
||||
return r;
|
||||
const G4double energy = kinE * MeV;
|
||||
const G4ThreeVector momentum(px, py, pz);
|
||||
const G4ThreeVector momentumDirection = momentum.unit();
|
||||
G4DynamicParticle p(def, momentumDirection, energy);
|
||||
G4ReactionProduct* r = new G4ReactionProduct(def);
|
||||
(*r) = p;
|
||||
return r;
|
||||
}
|
||||
|
||||
void G4AblaInterface::ModelDescription(std::ostream& outFile) const
|
||||
{
|
||||
outFile << "ABLA++ does not provide an implementation of the ApplyYourself "
|
||||
"method!\n\n";
|
||||
outFile << "ABLA++ does not provide an implementation of the ApplyYourself "
|
||||
"method!\n\n";
|
||||
}
|
||||
|
||||
void G4AblaInterface::DeExciteModelDescription(std::ostream& outFile) const
|
||||
{
|
||||
outFile << "ABLA++ is a statistical model for nuclear de-excitation. It simulates\n"
|
||||
<< "the gamma emission and the evaporation of neutrons, light charged\n"
|
||||
<< "particles and IMFs, as well as fission where applicable. The code\n"
|
||||
<< "included in Geant4 is a C++ translation of the original Fortran\n"
|
||||
<< "code ABLA07. Although the model has been recently extended to\n"
|
||||
<< "hypernuclei by including the evaporation of lambda particles.\n"
|
||||
<< "More details about the physics are available in the Geant4\n"
|
||||
<< "Physics Reference Manual and in the reference articles.\n\n"
|
||||
<< "References:\n"
|
||||
<< "(1) A. Kelic, M. V. Ricciardi, and K. H. Schmidt, in Proceedings of Joint\n"
|
||||
<< "ICTP-IAEA Advanced Workshop on Model Codes for Spallation Reactions,\n"
|
||||
<< "ICTP Trieste, Italy, 4–8 February 2008, edited by D. Filges, S. "
|
||||
"Leray, Y. Yariv, A. Mengoni, A. Stanculescu, and G. Mank (IAEA "
|
||||
"INDC(NDS)-530, Vienna, 2008), pp. 181–221.\n\n"
|
||||
<< "(2) J.L. Rodriguez-Sanchez, J.-C. David et al., Phys. Rev. C 98, 021602R (2018)\n"
|
||||
<< "(3) J.L. Rodriguez-Sanchez et al., Phys. Rev. C 105, 014623 (2022)\n"
|
||||
<< "(4) J.L. Rodriguez-Sanchez et al., Phys. Rev. Lett. 130, 132501 (2023)\n\n";
|
||||
outFile << "ABLA++ is a statistical model for nuclear de-excitation. It simulates\n"
|
||||
<< "the gamma emission and the evaporation of neutrons, light charged\n"
|
||||
<< "particles and IMFs, as well as fission where applicable. The code\n"
|
||||
<< "included in Geant4 is a C++ translation of the original Fortran\n"
|
||||
<< "code ABLA07. Although the model has been recently extended to\n"
|
||||
<< "hypernuclei by including the evaporation of lambda particles.\n"
|
||||
<< "More details about the physics are available in the Geant4\n"
|
||||
<< "Physics Reference Manual and in the reference articles.\n\n"
|
||||
<< "References:\n"
|
||||
<< "(1) A. Kelic, M. V. Ricciardi, and K. H. Schmidt, in Proceedings of Joint\n"
|
||||
<< "ICTP-IAEA Advanced Workshop on Model Codes for Spallation Reactions,\n"
|
||||
<< "ICTP Trieste, Italy, 4–8 February 2008, edited by D. Filges, S. "
|
||||
"Leray, Y. Yariv, A. Mengoni, A. Stanculescu, and G. Mank (IAEA "
|
||||
"INDC(NDS)-530, Vienna, 2008), pp. 181–221.\n\n"
|
||||
<< "(2) J.L. Rodriguez-Sanchez, J.-C. David et al., Phys. Rev. C 98, 021602R (2018)\n"
|
||||
<< "(3) J.L. Rodriguez-Sanchez et al., Phys. Rev. C 105, 014623 (2022)\n"
|
||||
<< "(4) J.L. Rodriguez-Sanchez et al., Phys. Rev. Lett. 130, 132501 (2023)\n\n";
|
||||
}
|
||||
|
||||
@@ -32,11 +32,15 @@
|
||||
//
|
||||
|
||||
#include "G4AblaRandom.hh"
|
||||
|
||||
#include "Randomize.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
namespace G4AblaRandom
|
||||
{
|
||||
|
||||
G4double flat() { return G4UniformRand(); }
|
||||
} // namespace G4AblaRandom
|
||||
G4double flat()
|
||||
{
|
||||
return G4UniformRand();
|
||||
}
|
||||
} // namespace G4AblaRandom
|
||||
|
||||
@@ -32,78 +32,103 @@
|
||||
//
|
||||
|
||||
#include "G4AblaVirtualData.hh"
|
||||
|
||||
#include "globals.hh"
|
||||
|
||||
G4AblaVirtualData::G4AblaVirtualData() {}
|
||||
|
||||
G4bool G4AblaVirtualData::setAlpha(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
alpha[A][Z] = value;
|
||||
alpha[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setEcnz(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
ecnz[A][Z] = value;
|
||||
ecnz[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setVgsld(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
vgsld[A][Z] = value;
|
||||
vgsld[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setRms(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
rms[A][Z] = value;
|
||||
rms[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setMexp(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
mexp[A][Z] = value;
|
||||
mexp[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setMexpID(G4int A, G4int Z, G4int value)
|
||||
{
|
||||
mexpid[A][Z] = value;
|
||||
mexpid[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setBeta2(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
beta2[A][Z] = value;
|
||||
beta2[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4bool G4AblaVirtualData::setBeta4(G4int A, G4int Z, G4double value)
|
||||
{
|
||||
beta4[A][Z] = value;
|
||||
beta4[A][Z] = value;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getAlpha(G4int A, G4int Z) { return alpha[A][Z]; }
|
||||
G4double G4AblaVirtualData::getAlpha(G4int A, G4int Z)
|
||||
{
|
||||
return alpha[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getEcnz(G4int A, G4int Z) { return ecnz[A][Z]; }
|
||||
G4double G4AblaVirtualData::getEcnz(G4int A, G4int Z)
|
||||
{
|
||||
return ecnz[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getVgsld(G4int A, G4int Z) { return vgsld[A][Z]; }
|
||||
G4double G4AblaVirtualData::getVgsld(G4int A, G4int Z)
|
||||
{
|
||||
return vgsld[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getRms(G4int A, G4int Z) { return rms[A][Z]; }
|
||||
G4double G4AblaVirtualData::getRms(G4int A, G4int Z)
|
||||
{
|
||||
return rms[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getMexp(G4int A, G4int Z) { return mexp[A][Z]; }
|
||||
G4double G4AblaVirtualData::getMexp(G4int A, G4int Z)
|
||||
{
|
||||
return mexp[A][Z];
|
||||
}
|
||||
|
||||
G4int G4AblaVirtualData::getMexpID(G4int A, G4int Z) { return mexpid[A][Z]; }
|
||||
G4int G4AblaVirtualData::getMexpID(G4int A, G4int Z)
|
||||
{
|
||||
return mexpid[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getBeta2(G4int A, G4int Z) { return beta2[A][Z]; }
|
||||
G4double G4AblaVirtualData::getBeta2(G4int A, G4int Z)
|
||||
{
|
||||
return beta2[A][Z];
|
||||
}
|
||||
|
||||
G4double G4AblaVirtualData::getBeta4(G4int A, G4int Z) { return beta4[A][Z]; }
|
||||
G4double G4AblaVirtualData::getBeta4(G4int A, G4int Z)
|
||||
{
|
||||
return beta4[A][Z];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user