/// <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 })); }
/// <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)); }