Beispiel #1
0
        private static void Tst()
        {
            int n = 8;

            int[] ia /*[9]*/ = new int[] { 1, 5, 8, 10, 12, 15, 17, 18, 19 };

            int[] ja /*[18]*/ = new int[] { 1, 3, 6, 7,
                                            2, 3, 5,
                                            3, 8,
                                            4, 7,
                                            5, 6, 7,
                                            6, 8,
                                            7,
                                            8 };

            double[] a /*[18]*/ = new double[] { 7.0, 1.0, 2.0, 7.0,
                                                 -4.0, 8.0, 2.0,
                                                 1.0, 5.0,
                                                 7.0, 9.0,
                                                 5.0, 1.0, 5.0,
                                                 -1.0, 5.0,
                                                 11.0,
                                                 5.0 };

            var csr = new CSparse.Double.CompressedColumnStorage(n, n, 18);

            csr.ColumnPointers = ia;
            csr.RowIndices     = ja;
            csr.Values         = a;
        }
Beispiel #2
0
        public CSR GetAdjacencyGraph(CSR P_delta)
        {
            var p = P_delta.CloneMatrix();

            for (var i = 0; i < p.NonZerosCount; i++)
            {
                p.Values[i] = 1;
            }

            var buf = (CSR)p.Multiply(p.Transpose());

            return(buf);
        }
Beispiel #3
0
        public static SparseEqSystem Generate(CSparse.Double.CompressedColumnStorage eqSystem)
        {
            var buf     = new SparseEqSystem();
            var lastCol = eqSystem.ColumnCount;

            var eqs     = buf.Equations = new SparseRow[eqSystem.RowCount];
            var colNnzs = buf.ColumnNonzeros = new int[eqSystem.ColumnCount];

            buf.RowNonzeros = new int[eqSystem.RowCount];


            for (var i = 0; i < eqs.Length; i++)
            {
                buf.Equations[i] = new SparseRow(1);
            }


            foreach (var tuple in eqSystem.EnumerateIndexed2())
            {
                var rw  = tuple.Item1; //tuple.Item1;
                var col = tuple.Item2; //tuple.Item2;
                var val = tuple.Item3;

                eqs[rw].Add(col, val);

                if (col != lastCol)
                {
                    colNnzs[col]++;
                }
            }


            for (var i = 0; i < eqs.Length; i++)
            {
                buf.RowNonzeros[i] = buf.Equations[i].CalcNnz(lastCol);
            }

            buf.RowCount    = eqSystem.RowCount;
            buf.ColumnCount = eqSystem.ColumnCount;

            return(buf);
        }
Beispiel #4
0
        public CCS CalculateRref(CCS a)
        {
            var singleMemberColumns = 00;

            var aTran = a.Transpose();

            var n = a.ColumnCount;

            for (var i = 0; i < n; i++)
            {
                if (a.GetNnzcForColumn(i) == 1)
                {
                    singleMemberColumns++;
                }
            }

            if (singleMemberColumns == a.RowCount)
            {
                return(a.Clonee());
            }

            var pat  = new CoordinateStorage <double>(a.RowCount, a.ColumnCount - 1, 1, true);
            var bCrd = new CoordinateStorage <double>(a.RowCount, a.ColumnCount - 1, 1, true);//a matrix without last column

            a.EnumerateMembers((row, col, val) =>
            {
                if (col != a.ColumnCount - 1)
                {
                    pat.At(row, col, 1);
                    bCrd.At(row, col, val);
                }
            });
            //nonzero pattern of a, except last column

            var b     = bCrd.ToCCs();
            var bTran = b.Transpose();

            var patt   = pat.ToCCs();
            var pattTr = patt.Transpose();


            var varGraph = pattTr.Multiply(patt);

            varGraph.Values.SetAllMembers(1);

            var eqnGraph = patt.Multiply(pattTr);

            eqnGraph.Values.SetAllMembers(1);



            if (!varGraph.IsSymmetric() || !eqnGraph.IsSymmetric())
            {
                throw new Exception();
            }

            var eqnParts = CalcUtil.EnumerateGraphParts(eqnGraph);

            var varParts = CalcUtil.EnumerateGraphParts(varGraph);

            var varVisited = new bool[varGraph.ColumnCount];

            foreach (var eqnPart in eqnParts)
            {
                //i'th independent system.
                var firstEq = eqnPart.First();

                int firstVarOfFirstEq = -1;

                /*
                 * patt.EnumerateRowMembers(firstEq, (row, col, val) => {
                 * if (firstValOfFirstEq != -1)
                 *  firstValOfFirstEq = col;
                 * );
                 */


                pattTr.EnumerateColumnMembers(firstEq, (row, col, val) =>
                {
                    if (firstVarOfFirstEq == -1)
                    {
                        firstVarOfFirstEq = row;
                    }
                });

                //var firstVar = patt.EnumerateColumnMembers()

                var connectedVariables = CalcUtil.DepthFirstSearch(varGraph, varVisited, firstVarOfFirstEq);

                connectedVariables.Sort();

                var vp = new Dictionary <int, int>();//variablePermute

                //vp[a] = b, a: number of variable in original system
                // b: index of variable in connectedVariables

                for (var i = 0; i < connectedVariables.Count; i++)
                {
                    vp[connectedVariables[i]] = i;
                }


                var denseSubSytem = new Matrix(eqnPart.Count, connectedVariables.Count + 1);////i'th independent system as dense

                var dns = aTran.ToDenseMatrix();

                for (var i = 0; i < eqnPart.Count; i++)
                {
                    //insert i'th eqn into denseSubSytem

                    var row = i;

                    var st = aTran.ColumnPointers[i];
                    var en = aTran.ColumnPointers[i + 1];

                    for (int j = st; j < en; j++)
                    {
                        var col = aTran.RowIndices[j];

                        if (col == a.ColumnCount - 1)
                        {
                            continue;
                        }

                        var val = aTran.Values[j];


                        denseSubSytem[i, vp[col]] = val;
                    }
                }
            }

            throw new NotImplementedException();
        }
Beispiel #5
0
 /// <summary>
 /// Divides the zones of reduced <see cref="matrix"/>.
 /// </summary>
 /// <param name="model">The model.</param>
 /// <param name="matrix">The reduced matrix.</param>
 /// <param name="dofMap">The DoF map.</param>
 /// <returns></returns>
 /// <exception cref="System.NotImplementedException"></exception>
 public static ZoneDevidedMatrix DivideZones(Model model, CCS matrix, DofMappingManager dofMap)
 {
     //see Calcutil.GetReducedZoneDividedMatrix
     throw new NotImplementedException();
 }
Beispiel #6
0
 /// <summary>
 /// Extracts the free free part.
 /// </summary>
 /// <param name="matrix">The matrix.</param>
 /// <param name="nodeMapping">The node mapping.</param>
 /// <returns></returns>
 /// <exception cref="System.NotImplementedException"></exception>
 public static CCS ExtractFreeFreePart(CCS matrix, int[] nodeMapping)
 {
     throw new NotImplementedException();
 }