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("===="); } }
/// <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)); }
/// <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); }