private static void CalculateIonicForces(Molecule molecule, Dictionary <uint, Vector3D> forceLookup, AtomNeighborhoodMap neighborhoodMap) { var vertexIds = molecule.MoleculeStructure.Vertices.Select(v => v.Id); foreach (var vertexId in vertexIds) { var atom = molecule.GetAtom(vertexId); var charge1 = atom.EffectiveCharge; var atom1Position = atom.Position; var neighborhood = neighborhoodMap.GetNeighborhood(vertexId); foreach (var neighborVertexId in neighborhood) { if (neighborVertexId <= vertexId) { continue; } var neighborAtom = molecule.GetAtom(neighborVertexId); var charge2 = neighborAtom.EffectiveCharge; var r = atom1Position.VectorTo(neighborAtom.Position); var distance = r.Magnitude().In(SIPrefix.Pico, Unit.Meter); var chargeProduct = PhysicalConstants.CoulombsConstant.Value * charge1.Value * charge2.Value; var ionicForce = -5 * 1e-1 * (chargeProduct / (distance * distance)) * r.Normalize().ToVector3D(); forceLookup[vertexId] += ionicForce; forceLookup[neighborVertexId] += -ionicForce; } } }
private static void CalculateAtomShellRepulsion(Molecule molecule, Dictionary <uint, Vector3D> forceLookup, AtomNeighborhoodMap neighborhoodMap) { var vertices = molecule.MoleculeStructure.Vertices.Select(v => v.Id); foreach (var vertex in vertices) { var atom = molecule.GetAtom(vertex); var atom1Position = atom.Position; var atom1Radius = atom.Radius.Value; //var bondedNeighbors = new HashSet<Atom>(atom.OuterOrbitals // .Where(o => o.IsPartOfBond) // .Select(o => GetBondedAtom(o, atom))); var neighborhood = neighborhoodMap.GetNeighborhood(vertex); foreach (var neighborVertex in neighborhood) { if (neighborVertex <= vertex) { continue; } var neighborAtom = molecule.GetAtom(neighborVertex); //if (bondedNeighbors.Contains(neighborAtom)) // continue; var atom2Radius = atom.Radius.Value; var atomRadiusSum = atom1Radius + atom2Radius; var r = atom1Position.VectorTo(neighborAtom.Position); var distance = r.Magnitude().In(SIPrefix.Pico, Unit.Meter); var shellRepulsionForce = -(1e-5 * (1e-12 / distance) * Math.Exp(Math.Min(1e12 * (atomRadiusSum - distance), 0))) * r.Normalize().ToVector3D(); forceLookup[vertex] += shellRepulsionForce; forceLookup[neighborVertex] += -shellRepulsionForce; } } }