32 #define ABLAXX_IN_GEANT4_MODE 1
52 fissionDistri(A,Z,E,A1,Z1,E1,K1,A2,Z2,E2,K2);
88 G4double r_in = 0.0, r_rest = 0.0, r_help = 0.0;
94 r_in = r_origin + 0.5;
95 r_floor = (float)((
int)(r_in));
96 if (r_even_odd < 0.001) {
97 i_out = (int)(r_floor);
100 r_rest = r_in - r_floor;
101 r_middle = r_floor + 0.5;
102 n_floor = (int)(r_floor);
103 if (n_floor%2 == 0) {
105 r_help = r_middle + (r_rest - 0.5) * (1.0 - r_even_odd);
109 r_help = r_middle + (r_rest - 0.5) * (1.0 + r_even_odd);
111 i_out = (int)(r_help);
127 G4double xcom = 0.0, xvs = 0.0, xe = 0.0;
131 alpha = ( std::sqrt(5.0/(4.0*pi)) ) * beta;
133 xcom = 1.0 - 1.7826 * ((a - 2.0*
z)/a)*((a - 2.0*
z)/a);
135 xvs = - xcom * ( 15.4941 * a -
136 17.9439 * std::pow(a,2.0/3.0) * (1.0+0.4*alpha*
alpha) );
138 xe = z*z * (0.7053/(std::pow(a,1.0/3.0)) * (1.0-0.2*alpha*alpha) - 1.1529/
a);
164 dtot = r0 * ( std::pow((z1+n1),1.0/3.0) * (1.0+0.6666*beta1)
165 + std::pow((z2+n2),1.0/3.0) * (1.0+0.6666*beta2) ) + d;
166 fecoul = z1 * z2 * 1.44 / dtot;
249 G4double aheavy1 = 0.0, aheavy2 = 0.0;
251 G4double zheavy1_shell = 0.0, zheavy2_shell = 0.0;
253 G4double sasymm1 = 0.0, sasymm2 = 0.0, ssymm = 0.0, ysum = 0.0;
254 G4double ssymm_mode1 = 0.0, ssymm_mode2 = 0.0;
256 G4double wzasymm1_saddle, wzasymm2_saddle, wzsymm_saddle = 0.0;
257 G4double wzasymm1_scission = 0.0, wzasymm2_scission = 0.0, wzsymm_scission = 0.0;
258 G4double wzasymm1 = 0.0, wzasymm2 = 0.0, wzsymm = 0.0;
261 G4double z1mean = 0.0, z1width = 0.0;
265 G4double zsymm = 0.0, nsymm = 0.0, asymm = 0.0;
266 G4double n1mean = 0.0, n1width = 0.0;
269 G4double re1 = 0.0, re2 = 0.0, re3 = 0.0;
279 G4double a_levdens_heavy1 = 0.0, a_levdens_heavy2 = 0.0;
282 G4double epsilon_1_saddle = 0.0, epsilon0_1_saddle = 0.0;
283 G4double epsilon_2_saddle = 0.0, epsilon0_2_saddle = 0.0, epsilon_symm_saddle = 0.0;
284 G4double epsilon_1_scission = 0.0, epsilon0_1_scission = 0.0;
285 G4double epsilon_2_scission = 0.0, epsilon0_2_scission = 0.0;
286 G4double epsilon_symm_scission = 0.0;
288 G4double e_eff1_saddle = 0.0, e_eff2_saddle = 0.0;
289 G4int icz = 0, k = 0;
293 G4double ed1_low = 0.0, ed2_low = 0.0, ed1_high = 0.0, ed2_high = 0.0, ed1 = 0.0, ed2 = 0.0;
316 const G4double delta_u1_shell = -2.5;
319 const G4double delta_u2_shell = -5.5;
322 const G4double cz_asymm1_shell = 0.7;
324 const G4double cz_asymm2_shell = 0.08;
344 const G4double friction_factor = 1.0;
376 const G4int itest = 0;
378 G4double reps1 = 0.0, reps2 = 0.0, rn1_pol = 0.0;
392 if ( (std::pow(z,2)/a < 25.0) || (n < nheavy2) || (e > 500.0) ) {
404 zheavy1_shell = ((nheavy1/
n) * z) - 0.8;
406 zheavy2_shell = ((nheavy2/
n) * z) - 0.8;
412 e_saddle_scission = (3.535 * std::pow(z,2)/a - 121.1) * friction_factor;
418 if (e_saddle_scission < 0.0) {
419 e_saddle_scission = 0.0;
433 if ( (std::pow(z,2))/a < 33.9186) {
434 masscurv = std::pow( 10.0,(-1.093364 + 0.082933 * (std::pow(z,2)/a)
435 - 0.0002602 * (std::pow(z,4)/std::pow(a,2))) );
437 masscurv = std::pow( 10.0,(3.053536 - 0.056477 * (std::pow(z,2)/a)
438 + 0.0002454 * (std::pow(z,4)/std::pow(a,2))) );
441 cz_symm = (8.0/std::pow(z,2)) * masscurv;
457 asymm = nsymm + zsymm;
459 zheavy1 = (cz_symm*zsymm + cz_asymm1_shell*zheavy1_shell)/(cz_symm + cz_asymm1_shell);
460 zheavy2 = (cz_symm*zsymm + cz_asymm2_shell*zheavy2_shell)/(cz_symm + cz_asymm2_shell);
463 nheavy1_eff = (zheavy1 + 0.8)*(n/
z);
464 nheavy2_eff = (zheavy2 + 0.8)*(n/
z);
465 aheavy1 = nheavy1_eff + zheavy1;
466 aheavy2 = nheavy2_eff + zheavy2;
472 a_levdens_heavy1 = aheavy1 / 8.0;
473 a_levdens_heavy2 = aheavy2 / 8.0;
474 gamma = a_levdens / (0.4 * (std::pow(a,1.3333)) );
475 gamma_heavy1 = ( a_levdens_heavy1 / (0.4 * (std::pow(aheavy1,1.3333)) ) ) * fgamma1;
476 gamma_heavy2 = a_levdens_heavy2 / (0.4 * (std::pow(aheavy2,1.3333)) );
480 cn =
umass(zsymm,(nsymm+1.),0.0) +
umass(zsymm,(nsymm-1.),0.0)
481 + 1.44 * (std::pow(zsymm,2))/
482 ( (std::pow(r_null,2)) *
483 ( std::pow((asymm+1.0),1.0/3.0) + std::pow((asymm-1.0),1.0/3.0) ) *
484 ( std::pow((asymm+1.0),1.0/3.0) + std::pow((asymm-1.0),1.0/3.0) ) )
485 - 2.0 *
umass(zsymm,nsymm,0.0)
486 - 1.44 * (std::pow(zsymm,2))/
487 ( ( 2.0 * r_null * (std::pow(asymm,1.0/3.0)) ) *
488 ( 2.0 * r_null * (std::pow(asymm,1.0/3.0)) ) );
491 delta_u1 = delta_u1_shell + (std::pow((zheavy1_shell-zheavy1),2))*cz_asymm1_shell;
493 delta_u2 = delta_u2_shell + (std::pow((zheavy2_shell-zheavy2),2))*cz_asymm2_shell;
496 Basym_1 = Bsym + std::pow((zheavy1-zsymm), 2) * cz_symm + delta_u1;
497 Basym_2 = Bsym + std::pow((zheavy2-zsymm), 2) * cz_symm + delta_u2;
498 if(Bsym < Basym_1 && Bsym < Basym_2) {
501 epsilon0_1_saddle = (e + e_zero_point - std::pow((zheavy1 - zsymm), 2) * cz_symm);
502 epsilon0_2_saddle = (e + e_zero_point - std::pow((zheavy2 - zsymm), 2) * cz_symm);
504 epsilon_1_saddle = epsilon0_1_saddle - delta_u1;
505 epsilon_2_saddle = epsilon0_2_saddle - delta_u2;
507 epsilon_symm_saddle = e + e_zero_point;
508 eexc1_saddle = epsilon_1_saddle;
509 eexc2_saddle = epsilon_2_saddle;
513 epsilon0_1_scission = (e + e_saddle_scission - std::pow((zheavy1 - zsymm), 2) * cz_symm) * aheavy1/a;
514 epsilon_1_scission = epsilon0_1_scission - delta_u1*(aheavy1/
a);
516 epsilon0_2_scission = (e + e_saddle_scission - std::pow((zheavy2 - zsymm), 2) * cz_symm) * aheavy2/a;
517 epsilon_2_scission = epsilon0_2_scission - delta_u2*(aheavy2/
a);
519 epsilon_symm_scission = e + e_saddle_scission;
520 }
else if (Basym_1 < Bsym && Basym_1 < Basym_2) {
523 epsilon_symm_saddle = (e + e_zero_point + delta_u1 + std::pow((zheavy1-zsymm), 2) * cz_symm);
524 epsilon0_2_saddle = (epsilon_symm_saddle - std::pow((zheavy2-zsymm), 2) * cz_symm);
525 epsilon_2_saddle = epsilon0_2_saddle - delta_u2;
526 epsilon0_1_saddle = e + e_zero_point + delta_u1;
527 epsilon_1_saddle = e + e_zero_point;
528 eexc1_saddle = epsilon_1_saddle;
529 eexc2_saddle = epsilon_2_saddle;
533 epsilon_symm_scission = (e + e_saddle_scission + std::pow((zheavy1-zsymm), 2) * cz_symm + delta_u1);
534 epsilon0_2_scission = (epsilon_symm_scission - std::pow((zheavy2-zsymm), 2) * cz_symm) * aheavy2/a;
535 epsilon_2_scission = epsilon0_2_scission - delta_u2*aheavy2/
a;
536 epsilon0_1_scission = (e + e_saddle_scission + delta_u1) * aheavy1/a;
537 epsilon_1_scission = (e + e_saddle_scission) * aheavy1/a;
538 }
else if (Basym_2 < Bsym && Basym_2 < Basym_1) {
541 epsilon_symm_saddle = (e + e_zero_point + delta_u2 + std::pow((zheavy2-zsymm), 2) * cz_symm);
542 epsilon0_1_saddle = (epsilon_symm_saddle - std::pow((zheavy1-zsymm), 2) * cz_symm);
543 epsilon_1_saddle = epsilon0_1_saddle - delta_u1;
544 epsilon0_2_saddle = e + e_zero_point + delta_u2;
545 epsilon_2_saddle = e + e_zero_point;
546 eexc1_saddle = epsilon_1_saddle;
547 eexc2_saddle = epsilon_2_saddle;
551 epsilon_symm_scission = (e + e_saddle_scission + std::pow((zheavy2-zsymm), 2) * cz_symm + delta_u2);
552 epsilon0_1_scission = (epsilon_symm_scission - std::pow((zheavy1-zsymm), 2) * cz_symm) * aheavy1/a;
553 epsilon_1_scission = epsilon0_1_scission - delta_u1*aheavy1/
a;
554 epsilon0_2_scission = (e + e_saddle_scission + delta_u2) * aheavy2/a;
555 epsilon_2_scission = (e + e_saddle_scission) * aheavy2/a;
560 if(epsilon_1_saddle < 0.0) epsilon_1_saddle = 0.0;
561 if(epsilon_2_saddle < 0.0) epsilon_2_saddle = 0.0;
562 if(epsilon0_1_saddle < 0.0) epsilon0_1_saddle = 0.0;
563 if(epsilon0_2_saddle < 0.0) epsilon0_2_saddle = 0.0;
564 if(epsilon_symm_saddle < 0.0) epsilon_symm_saddle = 0.0;
566 if(epsilon_1_scission < 0.0) epsilon_1_scission = 0.0;
567 if(epsilon_2_scission < 0.0) epsilon_2_scission = 0.0;
568 if(epsilon0_1_scission < 0.0) epsilon0_1_scission = 0.0;
569 if(epsilon0_2_scission < 0.0) epsilon0_2_scission = 0.0;
570 if(epsilon_symm_scission < 0.0) epsilon_symm_scission = 0.0;
576 e_eff1_saddle = epsilon0_1_saddle - delta_u1 * (std::exp((-epsilon_1_saddle*gamma)));
578 if (e_eff1_saddle > 0.0) {
579 wzasymm1_saddle = std::sqrt( (0.5) *
580 (std::sqrt(1.0/a_levdens*e_eff1_saddle)) /
581 (cz_asymm1_shell * std::exp((-epsilon_1_saddle*gamma)) + cz_symm) );
583 wzasymm1_saddle = 1.0;
586 e_eff2_saddle = epsilon0_2_saddle - delta_u2 * std::exp((-epsilon_2_saddle*gamma));
587 if (e_eff2_saddle > 0.0) {
588 wzasymm2_saddle = std::sqrt( (0.5 *
589 (std::sqrt(1.0/a_levdens*e_eff2_saddle)) /
590 (cz_asymm2_shell * std::exp((-epsilon_2_saddle*gamma)) + cz_symm) ) );
592 wzasymm2_saddle = 1.0;
595 if(e - e_zero_point > 0.0) {
596 wzsymm_saddle = std::sqrt( (0.5 *
597 (std::sqrt(1.0/a_levdens*(e+epsilon_symm_saddle))) / cz_symm ) );
611 wzsymm_scission = wzsymm_saddle;
613 if (e_saddle_scission == 0.0) {
614 wzasymm1_scission = wzasymm1_saddle;
615 wzasymm2_scission = wzasymm2_saddle;
617 if (nheavy1_eff > 75.0) {
618 wzasymm1_scission = (std::sqrt(21.0)) * z/a;
619 double RR = (70.0-28.0)/3.0*(z*z/a-35.0)+28.0;
621 wzasymm2_scission = std::sqrt(RR)*(z/
a);
623 wzasymm2_scission = 0.0;
625 wzasymm2_scission = (std::sqrt (
max( (70.0-28.0)/3.0*(z*z/a-35.0)+28.,0.0 )) ) * z/a;
627 wzasymm1_scission = wzasymm1_saddle;
628 wzasymm2_scission = wzasymm2_saddle;
632 wzasymm1_scission =
max(wzasymm1_scission,wzasymm1_saddle);
633 wzasymm2_scission =
max(wzasymm2_scission,wzasymm2_saddle);
635 wzasymm1 = wzasymm1_scission * fwidth_asymm1;
636 wzasymm2 = wzasymm2_scission * fwidth_asymm2;
637 wzsymm = wzsymm_scission;
662 n1width = std::sqrt(0.5 * std::sqrt(1.0/a_levdens*(e + e_saddle_scission)) / cn + 1.35);
663 if ( (epsilon0_1_saddle - delta_u1*std::exp((-epsilon_1_saddle*gamma_heavy1))) < 0.0) {
666 sasymm1 = 2.0 * std::sqrt( a_levdens * (epsilon0_1_saddle -
667 delta_u1*(std::exp((-epsilon_1_saddle*gamma_heavy1))) ) );
670 if ( (epsilon0_2_saddle - delta_u2*std::exp((-epsilon_2_saddle*gamma_heavy2))) < 0.0) {
673 sasymm2 = 2.0 * std::sqrt( a_levdens * (epsilon0_2_saddle -
674 delta_u2*(std::exp((-epsilon_2_saddle*gamma_heavy2))) ) );
677 if (epsilon_symm_saddle > 0.0) {
678 ssymm = 2.0 * std::sqrt( a_levdens*(epsilon_symm_saddle) );
685 if (epsilon0_1_saddle < 0.0) {
686 yasymm1 = std::exp((sasymm1-ssymm)) * wzasymm1_saddle / wzsymm_saddle * 2.0;
689 ssymm_mode1 = 2.0 * std::sqrt( a_levdens*(epsilon0_1_saddle) );
690 yasymm1 = ( std::exp((sasymm1-ssymm)) - std::exp((ssymm_mode1 - ssymm)) )
691 * wzasymm1_saddle / wzsymm_saddle * 2.0;
694 if (epsilon0_2_saddle < 0.0) {
695 yasymm2 = std::exp((sasymm2-ssymm)) * wzasymm2_saddle / wzsymm_saddle * 2.0;
698 ssymm_mode2 = 2.0 * std::sqrt( a_levdens*(epsilon0_2_saddle) );
699 yasymm2 = ( std::exp((sasymm2-ssymm)) - std::exp((ssymm_mode2 - ssymm)) )
700 * wzasymm2_saddle / wzsymm_saddle * 2.0;
706 if ( (sasymm1 > -10.0) && (sasymm2 > -10.0) ) {
708 yasymm1 = std::exp(sasymm1) * wzasymm1_saddle * 2.0;
709 yasymm2 = std::exp(sasymm2) * wzasymm2_saddle * 2.0;
714 ysum = ysymm + yasymm1 + yasymm2;
716 ysymm = ysymm / ysum;
717 yasymm1 = yasymm1 / ysum;
718 yasymm2 = yasymm2 / ysum;
724 if ( (epsilon_symm_saddle < epsilon_1_saddle) && (epsilon_symm_saddle < epsilon_2_saddle) ) {
727 if (epsilon_1_saddle < epsilon_2_saddle) {
743 eexc_max =
max(eexc1_saddle, eexc2_saddle);
744 eexc_max =
max(eexc_max, e);
746 if ((
G4int)(z) % 2 == 0) {
747 r_e_o_max = 0.3 * (1.0 - 0.2 * (std::pow(z, 2)/a - std::pow(92.0, 2)/238.0));
748 e_pair = 2.0 * 12.0 / std::sqrt(a);
749 if(eexc_max > (e_crit + e_pair)) {
752 if(eexc_max < e_pair) {
755 r_e_o = std::pow((eexc_max - e_crit - e_pair)/e_crit, 2) * r_e_o_max;
781 }
else if (rmode < (ysymm + yasymm1)) {
793 }
else if (imode == 2) {
796 }
else if (imode == 3) {
812 while ( (z1<5.0) || (z2<5.0) ) {
838 re1 =
umass(z1,n1ucd,0.6) +
umass(z2,n2ucd,0.6) +
ecoul(z1,n1ucd,0.6,z2,n2ucd,0.6,2.0);
839 re2 =
umass(z1,n1ucd+1.,0.6) +
umass(z2,n2ucd-1.,0.6) +
ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,2.0);
840 re3 =
umass(z1,n1ucd+2.,0.6) +
umass(z2,n2ucd-2.,0.6) +
ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,2.0);
841 reps2 = (re1-2.0*re2+re3) / 2.0;
842 reps1 = re2 - re1 - reps2;
843 rn1_pol = - reps1 / (2.0 * reps2);
844 n1mean = n1ucd + rn1_pol;
846 n1mean = (z1 + 0.5) * n/
z;
855 while (n1r < 5 || n2r < 5) {
859 i_inter = int(n1r + 0.5);
860 n1r = double(i_inter);
867 ne_min = 0.095e0 * a - 20.4e0;
868 if (ne_min < 0) ne_min = 0.0;
869 ne_min = ne_min + e / 8.e0;
878 }
else if (a1 >= 80 && a1 < 110) {
879 ed1_low = (a1-80.)*20./30.;
880 }
else if (a1 >= 110 && a1 < 130) {
881 ed1_low = -(a1-110.)*20./20. + 20.;
882 }
else if (a1 >= 130) {
883 ed1_low = (a1-130.)*20./30.;
888 }
else if (a2 >= 80 && a2 < 110) {
889 ed2_low = (a2-80.)*20./30.;
890 }
else if (a2 >= 110 && a2 < 130) {
891 ed2_low = -(a2-110.)*20./20. + 20.;
892 }
else if (a2 >= 130) {
893 ed2_low = (a2-130.)*20./30.;
896 ed1_high = 20.0*a1/(a1+
a2);
897 ed2_high = 20.0 - ed1_high;
898 ed1 = ed1_low*std::exp(-e/el) + ed1_high*(1-std::exp(-e/el));
899 ed2 = ed2_low*std::exp(-e/el) + ed2_high*(1-std::exp(-e/el));
903 e1 = e*a1/(a1+
a2) + ed1;
904 e2 = e - e*a1/(a1+
a2) + ed2;
915 if ( (icz == -1) || (a1 < 0.0) || (a2 < 0.0) ) {
929 asymm = nsymm + zsymm;
934 cz_symm = 8.0 / std::pow(z,2) * masscurv;
936 wzsymm = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cz_symm) ) ;
949 while ( (z1 < 5.0) || (z2 < 5.0) ) {
953 z1 =
gausshaz(kkk, z1mean, z1width);
967 cn =
umass(zsymm, nsymm+1.0, 0.0) +
umass(zsymm, nsymm-1.0, 0.0)
968 + 1.44 * std::pow(zsymm, 2)/
969 (std::pow(r_null, 2) * std::pow(std::pow(asymm+1.0, 1.0/3.0) + std::pow(asymm-1.0, 1.0/3.0), 2))
970 - 2.0 *
umass(zsymm, nsymm, 0.0) - 1.44 * std::pow(zsymm, 2) /
971 std::pow(r_null * 2.0 *std::pow(asymm, 1.0/3.0), 2);
974 n1width = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cn) + 1.35);
983 re1 =
umass(z1,n1ucd, 0.6) +
umass(z2,n2ucd, 0.6) +
ecoul(z1,n1ucd, 0.6,z2,n2ucd, 0.6,2.0);
984 re2 =
umass(z1,n1ucd+1.,0.6) +
umass(z2,n2ucd-1.,0.6) +
ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,2.0);
985 re3 =
umass(z1,n1ucd+2.,0.6) +
umass(z2,n2ucd-2.,0.6) +
ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,2.0);
986 reps2 = (re1-2.0*re2+re3) / 2.0;
987 reps1 = re2 - re1 - reps2;
988 rn1_pol = - reps1 / (2.0 * reps2);
989 n1mean = n1ucd + rn1_pol;
995 n1r = (float)( (
int)(
gausshaz(k, n1mean,n1width)) );
1002 e2 = e - e*a1/(a1+
a2);
1023 const G4int pSize = 110;
1043 ix = int(y * 100 + 43543000);
1044 if(
mod(ix,2) == 0) {
1056 for(
G4int iRandom = 0; iRandom < pSize; iRandom++) {
1086 v1 = 2.0*
haz(k) - 1.0;
1087 v2 = 2.0*
haz(k) - 1.0;
1088 r = std::pow(v1,2) + std::pow(v2,2);
1091 fac = std::sqrt(-2.*std::log(r)/r);
1093 fgausshaz = v2*fac*sig+xmoy;
1097 fgausshaz=gset*sig+xmoy;
1149 fractpart = std::modf(number, &intpart);
1154 if(fractpart < 0.5) {
1155 return int(std::floor(number));
1158 return int(std::ceil(number));
1162 if(fractpart < -0.5) {
1163 return int(std::floor(number));
1166 return int(std::ceil(number));
1170 return int(std::floor(number));
1179 mylocaltime = localtime(&mytime);
1182 return(mylocaltime->tm_hour*60*60 + mylocaltime->tm_min*60 + mylocaltime->tm_sec);
1192 return (a - (a/b)*b);
1202 return (a - (a/b)*b);
1214 value = double(std::ceil(a));
1217 value = double(std::floor(a));
1228 value = int(std::ceil(a));
1231 value = int(std::floor(a));
1239 if(a < b && a < c) {
1242 if(b < a && b < c) {
1245 if(c < a && c < b) {
G4int mod(G4int a, G4int b)
static const G4double fac
G4double dint(G4double a)
G4double umass(G4double z, G4double n, G4double beta)
G4int max(G4int a, G4int b)
G4double dmin1(G4double a, G4double b, G4double c)
void doFission(G4double &A, G4double &Z, G4double &E, G4double &A1, G4double &Z1, G4double &E1, G4double &K1, G4double &A2, G4double &Z2, G4double &E2, G4double &K2)
G4double gausshaz(int k, double xmoy, double sig)
static const G4double A[nN]
G4double ecoul(G4double z1, G4double n1, G4double beta1, G4double z2, G4double n2, G4double beta2, G4double d)
void even_odd(G4double r_origin, G4double r_even_odd, G4int &i_out)
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 dmod(G4double a, G4double b)
G4int nint(G4double number)
G4int min(G4int a, G4int b)
static const G4double alpha
G4double utilabs(G4double a)