コード例 #1
0
        public static void TestNonLinearSolverConfigurations()
        {
            //Arrange --- set configs
            var ACS = new AppControlSolver();
            NonLinearSolverConfig nlconfig = ACS.NonLinearSolver;
            LinearSolverConfig    lconfig  = ACS.LinearSolver;

            lconfig.verbose             = true;
            lconfig.NoOfMultigridLevels = 3;
            lconfig.TargetBlockSize     = 10;
            nlconfig.verbose            = true;
            var SF = new SolverFactory(nlconfig, lconfig);

            //Arrange --- get test multigrid operator stuff
            AggregationGridData[] seq;
            var MGO             = Utils.CreateTestMGOperator(out seq, Resolution: 10);
            var map             = MGO.Mapping;
            var changeofbasisis = Utils.GetAllMGConfig(MGO);
            var agggridbasisis  = Utils.GetAllAggGridBasis(MGO);

            //Arrange --- get nonlinear codes available
            var             nonlincodes = (NonLinearSolverCode[])Enum.GetValues(typeof(NonLinearSolverCode));
            NonlinearSolver NLsolver    = null;

            //Arrange --- get test linear Solver to set in NLsolver
            ISolverSmootherTemplate LinSolver = null;

            LinearSolverCode[] LinTestcandidates = { LinearSolverCode.classic_pardiso, LinearSolverCode.exp_gmres_levelpmg }; // in order to test the GMRES variants of the NL solver

            //Act and Assert
            foreach (var lincode in LinTestcandidates)
            {
                lconfig.SolverCode = lincode;
                TestDelegate nldlg = () => SF.GenerateNonLin(out NLsolver, out LinSolver, null, agggridbasisis, changeofbasisis, seq);
                SF.Clear();
                foreach (NonLinearSolverCode nlcode in nonlincodes)
                {
                    nlconfig.SolverCode = nlcode;
                    if (nlconfig.SolverCode == NonLinearSolverCode.selfmade)
                    {
                        SF.Selfmade_nonlinsolver = new Newton(null, agggridbasisis, changeofbasisis);
                    }
                    Assert.DoesNotThrow(nldlg, "", null);
                    Assert.IsNotNull(NLsolver);
                }
                Console.WriteLine("====");
            }
        }
コード例 #2
0
        /// <summary>
        /// Returns either a solver for the Navier-Stokes or the Stokes system.
        /// E.g. for testing purposes, one might also use a nonlinear solver on a Stokes system.
        /// </summary>
        protected virtual string GetSolver(out NonlinearSolver nonlinSolver, out ISolverSmootherTemplate linearSolver)
        {
            nonlinSolver = null;
            linearSolver = null;

            if (Config_SpatialOperatorType != SpatialOperatorType.Nonlinear)
            {
                m_nonlinconfig.SolverCode = BoSSS.Solution.Control.NonLinearSolverCode.Picard;
            }

            XdgSolverFactory.GenerateNonLin(out nonlinSolver, out linearSolver, this.AssembleMatrixCallback, this.MultigridBasis, Config_MultigridOperator, MultigridSequence);

            string ls_strg  = String.Format("{0}", m_linearconfig.SolverCode);
            string nls_strg = String.Format("{0}", m_nonlinconfig.SolverCode);

            if ((this.Config_LevelSetHandling == LevelSetHandling.Coupled_Iterative) && (nonlinSolver.Equals(typeof(FixpointIterator))))
            {
                ((FixpointIterator)nonlinSolver).CoupledIteration_Converged = LevelSetConvergenceReached;
            }

            // set callback for diagnostic output
            // ----------------------------------
            if (nonlinSolver != null)
            {
                nonlinSolver.IterationCallback += this.LogResis;
                if (linearSolver != null && linearSolver is ISolverWithCallback)
                {
                    //((ISolverWithCallback)linearSolver).IterationCallback = this.MiniLogResi;
                }
            }
            else
            {
                if (linearSolver != null && linearSolver is ISolverWithCallback)
                {
                    ((ISolverWithCallback)linearSolver).IterationCallback = this.LogResis;
                }
            }

            return(String.Format("nonlinear Solver: {0}, linear Solver: {1}", nls_strg, ls_strg));
        }
コード例 #3
0
        /// <summary>
        /// Returns either a solver for the Navier-Stokes or the Stokes system.
        /// E.g. for testing purposes, one might also use a nonlinear solver on a Stokes system.
        /// </summary>
        /// <param name="nonlinSolver"></param>
        /// <param name="linearSolver"></param>
        protected virtual string GetSolver(out NonlinearSolver nonlinSolver, out ISolverSmootherTemplate linearSolver)
        {
            nonlinSolver = null;
            linearSolver = null;

            string solverDescription = ""; // this.Control.option_solver;

            //solverDescription = string.Format("; No. of cells: {0}, p = {1}/{2}; MaxKrylovDim {3}, MaxIter {4};",
            //    this.GridData.Partitioning.TotalLength,
            //    this.CurrentVel[0].Basis.Degree,
            //    this.Pressure.Basis.Degree,
            //    MaxKrylovDim,
            //    MaxIterations);


            // define solver
            // -------------


            if (this.RequiresNonlinearSolver)
            {
                // +++++++++++++++++++++++++++++++++++++++++++++
                // the nonlinear solvers:
                // +++++++++++++++++++++++++++++++++++++++++++++

                switch (Config_NonlinearSolver)
                {
                case NonlinearSolverMethod.Picard:

                    nonlinSolver = new FixpointIterator(
                        this.AssembleMatrixCallback,
                        this.MultigridBasis,
                        this.Config_MultigridOperator)
                    {
                        MaxIter        = Config_MaxIterations,
                        MinIter        = Config_MinIterations,
                        m_LinearSolver = Config_linearSolver,
                        m_SessionPath  = SessionPath,
                        ConvCrit       = Config_SolverConvergenceCriterion,
                        UnderRelax     = Config_UnderRelax,
                    };

                    if (this.Config_LevelSetHandling == LevelSetHandling.Coupled_Iterative)
                    {
                        ((FixpointIterator)nonlinSolver).CoupledIteration_Converged = LevelSetConvergenceReached;
                    }

                    break;

                case NonlinearSolverMethod.Newton:

                    nonlinSolver = new Newton(
                        this.AssembleMatrixCallback,
                        this.MultigridBasis,
                        this.Config_MultigridOperator)
                    {
                        maxKrylovDim  = Config_MaxKrylovDim,
                        MaxIter       = Config_MaxIterations,
                        MinIter       = Config_MinIterations,
                        ApproxJac     = Newton.ApproxInvJacobianOptions.DirectSolver,
                        Precond       = Config_linearSolver,
                        GMRESConvCrit = Config_SolverConvergenceCriterion,
                        ConvCrit      = Config_SolverConvergenceCriterion,
                        m_SessionPath = SessionPath,
                    };
                    break;

                case NonlinearSolverMethod.NewtonGMRES:

                    nonlinSolver = new Newton(
                        this.AssembleMatrixCallback,
                        this.MultigridBasis,
                        this.Config_MultigridOperator)
                    {
                        maxKrylovDim = Config_MaxKrylovDim,
                        MaxIter      = Config_MaxIterations,
                        MinIter      = Config_MinIterations,
                        ApproxJac    = Newton.ApproxInvJacobianOptions.GMRES,
                        Precond      = Config_linearSolver,
                        //Precond = new RheologyJacobiPrecond() { m_We = 0.1},
                        GMRESConvCrit = Config_SolverConvergenceCriterion,
                        ConvCrit      = Config_SolverConvergenceCriterion,
                        m_SessionPath = SessionPath,
                    };
                    break;

                default:
                    throw new NotImplementedException();
                }
            }
            else
            {
                // +++++++++++++++++++++++++++++++++++++++++++++
                // the linear solvers:
                // +++++++++++++++++++++++++++++++++++++++++++++


                linearSolver = Config_linearSolver;
            }



            // set callback for diagnostic output
            // ----------------------------------

            if (nonlinSolver != null)
            {
                nonlinSolver.IterationCallback += this.LogResis;
            }

            if (linearSolver != null && linearSolver is ISolverWithCallback)
            {
                ((ISolverWithCallback)linearSolver).IterationCallback = this.LogResis;
            }

            // return
            // ------


            return(solverDescription);
        }