Example #1
0
            public XDGTestSetup(
                int p,
                double AggregationThreshold,
                int TrackerWidth,
                MultigridOperator.Mode mumo,
                XQuadFactoryHelper.MomentFittingVariants momentFittingVariant,
                ScalarFunction LevSetFunc = null)
            {
                // Level set, tracker and XDG basis
                // ================================

                if (LevSetFunc == null)
                {
                    LevSetFunc = ((_2D)((x, y) => 0.8 * 0.8 - x * x - y * y)).Vectorize();
                }
                LevSet = new LevelSet(new Basis(grid, 2), "LevelSet");
                LevSet.Clear();
                LevSet.ProjectField(LevSetFunc);
                LsTrk = new LevelSetTracker(grid, XQuadFactoryHelper.MomentFittingVariants.Classic, TrackerWidth, new string[] { "A", "B" }, LevSet);
                LsTrk.UpdateTracker();

                XB = new XDGBasis(LsTrk, p);

                XSpatialOperator Dummy = new XSpatialOperator(1, 0, 1, QuadOrderFunc.SumOfMaxDegrees(RoundUp: true), "C1", "u");

                //Dummy.EquationComponents["c1"].Add(new
                Dummy.Commit();

                //Tecplot.PlotFields(new DGField[] { LevSet }, "agglo", 0.0, 3);


                // operator
                // ========

                Debug.Assert(p <= 4);
                XDGBasis opXB = new XDGBasis(LsTrk, 4); // we want to have a very precise quad rule
                var      map  = new UnsetteledCoordinateMapping(opXB);

                int quadOrder = Dummy.QuadOrderFunction(map.BasisS.Select(bs => bs.Degree).ToArray(), new int[0], map.BasisS.Select(bs => bs.Degree).ToArray());

                //agg = new MultiphaseCellAgglomerator(new CutCellMetrics(momentFittingVariant, quadOrder, LsTrk, LsTrk.SpeciesIdS.ToArray()), AggregationThreshold, false);
                agg = LsTrk.GetAgglomerator(LsTrk.SpeciesIdS.ToArray(), quadOrder, __AgglomerationTreshold: AggregationThreshold);


                foreach (var S in LsTrk.SpeciesIdS)
                {
                    Console.WriteLine("Species {0}, no. of agglomerated cells {1} ",
                                      LsTrk.GetSpeciesName(S),
                                      agg.GetAgglomerator(S).AggInfo.SourceCells.Count());
                }

                // mass matrix factory
                // ===================

                // Basis maxB = map.BasisS.ElementAtMax(b => b.Degree);
                //MassFact = new MassMatrixFactory(maxB, agg);
                MassFact = LsTrk.GetXDGSpaceMetrics(LsTrk.SpeciesIdS.ToArray(), quadOrder, 1).MassMatrixFactory;


                // Test field
                // ==========

                // set the test field: this is a polynomial function,
                // but different for each species; On this field, restriction followed by prolongation should be the identity
                this.Xdg_uTest = new XDGField(this.XB, "uTest");
                Dictionary <SpeciesId, double> dumia = new Dictionary <SpeciesId, double>();
                int i = 2;

                foreach (var Spc in LsTrk.SpeciesIdS)
                {
                    dumia.Add(Spc, i);
                    i -= 1;
                }
                SetTestValue(Xdg_uTest, dumia);


                // dummy operator matrix which fits polynomial degree p
                // ====================================================

                Xdg_opMtx = new BlockMsrMatrix(Xdg_uTest.Mapping, Xdg_uTest.Mapping);
                Xdg_opMtx.AccEyeSp(120.0);

                // XDG Aggregation BasiseS
                // =======================

                //XAggB = MgSeq.Select(agGrd => new XdgAggregationBasis[] { new XdgAggregationBasis(uTest.Basis, agGrd) }).ToArray();
                XAggB = new XdgAggregationBasis[MgSeq.Length][];
                var _XAggB = AggregationGridBasis.CreateSequence(MgSeq, Xdg_uTest.Mapping.BasisS);

                for (int iLevel = 0; iLevel < XAggB.Length; iLevel++)
                {
                    XAggB[iLevel] = new[] { (XdgAggregationBasis)(_XAggB[iLevel][0]) };
                    XAggB[iLevel][0].Update(agg);
                }

                // Multigrid Operator
                // ==================



                Xdg_opMtx = new BlockMsrMatrix(Xdg_uTest.Mapping, Xdg_uTest.Mapping);
                Xdg_opMtx.AccEyeSp(120.0);

                XdgMultigridOp = new MultigridOperator(XAggB, Xdg_uTest.Mapping,
                                                       Xdg_opMtx,
                                                       MassFact.GetMassMatrix(Xdg_uTest.Mapping, false),
                                                       new MultigridOperator.ChangeOfBasisConfig[][] {
                    new MultigridOperator.ChangeOfBasisConfig[] {
                        new MultigridOperator.ChangeOfBasisConfig()
                        {
                            VarIndex = new int[] { 0 }, mode = mumo, Degree = p
                        }
                    }
                });
            }
Example #2
0
        /// <summary>
        /// Diagnostic output.
        /// </summary>
        /// <param name="cout"></param>
        /// <param name="time"></param>
        public static void PrintCellSpecisTable(LevelSetTracker LsTrk, TextWriter cout, double time)
        {
            int J = LsTrk.GridDat.Cells.NoOfLocalUpdatedCells;

            cout.WriteLine("Species at time {0}: ==============", time);
            Console.WriteLine("j\tDist\t#Spc\t");

            for (int j = 0; j < J; j++)
            {
                // cell index
                cout.Write(j);
                cout.Write("\t");

                // level-set distance
                int dist = LevelSetTracker.DecodeLevelSetDist(LsTrk.Regions.RegionsCode[j], 0);
                cout.Write(dist);
                cout.Write("\t");

                // number of species in cell
                ReducedRegionCode rrc;
                int NoOfSpc = LsTrk.Regions.GetNoOfSpecies(j, out rrc);
                cout.Write(NoOfSpc);
                cout.Write("\t");

                // species sequence
                for (int iSpc = 0; iSpc < NoOfSpc; iSpc++)
                {
                    var SpId = LsTrk.GetSpeciesIdFromIndex(rrc, iSpc);
                    var SpNm = LsTrk.GetSpeciesName(SpId);

                    cout.Write(SpNm);
                    if (iSpc < (NoOfSpc - 1))
                    {
                        cout.Write(",");
                    }
                }
                cout.Write("\t");

                // new 2 old
                int[] N2O = TimeSteppingUtils.SpeciesUpdate(LsTrk, j, true);
                cout.Write("new2old: ");
                if (N2O != null)
                {
                    for (int i = 0; i < N2O.Length; i++)
                    {
                        cout.Write(N2O[i]);
                        if (i < (N2O.Length - 1))
                        {
                            cout.Write(",");
                        }
                    }
                }
                else
                {
                    cout.Write("-");
                }
                cout.Write("\t");

                // old 2 new
                int[] O2N = TimeSteppingUtils.SpeciesUpdate(LsTrk, j, false);
                cout.Write("old2new: ");
                if (O2N != null)
                {
                    for (int i = 0; i < O2N.Length; i++)
                    {
                        cout.Write(O2N[i]);
                        if (i < (O2N.Length - 1))
                        {
                            cout.Write(",");
                        }
                    }
                }
                else
                {
                    cout.Write("-");
                }
                cout.Write("\t");

                // end-of-line
                cout.WriteLine();
            }

            cout.WriteLine("---------------------");
        }