Exemplo n.º 1
0
        double DotProduct(Dvector vector1, Dvector vector2)
        {
            double dotProduct;

            dotProduct = vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z + vector1.W * vector2.W;
            return(dotProduct);
        }
Exemplo n.º 2
0
        Dvector Crossproduct(Dvector vector1, Dvector vector2)
        {
            Dvector crossProduct = new Dvector();

            crossProduct.X = vector1.Y * vector2.Z - vector2.Y * vector1.Z;
            crossProduct.Y = vector1.Z * vector2.X - vector2.Z * vector1.X;
            crossProduct.Z = vector1.X * vector2.Y - vector2.X * vector1.Y;
            return(crossProduct);
        }
Exemplo n.º 3
0
        Dvector ScalarMultiple(double scalar, Dvector vector)
        {
            Dvector scalarMultiple = new Dvector();

            scalarMultiple.X = scalar * vector.X;
            scalarMultiple.Y = scalar * vector.Y;
            scalarMultiple.Z = scalar * vector.Z;
            scalarMultiple.W = scalar * vector.W;
            return(scalarMultiple);
        }
Exemplo n.º 4
0
        Dvector AddVector(Dvector vector1, Dvector vector2)
        {
            Dvector SumVector = new Dvector();

            SumVector.X = vector1.X + vector2.X;
            SumVector.Y = vector1.Y + vector2.Y;
            SumVector.Z = vector1.Z + vector2.Z;
            SumVector.W = vector1.W + vector2.W;
            return(SumVector);
        }
Exemplo n.º 5
0
        void Collision(Atom atom, Atom atom2)
        {
            double  radialV1, radialV2;
            Dvector position  = new Dvector();
            Dvector rad1UnitV = new Dvector();

            position  = AddVector(atom2.position, ScalarMultiple(-1, atom.position));
            radialV1  = DotProduct(atom.velocity, position) / AbsVect(position);
            radialV2  = DotProduct(atom2.velocity, ScalarMultiple(-1, position)) / AbsVect(position);
            rad1UnitV = ScalarMultiple(1 / AbsVect(position), AddVector(atom2.position, ScalarMultiple(-1, atom.position)));
            Dvector momentum = new Dvector();

            momentum = AddVector(ScalarMultiple(atom.mass, atom.velocity), ScalarMultiple(atom2.mass, atom2.velocity));
            double deltaV1 = (radialV2 - 2 * radialV1) * (atom.mass + 1) - radialV2 * atom2.mass;
            double deltaV2 = (radialV2 - 2 * radialV1) * atom.mass - radialV2 * (atom2.mass + 1);

            atom.velocity = AddVector(atom.velocity, ScalarMultiple(-deltaV1, rad1UnitV));
        }
Exemplo n.º 6
0
        void Molecule2Computer(Molecule2 molecule)
        {
            molecule.position = AddVector(molecule.position, ScalarMultiple(timeIncrement, molecule.velocity));
            double reducedMass;

            reducedMass = molecule.atom1.mass * molecule.atom2.mass / molecule.mass;
            Dvector r = ScalarMultiple(molecule.atom1.mass / molecule.mass, AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));

            molecule.interiaTensor[0, 0] = (Math.Pow(molecule.position.Y - molecule.atom1.position.Y, 2) + Math.Pow(molecule.position.Z - molecule.atom1.position.Z, 2)) * molecule.atom1.mass
                                           + (Math.Pow(molecule.position.Y - molecule.atom2.position.Y, 2) + Math.Pow(molecule.position.Z - molecule.atom2.position.Z, 2)) * molecule.atom2.mass;
            molecule.interiaTensor[1, 1] = (Math.Pow(molecule.position.X - molecule.atom1.position.X, 2) + Math.Pow(molecule.position.Z - molecule.atom1.position.Z, 2)) * molecule.atom1.mass
                                           + (Math.Pow(molecule.position.X - molecule.atom2.position.X, 2) + Math.Pow(molecule.position.Z - molecule.atom2.position.Z, 2)) * molecule.atom2.mass;
            molecule.interiaTensor[2, 2] = (Math.Pow(molecule.position.X - molecule.atom1.position.X, 2) + Math.Pow(molecule.position.Y - molecule.atom1.position.Y, 2)) * molecule.atom1.mass
                                           + (Math.Pow(molecule.position.X - molecule.atom2.position.X, 2) + Math.Pow(molecule.position.Y - molecule.atom2.position.Y, 2)) * molecule.atom2.mass;

            molecule.interiaTensor[1, 0] = (molecule.position.X - molecule.atom1.position.X) * (molecule.atom1.position.Y - molecule.position.Y) * molecule.atom1.mass + (molecule.position.X - molecule.atom2.position.X) * (molecule.atom2.position.Y - molecule.position.Y) * molecule.atom2.mass;
            molecule.interiaTensor[2, 0] = (molecule.position.X - molecule.atom1.position.X) * (molecule.atom1.position.Z - molecule.position.Z) * molecule.atom1.mass + (molecule.position.X - molecule.atom2.position.X) * (molecule.atom2.position.Z - molecule.position.Z) * molecule.atom2.mass;
            molecule.interiaTensor[2, 1] = (molecule.position.Y - molecule.atom1.position.Y) * (molecule.atom1.position.Z - molecule.position.Z) * molecule.atom1.mass + (molecule.position.Y - molecule.atom2.position.Y) * (molecule.atom2.position.Z - molecule.position.Z) * molecule.atom2.mass;

            molecule.interiaTensor[0, 1] = molecule.interiaTensor[1, 0];
            molecule.interiaTensor[0, 2] = molecule.interiaTensor[2, 0];

            molecule.interiaTensor[1, 2] = molecule.interiaTensor[2, 1];

            if (molecule.atom1.position.X > size.X || molecule.atom1.position.X < 0)
            {
                molecule.atom1.velocity.X = -molecule.atom1.velocity.X;
                molecule.velocity.X      += molecule.atom1.velocity.X * 2 * (molecule.atom1.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom1.velocity.X / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }
            if (molecule.atom1.position.Y > size.Y || molecule.atom1.position.Y < 0)
            {
                molecule.atom1.velocity.Y = -molecule.atom1.velocity.Y;
                molecule.velocity.Y      += molecule.atom1.velocity.Y * 2 * (molecule.atom1.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom1.velocity.Y / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }
            if (molecule.atom1.position.Z > size.Z || molecule.atom1.position.Z < 0)
            {
                molecule.atom1.velocity.Z = -molecule.atom1.velocity.Z;
                molecule.velocity.Z      += molecule.atom1.velocity.Z * 2 * (molecule.atom1.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom1.velocity.Z / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }

            if (molecule.atom2.position.X > size.X || molecule.atom2.position.X < 0)
            {
                molecule.atom2.velocity.X = -molecule.atom2.velocity.X;
                molecule.velocity.X      += molecule.atom2.velocity.X * 2 * (molecule.atom2.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom2.velocity.X / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }
            if (molecule.atom2.position.Y > size.Y || molecule.atom2.position.Y < 0)
            {
                molecule.atom2.velocity.Y = -molecule.atom2.velocity.Y;
                molecule.velocity.Y      += molecule.atom2.velocity.Y * 2 * (molecule.atom2.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom2.velocity.Y / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }
            if (molecule.atom2.position.Z > size.Z || molecule.atom2.position.Z < 0)
            {
                molecule.atom2.velocity.Z = -molecule.atom2.velocity.Z;
                molecule.velocity.Z      += molecule.atom2.velocity.Z * 2 * (molecule.atom2.mass) / molecule.mass;

                molecule.amplitude        = Math.Abs(2 * molecule.atom2.velocity.Z / Math.Sqrt(molecule.bondSpringConstant * reducedMass));
                molecule.angularFrequency = Math.Sqrt(molecule.bondSpringConstant * reducedMass);
                molecule.theta            = Math.PI / 2;

                molecule.angularVelocity = Crossproduct(ScalarMultiple(2, molecule.atom1.velocity), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
            }

            foreach (Atom atom in atoms)
            {
                if (molecule.atom1 != atom && AbsVect(AddVector(atom.position, ScalarMultiple(-1, molecule.atom1.position))) < atom.radius + molecule.atom1.radius)
                {
                    Collision(molecule.atom1, atom);
                    molecule.angularVelocity = Crossproduct(AddVector(molecule.atom1.velocity, ScalarMultiple(-1, molecule.atom2.velocity)), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
                }

                if (molecule.atom2 != atom && AbsVect(AddVector(atom.position, ScalarMultiple(-1, molecule.atom2.position))) < atom.radius + molecule.atom2.radius)
                {
                    Collision(molecule.atom2, atom);
                    molecule.angularVelocity = Crossproduct(AddVector(molecule.atom1.velocity, ScalarMultiple(-1, molecule.atom2.velocity)), AddVector(molecule.atom1.position, ScalarMultiple(-1, molecule.atom2.position)));
                }
            }

            molecule.angularVelocity   = Crossproduct(AddVector(molecule.atom2.velocity, ScalarMultiple(-1, molecule.atom1.velocity)), AddVector(molecule.atom2.velocity, ScalarMultiple(-1, molecule.atom1.velocity)));
            molecule.AngularMomentum.X = molecule.interiaTensor[0, 0] * molecule.angularVelocity.X + molecule.interiaTensor[0, 1] * molecule.angularVelocity.Y + molecule.interiaTensor[0, 2] * molecule.angularVelocity.Z;
            molecule.AngularMomentum.Y = molecule.interiaTensor[1, 0] * molecule.angularVelocity.X + molecule.interiaTensor[1, 1] * molecule.angularVelocity.Y + molecule.interiaTensor[1, 2] * molecule.angularVelocity.Z;
            molecule.AngularMomentum.Z = molecule.interiaTensor[2, 0] * molecule.angularVelocity.X + molecule.interiaTensor[2, 1] * molecule.angularVelocity.Y + molecule.interiaTensor[2, 2] * molecule.angularVelocity.Z;
        }
Exemplo n.º 7
0
        double AbsVect(Dvector vector)
        {
            double absvect = Math.Pow(vector.X, 2) + Math.Pow(vector.Y, 2) + Math.Pow(vector.Z, 2) + Math.Pow(vector.W, 2);

            return(absvect);
        }