1 | // |
---|
2 | // ******************************************************************** |
---|
3 | // * License and Disclaimer * |
---|
4 | // * * |
---|
5 | // * The Geant4 software is copyright of the Copyright Holders of * |
---|
6 | // * the Geant4 Collaboration. It is provided under the terms and * |
---|
7 | // * conditions of the Geant4 Software License, included in the file * |
---|
8 | // * LICENSE and available at http://cern.ch/geant4/license . These * |
---|
9 | // * include a list of copyright holders. * |
---|
10 | // * * |
---|
11 | // * Neither the authors of this software system, nor their employing * |
---|
12 | // * institutes,nor the agencies providing financial support for this * |
---|
13 | // * work make any representation or warranty, express or implied, * |
---|
14 | // * regarding this software system or assume any liability for its * |
---|
15 | // * use. Please see the license in the file LICENSE and URL above * |
---|
16 | // * for the full disclaimer and the limitation of liability. * |
---|
17 | // * * |
---|
18 | // * This code implementation is the result of the scientific and * |
---|
19 | // * technical work of the GEANT4 collaboration. * |
---|
20 | // * By using, copying, modifying or distributing the software (or * |
---|
21 | // * any work based on the software) you agree to acknowledge its * |
---|
22 | // * use in resulting scientific publications, and indicate your * |
---|
23 | // * acceptance of all terms of the Geant4 Software license. * |
---|
24 | // ******************************************************************** |
---|
25 | // $Id: bindingEnergyKummel.cc,v 1.12 2010/03/19 05:03:23 mkelsey Exp $ |
---|
26 | // Geant4 tag: $Name: geant4-09-04-beta-cand-01 $ |
---|
27 | // |
---|
28 | // 20100202 M. Kelsey -- Eliminate unnecessary use of std::pow() |
---|
29 | |
---|
30 | #include "G4InuclSpecialFunctions.hh" |
---|
31 | |
---|
32 | using namespace G4InuclSpecialFunctions; |
---|
33 | |
---|
34 | |
---|
35 | G4double G4InuclSpecialFunctions::bindingEnergyKummel(G4double A, |
---|
36 | G4double Z) { |
---|
37 | G4int verboseLevel = 2; |
---|
38 | if (verboseLevel > 3) { |
---|
39 | G4cout << " >>> G4InuclSpecialFunctions::bindingEnergyKummel" << G4endl; |
---|
40 | } |
---|
41 | |
---|
42 | // calculates the nuclei binding energy using Kummel mass formula |
---|
43 | |
---|
44 | // data for Kummel mass formula |
---|
45 | const G4double ASH[6] = {20.0, 28.0, 50.0, 82.0, 126.0, 184.0}; |
---|
46 | const G4double OMN[3] = {2.511464e0, 7.640294e-2, 2.618317e-2}; |
---|
47 | const G4double OMP[3] = {2.511464e0, 7.640294e-2, 6.243892e-3}; |
---|
48 | const G4double TMET[5] = {9.477193e0, 7.166809e-1, 1.2169e-1, 4.07179e-2, 2.927847e-2}; |
---|
49 | const G4double TMET1[4] = {-4.775384e-2, 5.880883e-5, -1.98964e-3, 3.427961e-6}; |
---|
50 | |
---|
51 | const G4double BET[5] = {1.535628e4, 1.502538e4, 1.481831e4, 1.459232e4, 1.40664e4}; |
---|
52 | |
---|
53 | const G4double SHN[5] = {8.0, 22.0, 32.0, 44.0, 58.0}; |
---|
54 | |
---|
55 | const G4double TNUN[5] = {8.728778e2, 8.45789e1, 9.210738e1, 5.98e1, 3.724e1}; |
---|
56 | |
---|
57 | const G4double TNUP[5] = {8.728778e2, 8.45789e1, 3.74e1, 5.42e1, 3.724e1}; |
---|
58 | |
---|
59 | const G4double TKSN[5] = {3.34582e1, 3.858216e0, -1.489218e-1, -9.2e-1, -6.36e-1}; |
---|
60 | |
---|
61 | const G4double TKSP[5] = {3.34582e1, 3.858216e0, 7.2e-1, -8.2e-1, -6.36e-1}; |
---|
62 | |
---|
63 | const G4double RON[5] = {-6.441735e3, -5.422058e3, -3.722645e3, -2.437172e4, -2.645867e4}; |
---|
64 | |
---|
65 | const G4double ROP[5] = {-6.75601e3, -5.877588e3, -3.216382e4, -3.010688e4, -2.645867e4}; |
---|
66 | |
---|
67 | const G4double SINGM[4] = {-3.578531e0, -2.6911e0, -7.487347e-1, 0.0}; |
---|
68 | |
---|
69 | const G4double C[2] = {6.1e3, 8.31e3}; |
---|
70 | |
---|
71 | const G4double AKU = 6.04122e5; |
---|
72 | |
---|
73 | const G4double US = 1.661835e4; |
---|
74 | |
---|
75 | const G4double UC = 6.218614e2; |
---|
76 | |
---|
77 | const G4double UT = 1.983151e4; |
---|
78 | |
---|
79 | const G4double SIPG = -2.067547e0; |
---|
80 | |
---|
81 | const G4double TAU = 2.231241e0; |
---|
82 | |
---|
83 | const G4double AL0 = 0.151; |
---|
84 | |
---|
85 | const G4double USB = 1.95114e4; |
---|
86 | |
---|
87 | const G4double UCB = 753.3; |
---|
88 | |
---|
89 | // const G4double ALD = 15.4941; |
---|
90 | // const G4double ALD1 = 17.9439; |
---|
91 | |
---|
92 | // const G4double C3 = 0.7059; |
---|
93 | |
---|
94 | //const G4double C4 = 1.21129; |
---|
95 | |
---|
96 | // const G4double PKLD = 1.7826; |
---|
97 | |
---|
98 | const G4double DMU = 3.132902e4; |
---|
99 | |
---|
100 | G4double DM; |
---|
101 | |
---|
102 | G4double AN = A - Z; |
---|
103 | |
---|
104 | G4int INS = 0; |
---|
105 | G4double ANE = 0.0; |
---|
106 | G4double HNE = 0.0; |
---|
107 | G4int i(0); |
---|
108 | |
---|
109 | for (i = 1; i < 6; i++) { |
---|
110 | |
---|
111 | if (AN <= ASH[i]) { |
---|
112 | ANE = AN - ASH[i - 1]; |
---|
113 | HNE = ASH[i] - AN; |
---|
114 | INS = i - 1; |
---|
115 | |
---|
116 | break; |
---|
117 | }; |
---|
118 | }; |
---|
119 | |
---|
120 | G4int IPS = 0; |
---|
121 | |
---|
122 | G4double APR = 0.0; |
---|
123 | |
---|
124 | G4double HPR = 0.0; |
---|
125 | |
---|
126 | for (i = 1; i < 6; i++) { |
---|
127 | |
---|
128 | if (Z <= ASH[i]) { |
---|
129 | APR = Z - ASH[i - 1]; |
---|
130 | HPR = ASH[i] - Z; |
---|
131 | IPS = i - 1; |
---|
132 | |
---|
133 | break; |
---|
134 | }; |
---|
135 | }; |
---|
136 | |
---|
137 | G4double PPHN = ANE * HNE; |
---|
138 | G4double PPHZ = APR * HPR; |
---|
139 | |
---|
140 | // omega terms |
---|
141 | G4double OMT = 0.0; |
---|
142 | |
---|
143 | if (INS <= 2) OMT += OMN[INS] * PPHN; |
---|
144 | |
---|
145 | if (IPS <= 2) OMT += OMP[IPS] * PPHZ; |
---|
146 | |
---|
147 | if (verboseLevel > 3) { |
---|
148 | G4cout << " OMT " << OMT << G4endl; |
---|
149 | } |
---|
150 | |
---|
151 | // theta term 1 |
---|
152 | |
---|
153 | G4double TET = 0.0; |
---|
154 | |
---|
155 | if (verboseLevel> 3) { |
---|
156 | G4cout << " PPHN " << PPHN << " PPHZ " << PPHZ << G4endl; |
---|
157 | G4cout << " INS " << INS << " IPS " << IPS << G4endl; |
---|
158 | } |
---|
159 | |
---|
160 | if (PPHN > 0.5 && PPHZ > 0.5) { |
---|
161 | G4int IT = 0; |
---|
162 | |
---|
163 | if ((INS + 1) * (IPS + 1) > 0) { |
---|
164 | |
---|
165 | if (INS - IPS == 1) { |
---|
166 | |
---|
167 | if (INS < 5) { |
---|
168 | IT = INS; |
---|
169 | |
---|
170 | } else { |
---|
171 | IT = -1; |
---|
172 | }; |
---|
173 | |
---|
174 | } else { |
---|
175 | IT = -1; |
---|
176 | }; |
---|
177 | }; |
---|
178 | |
---|
179 | if (verboseLevel > 3){ |
---|
180 | G4cout << " IT " << IT << G4endl; |
---|
181 | } |
---|
182 | |
---|
183 | if (IT >= 0) TET = TMET[IT] * PPHN * PPHZ; |
---|
184 | }; |
---|
185 | |
---|
186 | if (verboseLevel> 3) { |
---|
187 | G4cout << " TET " << TET << G4endl; |
---|
188 | } |
---|
189 | |
---|
190 | // theta term 2 |
---|
191 | G4double TET1 = 0.0; |
---|
192 | |
---|
193 | if (IPS == 2) { |
---|
194 | TET1 += TMET1[0] * PPHZ * PPHZ; |
---|
195 | |
---|
196 | if (INS == 3) TET1 += TMET1[1] * PPHN * PPHZ * HNE * HPR; |
---|
197 | }; |
---|
198 | |
---|
199 | if (INS == 3) { |
---|
200 | |
---|
201 | G4double TVSP = PPHN * PPHN * HNE; |
---|
202 | TET1 += TMET1[2] * TVSP; |
---|
203 | TET1 += TMET1[3] * TVSP * PPHN; |
---|
204 | }; |
---|
205 | |
---|
206 | if (verboseLevel > 3) { |
---|
207 | G4cout << " TET1 " << TET1 << G4endl; |
---|
208 | } |
---|
209 | |
---|
210 | // betta, nu, ksy terms |
---|
211 | G4double TBET = 0.0; |
---|
212 | |
---|
213 | if (INS != 0) { |
---|
214 | |
---|
215 | for (G4int i = 0; i <= INS - 1; i++) TBET += BET[i] * SHN[i]; |
---|
216 | }; |
---|
217 | TBET += BET[INS] * ANE; |
---|
218 | |
---|
219 | if (IPS != 0) { |
---|
220 | |
---|
221 | for (G4int i = 0; i <= IPS - 1; i++) TBET += BET[i] * SHN[i]; |
---|
222 | }; |
---|
223 | TBET += BET[IPS] * APR; |
---|
224 | |
---|
225 | if (verboseLevel> 3) { |
---|
226 | G4cout << " TBET " << TBET << G4endl; |
---|
227 | } |
---|
228 | |
---|
229 | G4double TBET1 = 0.0; |
---|
230 | |
---|
231 | if (PPHN > 0.0 || PPHZ > 0.0) |
---|
232 | TBET1 = 0.5 * ((TNUN[INS] + TKSN[INS] * ANE) * PPHN + |
---|
233 | (TNUP[IPS] + TKSP[IPS] * APR) * PPHZ); |
---|
234 | TBET -= TBET1; |
---|
235 | |
---|
236 | if (verboseLevel > 3) { |
---|
237 | G4cout << " TBET1 " << TBET1 << G4endl; |
---|
238 | } |
---|
239 | |
---|
240 | // deformation |
---|
241 | G4double TDEF = 0.0; |
---|
242 | G4double X = Z * Z / A; |
---|
243 | G4double X1 = G4cbrt(A); |
---|
244 | G4double X2 = X1 * X1; |
---|
245 | |
---|
246 | if (IPS != INS && INS >= 3 && IPS >= 2) { |
---|
247 | G4double X3 = 2.0 * USB - UCB * X; |
---|
248 | G4double DNZ = 0.0; |
---|
249 | |
---|
250 | if (!(INS < 3 || (INS - IPS) != 1)) DNZ = C[INS - 3]; |
---|
251 | DNZ = TBET1 - DNZ; |
---|
252 | G4double X4 = 0.2 * X2 * AL0 * AL0 * X3; |
---|
253 | |
---|
254 | if (DNZ > X4) { |
---|
255 | G4double X5 = USB + X * UCB; |
---|
256 | G4double X6 = std::log(DNZ / X4); |
---|
257 | G4double X7 = std::sqrt(X6); |
---|
258 | |
---|
259 | // G4double ALM = AL0 * (X7 + 0.143 * AL0 * X5 / X3); |
---|
260 | TDEF = -X4 * (X6 + 1.0) + DNZ + 0.038 * X2 * (AL0*X7 * AL0*X7 * AL0*X7) * X5; |
---|
261 | }; |
---|
262 | }; |
---|
263 | |
---|
264 | if (verboseLevel > 3) { |
---|
265 | G4cout << " TDEF " << TDEF << G4endl; |
---|
266 | } |
---|
267 | |
---|
268 | // pairing |
---|
269 | G4double TPE = 0.0; |
---|
270 | G4double TPEN = 0.0; |
---|
271 | G4double TPEP = 0.0; |
---|
272 | G4double DN0 = 0.0; |
---|
273 | G4double DZ0 = 0.0; |
---|
274 | G4double AV = 2.0 * int(0.5 * AN + 0.1); |
---|
275 | |
---|
276 | if (AN > AV) DN0 = 1.0; |
---|
277 | |
---|
278 | AV = 2.0 * int(0.5 * Z + 0.1); |
---|
279 | |
---|
280 | if (Z > AV) DZ0 = 1.0; |
---|
281 | |
---|
282 | if (DN0 * DZ0 > 0.0) TPE = DMU / A; |
---|
283 | |
---|
284 | if (DN0 + DZ0 > 0.0) { |
---|
285 | |
---|
286 | if (DN0 > 0.0) { |
---|
287 | TPEN = RON[INS] / X1; |
---|
288 | |
---|
289 | if (INS >= 1) { |
---|
290 | |
---|
291 | if (AN >= 82.0) { |
---|
292 | TPEN /= X1; |
---|
293 | |
---|
294 | if (INS == 3) { |
---|
295 | G4double PN = 0.0; |
---|
296 | G4double HN = 0.0; |
---|
297 | |
---|
298 | if (AN > 90.0) PN = AN - 90.0; |
---|
299 | |
---|
300 | if (AN < 116.0) HN = 116.0 - AN; |
---|
301 | TPEN += TAU * PN * HN; |
---|
302 | }; |
---|
303 | TPEN += SINGM[INS - 1] * PPHN; |
---|
304 | }; |
---|
305 | }; |
---|
306 | }; |
---|
307 | |
---|
308 | if (DZ0 > 0.0) { |
---|
309 | TPEP = ROP[IPS] / X1; |
---|
310 | |
---|
311 | if (IPS == 1) TPEP += SIPG * PPHZ; |
---|
312 | |
---|
313 | if (IPS > 1) TPEP = TPEP / X1; |
---|
314 | |
---|
315 | }; |
---|
316 | }; |
---|
317 | TPE += TPEN + TPEP; |
---|
318 | |
---|
319 | if (verboseLevel > 3) { |
---|
320 | G4cout << " TPE " << TPE << " TPEN " << TPEN << " TPEP " << TPEP << G4endl; |
---|
321 | } |
---|
322 | |
---|
323 | // collect everything |
---|
324 | DM = (AKU - US * X2 + Z * (Z - 1.0) / X1 * (OMT - UC) - UT / A * |
---|
325 | (AN - Z) * (AN - Z) + TET + TET1 + TBET + TDEF + TPE) * 0.001; |
---|
326 | |
---|
327 | if (verboseLevel > 3) { |
---|
328 | G4cout << " kummel " << G4endl; |
---|
329 | } |
---|
330 | |
---|
331 | return DM; |
---|
332 | } |
---|