Esempio n. 1
0
        public static void Init()
        {
            bool dummy;

            ilPSP.Environment.Bootstrap(
                new string[0],
                BoSSS.Solution.Application.GetBoSSSInstallDir(),
                out dummy);

            //GridCommons grd = Grid2D.Cartesian2DGrid(RandomSpacing(), RandomSpacing());
            //grid = new GridData(Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-7, 7, 8), GenericBlas.Linspace(-1, 1, 2)));
            //grid = new GridData(Grid2D.Cartesian2DGrid(new double[] { -6, -4, -2, 2, 4, 6 }, GenericBlas.Linspace(-1, 1, 2)));
            grid  = new GridData(Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-1.5, 1.5, 17), GenericBlas.Linspace(-1.5, 1.5, 17)));
            MgSeq = CoarseningAlgorithms.CreateSequence(grid);

            for (int p = 0; p <= 3; p++)   // loop over polynomial degrees...
            {
                var uMapping = new UnsetteledCoordinateMapping(new Basis(grid, p));

                var MgMapSeq = new MultigridMapping[MgSeq.Length];
                var BasisSeq = AggregationGridBasis.CreateSequence(MgSeq, uMapping.BasisS);
                for (int iLevel = 0; iLevel < MgSeq.Length; iLevel++)
                {
                    MgMapSeq[iLevel] = new MultigridMapping(uMapping, BasisSeq[iLevel], new int[] { p });
                }
                MultigrigMap.Add(p, MgMapSeq);
            }
        }
Esempio n. 2
0
        public static void Init()
        {
            //GridCommons grd = Grid2D.Cartesian2DGrid(RandomSpacing(), RandomSpacing());
            //grid = new GridData(Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-7, 7, 8), GenericBlas.Linspace(-1, 1, 2)));
            //grid = new GridData(Grid2D.Cartesian2DGrid(new double[] { -6, -4, -2, 2, 4, 6 }, GenericBlas.Linspace(-1, 1, 2)));
            //if (curved)
            //{
            //    grid = Grid2D.CurvedSquareGrid(GenericBlas.Linspace(1, 2, 5), GenericBlas.Linspace(0, 1, 17), CellType.Square_9, true).GridData;
            //}
            //else
            //{
            //    grid = (Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-1.5, 1.5, 17), GenericBlas.Linspace(-1.5, 1.5, 17))).GridData;
            //}
            grid  = (Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-1.5, 1.5, 17), GenericBlas.Linspace(-1.5, 1.5, 17))).GridData;
            MgSeq = CoarseningAlgorithms.CreateSequence(grid);

            for (int p = 0; p <= 3; p++)   // loop over polynomial degrees...
            {
                var uMapping = new UnsetteledCoordinateMapping(new Basis(grid, p));

                var MgMapSeq = new MultigridMapping[MgSeq.Length];
                var BasisSeq = AggregationGridBasis.CreateSequence(MgSeq, uMapping.BasisS);
                for (int iLevel = 0; iLevel < MgSeq.Length; iLevel++)
                {
                    MgMapSeq[iLevel] = new MultigridMapping(uMapping, BasisSeq[iLevel], new int[] { p });
                }
                MultigrigMap.Add(p, MgMapSeq);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// creates a simple 2d/3d Cartesian grid within the domain \f$ (-7,7)^D \f$
        /// </summary>
        protected override GridCommons CreateOrLoadGrid()
        {
            /*
             * double[] xnodes = GenericBlas.Linspace(-7, 7, 11);
             * double[] ynodes = GenericBlas.Linspace(-7, 7, 11);
             * GridCommons grd = Grid2D.Cartesian2DGrid(xnodes, ynodes, type: CellType.Square_Linear);
             * this.Control.NoOfMultigridLevels = 3;
             *
             * return grd;
             * //*/
            //double[] xnodes = GenericBlas.Linspace(-7, 7, 25);
            //double[] ynodes = GenericBlas.Linspace(-7, 7, 25);
            //double[] znodes = GenericBlas.Linspace(-7, 7, 25);
            //var grd = Grid3D.Cartesian3DGrid(xnodes, ynodes, znodes);



            double[] xNodes = GenericBlas.Linspace(-7, 7, 3);
            double[] yNodes = GenericBlas.Linspace(-7, 7, 3);

            var baseGrid = Grid2D.UnstructuredTriangleGrid(xNodes, yNodes);
            var baseGdat = new GridData(baseGrid);
            var aggGrid  = CoarseningAlgorithms.Coarsen(baseGdat, 2);

            base.AggGrid = aggGrid;


            return(null);
            //*/
        }
Esempio n. 4
0
        public static void Init()
        {
            grid  = Grid2D.CurvedSquareGrid(GenericBlas.Linspace(1, 2, 17), GenericBlas.Linspace(0, 1, 17), CellType.Square_9, true).GridData;
            MgSeq = CoarseningAlgorithms.CreateSequence(grid);

            for (int p = 0; p <= 3; p++)
            { // loop over polynomial degrees...
                var uMapping = new UnsetteledCoordinateMapping(new Basis(grid, p));

                var MgMapSeq = new MultigridMapping[MgSeq.Length];
                var BasisSeq = AggregationGridBasis.CreateSequence(MgSeq, uMapping.BasisS);
                for (int iLevel = 0; iLevel < MgSeq.Length; iLevel++)
                {
                    MgMapSeq[iLevel] = new MultigridMapping(uMapping, BasisSeq[iLevel], new int[] { p });
                }
                MultigrigMap.Add(p, MgMapSeq);
            }
        }
Esempio n. 5
0
        private void Setup()
        {
            MgSeq = CoarseningAlgorithms.CreateSequence(m_grid.iGridData);

            int p = m_DGorder;

            var uMapping = new UnsetteledCoordinateMapping(u1.Basis, u2.Basis);

            //var uMapping = new UnsetteledCoordinateMapping(u1.Basis);
            //var uMapping = new UnsetteledCoordinateMapping(new Basis(m_grid.iGridData, p));

            XAggB = AggregationGridBasis.CreateSequence(MgSeq, uMapping.BasisS);
            var bla = LsTrk.SpeciesIdS.ToArray();
            var agg = LsTrk.GetAgglomerator(bla, m_quadOrder, THRESHOLD, AgglomerateNewborn: false, AgglomerateDecased: false, ExceptionOnFailedAgglomeration: true);

            XAggB.UpdateXdgAggregationBasis(agg);
            var VarDegrees = uMapping.BasisS.Count.ForLoop(i => uMapping.BasisS[i].Degree);

            MG_Mapping = new MultigridMapping(uMapping, XAggB[0], VarDegrees);
            map        = uMapping;
        }
Esempio n. 6
0
        static void Main(string[] args)
        {
            // =======
            // startup
            // =======
            ilPSP.Connectors.Matlab.BatchmodeConnector.Flav = ilPSP.Connectors.Matlab.BatchmodeConnector.Flavor.Octave;
            ilPSP.Connectors.Matlab.BatchmodeConnector.MatlabExecuteable = @"C:\cygwin64\bin\bash.exe";
            SetUp();

            /*
             * int J = 100; // number of cells
             * int D = 2; //   spatial dimension
             *
             * var vG = new VoronoiGrid();
             * vG.DelaunayVertices = MultidimensionalArray.Create(J, D);
             *
             * // random Delaunay vertices
             * Random rnd = new Random(2345);
             * for(int j = 0; j < J; j++) {
             *  for(int d = 0; d < D; d++) {
             *      vG.DelaunayVertices[j, d] = rnd.NextDouble();
             *  }
             * }
             *
             * // run matlab
             * vG.CreateWithMatlab();
             */

            var fineGrdIO = Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-1, 1, 20), GenericBlas.Linspace(-1, 1, 20));
            var fineGrd   = new GridData(fineGrdIO);

            var coarseGrd = CoarseningAlgorithms.Coarsen(fineGrd);


            // ========
            // teardown
            // ========
            Cleanup();
        }
Esempio n. 7
0
        /// <summary>
        /// See also <see cref="GRID_CASE"/> and <see cref="GRID_FILE"/>.
        /// </summary>
        protected override GridCommons CreateOrLoadGrid()
        {
            GridCommons grd;

            switch (GRID_CASE)
            {
            case 1:
                grd = Grid1D.LineGrid(GenericBlas.Linspace(-4, 4, 5));
                break;


            case 2: {
                grd = Grid1D.LineGrid(GenericBlas.Linspace(-4, 4, 20));
                break;
            }

            case 3: {
                double[] xnodes = new double[] { -2, 0, 2 };
                double[] ynodes = new double[] { -2, 0, 2 };
                double   dx     = xnodes[1] - xnodes[0];
                double   dy     = ynodes[1] - ynodes[0];
                //this.CellVolume = dx * dy;
                //if(Math.Abs(dx - dy) <= 1.0e-12)
                //    EdgeArea = dx;
                grd = Grid2D.Cartesian2DGrid(xnodes, ynodes, periodicX: false, periodicY: false, type: CellType.Square_4);
                break;
            }

            case 4: {
                double[] xnodes = GenericBlas.Linspace(-1, 5, 9);
                double[] ynodes = GenericBlas.Linspace(-1, 5, 13);
                double   dx     = xnodes[1] - xnodes[0];
                double   dy     = ynodes[1] - ynodes[0];
                this.CellVolume = dx * dy;
                if (Math.Abs(dx - dy) <= 1.0e-12)
                {
                    EdgeArea = dx;
                }
                grd = Grid2D.Cartesian2DGrid(xnodes, ynodes, periodicX: false, periodicY: false, type: CellType.Square_4);
                break;
            }

            case 5: {
                double[] xnodes = GenericBlas.Linspace(-1, 1, 8);
                double[] ynodes = GenericBlas.Linspace(-1, 1, 13);
                grd = Grid2D.UnstructuredTriangleGrid(xnodes, ynodes, JitterScale: 0.5);
                break;
            }

            case 6: {
                grd = Circle();
                break;
            }

            case 7: {
                // test periodicity

                grd       = Grid2D.CurvedSquareGrid(GenericBlas.Linspace(1, 2, 4), GenericBlas.Linspace(0, 0.25, 10), CellType.Square_9, PeriodicS: true);
                AltRefSol = true;
                break;
            }

            case 8: {
                double[] rNodes = GenericBlas.Linspace(1, 4, 8);
                double[] sNodes = GenericBlas.Linspace(0, 0.5, 15);
                grd = Grid2D.CurvedSquareGrid(rNodes, sNodes, CellType.Square_4, PeriodicS: false);
                break;
            }

            case 9: {
                double[] xNodes1 = GenericBlas.Linspace(-1, 0.3, 7);
                double[] yNodes1 = GenericBlas.Linspace(-1, 1, 13);
                double[] xNodes2 = GenericBlas.Linspace(0.3, 1, 5);
                double[] yNodes2 = GenericBlas.Linspace(-1, 1, 25);
                double[] xNodes3 = GenericBlas.Linspace(-1, 1, 8);
                double[] yNodes3 = GenericBlas.Linspace(-2, -1, 5);

                var grd1 = Grid2D.Cartesian2DGrid(xNodes1, yNodes1, type: CellType.Square_Linear);
                var grd2 = Grid2D.Cartesian2DGrid(xNodes2, yNodes2, type: CellType.Square_Linear);
                var grd3 = Grid2D.Cartesian2DGrid(xNodes3, yNodes3, type: CellType.Square_Linear);
                var grdJ = GridCommons.MergeLogically(grd1, GridCommons.MergeLogically(grd2, grd3));
                grd = GridCommons.Seal(grdJ, 4);

                break;
            }

            case 10: {
                double[] xNodes1 = GenericBlas.Linspace(-1, 0.3, 4);
                double[] xNodes2 = GenericBlas.Linspace(0.3, 1, 5);

                double[] yNodes1 = GenericBlas.Linspace(-1, 1, 9);
                double[] yNodes2 = GenericBlas.Linspace(-1, 1, 5);

                double[] zNodes1 = GenericBlas.Linspace(-1, 1, 5);
                double[] zNodes2 = GenericBlas.Linspace(-1, 1, 3);

                var grd1 = Grid3D.Cartesian3DGrid(xNodes1, yNodes1, zNodes1);
                var grd2 = Grid3D.Cartesian3DGrid(xNodes2, yNodes2, zNodes2);
                var grdJ = GridCommons.MergeLogically(grd1, grd2);
                grd = GridCommons.Seal(grdJ, 4);


                break;
            }

            case 11: {
                grd = Grid2D.Trapezoidal2dGrid(4, 2, 2, GenericBlas.Linspace(0, 1, 2));
                break;
            }

            case 12: {
                var grid1 = Grid2D.Cartesian2DGrid(GenericBlas.Linspace(-3, 5, 5), GenericBlas.Linspace(-1, 1, 2));
                //grd = base_grid;
                //grid1.Plot2DGrid();


                var gdat1 = new GridData(grid1);
                var grid2 = gdat1.Adapt(new int[] { 1, 2 }, null, out GridCorrelation o2c_1);
                //grid2.Plot2DGrid();

                var gdat2 = new GridData(grid2);
                var grid3 = gdat2.Adapt(new int[] { 2, 4 }, null, out GridCorrelation o2c_2);
                //grid3.Plot2DGrid();

                var gdat3 = new GridData(grid3);
                var grid4 = gdat3.Adapt(new int[] { 11, 14, 15 }, null, out GridCorrelation o2c_3);
                //grid4.Plot2DGrid();

                var gdat4 = new GridData(grid4);
                var grid5 = gdat4.Adapt(new[] { 4, 21, 22, 10 }, new[] { new[] { 13, 14, 15, 16 } }, out GridCorrelation o2c_4);

                //grid5.Plot2DGrid();

                grd = grid5;

                break;
            }

            case 13: {
                double[] rNodes = GenericBlas.Linspace(1, 4, 8);
                double[] sNodes = GenericBlas.Linspace(0, 0.5, 15);
                grd = Grid2D.CurvedSquareGrid(rNodes, sNodes, CellType.Square_9, PeriodicS: false);
                break;
            }

            case 14: {
                double[] rNodes = GenericBlas.Linspace(1, 4, 13);
                double[] sNodes = GenericBlas.Linspace(0, 0.5, 25);
                grd = Grid2D.CurvedSquareGrid(rNodes, sNodes, CellType.Square_16, PeriodicS: false);
                break;
            }

            case 15: {
                double[] rNodes = GenericBlas.Linspace(1, 2, 4);
                double[] sNodes = GenericBlas.Linspace(0, 0.5, 4);
                double[] zNodes = GenericBlas.Linspace(-1, 1, 5);
                grd = Grid3D.CylinderGrid(rNodes, sNodes, zNodes, CellType.Cube_27, PeriodicS: false, PeriodicZ: false);
                break;
            }

            case 16: {
                grd = Grid2D.Ogrid(0.5, 1, 5, 3, CellType.Square_4);
                break;
            }

            case 17: {
                grd = Grid3D.Ogrid(0.5, 1, 3, 3, GenericBlas.Linspace(0, 4, 3));
                break;
            }

            case 18: {
                // aggregation grid
                double[] xNodes = GenericBlas.Linspace(-1, 1, 5);
                double[] yNodes = GenericBlas.Linspace(-1, 1, 5);

                var baseGrid = Grid2D.UnstructuredTriangleGrid(xNodes, yNodes);
                var baseGdat = new GridData(baseGrid);
                var aggGrid  = CoarseningAlgorithms.Coarsen(baseGdat, 2);
                base.AggGrid = aggGrid;
                grd          = null;

                double dx = xNodes[1] - xNodes[0];
                double dy = yNodes[1] - yNodes[0];
                this.CellVolume = dx * dy;
                if (Math.Abs(dx - dy) <= 1.0e-12)
                {
                    EdgeArea = dx;
                }


                break;
            }

            // ++++++++++++++++++++++++++++++++++++++++++++++++++++
            // more expensive grids (not tested in DEBUG MODE)
            // ++++++++++++++++++++++++++++++++++++++++++++++++++++

            case 30: {
                double[] xnodes = GenericBlas.Linspace(-1, 1, 7);
                double[] ynodes = GenericBlas.Linspace(-1, 1, 9);
                double[] znodes = GenericBlas.Linspace(-1, 1, 8);
                grd = Grid3D.Cartesian3DGrid(xnodes, ynodes, znodes, periodicX: false, periodicY: false, periodicZ: false);
                break;
            }



            // +++++++++++++++++++++++++++++++++
            // grids imported from GMSH/CGNS
            // +++++++++++++++++++++++++++++++++

            case 50: {
                // gmsh grid import test

                Console.WriteLine("Loading file: '" + GRID_FILE + "'...");
                grd = GridImporter.Import(GRID_FILE);
                //Console.WriteLine("done. " + grd.NoOfUpdateCells.MPISum() + " cells loaded.");

                //Plot2dGridGnuplot(grd);

                HashSet <CellType> cellTypes = new HashSet <CellType>();
                foreach (var cell in grd.Cells)
                {
                    if (!cellTypes.Contains(cell.Type))
                    {
                        cellTypes.Add(cell.Type);
                    }
                }
                Console.Write("Cell types: ");
                foreach (var ct in cellTypes)
                {
                    Console.Write(ct);
                    Console.Write(" ");
                }
                Console.WriteLine();


                break;
            }

            default:
                throw new NotSupportedException();
            }
            return(grd);
        }
Esempio n. 8
0
        /*
         * /// <summary>
         * /// Legacy-Constructor for user-specified <see cref="DelComputeOperatorMatrix"/>
         * /// </summary>
         * public XdgTimestepping(
         *  DelComputeOperatorMatrix userComputeOperatorMatrix,
         *  IEnumerable<DGField> Fields,
         *  IEnumerable<DGField> IterationResiduals,
         *  TimeSteppingScheme __Scheme,
         *  DelUpdateLevelset _UpdateLevelset,
         *  LevelSetHandling _LevelSetHandling,
         *  MultigridOperator.ChangeOfBasisConfig[][] _MultigridOperatorConfig,
         *  AggregationGridData[] _MultigridSequence,
         *  double _AgglomerationThreshold,
         *  LinearSolverConfig LinearSolver, NonLinearSolverConfig NonLinearSolver) //
         * {
         *  this.Scheme = __Scheme;
         *  this.XdgOperator = op;
         *
         *  this.Parameters = op.InvokeParameterFactory(Fields);
         *
         *
         *  foreach (var f in Fields.Cat(IterationResiduals).Cat(Parameters)) {
         *      if (f != null && f is XDGField xf) {
         *          if (LsTrk == null) {
         *              LsTrk = xf.Basis.Tracker;
         *          } else {
         *              if (!object.ReferenceEquals(LsTrk, xf.Basis.Tracker))
         *                  throw new ArgumentException();
         *          }
         *      }
         *  }
         *  if (LsTrk == null)
         *      throw new ArgumentException("unable to get Level Set Tracker reference");
         *
         *  bool UseX = Fields.Any(f => f is XDGField) || IterationResiduals.Any(f => f is XDGField);
         *
         *  ConstructorCommon(op, UseX,
         *      Fields, this.Parameters, IterationResiduals,
         *      myDelComputeXOperatorMatrix,
         *      _UpdateLevelset,
         *      _LevelSetHandling,
         *      _MultigridOperatorConfig,
         *      _MultigridSequence,
         *      _AgglomerationThreshold,
         *      LinearSolver, NonLinearSolver);
         *
         * }
         */


        private void ConstructorCommon(
            ISpatialOperator op, bool UseX,
            IEnumerable <DGField> Fields, IEnumerable <DGField> __Parameters, IEnumerable <DGField> IterationResiduals,
            SpeciesId[] spcToCompute,
            DelUpdateLevelset _UpdateLevelset, LevelSetHandling _LevelSetHandling,
            MultigridOperator.ChangeOfBasisConfig[][] _MultigridOperatorConfig, AggregationGridData[] _MultigridSequence,
            double _AgglomerationThreshold,
            LinearSolverConfig LinearSolver, NonLinearSolverConfig NonLinearSolver) //
        {
            RungeKuttaScheme rksch;
            int bdfOrder;

            DecodeScheme(this.Scheme, out rksch, out bdfOrder);

            SpatialOperatorType _SpatialOperatorType = SpatialOperatorType.Nonlinear;


            int quadOrder = op.QuadOrderFunction(
                Fields.Select(f => f.Basis.Degree).ToArray(),
                Parameters.Select(f => f != null ? f.Basis.Degree : 0).ToArray(),
                IterationResiduals.Select(f => f.Basis.Degree).ToArray());

            // default solvers
            // ===============
            if (LinearSolver == null)
            {
                LinearSolver = new LinearSolverConfig()
                {
                    SolverCode = LinearSolverCode.automatic
                };
            }
            if (NonLinearSolver == null)
            {
                NonLinearSolver = new NonLinearSolverConfig()
                {
                    SolverCode = NonLinearSolverCode.Newton
                };
            }

            // default Multi-Grid
            // ==================

            if (_MultigridSequence == null)
            {
                _MultigridSequence = new[] { CoarseningAlgorithms.ZeroAggregation(this.GridDat) };
            }

            // default level-set treatment
            // ===========================

            if (_UpdateLevelset == null)
            {
                _UpdateLevelset = this.UpdateLevelsetWithNothing;
                if (_LevelSetHandling != LevelSetHandling.None)
                {
                    throw new ArgumentException($"If level-set handling is set to {_LevelSetHandling} (anything but {LevelSetHandling.None}) an updating routine must be specified.");
                }
            }

            // default multigrid operator config
            // =================================
            if (_MultigridOperatorConfig == null)
            {
                int NoOfVar = Fields.Count();
                _MultigridOperatorConfig    = new MultigridOperator.ChangeOfBasisConfig[0][];
                _MultigridOperatorConfig[0] = new MultigridOperator.ChangeOfBasisConfig[NoOfVar];
                for (int iVar = 0; iVar < NoOfVar; iVar++)
                {
                    _MultigridOperatorConfig[0][iVar] = new MultigridOperator.ChangeOfBasisConfig()
                    {
                        DegreeS  = new int[] { Fields.ElementAt(iVar).Basis.Degree },
                        mode     = MultigridOperator.Mode.Eye,
                        VarIndex = new int[] { iVar }
                    };
                }
            }

            // finally, create timestepper
            // ===========================

            if (bdfOrder > -1000)
            {
                m_BDF_Timestepper = new XdgBDFTimestepping(Fields, __Parameters, IterationResiduals,
                                                           LsTrk, true,
                                                           this.ComputeOperatorMatrix, op, _UpdateLevelset,
                                                           bdfOrder,
                                                           _LevelSetHandling,
                                                           MassMatrixShapeandDependence.IsTimeDependent,
                                                           _SpatialOperatorType,
                                                           _MultigridOperatorConfig, _MultigridSequence,
                                                           spcToCompute, quadOrder,
                                                           _AgglomerationThreshold, UseX,
                                                           NonLinearSolver,
                                                           LinearSolver);

                m_BDF_Timestepper.Config_AgglomerationThreshold = _AgglomerationThreshold;
            }
            else
            {
                m_RK_Timestepper = new XdgRKTimestepping(Fields.ToArray(), __Parameters, IterationResiduals.ToArray(),
                                                         LsTrk,
                                                         this.ComputeOperatorMatrix, op, _UpdateLevelset,
                                                         rksch,
                                                         _LevelSetHandling,
                                                         MassMatrixShapeandDependence.IsTimeDependent,
                                                         _SpatialOperatorType,
                                                         _MultigridOperatorConfig, _MultigridSequence,
                                                         spcToCompute, quadOrder,
                                                         _AgglomerationThreshold, UseX,
                                                         NonLinearSolver,
                                                         LinearSolver);

                m_RK_Timestepper.Config_AgglomerationThreshold = _AgglomerationThreshold;
            }
        }