Esempio n. 1
0
        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));
                }
            }
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
                    }
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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());
        }
Esempio n. 10
0
        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);
        }