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