Result <LoadIncrementalState> GetCorrection(LoadState state, LoadIncrementalState prediction, StructureInfo info)
        {
            ILinearSolver   stiffnessMatrix = info.Stiffness(state.Displacement);
            Vector <double> dut             = stiffnessMatrix.Solve(info.ReferenceLoad);
            Vector <double> reaction        = info.Reaction(state.Displacement);
            Vector <double> equilibrium     = info.InitialLoad + state.Lambda * info.ReferenceLoad - reaction;
            Vector <double> dur             = stiffnessMatrix.Solve(equilibrium);
            Result <LoadIncrementalState> incrementalStateResult = Scheme.Correct(state, prediction, info, dut, dur);

            return(incrementalStateResult);
        }
        IEnumerable <double> GetErrors(LoadState newState, LoadState oldState, StructureInfo info)
        {
            Vector <double> reaction              = info.Reaction(newState.Displacement);
            Vector <double> equilibrium           = info.InitialLoad + newState.Lambda * info.ReferenceLoad - reaction;
            Vector <double> incrementDisplacement = newState.Displacement - oldState.Displacement;

            yield return(incrementDisplacement.Norm(2) / newState.Displacement.Norm(2));

            yield return(equilibrium.Norm(2) / info.ReferenceLoad.Norm(2));

            yield return(Math.Abs(newState.Displacement.DotProduct(equilibrium) / newState.Displacement.DotProduct(info.ReferenceLoad)));
        }
Example #3
0
        public LoadIncrementalState SelectDisplacement(
            StructureInfo info
            , LoadState state
            , LoadIncrementalState prediction
            , IEnumerable <LoadIncrementalState> candidates)
        {
            double Function(LoadIncrementalState candidate)
            {
                Vector <double> displacement      = state.Displacement + candidate.IncrementDisplacement;
                Vector <double> reaction          = info.Reaction(displacement);
                double          lambda            = state.Lambda + candidate.IncrementLambda;
                Vector <double> equilibriumVector = info.InitialLoad + lambda * info.ReferenceLoad - reaction;

                return(equilibriumVector.Norm(2));
            }

            return(candidates.MinBy(Function).First());
        }
Example #4
0
        internal LoadIncrementalState Predict(LoadState state, double initialStiffness, StructureInfo info)
        {
            Vector<double> equilibrium = info.InitialLoad + state.Lambda * info.ReferenceLoad - info.Reaction(state.Displacement);
            ILinearSolver mK = info.Stiffness(state.Displacement);
            Vector<double> Dvt = mK.Solve(info.ReferenceLoad);
            Vector<double> Dvr = mK.Solve(equilibrium);
            double bergam = GetBergamParameter(initialStiffness, Dvt, info);
            double DLambda = Scheme.Predict(Dvt, info.ReferenceLoad) * Math.Sign(bergam);
            Vector<double> Dv = DLambda * Dvt + Dvr;

            return new LoadIncrementalState(DLambda, Dv);
        }