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