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(); } } }
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); }
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); } } } } } } }
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; } } } } } } }
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(); } } }
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); }
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; } } } } } } }
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); } } } } } } }