Wavefunction ParseCoeffs(string line) { string[] vals = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); Wavefunction retval = new Wavefunction(); retval.Energy = double.Parse(vals[1]); for (int i = 2; i < vals.Length; i += 2) { retval.Coeffs.Add(new Complex(double.Parse(vals[i]), double.Parse(vals[i + 1]))); } return(retval); }
void RunMenu() { int kptIndex = 0; int wfkIndex = 0; bool quit = false; double tolerance = 1e-4; while (quit == false) { KPoint kpt = Kpoints[kptIndex]; Wavefunction wfk = kpt.Wfk[wfkIndex]; Console.Clear(); Console.WriteLine("KPoint Index: {0}", kptIndex); Console.WriteLine("Spin: {0} K: {1} {2} {3} dk: {4}", kpt.Spin, kpt.K[0], kpt.K[1], kpt.K[2], kpt.dk); Console.WriteLine(); Console.WriteLine("Wavefunction energy: {0}", wfk.Energy); Console.WriteLine("Contributions:"); List <Contrib> contribs = new List <Contrib>(); for (int i = 0; i < wfk.Coeffs.Count; i++) { if (wfk.Coeffs[i].Magnitude < tolerance) { continue; } contribs.Add(new Contrib { Text = States[i], Value = wfk.Coeffs[i] }); } if (contribs.Count > 0) { contribs.Sort(); Complex divisor = contribs[0].Value; divisor /= divisor.Magnitude; foreach (var c in contribs) { Console.WriteLine(" {0}: {1}", c.Text, c.Value / divisor); } } Console.WriteLine(); Console.WriteLine("Up/Down to change band index. Left/Right to change kpt index."); Console.WriteLine("Plus/Minus to change coefficient tolerance."); Console.WriteLine("q to quit."); var key = Console.ReadKey(true); if (key.Key == ConsoleKey.UpArrow) { wfkIndex++; if (wfkIndex >= kpt.Wfk.Count) { wfkIndex = kpt.Wfk.Count - 1; } } else if (key.Key == ConsoleKey.DownArrow) { wfkIndex--; if (wfkIndex < 0) { wfkIndex = 0; } } else if (key.Key == ConsoleKey.RightArrow) { kptIndex++; if (kptIndex >= Kpoints.Count) { kptIndex = Kpoints.Count - 1; } } else if (key.Key == ConsoleKey.LeftArrow) { kptIndex--; if (kptIndex < 0) { kptIndex = 0; } } else if (key.Key == ConsoleKey.Q) { quit = true; } else if (key.Key == ConsoleKey.Add) { tolerance /= 2; } else if (key.Key == ConsoleKey.Subtract) { tolerance *= 2; } } }