コード例 #1
0
ファイル: ForceCalculator.cs プロジェクト: frke/genome-tools
        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;
                }
            }
        }
コード例 #2
0
ファイル: ForceCalculator.cs プロジェクト: frke/genome-tools
        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;
                }
            }
        }