1+ import unittest
2+ import math as m
3+ import nuTens as nt
4+ from nuTens .tensor import Tensor , matmul , scale
5+ from nuTens .testing import ThreeFlavourBarger
6+ from nuTens .propagator import ConstDensitySolver , PMNSmatrix
7+
8+ import numpy as np
9+ import typing
10+
11+ import pytest
12+
13+ @pytest .mark .parametrize ("theta12" , np .linspace (0.0 , 2.0 * m .pi , 5 , True ))
14+ @pytest .mark .parametrize ("theta13" , np .linspace (0.0 , 2.0 * m .pi , 5 , True ))
15+ @pytest .mark .parametrize ("theta23" , np .linspace (0.0 , 2.0 * m .pi , 5 , True ))
16+ class TestTwoFlavourConstMatter :
17+
18+ m1 = 0.0
19+ m2 = 0.008 * nt .units .eV
20+ m3 = 0.01 * nt .units .eV
21+
22+ deltaCP = 0.25 * m .pi
23+
24+ baseline = 295.0 * nt .units .km
25+ density = 2.5
26+
27+ energy = 1.0 * nt .units .GeV
28+
29+ energy_tensor = Tensor .ones ([1 , 1 ], nt .dtype .scalar_type .complex_float , nt .dtype .device_type .cpu , False )
30+ energy_tensor .set_value ([0 , 0 ], energy )
31+
32+ def setup_tensor_inputs (self , theta12 :float , theta13 :float , theta23 :float ) -> typing .Tuple [Tensor ]:
33+
34+ pmns = PMNSmatrix ()
35+ pmns .set_parameter_values (theta12 , theta13 , theta23 , self .deltaCP )
36+
37+ masses = Tensor ([self .m1 , self .m2 , self .m3 ], nt .dtype .scalar_type .complex_float , nt .dtype .device_type .cpu , False ).add_batch_dim ()
38+
39+ return pmns .build (), masses
40+
41+ def test_compare_osc_probs (self , theta12 :float , theta13 :float , theta23 :float ):
42+
43+ print (f"------ const density oscillation probabilities ------\n " )
44+ print (f" theta12 = { theta12 } " )
45+ print (f" theta13 = { theta13 } " )
46+ print (f" theta23 = { theta23 } \n " )
47+
48+ # set up barger
49+ barger = ThreeFlavourBarger ()
50+ barger .set_params (self .m1 , self .m2 , self .m3 , theta12 , theta13 , theta23 , self .deltaCP , self .baseline , self .density )
51+
52+ pmns , masses = self .setup_tensor_inputs (theta12 , theta13 , theta23 )
53+
54+ # set up tensor solver
55+ propagator = nt .propagator .Propagator (3 , self .baseline )
56+ matter_solver = ConstDensitySolver (3 , self .density )
57+
58+ propagator .set_matter_solver (matter_solver )
59+ propagator .set_mixing_matrix (pmns )
60+ propagator .set_masses (masses )
61+ propagator .set_energies (self .energy_tensor )
62+
63+ # calculate the evals + evecs + effective PMNS to print
64+ # for help when debugging
65+ evecs = nt .tensor .Tensor ()
66+ evals = nt .tensor .Tensor ()
67+ matter_solver .calculate_eigenvalues (evecs , evals )
68+
69+ tensor_osc_probs = propagator .calculate_probabilities ()
70+
71+ print (f"Tensor solver evals: { evals .to_string ()} \n " )
72+
73+ print (f"Tensor solver effective Mi^2: { scale (evals , 2.0 * self .energy ).to_string ()} \n " )
74+
75+ print (f"Barger M1^2: { barger .calculate_effective_m2 (self .energy , 0 )} " )
76+ print (f"Barger M2^2: { barger .calculate_effective_m2 (self .energy , 1 )} " )
77+ print (f"Barger M3^2: { barger .calculate_effective_m2 (self .energy , 2 )} \n " )
78+
79+ print (f"Oscillation probabilities:" )
80+ print (f"[0,0] tensor solver { tensor_osc_probs .get_value ([0 , 0 , 0 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 0 , j = 0 ):.5f} " )
81+ print (f"[0,1] tensor solver { tensor_osc_probs .get_value ([0 , 0 , 1 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 0 , j = 1 ):.5f} " )
82+ print (f"[0,2] tensor solver { tensor_osc_probs .get_value ([0 , 0 , 2 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 0 , j = 2 ):.5f} " )
83+
84+ print (f"[1,0] tensor solver { tensor_osc_probs .get_value ([0 , 1 , 0 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 1 , j = 0 ):.5f} " )
85+ print (f"[1,1] tensor solver { tensor_osc_probs .get_value ([0 , 1 , 1 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 1 , j = 1 ):.5f} " )
86+ print (f"[1,2] tensor solver { tensor_osc_probs .get_value ([0 , 1 , 2 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 1 , j = 2 ):.5f} " )
87+
88+ print (f"[2,0] tensor solver { tensor_osc_probs .get_value ([0 , 2 , 0 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 2 , j = 0 ):.5f} " )
89+ print (f"[2,1] tensor solver { tensor_osc_probs .get_value ([0 , 2 , 1 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 2 , j = 1 ):.5f} " )
90+ print (f"[2,2] tensor solver { tensor_osc_probs .get_value ([0 , 2 , 2 ]):.5f} :: barger propagator { barger .calculate_prob (self .energy , i = 2 , j = 2 ):.5f} " )
91+
92+ assert (
93+ pytest .approx (tensor_osc_probs .get_value ([0 , 0 , 0 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 0 , j = 0 )
94+ ), f"Const matter osc prob[0,0] != barger osc prob"
95+ assert (
96+ pytest .approx (tensor_osc_probs .get_value ([0 , 0 , 1 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 0 , j = 1 )
97+ ), f"Const matter osc prob[0,1] != barger osc prob"
98+ assert (
99+ pytest .approx (tensor_osc_probs .get_value ([0 , 0 , 2 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 0 , j = 2 )
100+ ), f"Const matter osc prob[0,2] != barger osc prob"
101+
102+ assert (
103+ pytest .approx (tensor_osc_probs .get_value ([0 , 1 , 0 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 1 , j = 0 )
104+ ), f"Const matter osc prob[1,0] != barger osc prob"
105+ assert (
106+ pytest .approx (tensor_osc_probs .get_value ([0 , 1 , 1 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 1 , j = 1 )
107+ ), f"Const matter osc prob[1,1] != barger osc prob"
108+ assert (
109+ pytest .approx (tensor_osc_probs .get_value ([0 , 1 , 2 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 1 , j = 2 )
110+ ), f"Const matter osc prob[1,2] != barger osc prob"
111+
112+ assert (
113+ pytest .approx (tensor_osc_probs .get_value ([0 , 2 , 0 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 2 , j = 0 )
114+ ), f"Const matter osc prob[2,0] != barger osc prob"
115+ assert (
116+ pytest .approx (tensor_osc_probs .get_value ([0 , 2 , 1 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 2 , j = 1 )
117+ ), f"Const matter osc prob[2,1] != barger osc prob"
118+ assert (
119+ pytest .approx (tensor_osc_probs .get_value ([0 , 2 , 2 ]), abs = 1e-5 ) == barger .calculate_prob (self .energy , i = 2 , j = 2 )
120+ ), f"Const matter osc prob[2,2] != barger osc prob"
121+
122+
123+ if __name__ == '__main__' :
124+ unittest .main ()
0 commit comments