Salome HOME
Some code factoring
[tools/solverlab.git] / CoreFlows / Models / inc / ProblemFluid.hxx
index 3f8fea88e1ac1642c9fa17f3455b9502f38bef8b..7ed239bd262b0bd771d3cf056030841d293dfd5e 100755 (executable)
@@ -30,22 +30,6 @@ enum SpaceScheme
        staggered,/**<  scheme inspired by staggered discretisations */
 };
 
-//! enumeration pressureEstimate
-/*! the pressure estimate needed to fit physical parameters  */
-enum pressureEstimate
-{
-       around1bar300K,/**< pressure is around 1 bar and temperature around 300K (for TransportEquation, SinglePhase and IsothermalTwoFluid) or 373 K (saturation for DriftModel and FiveEqsTwoFluid) */
-       around155bars600K/**< pressure is around 155 bars  and temperature around 618 K (saturation) */
-};
-
-//! enumeration phaseType
-/*! The fluid type can be Gas or water  */
-enum phaseType
-{
-       Liquid,/**< Fluid considered is water */
-       Gas/**< Fluid considered is Gas */
-};
-
 //! enumeration NonLinearFormulation
 /*! the formulation used to compute the non viscous fluxes */
 enum NonLinearFormulation
@@ -56,6 +40,14 @@ enum NonLinearFormulation
        reducedRoe,/**< compacted formulation of Roe scheme without computation of the fluxes */
 };
 
+//! enumeration phaseType
+/*! The material phase can be Gas or liquid  */
+enum phaseType
+{
+       Liquid,/**< Material considered is Liquid */
+       Gas/**< Material considered is Gas */
+};
+
 //! enumeration BoundaryType
 /*! Boundary condition type  */
 enum BoundaryType      {Wall, InnerWall, Inlet, InletPressure, InletRotationVelocity, InletEnthalpy, Outlet, Neumann, NoTypeSpecified};
@@ -84,7 +76,7 @@ public :
        /**\fn
         * \brief constructeur de la classe ProblemFluid
         */
-       ProblemFluid(void);
+       ProblemFluid(MPI_Comm comm = MPI_COMM_WORLD);
 
        //Gestion du calcul (interface ICoCo)
 
@@ -142,6 +134,14 @@ public :
         *  */
        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
@@ -240,16 +240,10 @@ public :
         * @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
@@ -309,9 +303,9 @@ public :
         * @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;
        };
 
@@ -327,7 +321,7 @@ public :
         * \brief returns the value of the latent heat
         * @param double L, the value of the latent heat
         * */
-       double getLatentHeat(){
+       double getLatentHeat() const{
                return _latentHeat;
        }
 
@@ -343,7 +337,7 @@ public :
         * \brief sets the saturation temperature
         * @param  Tsat double corresponds to saturation temperature
         * */
-       double getSatTemp(){
+       double getSatTemp() const {
                return _Tsat;
        }
 
@@ -360,16 +354,13 @@ public :
         * \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;
        }
 
@@ -380,19 +371,14 @@ public :
         * \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
@@ -400,19 +386,14 @@ public :
         * \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
@@ -420,10 +401,7 @@ public :
         * \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
@@ -443,7 +421,7 @@ public :
         * \param [in] void
         * \param [out] enum NonLinearFormulation
         *  */
-       NonLinearFormulation getNonLinearFormulation(){
+       NonLinearFormulation getNonLinearFormulation() const{
                return _nonLinearFormulation;
        }
 
@@ -460,7 +438,7 @@ public :
         * \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)
@@ -471,14 +449,18 @@ public :
         *  */
        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 **/
@@ -492,6 +474,11 @@ protected :
        /** 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 **/
@@ -539,6 +526,38 @@ protected :
        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
@@ -621,8 +640,6 @@ protected :
         * */
        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