private void InitializeMappings() { var e = (IEmbeddedElement)embeddedElement.ElementType; superElementMap.Clear(); int index = 0; foreach (var embeddedNode in e.EmbeddedNodes) { int nodeOrderInEmbeddedElement = embeddedElement.Nodes.FindFirstIndex(embeddedNode.Node); var currentEmbeddedNodeDOFs = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement)[nodeOrderInEmbeddedElement]; //var currentNodeDOFs = currentEmbeddedNodeDOFs.Intersect(embeddedNode.DependentDOFs); var independentEmbeddedDOFs = currentEmbeddedNodeDOFs.Except(embeddedNode.DependentDOFs); // TODO: Optimization to exclude host DOFs that embedded node does not depend on. for (int i = 0; i < embeddedNode.EmbeddedInElement.Nodes.Count; i++) { var currentNodeDOFs = embeddedNode.EmbeddedInElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedNode.EmbeddedInElement)[i]; foreach (var dof in currentNodeDOFs) { var superElementDOF = new SuperElementDof() { DOF = dof, EmbeddedNode = embeddedNode.Node, HostNode = embeddedNode.EmbeddedInElement.Nodes[i], Element = embeddedNode.EmbeddedInElement }; if (!superElementMap.ContainsKey(superElementDOF)) { superElementMap.Add(superElementDOF, index); index++; } } } //var independentEmbeddedDOFs = model.NodalDOFsDictionary[embeddedNode.Node.ID].Select(x => x.Key).Except(embeddedNode.DependentDOFs); //int nodeOrderInEmbeddedElement = embeddedElement.Nodes.IndexOf(embeddedNode.Node); //var independentEmbeddedDOFs = embeddedElement.ElementType.DOFEnumerator.GetDOFTypes(embeddedElement)[nodeOrderInEmbeddedElement].Except(embeddedNode.DependentDOFs); foreach (var dof in independentEmbeddedDOFs) { var superElementDOF = new SuperElementDof() { DOF = dof, EmbeddedNode = embeddedNode.Node, HostNode = null, Element = null }; if (!superElementMap.ContainsKey(superElementDOF)) { superElementMap.Add(superElementDOF, index); index++; } } } foreach (var node in embeddedElement.Nodes.Except(e.EmbeddedNodes.Select(x => x.Node))) { int nodeOrderInEmbeddedElement = embeddedElement.Nodes.FindFirstIndex(node); var currentNodeDOFs = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement)[nodeOrderInEmbeddedElement]; foreach (var dof in currentNodeDOFs) { var superElementDOF = new SuperElementDof() { DOF = dof, EmbeddedNode = node, HostNode = null, Element = null }; if (!superElementMap.ContainsKey(superElementDOF)) { superElementMap.Add(superElementDOF, index); index++; } } } }
private void CalculateTransformationMatrix() { var e = (IEmbeddedElement)(embeddedElement.ElementType); int row = 0; int col = 0; int totalRows = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement).SelectMany(x => x).Count(); //var matrix = new double[totalRows, superElementMap.Count]; var transformationMatrixOriginal = DokColMajor.CreateEmpty(totalRows, superElementMap.Count); foreach (var embeddedNode in e.EmbeddedNodes) { var localTransformationMatrix = transformation.GetTransformationVector(embeddedNode); var localHostDOFs = transformation.GetDOFTypesOfHost(embeddedNode); int nodeOrderInEmbeddedElement = embeddedElement.Nodes.FindFirstIndex(embeddedNode.Node); var embeddedNodeDOFQuantity = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement)[nodeOrderInEmbeddedElement].Count; int dependentDOFs = transformation.GetDependentDOFTypes.Count; for (int i = 0; i < dependentDOFs; i++) { col = 0; for (int j = 0; j < localHostDOFs.Count; j++) { for (int k = 0; k < localHostDOFs[j].Count; k++) { var superelement = new SuperElementDof() { DOF = localHostDOFs[j][k], Element = embeddedNode.EmbeddedInElement, EmbeddedNode = embeddedNode.Node, HostNode = embeddedNode.EmbeddedInElement.Nodes[j] }; transformationMatrixOriginal[40 + row + i, superElementMap[superelement]] = localTransformationMatrix[i][col]; col++; } } } row += dependentDOFs; var independentEmbeddedDOFs = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement)[nodeOrderInEmbeddedElement].Except(embeddedNode.DependentDOFs).ToArray(); for (int j = 0; j < independentEmbeddedDOFs.Length; j++) { var superelement = new SuperElementDof() { DOF = independentEmbeddedDOFs[j], Element = null, HostNode = null, EmbeddedNode = embeddedNode.Node }; transformationMatrixOriginal[40 + row, superElementMap[superelement]] = 1; row++; } } foreach (var node in embeddedElement.Nodes.Except(e.EmbeddedNodes.Select(x => x.Node))) { int nodeOrderInEmbeddedElement = embeddedElement.Nodes.FindFirstIndex(node); var currentNodeDOFs = embeddedElement.ElementType.DofEnumerator.GetDofTypesForMatrixAssembly(embeddedElement)[nodeOrderInEmbeddedElement]; for (int j = 0; j < currentNodeDOFs.Count; j++) { var superelement = new SuperElementDof() { DOF = currentNodeDOFs[j], Element = null, HostNode = null, EmbeddedNode = node }; transformationMatrixOriginal[row - 24, superElementMap[superelement]] = 1; row++; } } //StreamWriter sw = File.CreateText(String.Format("TransformationMatrix{0}.txt", embeddedElement.ID)); //for (int i = 0; i < totalRows; i++) //{ // var line = String.Empty; // for (int j = 0; j < superElementMap.Count; j++) // line += matrix[i,j].ToString() + ";"; // sw.WriteLine(line); //} //sw.Close(); //transformationMatrixOriginal = new Matrix2D(matrix); transformationMatrix = transformationMatrixOriginal.BuildCscMatrix(true);; }