Import Geant4 11.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2025-12-05 08:54:02 +01:00
parent a499fb82e9
commit b4a16de652
6484 changed files with 232674 additions and 221097 deletions
@@ -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, 48 February 2008, edited by D. Filges, S. "
"Leray, Y. Yariv, A. Mengoni, A. Stanculescu, and G. Mank (IAEA "
"INDC(NDS)-530, Vienna, 2008), pp. 181221.\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, 48 February 2008, edited by D. Filges, S. "
"Leray, Y. Yariv, A. Mengoni, A. Stanculescu, and G. Mank (IAEA "
"INDC(NDS)-530, Vienna, 2008), pp. 181221.\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];
}