public void SixJProductSum() { SixJSymbol[] symbols = GenerateRandomSixJSymbols(50.0, 5); foreach (SixJSymbol symbol in symbols) { Spin a = symbol.J1; Spin b = symbol.J2; Spin c = symbol.J4; Spin d = symbol.J5; Spin f = symbol.J6; SpinRange ac = CombinedSpinRange(a, c); Console.WriteLine("ac: [{0},{1}]", ac.Minimum.J, ac.Maximum.J); SpinRange bd = CombinedSpinRange(b, d); Console.WriteLine("bd: [{0},{1}]", bd.Minimum.J, bd.Maximum.J); SpinRange ac_bd = CombinedSpinRange(ac, bd); Console.WriteLine("g: [{0},{1}]", ac_bd.Minimum.J, ac_bd.Maximum.J); Spin[] gs = RandomSpinsInRange(ac_bd, 3); SpinRange ab = CombinedSpinRange(a, b); SpinRange cd = CombinedSpinRange(c, d); SpinRange ab_cd = CombinedSpinRange(ab, cd); Spin[] xs = AllSpinsInRange(ab_cd); foreach (Spin g in gs) { //double s = 0.0; List <double> s = new List <double>(); foreach (Spin x in xs) { double t = (2.0 * x.J + 1.0) * SpinMath.SixJ(a, b, x, c, d, f) * SpinMath.SixJ(c, d, x, b, a, g); int p = (int)Math.Round(f.J + g.J + x.J); if (p % 2 != 0) { t = -t; } Console.WriteLine(" {0} {1}", x.J, t); //s += t; s.Add(t); } double r = SpinMath.SixJ(a, d, f, b, c, g); Console.WriteLine("a={0} b={1} c={2} d={3} f={4} g={5}: {6} {7}", a.J, b.J, c.J, d.J, f.J, g.J, s, r); Assert.IsTrue(TestUtilities.IsSumNearlyEqual(s, r)); //Assert.IsTrue(TestUtilities.IsNearlyEqual(s, r)); } } }
private static Spin[] AllSpinsInRange(SpinRange range) { int tj_min = (int)Math.Round(2 * range.Minimum.J); int tj_max = (int)Math.Round(2 * range.Maximum.J); List <Spin> spins = new List <Spin>(); for (int tj = tj_min; tj <= tj_max; tj += 2) { spins.Add(new Spin(tj / 2.0)); } return(spins.ToArray()); }
private static Spin[] RandomSpinsInRange(SpinRange range, int n) { int tj_min = (int)Math.Truncate(2.0 * range.Minimum.J); int tj_max = (int)Math.Truncate(2.0 * range.Maximum.J); Spin[] spins = new Spin[n]; Random rng = new Random(1); for (int i = 0; i < n; i++) { spins[i] = new Spin((tj_min + 2 * rng.Next((tj_max - tj_min) / 2 + 1)) / 2.0); } return(spins); }
private static SpinRange CombinedSpinRange(Spin j1, Spin j2) { int tj1 = (int)Math.Round(2 * j1.J); int tj2 = (int)Math.Round(2 * j2.J); int tj_min = Math.Abs(tj1 - tj2); int tj_max = tj1 + tj2; SpinRange range = new SpinRange(); range.Minimum = new Spin(tj_min / 2.0); range.Maximum = new Spin(tj_max / 2.0); return(range); }
public void SixJOrthonormality() { SixJSymbol[] sas = GenerateRandomSixJSymbols(50.0, 5); foreach (SixJSymbol sa in sas) { Spin j1 = sa.J1; Spin j2 = sa.J2; Spin j4 = sa.J4; Spin j5 = sa.J5; Spin j6a = sa.J6; SpinRange r15 = CombinedSpinRange(j1, j5); SpinRange r42 = CombinedSpinRange(j4, j2); SpinRange r6b = CombinedSpinRange(r15, r42); Spin[] j6bs = RandomSpinsInRange(r6b, 5); j6bs[0] = j6a; SpinRange r12 = CombinedSpinRange(j1, j2); SpinRange r45 = CombinedSpinRange(j4, j5); SpinRange r3 = CombinedSpinRange(r12, r45); Spin[] j3s = AllSpinsInRange(r3); foreach (Spin j6b in j6bs) { double s = 0.0; foreach (Spin j3 in j3s) { double t = (2.0 * j3.J + 1.0) * SpinMath.SixJ(j1, j2, j3, j4, j5, j6a) * SpinMath.SixJ(j1, j2, j3, j4, j5, j6b); s += t; } Console.WriteLine("j1={0} j2={1} j4={2} j5={3} j6a={4} j6b={5} s={6}", j1.J, j2.J, j4.J, j5.J, j6a.J, j6b.J, s); if (j6a == j6b) { Assert.IsTrue(TestUtilities.IsNearlyEqual(s, 1.0 / (2.0 * j6a.J + 1.0))); } else { Assert.IsTrue(Math.Abs(s) < TestUtilities.TargetPrecision); } } } }
private static SpinRange CombinedSpinRange(SpinRange r1, SpinRange r2) { SpinRange range = new SpinRange(); if (r1.Minimum.J > r2.Minimum.J) { range.Minimum = r1.Minimum; } else { range.Minimum = r2.Minimum; } if (r1.Maximum.J < r2.Maximum.J) { range.Maximum = r1.Maximum; } else { range.Maximum = r2.Maximum; } return(range); }
private static SpinRange CombinedSpinRange(SpinRange r1, SpinRange r2) { SpinRange range = new SpinRange(); if (r1.Minimum.J > r2.Minimum.J) { range.Minimum = r1.Minimum; } else { range.Minimum = r2.Minimum; } if (r1.Maximum.J < r2.Maximum.J) { range.Maximum = r1.Maximum; } else { range.Maximum = r2.Maximum; } return (range); }
private static SpinRange CombinedSpinRange(Spin j1, Spin j2) { int tj1 = (int) Math.Round(2 * j1.J); int tj2 = (int) Math.Round(2 * j2.J); int tj_min = Math.Abs(tj1 - tj2); int tj_max = tj1 + tj2; SpinRange range = new SpinRange(); range.Minimum = new Spin(tj_min / 2.0); range.Maximum = new Spin(tj_max / 2.0); return (range); }
private static Spin[] AllSpinsInRange(SpinRange range) { int tj_min = (int) Math.Round(2 * range.Minimum.J); int tj_max = (int) Math.Round(2 * range.Maximum.J); List<Spin> spins = new List<Spin>(); for (int tj = tj_min; tj <= tj_max; tj+=2) { spins.Add(new Spin(tj / 2.0)); } return (spins.ToArray()); }
private static Spin[] RandomSpinsInRange(SpinRange range, int n) { int tj_min = (int) Math.Truncate(2.0 * range.Minimum.J); int tj_max = (int) Math.Truncate(2.0 * range.Maximum.J); Spin[] spins = new Spin[n]; Random rng = new Random(1); for (int i = 0; i < n; i++) { spins[i] = new Spin((tj_min + 2 * rng.Next((tj_max - tj_min) / 2 + 1))/2.0); } return (spins); }