Exemple #1
0
        public override IEnumerable <INumericalResult> Solve(int resultsCount)
        {
            ICollection <INumericalResult> results = new List <INumericalResult>();

            if (_mesh.IsMeshGenerated)
            {
                GetConstantMatrix();

                indeciesToDelete = getIndeciesWithStaticBoundaryConditions();

                Matrix StiffnessMatrix = GetStiffnessMatrix();
                StiffnessMatrix = applyStaticBoundaryConditions(StiffnessMatrix, indeciesToDelete);

                Matrix MassMatrix = GetMassMatrix();
                MassMatrix = applyStaticBoundaryConditions(MassMatrix, indeciesToDelete);

#if (ALL_LAMBDAS)
                Vector[] eigenVectors;
                double[] lambdas = StiffnessMatrix.GetEigenvalueSPAlgorithm(MassMatrix, out eigenVectors, _error, resultsCount);

                results = generateVibrationResults(lambdas, eigenVectors);
#else
                Vector eigenVector;
                double lambda = StiffnessMatrix.GetMaxEigenvalueSPAlgorithm(out eigenVector, _error);
                addStaticPoints(eigenVector);

                EigenValuesNumericalResult result = new EigenValuesNumericalResult(_mesh.Elements, eigenVector, Math.Sqrt(lambda / _model.Material.Rho));
                results.Add(result);
#endif
            }
            return(results);
        }
        public override IEnumerable <INumericalResult> Solve(int resultsCount)
        {
            IEnumerable <INumericalResult> results = new List <INumericalResult>();

            if (_mesh.IsMeshGenerated)
            {
                GetConstantMatrix();

                indeciesToDelete = getIndeciesWithStaticBoundaryConditions();

                Matrix stiffnessMatrix = GetStiffnessMatrix();
                stiffnessMatrix = applyStaticBoundaryConditions(stiffnessMatrix, indeciesToDelete);

                Matrix massMatrix = GetMassMatrix();
                massMatrix = applyStaticBoundaryConditions(massMatrix, indeciesToDelete);


#if (ALL_LAMBDAS)
                Vector   firstEigenVector = null;
                double[] lambdas          = null;
                Vector[] eigenVectors     = null;
                int      iterations       = 0;
                do
                {
                    if (eigenVectors != null)
                    {
                        firstEigenVector = eigenVectors[0];
                    }
                    else
                    {
                        firstEigenVector = new Vector(stiffnessMatrix.CountRows);
                    }

                    firstEigenVector = applyAmplitudeToVector(firstEigenVector);

                    Matrix nonlinearMatrix = GetNonlinearMatrix(firstEigenVector);
                    nonlinearMatrix = applyStaticBoundaryConditions(nonlinearMatrix, indeciesToDelete);

                    Matrix k = stiffnessMatrix + nonlinearMatrix;
                    lambdas = k.GetEigenvalueSPAlgorithm(massMatrix, out eigenVectors, _error, resultsCount);
                    iterations++;
                }while ((Vector.Norm(eigenVectors[0] - firstEigenVector) > _error) && (iterations < _maxIterations));
                results = generateVibrationResults(lambdas, eigenVectors);
#else
                Vector eigenVector;
                double lambda = StiffnessMatrix.GetMaxEigenvalueSPAlgorithm(out eigenVector, _error);
                addStaticPoints(eigenVector);

                EigenValuesNumericalResult result = new EigenValuesNumericalResult(_mesh.Elements, eigenVector, Math.Sqrt(lambda / _model.Material.Rho));
                results.Add(result);
#endif
            }
            return(results);
        }
        protected ICollection <INumericalResult> generateVibrationResults(double[] lambdas, Vector[] eigenVectors)
        {
            List <INumericalResult> results = new List <INumericalResult>();

            for (int i = 0; i < lambdas.Length; i++)
            {
                Vector eigenVector = eigenVectors[i];
                //eigenVector = addStaticPoints(eigenVector, indeciesToDelete);
                //eigenVector = applyAmplitudeToVector(eigenVector);
                EigenValuesNumericalResult result = new EigenValuesNumericalResult(_mesh.Elements, eigenVector, Math.Sqrt(lambdas[i] / _model.Material.Rho));
                results.Add(result);
            }

            return(results);
        }