/// <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);
        }
Beispiel #5
0
 public static void Assert6x6StiffnessMatrix(IElementStiffnessCalculator SUT, params double[] expectedValues)
 {
     Helpers.AssertMatrix(SUT.StiffnessMatrixInGlobalCoordinates, 6, 6, expectedValues);
 }
Beispiel #6
0
 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);
        }