Exemple #1
0
        /// <summary>
        /// This method builds a <see cref="FiniteElementMethodInput"/> based on <see cref="TwoDegreesOfFreedomInput"/>.
        /// It is used in the matricial form of two degrees of freedom solution.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public Task <FiniteElementMethodInput> BuildFiniteElementMethodInput(TwoDegreesOfFreedomInput input)
        {
            double[,] mass = new double[, ] {
                { input.Mass, 0 }, { 0, input.SecondaryMass }
            };
            double[,] stiffness = new double[, ] {
                { input.Stiffness + input.SecondaryStiffness, -input.SecondaryStiffness }, { -input.SecondaryStiffness, input.SecondaryStiffness }
            };
            double[,] damping = new double[, ] {
                { input.Damping + input.SecondaryDamping, -input.SecondaryDamping }, { -input.SecondaryDamping, input.SecondaryDamping }
            };

            return(Task.FromResult(new FiniteElementMethodInput
            {
                Mass = mass,
                Damping = damping,
                Stiffness = stiffness,
                OriginalForce = new double[] { input.Force, 0 },
                AngularFrequency = input.AngularFrequency,
                AngularFrequencyStep = input.AngularFrequencyStep,
                FinalAngularFrequency = input.FinalAngularFrequency,
                FinalTime = input.FinalTime,
                NumberOfTrueBoundaryConditions = 2,
                TimeStep = input.TimeStep,
                NumericalMethod = input.NumericalMethod,
                ForceType = input.ForceType
            }));
        }
Exemple #2
0
        /// <summary>
        /// Calculates and write in a file the results for two degrees of freedom analysis.
        /// </summary>
        /// <param name="input"></param>
        /// <param name="time"></param>
        /// <param name="previousResult"></param>
        /// <returns></returns>
        public virtual async Task <double[]> CalculateTwoDegreesOfFreedomResult(TwoDegreesOfFreedomInput input, double time, double[] previousResult)
        {
            FiniteElementMethodInput finiteElementMethodInput = await this._mappingResolver.BuildFiniteElementMethodInput(input).ConfigureAwait(false);

            FiniteElementResult previousFiniteElementResult = await this._mappingResolver.BuildFiniteElementResult(previousResult, input.Force).ConfigureAwait(false);

            FiniteElementResult finiteElementResult = await this.CalculateFiniteElementResult(finiteElementMethodInput, previousFiniteElementResult, time).ConfigureAwait(false);

            double[] result = await this._mappingResolver.BuildVariableVector(finiteElementResult).ConfigureAwait(false);

            return(result);
        }
        /// <summary>
        /// Calculates the value of the differential equation of motion used for the two degrees of freedom case for a specific time, based on the force and angular frequency that are passed.
        /// </summary>
        /// <param name="input"></param>
        /// <param name="time"></param>
        /// <param name="previousResult"></param>
        /// <returns></returns>
        public async Task <double[]> CalculateForTwoDegreedOfFreedom(TwoDegreesOfFreedomInput input, double time, double[] previousResult)
        {
            double[] result = new double[Constant.NumberOfRigidBodyVariables_2DF];

            double force = await this._force.CalculateForceByType(input.Force, input.AngularFrequency, time, input.ForceType).ConfigureAwait(false);

            // Velocity of primary object.
            result[0] = previousResult[2];
            // Velocity of secondary object.
            result[1] = previousResult[3];
            // Acceleration of primary object.
            result[2] = (force - ((input.Stiffness + input.SecondaryStiffness) * previousResult[0] - input.SecondaryStiffness * previousResult[1] + (input.Damping + input.SecondaryDamping) * previousResult[2] - input.SecondaryDamping * previousResult[3])) / input.Mass;
            // Acceleration of secondary object.
            result[3] = (input.SecondaryStiffness * (previousResult[0] - previousResult[1]) + input.SecondaryDamping * (previousResult[2] - previousResult[3])) / input.SecondaryMass;

            return(result);
        }
 /// <summary>
 /// Calculates and write in a file the results for two degrees of freedom analysis using Runge Kutta Forth Order numerical method.
 /// </summary>
 /// <param name="input"></param>
 /// <param name="time"></param>
 /// <param name="previousResult"></param>
 /// <returns></returns>
 public override async Task <double[]> CalculateTwoDegreesOfFreedomResult(TwoDegreesOfFreedomInput input, double time, double[] previousResult)
 {
     return(await this.CalculateResult(this._differentialEquationOfMotion.CalculateForTwoDegreedOfFreedom, input, time, previousResult).ConfigureAwait(false));
 }