Exemplo n.º 1
0
        void OutputBands(TightBinding tb, KptList ks,
                         List <RpaParams> rpa, MatrixGetter g, string name)
        {
            using (StreamWriter w = new StreamWriter("eigenvalues." + name + ".q"))
            {
                w.WriteLine("# Grid");
                w.WriteLine("{0}  {1}  {2}  {3}  {4}  {5}", ks.Mesh[0], ks.Mesh[1], ks.Mesh[2],
                            ks.Shift[0], ks.Shift[1], ks.Shift[2]);

                w.WriteLine("# Eigenvalues");

                foreach (var rpa_i in rpa)
                {
                    var qpt = rpa_i.QptValue;

                    w.Write("{0}    {1}    {2}             ",
                            qpt.X, qpt.Y, qpt.Z);

                    Matrix chi     = g(rpa_i);
                    Matrix evalues = chi.EigenValues();

                    for (int j = 0; j < evalues.Rows; j++)
                    {
                        w.Write("{0}   ", evalues[j, 0].RealPart);
                    }

                    w.WriteLine();
                }
            }
        }
Exemplo n.º 2
0
        private void SaveMatricesQPlane(TightBinding tb, List<KPoint> QMesh, List<RpaParams> chi, MatrixGetter g, string name)
        {
            if (tb.TemperatureMesh.Length > 1)
            {
                Directory.CreateDirectory("temperature");
                SaveByTemperature(tb, QMesh, chi, g, name);
            }

            SaveByQPlane(tb, QMesh, chi, g, name);
        }
Exemplo n.º 3
0
        private void SaveByTemperature(TightBinding tb, List<KPoint> QMesh, List<RpaParams> rpa, MatrixGetter g, string name)
        {
            rpa.Sort(RpaParams.TemperatureComparison);

            Complex[] chisum = new Complex[rpa.Count];
            double[] chimag = new double[rpa.Count];
            double[] chimagsqr = new double[rpa.Count];

            for (int l1 = 0; l1 < tb.Orbitals.Count; l1++)
            {
                for (int l2 = 0; l2 < tb.Orbitals.Count; l2++)
                {
                    for (int l3 = 0; l3 < tb.Orbitals.Count; l3++)
                    {
                        for (int l4 = 0; l4 < tb.Orbitals.Count; l4++)
                        {
                            int i = GetIndex(tb, l1, l2);
                            int j = GetIndex(tb, l3, l4);

                            // organize by temperature
                            string filename = string.Format(
                                "temperature/{0}.{1}{2}{3}{4}.T", name, l1, l2, l3, l4);

                            double lastFreq = double.MinValue;
                            double lastMu = double.MinValue;
                            double lastq = int.MinValue;

                            using (StreamWriter w = new StreamWriter(filename))
                            {
                                for (int index = 0; index < rpa.Count; index++)
                                {
                                    bool newline = false;

                                    newline |= ChangeValue(ref lastFreq, rpa[index].Frequency);
                                    newline |= ChangeValue(ref lastMu, rpa[index].ChemicalPotential);
                                    newline |= ChangeValue(ref lastq, rpa[index].Qindex);

                                    if (newline)
                                    {
                                        w.WriteLine();
                                        w.WriteLine("# Frequency: {0}", rpa[index].Frequency);
                                        w.WriteLine("# Chemical Potential: {0}", rpa[index].ChemicalPotential);
                                        w.WriteLine("# Q: {0}", QMesh[rpa[index].Qindex]);
                                        w.WriteLine("#");
                                        w.WriteLine("# Temperature\tRe(Chi)\tIm(Chi)");
                                    }

                                    Complex val = g(rpa[index])[i, j];

                                    chisum[index] += val;
                                    chimag[index] += val.Magnitude;
                                    chimagsqr[index] += val.MagnitudeSquared;

                                    w.WriteLine("\t{0:0.000000}\t{1:0.0000000}\t{2:0.0000000}",
                                        rpa[index].Temperature, val.RealPart, val.ImagPart);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 4
0
        private void SaveByQPlane(TightBinding tb, List<KPoint> QMesh, List<RpaParams> rpa, MatrixGetter g, string name)
        {
            rpa.Sort(RpaParams.QIndexComparison);

            Complex[] chisum = new Complex[rpa.Count];
            double[] chimag = new double[rpa.Count];
            double[] chimagsqr = new double[rpa.Count];

            for (int l1 = 0; l1 < tb.Orbitals.Count; l1++)
            {
                for (int l2 = 0; l2 < tb.Orbitals.Count; l2++)
                {
                    for (int l3 = 0; l3 < tb.Orbitals.Count; l3++)
                    {
                        for (int l4 = 0; l4 < tb.Orbitals.Count; l4++)
                        {
                            double lastFreq = double.MinValue;
                            double lastMu = double.MinValue;
                            double lastq = int.MinValue;

                            int baseIndex = 0;

                            for (int ti = 0; ti < tb.TemperatureMesh.Length; ti++)
                            {
                                for (int ui = 0; ui < tb.MuMesh.Length; ui++)
                                {
                                    for (int wi = 0; wi < tb.FrequencyMesh.Length; wi++)
                                    {
                                        string filename_re = string.Format("{0}.re.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                               name, l1, l2, l3, l4, wi, ti, ui);
                                        string filename_im = string.Format("{0}.im.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                               name, l1, l2, l3, l4, wi, ti, ui);
                                        string filename_mag = string.Format("{0}.mag.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                               name, l1, l2, l3, l4, wi, ti, ui);

                                        Complex maxvalue = new Complex(double.MinValue, double.MinValue);
                                        Complex minvalue = new Complex(double.MaxValue, double.MaxValue);

                                        using (StreamWriter w_re = new StreamWriter(filename_re))
                                        using (StreamWriter w_im = new StreamWriter(filename_im))
                                        using (StreamWriter w_mag = new StreamWriter(filename_mag))
                                        {
                                            double last_t;
                                            double last_s;

                                            tb.QPlane.GetPlaneST(tb.QPlane.AllKpts[0], out last_s, out last_t);

                                            for (int qi = 0; qi < tb.QPlane.AllKpts.Count; qi++)
                                            {
                                                Vector3 qpt = tb.QPlane.AllKpts[qi];
                                                List<int> orbitalMap;

                                                double s, t;
                                                tb.QPlane.GetPlaneST(tb.QPlane.AllKpts[qi], out s, out t);

                                                if (Math.Abs(t - last_t) > 1e-6)
                                                {
                                                    w_re.WriteLine();
                                                    w_im.WriteLine();
                                                    w_mag.WriteLine();
                                                }

                                                int kindex =
                                                    tb.QPlane.IrreducibleIndex(qpt, tb.Lattice, tb.Symmetries, out orbitalMap);

                                                int index = GetRpaIndex(rpa, kindex,
                                                    tb.TemperatureMesh[ti],
                                                    tb.FrequencyMesh[wi],
                                                    tb.MuMesh[ui]);

                                                int newL1 = tb.Symmetries.TransformOrbital(orbitalMap, l1);
                                                int newL2 = tb.Symmetries.TransformOrbital(orbitalMap, l2);
                                                int newL3 = tb.Symmetries.TransformOrbital(orbitalMap, l3);
                                                int newL4 = tb.Symmetries.TransformOrbital(orbitalMap, l4);

                                                int newii = GetIndex(tb, newL1, newL2);
                                                int newjj = GetIndex(tb, newL3, newL4);

                                                Complex val = g(rpa[index])[newii, newjj];

                                                w_re.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.RealPart);
                                                w_im.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.ImagPart);
                                                w_mag.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.Magnitude);

                                                if (val.RealPart > maxvalue.RealPart) maxvalue.RealPart = val.RealPart;
                                                if (val.ImagPart > maxvalue.ImagPart) maxvalue.ImagPart = val.ImagPart;
                                                if (val.RealPart < minvalue.RealPart) minvalue.RealPart = val.RealPart;
                                                if (val.ImagPart < minvalue.ImagPart) minvalue.ImagPart = val.ImagPart;

                                                last_t = t;
                                                last_s = s;
                                            }
                                        }

                                        for (int i = 0; i < 3; i++)
                                        {
                                            string filename;
                                            switch (i)
                                            {
                                                case 0: filename = filename_re; break;
                                                case 1: filename = filename_im; break;
                                                case 2: filename = filename_mag; break;
                                                default:
                                                    continue;
                                            }

                                            string gpfilename = "gnuplot." + filename;

                                            //minvalue.RealPart = Math.Floor(minvalue.RealPart);
                                            //maxvalue.RealPart = Math.Ceiling(maxvalue.RealPart);

                                            using (StreamWriter w = new StreamWriter(gpfilename))
                                            {
                                                w.WriteLine("#!/usr/bin/gnuplot");
                                                //w.WriteLine("set pm3d at bs flush center ftriangles scansbackward interpolate 1,1");
                                                w.WriteLine("set pm3d map flush center ftriangles scansbackward interpolate 5,5");
                                                w.WriteLine("set palette rgbformula 23,9,-36");
                                                //w.WriteLine("set border 895");
                                                w.WriteLine("set key off");
                                                //w.WriteLine("set zrange [{0}:{1}]", minvalue.RealPart, maxvalue.RealPart);
                                                // label z = minvalue - 0.5 * (maxvalue - minvalue)
                                                //  set label 1 "G" at 0,0,1 font "Symbol" center front
                                                w.WriteLine("splot '{0}' with pm3d", filename);
                                            }
                                        }
                                    }

                                    baseIndex += QMesh.Count;
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
        void OutputBands(TightBinding tb, KptList ks, 
            List<RpaParams> rpa, MatrixGetter g, string name)
        {
            using (StreamWriter w = new StreamWriter("eigenvalues." + name + ".q"))
            {
                w.WriteLine("# Grid");
                w.WriteLine("{0}  {1}  {2}  {3}  {4}  {5}", ks.Mesh[0], ks.Mesh[1], ks.Mesh[2],
                            ks.Shift[0], ks.Shift[1], ks.Shift[2]);

                w.WriteLine("# Eigenvalues");

                foreach(var rpa_i in rpa)
                {
                    var qpt = rpa_i.QptValue;

                    w.Write("{0}    {1}    {2}             ",
                            qpt.X, qpt.Y, qpt.Z);

                    Matrix chi = g(rpa_i);
                    Matrix evalues = chi.EigenValues();

                    for (int j = 0; j < evalues.Rows; j++)
                    {
                        w.Write("{0}   ", evalues[j, 0].RealPart);
                    }

                    w.WriteLine();
                }
            }
        }
Exemplo n.º 6
0
        private void SaveMatricesQPlane(TightBinding tb, List <KPoint> QMesh, List <RpaParams> chi, MatrixGetter g, string name)
        {
            if (tb.TemperatureMesh.Length > 1)
            {
                Directory.CreateDirectory("temperature");
                SaveByTemperature(tb, QMesh, chi, g, name);
            }

            SaveByQPlane(tb, QMesh, chi, g, name);
        }
Exemplo n.º 7
0
        private void SaveByQPlane(TightBinding tb, List <KPoint> QMesh, List <RpaParams> rpa, MatrixGetter g, string name)
        {
            rpa.Sort(RpaParams.QIndexComparison);

            Complex[] chisum    = new Complex[rpa.Count];
            double[]  chimag    = new double[rpa.Count];
            double[]  chimagsqr = new double[rpa.Count];

            for (int l1 = 0; l1 < tb.Orbitals.Count; l1++)
            {
                for (int l2 = 0; l2 < tb.Orbitals.Count; l2++)
                {
                    for (int l3 = 0; l3 < tb.Orbitals.Count; l3++)
                    {
                        for (int l4 = 0; l4 < tb.Orbitals.Count; l4++)
                        {
                            double lastFreq = double.MinValue;
                            double lastMu   = double.MinValue;
                            double lastq    = int.MinValue;

                            int baseIndex = 0;

                            for (int ti = 0; ti < tb.TemperatureMesh.Length; ti++)
                            {
                                for (int ui = 0; ui < tb.MuMesh.Length; ui++)
                                {
                                    for (int wi = 0; wi < tb.FrequencyMesh.Length; wi++)
                                    {
                                        string filename_re = string.Format("{0}.re.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                                           name, l1, l2, l3, l4, wi, ti, ui);
                                        string filename_im = string.Format("{0}.im.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                                           name, l1, l2, l3, l4, wi, ti, ui);
                                        string filename_mag = string.Format("{0}.mag.{1}{2}{3}{4}.w{5}.T{6}.u{7}.qm",
                                                                            name, l1, l2, l3, l4, wi, ti, ui);

                                        Complex maxvalue = new Complex(double.MinValue, double.MinValue);
                                        Complex minvalue = new Complex(double.MaxValue, double.MaxValue);

                                        using (StreamWriter w_re = new StreamWriter(filename_re))
                                            using (StreamWriter w_im = new StreamWriter(filename_im))
                                                using (StreamWriter w_mag = new StreamWriter(filename_mag))
                                                {
                                                    double last_t;
                                                    double last_s;

                                                    tb.QPlane.GetPlaneST(tb.QPlane.AllKpts[0], out last_s, out last_t);

                                                    for (int qi = 0; qi < tb.QPlane.AllKpts.Count; qi++)
                                                    {
                                                        Vector3    qpt = tb.QPlane.AllKpts[qi];
                                                        List <int> orbitalMap;

                                                        double s, t;
                                                        tb.QPlane.GetPlaneST(tb.QPlane.AllKpts[qi], out s, out t);

                                                        if (Math.Abs(t - last_t) > 1e-6)
                                                        {
                                                            w_re.WriteLine();
                                                            w_im.WriteLine();
                                                            w_mag.WriteLine();
                                                        }

                                                        int kindex =
                                                            tb.QPlane.IrreducibleIndex(qpt, tb.Lattice, tb.Symmetries, out orbitalMap);

                                                        int index = GetRpaIndex(rpa, kindex,
                                                                                tb.TemperatureMesh[ti],
                                                                                tb.FrequencyMesh[wi],
                                                                                tb.MuMesh[ui]);

                                                        int newL1 = tb.Symmetries.TransformOrbital(orbitalMap, l1);
                                                        int newL2 = tb.Symmetries.TransformOrbital(orbitalMap, l2);
                                                        int newL3 = tb.Symmetries.TransformOrbital(orbitalMap, l3);
                                                        int newL4 = tb.Symmetries.TransformOrbital(orbitalMap, l4);

                                                        int newii = GetIndex(tb, newL1, newL2);
                                                        int newjj = GetIndex(tb, newL3, newL4);

                                                        Complex val = g(rpa[index])[newii, newjj];

                                                        w_re.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.RealPart);
                                                        w_im.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.ImagPart);
                                                        w_mag.WriteLine(" {0}       {1}       {2:0.0000000}", s, t, val.Magnitude);

                                                        if (val.RealPart > maxvalue.RealPart)
                                                        {
                                                            maxvalue.RealPart = val.RealPart;
                                                        }
                                                        if (val.ImagPart > maxvalue.ImagPart)
                                                        {
                                                            maxvalue.ImagPart = val.ImagPart;
                                                        }
                                                        if (val.RealPart < minvalue.RealPart)
                                                        {
                                                            minvalue.RealPart = val.RealPart;
                                                        }
                                                        if (val.ImagPart < minvalue.ImagPart)
                                                        {
                                                            minvalue.ImagPart = val.ImagPart;
                                                        }

                                                        last_t = t;
                                                        last_s = s;
                                                    }
                                                }

                                        for (int i = 0; i < 3; i++)
                                        {
                                            string filename;
                                            switch (i)
                                            {
                                            case 0: filename = filename_re; break;

                                            case 1: filename = filename_im; break;

                                            case 2: filename = filename_mag; break;

                                            default:
                                                continue;
                                            }

                                            string gpfilename = "gnuplot." + filename;

                                            //minvalue.RealPart = Math.Floor(minvalue.RealPart);
                                            //maxvalue.RealPart = Math.Ceiling(maxvalue.RealPart);

                                            using (StreamWriter w = new StreamWriter(gpfilename))
                                            {
                                                w.WriteLine("#!/usr/bin/gnuplot");
                                                //w.WriteLine("set pm3d at bs flush center ftriangles scansbackward interpolate 1,1");
                                                w.WriteLine("set pm3d map flush center ftriangles scansbackward interpolate 5,5");
                                                w.WriteLine("set palette rgbformula 23,9,-36");
                                                //w.WriteLine("set border 895");
                                                w.WriteLine("set key off");
                                                //w.WriteLine("set zrange [{0}:{1}]", minvalue.RealPart, maxvalue.RealPart);
                                                // label z = minvalue - 0.5 * (maxvalue - minvalue)
                                                //  set label 1 "G" at 0,0,1 font "Symbol" center front
                                                w.WriteLine("splot '{0}' with pm3d", filename);
                                            }
                                        }
                                    }

                                    baseIndex += QMesh.Count;
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 8
0
        private void SaveByTemperature(TightBinding tb, List <KPoint> QMesh, List <RpaParams> rpa, MatrixGetter g, string name)
        {
            rpa.Sort(RpaParams.TemperatureComparison);

            Complex[] chisum    = new Complex[rpa.Count];
            double[]  chimag    = new double[rpa.Count];
            double[]  chimagsqr = new double[rpa.Count];

            for (int l1 = 0; l1 < tb.Orbitals.Count; l1++)
            {
                for (int l2 = 0; l2 < tb.Orbitals.Count; l2++)
                {
                    for (int l3 = 0; l3 < tb.Orbitals.Count; l3++)
                    {
                        for (int l4 = 0; l4 < tb.Orbitals.Count; l4++)
                        {
                            int i = GetIndex(tb, l1, l2);
                            int j = GetIndex(tb, l3, l4);

                            // organize by temperature
                            string filename = string.Format(
                                "temperature/{0}.{1}{2}{3}{4}.T", name, l1, l2, l3, l4);

                            double lastFreq = double.MinValue;
                            double lastMu   = double.MinValue;
                            double lastq    = int.MinValue;

                            using (StreamWriter w = new StreamWriter(filename))
                            {
                                for (int index = 0; index < rpa.Count; index++)
                                {
                                    bool newline = false;

                                    newline |= ChangeValue(ref lastFreq, rpa[index].Frequency);
                                    newline |= ChangeValue(ref lastMu, rpa[index].ChemicalPotential);
                                    newline |= ChangeValue(ref lastq, rpa[index].Qindex);

                                    if (newline)
                                    {
                                        w.WriteLine();
                                        w.WriteLine("# Frequency: {0}", rpa[index].Frequency);
                                        w.WriteLine("# Chemical Potential: {0}", rpa[index].ChemicalPotential);
                                        w.WriteLine("# Q: {0}", QMesh[rpa[index].Qindex]);
                                        w.WriteLine("#");
                                        w.WriteLine("# Temperature\tRe(Chi)\tIm(Chi)");
                                    }

                                    Complex val = g(rpa[index])[i, j];

                                    chisum[index]    += val;
                                    chimag[index]    += val.Magnitude;
                                    chimagsqr[index] += val.MagnitudeSquared;

                                    w.WriteLine("\t{0:0.000000}\t{1:0.0000000}\t{2:0.0000000}",
                                                rpa[index].Temperature, val.RealPart, val.ImagPart);
                                }
                            }
                        }
                    }
                }
            }
        }