public void FindAtoms(WannierData retval) { const int size = 4; Vector3 origin = retval.Grid.Origin; Vector3[] span = retval.Grid.SpanVectors; oldFindAtoms(retval); List<Atom> atoms = new List<Atom>(); foreach (Atom atom in sites) { for (int k = -size; k <= size; k++) { for (int j = -size; j <= size; j++) { for (int i = -size; i <= size; i++) { Vector3 v = i * lattice[0] + j * lattice[1] + k * lattice[2]; Vector3 loc = atom.Position + v; loc -= origin; bool bad = false; for (int l = 0; l < 3; l++) { double dot = span[l].DotProduct(loc); double dist = dot / span[l].Magnitude; if (dot < 0) bad = true; if (dist > span[l].Magnitude) bad = true; } if (bad) continue; Atom a = new Atom(); a.Element = atom.Element; a.Position = loc; atoms.Add(a); } } } } retval.Atoms.Clear(); retval.Atoms.AddRange(atoms); }
private void ReadAtomPositions(StreamReader reader, WannierData retval, int count, int number) { if (number > 0) { ReadToComment(reader); return; } for (int i = 0; i < count; i++) { Vector3 p = Vector3.Parse(ReadNextLine(reader)); Atom a = new Atom(); a.Position = p; retval.Atoms.Add(a); } ReadToComment(reader); }
int AtomSorter(Atom a, Atom b) { if (a.Element != b.Element) return a.Element.CompareTo(b.Element); int val = a.Position.Z.CompareTo(b.Position.Z); val = (val == 0) ? a.Position.Y.CompareTo(b.Position.Y) : val; val = (val == 0) ? a.Position.X.CompareTo(b.Position.X) : val; return val; }
internal void ReadAtomSites(System.IO.StreamReader reader, Fplo8Data data, int count) { if (count == 0) throw new ArgumentException("Number of sites can't be zero."); for (int i = 0; i < count; i++) { string line = reader.ReadLine().Trim(); string[] text = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); Atom a = new Atom(); a.Element = text[1]; int len = text.Length; a.Position = Vector3.Parse(text[len - 3], text[len - 2], text[len - 1]); sites.Add(a); } }