Import Geant4 0.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-01 15:25:35 +02:00
parent 54d6b71f95
commit b97f8d0df7
3237 changed files with 807095 additions and 0 deletions
+520
View File
@@ -0,0 +1,520 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4AtomicShells.cc,v 2.4 1998/11/16 17:26:45 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 24-04-98, implementation of the first version, V. Grichine
// 16-11-98, GetBindingEnergy(Z,ShellNb), M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4AtomicShells.hh"
#include <assert.h>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4int
G4AtomicShells::fNumberOfShells[101] =
{
0 , // nonexisting zero element
1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 3 , 4 , // 1 - 10
5 , 5 , 6 , 6 , 6 , 6 , 6 , 7 , 8 , 8 , // 11 - 20
9 , 9 , 9 , 9 , 9 , 9 , 9 , 10 , 10 , 10 , // 21 - 30
11 , 11 , 11 , 11 , 11 , 12 , 13 , 13 , 14 , 14 , // 31 - 40
14 , 14 , 14 , 14 , 14 , 15 , 15 , 15 , 16 , 16 , // 41 - 50
// ----------------------------------------------------------
16 , 16 , 16 , 17 , 18 , 18 , 19 , 19 , 19 , 19 , // 51 - 60
19 , 19 , 19 , 20 , 19 , 19 , 19 , 19 , 19 , 20 , // 61 - 70
21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 22 , 22 , // 71 - 80
23 , 23 , 23 , 23 , 24 , 24 , 25 , 25 , 26 , 26 , // 81 - 90
27 , 27 , 27 , 26 , 26 , 27 , 27 , 26 , 26 , 26 // 91 - 100
};
// The total shell number is:
// 1 + G4AtomicShells::TotalNumberOfShells(100) = 1 + 1539 = 1540
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4double
G4AtomicShells::fBindingEnergies[1540] =
{
0.0 , // Nonexisting zero element
// H ---------------------------------------------------------
13.60 ,
// He ---------------------------------------------------------
24.59 ,
// Li --------------------------------------------------------
58.0 , 5.39 ,
// Be --------------------------------------------------------
115.0 , 9.32 ,
// B --------------------------------------------------------
192.0 , 12.93 , 8.3 ,
// C ---------------------------------------------------------
288.0 , 16.59 , 11.26 ,
// N ---------------------------------------------------------
403.0 , 37.3 , 20.33 , 14.53 ,
// O ---------------------------------------------------------
543.1 , 41.6 , 28.48 , 13.62 ,
// F ---------------------------------------------------------
696.7 , 37.85 , 17.42 ,
// Ne ---------------------------------------------------------
870.1 , 48.47 , 21.66 , 21.56 ,
// Na ---------------------------------------------------------
1075.0 , 66.0 , 34.0 , 34.0 , 5.14 ,
// Mg ---------------------------------------------------------
1308.0 , 92.0 , 54.0 , 54.0 , 7.65 ,
// Al ---------------------------------------------------------
1564.0 , 121. , 77.0 , 77.0 , 10.62 , 5.99 ,
// Si ---------------------------------------------------------
1844.0 , 154.0 , 104.0 , 104.0 , 13.46 , 8.15 ,
// P ---------------------------------------------------------
2148.0 , 191.0 , 135.0 , 134.0 , 16.15 , 10.49 ,
// S ---------------------------------------------------------
2476.0 , 232.0 , 170.0 , 168.0 , 20.20 , 10.36 ,
// Cl ---------------------------------------------------------
2829.0 , 277.0 , 208.0 , 206.0 , 24.54 , 12.97 ,
// Ar ---------------------------------------------------------
3206.3 , 326.5 , 250.6 , 248.5 , 29.24 , 15.94 , 15.76 ,
// K ---------------------------------------------------------
3610.0 , 381.0 , 299.0 , 296.0 , 37.0 , 19.0 , 18.7 , 4.34 ,
// Ca ---------------------------------------------------------
4041.0 , 441.0 , 353.0 , 349.0 , 46.0 , 28.0 , 28.0 , 6.11 ,
// Sc ---------------------------------------------------------
4494.0 , 503.0 , 408.0 , 403.0 , 55.0 , 33.0 , 33.0 , 8.0 , 6.54 ,
// Ti ---------------------------------------------------------
4966.0 , 567.0 , 465.0 , 459.0 , 64.0 , 39.0 , 38.0 , 8.0 , 6.82 ,
// V ---------------------------------------------------------
5465.0 , 633.0 , 525.0 , 518.0 , 72.0 , 44.0 , 43.0 , 8.0 , 6.74 ,
// Cr ---------------------------------------------------------
5989.0 , 702.0 , 589.0 , 580.0 , 80.0 , 49.0 , 48.0 , 8.25 , 6.77 ,
// Mn ---------------------------------------------------------
6539.0 , 755.0 , 656.0 , 645.0 , 89.0 , 55.0 , 53.0 , 9.0 , 7.43 ,
// Fe ---------------------------------------------------------
7112.0 , 851.0 , 726.0 , 713.0 , 98.0 , 61.0 , 59.0 , 9.0 , 7.87 ,
// Co ---------------------------------------------------------
7709.0 , 931.0 , 800.0 , 785.0 , 107.0 , 68.0 , 66.0 , 9.0 , 7.86 ,
// Ni ---------------------------------------------------------
8333.0 , 1015.0 , 877.0 , 860.0 , 117.0 , 75.0 , 73.0 , 10.0 , 10.0 ,
7.64 ,
// Cu ---------------------------------------------------------
8979.0 , 1103.0 , 958.0 , 938.0 , 127.0 , 82.0 , 80.0 , 11.0 , 10.4 ,
7.73 ,
// Zn ---------------------------------------------------------
9659.0 , 1198.0 , 1047.0 , 1024.0 , 141.0 , 94.0 , 91.0 , 12.0 , 11.2 ,
9.39 ,
// Ga ---------------------------------------------------------
10367.0 , 1302.0 , 1146.0 , 1119.0 , 162.0 , 111.0 , 107.0 , 21.0 ,
20.0 , 11.0 , 6.0 ,
// Ge ---------------------------------------------------------
11103.0 , 1413.0 , 1251.0 , 1220.0 , 184.0 , 130.0 , 125.0 , 33.0 ,
32.0 , 14.3 , 7.9 ,
// As ---------------------------------------------------------
11867.0 , 1531.0 , 1362.0 , 1327.0 , 208.0 , 151.0 , 145.0 , 46.0 ,
45.0 , 17.0 , 9.81 ,
// Se ---------------------------------------------------------
12658.0 , 1656.0 , 1479.0 , 1439.0 , 234.0 , 173.0 , 166.0 , 61.0 ,
60.0 , 20.15 , 9.75 ,
// Br ---------------------------------------------------------
13474.0 , 1787.0 , 1602.0 , 1556.0 , 262.0 , 197.0 , 189.0 , 77.0 ,
76.0 , 23.8 , 11.85 ,
// Kr ---------------------------------------------------------
14326.0 , 1924.6 , 1730.9 , 1678.4 , 292.8 , 222.2 , 214.4 , 95.0 ,
93.8 , 27.51 , 14.65 , 14.0 ,
// Rb ---------------------------------------------------------
15200.0 , 2068.0 , 1867.0 , 1807.0 , 325.0 , 251.0 , 242.0 , 116.0 ,
114.0 , 32.0 , 16.0 , 15.3 , 4.18 ,
// Sr ---------------------------------------------------------
16105.0 , 2219.0 , 2010.0 , 1943.0 , 361.0 , 283.0 , 273.0 , 139.0 ,
137.0 , 40.0 , 23.0 , 22.0 , 5.69 ,
// Y ---------------------------------------------------------
17038.0 , 2375.0 , 2158.0 , 2083.0 , 397.0 , 315.0 , 304.0 , 163.0 ,
161.0 , 48.0 , 30.0 , 29.0 , 6.38 , 6.48 ,
// Zr ---------------------------------------------------------
17998.0 , 2536.0 , 2311.0 , 2227.0 , 434.0 , 348.0 , 335.0 , 187.0 ,
185.0 , 56.0 , 35.0 , 33.0 , 8.61 , 6.84 ,
// Nb ----------------------------------------------------------
18986.0 , 2702.0 , 2469.0 , 2375.0 , 472.0 , 382.0 , 367.0 , 212.0 ,
209.0 , 62.0 , 40.0 , 38.0 , 7.17 , 6.88 ,
// Mo -----------------------------------------------------------
20000.0 , 2872.0 , 2632.0 , 2527.0 , 511.0 , 416.0 , 399.0 , 237.0 ,
234.0 , 68.0 , 45.0 , 42.0 , 8.56 , 7.10 ,
// Tc -----------------------------------------------------------
21044.0 , 3048.0 , 2800.0 , 2683.0 , 551.0 , 451.0 , 432.0 , 263.0 ,
259.0 , 74.0 , 49.0 , 45.0 , 8.6 , 7.28 ,
// Ru -----------------------------------------------------------
22117.0 , 3230.0 , 2973.0 , 2844.0 , 592.0 , 488.0 , 466.0 , 290.0 ,
286.0 , 81.0 , 53.0 , 49.0 , 8.5 , 7.37 ,
// Rh -----------------------------------------------------------
23220.0 , 3418.0 , 3152.0 , 3010.0 , 634.0 , 526.0 , 501.0 , 318.0 ,
313.0 , 87.0 , 58.0 , 53.0 , 9.56 , 7.46 ,
// Pd -----------------------------------------------------------
24350.0 , 3611.0 , 3337.0 , 3180.0 , 677.0 , 565.0 , 537.0 , 347.0 ,
342.0 , 93.0 , 63.0 , 57.0 , 8.78 , 8.34 , 7.52 ,
// Ag -----------------------------------------------------------
25514.0 , 3812.0 , 3530.0 , 3357.0 , 724.0 , 608.0 , 577.0 , 379.0 ,
373.0 , 101.0 , 69.0 , 63.0 , 11.0 , 10.0 , 7.58 ,
// Cd ------------------------------------------------------------
26711.0 , 4022.0 , 3732.0 , 3542.0 , 775.0 , 655.0 , 621.0 , 415.0 ,
408.0 , 112.0 , 78.0 , 71.0 , 14.0 , 13.0 , 8.99 ,
// In ------------------------------------------------------------
27940.0 , 4242.0 , 3943.0 , 3735.0 , 830.0 , 707.0 , 669.0 , 455.0 ,
447.0 , 126.0 , 90.0 , 82.0 , 21.0 , 20.0 , 10.0 , 5.79 ,
// Sn ------------------------------------------------------------
29200.0 , 4469.0 , 4160.0 , 3933.0 , 888.0 , 761.0 , 719.0 , 497.0 ,
489.0 , 141.0 , 102.0 , 93.0 , 29.0 , 28.0 , 12.0 , 7.34 ,
// Sb ------------------------------------------------------------
30419.0 , 4698.0 , 4385.0 , 4137.0 , 949.0 , 817.0 , 771.0 , 542.0 ,
533.0 , 157.0 , 114.0 , 104.0 , 38.0 , 37.0 , 15.0 , 8.64 ,
// Te ------------------------------------------------------------
31814.0 , 4939.0 , 4612.0 , 4347.0 , 1012.0 , 876.0 , 825.0 , 589.0 ,
578.0 , 174.0 , 127.0 , 117.0 , 48.0 , 46.0 , 17.84 , 9.01 ,
// I ------------------------------------------------------------
33169.0 , 5188.0 , 4852.0 , 4557.0 , 1078.0 , 937.0 , 881.0 , 638.0 ,
626.0 , 193.0 , 141.0 , 131.0 , 58.0 , 56.0 , 20.61 , 10.45 ,
// Xe ------------------------------------------------------------
34570.0 , 5460.0 , 5110.0 , 4790.0 , 1148.7 , 1002.1 , 940.6 , 689.0 ,
676.4 , 213.2 , 157.0 , 145.5 , 69.5 , 67.5 , 23.39 , 13.43 ,
12.13 ,
// Cs ------------------------------------------------------------
35985.0 , 5714.0 , 5359.0 , 5012.0 , 1220.0 , 1068.0 , 1000.0 , 742.0 ,
728.0 , 233.0 , 174.0 , 164.0 , 81.0 , 79.0 , 25.0 , 14.0 ,
12.3 , 3.89 ,
// Ba -------------------------------------------------------------
37441.0 , 5989.0 , 5624.0 , 5247.0 , 1293.0 , 1138.0 , 1063.0 , 797.0 ,
782.0 , 254.0 , 193.0 , 181.0 , 94.0 , 92.0 , 31.0 , 18.0 ,
16.0 , 5.21 ,
// La -------------------------------------------------------------
38925.0 , 6266.0 , 5891.0 , 5483.0 , 1365.0 , 1207.0 , 1124.0 , 851.0 ,
834.0 , 273.0 , 210.0 , 196.0 , 105.0 , 103.0 , 36.0 , 22.0 ,
19.0 , 5.75 , 5.58 ,
// Ce -------------------------------------------------------------
40443.0 , 6548.0 , 6164.0 , 5723.0 , 1437.0 , 1275.0 , 1184.0 , 903.0 ,
885.0 , 291.0 , 225.0 , 209.0 , 114.0 , 111.0 , 6.0 , 39.0 ,
25.0 , 22.0 , 5.65 ,
// Pr -------------------------------------------------------------
41991.0 , 6835.0 , 6440.0 , 5964.0 , 1509.0 , 1342.0 , 1244.0 , 954.0 ,
934.0 , 307.0 , 238.0 , 220.0 , 121.0 , 117.0 , 6.0 , 41.0 ,
27.0 , 24.0 , 5.42 ,
// Nd -------------------------------------------------------------
43569.0 , 7126.0 , 6722.0 , 6208.0 , 1580.0 , 1408.0 , 1303.0 , 1005.0 ,
983.0 , 321.0 , 250.0 , 230.0 , 126.0 , 122.0 , 6.0 , 42.0 ,
28.0 , 25.0 , 5.49 ,
// Pm -------------------------------------------------------------
45184.0 , 7428.0 , 7013.0 , 6459.0 , 1653.0 , 1476.0 , 1362.0 , 1057.0 ,
1032.0 , 325.0 , 261.0 , 240.0 , 131.0 , 127.0 , 6.0 , 43.0 ,
28.0 , 25.0 , 5.55 ,
// Sm -------------------------------------------------------------
46834.0 , 7737.0 , 7312.0 , 6716.0 , 1728.0 , 1546.0 , 1422.0 , 1110.0 ,
1083.0 , 349.0 , 273.0 , 251.0 , 137.0 , 132.0 , 6.0 , 44.0 ,
29.0 , 25.0 , 5.63 ,
// Eu -------------------------------------------------------------
48519.0 , 8052.0 , 7617.0 , 6977.0 , 1805.0 , 1618.0 , 1484.0 , 1164.0 ,
1135.0 , 364.0 , 286.0 , 262.0 , 143.0 , 137.0 , 6.0 , 45.0 ,
30.0 , 26.0 , 5.68 ,
// Gd -------------------------------------------------------------
50239.0 , 8376.0 , 7930.0 , 7243.0 , 1884.0 , 1692.0 , 1547.0 , 1220.0 ,
1189.0 , 380.0 , 300.0 , 273.0 , 150.0 , 143.0 , 6.0 , 46.0 ,
31.0 , 27.0 , 6.0 , 6.16 ,
// Tb -------------------------------------------------------------
51996.0 , 8708.0 , 8252.0 , 7514.0 , 1965.0 , 1768.0 , 1612.0 , 1277.0 ,
1243.0 , 398.0 , 315.0 , 285.0 , 157.0 , 150.0 , 6.0 , 48.0 ,
32.0 , 28.0 , 5.85 ,
// Dy -------------------------------------------------------------
53789.0 , 9046.0 , 8581.0 , 7790.0 , 2048.0 , 1846.0 , 1678.0 , 1335.0 ,
1298.0 , 416.0 , 331.0 , 297.0 , 164.0 , 157.0 , 6.0 , 50.0 ,
33.0 , 28.0 , 5.93 ,
// Ho -------------------------------------------------------------
55618.0 , 9394.0 , 8918.0 , 8071.0 , 2133.0 , 1926.0 , 1746.0 , 1395.0 ,
1354.0 , 434.0 , 348.0 , 310.0 , 172.0 , 164.0 , 6.0 , 52.0 ,
34.0 , 29.0 , 6.02 ,
// Er -------------------------------------------------------------
57486.0 , 9751.0 , 9264.0 , 8358.0 , 2220.0 , 2008.0 , 1815.0 , 1456.0 ,
1412.0 , 452.0 , 365.0 , 323.0 , 181.0 , 172.0 , 6.0 , 54.0 ,
35.0 , 30.0 , 6.10 ,
// Tu -------------------------------------------------------------
59390.0 , 10116.0 , 9617.0 , 8648.0 , 2309.0 , 2092.0 , 1885.0 , 1518.0 ,
1471.0 , 471.0 , 382.0 , 336.0 , 190.0 , 181.0 , 7.0 , 56.0 ,
36.0 , 30.0 , 6.18 ,
// Yb -------------------------------------------------------------
61332.0 , 10486.0 , 9978.0 , 8944.0 , 2401.0 , 2178.0 , 1956.0 , 1580.0 ,
1531.0 , 490.0 , 399.0 , 349.0 , 200.0 , 190.0 , 8.0 , 7.0 ,
58.0 , 37.0 , 31.0 , 6.25 ,
// Lu -------------------------------------------------------------
63314.0 , 10870.0 , 10349.0 , 9244.0 , 2499.0 , 2270.0 , 2032.0 , 1647.0 ,
1596.0 , 514.0 , 420.0 , 366.0 , 213.0 , 202.0 , 13.0 , 12.0 ,
62.0 , 39.0 , 32.0 , 6.6 , 7.0 ,
// Hf -------------------------------------------------------------
65351.0 , 11271.0 , 10739.0 , 9561.0 , 2604.0 , 2369.0 , 2113.0 , 1720.0 ,
1665.0 , 542.0 , 444.0 , 386.0 , 229.0 , 217.0 , 21.0 , 20.0 ,
68.0 , 43.0 , 35.0 , 7.0 , 7.5 ,
// Ta -------------------------------------------------------------
67416.0 , 11682.0 , 11136.0 , 9881.0 , 2712.0 , 2472.0 , 2197.0 , 1796.0 ,
1737.0 , 570.0 , 469.0 , 407.0 , 245.0 , 232.0 , 30.0 , 28.0 ,
74.0 , 47.0 , 38.0 , 8.3 , 7.9 ,
// W -------------------------------------------------------------
69525.0 , 12100.0 , 11544.0 , 10207.0 , 2823.0 , 2577.0 , 2283.0 , 1874.0 ,
1811.0 , 599.0 , 495.0 , 428.0 , 261.0 , 248.0 , 38.0 , 36.0 ,
80.0 , 51.0 , 41.0 , 9.0 , 8.0 ,
// Re -------------------------------------------------------------
71676.0 , 12527.0 , 11959.0 , 10535.0 , 2937.0 , 2686.0 , 2371.0 , 1953.0 ,
1887.0 , 629.0 , 522.0 , 450.0 , 278.0 , 264.0 , 47.0 , 45.0 ,
86.0 , 56.0 , 45.0 , 9.6 , 7.9 ,
// Os -------------------------------------------------------------
73871.0 , 12968.0 , 12385.0 , 10871.0 , 3054.0 , 2797.0 , 2461.0 , 2035.0 ,
1964.0 , 660.0 , 551.0 , 473.0 , 295.0 , 280.0 , 56.0 , 54.0 ,
92.0 , 61.0 , 49.0 , 9.6 , 8.5 ,
// Ir -------------------------------------------------------------
76111.0 , 13419.0 , 12824.0 , 11215.0 , 3175.0 , 2912.0 , 2554.0 , 2119.0 ,
2044.0 , 693.0 , 581.0 , 497.0 , 314.0 , 298.0 , 67.0 , 64.0 ,
99.0 , 66.0 , 53.0 , 9.6 , 9.1 ,
// Pt -------------------------------------------------------------
78395.0 , 13880.0 , 13273.0 , 11564.0 , 3300.0 , 3030.0 , 2649.0 , 2206.0 ,
2126.0 , 727.0 , 612.0 , 522.0 , 335.0 , 318.0 , 78.0 , 75.0 ,
106.0 , 71.0 , 57.0 , 9.6 , 9.0 ,
// Au -------------------------------------------------------------
80725.0 , 14353.0 , 13734.0 , 11919.0 , 3430.0 , 3153.0 , 2748.0 , 2295.0 ,
2210.0 , 764.0 , 645.0 , 548.0 , 357.0 , 339.0 , 91.0 , 87.0 ,
114.0 , 76.0 , 61.0 , 12.5 , 11.1 , 9.23 ,
// Hg -------------------------------------------------------------
83102.0 , 14839.0 , 14209.0 , 12284.0 , 3567.0 , 3283.0 , 2852.0 , 2390.0 ,
2300.0 , 806.0 , 683.0 , 579.0 , 382.0 , 363.0 , 107.0 , 103.0 ,
125.0 , 85.0 , 68.0 , 14.0 , 12.0 , 10.4 ,
// Tl -------------------------------------------------------------
85530.0 , 15347.0 , 14698.0 , 12658.0 , 3710.0 , 3420.0 , 2961.0 , 2490.0 ,
2394.0 , 852.0 , 726.0 , 615.0 , 411.0 , 391.0 , 127.0 , 123.0 ,
139.0 , 98.0 , 79.0 , 21.0 , 19.0 , 8.0 , 6.11 ,
// Pb -------------------------------------------------------------
88005.0 , 15861.0 , 15200.0 , 13055.0 , 3857.0 , 3560.0 , 3072.0 , 2592.0 ,
2490.0 , 899.0 , 769.0 , 651.0 , 441.0 , 419.0 , 148.0 , 144.0 ,
153.0 , 111.0 , 90.0 , 27.0 , 25.0 , 10.0 , 7.42 ,
// Bi -------------------------------------------------------------
90526.0 , 16388.0 , 15711.0 , 13419.0 , 4007.0 , 3704.0 , 3185.0 , 2696.0 ,
2588.0 , 946.0 , 813.0 , 687.0 , 472.0 , 448.0 , 170.0 , 165.0 ,
167.0 , 125.0 , 101.0 , 34.0 , 32.0 , 12.0 , 7.29 ,
// Po -------------------------------------------------------------
93105.0 , 16939.0 , 16244.0 , 13814.0 , 4161.0 , 3852.0 , 3301.0 , 2802.0 ,
2687.0 , 994.0 , 858.0 , 724.0 , 503.0 , 478.0 , 193.0 , 187.0 ,
181.0 , 139.0 , 112.0 , 41.0 , 38.0 , 15.0 , 8.43 ,
// At -------------------------------------------------------------
95730.0 , 17493.0 , 16785.0 , 14214.0 , 4320.0 , 4005.0 , 3420.0 , 2910.0 ,
2788.0 , 1044.0 , 904.0 , 761.0 , 535.0 , 508.0 , 217.0 , 211.0 ,
196.0 , 153.0 , 123.0 , 48.0 , 44.0 , 19.0 , 11.0 , 9.3 ,
// Rn -------------------------------------------------------------
98404.0 , 18049.0 , 17337.0 , 14619.0 , 4483.0 , 4162.0 , 3452.0 , 3109.0 ,
2890.0 , 1096.0 , 951.0 , 798.0 , 567.0 , 538.0 , 242.0 , 235.0 ,
212.0 , 167.0 , 134.0 , 55.0 , 51.0 , 24.0 , 14.0 , 10.7 ,
// Fr -------------------------------------------------------------
101137.0 , 18639.0 , 17907.0 , 15031.0 , 4652.0 , 4324.0 , 3666.0 , 3134.0 ,
2998.0 , 1153.0 , 1003.0 , 839.0 , 603.0 , 572.0 , 268.0 , 260.0 ,
231.0 , 183.0 , 147.0 , 65.0 , 61.0 , 33.0 , 19.0 , 14.0 ,
4.0 ,
// Ra -------------------------------------------------------------
103922.0 , 19237.0 , 18484.0 , 15444.0 , 4822.0 , 4491.0 , 3793.0 , 3254.0 ,
3111.0 , 1214.0 , 1060.0 , 884.0 , 642.0 , 609.0 , 296.0 , 287.0 ,
253.0 , 201.0 , 161.0 , 77.0 , 73.0 , 40.0 , 25.0 , 19.0 ,
5.28 ,
// Ac -------------------------------------------------------------
106755.0 , 19840.0 , 19083.0 , 15871.0 , 5002.0 , 4656.0 , 3921.0 , 3374.0 ,
3223.0 , 1274.0 , 1116.0 , 928.0 , 680.0 , 645.0 , 322.0 , 313.0 ,
274.0 , 218.0 , 174.0 , 88.0 , 83.0 , 45.0 , 29.0 , 22.0 ,
5.7 , 6.3 ,
// Th -------------------------------------------------------------
109651.0 , 20472.0 , 19693.0 , 16300.0 , 5182.0 , 4830.0 , 4049.0 , 3494.0 ,
3335.0 , 1333.0 , 1171.0 , 970.0 , 717.0 , 679.0 , 347.0 , 338.0 ,
293.0 , 233.0 , 185.0 , 97.0 , 91.0 , 50.0 , 33.0 , 25.0 ,
6.0 , 6.0 ,
// Pa -------------------------------------------------------------
112601.0 , 21105.0 , 20314.0 , 16733.0 , 5367.0 , 5001.0 , 4178.0 , 3613.0 ,
3446.0 , 1390.0 , 1225.0 , 1011.0 , 752.0 , 712.0 , 372.0 , 362.0 ,
312.0 , 248.0 , 195.0 , 104.0 , 97.0 , 6.0 , 50.0 , 32.0 ,
24.0 , 6.0 , 6.0 ,
// U -------------------------------------------------------------
115606.0 , 21757.0 , 20948.0 , 17166.0 , 5548.0 , 5182.0 , 4308.0 , 3733.0 ,
3557.0 , 1446.0 , 1278.0 , 1050.0 , 785.0 , 743.0 , 396.0 , 386.0 ,
329.0 , 261.0 , 203.0 , 110.0 , 101.0 , 6.0 , 52.0 , 34.0 ,
24.0 , 6.1 , 6.0 ,
// Np -------------------------------------------------------------
118678.0 , 22426.0 , 21600.0 , 17610.0 , 5723.0 , 5366.0 , 4440.0 , 3854.0 ,
3669.0 , 1504.0 , 1331.0 , 1089.0 , 819.0 , 774.0 , 421.0 , 410.0 ,
346.0 , 274.0 , 211.0 , 116.0 , 106.0 , 6.0 , 54.0 , 35.0 ,
25.0 , 6.0 , 6.0 ,
// Pu -------------------------------------------------------------
121818.0 , 23097.0 , 22266.0 , 18056.0 , 5933.0 , 5541.0 , 4557.0 , 3977.0 ,
3783.0 , 1563.0 , 1384.0 , 1128.0 , 853.0 , 805.0 , 446.0 , 434.0 ,
356.0 , 287.0 , 219.0 , 122.0 , 111.0 , 6.0 , 53.0 , 34.0 ,
23.0 , 6.0 ,
// Am -------------------------------------------------------------
125027.0 , 23773.0 , 22944.0 , 18504.0 , 6121.0 , 5710.0 , 4667.0 , 4102.0 ,
3898.0 , 1623.0 , 1439.0 , 1167.0 , 887.0 , 836.0 , 467.0 , 452.0 ,
355.0 , 301.0 , 220.0 , 123.0 , 112.0 , 6.0 , 54.0 , 44.0 ,
36.0 , 6.0 ,
// Cm -------------------------------------------------------------
128220.0 , 24460.0 , 23779.0 , 18930.0 , 6288.0 , 5895.0 , 4797.0 , 4236.0 ,
4014.0 , 1664.0 , 1493.0 , 1194.0 , 919.0 , 864.0 , 494.0 , 479.0 ,
384.0 , 314.0 , 239.0 , 126.0 , 119.0 , 11.0 , 60.0 , 39.0 ,
27.0 , 5.0 , 6.0 ,
// Bk -------------------------------------------------------------
131590.0 , 25275.0 , 24385.0 , 19452.0 , 6556.0 , 6147.0 , 4977.0 , 4366.0 ,
4133.0 , 1729.0 , 1554.0 , 1236.0 , 955.0 , 898.0 , 520.0 , 504.0 ,
401.0 , 329.0 , 248.0 , 142.0 , 124.0 , 12.0 , 63.0 , 41.0 ,
27.0 , 4.0 , 6.0 ,
// Cf -------------------------------------------------------------
135960.0 , 26110.0 , 25250.0 , 19930.0 , 6754.0 , 6359.0 , 5109.0 , 4492.0 ,
4247.0 , 1789.0 , 1610.0 , 1273.0 , 987.0 , 925.0 , 546.0 , 529.0 ,
412.0 , 338.0 , 251.0 , 142.0 , 129.0 , 9.0 , 61.0 , 39.0 ,
25.0 , 6.0 ,
// Es -------------------------------------------------------------
139490.0 , 26900.0 , 26020.0 , 20410.0 , 6977.0 , 6754.0 , 5252.0 , 4630.0 ,
4369.0 , 1857.0 , 1674.0 , 1316.0 , 1024.0 , 959.0 , 573.0 , 554.0 ,
429.0 , 353.0 , 260.0 , 148.0 , 135.0 , 9.0 , 63.0 , 40.0 ,
25.0 , 6.0 ,
// Fm -------------------------------------------------------------
143090.0 , 27700.0 , 26810.0 , 20900.0 , 7205.0 , 6793.0 , 5397.0 , 4766.0 ,
4498.0 , 1933.0 , 1746.0 , 1366.0 , 1068.0 , 1000.0 , 606.0 , 587.0 ,
453.0 , 375.0 , 275.0 , 160.0 , 145.0 , 15.0 , 69.0 , 45.0 ,
29.0 , 7.0 ,
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int
G4AtomicShells::GetNumberOfShells(G4int Z)
{
return fNumberOfShells[Z];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double
G4AtomicShells::GetBindingEnergy(G4int Z, G4int ShellNb)
{
assert (Z>=1 && Z<=101 && ShellNb<fNumberOfShells[Z]);
G4int indice = 1;
for (G4int z = 1 ; z < Z ; z++) indice += fNumberOfShells[z];
indice += ShellNb;
return fBindingEnergies[indice]*eV;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
+296
View File
@@ -0,0 +1,296 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Element.cc,v 2.7 1998/11/16 17:26:46 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------ class G4Element ------------
//
// Torre Wenaus, November 1995
//
//
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 09-07-96, new data members added by L.Urban
// 17-01-97, aesthetic rearrangement, M.Maire
// 20-01-97, Compute Tsai's formula for the rad length, M.Maire
// 21-01-97, remove mixture flag, M.Maire
// 24-01-97, ComputeIonisationParameters().
// new data member: fTaul, M.Maire
// 29-01-97, Forbidden to create Element with Z<1 or N<Z, M.Maire
// 20-03-97, corrected initialization of pointers, M.Maire
// 28-04-98, atomic subshell binding energies stuff, V. Grichine
// 09-07-98, Ionisation parameters removed from the class, M.Maire
// 16-11-98, name Subshell -> Shell; GetBindingEnergy(), mma
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Element.hh"
#include <iomanip.h>
G4ElementTable G4Element::theElementTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to Generate an element from scratch
G4Element::G4Element(const G4String& name, const G4String& symbol,
G4double zeff, G4double aeff)
{
if (zeff<1.) G4Exception
(" ERROR! It is not allowed to create an Element with Z < 1" );
if (aeff/(g/mole)<zeff) G4Exception
(" ERROR! Attempt to create an Element with N < Z !!!" );
if ((zeff-G4int(zeff)) > perMillion)
G4cerr << name <<
" : WARNING ! Trying to define an element as a mixture directly via effective Z."
<< endl;
InitializePointers();
fName = name;
fSymbol = symbol;
fZeff = zeff;
fNeff = aeff/(g/mole);
fAeff = aeff;
fNumberOfIsotopes = 0;
fNbOfAtomicShells = G4AtomicShells::GetNumberOfShells((G4int)fZeff);
fAtomicShells = new G4double[fNbOfAtomicShells];
for (G4int i=0;i<fNbOfAtomicShells;i++)
fAtomicShells[i] = G4AtomicShells::GetBindingEnergy((G4int)fZeff,i);
ComputeDerivedQuantities();
// Store in table and set the index
theElementTable.insert(this);
fIndexInTable = theElementTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to Generate element from a List of 'nIsotopes' isotopes, added
// via AddIsotope
G4Element::G4Element(const G4String& name, const G4String& symbol, G4int nIsotopes)
{
InitializePointers();
size_t n = size_t(nIsotopes);
fName = name;
fSymbol = symbol;
fNumberOfIsotopes = 0;
theIsotopeVector = new G4IsotopeVector(n);
fRelativeAbundanceVector = new G4double[nIsotopes];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Add an isotope to the element
void G4Element::AddIsotope(G4Isotope* isotope, G4double abundance)
{
if (theIsotopeVector == NULL)
G4Exception("ERROR!!! - Trying to add an Isotope before contructing the element.");
// filling ...
if ( fNumberOfIsotopes < theIsotopeVector->length() ) {
fRelativeAbundanceVector[fNumberOfIsotopes] = abundance;
(*theIsotopeVector)(fNumberOfIsotopes) = isotope;
fNumberOfIsotopes ++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of constituent isotopes.");
// filled.
if ( fNumberOfIsotopes == theIsotopeVector->length() ) {
// Compute Zeff, Neff, Aeff
G4int i;
G4double wtSum=0.0;
fZeff = G4double( (*theIsotopeVector)(0)->GetZ() );
fNeff = fAeff = 0.0;
for (i=0;i<fNumberOfIsotopes;i++) {
fNeff += fRelativeAbundanceVector[i]*(*theIsotopeVector)(i)->GetN();
fAeff += fRelativeAbundanceVector[i]*(*theIsotopeVector)(i)->GetA();
wtSum += fRelativeAbundanceVector[i];
}
fNeff /= wtSum;
fAeff /= wtSum;
fNbOfAtomicShells = G4AtomicShells::GetNumberOfShells((G4int)fZeff);
fAtomicShells = new G4double[fNbOfAtomicShells];
for (i=0;i<fNbOfAtomicShells;i++)
fAtomicShells[i] = G4AtomicShells::GetBindingEnergy((G4int)fZeff,i);
ComputeDerivedQuantities();
// Store in table and set the index
theElementTable.insert(this);
fIndexInTable = theElementTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::InitializePointers()
{
theIsotopeVector = NULL;
fRelativeAbundanceVector = NULL;
fAtomicShells = NULL;
fIonisation = NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Element::~G4Element()
{
if (theIsotopeVector) delete theIsotopeVector;
if (fRelativeAbundanceVector) delete [] fRelativeAbundanceVector;
if (fAtomicShells) delete [] fAtomicShells;
if (fIonisation) delete fIonisation;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Element::G4Element(G4Element &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4Element & G4Element::operator=(const G4Element &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Element::operator==(const G4Element &right) const
{
return (this == (G4Element *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Element::operator!=(const G4Element &right) const
{
return (this != (G4Element *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeDerivedQuantities()
{
// some basic functions of the atomic number
// Radiation Length
ComputeCoulombFactor();
ComputeLradTsaiFactor();
// parameters for energy loss by ionisation
fIonisation = new G4IonisParamElm(fZeff);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeCoulombFactor()
{
//
// Compute Coulomb correction factor (Phys Rev. D50 3-1 (1994) page 1254)
const G4double k1 = 0.0083 , k2 = 0.20206 ,k3 = 0.0020 , k4 = 0.0369 ;
G4double az2 = (fine_structure_const*fZeff)*(fine_structure_const*fZeff);
G4double az4 = az2 * az2;
fCoulomb = (k1*az4 + k2 + 1./(1.+az2))*az2 - (k3*az4 + k4)*az4;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeLradTsaiFactor()
{
//
// Compute Tsai's Expression for the Radiation Length
// (Phys Rev. D50 3-1 (1994) page 1254)
const G4double Lrad_light[] = {5.31 , 4.79 , 4.74 , 4.71} ;
const G4double Lprad_light[] = {6.144 , 5.621 , 5.805 , 5.924} ;
const G4double logZ3 = log(fZeff)/3.;
G4double Lrad, Lprad;
G4int iz = (int)(fZeff+0.5) - 1 ;
if (iz <= 3) { Lrad = Lrad_light[iz] ; Lprad = Lprad_light[iz] ; }
else { Lrad = log(184.15) - logZ3 ; Lprad = log(1194.) - 2*logZ3 ; }
fRadTsai = 4*alpha_rcl2*fZeff*(fZeff*(Lrad-fCoulomb) + Lprad);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double G4Element::GetAtomicShell(G4int i) const
{
if (i<0 || i>=fNbOfAtomicShells)
G4Exception("Invalid argument in G4Element::GetAtomicShell");
return fAtomicShells[i];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Element* element)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Element: " << setw(8) << element->fName << setw(3) << element->fSymbol
<< " Z = " << setw(4) << setprecision(1) << element->fZeff
<< " N = " << setw(5) << setprecision(1) << element->fNeff
<< " A = " << setw(6) << setprecision(2) << (element->fAeff)/(g/mole)
<< " g/mole";
for (G4int i=0; i<element->fNumberOfIsotopes; i++)
flux
<< "\n ---> " << (*(element->theIsotopeVector))[i]
<< " abundance: " << setw(6) << setprecision(2)
<< (element->fRelativeAbundanceVector[i])/perCent << " %";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Element& element)
{
flux << &element;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4ElementTable ElementTable)
{
//Dump info for all known elements
flux << "\n***** Table : Nb of elements = " << ElementTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<ElementTable.length(); i++) flux << ElementTable[i]
<< endl << endl;
return flux;
}
+92
View File
@@ -0,0 +1,92 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamElm.cc,v 2.2 1998/07/12 03:00:39 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------ class G4IonisParamElm ------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 09-07-98, data moved from G4Element. M.Maire
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4IonisParamElm.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::G4IonisParamElm(G4double Z)
{
if (Z < 1.) G4Exception
(" ERROR! It is not allowed to create an Element with Z < 1" );
// some basic functions of the atomic number
fZ = Z;
fZ3 = pow(fZ, 1./3.);
fZZ3 = pow(fZ*(fZ+1.), 1./3.);
flogZ3 = log(fZ)/3.;
// parameters for energy loss by ionisation
fMeanExcitationEnergy = 16.*pow(fZ,0.9)*eV;
fTau0 = 0.1*fZ3*MeV/proton_mass_c2;
fTaul = 2.*MeV/proton_mass_c2;
// compute the Bethe-Bloch formula for energy = fTaul*particle mass
G4double rate = fMeanExcitationEnergy/electron_mass_c2 ;
G4double w = fTaul*(fTaul+2.) ;
fBetheBlochLow = (fTaul+1.)*(fTaul+1.)*log(2.*w/rate)/w - 1. ;
fBetheBlochLow = 2.*fZ*twopi_mc2_rcl2*fBetheBlochLow ;
fClow = sqrt(fTaul)*fBetheBlochLow;
fAlow = 6.458040 * fClow/fTau0;
G4double Taum = 0.035*fZ3*MeV/proton_mass_c2;
fBlow =-3.229020*fClow/(fTau0*sqrt(Taum));
// Shell correction factors
fShellCorrectionVector = new G4double[3];
G4double rate2 = rate*rate;
fShellCorrectionVector[0] = ( 1.10289e5 + 5.14781e8*rate)*rate2 ;
fShellCorrectionVector[1] = ( 7.93805e3 - 2.22565e7*rate)*rate2 ;
fShellCorrectionVector[2] = (-9.92256e1 + 2.10823e5*rate)*rate2 ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::~G4IonisParamElm()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::G4IonisParamElm(G4IonisParamElm &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4IonisParamElm & G4IonisParamElm::operator=(const G4IonisParamElm &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamElm::operator==(const G4IonisParamElm &right) const
{
return (this == (G4IonisParamElm *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamElm::operator!=(const G4IonisParamElm &right) const
{
return (this != (G4IonisParamElm *) &right);
}
+210
View File
@@ -0,0 +1,210 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamMat.cc,v 2.5 1998/10/05 14:33:14 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 18-07-98, bug corrected in ComputeDensityEffect() for gas
// 09-07-98, data moved from G4Material, M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4IonisParamMat.hh"
#include "G4Material.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::G4IonisParamMat(G4Material* material)
:fMaterial(material)
{
ComputeMeanParameters();
ComputeDensityEffect();
ComputeFluctModel();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeMeanParameters()
{
// compute mean excitation energy and shell correction vector
fTaul = (*(fMaterial->GetElementVector()))[0]->GetIonisation()->GetTaul();
fLogMeanExcEnergy = 0.;
for (G4int i=0; i < fMaterial->GetNumberOfElements(); i++)
fLogMeanExcEnergy += (fMaterial->GetVecNbOfAtomsPerVolume())[i]
*((*(fMaterial->GetElementVector()))[i]->GetZ())
*log((*(fMaterial->GetElementVector()))[i]->GetIonisation()
->GetMeanExcitationEnergy());
fLogMeanExcEnergy /= fMaterial->GetTotNbOfElectPerVolume();
fMeanExcitationEnergy = exp(fLogMeanExcEnergy);
fShellCorrectionVector = new G4double[3];
for (G4int j=0; j<=2; j++)
{
fShellCorrectionVector[j] = 0.;
for (G4int k=0; k<fMaterial->GetNumberOfElements(); k++)
fShellCorrectionVector[j] += (fMaterial->GetVecNbOfAtomsPerVolume())[k]
*((*(fMaterial->GetElementVector()))[k]->GetIonisation()
->GetShellCorrectionVector()[j]);
fShellCorrectionVector[j] /= fMaterial->GetTotNbOfElectPerVolume();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeDensityEffect()
{
// Compute parameters for the density effect correction in DE/Dx formula.
// The parametrization is from R.M. Sternheimer, Phys. Rev.B,3:3681 (1971)
const G4double Cd2 = 4*pi*hbarc_squared*classic_electr_radius;
const G4double twoln10 = 2.*log(10.);
G4int icase;
fCdensity = 1. + log(fMeanExcitationEnergy*fMeanExcitationEnergy
/(Cd2*fMaterial->GetTotNbOfElectPerVolume()));
//
// condensed materials
//
G4State State = fMaterial->GetState();
if ((State == kStateSolid)||(State == kStateLiquid)) {
const G4double E100keV = 100.*keV;
const G4double ClimiS[] = {3.681 , 5.215 };
const G4double X0valS[] = {1.0 , 1.5 };
const G4double X1valS[] = {2.0 , 3.0 };
if(fMeanExcitationEnergy < E100keV) icase = 0 ;
else icase = 1 ;
if(fCdensity < ClimiS[icase]) fX0density = 0.2;
else fX0density = 0.326*fCdensity-X0valS[icase];
fX1density = X1valS[icase] ; fMdensity = 3.0;
//special: Hydrogen
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==1.)) {
fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
}
}
//
// gases
//
if (State == kStateGas) {
const G4double ClimiG[] = { 10. , 10.5 , 11. , 11.5 , 12.25 , 13.804};
const G4double X0valG[] = { 1.6 , 1.7 , 1.8 , 1.9 , 2.0 , 2.0 };
const G4double X1valG[] = { 4.0 , 4.0 , 4.0 , 4.0 , 4.0 , 5.0 };
icase = 5;
fX0density = 0.326*fCdensity-2.5 ; fX1density = 5.0 ; fMdensity = 3. ;
while((icase > 0)&&(fCdensity < ClimiG[icase])) icase-- ;
fX0density = X0valG[icase] ; fX1density = X1valG[icase] ;
//special: Hydrogen
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==1.)) {
fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
}
//special: Helium
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==2.)) {
fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
}
// change parameters if the gas is not in STP.
// For the correction the density(STP) is needed. Density(STP) is calculated here :
G4double Density = fMaterial->GetDensity();
G4double Pressure = fMaterial->GetPressure();
G4double Temp = fMaterial->GetTemperature();
G4double DensitySTP = Density*STP_Pressure*Temp/(Pressure*STP_Temperature);
G4double ParCorr = log(Density/DensitySTP) ;
fCdensity -= ParCorr;
fX0density -= ParCorr/twoln10 ;
fX1density -= ParCorr/twoln10 ;
}
G4double Xa = fCdensity/twoln10 ;
fAdensity = twoln10*(Xa-fX0density)
/pow((fX1density-fX0density),fMdensity);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeFluctModel()
{
// compute parameters for the energy loss fluctuation model
// need an 'effective Z' ?????
G4double Zeff = 0.;
for (G4int i=0;i<fMaterial->GetNumberOfElements();i++)
Zeff += (fMaterial->GetFractionVector())[i]
*((*(fMaterial->GetElementVector()))[i]->GetZ());
if (Zeff > 2.) fF2fluct = 2./Zeff ;
else fF2fluct = 0.;
fF1fluct = 1. - fF2fluct;
fEnergy2fluct = 10.*Zeff*Zeff*eV;
fLogEnergy2fluct = log(fEnergy2fluct);
fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct)
/fF1fluct;
fEnergy1fluct = exp(fLogEnergy1fluct);
fEnergy0fluct = 10.*eV;
fRateionexcfluct = 0.4;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::~G4IonisParamMat()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::G4IonisParamMat(const G4IonisParamMat &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4IonisParamMat & G4IonisParamMat::operator=(const G4IonisParamMat &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamMat::operator==(const G4IonisParamMat &right) const
{
return (this == (G4IonisParamMat *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamMat::operator!=(const G4IonisParamMat &right) const
{
return (this != (G4IonisParamMat *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
+128
View File
@@ -0,0 +1,128 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Isotope.cc,v 2.2 1998/07/12 03:00:41 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// --------------------------------------------------------------
// GEANT 4 class implementation file
//
// For information related to this code contact:
// CERN, CN Division, ASD Group
//
// ---------- class G4Isotope ---------
//
// Torre Wenaus, November 1995
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 29-01-97, Forbidden to create Isotope with Z<1 or N<Z, M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Isotope.hh"
#include <iomanip.h>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IsotopeTable G4Isotope::theIsotopeTable;
// Create an isotope
G4Isotope::G4Isotope(const G4String& Name, G4int Z, G4int N, G4double A)
: fName(Name), fZ(Z), fN(N), fA(A)
{
if (Z<1) G4Exception
(" ERROR! It is not allowed to create an Isotope with Z < 1" );
if (N<Z) G4Exception
(" ERROR! Attempt to create an Isotope with N < Z !!!" );
theIsotopeTable.insert(this);
fIndexInTable = theIsotopeTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope::~G4Isotope() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope::G4Isotope(G4Isotope &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope & G4Isotope::operator=(const G4Isotope &right)
{
if (this != &right)
{
fName = right.fName;
fZ = right.fZ;
fN = right.fZ;
fA = right.fA;
theIsotopeTable = right.theIsotopeTable;
fIndexInTable = right.fIndexInTable;
}
return *this;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Isotope::operator==(const G4Isotope &right) const
{
return (this == (G4Isotope *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Isotope::operator!=(const G4Isotope &right) const
{
return (this != (G4Isotope *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Isotope* isotope)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Isotope: " << setw(5) << isotope->fName
<< " Z = " << setw(2) << isotope->fZ
<< " N = " << setw(3) << isotope->fN
<< " A = " << setw(6) << setprecision(2)
<< (isotope->fA)/(g/mole) << " g/mole";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Isotope& isotope)
{
flux << &isotope;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4IsotopeTable IsotopeTable)
{
//Dump info for all known isotopes
flux
<< "\n***** Table : Nb of isotopes = " << IsotopeTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<IsotopeTable.length(); i++) flux << IsotopeTable[i] << endl;
return flux;
}
+107
View File
@@ -0,0 +1,107 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MPVEntry.cc,v 2.1 1998/07/13 17:14:08 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MPVEntry Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MPVEntry.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MPVEntry.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
// Overload the == operator
// ------------------------
// Well defined == semantics required by RWTPtrSortedVector
//
G4bool G4MPVEntry::operator ==(const G4MPVEntry &right) const
{
if (thePhotonMomentum == right.thePhotonMomentum)
return true;
else
return false;
}
// Overload the < operator
// -----------------------
// Well defined < semantics required by RWTPtrSortedVector
//
G4bool G4MPVEntry::operator <(const G4MPVEntry &right) const
{
if (thePhotonMomentum < right.thePhotonMomentum)
return true;
else
return false;
}
// Overload the = operator
// -----------------------
// Well defined = semantics required by RWTPtrSortedVector
//
G4MPVEntry& G4MPVEntry::operator =(const G4MPVEntry &right)
{
thePhotonMomentum = right.thePhotonMomentum;
theProperty = right.theProperty;
return *this;
}
/////////////////
// Constructors
/////////////////
G4MPVEntry::G4MPVEntry(G4double aPhotonMomentum, G4double aProperty)
{
thePhotonMomentum = aPhotonMomentum;
theProperty = aProperty;
}
G4MPVEntry::G4MPVEntry(const G4MPVEntry &right)
{
thePhotonMomentum = right.thePhotonMomentum;
theProperty = right.theProperty;
}
////////////////
// Destructors
////////////////
G4MPVEntry::~G4MPVEntry(){}
////////////
// Methods
////////////
void G4MPVEntry::DumpEntry()
{
G4cout << "("
<< thePhotonMomentum
<< ", "
<< theProperty
<< ")"
<< endl;
}
+444
View File
@@ -0,0 +1,444 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Material.cc,v 2.7 1998/11/20 15:49:24 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ---------- class G4Material ----------
//
// Torre Wenaus, November 1995
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 10-07-96, new data members added by L.Urban
// 12-12-96, new data members added by L.Urban
// 20-01-97, aesthetic rearrangement. RadLength calculation modified.
// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
// (local definition of Zeff in DensityEffect and FluctModel...)
// Vacuum defined as a G4State. Mixture flag removed, M.Maire.
// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
// Subsequent protections have been put in the calculation of
// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire.
// 11-02-97, ComputeDensityEffect() rearranged, M.Maire.
// 20-03-97, corrected initialization of pointers, M.Maire.
// 28-05-98, the kState=kVacuum has been removed.
// automatic check for a minimal density, M.Maire
// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
// 09-07-98, ionisation parameters removed from the class, M.Maire
// 05-10-98, change names: NumDensity -> NbOfAtomsPerVolume
// 18-11-98, new interface to SandiaTable
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Material.hh"
#include "G4UnitsTable.hh"
#include <iomanip.h>
G4MaterialTable G4Material::theMaterialTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to create a material from scratch
G4Material::G4Material(const G4String& name, G4double z,
G4double a, G4double density,
G4State state, G4double temp, G4double pressure)
{
InitializePointers();
if (density < universe_mean_density)
{ G4cout << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << endl;
density = universe_mean_density;
}
fName = name;
fDensity = density;
fState = state;
fTemp = temp;
fPressure = pressure;
// Initialize theElementVector allocating one
// element corresponding to this material
maxNbComponents = fNumberOfComponents = fNumberOfElements = 1;
theElementVector = new G4ElementVector(1);
theElementVector[0] = new G4Element(name, " ", z, a);
fMassFractionVector = new G4double[1];
fMassFractionVector[0] = 1. ;
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
}
ComputeDerivedQuantities();
// Store in the table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to create a material from a List of constituents
// (elements and/or materials) added with AddElement or AddMaterial
G4Material::G4Material(const G4String& name, G4double density, G4int nComponents,
G4State state, G4double temp, G4double pressure)
{
InitializePointers();
if (density < universe_mean_density)
{G4cout << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << endl;
density = universe_mean_density;
}
fName = name;
fDensity = density;
fState = state;
fTemp = temp;
fPressure = pressure;
maxNbComponents = nComponents;
fNumberOfComponents = fNumberOfElements = 0;
theElementVector = new G4ElementVector(maxNbComponents);
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddElement -- composition by atom count
void G4Material::AddElement(G4Element* element, G4int nAtoms)
{
// initialization
if ( fNumberOfElements == 0 ) {
fAtomsVector = new G4int [maxNbComponents];
fMassFractionVector = new G4double[maxNbComponents];
}
// filling ...
if ( fNumberOfElements < maxNbComponents ) {
(*theElementVector)[fNumberOfElements] = element;
fAtomsVector [fNumberOfElements] = nAtoms;
fNumberOfComponents = ++fNumberOfElements;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of elements.");
// filled.
if ( fNumberOfElements == maxNbComponents ) {
// compute proportion by mass
G4int i=0;
G4double Zmol(0.), Amol(0.);
for (i=0;i<fNumberOfElements;i++) {
Zmol += fAtomsVector[i]*(*theElementVector)[i]->GetZ();
Amol += fAtomsVector[i]*(*theElementVector)[i]->GetA();
}
for (i=0;i<fNumberOfElements;i++) {
fMassFractionVector[i] = fAtomsVector[i]*(*theElementVector)[i]->GetA()/Amol;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddElement -- composition by fraction of mass
void G4Material::AddElement(G4Element* element, G4double fraction)
{
// if fAtomsVector is non-NULL, complain. Apples and oranges. $$$
if (fAtomsVector) {
G4cerr << "This material is already being defined via elements by"
<< "atoms." << endl;
G4Exception ("You are mixing apples and oranges ...");
}
// initialization
if (fNumberOfComponents == 0) {
fMassFractionVector = new G4double[100];
}
// filling ...
if (fNumberOfComponents < maxNbComponents) {
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
if (el<fNumberOfElements) fMassFractionVector[el] += fraction;
else {
if(el>=theElementVector->length()) theElementVector->resize(el+1);
(*theElementVector)[el] = element;
fMassFractionVector[el] = fraction;
fNumberOfElements ++;
}
fNumberOfComponents++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of components.");
// filled.
if (fNumberOfComponents == maxNbComponents) {
// check sum of weights -- OK?
G4int i;
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) { wtSum += fMassFractionVector[i]; }
if (abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! - Fractional masses do not sum to 1 :the Delta is > 0.001"
<< "( the weights are NOT renormalized; the results may be wrong)"
<< endl;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddMaterial -- composition by fraction of mass
void G4Material::AddMaterial(G4Material* material, G4double fraction)
{
// if fAtomsVector is non-NULL, complain. Apples and oranges. $$$
if (fAtomsVector) {
G4cerr << "This material is already being defined via elements by"
<< "atoms." << endl;
G4Exception ("You are mixing apples and oranges ...");
}
// initialization
if (fNumberOfComponents == 0) {
fMassFractionVector = new G4double[100];
}
// filling ...
if (fNumberOfComponents < maxNbComponents) {
for (G4int elm=0; elm < material->GetNumberOfElements(); elm++)
{ G4Element* element = (*(material->GetElementVector()))[elm];
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
if (el<fNumberOfElements) fMassFractionVector[el] += fraction
*(material->GetFractionVector())[elm];
else {
if(el>=theElementVector->length()) theElementVector->resize(el+1);
(*theElementVector)[el] = element;
fMassFractionVector[el] = fraction*(material->GetFractionVector())[elm];
fNumberOfElements ++;
}
}
fNumberOfComponents++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of components.");
// filled.
if (fNumberOfComponents == maxNbComponents) {
// check sum of weights -- OK?
G4int i;
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) { wtSum += fMassFractionVector[i]; }
if (abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! - Fractional masses do not sum to 1 :the Delta is > 0.001"
<< "( the weights are NOT renormalized; the results may be wrong)"
<< endl;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::ComputeDerivedQuantities()
{
// Header routine to compute various properties of material.
//
// Atoms density vector, Electrons density
G4double Zi, Ai;
TotNbOfAtomsPerVolume = 0.;
VecNbOfAtomsPerVolume = new G4double[fNumberOfElements];
TotNbOfElectPerVolume = 0.;
for (G4int i=0;i<fNumberOfElements;i++) {
Zi = (*theElementVector)[i]->GetZ();
Ai = (*theElementVector)[i]->GetA();
VecNbOfAtomsPerVolume[i] = Avogadro*fDensity*fMassFractionVector[i]/Ai;
TotNbOfAtomsPerVolume += VecNbOfAtomsPerVolume[i];
TotNbOfElectPerVolume += VecNbOfAtomsPerVolume[i]*Zi;
}
//for gas, check coherence of the state conditions
if (fState == kStateGas) {
G4double ratio = TotNbOfAtomsPerVolume*k_Boltzmann*fTemp/fPressure;
if ((ratio<0.5)||(ratio>2.)) {
G4cout << "---warning from G4Material-- The state conditions of the gas: "
<< fName << " are not consistent."
<< "\n density = " << fDensity/(mg/cm3) << " mg/cm3"
<< "\t pressure = " << fPressure/atmosphere << " atmosphere"
<< "\t temperature = " << fTemp/kelvin << " kelvin"
<< "\n rho*(T/P) would be of the order of: "
<< (fDensity/(TotNbOfAtomsPerVolume*k_Boltzmann))/((mg/cm3)*(kelvin/atmosphere))
<< " (mg/cm3)*(kelvin/atmosphere). The energy loss calculation maybe be affected \n";
}
}
ComputeRadiationLength();
fIonisation = new G4IonisParamMat(this);
fSandiaTable = new G4SandiaTable(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::ComputeRadiationLength()
{
G4double radinv = 0.0 ;
for (G4int i=0;i<fNumberOfElements;i++) {
radinv += VecNbOfAtomsPerVolume[i]*((*theElementVector)[i]->GetfRadTsai());
}
fRadlen = (radinv <= 0.0 ? DBL_MAX : 1./radinv);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::InitializePointers()
{
theElementVector = NULL;
fMassFractionVector = NULL;
fAtomsVector = NULL;
fMaterialPropertiesTable = NULL;
VecNbOfAtomsPerVolume = NULL;
fIonisation = NULL;
fSandiaTable = NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Material::~G4Material()
{
if (theElementVector) delete theElementVector;
if (fMassFractionVector) delete [] fMassFractionVector;
if (fAtomsVector) delete [] fAtomsVector;
if (VecNbOfAtomsPerVolume) delete [] VecNbOfAtomsPerVolume;
if (fIonisation) delete fIonisation;
if (fSandiaTable) delete fSandiaTable;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Material::G4Material(const G4Material &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4Material & G4Material::operator=(const G4Material &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Material::operator==(const G4Material &right) const
{
return (this == (G4Material *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Material::operator!=(const G4Material &right) const
{
return (this != (G4Material *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Material* material)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Material: " << setw(8) << material->fName
<< " density: " << setw(6) << setprecision(3)
<< G4BestUnit(material->fDensity,"Volumic Mass")
<< " temperature: " << setw(6) << setprecision(2)
<< (material->fTemp)/kelvin << " K"
<< " pressure: " << setw(6) << setprecision(2)
<< (material->fPressure)/atmosphere << " atm"
<< " RadLength: " << setw(7) << setprecision(3)
<< G4BestUnit(material->fRadlen,"Length");
for (G4int i=0; i<material->fNumberOfElements; i++)
flux
<< "\n ---> " << (*(material->theElementVector))[i]
<< " fractionMass: " << setw(6)<< setprecision(2)
<< (material->fMassFractionVector[i])/perCent << " %"
<< " Abundance " << setw(6)<< setprecision(2)
<< 100*(material->VecNbOfAtomsPerVolume[i])/
(material->TotNbOfAtomsPerVolume)
<< " %";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Material& material)
{
flux << &material;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4MaterialTable MaterialTable)
{
//Dump info for all known materials
flux << "\n***** Table : Nb of materials = " << MaterialTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<MaterialTable.length(); i++) flux << MaterialTable[i]
<< endl << endl;
return flux;
}
@@ -0,0 +1,173 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertiesTable.cc,v 2.1 1998/07/13 17:14:14 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertiesTable Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertiesTable.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-26 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MaterialPropertiesTable.hh"
unsigned hashString(const G4String &str) { return str.hash(); }
//////////////
// Operators
//////////////
G4MaterialPropertiesTable&
G4MaterialPropertiesTable::operator =(const G4MaterialPropertiesTable &right)
{
// clear any current contents of MPT
MPT.clearAndDestroy();
// want to make an actual copy -- not a shallow copy which is
// the default for RWTPrtHashDictionary's assignment operator
RWTPtrHashDictionary<G4String, G4MaterialPropertyVector>
rightMPT(right.MPT);
RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector>
rightIterator(rightMPT);
rightIterator.reset();
while (++rightIterator) {
G4MaterialPropertyVector *newProp =
new G4MaterialPropertyVector(*(rightIterator.value()));
RWCString *newKey =
new RWCString(*(rightIterator.key()));
MPT.insertKeyAndValue(newKey, newProp);
}
return *this;
}
/////////////////
// Constructors
/////////////////
G4MaterialPropertiesTable::G4MaterialPropertiesTable() : MPT(hashString),
MPTiterator(MPT) {}
G4MaterialPropertiesTable::G4MaterialPropertiesTable
(const G4MaterialPropertiesTable &right) :
MPT(hashString), MPTiterator(MPT)
{
// want to make an actual copy -- not a shallow copy which is
// the default for RWTPrtHashDictionary's assignment operator
RWTPtrHashDictionary<G4String, G4MaterialPropertyVector>
rightMPT(right.MPT);
RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector>
rightIterator(rightMPT);
rightIterator.reset();
while (++rightIterator) {
G4MaterialPropertyVector *newProp =
new G4MaterialPropertyVector(*(rightIterator.value()));
RWCString *newKey =
new RWCString(*(rightIterator.key()));
MPT.insertKeyAndValue(newKey, newProp);
}
}
////////////////
// Destructors
////////////////
G4MaterialPropertiesTable::~G4MaterialPropertiesTable()
{
MPT.clearAndDestroy();
}
////////////
// Methods
////////////
void G4MaterialPropertiesTable::AddProperty(char *key,
G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumEntries)
{
G4MaterialPropertyVector *mpv =
new G4MaterialPropertyVector(PhotonMomenta,
PropertyValues,
NumEntries);
G4String *newKey = new G4String(key);
MPT.insertKeyAndValue(newKey, mpv);
}
void G4MaterialPropertiesTable::AddProperty(char *key,
G4MaterialPropertyVector *mpv)
{
// Provides a way of adding a property to the Material Properties
// Table given an G4MaterialPropertyVector Reference and a key
G4String *theKey = new G4String(key);
MPT.insertKeyAndValue(theKey, mpv);
}
void G4MaterialPropertiesTable::RemoveProperty(char *key)
{
G4String target(key);
MPT.remove(&target);
}
G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(char *key)
{
G4String target(key);
return MPT.findValue(&target);
}
void G4MaterialPropertiesTable::AddEntry(char *key,
G4double aPhotonMomentum,
G4double aPropertyValue)
{
G4String target(key);
G4MaterialPropertyVector *targetVector=MPT.findValue(&target);
if (targetVector != NULL) {
targetVector->AddElement(aPhotonMomentum, aPropertyValue);
}
else {
G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
"Material Property Vector not found.");
}
}
void G4MaterialPropertiesTable::RemoveEntry(char *key,
G4double aPhotonMomentum)
{
G4String target(key);
G4MaterialPropertyVector *targetVector=MPT.findValue(&target);
if (targetVector) {
targetVector->RemoveElement(aPhotonMomentum);
}
else {
G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
"Material Property Vector not found.");
}
}
void G4MaterialPropertiesTable::DumpTable()
{
MPTiterator.reset();
while(++MPTiterator) {
G4cout << *MPTiterator.key() << endl;
MPTiterator.value()->DumpVector();
}
}
@@ -0,0 +1,384 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertyVector.cc,v 2.2 1998/07/13 17:14:16 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertyVector Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertyVector.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MaterialPropertyVector.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
// ++ operator
// -----------
//
G4bool G4MaterialPropertyVector::operator ++()
{
CurrentEntry++;
if (CurrentEntry < NumEntries) {
return true;
}
else {
return false;
}
}
// = operator
// ----------
//
G4MaterialPropertyVector&
G4MaterialPropertyVector::operator =(const G4MaterialPropertyVector &right)
{
// clear the vector of current contents
MPV.clearAndDestroy();
// create an actual copy (instead of the shallow copy that the
// assignment operator defaults to for RWTPtrSortedVector)
NumEntries = 0;
CurrentEntry = -1;
for (G4int i = 0 ; i < right.NumEntries; i++) {
G4MPVEntry *newElement = new G4MPVEntry(right.GetEntry(i));
MPV.insert(newElement);
NumEntries++;
}
return *this;
}
/////////////////
// Constructors
/////////////////
G4MaterialPropertyVector::G4MaterialPropertyVector(G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumElements)
{
NumEntries = 0;
CurrentEntry = -1;
// create a vector filling it with the values
// from PhotonMomenta[] and PropertyValues[]
for(G4int i = 0; i < NumElements; i++) {
AddElement(PhotonMomenta[i], PropertyValues[i]);
}
}
G4MaterialPropertyVector::G4MaterialPropertyVector
(const G4MaterialPropertyVector &right)
{
// create an actual copy (instead of the shallow copy that the
// assignment operator defaults to for RWTPtrSortedVector)
NumEntries = 0;
CurrentEntry = -1;
for (G4int i = 0 ; i < right.NumEntries; i++) {
G4MPVEntry *newElement = new G4MPVEntry(right.GetEntry(i));
MPV.insert(newElement);
NumEntries++;
}
}
////////////////
// Destructors
////////////////
G4MaterialPropertyVector::~G4MaterialPropertyVector()
{
MPV.clearAndDestroy();
}
////////////
// Methods
////////////
void G4MaterialPropertyVector::AddElement(G4double aPhotonMomentum,
G4double aPropertyValue)
{
G4MPVEntry *newElement;
newElement = new G4MPVEntry(aPhotonMomentum, aPropertyValue);
MPV.insert(newElement);
NumEntries++;
}
void G4MaterialPropertyVector::RemoveElement(G4double aPhotonMomentum)
{
G4MPVEntry *newElement;
G4MPVEntry *success;
newElement = new G4MPVEntry(aPhotonMomentum, DBL_MAX);
success = MPV.remove(newElement);
if(success == NULL)
{
G4Exception("G4MaterialPropertyVector::RemoveElement==>"
"element not found");
return;
}
NumEntries--;
}
G4double
G4MaterialPropertyVector::GetProperty(G4double aPhotonMomentum) const
{
G4MPVEntry *target, *temp;
G4int left, right;
G4double ratio1, ratio2, pmright, pmleft, InterpolatedValue;
/////////////////////////
// Establish table range
/////////////////////////
G4double PMmin = MPV.first()->GetPhotonMomentum();
G4double minProp = MPV.first()->GetProperty();
G4double PMmax = MPV.last()->GetPhotonMomentum();
G4double maxProp = MPV.last()->GetProperty();
///////////////////////////////////////////
// Does value fall outside range of table?
///////////////////////////////////////////
if (aPhotonMomentum < PMmin)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetProperty";
G4cout << "\n==> attempt to Retrieve Property below range"
<< endl;
return minProp;
}
if (aPhotonMomentum > PMmax)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetProperty";
G4cout << "\n==> attempt to Retrieve Property above range"
<< endl;
return maxProp;
}
target = new G4MPVEntry(aPhotonMomentum, 0.0);
temp = MPV.find(target);
if (temp != NULL) {
////////////////////////
// Return actual value
////////////////////////
G4double retval = temp->GetProperty();
delete target;
return retval;
}
else {
//////////////////////////////
// Return interpolated value
//////////////////////////////
GetAdjacentBins(aPhotonMomentum, &left, &right);
pmleft = MPV[left]->GetPhotonMomentum();
pmright = MPV[right]->GetPhotonMomentum();
ratio1 = (aPhotonMomentum-pmleft)/(pmright-pmleft);
ratio2 = 1 - ratio1;
InterpolatedValue = MPV[left]->GetProperty()*ratio2 +
MPV[right]->GetProperty()*ratio1;
delete target;
return InterpolatedValue;
}
}
G4double G4MaterialPropertyVector::GetProperty() const
{
// For use with G4MaterialPropertyVector iterator
if(CurrentEntry == -1 || CurrentEntry >= NumEntries) {
G4Exception("G4MaterialPropertyVector::GetProperty ==>"
"Iterator attempted to Retrieve Property out of range");
return DBL_MAX;
}
else {
return MPV[CurrentEntry]->GetProperty();
}
}
G4double G4MaterialPropertyVector::GetPhotonMomentum() const
{
// For use with G4MaterialPropertyVector iterator
if(CurrentEntry == -1 || CurrentEntry >= NumEntries) {
G4Exception("G4MaterialPropertyVector::GetPhotonMomentum ==>"
"Iterator attempted to Retrieve Photon Momentum out of range");
return DBL_MAX;
}
else {
return MPV[CurrentEntry]->GetPhotonMomentum();
}
}
G4double
G4MaterialPropertyVector::GetPhotonMomentum(G4double aProperty) const
{
// ***NB***
// Assumes that the property is an increasing function of photon momentum (e.g.
// refraction index)
// ***NB***
//
// Returns the photon momentum corresponding to the property value passed in.
// If several photon momentum values correspond to the value passed in, the
// function returns the first photon momentum in the vector that corresponds
// to that value.
G4int left, right, mid;
G4double ratio1, ratio2, pright, pleft, InterpolatedValue;
//////////////////////////
// Establish Table range
//////////////////////////
G4double PropMin = MPV.first()->GetProperty();
G4double PMmin= MPV.first()->GetPhotonMomentum();
G4double PropMax = MPV.last()->GetProperty();
G4double PMmax= MPV.last()->GetPhotonMomentum();
///////////////////////////////////////////
// Does value fall outside range of table?
///////////////////////////////////////////
if (aProperty < PropMin)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetPhotonMomentum";
G4cout << "\n==> attempt to Retrieve Photon Momentum out of range"
<< endl;
return PMmin;
}
if (aProperty > PropMax) {
G4cout << "\nWarning: G4MaterialPropertyVector::GetPhotonMomentum";
G4cout << "\n==> attempt to Retrieve Photon Momentum out of range"
<< endl;
return PMmax;
}
//////////////////////////////
// Return interpolated value
//////////////////////////////
left = 0;
right = MPV.entries();
// find values in bins on either side of aProperty
do {
mid = (left + right)/2;
if (MPV[mid]->GetProperty() == aProperty) {
// Get first photon momentum value in vector that
// corresponds to property value
while (mid-1 >= 0 &&
MPV[mid-1]->GetProperty() == aProperty) {
mid--;
}
InterpolatedValue = MPV[mid]->GetPhotonMomentum();
goto end_GetPhotonMomentum;
}
if (MPV[mid]->GetProperty() < aProperty)
left = mid;
else
right = mid;
} while ((right - left) > 1);
pleft = MPV[left]->GetProperty();
pright = MPV[right]->GetProperty();
ratio1 = (aProperty - pleft) / (pright - pleft);
ratio2 = 1 - ratio1;
InterpolatedValue = MPV[left]->GetPhotonMomentum()*ratio2 +
MPV[right]->GetPhotonMomentum()*ratio1;
end_GetPhotonMomentum:
return InterpolatedValue;
}
void G4MaterialPropertyVector::ResetIterator()
{
CurrentEntry = -1;
}
void G4MaterialPropertyVector::DumpVector()
{
if (MPV.isEmpty()) {
G4cerr << "nothing to dump" << endl;
G4Exception("G4MaterialPropertyVector::DumpVector ==>"
"Nothing to dump! Vector is empty");
}
for (G4int i = 0; i < NumEntries; i++) {
G4cout << "MPV["<< i << "]: ";
MPV[i]->DumpEntry();
G4cout << i << NumEntries << endl;
}
G4cout << " Done DumpVector " << endl;
}
G4MPVEntry G4MaterialPropertyVector::GetEntry(G4int i) const
{
return *MPV[i];
}
void
G4MaterialPropertyVector::GetAdjacentBins(G4double aPhotonMomentum,
G4int *left,
G4int *right) const
{
G4int mid;
*left = 0;
*right = (MPV.entries() - 1);
// find values in bins on either side of aPhotonMomentum
do {
mid = (*left + *right)/2;
if (MPV[mid]->GetPhotonMomentum() < aPhotonMomentum)
{
*left = mid;
}
else
{
*right = mid;
}
} while ((*right - *left) > 1);
}
+113
View File
@@ -0,0 +1,113 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4OpticalSurface.cc,v 2.1 1998/07/13 17:14:17 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// Optical Surface Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4OpticalSurface.cc
// Description: An optical surface class for use in G4OpBoundaryProcess
// Version: 2.0
// Created: 1997-06-26
// Author: Peter Gumplinger
// mail: gum@triumf.ca
//
// Cvs version:
////////////////////////////////////////////////////////////////////////
#include "G4ios.hh"
#include "G4OpticalSurface.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
const G4OpticalSurface &
G4OpticalSurface::operator=(const G4OpticalSurface &right)
{
return right;
}
/////////////////
// Constructors
/////////////////
G4OpticalSurface::G4OpticalSurface(const G4String& name,
G4OpticalSurfaceModel model,
G4OpticalSurfaceFinish finish,
G4OpticalSurfaceType type,
G4double value)
: theName(name),
theModel(model),
theFinish(finish),
theType(type),
theMaterialPropertiesTable(NULL)
{
if (model == glisur ){
polish = value;
sigma_alpha = 0.0;
}
else if ( model == unified ) {
sigma_alpha = value;
polish = 0.0;
}
else {
G4Exception("G4OpticalSurface::G4OpticalSurface ==> "
"Constructor called with INVALID model.");
}
}
G4OpticalSurface::G4OpticalSurface(const G4OpticalSurface &right)
{
*this = right;
}
G4OpticalSurface::~G4OpticalSurface(){}
G4int G4OpticalSurface::operator==(const G4OpticalSurface &right) const
{
return (this == (G4OpticalSurface *) &right);
}
G4int G4OpticalSurface::operator!=(const G4OpticalSurface &right) const
{
return (this != (G4OpticalSurface *) &right);
}
////////////
// Methods
////////////
void G4OpticalSurface::DumpInfo() const
{
// Dump info for surface
G4cout <<
" Surface type = " << theType << endl <<
" Surface finish = " << theFinish << endl <<
" Surface model = " << theModel << endl;
G4cout << endl;
G4cout << " Surface parameter " << endl;
G4cout << " ----------------- " << endl;
if (theModel == glisur ){
G4cout << polish << endl;
}
else {
G4cout << sigma_alpha << endl;
}
G4cout << endl;
}
+125
View File
@@ -0,0 +1,125 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4SandiaTable.cc,v 2.3 1998/12/08 15:12:29 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 18.11.98 simplified public interface; new methods for materials. mma
// 10.06.97 created. V. Grichine
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4SandiaTable.hh"
#include "G4StaticSandiaData.hh"
#include "G4Material.hh"
G4int G4SandiaTable::fCumulInterval[101];
G4double G4SandiaTable::fSandiaCofPerAtom[4];
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4SandiaTable::G4SandiaTable(G4Material* material)
:fMaterial(material)
{
//build the CumulInterval array
fCumulInterval[0] = 1;
for (G4int Z=1; Z<101; Z++)
fCumulInterval[Z] = fCumulInterval[Z-1] + fNbOfIntervals[Z];
//compute macroscopic Sandia coefs for a material
ComputeMatSandiaMatrix();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4SandiaTable::~G4SandiaTable()
{ delete fMatSandiaMatrix;}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4SandiaTable::ComputeMatSandiaMatrix()
{
//get list of elements
const G4int NbElm = fMaterial->GetNumberOfElements();
const G4ElementVector* ElementVector = fMaterial->GetElementVector();
G4int* Z = new G4int[NbElm]; //Atomic number
//determine the total number of energy-intervals for this material
fMatNbOfIntervals = 0;
G4int elm;
for (elm=0; elm<NbElm; elm++)
{ Z[elm] = (int)(*ElementVector)(elm)->GetZ();
fMatNbOfIntervals += fNbOfIntervals[Z[elm]];
}
//create the sandia matrix for this material
fMatSandiaMatrix = new G4OrderedTable(fMatNbOfIntervals);
G4int interval;
for (interval=0; interval<fMatNbOfIntervals; interval++)
(*fMatSandiaMatrix)(interval) = new G4ValVector(5);
//copy the Energy bins (take care of the Ionization Potential)
G4double Ebin;
interval=0;
for (elm=0; elm<NbElm; elm++)
for (G4int row=fCumulInterval[Z[elm]-1];row<fCumulInterval[Z[elm]];row++)
{ Ebin = fSandiaTable[row][0]*keV;
if ((row==fCumulInterval[Z[elm]-1])&&(GetIonizationPot(Z[elm])<Ebin))
Ebin = GetIonizationPot(Z[elm]);
(*(*fMatSandiaMatrix)(interval++))(0) = Ebin;
}
//sort the energies in increasing values
G4double tmp;
for (G4int i1=0; i1<fMatNbOfIntervals; i1++)
for (G4int i2=i1+1; i2<fMatNbOfIntervals; i2++)
{if ((*(*fMatSandiaMatrix)(i1))(0) > (*(*fMatSandiaMatrix)(i2))(0))
{
tmp = (*(*fMatSandiaMatrix)(i1))(0);
(*(*fMatSandiaMatrix)(i1))(0) = (*(*fMatSandiaMatrix)(i2))(0);
(*(*fMatSandiaMatrix)(i2))(0) = tmp;
}
}
//ready to compute the Sandia coefs for the material
const G4double* NbOfAtomsPerVolume = fMaterial->GetVecNbOfAtomsPerVolume();
for (interval=0; interval<fMatNbOfIntervals; interval++)
{
Ebin = (*(*fMatSandiaMatrix)(interval))(0);
for (elm=0; elm<NbElm; elm++)
{
GetSandiaCofPerAtom(Z[elm], Ebin);
for (G4int j=1; j<5; j++)
(*(*fMatSandiaMatrix)(interval))(j) += NbOfAtomsPerVolume[elm]*
fSandiaCofPerAtom[j-1];
}
}
delete [] Z;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double G4SandiaTable::GetSandiaCofForMaterial(G4int interval, G4int j)
{
assert (interval>=0 && interval<fMatNbOfIntervals && j>=0 && j<5);
return ((*(*fMatSandiaMatrix)(interval))(j));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double* G4SandiaTable::GetSandiaCofForMaterial(G4double energy)
{
G4int interval = fMatNbOfIntervals - 1;
while ((interval>0)&&(energy<(*(*fMatSandiaMatrix)(interval))(0))) interval--;
return &((*(*fMatSandiaMatrix)(interval))(1));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....