/**\fn
* \brief constructeur de la classe ProblemFluid
*/
- ProblemFluid(void);
+ ProblemFluid(MPI_Comm comm = MPI_COMM_WORLD);
//Gestion du calcul (interface ICoCo)
* */
virtual void validateTimeStep();
+ /** \fn solveTimeStep
+ * \brief calcule les valeurs inconnues au pas de temps +1 .
+ * \details c'est une fonction virtuelle, qui surcharge celle de la classe ProblemCoreFlows
+ * @param void
+ * \return Renvoie false en cas de problème durant le calcul (valeurs non physiques..)
+ * */
+ virtual bool solveTimeStep();//
+
/* Boundary conditions */
/** \fn setNeumannBoundaryCondition
* \brief adds a new boundary condition of type Neumann
* @param void
* @return the number of phases considered in the model
* */
- int getNumberOfPhases(){
+ int getNumberOfPhases() const {
return _nbPhases;
};
- /** \fn computeNewtonVariation
- * \brief Builds and solves the linear system to obtain the variation Ukp1-Uk in a Newton scheme
- * @param void
- * */
- virtual void computeNewtonVariation();
-
/** \fn testConservation
* \brief Teste et affiche la conservation de masse et de la quantité de mouvement
* \Details la fonction est virtuelle pure, on la surcharge dans chacun des modèles
* @param pcType preconditioner (ILU,LU or NONE)
* @param scaling performs a bancing of the system matrix before calling th preconditioner
*/
- void setLinearSolver(linearSolver kspType, preconditioner pcType, bool scaling=false)
+ void setLinearSolver(linearSolver kspType, preconditioner pcType, double maxIts=50, bool scaling=false)
{
- ProblemCoreFlows::setLinearSolver(kspType, pcType);
+ ProblemCoreFlows::setLinearSolver(kspType, pcType, maxIts);
_isScaling= scaling;
};
* \brief returns the value of the latent heat
* @param double L, the value of the latent heat
* */
- double getLatentHeat(){
+ double getLatentHeat() const{
return _latentHeat;
}
* \brief sets the saturation temperature
* @param Tsat double corresponds to saturation temperature
* */
- double getSatTemp(){
+ double getSatTemp() const {
return _Tsat;
}
* \brief set the porosity field;
* @param [in] Field porosity field (field on CELLS)
* */
- void setPorosityField(Field Porosity){
- _porosityField=Porosity;
- _porosityFieldSet=true;
- }
+ void setPorosityField(Field Porosity);
/** \fn getPorosityField
* \brief returns the porosity field;
* @param
* */
- Field getPorosityField(){
+ Field getPorosityField() const {
return _porosityField;
}
* \param [in] string fieldName
* \param [out] void
* */
- void setPorosityField(string fileName, string fieldName){
- _porosityField=Field(fileName, CELLS,fieldName);
- _porosityFieldSet=true;
- }
+ void setPorosityField(string fileName, string fieldName);
/** \fn setPressureLossField
* \brief set the pressure loss coefficients field;
* @param [in] Field pressure loss field (field on FACES)
* */
- void setPressureLossField(Field PressureLoss){
- _pressureLossField=PressureLoss;
- _pressureLossFieldSet=true;
- }
+ void setPressureLossField(Field PressureLoss);
+
/** \fn setPressureLossField
* \brief set the pressure loss coefficient field
* \details localised friction force
* \param [in] string fieldName
* \param [out] void
* */
- void setPressureLossField(string fileName, string fieldName){
- _pressureLossField=Field(fileName, FACES,fieldName);
- _pressureLossFieldSet=true;
- }
+ void setPressureLossField(string fileName, string fieldName);
/** \fn setSectionField
* \brief set the cross section field;
* @param [in] Field cross section field (field on CELLS)
* */
- void setSectionField(Field sectionField){
- _sectionField=sectionField;
- _sectionFieldSet=true;
- }
+ void setSectionField(Field sectionField);
+
/** \fn setSectionField
* \brief set the cross section field
* \details for variable cross section pipe network
* \param [in] string fieldName
* \param [out] void
* */
- void setSectionField(string fileName, string fieldName){
- _sectionField=Field(fileName, CELLS,fieldName);
- _sectionFieldSet=true;
- }
+ void setSectionField(string fileName, string fieldName);
/** \fn setNonLinearFormulation
* \brief sets the formulation used for the computation of non viscous fluxes
* \param [in] void
* \param [out] enum NonLinearFormulation
* */
- NonLinearFormulation getNonLinearFormulation(){
+ NonLinearFormulation getNonLinearFormulation() const{
return _nonLinearFormulation;
}
* \param [in] void
* \param [out] enum SpaceScheme(upwind, centred, pressureCorrection, pressureCorrection, staggered)
* */
- SpaceScheme getSpaceScheme();
+ SpaceScheme getSpaceScheme() const;
/** \fn setNumericalScheme
* \brief sets the numerical method (upwind vs centered and explicit vs implicit)
* */
void setNumericalScheme(SpaceScheme scheme, TimeScheme method=Explicit);
- //données initiales
+ /* ICoCo code coupling interface */
/*
- virtual vector<string> getInputFieldsNames()=0 ;//Renvoie les noms des champs dont le problème a besoin (données initiales)
virtual Field& getInputFieldTemplate(const string& name)=0;//Renvoie le format de champs attendu (maillage, composantes etc)
- virtual void setInputField(const string& name, const Field& afield)=0;//enregistre les valeurs d'une donnée initiale
virtual vector<string> getOutputFieldsNames()=0 ;//liste tous les champs que peut fournir le code pour le postraitement
virtual Field& getOutputField(const string& nameField )=0;//Renvoie un champs pour le postraitement
*/
+ /** Set input fields to prepare the simulation or coupling **/
+ vector<string> getInputFieldsNames();
+ void setInputField(const string& nameField, Field& inputField );//supply of a required input field
+
+ Field getConservativeField() const ;
+ Field getPrimitiveField() const;
protected :
/** Number of phases in the fluid **/
/** the formulation used to compute the non viscous fluxes **/
NonLinearFormulation _nonLinearFormulation;
+ /** PETSc nonlinear solver and line search **/
+ SNES _snes;
+ SNESLineSearch _linesearch;
+ PetscViewer _monitorLineSearch;
+
map<string, LimitField> _limitField;
/** boolean used to specify that an entropic correction should be used **/
bool _isBoundary;// la face courante est elle une face de bord ?
double _maxvploc;
+ bool solveNewtonPETSc();//Use PETSc Newton methods to solve time step
+
+ /** \fn computeNewtonVariation
+ * \brief Builds and solves the linear system to obtain the variation Ukp1-Uk in a Newton scheme
+ * @param void
+ * */
+ virtual void computeNewtonVariation();
+
+ /** \fn computeNewtonRHS
+ * \brief Builds the right hand side F_X(X) of the linear system in the Newton method to obtain the variation Ukp1-Uk
+ * @param void
+ * */
+ void computeNewtonRHS( Vec X, Vec F_X);
+
+ /** \fn computeSnesRHS
+ * \brief Static function calling computeNewtonRHS to match PETSc nonlinear solver (SNES) structure
+ * @param void
+ * */
+ static int computeSnesRHS(SNES snes, Vec X, Vec F_X, void *ctx);
+
+ /** \fn computeNewtonJacobian
+ * \brief Static function calling computeNewtonJacobian to match PETSc nonlinear solver (SNES) structure
+ * @param void
+ * */
+ void computeNewtonJacobian( Vec X, Mat A);
+
+ /** \fn computeSnesJacobian
+ * \brief Builds the matrix A(X) of the linear system in the Newton method to obtain the variation Ukp1-Uk
+ * @param void
+ * */
+ static int computeSnesJacobian(SNES snes, Vec X, Mat A, Mat Aapprox, void *ctx);
+
/** \fn convectionState
* \brief calcule l'etat de Roe entre deux cellules voisinnes
* \Details c'ets une fonction virtuelle, on la surcharge dans chacun des modèles
* */
virtual void porosityGradientSourceVector()=0;
- //matrice de gravite
-
/** \fn jacobian
* \brief Calcule la jacobienne de la ConditionLimite convection
* \Details est une fonction virtuelle pure, qu'on surcharge dans chacun des modèles