CHOLESKY/**< preconditioner is actually a direct solver for symmetric matrices (CHOLESKY factorisation)*/
};
+//! enumeration nonLinearSolver
+/*! the nonLinearSolver can be Newton_SOLVERLAB or using PETSc, Newton_PETSC_LINESEARCH, Newton_PETSC_TRUSTREGION (see Petsc documentation) */
+enum nonLinearSolver
+{
+ Newton_SOLVERLAB,/**< nonLinearSolver is Newton_SOLVERLAB */
+ Newton_PETSC_LINESEARCH,/**< nonLinearSolver is Newton_PETSC_LINESEARCH */
+ Newton_PETSC_TRUSTREGION,/**< nonLinearSolver is Newton_PETSC_TRUSTREGION */
+ Newton_PETSC_NGMRES,/**< nonLinearSolver is Newton_PETSC_NGMRES */
+ Newton_PETSC_ASPIN/**< nonLinearSolver is Newton_PETSC_ASPIN */
+};
+
//! enumeration saveFormat
/*! the numerical results are saved using MED, VTK or CSV format */
enum saveFormat
return _ksptype;
};
+ /** \fn getNonLinearSolver
+ * \brief renvoie _nonLinearSolver (le type du solveur de Newton utilisé)
+ * \details
+ * \param [in] void
+ * \param [out] string
+ * */
+ nonLinearSolver getNonLinearSolver() {
+ return _nonLinearSolver;
+ };
+
/** \fn getNumberOfVariables
* \brief le nombre d'inconnues du problème
* \details
void setLinearSolver(linearSolver solverName, preconditioner pcType);
/** \fn setNewtonSolver
- * \brief set the Newton algorithm parameters
- * \param [in] int maximum number of newton iterations
- * \param [in] double precision required for the convergence of the newton scheme
+ * \brief sets the Newton type algorithm for solving the nonlinear algebraic system arising from the discretisation of the PDE
+ * \param [in] double : precision required for the convergence of the newton scheme
+ * \param [in] int : maximum number of newton iterations
+ * \param [in] nonLinearSolver : the algorithm to be used to solve the nonlinear system
* \param [out] void
* */
- void setNewtonSolver(double precision,int iterations=20)
- {
- _maxNewtonIts=iterations;
- _precision_Newton=precision;
- };
+ void setNewtonSolver(double precision, int iterations=20, nonLinearSolver solverName=Newton_SOLVERLAB);
/** \fn displayConditionNumber
* \brief display the condition number of the preconditioned linear systems
PC _pc;
PCType _pctype;
string _pc_hypre;
+ nonLinearSolver _nonLinearSolver;
int _maxPetscIts;//nombre maximum d'iteration gmres autorise au cours d'une resolution de systeme lineaire
int _PetscIts;//the number of iterations of the linear solver
int _maxNewtonIts;//nombre maximum d'iteration de Newton autorise au cours de la resolution d'un pas de temps
int _NEWTON_its;
- Mat _A;//Linear system matrix
+ Mat _A;//Linear system matrix
Vec _b;//Linear system right hand side
double _MaxIterLinearSolver;//nombre maximum d'iteration gmres obtenu au cours par les resolution de systemes lineaires au cours d'un pas de tmeps
bool _conditionNumber;//computes an estimate of the condition number
int _PetscIts=0;//the number of iterations of the linear solver
_ksptype = (char*)&KSPGMRES;
_pctype = (char*)&PCLU;
+ _nonLinearSolver = Newton_SOLVERLAB;
_heatPowerFieldSet=false;
_heatTransfertCoeff=0;
_rodTemperatureFieldSet=false;
void ProblemCoreFlows::setInitialFieldConstant(string fileName, const vector<double> Vconstant)
{
Mesh M(fileName);
- Field VV("Primitive", CELLS, M, Vconstant.size());
+ Field VV("SOLVERLAB results", CELLS, M, Vconstant.size());
for (int j = 0; j < M.getNumberOfCells(); j++) {
for (int i=0; i< VV.getNumberOfComponents(); i++)
}
void ProblemCoreFlows:: setInitialFieldConstant(const Mesh& M, const Vector Vconstant)
{
- Field VV("Primitive", CELLS, M, Vconstant.getNumberOfRows());
+ Field VV("SOLVERLAB results", CELLS, M, Vconstant.getNumberOfRows());
for (int j = 0; j < M.getNumberOfCells(); j++) {
for (int i=0; i< VV.getNumberOfComponents(); i++)
}
void ProblemCoreFlows:: setInitialFieldConstant(const Mesh& M, const vector<double> Vconstant)
{
- Field VV("Primitive", CELLS, M, Vconstant.size());
+ Field VV("SOLVERLAB results", CELLS, M, Vconstant.size());
for (int j = 0; j < M.getNumberOfCells(); j++) {
for (int i=0; i< VV.getNumberOfComponents(); i++)
_runLogFile->close();
throw CdmathException( "ProblemCoreFlows::setStepFunctionInitialField: Vectors VV_Left and VV_Right have different sizes");
}
- Field VV("Primitive", CELLS, M, VV_Left.getNumberOfRows());
+ Field VV("SOLVERLAB results", CELLS, M, VV_Left.getNumberOfRows());
double component_value;
}
}
+void ProblemCoreFlows::setNewtonSolver(double precision, int iterations, nonLinearSolver solverName)
+{
+ _maxNewtonIts=iterations;
+ _precision_Newton=precision;
+ _nonLinearSolver=solverName;
+}
+
+
// Description:
// Cette methode lance une execution du ProblemCoreFlows
// Elle peut etre utilisee si le probleme n'est couple a aucun autre.
void ProblemCoreFlows::setFreqSave(int freqSave){
_freqSave = freqSave;
}
+
bool ProblemCoreFlows::solveTimeStep(){
_NEWTON_its=0;
bool converged=false, ok=true;