Ejemplo n.º 1
0
        public static KPath CreateOrthonormal()
        {
            KPath retval = new KPath();

            retval.Names = new string[]
            {
                "\\xG",
                "X",
                "S",
                "Y",
                "\\xG",
                "Z",
                "U",
                "R",
                "T",
                "\\xG",
            };
            retval.Points = new Vector3[]
            {
                new Vector3(0, 0, 0),
                new Vector3(1, 0, 0),
                new Vector3(1, 1, 0),
                new Vector3(0, 1, 0),
                new Vector3(0, 0, 0),
                new Vector3(0, 0, 1),
                new Vector3(1, 0, 1),
                new Vector3(1, 1, 1),
                new Vector3(0, 1, 1),
                new Vector3(0, 0, 0),
            };

            return(retval);
        }
Ejemplo n.º 2
0
        public void Run(Parameters p)
        {
            SpinWave    = new DoublePair[KPath.Path.Length];
            OrbitalWave = new DoublePair[KPath.Path.Length];
            OrbParam    = new DoublePair[KPath.Path.Length];
            var grid = KPath.CreateGrid(80);

            //using (var w = new System.IO.StreamWriter(Filename + ".k"))
            //{
            //    //w.WriteLine("index\tcontrib\ttotal\tkx\tky\tkz");

            for (int i = 0; i < grid.Length; i++)
            {
                Vector3 k     = grid[i];
                double  a     = Math.Abs(Spin_A(p, k));
                double  b     = Spin_B(p, k);
                double  orb_a = Math.Abs(Orb_A(p, k));
                double  orb_c = Orb_C(p, k);

                double scontrib = a - Math.Sqrt(a * a - b * b);
                e1s -= scontrib;

                e1o -= orb_a - Math.Sqrt(orb_a * orb_a - orb_c * orb_c);

                //w.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", i, scontrib, e1s, k.X, k.Y, k.Z);
            }
            //}

            e1s = e1s / grid.Length;
            e1o = e1o / grid.Length;

            for (int i = 0; i < KPath.Path.Length; i++)
            {
                Vector3 k = KPath.Path[i];

                double a   = Spin_A(p, k);
                double b   = Spin_B(p, k);
                double a_d = Spin_Ad(p, k);

                double omega;
                if (a >= b)
                {
                    omega = Math.Sqrt(a * a - b * b);
                }
                else
                {
                    omega = -Math.Sqrt(b * b - a * a);
                }

                SpinWave[i].A = omega - a_d;
                SpinWave[i].B = omega + a_d;

                double A = Orb_A(p, k);
                double B = Orb_B(p, k);
                double C = Orb_C(p, k);
                double D = Orb_D(p, k);
                double E = Orb_E(p, k);

                double c = (B * (A - E) - Math.Pow(C - D, 2)) * (B * (A + E) - Math.Pow(C + D, 2));
                b = 0.5 * (A * A + B * B - 2 * C * C + 2 * D * D - E * E);
                double ratio = c / (b * b);

                OrbParam[i].A = Math.Sign(b) * b * b;
                OrbParam[i].B = c;

                if (b >= 0)
                {
                    if (0 <= ratio && ratio <= 1)
                    {
                        // yay real frequencies
                        OrbitalWave[i].A = Math.Sqrt(b * (1 - Math.Sqrt(1 - ratio)));
                        OrbitalWave[i].B = Math.Sqrt(b * (1 + Math.Sqrt(1 - ratio)));
                    }
                    else if (ratio > 1)
                    {
                        OrbitalWave[i].A = -Math.Pow(c, 0.25);
                        OrbitalWave[i].B = -Math.Pow(c, 0.25);
                    }
                    else if (ratio < 0)
                    {
                        double g = Math.Sqrt(1 - ratio);

                        OrbitalWave[i].A = -Math.Sqrt(b * (g - 1));
                        OrbitalWave[i].B = Math.Sqrt(b * (1 + g));
                    }
                }
                else
                {
                    if (0 <= ratio && ratio <= 1)
                    {
                        double g = Math.Sqrt(b * b - c);

                        if (g >= -b)
                        {
                            OrbitalWave[i].A = -Math.Sqrt(g + b);
                            OrbitalWave[i].B = Math.Sqrt(g - b);
                        }
                        else
                        {
                            OrbitalWave[i].A = -Math.Sqrt(-(b + g));
                            OrbitalWave[i].B = -Math.Sqrt(g - b);
                        }
                    }
                    else if (ratio < 0)
                    {
                        double t = Math.Sqrt(1 - ratio);

                        OrbitalWave[i].A = -Math.Sqrt(-b) * Math.Sqrt(t + 1);
                        OrbitalWave[i].B = Math.Sqrt(-b) * Math.Sqrt(t - 1);
                    }
                    else if (ratio > 1)
                    {
                        OrbitalWave[i].A = -Math.Sqrt(-b) * Math.Pow(ratio, 0.25);
                        OrbitalWave[i].B = -Math.Sqrt(-b) * Math.Pow(ratio, 0.25);
                    }
                }

                if (double.IsNaN(OrbitalWave[i].A) ||
                    double.IsNaN(OrbitalWave[i].B))
                {
                    throw new Exception();
                }
            }
        }
Ejemplo n.º 3
0
 public Model()
 {
     SpinWave    = new DoublePair[1];
     OrbitalWave = new DoublePair[1];
     KPath       = KPath.CreateTetragonal();
 }
Ejemplo n.º 4
0
 public OrbitalXX()
 {
     KPath = KPath.CreateOrthonormal();
 }
Ejemplo n.º 5
0
        public static KPath CreateTetragonal()
        {
            KPath retval = new KPath();

            return(retval);
        }