/// <summary> /// /// </summary> /// <param name="element"></param> /// <returns></returns> public IElementStiffnessCalculator Create <T>(T element) where T : IFiniteElement { Guard.AgainstNullArgument(element, "element"); Guard.AgainstBadArgument("element", () => { return(!this.lookup.ContainsKey(element.GetType())); }, "ElementStiffnessMatrixBuilderFactory has not registered a builder for the element type {0}", element.GetType().FullName); Type builderType = this.lookup[element.GetType()]; object[] parameters = new object[] { element }; object builder = Activator.CreateInstance(builderType, parameters); Guard.AgainstInvalidState(() => { return(builder == null); }, "Failed to create an instance of type {0}. Most likely as the type does not implement a constructor expecting a single parameter of type FiniteElement", builderType.FullName); IElementStiffnessCalculator castBuilder = builder as IElementStiffnessCalculator; Guard.AgainstInvalidState(() => { return(castBuilder == null); }, "Tried to cast to IStiffnessMatrixBuilder but it is null. Most likely because the registered builder, {0}, for element type {1} does not inherit from IStiffnessMatrixBuilder", builderType.FullName, element.GetType().FullName); return(castBuilder); }
public void Setup() { mocks = new MockRepository(); node1 = mocks.StrictMock <IFiniteElementNode>(); node2 = mocks.StrictMock <IFiniteElementNode>(); node3 = mocks.StrictMock <IFiniteElementNode>(); spring1 = mocks.StrictMock <IFiniteElement>(); spring2 = mocks.StrictMock <IFiniteElement>(); spring1Calculator = mocks.StrictMock <IElementStiffnessCalculator>(); spring2Calculator = mocks.StrictMock <IElementStiffnessCalculator>(); constraintProvider = mocks.StrictMock <IModelConstraintProvider>(); topologyQueryable = mocks.StrictMock <ITopologyQueryable>(); elementStiffnessMatrixBuilderFactory = mocks.StrictMock <IElementStiffnessMatrixBuilderFactory>(); Expect.Call(elementStiffnessMatrixBuilderFactory.Create(spring1)) .Return(spring1Calculator); Expect.Call(elementStiffnessMatrixBuilderFactory.Create(spring2)) .Return(spring2Calculator); SUT = new GlobalModelStiffnessMatrixBuilder(topologyQueryable, constraintProvider, elementStiffnessMatrixBuilderFactory); }
/// <summary> /// /// </summary> /// <param name="element"></param> /// <returns></returns> private IElementStiffnessCalculator GetElementStiffnessProvider(IFiniteElement element) { int elementHash = element.GetHashCode(); // check the cache, and retrieve if available if (this.elementStiffnessProviderCache.ContainsKey(elementHash)) { return((IElementStiffnessCalculator)this.elementStiffnessProviderCache[elementHash]); } IElementStiffnessCalculator builder = this.stiffnessMatrixBuilderFactory.Create(element); // store in the cache this.elementStiffnessProviderCache.Add(elementHash, builder); return(builder); }
/// <summary> /// Sums all the stiffnesses across all elements which are connected to the given nodes /// </summary> /// <param name="elementsDirectlyConnectingRowAndColumnNodes">The list of all directly connected elements between both the row and column node</param> /// <param name="row">The node and degree of freedom which define the row</param> /// <param name="column">The node and degree of freedom which define the column</param> /// <returns>A double representing the stiffness for this element</returns> private double SumStiffnessesForAllElementsAt(IList <IFiniteElement> elementsDirectlyConnectingRowAndColumnNodes, NodalDegreeOfFreedom row, NodalDegreeOfFreedom column) { double totalStiffness = 0.0; Tuple <NodalDegreeOfFreedom, NodalDegreeOfFreedom> cacheKey = new Tuple <NodalDegreeOfFreedom, NodalDegreeOfFreedom>(row, column); if (this.stiffnessCache.TryGetValue(cacheKey, out totalStiffness)) { return(totalStiffness); } foreach (IFiniteElement e in elementsDirectlyConnectingRowAndColumnNodes) { IElementStiffnessCalculator elementStiffnessMatrixBuilder = this.GetElementStiffnessProvider(e); totalStiffness += elementStiffnessMatrixBuilder.GetStiffnessInGlobalCoordinatesAt(row.Node, row.DegreeOfFreedom, column.Node, column.DegreeOfFreedom); } this.stiffnessCache[cacheKey] = totalStiffness; return(totalStiffness); }
public static void Assert6x6StiffnessMatrix(IElementStiffnessCalculator SUT, params double[] expectedValues) { Helpers.AssertMatrix(SUT.StiffnessMatrixInGlobalCoordinates, 6, 6, expectedValues); }
public static void Assert6x6StiffnessMatrix(IElementStiffnessCalculator SUT, params double[] expectedValues) { Helpers.AssertMatrix(SUT.StiffnessMatrixInGlobalCoordinates, 6, 6, expectedValues); }
public void Setup() { mocks = new MockRepository(); node1 = mocks.StrictMock<IFiniteElementNode>(); node2 = mocks.StrictMock<IFiniteElementNode>(); node3 = mocks.StrictMock<IFiniteElementNode>(); spring1 = mocks.StrictMock<IFiniteElement>(); spring2 = mocks.StrictMock<IFiniteElement>(); spring1Calculator = mocks.StrictMock<IElementStiffnessCalculator>(); spring2Calculator = mocks.StrictMock<IElementStiffnessCalculator>(); constraintProvider = mocks.StrictMock<IModelConstraintProvider>(); topologyQueryable = mocks.StrictMock<ITopologyQueryable>(); elementStiffnessMatrixBuilderFactory = mocks.StrictMock<IElementStiffnessMatrixBuilderFactory>(); Expect.Call(elementStiffnessMatrixBuilderFactory.Create(spring1)) .Return(spring1Calculator); Expect.Call(elementStiffnessMatrixBuilderFactory.Create(spring2)) .Return(spring2Calculator); SUT = new GlobalModelStiffnessMatrixBuilder(topologyQueryable, constraintProvider, elementStiffnessMatrixBuilderFactory); }