mirror of
https://github.com/gwm17/catima.git
synced 2024-11-26 20:18:51 -05:00
commit
f212a7409b
35
catima.cpp
35
catima.cpp
|
@ -87,6 +87,23 @@ double dedx_from_range(Projectile &p, double T, const Material &t, const Config
|
||||||
return p.A/range_spline.derivative(T);
|
return p.A/range_spline.derivative(T);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<double> dedx_from_range(Projectile &p, const std::vector<double> &T, const Material &t, const Config &c){
|
||||||
|
auto data = _storage.Get(p,t,c);
|
||||||
|
Interpolator range_spline(energy_table.values,data.range.data(),energy_table.num);
|
||||||
|
|
||||||
|
std::vector<double> dedx;
|
||||||
|
dedx.reserve(T.size());
|
||||||
|
for(auto e:T){
|
||||||
|
if(e<catima::Ezero){
|
||||||
|
dedx.push_back(0.0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
dedx.push_back(p.A/range_spline.derivative(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dedx;
|
||||||
|
}
|
||||||
|
|
||||||
double range_straggling(Projectile &p, double T, const Material &t, const Config &c){
|
double range_straggling(Projectile &p, double T, const Material &t, const Config &c){
|
||||||
double r=0;
|
double r=0;
|
||||||
auto data = _storage.Get(p,t,c);
|
auto data = _storage.Get(p,t,c);
|
||||||
|
@ -161,6 +178,24 @@ double energy_out(Projectile &p, double T, const Material &t, const Config &c){
|
||||||
return energy_out(T,t.thickness(),range_spline);
|
return energy_out(T,t.thickness(),range_spline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<double> energy_out(Projectile &p, const std::vector<double> &T, const Material &t, const Config &c){
|
||||||
|
auto data = _storage.Get(p,t,c);
|
||||||
|
Interpolator range_spline(energy_table.values,data.range.data(),energy_table.num);
|
||||||
|
|
||||||
|
std::vector<double> eout;
|
||||||
|
eout.reserve(T.size());
|
||||||
|
for(auto e:T){
|
||||||
|
if(e<catima::Ezero){
|
||||||
|
eout.push_back(0.0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
eout.push_back(energy_out(e,t.thickness(),range_spline));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return eout;
|
||||||
|
}
|
||||||
|
|
||||||
Result calculate(Projectile &p, const Material &t, const Config &c){
|
Result calculate(Projectile &p, const Material &t, const Config &c){
|
||||||
Result res;
|
Result res;
|
||||||
double T = p.T;
|
double T = p.T;
|
||||||
|
|
19
catima.h
19
catima.h
|
@ -18,6 +18,7 @@
|
||||||
#define CPPATIMA_H
|
#define CPPATIMA_H
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
// #define NDEBUG
|
// #define NDEBUG
|
||||||
#include "catima/build_config.h"
|
#include "catima/build_config.h"
|
||||||
|
@ -70,6 +71,15 @@ namespace catima{
|
||||||
*/
|
*/
|
||||||
double dedx_from_range(Projectile &p, double T, const Material &t, const Config &c=default_config);
|
double dedx_from_range(Projectile &p, double T, const Material &t, const Config &c=default_config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the dEdx calculated from range spline as derivative
|
||||||
|
* @param p - Projectile
|
||||||
|
* @param T - energy vector
|
||||||
|
* @param mat - Material
|
||||||
|
* @return range
|
||||||
|
*/
|
||||||
|
std::vector<double> dedx_from_range(Projectile &p, const std::vector<double> &T, const Material &t, const Config &c=default_config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns the range straggling of the Projectile in Material from spline
|
* returns the range straggling of the Projectile in Material from spline
|
||||||
* @param p - Projectile
|
* @param p - Projectile
|
||||||
|
@ -144,6 +154,15 @@ namespace catima{
|
||||||
*/
|
*/
|
||||||
double energy_out(Projectile &p, double T, const Material &t, const Config &c=default_config);
|
double energy_out(Projectile &p, double T, const Material &t, const Config &c=default_config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* calculates outcoming energy
|
||||||
|
* @p - Projectile
|
||||||
|
* @t - Material
|
||||||
|
* @param T - incoming energy vector
|
||||||
|
* @return outcoming energy after the material in Mev/u
|
||||||
|
*/
|
||||||
|
std::vector<double> energy_out(Projectile &p, const std::vector<double> &T, const Material &t, const Config &c=default_config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* calculates all observables for projectile passing material
|
* calculates all observables for projectile passing material
|
||||||
* @param p - Projectile
|
* @param p - Projectile
|
||||||
|
|
21
catima.pyx
21
catima.pyx
|
@ -7,6 +7,7 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
cimport catimac
|
cimport catimac
|
||||||
|
from libcpp.vector cimport vector
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
import numpy
|
import numpy
|
||||||
|
|
||||||
|
@ -391,13 +392,13 @@ def projectile_range(Projectile projectile, Material material, energy = None, Co
|
||||||
|
|
||||||
def dedx_from_range(Projectile projectile, Material material, energy = None, Config config = default_config):
|
def dedx_from_range(Projectile projectile, Material material, energy = None, Config config = default_config):
|
||||||
if(isinstance(energy,numpy.ndarray)):
|
if(isinstance(energy,numpy.ndarray)):
|
||||||
res = numpy.empty(energy.size)
|
res = catimac.dedx_from_range(projectile.cbase, <vector[double]>energy.tolist(), material.cbase, config.cbase)
|
||||||
for i,e in enumerate(energy):
|
return numpy.asarray(res);
|
||||||
res[i] = catimac.dedx_from_range(projectile.cbase, e, material.cbase, config.cbase)
|
if(isinstance(energy,list)):
|
||||||
return res
|
return catimac.dedx_from_range(projectile.cbase, <vector[double]>energy, material.cbase, config.cbase)
|
||||||
if(energy is None):
|
if(energy is None):
|
||||||
energy = projectile.T()
|
energy = projectile.T()
|
||||||
return catimac.dedx_from_range(projectile.cbase, energy, material.cbase, config.cbase);
|
return catimac.dedx_from_range(projectile.cbase, <double>energy, material.cbase, config.cbase);
|
||||||
|
|
||||||
def domega2de(Projectile projectile, Material material, energy = None, Config config = default_config):
|
def domega2de(Projectile projectile, Material material, energy = None, Config config = default_config):
|
||||||
if(isinstance(energy,numpy.ndarray)):
|
if(isinstance(energy,numpy.ndarray)):
|
||||||
|
@ -441,13 +442,13 @@ def domega2dx(Projectile projectile, Material material, energy = None, Config co
|
||||||
|
|
||||||
def energy_out(Projectile projectile, Material material, energy = None, Config config = default_config):
|
def energy_out(Projectile projectile, Material material, energy = None, Config config = default_config):
|
||||||
if(isinstance(energy,numpy.ndarray)):
|
if(isinstance(energy,numpy.ndarray)):
|
||||||
res = numpy.empty(energy.size)
|
res = catimac.energy_out(projectile.cbase, <vector[double]>energy.tolist(), material.cbase, config.cbase)
|
||||||
for i,e in enumerate(energy):
|
return numpy.asarray(res)
|
||||||
res[i] = catimac.energy_out(projectile.cbase, e, material.cbase, config.cbase)
|
if(isinstance(energy,list)):
|
||||||
return res
|
return catimac.energy_out(projectile.cbase, <vector[double]>energy, material.cbase, config.cbase)
|
||||||
if(energy is None):
|
if(energy is None):
|
||||||
energy = projectile.T()
|
energy = projectile.T()
|
||||||
return catimac.energy_out(projectile.cbase, energy, material.cbase, config.cbase)
|
return catimac.energy_out(projectile.cbase, <double>energy, material.cbase, config.cbase)
|
||||||
|
|
||||||
def sezi_dedx_e(Projectile projectile, Target t):
|
def sezi_dedx_e(Projectile projectile, Target t):
|
||||||
return catimac.sezi_dedx_e(projectile.cbase, t.cbase)
|
return catimac.sezi_dedx_e(projectile.cbase, t.cbase)
|
||||||
|
|
|
@ -73,7 +73,9 @@ cdef extern from "catima/catima.h" namespace "catima":
|
||||||
cdef double domega2dx(Projectile &p, double T, const Material &mat, const Config &c)
|
cdef double domega2dx(Projectile &p, double T, const Material &mat, const Config &c)
|
||||||
cdef double range(Projectile &p, double T, const Material &t, const Config &c);
|
cdef double range(Projectile &p, double T, const Material &t, const Config &c);
|
||||||
cdef double dedx_from_range(Projectile &p, double T, const Material &t, const Config &c);
|
cdef double dedx_from_range(Projectile &p, double T, const Material &t, const Config &c);
|
||||||
|
cdef vector[double] dedx_from_range(Projectile &p, vector[double] &T, const Material &t, const Config &c);
|
||||||
cdef double energy_out(Projectile &p, double T, const Material &t, const Config &c);
|
cdef double energy_out(Projectile &p, double T, const Material &t, const Config &c);
|
||||||
|
cdef vector[double] energy_out(Projectile &p, vector[double] &T, const Material &t, const Config &c);
|
||||||
|
|
||||||
cdef double domega2de(Projectile &p, double T, const Material &t, const Config &c);
|
cdef double domega2de(Projectile &p, double T, const Material &t, const Config &c);
|
||||||
cdef double da2de(Projectile &p, double T, const Material &t, const Config &c);
|
cdef double da2de(Projectile &p, double T, const Material &t, const Config &c);
|
||||||
|
|
|
@ -144,8 +144,6 @@ class TestStructures(unittest.TestCase):
|
||||||
|
|
||||||
def test_material_calculation(self):
|
def test_material_calculation(self):
|
||||||
water = catima.get_material(catima.material.WATER)
|
water = catima.get_material(catima.material.WATER)
|
||||||
water2 = catima.get_material(catima.material.WATER)
|
|
||||||
water2.I(78.0)
|
|
||||||
p = catima.Projectile(1,1)
|
p = catima.Projectile(1,1)
|
||||||
|
|
||||||
p(1000)
|
p(1000)
|
||||||
|
@ -154,15 +152,10 @@ class TestStructures(unittest.TestCase):
|
||||||
self.assertAlmostEqual(res.dEdxi,2.23,1)
|
self.assertAlmostEqual(res.dEdxi,2.23,1)
|
||||||
self.assertAlmostEqual(res["dEdxi"],2.23,1)
|
self.assertAlmostEqual(res["dEdxi"],2.23,1)
|
||||||
self.assertAlmostEqual(res.dEdxi,res2,3)
|
self.assertAlmostEqual(res.dEdxi,res2,3)
|
||||||
res3 = catima.calculate(p,water2)
|
|
||||||
self.assertTrue(res.dEdxi>res3.dEdxi)
|
|
||||||
|
|
||||||
res = catima.calculate(p(500),water)
|
res = catima.calculate(p(500),water)
|
||||||
res2 = catima.dedx(p,water)
|
res2 = catima.dedx(p,water)
|
||||||
self.assertAlmostEqual(res.dEdxi,2.76,1)
|
self.assertAlmostEqual(res.dEdxi,2.76,1)
|
||||||
self.assertAlmostEqual(res.dEdxi,res2,3)
|
self.assertAlmostEqual(res.dEdxi,res2,3)
|
||||||
res3 = catima.calculate(p,water2)
|
|
||||||
self.assertTrue(res.dEdxi>res3.dEdxi)
|
|
||||||
|
|
||||||
res = catima.calculate(p(9),water)
|
res = catima.calculate(p(9),water)
|
||||||
res2 = catima.dedx(p,water)
|
res2 = catima.dedx(p,water)
|
||||||
|
@ -187,7 +180,31 @@ class TestStructures(unittest.TestCase):
|
||||||
self.assertAlmostEqual(res["Eout"],997.077,1)
|
self.assertAlmostEqual(res["Eout"],997.077,1)
|
||||||
self.assertAlmostEqual(res.Eout,res2,3)
|
self.assertAlmostEqual(res.Eout,res2,3)
|
||||||
|
|
||||||
def test_layer_calculateion(self):
|
def test_eout_list(self):
|
||||||
|
graphite = catima.get_material(6)
|
||||||
|
graphite.thickness(0.5)
|
||||||
|
p = catima.Projectile(12,6)
|
||||||
|
energies = [100,500,1000]
|
||||||
|
res = catima.calculate(p(1000),graphite)
|
||||||
|
self.assertAlmostEqual(res.Eout,997.077,1)
|
||||||
|
res2 = catima.energy_out(p,graphite,energy=energies)
|
||||||
|
self.assertEqual(len(res2),len(energies))
|
||||||
|
self.assertAlmostEqual(res2[2], 997.077,1)
|
||||||
|
self.assertAlmostEqual(res2[0], catima.calculate(p(energies[0]),graphite).Eout ,1)
|
||||||
|
self.assertAlmostEqual(res2[1], catima.calculate(p(energies[1]),graphite).Eout ,1)
|
||||||
|
|
||||||
|
def test_dedx_from_range_list(self):
|
||||||
|
graphite = catima.get_material(6)
|
||||||
|
graphite.thickness(0.5)
|
||||||
|
p = catima.Projectile(12,6)
|
||||||
|
energies = [100,500,1000]
|
||||||
|
res2 = catima.dedx_from_range(p,graphite,energy=energies)
|
||||||
|
self.assertEqual(len(res2),len(energies))
|
||||||
|
for i,e in enumerate(energies):
|
||||||
|
r = catima.dedx_from_range(p, graphite, energy=e)
|
||||||
|
self.assertAlmostEqual(res2[i], r, 0.1)
|
||||||
|
|
||||||
|
def test_layer_calculation(self):
|
||||||
p = catima.Projectile(12,6)
|
p = catima.Projectile(12,6)
|
||||||
water = catima.get_material(catima.material.WATER)
|
water = catima.get_material(catima.material.WATER)
|
||||||
water.thickness(10.0)
|
water.thickness(10.0)
|
||||||
|
@ -261,9 +278,8 @@ class TestStructures(unittest.TestCase):
|
||||||
graphite = catima.get_material(6)
|
graphite = catima.get_material(6)
|
||||||
graphite.thickness(1.0)
|
graphite.thickness(1.0)
|
||||||
data = catima.get_data(p, water)
|
data = catima.get_data(p, water)
|
||||||
self.assertEqual(catima.max_storage_data,50) # assuming 50, this has to be changed manually
|
self.assertEqual(catima.max_storage_data,100) # assuming 50, this has to be changed manually
|
||||||
r = catima.storage_info()
|
r = catima.storage_info()
|
||||||
print(r)
|
|
||||||
|
|
||||||
#self.assertAlmostEqual(catima.da2de(p,water,et[100]),data[2][100],6)
|
#self.assertAlmostEqual(catima.da2de(p,water,et[100]),data[2][100],6)
|
||||||
#self.assertAlmostEqual(catima.da2de(p,water,et[400]),data[2][400],6)
|
#self.assertAlmostEqual(catima.da2de(p,water,et[400]),data[2][400],6)
|
||||||
|
|
|
@ -358,6 +358,34 @@ const lest::test specification[] =
|
||||||
c.z_effective = z_eff_type::atima14;
|
c.z_effective = z_eff_type::atima14;
|
||||||
EXPECT(z_eff_atima14(92,1900,13) == z_effective(p_u(1900.),t,c));
|
EXPECT(z_eff_atima14(92,1900,13) == z_effective(p_u(1900.),t,c));
|
||||||
#endif
|
#endif
|
||||||
|
},
|
||||||
|
CASE("vector_inputs"){
|
||||||
|
catima::Projectile p{12,6,6,1000};
|
||||||
|
catima::Material water({
|
||||||
|
{1.00794,1,2},
|
||||||
|
{15.9994,8,1}
|
||||||
|
});
|
||||||
|
catima::Material graphite;
|
||||||
|
graphite.add_element(12,6,1);
|
||||||
|
graphite.density(2.0);
|
||||||
|
graphite.thickness(0.5);
|
||||||
|
|
||||||
|
auto res = catima::calculate(p,graphite);
|
||||||
|
EXPECT( res.Eout == approx(997.07,01));
|
||||||
|
|
||||||
|
std::vector<double> energies{100,500,1000};
|
||||||
|
auto res2 = catima::energy_out(p,energies, graphite);
|
||||||
|
EXPECT(res2.size()==energies.size());
|
||||||
|
EXPECT(res2[2] == approx(997.07,01));
|
||||||
|
EXPECT(res2[0] == approx(catima::energy_out(p,energies[0],graphite),0.1));
|
||||||
|
EXPECT(res2[1] == approx(catima::energy_out(p,energies[1],graphite),0.1));
|
||||||
|
EXPECT(res2[2] == approx(catima::energy_out(p,energies[2],graphite),0.1));
|
||||||
|
|
||||||
|
auto res3 = catima::dedx_from_range(p,energies,graphite);
|
||||||
|
EXPECT(res3.size()==energies.size());
|
||||||
|
EXPECT(res3[0] == approx(catima::dedx_from_range(p,energies[0],graphite),0.1));
|
||||||
|
EXPECT(res3[1] == approx(catima::dedx_from_range(p,energies[1],graphite),0.1));
|
||||||
|
EXPECT(res3[2] == approx(catima::dedx_from_range(p,energies[2],graphite),0.1));
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user