コード例 #1
0
ファイル: KPath.cs プロジェクト: eylvisaker/RbO2SpinWaves
        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);
        }
コード例 #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();
                }
            }
        }
コード例 #3
0
 public Model()
 {
     SpinWave    = new DoublePair[1];
     OrbitalWave = new DoublePair[1];
     KPath       = KPath.CreateTetragonal();
 }
コード例 #4
0
ファイル: OrbitalXX.cs プロジェクト: eylvisaker/RbO2SpinWaves
 public OrbitalXX()
 {
     KPath = KPath.CreateOrthonormal();
 }
コード例 #5
0
ファイル: KPath.cs プロジェクト: eylvisaker/RbO2SpinWaves
        public static KPath CreateTetragonal()
        {
            KPath retval = new KPath();

            return(retval);
        }