private static void TestIndexer()
        {
            Matrix      dense = Matrix.CreateFromArray(SparseRectangular10by5.Matrix);
            DokColMajor dok   = CreateDok(SparseRectangular10by5.Matrix);

            comparer.AssertEqual(dense, dok);
        }
Example #2
0
 /// <summary>
 /// Reads a general sparse matrix from the file specified by <paramref name="path"/>. Even if the matrix is symmetric,
 /// the file must contain both the upper and lower triangle.
 /// </summary>
 /// <param name="path">The absolute path of the array.</param>
 /// <exception cref="IOException">Thrown if there is no such file or if the dimensions of the matrix specified in the
 ///     first line are invalid.</exception>
 public DokColMajor ReadFileAsDokColMajor(string path)
 {
     using (var reader = new StreamReader(path))
     {
         (int numRows, int numCols, int nnz) = ReadMatrixDimensions(reader);
         var builder = DokColMajor.CreateEmpty(numRows, numCols);
         ReadMatrixEntries(reader, nnz, builder);
         return(builder);
     }
 }
        internal static CscMatrix GetSubmatrixCsc(double[] skyValues, int[] skyDiagOffsets, int[] rowsToKeep, int[] colsToKeep)
        {
            if ((rowsToKeep.Length == 0) || (colsToKeep.Length == 0))
            {
                return(CscMatrix.CreateFromArrays(rowsToKeep.Length, colsToKeep.Length, new double[0], new int[0],
                                                  new int[1] {
                    0
                }, false));
            }
            var submatrix = DokColMajor.CreateEmpty(rowsToKeep.Length, colsToKeep.Length);

            for (int subCol = 0; subCol < colsToKeep.Length; ++subCol)
            {
                int col        = colsToKeep[subCol];
                int diagOffset = skyDiagOffsets[col];
                int colHeight  = skyDiagOffsets[col + 1] - diagOffset - 1; // excluding diagonal
                for (int subRow = 0; subRow < rowsToKeep.Length; ++subRow)
                {
                    int row = rowsToKeep[subRow];
                    if (row <= col)
                    {
                        int entryHeight = col - row;  // excluding diagonal
                        if (entryHeight <= colHeight) // inside stored non zero pattern
                        {
                            double val = skyValues[diagOffset + entryHeight];
                            if (val != 0.0)
                            {
                                submatrix[subRow, subCol] = val;             // Skyline format stores many unnecessary zeros.
                            }
                        }
                    }
                    else // Transpose row <-> col. The cached column height and offset must be recalculated.
                    {
                        int transposedDiagOffset = skyDiagOffsets[row];
                        int transposedColHeight  = skyDiagOffsets[row + 1] - transposedDiagOffset - 1; // excluding diagonal
                        int entryHeight          = row - col;                                          // excluding diagonal
                        if (entryHeight <= transposedColHeight)                                        // inside stored non zero pattern
                        {
                            double val = skyValues[transposedDiagOffset + entryHeight];
                            if (val != 0.0)
                            {
                                submatrix[subRow, subCol] = val;             // Skyline format stores many unnecessary zeros.
                            }
                        }
                    }
                }
            }
            return(submatrix.BuildCscMatrix(true));
        }
        private static void TestBuildCSR()
        {
            var         dense = Matrix.CreateFromArray(SparseRectangular10by5.Matrix);
            DokColMajor dok   = CreateDok(SparseRectangular10by5.Matrix);

            // CSR with sorted col indices of each row
            CscMatrix cscSorted = dok.BuildCscMatrix(true);

            comparer.AssertEqual(dense, cscSorted);

            // CSR without sorting
            CscMatrix cscUnsorted = dok.BuildCscMatrix(false);

            comparer.AssertEqual(dense, cscUnsorted);
        }
Example #5
0
        private static void TestPosDefSystemSolution()
        {
            double pivotTolerance = 0.5;
            int    order          = SparsePosDef10by10.Order;
            var    skyline        = SkylineMatrix.CreateFromArrays(order, SparsePosDef10by10.SkylineValues,
                                                                   SparsePosDef10by10.SkylineDiagOffsets, true, true);
            var dok       = DokColMajor.CreateFromSparseMatrix(skyline);
            var b         = Vector.CreateFromArray(SparsePosDef10by10.Rhs);
            var xExpected = Vector.CreateFromArray(SparsePosDef10by10.Lhs);

            (double[] cscValues, int[] cscRowIndices, int[] cscColOffsets) = dok.BuildCscArrays(true);
            var    factor    = LUCSparseNet.Factorize(order, cscValues.Length, cscValues, cscRowIndices, cscColOffsets, pivotTolerance);
            Vector xComputed = factor.SolveLinearSystem(b);

            comparer.AssertEqual(xExpected, xComputed);
        }
        private static DokColMajor CreateDok(double[,] matrix)
        {
            int m   = matrix.GetLength(0);
            int n   = matrix.GetLength(1);
            var dok = DokColMajor.CreateEmpty(m, n);

            for (int i = 0; i < m; ++i)
            {
                for (int j = 0; j < n; ++j)
                {
                    if (matrix[i, j] != 0.0)
                    {
                        dok[i, j] = matrix[i, j];
                    }
                }
            }
            return(dok);
        }
Example #7
0
        private static void TestNonsymmSystemSolution()
        {
            double pivotTolerance = 0.5;
            int    order          = SquareInvertible10by10.Order;
            var    b         = Vector.CreateFromArray(SquareInvertible10by10.Rhs);
            var    xExpected = Vector.CreateFromArray(SquareInvertible10by10.Lhs);

            var dok = DokColMajor.CreateEmpty(order, order);

            for (int j = 0; j < order; ++j)
            {
                for (int i = 0; i < order; ++i)
                {
                    dok[i, j] = SquareInvertible10by10.Matrix[i, j];
                }
            }

            (double[] cscValues, int[] cscRowIndices, int[] cscColOffsets) = dok.BuildCscArrays(true);
            var factor = LUCSparseNet.Factorize(order, cscValues.Length, cscValues, cscRowIndices, cscColOffsets,
                                                pivotTolerance);
            Vector xComputed = factor.SolveLinearSystem(b);

            comparer.AssertEqual(xExpected, xComputed);
        }
        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);;
        }