/// <summary> /// This method creates the input to be used in finite element analysis. /// </summary> /// <param name="request"></param> /// <returns>A new instance of class <see cref="FiniteElementMethodInput"/>.</returns> public override async Task <FiniteElementMethodInput> CreateInput(TRequest request) { uint degreesOfFreedom = await this.CalculateDegreesOfFreedom(request.NumberOfElements).ConfigureAwait(false); TBeam beam = await this.BuildBeam(request, degreesOfFreedom); (bool[] boundaryConditions, uint numberOfTrueBoundaryConditions) = await this._mainMatrix.CalculateBoundaryConditions(beam, degreesOfFreedom).ConfigureAwait(false); double[,] mass = await this._mainMatrix.CalculateMass(beam, degreesOfFreedom).ConfigureAwait(false); double[,] stiffness = await this._mainMatrix.CalculateStiffness(beam, degreesOfFreedom).ConfigureAwait(false); double[,] damping = await this._mainMatrix.CalculateDamping(mass, stiffness).ConfigureAwait(false); double[] forces = await this._mainMatrix.CalculateForce(beam).ConfigureAwait(false); FiniteElementMethodInput input = await base.CreateInput(request).ConfigureAwait(false); input.NumericalMethod = (NumericalMethod)Enum.Parse(typeof(NumericalMethod), request.NumericalMethod, ignoreCase: true); input.Mass = await mass.ApplyBoundaryConditionsAsync(boundaryConditions, numberOfTrueBoundaryConditions).ConfigureAwait(false); input.Stiffness = await stiffness.ApplyBoundaryConditionsAsync(boundaryConditions, numberOfTrueBoundaryConditions).ConfigureAwait(false); input.Damping = await damping.ApplyBoundaryConditionsAsync(boundaryConditions, numberOfTrueBoundaryConditions).ConfigureAwait(false); input.OriginalForce = await forces.ApplyBoundaryConditionsAsync(boundaryConditions, numberOfTrueBoundaryConditions).ConfigureAwait(false); input.NumberOfTrueBoundaryConditions = numberOfTrueBoundaryConditions; return(input); }