예제 #1
0
파일: Utils.cs 프로젝트: rohitvuppala/BoSSS
        public static void SetDefaultSplitSelection(this SubBlockSelector sbs, MatrixShape shape, bool upper, bool islocal = true)
        {
            switch (shape)
            {
            case MatrixShape.diagonal:
            case MatrixShape.full:
                sbs.DefaultCellSplit(upper, islocal);
                break;

            case MatrixShape.diagonal_var:
            case MatrixShape.full_var:
                sbs.DefaultSpeciesSplit(upper);
                if (!islocal)
                {
                    sbs.AllExternalCellsSelection();
                }
                break;

            case MatrixShape.diagonal_spec:
            case MatrixShape.full_spec:
                sbs.DefaultVarSplit(upper);
                if (!islocal)
                {
                    sbs.AllExternalCellsSelection();
                }
                break;

            case MatrixShape.diagonal_var_spec:
            case MatrixShape.full_var_spec:
                sbs.DefaultCellSplit(upper, islocal);
                break;

            default:
                throw new NotSupportedException(String.Format("{0} is not supported by this test", shape));
            }
        }
예제 #2
0
        public static void VectorCellwiseOperation(
            [Values(XDGusage.none, XDGusage.all)] XDGusage UseXdg,
            [Values(2)] int DGOrder,
            [Values(MatrixShape.diagonal_var_spec, MatrixShape.diagonal_spec, MatrixShape.diagonal_var, MatrixShape.diagonal)] MatrixShape MShape,
            [Values(4)] int Res
            )
        {
            Utils.TestInit((int)UseXdg, DGOrder, (int)MShape);
            Console.WriteLine("SubMatrixIgnoreCoupling({0},{1},{2})", UseXdg, DGOrder, MShape);

            //Arrange --- create test matrix, MG mapping
            MultigridOperator mgo = Utils.CreateTestMGOperator(UseXdg, DGOrder, MShape, Res);
            MultigridMapping  map = mgo.Mapping;
            BlockMsrMatrix    M   = mgo.OperatorMatrix;


            //Arrange --- masking and subblock extraction of external cells
            var sbs = new SubBlockSelector(map);

            sbs.AllExternalCellsSelection();
            var M_ext   = BlockMask.GetAllExternalRows(map, M);
            var mask    = new BlockMask(sbs, M_ext);
            var eblocks = mask.GetDiagonalBlocks(M, false, false);

            //Dictionary<int, int[]> Didc = Utils.GetDictOfAllExtCellIdc(map);

            //Arrange --- generate rnd vector and distribute it
            double[] vec = new double[map.LocalLength];
            vec = Utils.GetRandomVector(map.LocalLength);
            var vec_ex = new MPIexchange <double[]>(map, vec);

            vec_ex.TransceiveStartImReturn();
            vec_ex.TransceiveFinish(0.0);
            Debug.Assert(vec_ex.Vector_Ext.L2Norm() != 0);

            //Arrange --- stopwatch
            var stw = new Stopwatch();

            stw.Reset();

            //Arrange --- get extended (loc+external cells) vector
            double[] Vec_ext = new double[vec.Length + vec_ex.Vector_Ext.Length];
            mask.AccSubVec(vec_ex.Vector_Ext, Vec_ext);

            bool test = eblocks.Length.MPIEquals();

            Debug.Assert(test);
            //Act --- calculate blockwise result: M_i*vec_i=Res_i
            double[] Res_ext = new double[Vec_ext.Length];
            stw.Start();
            for (int i = 0; i < eblocks.Length; i++)
            {
                //int iBlock = i + map.AggGrid.iLogicalCells.NoOfLocalUpdatedCells;
                double[] vec_i = mask.GetSubVecOfCell(Vec_ext, i);
                double[] Res_i = new double[vec_i.Length];
                eblocks[i].MatVecMul(1.0, vec_i, 0.0, Res_i);
                mask.AccSubVecOfCell(Res_i, i, Res_ext);
                if (map.MpiRank == 0)
                {
                    eblocks[i].ConvertToMsr().SaveToTextFileSparseDebug(String.Format("block_{0}_{1}", i, map.MpiRank));
                    vec_i.SaveToTextFileDebug(String.Format("vec_{0}_{1}", i, map.MpiRank));
                    Res_i.SaveToTextFileDebug(String.Format("Res_{0}_{1}", i, map.MpiRank));
                }
            }
            stw.Stop();

            //Act --- project Res_i onto Res_g and Res_g=M_ext*vec_ext-Res_g
            double[] Res_g  = mask.GetSubVec(Res_ext);
            var      qM_ext = M_ext.ConvertToQuadraticBMsr(mask.GlobalIList_External.ToArray(), false);

            qM_ext.SpMV(1.0, vec_ex.Vector_Ext, -1.0, Res_g);

            if (map.MpiRank == 0)
            {
                vec_ex.Vector_Ext.SaveToTextFileDebug("vec_g");
                Res_g.SaveToTextFileDebug("Res_g");
                M_ext.SaveToTextFileSparseDebug("M_ext");
                qM_ext.SaveToTextFileSparseDebug("qM_ext");
            }

            //Assert --- |Res_g| should be at least near to zero
            Assert.IsTrue(Res_g.L2Norm() == 0.0);
        }
예제 #3
0
        public static void FastSubMatrixExtraction(
            [Values(XDGusage.none, XDGusage.all)] XDGusage UseXdg,
            [Values(2)] int DGOrder,
            [Values(MatrixShape.laplace)] MatrixShape MShape,
            [Values(4)] int Res
            )
        {
            Utils.TestInit((int)UseXdg, DGOrder, (int)MShape);
            Console.WriteLine("FastSubMatrixExtraction({0},{1},{2})", UseXdg, DGOrder, MShape);

            //Arrange ---
            MultigridOperator mgo = Utils.CreateTestMGOperator(UseXdg, DGOrder, MShape, Res);
            MultigridMapping  map = mgo.Mapping;
            BlockMsrMatrix    M   = mgo.OperatorMatrix;

            var sbs = new SubBlockSelector(map);

            int[] extcells = sbs.AllExternalCellsSelection();
            var   M_ext    = BlockMask.GetAllExternalRows(map, M);
            var   mask     = new BlockMask(sbs, M_ext);

            //Arrange --- get index list of all external cells
            int[]    idc     = Utils.GetAllExtCellIdc(map);
            double[] GlobIdx = idc.Count().ForLoop(i => (double)idc[i] + 1.0);

            //Arrange --- stopwatch
            var stw = new Stopwatch();

            stw.Reset();

            //Act --- Extract SubMatrix
            stw.Start();
            BlockMsrMatrix subM = mask.GetSubBlockMatrix(M);

            stw.Stop();

            //Arrange --- Extract Blocks in Matlab and substract
            var infNorm = MultidimensionalArray.Create(4, 1);
            int rank    = map.MpiRank;

            using (BatchmodeConnector matlab = new BatchmodeConnector()) {
                matlab.PutSparseMatrix(M, "M");
                // note: M_sub lives on Comm_Self, therefore we have to distinguish between procs ...
                matlab.PutSparseMatrixRankExclusive(subM, "M_sub");
                matlab.PutVectorRankExclusive(GlobIdx, "Idx");
                matlab.Cmd("M_0 = M(Idx_0, Idx_0);");
                matlab.Cmd("M_1 = M(Idx_1, Idx_1);");
                matlab.Cmd("M_2 = M(Idx_2, Idx_2);");
                matlab.Cmd("M_3 = M(Idx_3, Idx_3);");
                matlab.Cmd("n=[0; 0; 0; 0];");
                matlab.Cmd("n(1,1)=norm(M_0-M_sub_0,inf);");
                matlab.Cmd("n(2,1)=norm(M_1-M_sub_1,inf);");
                matlab.Cmd("n(3,1)=norm(M_2-M_sub_2,inf);");
                matlab.Cmd("n(4,1)=norm(M_3-M_sub_3,inf);");
                matlab.GetMatrix(infNorm, "n");
                matlab.Execute();
            }

            //Assert --- mask blocks and extracted blocks are the same
            Assert.IsTrue(infNorm[rank, 0] == 0.0);
        }
예제 #4
0
        public static void SubBlockExtraction(
            [Values(XDGusage.none, XDGusage.all)] XDGusage UseXdg,
            [Values(2)] int DGOrder,
            [Values(MatrixShape.diagonal_var_spec, MatrixShape.diagonal_spec, MatrixShape.diagonal_var, MatrixShape.diagonal)] MatrixShape MShape,
            [Values(4)] int Res
            )
        {
            Utils.TestInit((int)UseXdg, DGOrder, (int)MShape);
            Console.WriteLine("SubMatrixIgnoreCoupling({0},{1},{2})", UseXdg, DGOrder, MShape);

            //Arrange --- create test matrix and MG mapping
            MultigridOperator mgo = Utils.CreateTestMGOperator(UseXdg, DGOrder, MShape, Res);
            MultigridMapping  map = mgo.Mapping;
            BlockMsrMatrix    M   = mgo.OperatorMatrix;

            //Arrange --- masking of all external cells
            var sbs = new SubBlockSelector(map);

            sbs.AllExternalCellsSelection();
            var M_ext = BlockMask.GetAllExternalRows(map, M);
            var mask  = new BlockMask(sbs, M_ext);
            //bool[] coup = Utils.SetCoupling(MShape);

            //Arrange --- get index dictonary of all external cell indices
            Dictionary <int, int[]> Didc = Utils.GetDictOfAllExtCellIdc(map);

            //Arrange --- stopwatch
            var stw = new Stopwatch();

            stw.Reset();

            //Act --- Extract subblocks
            stw.Start();
            //var eblocks = mask.GetSubBlocks(M,coup[0],coup[1],coup[2]);
            var eblocks = mask.GetDiagonalBlocks(M, false, false);

            stw.Stop();

            //Assert --- same number of blocks?
            Assert.IsTrue(eblocks.Length == M_ext._RowPartitioning.LocalNoOfBlocks);

            bool test = eblocks.Length.MPIEquals();

            Debug.Assert(test);
            for (int iBlock = 0; iBlock < eblocks.Length; iBlock++)
            {
                var infNorm     = MultidimensionalArray.Create(4, 1);
                int rank        = map.MpiRank;
                int ExtBlockIdx = iBlock + map.AggGrid.iLogicalCells.NoOfLocalUpdatedCells;
                Didc.TryGetValue(ExtBlockIdx, out int[] idc);

                using (BatchmodeConnector matlab = new BatchmodeConnector()) {
                    double[] GlobIdx = idc.Count().ForLoop(i => (double)idc[i] + 1.0);
                    Assert.IsTrue(GlobIdx.Length == eblocks[iBlock].Lengths[0]);
                    MsrMatrix M_sub = eblocks[iBlock].ConvertToMsr();

                    matlab.PutSparseMatrix(M, "M");
                    // note: M_sub lives on Comm_Self, therefore we have to distinguish between procs ...
                    matlab.PutSparseMatrixRankExclusive(M_sub, "M_sub");
                    matlab.PutVectorRankExclusive(GlobIdx, "Idx");
                    matlab.Cmd("M_0 = full(M(Idx_0, Idx_0));");
                    matlab.Cmd("M_1 = full(M(Idx_1, Idx_1));");
                    matlab.Cmd("M_2 = full(M(Idx_2, Idx_2));");
                    matlab.Cmd("M_3 = full(M(Idx_3, Idx_3));");
                    matlab.Cmd("n=[0; 0; 0; 0];");
                    matlab.Cmd("n(1,1)=norm(M_0-M_sub_0,inf);");
                    matlab.Cmd("n(2,1)=norm(M_1-M_sub_1,inf);");
                    matlab.Cmd("n(3,1)=norm(M_2-M_sub_2,inf);");
                    matlab.Cmd("n(4,1)=norm(M_3-M_sub_3,inf);");
                    matlab.GetMatrix(infNorm, "n");
                    matlab.Execute();
                }
                Assert.IsTrue(infNorm[rank, 0] == 0.0); //
            }
        }