Salome HOME
Check memory is initialized in output field functions
[tools/solverlab.git] / CoreFlows / Models / src / SinglePhase.cxx
index 8afc7d13d42d4e84fe2a208f2ab70655d7fb689a..acf6566f731c9bf9d459049869d27a8711dd10b5 100755 (executable)
@@ -16,6 +16,7 @@ SinglePhase::SinglePhase(phaseType fluid, pressureEstimate pEstimate, int dim, b
        _dragCoeffs=vector<double>(1,0);
        _fluides.resize(1);
        _useDellacherieEOS=useDellacherieEOS;
+       _saveAllFields=false;
 
        if(pEstimate==around1bar300K){//EOS at 1 bar and 300K
                _Tref=300;
@@ -59,9 +60,25 @@ void SinglePhase::initialize(){
                _gravite[i+1]=_GravityField3d[i];
 
        _GravityImplicitationMatrix = new PetscScalar[_nVar*_nVar];
-       if(_saveVelocity)
+       if(_saveVelocity || _saveAllFields)
                _Vitesse=Field("Velocity",CELLS,_mesh,3);//Forcement en dimension 3 pour le posttraitement des lignes de courant
 
+       if(_saveAllFields)
+       {
+               _Enthalpy=Field("Enthalpy",CELLS,_mesh,1);
+               _Pressure=Field("Pressure",CELLS,_mesh,1);
+               _Density=Field("Density",CELLS,_mesh,1);
+               _Temperature=Field("Temperature",CELLS,_mesh,1);
+               _MachNumber=Field("MachNumber",CELLS,_mesh,1);
+               _VitesseX=Field("Velocity x",CELLS,_mesh,1);
+               if(_Ndim>1)
+               {
+                       _VitesseY=Field("Velocity y",CELLS,_mesh,1);
+                       if(_Ndim>2)
+                               _VitesseZ=Field("Velocity z",CELLS,_mesh,1);
+               }
+       }
+
        if(_entropicCorrection)
                _entropicShift=vector<double>(3,0);//at most 3 distinct eigenvalues
 
@@ -71,7 +88,7 @@ void SinglePhase::initialize(){
 bool SinglePhase::iterateTimeStep(bool &converged)
 {
        if(_timeScheme == Explicit || !_usePrimitiveVarsInNewton)
-               ProblemFluid::iterateTimeStep(converged);
+               return ProblemFluid::iterateTimeStep(converged);
        else
        {
                bool stop=false;
@@ -294,7 +311,7 @@ void SinglePhase::computeNewtonVariation()
        }
 }
 void SinglePhase::convectionState( const long &i, const long &j, const bool &IsBord){
-
+       //First conservative state then further down we will compute interface (Roe) state and then compute primitive state
        _idm[0] = _nVar*i; 
        for(int k=1; k<_nVar; k++)
                _idm[k] = _idm[k-1] + 1;
@@ -323,6 +340,8 @@ void SinglePhase::convectionState( const long &i, const long &j, const bool &IsB
                _runLogFile->close();
                throw CdmathException("densite negative, arret de calcul");
        }
+       
+       //Computation of Roe state
        PetscScalar ri, rj, xi, xj, pi, pj;
        PetscInt Ii;
        ri = sqrt(_Ui[0]);//racine carre de phi_i rho_i
@@ -369,6 +388,43 @@ void SinglePhase::convectionState( const long &i, const long &j, const bool &IsB
                for(int k=0;k<_nVar;k++)
                        cout<< _Uroe[k]<<" , "<<endl;
        }
+       
+       //Extraction of primitive states
+       _idm[0] = _nVar*i; // Kieu
+       for(int k=1; k<_nVar; k++)
+               _idm[k] = _idm[k-1] + 1;
+
+       VecGetValues(_primitiveVars, _nVar, _idm, _Vi);
+       if (_verbose && _nbTimeStep%_freqSave ==0)
+       {
+               cout << "Convection state: variables primitives maille " << i<<endl;
+               for(int q=0; q<_nVar; q++)
+                       cout << _Vi[q] << endl;
+               cout << endl;
+       }
+
+       if(!IsBord ){
+               for(int k=0; k<_nVar; k++)
+                       _idn[k] = _nVar*j + k;
+
+               VecGetValues(_primitiveVars, _nVar, _idn, _Vj);
+       }
+       else
+       {
+               for(int k=0; k<_nVar; k++)
+                       _idn[k] = k;
+
+               VecGetValues(_Uextdiff, _nVar, _idn, _phi);
+               consToPrim(_phi,_Vj,1);
+       }
+
+       if (_verbose && _nbTimeStep%_freqSave ==0)
+       {
+               cout << "Convection state: variables primitives maille " <<j <<endl;
+               for(int q=0; q<_nVar; q++)
+                       cout << _Vj[q] << endl;
+               cout << endl;
+       }
 }
 
 void SinglePhase::diffusionStateAndMatrices(const long &i,const long &j, const bool &IsBord){
@@ -378,12 +434,11 @@ void SinglePhase::diffusionStateAndMatrices(const long &i,const long &j, const b
                _idm[k] = _idm[k-1] + 1;
 
        VecGetValues(_conservativeVars, _nVar, _idm, _Ui);
-       _idm[0] = _nVar*j;
-       for(int k=1; k<_nVar; k++)
-               _idm[k] = _idm[k-1] + 1;
+       for(int k=0; k<_nVar; k++)
+               _idn[k] = k;
 
        if(IsBord)
-               VecGetValues(_Uextdiff, _nVar, _idm, _Uj);
+               VecGetValues(_Uextdiff, _nVar, _idn, _Uj);
        else
                VecGetValues(_conservativeVars, _nVar, _idm, _Uj);
 
@@ -439,7 +494,6 @@ void SinglePhase::diffusionStateAndMatrices(const long &i,const long &j, const b
                }
                _Diffusion[_nVar*_nVar-1]=-lambda/(_Udiff[0]*Cv);
        }
-
 }
 void SinglePhase::setBoundaryState(string nameOfGroup, const int &j,double *normale){
        _idm[0] = _nVar*j;
@@ -851,10 +905,9 @@ void SinglePhase::convectionMatrices()
                                _entropicShift=vector<double>(3,0);//at most 3 distinct eigenvalues
 
                        vector< complex< double > > y (3,0);
-                       Polynoms Poly;
                        for( int i=0 ; i<3 ; i++)
-                               y[i] = Poly.abs_generalise(vp_dist[i])+_entropicShift[i];
-                       Poly.abs_par_interp_directe(3,vp_dist, _Aroe, _nVar,_precision, _absAroe,y);
+                               y[i] = Polynoms::abs_generalise(vp_dist[i])+_entropicShift[i];
+                       Polynoms::abs_par_interp_directe(3,vp_dist, _Aroe, _nVar,_precision, _absAroe,y);
 
                        if( _spaceScheme ==pressureCorrection)
                                for( int i=0 ; i<_Ndim ; i++)
@@ -898,9 +951,8 @@ void SinglePhase::convectionMatrices()
                                for(int idim=0;idim<_Ndim; idim++)
                                        _Vij[1+idim]=_Uroe[1+idim];
                                primToConsJacobianMatrix(_Vij);
-                               Polynoms Poly;
-                               Poly.matrixProduct(_AroeMinus, _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroeMinusImplicit);
-                               Poly.matrixProduct(_AroePlus,  _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroePlusImplicit);
+                               Polynoms::matrixProduct(_AroeMinus, _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroeMinusImplicit);
+                               Polynoms::matrixProduct(_AroePlus,  _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroePlusImplicit);
                        }
                        else
                                for(int i=0; i<_nVar*_nVar;i++)
@@ -928,8 +980,7 @@ void SinglePhase::convectionMatrices()
        if(_entropicCorrection)
        {
                InvMatriceRoe( vp_dist);
-               Polynoms Poly;
-               Poly.matrixProduct(_absAroe, _nVar, _nVar, _invAroe, _nVar, _nVar, _signAroe);
+               Polynoms::matrixProduct(_absAroe, _nVar, _nVar, _invAroe, _nVar, _nVar, _signAroe);
        }
        else if (_spaceScheme==upwind || (_spaceScheme ==pressureCorrection ) || (_spaceScheme ==lowMach ))//upwind sans entropic
                SigneMatriceRoe( vp_dist);
@@ -978,58 +1029,32 @@ void SinglePhase::addDiffusionToSecondMember
                bool isBord)
 
 {
-       double lambda=_fluides[0]->getConductivity(_Udiff[_nVar-1]);
-       double mu = _fluides[0]->getViscosity(_Udiff[_nVar-1]);
+       double lambda = _fluides[0]->getConductivity(_Udiff[_nVar-1]);
+       double mu     = _fluides[0]->getViscosity(_Udiff[_nVar-1]);
+
+       if(isBord )
+               lambda=max(lambda,_heatTransfertCoeff);//wall nucleate boing -> larger heat transfer
 
        if(lambda==0 && mu ==0 && _heatTransfertCoeff==0)
                return;
 
-       //extraction des valeurs
-       _idm[0] = _nVar*i; // Kieu
+       _idm[0] = 0;
        for(int k=1; k<_nVar; k++)
                _idm[k] = _idm[k-1] + 1;
-
-       VecGetValues(_primitiveVars, _nVar, _idm, _Vi);
-       if (_verbose && _nbTimeStep%_freqSave ==0)
+       if(isBord)
        {
-               cout << "Calcul diffusion: variables primitives maille " << i<<endl;
-               for(int q=0; q<_nVar; q++)
-                       cout << _Vi[q] << endl;
-               cout << endl;
-       }
-
-       if(!isBord ){
-               for(int k=0; k<_nVar; k++)
-                       _idn[k] = _nVar*j + k;
-
-               VecGetValues(_primitiveVars, _nVar, _idn, _Vj);
-       }
-       else
-       {
-               lambda=max(lambda,_heatTransfertCoeff);//wall nucleate boing -> larger heat transfer
-               for(int k=0; k<_nVar; k++)
-                       _idn[k] = k;
-
-               VecGetValues(_Uextdiff, _nVar, _idn, _phi);
-               consToPrim(_phi,_Vj,1);
+               VecGetValues(_Uextdiff, _nVar, _idm, _Uj);
+               _inv_dxj=_inv_dxi;
        }
 
-       if (_verbose && _nbTimeStep%_freqSave ==0)
-       {
-               cout << "Calcul diffusion: variables primitives maille " <<j <<endl;
-               for(int q=0; q<_nVar; q++)
-                       cout << _Vj[q] << endl;
-               cout << endl;
-       }
        //on n'a pas de contribution sur la masse
        _phi[0]=0;
        //contribution visqueuse sur la quantite de mouvement
        for(int k=1; k<_nVar-1; k++)
                _phi[k] = _inv_dxi*2/(1/_inv_dxi+1/_inv_dxj)*mu*(_porosityj*_Vj[k] - _porosityi*_Vi[k]);
-
        //contribution visqueuse sur l'energie
        _phi[_nVar-1] = _inv_dxi*2/(1/_inv_dxi+1/_inv_dxj)*lambda*(_porosityj*_Vj[_nVar-1] - _porosityi*_Vi[_nVar-1]);
-
+       
        _idm[0] = i;
        VecSetValuesBlocked(_b, 1, _idm, _phi, ADD_VALUES);
 
@@ -1046,8 +1071,8 @@ void SinglePhase::addDiffusionToSecondMember
                //On change de signe pour l'autre contribution
                for(int k=0; k<_nVar; k++)
                        _phi[k] *= -_inv_dxj/_inv_dxi;
-               _idn[0] = j;
 
+               _idn[0] = j;
                VecSetValuesBlocked(_b, 1, _idn, _phi, ADD_VALUES);
                if(_verbose && _nbTimeStep%_freqSave ==0)
                {
@@ -1616,7 +1641,6 @@ void SinglePhase::entropicShift(double* n)//TO do: make sure _Vi and _Vj are wel
                ur_2 += _Vj[1+i]*_Vj[1+i];
        }
 
-
        double cl = _fluides[0]->vitesseSonEnthalpie(_Vi[_Ndim+1]-ul_2/2);//vitesse du son a l'interface
        double cr = _fluides[0]->vitesseSonEnthalpie(_Vj[_Ndim+1]-ur_2/2);//vitesse du son a l'interface
 
@@ -2541,11 +2565,10 @@ void SinglePhase::staggeredVFFCMatricesPrimitiveVariables(double un)//vitesse no
                }
                else//case nil velocity on the interface, apply centered scheme
                {
-                       Polynoms Poly;
                        primToConsJacobianMatrix(_Vj);
-                       Poly.matrixProduct(_AroeMinus, _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroeMinusImplicit);
+                       Polynoms::matrixProduct(_AroeMinus, _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroeMinusImplicit);
                        primToConsJacobianMatrix(_Vi);
-                       Poly.matrixProduct(_AroePlus,  _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroePlusImplicit);
+                       Polynoms::matrixProduct(_AroePlus,  _nVar, _nVar, _primToConsJacoMat, _nVar, _nVar, _AroePlusImplicit);
                }
        }
 }
@@ -2708,8 +2731,10 @@ void SinglePhase::getDensityDerivatives( double pressure, double temperature, do
 void SinglePhase::save(){
        string prim(_path+"/SinglePhasePrim_");///Results
        string cons(_path+"/SinglePhaseCons_");
+       string allFields(_path+"/");
        prim+=_fileName;
        cons+=_fileName;
+       allFields+=_fileName;
 
        PetscInt Ii;
        for (long i = 0; i < _Nmailles; i++){
@@ -2732,7 +2757,7 @@ void SinglePhase::save(){
        _VV.setTime(_time,_nbTimeStep);
 
        // create mesh and component info
-       if (_nbTimeStep ==0){
+       if (_nbTimeStep ==0 || _restartWithNewFileName){                
                string prim_suppress ="rm -rf "+prim+"_*";
                string cons_suppress ="rm -rf "+cons+"_*";
 
@@ -2782,6 +2807,7 @@ void SinglePhase::save(){
                        _VV.writeCSV(prim);
                        break;
                }
+
        }
        // do not create mesh
        else{
@@ -2812,7 +2838,7 @@ void SinglePhase::save(){
                        }
                }
        }
-       if(_saveVelocity){
+       if(_saveVelocity || _saveAllFields){
                for (long i = 0; i < _Nmailles; i++){
                        // j = 0 : pressure; j = _nVar - 1: temperature; j = 1,..,_nVar-2: velocity
                        for (int j = 0; j < _Ndim; j++)//On récupère les composantes de vitesse
@@ -2824,7 +2850,7 @@ void SinglePhase::save(){
                                _Vitesse(i,j)=0;
                }
                _Vitesse.setTime(_time,_nbTimeStep);
-               if (_nbTimeStep ==0){
+               if (_nbTimeStep ==0 || _restartWithNewFileName){                
                        _Vitesse.setInfoOnComponent(0,"Velocity_x_(m/s)");
                        _Vitesse.setInfoOnComponent(1,"Velocity_y_(m/s)");
                        _Vitesse.setInfoOnComponent(2,"Velocity_z_(m/s)");
@@ -2857,6 +2883,158 @@ void SinglePhase::save(){
                        }
                }
        }
+
+       if(_saveAllFields)
+       {
+               double p,T,rho, h, vx,vy,vz,v2;
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar;
+                       VecGetValues(_conservativeVars,1,&Ii,&rho);
+                       Ii = i*_nVar;
+                       VecGetValues(_primitiveVars,1,&Ii,&p);
+                       Ii = i*_nVar +_nVar-1;
+                       VecGetValues(_primitiveVars,1,&Ii,&T);
+                       Ii = i*_nVar + 1;
+                       VecGetValues(_primitiveVars,1,&Ii,&vx);
+                       if(_Ndim>1)
+                       {
+                               Ii = i*_nVar + 2;
+                               VecGetValues(_primitiveVars,1,&Ii,&vy);
+                               if(_Ndim>2){
+                                       Ii = i*_nVar + 3;
+                                       VecGetValues(_primitiveVars,1,&Ii,&vz);
+                               }
+                       }
+
+                       h   = _fluides[0]->getEnthalpy(T,rho);
+
+                       _Enthalpy(i)=h;
+                       _Density(i)=rho;
+                       _Pressure(i)=p;
+                       _Temperature(i)=T;
+                       _VitesseX(i)=vx;
+                       v2=vx*vx;
+                       if(_Ndim>1)
+                       {
+                               _VitesseY(i)=vy;
+                               v2+=vy*vy;
+                               if(_Ndim>2)
+                               {
+                                       _VitesseZ(i)=vz;
+                                       v2+=vz*vz;
+                               }
+                       }
+                       _MachNumber(i)=sqrt(v2)/_fluides[0]->vitesseSonEnthalpie(h);
+               }
+               _Enthalpy.setTime(_time,_nbTimeStep);
+               _Density.setTime(_time,_nbTimeStep);
+               _Pressure.setTime(_time,_nbTimeStep);
+               _Temperature.setTime(_time,_nbTimeStep);
+               _MachNumber.setTime(_time,_nbTimeStep);
+               _VitesseX.setTime(_time,_nbTimeStep);
+               if(_Ndim>1)
+               {
+                       _VitesseY.setTime(_time,_nbTimeStep);
+                       if(_Ndim>2)
+                               _VitesseZ.setTime(_time,_nbTimeStep);
+               }
+               if (_nbTimeStep ==0 || _restartWithNewFileName){                
+                       switch(_saveFormat)
+                       {
+                       case VTK :
+                               _Enthalpy.writeVTK(allFields+"_Enthalpy");
+                               _Density.writeVTK(allFields+"_Density");
+                               _Pressure.writeVTK(allFields+"_Pressure");
+                               _Temperature.writeVTK(allFields+"_Temperature");
+                               _MachNumber.writeVTK(allFields+"_MachNumber");
+                               _VitesseX.writeVTK(allFields+"_VelocityX");
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeVTK(allFields+"_VelocityY");
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeVTK(allFields+"_VelocityZ");
+                               }
+                               break;
+                       case MED :
+                               _Enthalpy.writeMED(allFields+"_Enthalpy");
+                               _Density.writeMED(allFields+"_Density");
+                               _Pressure.writeMED(allFields+"_Pressure");
+                               _Temperature.writeMED(allFields+"_Temperature");
+                               _MachNumber.writeMED(allFields+"_MachNumber");
+                               _VitesseX.writeMED(allFields+"_VelocityX");
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeMED(allFields+"_VelocityY");
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeMED(allFields+"_VelocityZ");
+                               }
+                               break;
+                       case CSV :
+                               _Enthalpy.writeCSV(allFields+"_Enthalpy");
+                               _Density.writeCSV(allFields+"_Density");
+                               _Pressure.writeCSV(allFields+"_Pressure");
+                               _Temperature.writeCSV(allFields+"_Temperature");
+                               _MachNumber.writeCSV(allFields+"_MachNumber");
+                               _VitesseX.writeCSV(allFields+"_VelocityX");
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeCSV(allFields+"_VelocityY");
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeCSV(allFields+"_VelocityZ");
+                               }
+                               break;
+                       }
+               }
+               else{
+                       switch(_saveFormat)
+                       {
+                       case VTK :
+                               _Enthalpy.writeVTK(allFields+"_Enthalpy",false);
+                               _Density.writeVTK(allFields+"_Density",false);
+                               _Pressure.writeVTK(allFields+"_Pressure",false);
+                               _Temperature.writeVTK(allFields+"_Temperature",false);
+                               _MachNumber.writeVTK(allFields+"_MachNumber",false);
+                               _VitesseX.writeVTK(allFields+"_VelocityX",false);
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeVTK(allFields+"_VelocityY",false);
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeVTK(allFields+"_VelocityZ",false);
+                               }
+                               break;
+                       case MED :
+                               _Enthalpy.writeMED(allFields+"_Enthalpy",false);
+                               _Density.writeMED(allFields+"_Density",false);
+                               _Pressure.writeMED(allFields+"_Pressure",false);
+                               _Temperature.writeMED(allFields+"_Temperature",false);
+                               _MachNumber.writeMED(allFields+"_MachNumber",false);
+                               _VitesseX.writeMED(allFields+"_VelocityX",false);
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeMED(allFields+"_VelocityY",false);
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeMED(allFields+"_VelocityZ",false);
+                               }
+                               break;
+                       case CSV :
+                               _Enthalpy.writeCSV(allFields+"_Enthalpy");
+                               _Density.writeCSV(allFields+"_Density");
+                               _Pressure.writeCSV(allFields+"_Pressure");
+                               _Temperature.writeCSV(allFields+"_Temperature");
+                               _MachNumber.writeCSV(allFields+"_MachNumber");
+                               _VitesseX.writeCSV(allFields+"_VelocityX");
+                               if(_Ndim>1)
+                               {
+                                       _VitesseY.writeCSV(allFields+"_VelocityY");
+                                       if(_Ndim>2)
+                                               _VitesseZ.writeCSV(allFields+"_VelocityZ");
+                               }
+                               break;
+                       }
+               }
+       }
+
        if(_isStationary)
        {
                prim+="_Stat";
@@ -2890,7 +3068,7 @@ void SinglePhase::save(){
                        }
                }
 
-               if(_saveVelocity){
+               if(_saveVelocity || _saveAllFields){
                        switch(_saveFormat)
                        {
                        case VTK :
@@ -2905,4 +3083,297 @@ void SinglePhase::save(){
                        }
                }
        }
+
+       if (_restartWithNewFileName)
+               _restartWithNewFileName=false;
+}
+
+Field& SinglePhase::getPressureField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getPressureField, Call initialize first");
+
+       if(!_saveAllFields)
+       {
+               _Pressure=Field("Pressure",CELLS,_mesh,1);
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar;
+                       VecGetValues(_primitiveVars,1,&Ii,&_Pressure(i));
+               }
+               _Pressure.setTime(_time,_nbTimeStep);
+       }
+       return _Pressure;
+}
+
+Field& SinglePhase::getTemperatureField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getTemperatureField, Call initialize first");
+
+       if(!_saveAllFields)
+       {
+               _Temperature=Field("Temperature",CELLS,_mesh,1);
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar +_nVar-1;
+                       VecGetValues(_primitiveVars,1,&Ii,&_Temperature(i));
+               }
+               _Temperature.setTime(_time,_nbTimeStep);
+       }
+       return _Temperature;
+}
+
+Field& SinglePhase::getVelocityField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getVelocityField, Call initialize first");
+
+       if(!_saveAllFields )
+       {
+               _Vitesse=Field("Vitesse",CELLS,_mesh,3);
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++)
+               {
+                       for (int j = 0; j < _Ndim; j++)//On récupère les composantes de vitesse
+                       {
+                               int Ii = i*_nVar +1+j;
+                               VecGetValues(_primitiveVars,1,&Ii,&_Vitesse(i,j));
+                       }
+                       for (int j = _Ndim; j < 3; j++)//On met à zero les composantes de vitesse si la dimension est <3
+                               _Vitesse(i,j)=0;
+               }
+               _Vitesse.setTime(_time,_nbTimeStep);
+               _Vitesse.setInfoOnComponent(0,"Velocity_x_(m/s)");
+               _Vitesse.setInfoOnComponent(1,"Velocity_y_(m/s)");
+               _Vitesse.setInfoOnComponent(2,"Velocity_z_(m/s)");
+       }
+       
+       return _Vitesse;
+}
+
+Field& SinglePhase::getMachNumberField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getMachNumberField, Call initialize first");
+
+       if(!_saveAllFields )
+       {
+               _MachNumber=Field("Mach number",CELLS,_mesh,1);
+               int Ii;
+               double p,T,rho,h, temp, u2=0;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar;
+                       VecGetValues(_primitiveVars,1,&Ii,&p);
+                       Ii = i*_nVar +_nVar-1;
+                       VecGetValues(_primitiveVars,1,&Ii,&T);
+                       
+                       for (int j = 0; j < _Ndim; j++)//On récupère les composantes de vitesse
+                       {
+                               int Ii = i*_nVar +1+j;
+                               VecGetValues(_primitiveVars,1,&Ii,&temp);
+                               u2+=temp*temp;
+                       }
+       
+                       rho=_fluides[0]->getDensity(p,T);
+                       h  =_fluides[0]->getEnthalpy(T,rho);
+                       _MachNumber[i]  =sqrt(u2)/_fluides[0]->vitesseSonEnthalpie(h);
+                       //cout<<"u="<<sqrt(u2)<<", c= "<<_fluides[0]->vitesseSonEnthalpie(h)<<", MachNumberField[i] = "<<MachNumberField[i] <<endl;
+               }
+               _MachNumber.setTime(_time,_nbTimeStep);
+       }
+       //cout<<", MachNumberField = "<<MachNumberField <<endl;
+
+       return _MachNumber;
+}
+
+Field& SinglePhase::getVelocityXField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getVelocityXField, Call initialize first");
+
+       if(!_saveAllFields )
+       {
+               _VitesseX=Field("Velocity X",CELLS,_mesh,1);
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++)
+               {
+                       int Ii = i*_nVar +1;
+                       VecGetValues(_primitiveVars,1,&Ii,&_VitesseX(i));
+               }
+               _VitesseX.setTime(_time,_nbTimeStep);
+               _VitesseX.setInfoOnComponent(0,"Velocity_x_(m/s)");
+       }
+       
+       return _VitesseX;
+}
+
+Field& SinglePhase::getVelocityYField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getVelocityYField, Call initialize first");
+
+       if(_Ndim<2)
+        throw CdmathException("SinglePhase::getVelocityYField() error : dimension should be at least 2");      
+       else
+               if(!_saveAllFields )
+               {
+                       _VitesseY=Field("Velocity Y",CELLS,_mesh,1);
+                       int Ii;
+                       for (long i = 0; i < _Nmailles; i++)
+                       {
+                               int Ii = i*_nVar +2;
+                               VecGetValues(_primitiveVars,1,&Ii,&_VitesseY(i));
+                       }
+                       _VitesseY.setTime(_time,_nbTimeStep);
+                       _VitesseY.setInfoOnComponent(0,"Velocity_y_(m/s)");
+               }
+               
+               return _VitesseY;
+}
+
+Field& SinglePhase::getVelocityZField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getVelocityZField, Call initialize first");
+
+       if(_Ndim<3)
+        throw CdmathException("SinglePhase::getvelocityZField() error : dimension should be 3");       
+       else
+               if(!_saveAllFields )
+               {
+                       _VitesseZ=Field("Velocity Z",CELLS,_mesh,1);
+                       int Ii;
+                       for (long i = 0; i < _Nmailles; i++)
+                       {
+                               int Ii = i*_nVar +3;
+                               VecGetValues(_primitiveVars,1,&Ii,&_VitesseZ(i));
+                       }
+                       _VitesseZ.setTime(_time,_nbTimeStep);
+                       _VitesseZ.setInfoOnComponent(0,"Velocity_z_(m/s)");
+               }
+               
+               return _VitesseZ;
+}
+
+Field& SinglePhase::getDensityField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getDensityField, Call initialize first");
+               
+       if(!_saveAllFields )
+       {
+               _Density=Field("Density",CELLS,_mesh,1);
+               int Ii;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar;
+                       VecGetValues(_conservativeVars,1,&Ii,&_Density(i));
+               }
+               _Density.setTime(_time,_nbTimeStep);
+       }
+       return _Density;
+}
+
+Field& SinglePhase::getMomentumField()//not yet managed by parameter _saveAllFields
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getMomentumField, Call initialize first");
+
+       _Momentum=Field("Momentum",CELLS,_mesh,_Ndim);
+       int Ii;
+       for (long i = 0; i < _Nmailles; i++)
+               for (int j = 0; j < _Ndim; j++)//On récupère les composantes de qdm
+               {
+                       int Ii = i*_nVar +1+j;
+                       VecGetValues(_conservativeVars,1,&Ii,&_Momentum(i,j));
+               }
+       _Momentum.setTime(_time,_nbTimeStep);
+
+       return _Momentum;
+}
+
+Field& SinglePhase::getTotalEnergyField()//not yet managed by parameter _saveAllFields
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getTotalEnergyField, Call initialize first");
+
+       _TotalEnergy=Field("TotalEnergy",CELLS,_mesh,1);
+       int Ii;
+       for (long i = 0; i < _Nmailles; i++){
+               Ii = i*_nVar +_nVar-1;
+               VecGetValues(_conservativeVars,1,&Ii,&_TotalEnergy(i));
+       }
+       _TotalEnergy.setTime(_time,_nbTimeStep);
+
+       return _TotalEnergy;
+}
+
+Field& SinglePhase::getEnthalpyField()
+{
+       if(!_initializedMemory)
+               throw CdmathException("SinglePhase::getEnthalpyField, Call initialize first");
+
+       if(!_saveAllFields )
+       {
+               _Enthalpy=Field("Enthalpy",CELLS,_mesh,1);
+               int Ii;
+               double p,T,rho;
+               for (long i = 0; i < _Nmailles; i++){
+                       Ii = i*_nVar;
+                       VecGetValues(_primitiveVars,1,&Ii,&p);
+                       Ii = i*_nVar +_nVar-1;
+                       VecGetValues(_primitiveVars,1,&Ii,&T);
+                       
+                       rho=_fluides[0]->getDensity(p,T);
+                       _Enthalpy(i)=_fluides[0]->getEnthalpy(T,rho);
+               }
+               _Enthalpy.setTime(_time,_nbTimeStep);
+       }
+
+       return _Enthalpy;
+}
+
+vector<string> SinglePhase::getOutputFieldsNames()
+{
+       vector<string> result(8);
+       
+       result[0]="Pressure";
+       result[1]="Velocity";
+       result[2]="Temperature";
+       result[3]="Density";
+       result[4]="Momentum";
+       result[5]="TotalEnergy";
+       result[6]="Enthalpy";
+       result[7]="VelocityX";
+       
+       return result;
+}
+
+Field& SinglePhase::getOutputField(const string& nameField )
+{
+       if(nameField=="pressure" || nameField=="Pressure" || nameField=="PRESSURE" || nameField=="PRESSION" || nameField=="Pression"  || nameField=="pression" )
+               return getPressureField();
+       else if(nameField=="velocity" || nameField=="Velocity" || nameField=="VELOCITY" || nameField=="Vitesse" || nameField=="VITESSE" || nameField=="vitesse" )
+               return getVelocityField();
+       else if(nameField=="velocityX" || nameField=="VelocityX" || nameField=="VELOCITYX" || nameField=="VitesseX" || nameField=="VITESSEX" || nameField=="vitesseX" )
+               return getVelocityXField();
+       else if(nameField=="velocityY" || nameField=="VelocityY" || nameField=="VELOCITYY" || nameField=="VitesseY" || nameField=="VITESSEY" || nameField=="vitesseY" )
+               return getVelocityYField();
+       else if(nameField=="velocityZ" || nameField=="VelocityZ" || nameField=="VELOCITYZ" || nameField=="VitesseZ" || nameField=="VITESSEZ" || nameField=="vitesseZ" )
+               return getVelocityZField();
+       else if(nameField=="temperature" || nameField=="Temperature" || nameField=="TEMPERATURE" || nameField=="temperature" )
+               return getTemperatureField();
+       else if(nameField=="density" || nameField=="Density" || nameField=="DENSITY" || nameField=="Densite" || nameField=="DENSITE" || nameField=="densite" )
+               return getDensityField();
+       else if(nameField=="momentum" || nameField=="Momentum" || nameField=="MOMENTUM" || nameField=="Qdm" || nameField=="QDM" || nameField=="qdm" )
+               return getMomentumField();
+       else if(nameField=="enthalpy" || nameField=="Enthalpy" || nameField=="ENTHALPY" || nameField=="Enthalpie" || nameField=="ENTHALPIE" || nameField=="enthalpie" )
+               return getEnthalpyField();
+       else if(nameField=="totalenergy" || nameField=="TotalEnergy" || nameField=="TOTALENERGY" || nameField=="ENERGIETOTALE" || nameField=="EnergieTotale" || nameField=="energietotale" )
+               return getTotalEnergyField();
+    else
+    {
+        cout<<"Error : Field name "<< nameField << " does not exist, call getOutputFieldsNames first to check" << endl;
+        throw CdmathException("SinglePhase::getOutputField error : Unknown Field name");
+    }
 }