16 character (len=128) :: cerr
28 real (R8),
intent(in) :: function_parameters(:,:), x(:)
29 real (R8),
intent(out) :: f(:)
30 logical,
intent(in) :: with_warnings
38 if(
size(function_parameters,1).ne.12)
then
39 write(fun_err%cerr,*)
"nuclear_data_1001: Expected the length of 'function_parameters' to be 12 in 'nuclear_data_1001' and not ", &
40 size(function_parameters)
44 if(
size(x).ne.
size(f))
then
45 write(fun_err%cerr,*)
"nuclear_data_1001: Expected the input and output vectors to be the same size in 'nuclear_data_1001'"
53 if(e.lt.function_parameters(11,j) .and. with_warnings)
then
54 write(*,*)
'extrapolating below the desired range'
56 do while(e.gt.function_parameters(12,j).and. &
57 j.lt.
size(function_parameters,2))
60 if(e.gt.function_parameters(12,j))
then
61 if (with_warnings)
then
62 write(*,*)
'extrapolating above the desired range'
63 write(*,*) j, x(
i), function_parameters(12,j)
64 write(*,*)
'Taking the boundary value when calculating S!'
66 e = function_parameters(12,j)
68 s = ( function_parameters(2,j) &
69 & + e*(function_parameters(3,j) &
70 & + e*(function_parameters(4,j) &
71 & + e*( function_parameters(5,j) &
72 & +e*function_parameters(6,j) ) ) ) ) &
73 & /( 1 + e*(function_parameters(7,j)&
74 & + e*(function_parameters(8,j) &
75 & + e*( function_parameters(9,j) &
76 & +e*function_parameters(10,j) ) ) ) )
82 f(
i) = s / (e * exp(function_parameters(1,j)/sqrt(e))) * 1.0e-31_r8
93 real (R8),
intent(in) :: function_parameters(:,:), tin(:)
94 real (R8),
intent(out) :: f(:)
95 logical,
intent(in) :: with_warnings
101 real (R8) :: theta,xi,mrc2,bg
107 if(
size(function_parameters,1).ne.11)
then
108 write(fun_err%cerr,*)
"nuclear_data_1002: Expected the length of 'function_parameters' to be 11 in 'nuclear_data_1002' and not ", &
109 size(function_parameters)
113 if(
size(tin).ne.
size(f))
then
114 write(fun_err%cerr,*)
"nuclear_data_1002: Expected the input and output vectors to be the same size in 'nuclear_data_1002'"
125 if(t.lt.function_parameters(10,ir) .and. with_warnings)
then
126 write(*,*)
'extrapolating below the desired range'
128 do while(t.gt.function_parameters(11,ir).and. &
129 ir.lt.
size(function_parameters,2))
132 if(t.gt.function_parameters(11,ir) .and. with_warnings)
then
133 write(*,*)
'extrapolating above the desired range'
135 write(*,*) ir, tin(it), function_parameters(11,ir)
138 bg =function_parameters(1, ir)
139 mrc2=function_parameters(2, ir)
140 c =function_parameters(3:9, ir)
143 theta=t/(1-t*(c(2)+t*(c(4)+t*c(6)))&
144 /(1+t*(c(3)+t*(c(5)+t*c(7)))))
145 xi=(bg**2/(4*theta))**(1.0_r8/3.0_r8)
146 f(it) = c(1)*theta*sqrt(xi/(mrc2*t**3))&
160 subroutine rct_data_1003(function_parameters, Tin, f, with_warnings, fun_err)
162 real (R8),
intent(in) :: function_parameters(:), tin(:)
163 real (R8),
intent(out) :: f(:)
164 logical,
intent(in) :: with_warnings
171 if(
size(function_parameters,1).ne.2)
then
172 write(fun_err%cerr,*)
"rct_data_1003: Expected the length of 'function_parameters' to be 2 in 'rct_data_1003' and not ", &
173 size(function_parameters)
177 if(
size(tin).ne.
size(f))
then
178 write(fun_err%cerr,*)
"rct_data_1003: Expected the input and output vectors to be the same size in 'rct_data_1003'"
184 f(it) = function_parameters(1)*(1.0_r8 + function_parameters(2)* log(1.0_r8/tin(it)))**2*1e-20_r8
196 subroutine sputter_data_1004(function_parameters, energy_arr, angle_arr, yield_arr, with_warnings, fun_err)
199 real (R8),
intent(in) :: function_parameters(:,:), energy_arr(:), angle_arr(:)
200 real (R8),
intent(out) :: yield_arr(:)
201 logical,
intent(in) :: with_warnings
204 real (R8) :: energy, angle, yield
205 real(R8) :: matchanglee0, matchanglee1
206 real(R8) :: m1, m2, z1, z2, q, lambda, mu, eth, f,b,c,esp
207 integer :: numtab, ianglee0, numpars, boundianglee0, ipars
209 logical,
parameter :: debug=.true.
211 integer :: have_angle_data
216 numtab = ubound(function_parameters, 2)
217 if(debug .and. with_warnings)
then
220 do id = lbound(energy_arr,1), ubound(energy_arr,1)
222 energy = energy_arr(id)
223 angle = angle_arr(id)
225 if(debug .and. with_warnings)
then
226 write(*,*) energy, angle
232 do ia = lbound(function_parameters, 2), ubound(function_parameters, 2)
233 matchanglee1 = function_parameters(3, ia)
234 if(debug .and. with_warnings)
then
235 write(*,*) matchanglee0, energy, matchanglee1
237 if((matchanglee0.le.energy).and.(matchanglee1.ge.energy))
then
242 if (matchanglee1 < matchanglee0)
then
243 if (matchanglee1 < matchanglee0)
then
244 if(debug .and. with_warnings)
then
245 write(*, *)
'WARNING::sputteryield-> no angular reflection yield data available, returning value for perpendicular impact'
250 write(fun_err%cerr,*)
'sputter_data_1004: sputteryield-> angular dependence energies are not sorted, rebuild the database'
255 matchanglee0 = matchanglee1
258 if(boundianglee0.lt.0)
then
259 if (debug .and. with_warnings)
then
260 write(*,*)
'sputter_data_1004: No Bound found for: ', energy,
' angle: ', angle,
'using boundianglee0 = ', numtab
262 boundianglee0 = ubound(function_parameters, 2)
265 m1 = function_parameters( 4, boundianglee0)
266 m2 = function_parameters( 5, boundianglee0)
267 z1 = function_parameters( 1, boundianglee0)
268 z2 = function_parameters( 2, boundianglee0)
269 q = function_parameters( 6, boundianglee0)
270 lambda = function_parameters( 9, boundianglee0)
271 eth = function_parameters( 8, boundianglee0)
272 mu = function_parameters( 7, boundianglee0)
273 f = function_parameters(10, boundianglee0)
274 b = function_parameters(11, boundianglee0)
275 c = function_parameters(12, boundianglee0)
276 esp = function_parameters(13, boundianglee0)
279 if (energy .gt. eth)
then
280 if (have_angle_data .gt. 0)
then
281 yield =
seyield(energy, m1, m2, z1, z2, q, lambda, mu, eth) *
sayield(energy, angle, f, b, c, esp)
283 yield =
seyield(energy, m1, m2, z1, z2, q, lambda, mu, eth)
287 yield_arr(id) = yield
300 subroutine reflect_data_1005(function_parameters, energy_arr, angle_arr, refl_arr, with_warnings, fun_err)
303 real (R8),
intent(in) :: function_parameters(:,:), energy_arr(:), angle_arr(:)
304 real (R8),
intent(out) :: refl_arr(:)
305 logical,
intent(in) :: with_warnings
308 real (R8) :: energy, angle, refl
309 real(R8) :: m1, m2, z1, z2, a1, a2, a3, a4, e1, esp, anglee0, anglee1, c1, c2, c3, c4
310 real(R8) :: c1from, c2from, c3from, c4from
311 real(R8) :: c1to, c2to, c3to, c4to
312 real(R8) :: matchanglee0, matchanglee1
313 integer :: numtab, ianglee0, numpars, boundianglee0, boundianglee1, ipars
315 logical,
parameter :: debug=.true.
317 integer :: have_angle_data
322 numtab = ubound(function_parameters, 2)
323 do id = lbound(energy_arr,1), ubound(energy_arr,1)
325 energy = energy_arr(id)
326 angle = angle_arr(id)
332 do ia = lbound(function_parameters, 2), ubound(function_parameters, 2)
333 matchanglee1 = function_parameters(11, ia)
334 if(debug .and. with_warnings)
then
335 write(*,*) matchanglee0, energy, matchanglee1
337 if((matchanglee0.le.energy).and.(matchanglee1.ge.energy))
then
339 if(ia .lt. numtab)
then
340 boundianglee0 = ia - 1
343 boundianglee0 = numtab
344 boundianglee1 = numtab
353 if (matchanglee1 < matchanglee0)
then
354 if (matchanglee1 .lt. 0)
then
355 if(debug .and. with_warnings)
then
356 write(*,*)
'WARNING::reflyield-> no angular reflection yield data available, returning value for perpendicular impact'
361 write(fun_err%cerr,*)
'reflect_data_1005: reflyield-> angular dependence energies are not sorted, rebuild the database'
366 matchanglee0 = matchanglee1
369 if((boundianglee0.lt.0).or.(boundianglee1.lt.0))
then
370 if (matchanglee1.lt.energy)
then
371 boundianglee0 = numtab
372 boundianglee1 = numtab
377 if (debug .and. with_warnings)
then
378 write(*,*)
'reflect_data_1005: No Bound found for: ', energy,
' angle: ', angle,
'using boundianglee0 = ', boundianglee0,
'and boundianglee1 = ',boundianglee1
382 z1 = function_parameters( 1, boundianglee0)
383 z2 = function_parameters( 2, boundianglee0)
384 m1 = function_parameters( 3, boundianglee0)
385 m2 = function_parameters( 4, boundianglee0)
386 a1 = function_parameters( 5, boundianglee0)
387 a2 = function_parameters( 6, boundianglee0)
388 a3 = function_parameters( 7, boundianglee0)
389 a4 = function_parameters( 8, boundianglee0)
390 e1 = function_parameters( 9, boundianglee0)
391 esp = function_parameters(10, boundianglee0)
393 if ((angle.lt.1.0).or.(have_angle_data.eq.-1))
then
394 if (debug .and. with_warnings)
then
395 write(*,*)
'angle = ',angle,
' is small or no angular data available: using perpendicular impact model with energy dependence'
397 refl =
reyield(energy, m1, m2, z1, z2, a1, a2, a3, a4)
399 if (debug .and. with_warnings)
then
400 write(*,*)
'angle = ',angle,
' is large using angular dependent model and interpolation of energy dependence'
403 if(boundianglee0.lt.boundianglee1)
then
404 anglee0 = function_parameters(11, boundianglee0)
405 anglee1 = function_parameters(11, boundianglee1)
406 if(debug .and. with_warnings)
then
407 write(*,*)
'Interpolating angular dependent reflection yield for energy' ,energy,
' between values for energies ', anglee0,
' and ', anglee1
409 c1from = function_parameters(12, boundianglee0)
410 c2from = function_parameters(13, boundianglee0)
411 c3from = function_parameters(14, boundianglee0)
412 c4from = function_parameters(15, boundianglee0)
414 c1to = function_parameters(12, boundianglee1)
415 c2to = function_parameters(13, boundianglee1)
416 c3to = function_parameters(14, boundianglee1)
417 c4to = function_parameters(15, boundianglee1)
419 c1 = c1from + ((energy - anglee0) * (c1to - c1from) / (anglee1 - anglee0))
420 c2 = c2from + ((energy - anglee0) * (c2to - c2from) / (anglee1 - anglee0))
421 c3 = c3from + ((energy - anglee0) * (c3to - c3from) / (anglee1 - anglee0))
422 c4 = c4from + ((energy - anglee0) * (c4to - c4from) / (anglee1 - anglee0))
424 anglee0 = function_parameters(11, boundianglee0)
425 if(debug .and. with_warnings)
then
426 write(*,*)
'Energy: ',energy,
' for requested angle: ',angle,
' not within db bounds using anglular dependent value at energy = ', anglee0
428 c1 = function_parameters(12, boundianglee0)
429 c2 = function_parameters(13, boundianglee0)
430 c3 = function_parameters(14, boundianglee0)
431 c4 = function_parameters(15, boundianglee0)
433 refl =
rayield(angle, c1, c2, c3, c4)
436 refl_arr(id) = min(1.0_r8, refl)
444 real (R8),
intent(in) :: function_parameters(:,:), x(:)
445 real (R8),
intent(out) :: f(:)
446 logical,
intent(in) :: with_warnings
454 if(
size(function_parameters,1).ne.14)
then
455 write(fun_err%cerr,*)
"nuclear_data_1006: Expected the length of 'function_parameters' to be 14 in 'nuclear_data_1006' and not ", &
456 size(function_parameters)
460 if(
size(x).ne.
size(f))
then
461 write(fun_err%cerr,*)
"nuclear_data_1006: Expected the input and output vectors to be the same size in 'nuclear_data_1006'"
469 if(e.lt.function_parameters(13,j) .and. with_warnings)
then
470 write(*,*)
'extrapolating below the desired range'
472 do while(e.gt.function_parameters(14,j).and. &
473 j.lt.
size(function_parameters,2))
476 if(e.gt.function_parameters(14,j))
then
477 if (with_warnings)
then
478 write(*,*)
'extrapolating above the desired range'
479 write(*,*) j, x(
i), function_parameters(12,j)
480 write(*,*)
'Taking the boundary value when calculating S!'
482 e = function_parameters(14,j)
484 s = ( function_parameters(2,j) &
485 & + e*(function_parameters(3,j) &
486 & + e*(function_parameters(4,j) &
487 & + e*(function_parameters(5,j) &
488 & + e*(function_parameters(6,j) &
489 & + e* function_parameters(7,j) ) ) ) ) ) &
491 & + e*(function_parameters(8,j) &
492 & + e*(function_parameters(9,j) &
493 & + e*(function_parameters(10,j) &
494 & + e*(function_parameters(11,j) &
495 & + e* function_parameters(12,j) ) ) ) ) )
501 f(
i) = s / (e * exp(function_parameters(1,j)/sqrt(e))) * 1.0e-31_r8
subroutine reflect_data_1005(function_parameters, energy_arr, angle_arr, refl_arr, with_warnings, fun_err)
AMNS External function ...
subroutine nuclear_data_1001(function_parameters, x, f, with_warnings, fun_err)
AMNS External function ...
subroutine sputter_data_1004(function_parameters, energy_arr, angle_arr, yield_arr, with_warnings, fun_err)
AMNS External function ...
subroutine nuclear_data_1002(function_parameters, Tin, f, with_warnings, fun_err)
AMNS External function ...
real(r8) function reyield(E0, M1, M2, Z1, Z2, A1, A2, A3, A4)
AMNS External utility function ...
subroutine rct_data_1003(function_parameters, Tin, f, with_warnings, fun_err)
AMNS External function ...
real(r8) function sayield(E0, theta, f, b, c, Esp)
AMNS External utility function ...
subroutine nuclear_data_1006(function_parameters, x, f, with_warnings, fun_err)
real(r8) function seyield(E0, M1, M2, Z1, Z2, q, lambda, u, ETh)
AMNS External utility function ...
real(r8) function rayield(angledeg, C1, C2, C3, C4)
AMNS External utility function ...