45 #define OSEENSOLVER_H 1
47 #include <lifev/core/algorithm/SolverAztecOO.hpp> 48 #include <lifev/core/algorithm/Preconditioner.hpp> 49 #include <lifev/core/algorithm/PreconditionerIfpack.hpp> 50 #include <lifev/core/algorithm/PreconditionerAztecOO.hpp> 51 #include <lifev/core/array/MapEpetra.hpp> 53 #include <lifev/core/array/MatrixElemental.hpp> 54 #include <lifev/core/array/VectorElemental.hpp> 55 #include <lifev/core/array/MatrixEpetra.hpp> 56 #include <lifev/core/array/VectorEpetra.hpp> 58 #include <lifev/core/util/LifeChrono.hpp> 60 #include <lifev/core/fem/Assembly.hpp> 61 #include <lifev/core/fem/BCManage.hpp> 62 #include <lifev/core/fem/AssemblyElemental.hpp> 63 #include <lifev/core/fem/SobolevNorms.hpp> 64 #include <lifev/core/fem/GeometricMap.hpp> 65 #include <lifev/core/fem/PostProcessingBoundary.hpp> 66 #include <lifev/core/fem/FESpace.hpp> 68 #include <lifev/navier_stokes/solver/StabilizationIP.hpp> 69 #include <lifev/navier_stokes/solver/OseenData.hpp> 71 #include <boost/shared_ptr.hpp> 96 typedef MeshType mesh_Type;
97 typedef SolverType linearSolver_Type;
98 typedef std::shared_ptr<linearSolver_Type> linearSolverPtr_Type;
99 typedef OseenData data_Type;
100 typedef std::shared_ptr< data_Type > dataPtr_Type;
102 typedef std::function < Real (
const Real& t,
const Real& x,
const Real& y,
103 const Real& z,
const ID& i ) > function_Type;
105 typedef std::function < Real (
const Real& t,
const Real& x,
const Real& y,
106 const Real& z,
const ID& i ) > source_Type;
109 typedef std::shared_ptr<bcHandler_Type> bcHandlerPtr_Type;
112 typedef MatrixEpetraStructured<Real> matrix_Type;
114 typedef typename linearSolver_Type::matrix_type matrix_Type;
116 typedef std::shared_ptr<matrix_Type> matrixPtr_Type;
117 typedef typename linearSolver_Type::vector_type vector_Type;
118 typedef std::shared_ptr<vector_Type> vectorPtr_Type;
120 typedef vector_Type solution_Type;
121 typedef std::shared_ptr<solution_Type> solutionPtr_Type;
123 typedef typename linearSolver_Type::prec_raw_type preconditioner_Type;
124 typedef typename linearSolver_Type::prec_type preconditionerPtr_Type;
143 OseenSolver ( std::shared_ptr<data_Type> dataType,
144 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
145 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
146 std::shared_ptr<Epetra_Comm>& communicator,
147 const Int lagrangeMultiplier = 0 );
158 OseenSolver ( std::shared_ptr<data_Type> dataType,
159 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
160 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
161 std::shared_ptr<Epetra_Comm>& communicator,
163 const UInt offset = 0 );
173 OseenSolver ( std::shared_ptr<data_Type> dataType,
174 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
175 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
176 const std::vector<Int>& lagrangeMultipliers,
177 std::shared_ptr<Epetra_Comm>& communicator );
180 virtual ~OseenSolver();
191 virtual void setUp (
const GetPot& dataFile );
198 void initialize (
const function_Type& velocityFunction,
const function_Type& pressureFunction );
205 void initialize (
const vector_Type& velocityInitialGuess,
const vector_Type& pressureInitialGuess );
211 void initialize (
const vector_Type& velocityAndPressure );
214 virtual void buildSystem();
222 virtual void updateSystem (
const Real alpha,
223 const vector_Type& betaVector,
224 const vector_Type& sourceVector );
234 virtual void updateSystem (
const Real alpha,
235 const vector_Type& betaVector,
236 const vector_Type& sourceVector,
237 matrixPtr_Type matrix,
238 const vector_Type& un );
244 void updateStabilization ( matrix_Type& matrixFull );
250 virtual void updateRightHandSide (
const vector_Type& rightHandSide )
252 M_rightHandSideNoBC.reset (
new vector_Type (rightHandSide) );
253 M_rightHandSideNoBC->globalAssemble();
260 void updateSourceTerm (
const source_Type& source );
266 virtual void iterate ( bcHandler_Type& bcHandler );
273 void reduceSolution ( Vector& velocity, Vector& pressure );
279 void reduceResidual ( Vector& residual );
285 void setBlockPreconditioner ( matrixPtr_Type blockPreconditioner );
291 void getFluidMatrix ( matrix_Type& matrixFull );
294 void setupPostProc( );
346 Real kineticNormalStress (
const markerID_Type& flag,
const vector_Type& solution );
395 Real meanNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler,
const vector_Type& solution );
440 Real meanTotalNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler,
const vector_Type& solution );
458 Real meanTotalNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler );
467 Real lagrangeMultiplier (
const markerID_Type& flag, bcHandler_Type& bcHandler );
479 bcHandler_Type& bcHandler,
480 const vector_Type& solution );
486 void resetPreconditioner (
bool reset =
true )
490 M_linearSolver->resetPreconditioner();
495 void resetStabilization()
497 M_resetStabilization =
true;
507 void updateUn (
const vector_Type& solution )
516 void showMe ( std::ostream& output = std::cout )
const;
527 void setRecomputeMatrix (
const bool& recomputeMatrix )
529 M_recomputeMatrix = recomputeMatrix;
536 void setSourceTerm ( source_Type source )
546 void setTolMaxIteration (
const Real& tolerance,
const Int& maxIteration = -1 );
557 const dataPtr_Type& data()
const 568 return M_oseenData->density();
577 return M_oseenData->viscosity();
584 const vectorPtr_Type& solution()
const 593 const vector_Type& residual()
const 604 return M_velocityFESpace;
607 const FESpace<mesh_Type,
MapEpetra>& velocityFESpace()
const 609 return M_velocityFESpace;
618 return M_pressureFESpace;
621 const FESpace<mesh_Type,
MapEpetra>& pressureFESpace()
const 623 return M_pressureFESpace;
630 const source_Type& sourceTerm()
const 639 PostProcessingBoundary<mesh_Type>& postProcessing()
641 return *M_postProcessing;
644 const PostProcessingBoundary<mesh_Type>& postProcessing()
const 646 return *M_postProcessing;
662 const std::shared_ptr<Epetra_Comm>& comm()
const 680 const bool& recomputeMatrix()
const 682 return M_recomputeMatrix;
689 matrix_Type& matrixNoBC()
691 return *M_matrixNoBC;
694 const matrix_Type& matrixNoBC()
const 696 return *M_matrixNoBC;
703 matrix_Type& matrixMass()
705 return *M_velocityMatrixMass;
708 const matrix_Type& matrixMass()
const 710 return *M_velocityMatrixMass;
713 const matrixPtr_Type matrixMassPtr()
const 715 return M_velocityMatrixMass;
723 void postProcessingSetArea();
726 void postProcessingSetNormal();
729 void postProcessingSetPhi();
732 bool getIsDiagonalBlockPreconditioner()
734 return M_isDiagonalBlockPreconditioner;
737 const bool& getIsDiagonalBlockPreconditioner()
const 739 return M_isDiagonalBlockPreconditioner;
745 preconditionerPtr_Type& preconditioner()
747 return M_linearSolver.preconditioner();
756 OseenSolver (
const OseenSolver& oseen);
768 Real removeMean ( vector_Type& x );
776 void applyBoundaryConditions ( matrix_Type& matrix,
777 vector_Type& rightHandSide,
778 bcHandler_Type& bcHandler );
784 void echo ( std::string message );
787 const UInt& dimVelocity()
const 789 return M_velocityFESpace.dim();
793 const UInt& dimPressure()
const 795 return M_pressureFESpace.dim();
803 dataPtr_Type M_oseenData;
815 matrixPtr_Type M_velocityMatrixMass;
818 matrixPtr_Type M_pressureMatrixMass;
821 matrixPtr_Type M_matrixStokes;
827 matrixPtr_Type M_matrixNoBC;
830 matrixPtr_Type M_matrixStabilization;
833 source_Type M_source;
836 vectorPtr_Type M_rightHandSideNoBC;
839 vectorPtr_Type M_solution;
842 vectorPtr_Type M_residual;
844 linearSolverPtr_Type M_linearSolver;
849 std::shared_ptr<PostProcessingBoundary<mesh_Type> > M_postProcessing;
852 bool M_stabilization;
853 bool M_reuseStabilization;
854 bool M_resetStabilization;
855 Int M_iterReuseStabilization;
857 details::StabilizationIP<mesh_Type,
DOF> M_ipStabilization;
862 const function_Type* M_betaFunction;
873 bool M_recomputeMatrix;
875 bool M_isDiagonalBlockPreconditioner;
884 matrixPtr_Type M_blockPreconditioner;
887 std::shared_ptr<vector_Type> M_un;
897 template<
typename MeshType,
typename SolverType>
898 OseenSolver<MeshType, SolverType>::
899 OseenSolver ( std::shared_ptr<data_Type> dataType,
900 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
901 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
902 std::shared_ptr<Epetra_Comm>& communicator,
903 const Int lagrangeMultiplier ) :
904 M_oseenData ( dataType ),
905 M_velocityFESpace ( velocityFESpace ),
906 M_pressureFESpace ( pressureFESpace ),
907 M_Displayer ( communicator ),
908 M_localMap ( M_velocityFESpace.map() + M_pressureFESpace.map() + lagrangeMultiplier),
909 M_velocityMatrixMass ( ),
910 M_pressureMatrixMass ( ),
913 M_matrixStabilization ( ),
914 M_rightHandSideNoBC ( ),
915 M_solution (
new vector_Type ( M_localMap ) ),
916 M_residual (
new vector_Type (M_localMap ) ),
917 M_linearSolver (
new linearSolver_Type (communicator) ),
919 M_postProcessing (
new PostProcessingBoundary<mesh_Type> ( M_velocityFESpace.mesh(),
920 &M_velocityFESpace.feBd(),
921 &M_velocityFESpace.dof(),
922 &M_pressureFESpace.feBd(),
923 &M_pressureFESpace.dof(),
925 M_stabilization (
false ),
926 M_reuseStabilization (
false ),
927 M_resetStabilization (
false ),
928 M_iterReuseStabilization ( -1 ),
936 M_betaFunction ( 0 ),
937 M_divBetaUv (
false ),
938 M_stiffStrain (
false ),
939 M_diagonalize (
false ),
941 M_recomputeMatrix (
false ),
942 M_elementMatrixStiff ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim(), velocityFESpace.fieldDim() ),
943 M_elementMatrixMass ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim(), velocityFESpace.fieldDim() ),
944 M_elementMatrixPreconditioner ( M_pressureFESpace.fe().nbFEDof(), 1, 1 ),
945 M_elementMatrixDivergence ( M_pressureFESpace.fe().nbFEDof(), 1, 0,
946 M_velocityFESpace.fe().nbFEDof(), 0, velocityFESpace.fieldDim() ),
947 M_elementMatrixGradient ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim(), 0,
948 M_pressureFESpace.fe().nbFEDof(), 0, 1 ),
949 M_elementRightHandSide ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
950 M_blockPreconditioner ( ),
951 M_wLoc ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
952 M_uLoc ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
953 M_un (
new vector_Type (M_localMap) )
957 M_ipStabilization.setFeSpaceVelocity (M_velocityFESpace);
958 M_ipStabilization.setViscosity (M_oseenData->viscosity() );
962 template<
typename MeshType,
typename SolverType>
963 OseenSolver<MeshType, SolverType>::
964 OseenSolver ( std::shared_ptr<data_Type> dataType,
965 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
966 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
967 std::shared_ptr<Epetra_Comm>& communicator,
970 M_oseenData ( dataType ),
971 M_velocityFESpace ( velocityFESpace ),
972 M_pressureFESpace ( pressureFESpace ),
973 M_Displayer ( communicator ),
974 M_localMap ( monolithicMap ),
975 M_velocityMatrixMass ( ),
978 M_matrixStabilization ( ),
979 M_rightHandSideNoBC ( ),
983 M_postProcessing (
new PostProcessingBoundary<mesh_Type> (M_velocityFESpace.mesh(),
984 &M_velocityFESpace.feBd(),
985 &M_velocityFESpace.dof(),
986 &M_pressureFESpace.feBd(),
987 &M_pressureFESpace.dof(),
989 M_stabilization (
false ),
990 M_reuseStabilization (
false ),
991 M_resetStabilization (
false ),
992 M_iterReuseStabilization ( -1 ),
993 M_betaFunction ( 0 ),
994 M_divBetaUv (
false ),
995 M_stiffStrain (
false ),
996 M_diagonalize (
false ),
998 M_recomputeMatrix (
false ),
999 M_elementMatrixStiff ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), M_velocityFESpace.fieldDim() ),
1000 M_elementMatrixMass ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), M_velocityFESpace.fieldDim() ),
1001 M_elementMatrixPreconditioner ( M_pressureFESpace.fe().nbFEDof(), 1, 1 ),
1002 M_elementMatrixDivergence ( M_pressureFESpace.fe().nbFEDof(), 1, 0,
1003 M_velocityFESpace.fe().nbFEDof(), 0, M_velocityFESpace.fieldDim() ),
1004 M_elementMatrixGradient ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), 0,
1005 M_pressureFESpace.fe().nbFEDof(), 0, 1 ),
1006 M_elementRightHandSide ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim() ),
1007 M_blockPreconditioner ( ),
1008 M_wLoc ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim() ),
1009 M_uLoc ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim() ),
1014 M_ipStabilization.setFeSpaceVelocity (M_velocityFESpace);
1015 M_ipStabilization.setViscosity (M_oseenData->viscosity() );
1019 template<
typename MeshType,
typename SolverType>
1020 OseenSolver<MeshType, SolverType>::
1021 OseenSolver ( std::shared_ptr<data_Type> dataType,
1022 FESpace<mesh_Type,
MapEpetra>& velocityFESpace,
1023 FESpace<mesh_Type,
MapEpetra>& pressureFESpace,
1024 const std::vector<Int>& lagrangeMultipliers,
1025 std::shared_ptr<Epetra_Comm>& communicator ) :
1026 M_oseenData ( dataType ),
1027 M_velocityFESpace ( velocityFESpace ),
1028 M_pressureFESpace ( pressureFESpace ),
1029 M_Displayer ( communicator ),
1030 M_localMap ( M_velocityFESpace.map() + M_pressureFESpace.map() + lagrangeMultipliers ),
1031 M_velocityMatrixMass ( ),
1034 M_matrixStabilization ( ),
1035 M_rightHandSideNoBC ( ),
1036 M_solution (
new vector_Type ( M_localMap ) ),
1038 M_linearSolver (
new linearSolver_Type (communicator) ),
1039 M_postProcessing (
new PostProcessingBoundary<mesh_Type> (M_velocityFESpace.mesh(),
1040 &M_velocityFESpace.feBd(),
1041 &M_velocityFESpace.dof(),
1042 &M_pressureFESpace.feBd(),
1043 &M_pressureFESpace.dof(),
1045 M_stabilization (
false ),
1046 M_reuseStabilization (
false ),
1047 M_resetStabilization (
false ),
1048 M_iterReuseStabilization ( -1 ),
1049 M_betaFunction ( 0 ),
1050 M_divBetaUv (
false ),
1051 M_stiffStrain (
false ),
1052 M_diagonalize (
false ),
1054 M_recomputeMatrix (
false ),
1055 M_elementMatrixStiff ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), M_velocityFESpace.fieldDim() ),
1056 M_elementMatrixMass ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), M_velocityFESpace.fieldDim() ),
1057 M_elementMatrixPreconditioner ( M_pressureFESpace.fe().nbFEDof(), 1, 1 ),
1058 M_elementMatrixDivergence ( M_pressureFESpace.fe().nbFEDof(), 1, 0,
1059 M_velocityFESpace.fe().nbFEDof(), 0, M_velocityFESpace.fieldDim() ),
1060 M_elementMatrixGradient ( M_velocityFESpace.fe().nbFEDof(), M_velocityFESpace.fieldDim(), 0,
1061 M_pressureFESpace.fe().nbFEDof(), 0, 1 ),
1062 M_elementRightHandSide ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
1063 M_blockPreconditioner ( ),
1064 M_wLoc ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
1065 M_uLoc ( M_velocityFESpace.fe().nbFEDof(), velocityFESpace.fieldDim() ),
1066 M_un (
new vector_Type (M_localMap) )
1070 M_ipStabilization.setFeSpaceVelocity (M_velocityFESpace);
1071 M_ipStabilization.setViscosity (M_oseenData->viscosity() );
1075 template<
typename MeshType,
typename SolverType>
1076 OseenSolver<MeshType, SolverType>::
1087 template<
typename MeshType,
typename SolverType>
1089 OseenSolver<MeshType, SolverType>::setUp (
const GetPot& dataFile )
1091 if (M_linearSolver.get() )
1093 M_linearSolver->setupPreconditioner ( dataFile,
"fluid/prec" );
1094 M_linearSolver->setDataFromGetPot ( dataFile,
"fluid/solver" );
1097 M_stabilization = dataFile (
"fluid/ipstab/use", (&M_velocityFESpace.refFE() == &M_pressureFESpace.refFE() ) );
1098 M_steady = dataFile
( "fluid/miscellaneous/steady", 0
);
1099 if (M_stabilization)
1101 M_gammaBeta = dataFile
( "fluid/ipstab/gammaBeta", 0.
);
1102 M_gammaDiv = dataFile
( "fluid/ipstab/gammaDiv", 0.
);
1103 M_gammaPress = dataFile
( "fluid/ipstab/gammaPress", 0.
);
1104 M_reuseStabilization = dataFile
( "fluid/ipstab/reuse", false );
1105 if (M_linearSolver.get() )
1106 M_iterReuseStabilization = dataFile (
"fluid/ipstab/max_iter_reuse",
1107 static_cast<Int> ( M_linearSolver->maxNumIterations() * 8. / 10. ) );
1110 M_divBetaUv = dataFile
( "fluid/space_discretization/div_beta_u_v", false);
1112 M_stiffStrain = dataFile
( "fluid/space_discretization/stiff_strain", false);
1113 M_diagonalize = dataFile
( "fluid/space_discretization/diagonalize", 1.
);
1114 M_isDiagonalBlockPreconditioner = dataFile
( "fluid/diagonalBlockPrec", false );
1118 M_ipStabilization.setGammaBeta ( M_gammaBeta );
1119 M_ipStabilization.setGammaDiv ( M_gammaDiv );
1120 M_ipStabilization.setGammaPress ( M_gammaPress );
1124 template<
typename MeshType,
typename SolverType>
1126 OseenSolver<MeshType, SolverType>::
1127 initialize (
const function_Type& velocityFunction,
const function_Type& pressureFunction )
1129 vector_Type velocityInitialGuess ( M_velocityFESpace.map() );
1130 M_velocityFESpace.interpolate ( velocityFunction,
1131 velocityInitialGuess,
1132 M_oseenData->dataTime()->time() );
1134 vector_Type pressureInitialGuess ( M_pressureFESpace.map() );
1135 M_pressureFESpace.interpolate ( pressureFunction,
1136 pressureInitialGuess,
1137 M_oseenData->dataTime()->time() );
1139 initialize ( velocityInitialGuess, pressureInitialGuess );
1143 template<
typename MeshType,
typename SolverType>
1145 OseenSolver<MeshType, SolverType>::
1146 initialize (
const vector_Type& velocityInitialGuess,
const vector_Type& pressureInitialGuess )
1149 *M_solution = velocityInitialGuess;
1150 *M_un = velocityInitialGuess;
1151 M_solution->add ( pressureInitialGuess, M_velocityFESpace.fieldDim() * M_velocityFESpace.dof().numTotalDof() );
1152 M_un->add ( pressureInitialGuess, M_velocityFESpace.fieldDim() * M_velocityFESpace.dof().numTotalDof() );
1156 template<
typename MeshType,
typename SolverType>
1158 OseenSolver<MeshType, SolverType>::
1159 initialize (
const vector_Type& velocityAndPressure )
1162 *M_un = velocityAndPressure;
1163 if ( M_solution.get() )
1165 *M_solution = velocityAndPressure;
1170 template<
typename MeshType,
typename SolverType>
1172 OseenSolver<MeshType, SolverType>::buildSystem()
1174 M_velocityMatrixMass.reset (
new matrix_Type ( M_localMap ) );
1175 M_matrixStokes.reset (
new matrix_Type ( M_localMap ) );
1177 M_Displayer.leaderPrint (
" F- Computing constant matrices ... " );
1194 UInt numVelocityComponent = M_velocityFESpace.fieldDim();
1199 UInt velocityTotalDof = M_velocityFESpace.dof().numTotalDof();
1202 if ( M_isDiagonalBlockPreconditioner ==
true )
1204 M_blockPreconditioner.reset (
new matrix_Type ( M_localMap ) );
1208 for (
UInt iElement = 0; iElement < M_velocityFESpace.mesh()->numElements(); iElement++ )
1212 M_pressureFESpace.fe().update ( M_velocityFESpace.mesh()->element ( iElement ) );
1215 M_velocityFESpace.fe().updateFirstDeriv ( M_velocityFESpace.mesh()->element ( iElement ) );
1220 M_elementMatrixStiff.zero();
1221 M_elementMatrixMass.zero();
1222 M_elementMatrixPreconditioner.zero();
1223 M_elementMatrixDivergence.zero();
1224 M_elementMatrixGradient.zero();
1229 if ( M_stiffStrain )
1230 AssemblyElemental::stiff_strain ( 2.0 * M_oseenData->viscosity(),
1231 M_elementMatrixStiff,
1232 M_velocityFESpace.fe() );
1234 AssemblyElemental::stiff ( M_oseenData->viscosity(),
1235 M_elementMatrixStiff,
1236 M_velocityFESpace.fe(), 0, 0, M_velocityFESpace.fieldDim() );
1244 AssemblyElemental::mass ( M_oseenData->density(),
1245 M_elementMatrixMass,
1246 M_velocityFESpace.fe(), 0, 0, M_velocityFESpace.fieldDim() );
1250 for (
UInt iComponent = 0; iComponent < numVelocityComponent; iComponent++ )
1254 if ( M_isDiagonalBlockPreconditioner ==
true )
1256 assembleMatrix ( *M_blockPreconditioner,
1257 M_elementMatrixStiff,
1258 M_velocityFESpace.fe(),
1259 M_velocityFESpace.fe(),
1260 M_velocityFESpace.dof(),
1261 M_velocityFESpace.dof(),
1262 iComponent, iComponent,
1263 iComponent * velocityTotalDof, iComponent * velocityTotalDof);
1267 if ( M_stiffStrain )
1269 for (
UInt jComp = 0; jComp < numVelocityComponent; jComp++ )
1271 assembleMatrix ( *M_matrixStokes,
1272 M_elementMatrixStiff,
1273 M_velocityFESpace.fe(),
1274 M_velocityFESpace.fe(),
1275 M_velocityFESpace.dof(),
1276 M_velocityFESpace.dof(),
1278 iComponent * velocityTotalDof, jComp * velocityTotalDof);
1284 assembleMatrix ( *M_matrixStokes,
1285 M_elementMatrixStiff,
1286 M_velocityFESpace.fe(),
1287 M_velocityFESpace.fe(),
1288 M_velocityFESpace.dof(),
1289 M_velocityFESpace.dof(),
1290 iComponent, iComponent,
1291 iComponent * velocityTotalDof, iComponent * velocityTotalDof);
1300 assembleMatrix ( *M_velocityMatrixMass,
1301 M_elementMatrixMass,
1302 M_velocityFESpace.fe(),
1303 M_velocityFESpace.fe(),
1304 M_velocityFESpace.dof(),
1305 M_velocityFESpace.dof(),
1306 iComponent, iComponent,
1307 iComponent * velocityTotalDof, iComponent * velocityTotalDof);
1313 AssemblyElemental::grad ( iComponent, 1.0,
1314 M_elementMatrixGradient,
1315 M_velocityFESpace.fe(),
1316 M_pressureFESpace.fe(),
1321 assembleMatrix ( *M_matrixStokes,
1322 M_elementMatrixGradient,
1323 M_velocityFESpace.fe(),
1324 M_pressureFESpace.fe(),
1325 M_velocityFESpace.dof(),
1326 M_pressureFESpace.dof(),
1328 iComponent * velocityTotalDof, numVelocityComponent * velocityTotalDof );
1332 assembleTransposeMatrix ( *M_matrixStokes,
1334 M_elementMatrixGradient,
1335 M_pressureFESpace.fe(),
1336 M_velocityFESpace.fe(),
1337 M_pressureFESpace.dof(),
1338 M_velocityFESpace.dof(),
1340 numVelocityComponent * velocityTotalDof, iComponent * velocityTotalDof );
1348 if ( M_isDiagonalBlockPreconditioner ==
true )
1350 M_blockPreconditioner->globalAssemble();
1351 *M_matrixStokes += *M_blockPreconditioner;
1356 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1358 M_Displayer.leaderPrint (
" F- Finalizing the matrices ... " );
1362 M_matrixStokes->globalAssemble();
1363 M_velocityMatrixMass->globalAssemble();
1366 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1369 std::cout <<
" partial times: \n" 1370 <<
" Der " << chronoDer.diffCumul() <<
" s.\n" 1371 <<
" Zero " << chronoZero.diffCumul() <<
" s.\n" 1372 <<
" Stiff " << chronoStiff.diffCumul() <<
" s.\n" 1373 <<
" Stiff Assemble " << chronoStiffAssemble.diffCumul() <<
" s.\n" 1374 <<
" Mass " << chronoMass.diffCumul() <<
" s.\n" 1375 <<
" Mass Assemble " << chronoMassAssemble.diffCumul() <<
" s.\n" 1376 <<
" Grad " << chronoGrad.diffCumul() <<
" s.\n" 1377 <<
" Grad Assemble " << chronoGradAssemble.diffCumul() <<
" s.\n" 1378 <<
" Div Assemble " << chronoDivAssemble.diffCumul() <<
" s.\n" 1383 template<
typename MeshType,
typename SolverType>
1385 OseenSolver<MeshType, SolverType>::
1387 const vector_Type& betaVector,
1388 const vector_Type& sourceVector )
1390 if ( M_matrixNoBC.get() )
1392 M_matrixNoBC.reset (
new matrix_Type ( M_localMap, M_matrixNoBC->meanNumEntries() ) );
1396 M_matrixNoBC.reset (
new matrix_Type ( M_localMap ) );
1399 updateSystem ( alpha, betaVector, sourceVector, M_matrixNoBC, *M_un );
1402 M_matrixNoBC->globalAssemble();
1407 template<
typename MeshType,
typename SolverType>
1409 OseenSolver<MeshType, SolverType>::
1411 const vector_Type& betaVector,
1412 const vector_Type& sourceVector,
1413 matrixPtr_Type matrixNoBC,
1414 const vector_Type& un )
1419 M_pressureMatrixMass.reset( );
1422 M_Displayer.leaderPrint (
" F- Updating mass term on right hand side... " );
1426 UInt velocityTotalDof = M_velocityFESpace.dof().numTotalDof();
1431 updateRightHandSide ( sourceVector );
1435 M_Displayer.leaderPrintMax (
"done in ", chrono
.diff() );
1440 if ( M_recomputeMatrix )
1445 M_Displayer.leaderPrint (
" F- Copying the matrices ... " );
1449 if ( M_isDiagonalBlockPreconditioner ==
true )
1451 matrixPtr_Type tempMatrix ( M_blockPreconditioner );
1452 M_blockPreconditioner.reset (
new matrix_Type ( M_localMap,
1453 M_blockPreconditioner->meanNumEntries() ) );
1454 *M_blockPreconditioner += *tempMatrix;
1459 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1462 UInt numVelocityComponent = M_velocityFESpace.fieldDim();
1467 betaVector.normInf ( &normInf );
1469 if ( normInf != 0. )
1471 M_Displayer.leaderPrint (
" F- Sharing convective term ... " );
1476 vector_Type betaVectorRepeated ( betaVector,
Repeated );
1477 vector_Type unRepeated ( un, Repeated, Add );
1481 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1482 M_Displayer.leaderPrint (
" F- Updating the convective terms ... " );
1485 for (
UInt iElement = 0; iElement < M_velocityFESpace.mesh()->numElements(); ++iElement )
1488 M_pressureFESpace.fe().updateFirstDeriv ( M_velocityFESpace.mesh()->element ( iElement ) );
1490 M_velocityFESpace.fe().updateFirstDeriv ( M_velocityFESpace.mesh()->element ( iElement ) );
1492 M_elementMatrixStiff.zero();
1494 UInt elementID = M_velocityFESpace.fe().currentLocalId();
1497 for (
UInt iNode = 0 ; iNode < M_velocityFESpace.fe().nbFEDof() ; iNode++ )
1499 UInt iLocal = M_velocityFESpace.fe().patternFirst ( iNode );
1500 for (
UInt iComponent = 0; iComponent < numVelocityComponent; ++iComponent )
1502 UInt iGlobal = M_velocityFESpace.dof().localToGlobalMap ( elementID, iLocal )
1503 + iComponent * dimVelocity();
1504 M_elementRightHandSide.vec() [ iLocal + iComponent * M_velocityFESpace.fe().nbFEDof() ]
1505 = betaVectorRepeated[iGlobal];
1507 M_uLoc.vec() [ iLocal + iComponent * M_velocityFESpace.fe().nbFEDof() ]
1508 = unRepeated (iGlobal);
1509 M_wLoc.vec() [ iLocal + iComponent * M_velocityFESpace.fe().nbFEDof() ]
1510 = unRepeated (iGlobal) - betaVectorRepeated (iGlobal);
1514 if (M_oseenData->conservativeFormulation() )
1517 AssemblyElemental::mass_divw ( - M_oseenData->density(),
1519 M_elementMatrixStiff,
1520 M_velocityFESpace.fe(), 0, 0, numVelocityComponent );
1524 AssemblyElemental::mass_divw ( 0.5 * M_oseenData->density(),
1526 M_elementMatrixStiff,
1527 M_velocityFESpace.fe(), 0, 0, numVelocityComponent );
1531 AssemblyElemental::mass_divw ( -0.5 * M_oseenData->density(),
1533 M_elementMatrixStiff,
1534 M_velocityFESpace.fe(), 0, 0, numVelocityComponent );
1537 AssemblyElemental::advection ( M_oseenData->density(),
1538 M_elementRightHandSide,
1539 M_elementMatrixStiff,
1540 M_velocityFESpace.fe(), 0, 0, numVelocityComponent );
1543 for (
UInt iComponent = 0; iComponent < numVelocityComponent; ++iComponent )
1553 assembleMatrix ( *matrixNoBC,
1554 M_elementMatrixStiff,
1555 M_velocityFESpace.fe(),
1556 M_velocityFESpace.fe(),
1557 M_velocityFESpace.dof(),
1558 M_velocityFESpace.dof(),
1559 iComponent, iComponent,
1560 iComponent * velocityTotalDof, iComponent * velocityTotalDof );
1565 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1567 if ( M_stabilization &&
1568 ( M_resetStabilization || !M_reuseStabilization || ( M_matrixStabilization.get() == 0 ) ) )
1570 M_Displayer.leaderPrint (
" F- Updating the stabilization terms ... " );
1572 M_matrixStabilization.reset (
new matrix_Type ( M_localMap ) );
1573 M_ipStabilization.apply ( *M_matrixStabilization, betaVectorRepeated,
false );
1574 M_matrixStabilization->globalAssemble();
1575 M_resetStabilization =
false;
1577 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1583 if ( M_stabilization )
1585 M_Displayer.leaderPrint (
" F- Updating the stabilization terms ... " );
1588 if ( M_resetStabilization || !M_reuseStabilization || ( M_matrixStabilization.get() == 0 ) )
1590 M_matrixStabilization.reset (
new matrix_Type ( M_localMap ) );
1591 M_ipStabilization.apply ( *M_matrixStabilization, betaVector,
false );
1592 M_matrixStabilization->globalAssemble();
1593 M_resetStabilization =
false;
1595 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1599 M_Displayer.leaderPrint (
"reusing\n" );
1606 *matrixNoBC += (*M_velocityMatrixMass) * alpha;
1607 if ( M_isDiagonalBlockPreconditioner ==
true )
1609 matrixNoBC->globalAssemble();
1610 *M_blockPreconditioner += *matrixNoBC;
1611 matrix_Type tempMatrix ( *matrixNoBC );
1612 matrixNoBC.reset (
new matrix_Type ( M_localMap, tempMatrix.meanNumEntries() ) );
1613 *matrixNoBC += tempMatrix;
1614 M_blockPreconditioner->globalAssemble();
1617 *matrixNoBC += *M_matrixStokes;
1621 template<
typename MeshType,
typename SolverType>
1623 OseenSolver<MeshType, SolverType>::updateStabilization ( matrix_Type& matrixFull )
1626 if ( M_stabilization )
1628 matrixFull += *M_matrixStabilization;
1633 template <
typename Mesh,
typename SolverType>
1634 void OseenSolver<Mesh, SolverType>::updateSourceTerm ( source_Type
const& source )
1636 vector_Type rhs ( M_localMap );
1642 for (
UInt i = 1; i <= M_velocityFESpace->mesh()->numVolumes(); ++i )
1645 M_velocityFESpace->fe().updateFirstDerivQuadPt ( M_velocityFESpace->mesh()->volumeList ( i ) );
1649 for (
UInt ic = 0; ic < nc; ++ic )
1651 compute_vec ( source, M_elvec, M_velocityFESpace->fe(), M_oseenData->dataTime()->time(), ic );
1652 assembleVector ( *rhs, M_elvec, M_velocityFESpace->fe(), M_velocityFESpace->dof(), ic, ic * M_velocityFESpace->getDim() );
1655 M_rightHandSideNoBC += rhs;
1661 template<
typename MeshType,
typename SolverType>
1663 OseenSolver<MeshType, SolverType>::iterate ( bcHandler_Type& bcHandler )
1669 M_Displayer.leaderPrint (
" F- Updating the boundary conditions ... " );
1673 M_matrixNoBC->globalAssemble();
1675 matrixPtr_Type matrixFull (
new matrix_Type ( M_localMap, M_matrixNoBC->meanNumEntries() ) );
1677 updateStabilization ( *matrixFull );
1678 getFluidMatrix ( *matrixFull );
1680 vector_Type rightHandSideFull ( *M_rightHandSideNoBC );
1687 M_Displayer.leaderPrintMax (
"done in ", chrono
.diff() );
1690 M_Displayer.leaderPrint (
" F- Applying boundary conditions ... ");
1693 applyBoundaryConditions ( *matrixFull, rightHandSideFull, bcHandler );
1695 matrixFull->globalAssemble();
1698 M_Displayer.leaderPrintMax (
"done in " , chrono
.diff() );
1701 M_linearSolver->setMatrix ( *matrixFull );
1703 std::shared_ptr<MatrixEpetra<Real> > staticCast = std::static_pointer_cast<MatrixEpetra<Real> > (matrixFull);
1705 Int numIter = M_linearSolver->solveSystem ( rightHandSideFull, *M_solution, staticCast );
1708 if ( numIter < 0 || numIter > M_iterReuseStabilization )
1710 resetStabilization();
1713 *M_residual = *M_rightHandSideNoBC;
1714 *M_residual -= (*M_matrixNoBC) * (*M_solution);
1720 template<
typename MeshType,
typename SolverType>
1722 OseenSolver<MeshType, SolverType>::reduceSolution ( Vector& velocityVector, Vector& pressureVector )
1724 vector_Type solution ( *M_solution, 0 );
1728 for (
UInt iDof = 0; iDof < M_velocityFESpace.fieldDim() * dimVelocity(); ++iDof )
1730 velocityVector[ iDof ] = solution[ iDof ];
1733 for (
UInt iDof = 0; iDof < dimPressure(); ++iDof )
1735 pressureVector[ iDof ] = solution[ iDof + M_velocityFESpace.fieldDim() * dimVelocity() ];
1741 template<
typename MeshType,
typename SolverType>
1743 OseenSolver<MeshType, SolverType>::reduceResidual ( Vector& residualVector )
1745 vector_Type residual ( *M_residual, 0 );
1749 for (
UInt iDof = 0; iDof < M_velocityFESpace.fieldDim() * dimVelocity(); ++iDof )
1751 residualVector[ iDof ] = residual[ iDof ];
1757 template<
typename MeshType,
typename SolverType>
1759 OseenSolver<MeshType, SolverType>::setBlockPreconditioner ( matrixPtr_Type blockPreconditioner )
1762 *blockPreconditioner += *M_blockPreconditioner;
1765 template<
typename MeshType,
typename SolverType>
1767 OseenSolver<MeshType, SolverType>::getFluidMatrix ( matrix_Type& matrixFull )
1769 M_matrixNoBC->globalAssemble();
1770 matrixFull += *M_matrixNoBC;
1773 template<
typename MeshType,
typename SolverType>
1775 OseenSolver<MeshType, SolverType>::postProcessingSetArea()
1777 M_postProcessing->set_area();
1780 template<
typename MeshType,
typename SolverType>
1782 OseenSolver<MeshType, SolverType>::postProcessingSetNormal()
1784 M_postProcessing->set_normal();
1787 template<
typename MeshType,
typename SolverType>
1789 OseenSolver<MeshType, SolverType>::postProcessingSetPhi()
1791 M_postProcessing->set_phi();
1794 template<
typename MeshType,
typename SolverType>
1798 return flux ( flag, *M_solution );
1801 template<
typename MeshType,
typename SolverType>
1804 const vector_Type& solution )
1806 vector_Type velocityAndPressure ( solution, Repeated, Add );
1807 vector_Type velocity (
this->M_velocityFESpace.map(),
Repeated );
1808 velocity.subset ( velocityAndPressure );
1810 return M_postProcessing->flux ( velocity, flag );
1813 template<
typename MeshType,
typename SolverType>
1815 OseenSolver<MeshType, SolverType>::kineticNormalStress (
const markerID_Type& flag )
1817 return kineticNormalStress ( flag, *M_solution );
1820 template<
typename MeshType,
typename SolverType>
1822 OseenSolver<MeshType, SolverType>::kineticNormalStress (
const markerID_Type& flag,
1823 const vector_Type& solution )
1825 vector_Type velocityAndPressure ( solution, Repeated, Add );
1826 vector_Type velocity (
this->M_velocityFESpace.map(),
Repeated );
1827 velocity.subset ( velocityAndPressure );
1829 return M_postProcessing->kineticNormalStress ( velocity, M_oseenData->density(), flag );
1832 template<
typename MeshType,
typename SolverType>
1836 return M_postProcessing->measure ( flag );
1839 template<
typename MeshType,
typename SolverType>
1843 return M_postProcessing->normal ( flag );
1846 template<
typename MeshType,
typename SolverType>
1848 OseenSolver<MeshType, SolverType>::geometricCenter (
const markerID_Type& flag )
1850 return M_postProcessing->geometricCenter ( flag );
1853 template<
typename MeshType,
typename SolverType>
1857 return pressure ( flag, *M_solution );
1860 template<
typename MeshType,
typename SolverType>
1863 const vector_Type& solution)
1865 vector_Type velocityAndPressure ( solution, Repeated, Add );
1866 vector_Type pressure (
this->M_pressureFESpace.map(),
Repeated );
1867 pressure.subset ( velocityAndPressure,
1868 this->M_velocityFESpace.dim() *
this->M_velocityFESpace.fieldDim() );
1871 return M_postProcessing->average ( pressure, flag, 1 ) [0];
1874 template<
typename MeshType,
typename SolverType>
1876 OseenSolver<MeshType, SolverType>::meanNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler )
1878 return meanNormalStress ( flag, bcHandler, *M_solution );
1881 template<
typename MeshType,
typename SolverType>
1883 OseenSolver<MeshType, SolverType>::meanNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler,
const vector_Type& solution )
1887 return -lagrangeMultiplier ( flag, bcHandler, solution );
1891 #ifdef HAVE_LIFEV_DEBUG 1892 M_Displayer.leaderPrint (
" !!! WARNING - OseenSolver::meanNormalStress( flag, bcHandler, solution) is returning an approximation \n" );
1894 return -pressure ( flag, solution );
1900 template<
typename MeshType,
typename SolverType>
1902 OseenSolver<MeshType, SolverType>::meanTotalNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler )
1904 return meanTotalNormalStress ( flag, bcHandler, *M_solution );
1907 template<
typename MeshType,
typename SolverType>
1909 OseenSolver<MeshType, SolverType>::meanTotalNormalStress (
const markerID_Type& flag, bcHandler_Type& bcHandler,
const vector_Type& solution )
1911 return meanNormalStress ( flag, bcHandler, solution ) - kineticNormalStress ( flag, solution );
1914 template<
typename MeshType,
typename SolverType>
1916 OseenSolver<MeshType, SolverType>::lagrangeMultiplier (
const markerID_Type& flag, bcHandler_Type& bcHandler )
1918 return lagrangeMultiplier ( flag, bcHandler, *M_solution );
1921 template<
typename MeshType,
typename SolverType>
1923 OseenSolver<MeshType, SolverType>::lagrangeMultiplier (
const markerID_Type& flag,
1924 bcHandler_Type& bcHandler,
1925 const vector_Type& solution )
1928 std::vector< bcName_Type > fluxBCVector = bcHandler.findAllBCWithType ( Flux );
1929 bcName_Type fluxbcName_Type = bcHandler.findBCWithFlag ( flag ).name();
1932 vector_Type velocityPressureLambda ( solution, Repeated, Add );
1935 for ( UInt lmIndex = 0; lmIndex <
static_cast <UInt> ( fluxBCVector.size() ); ++lmIndex )
1936 if ( fluxbcName_Type.compare ( fluxBCVector[ lmIndex ] ) == 0 )
1937 return velocityPressureLambda[M_velocityFESpace.fieldDim() * M_velocityFESpace.dof().numTotalDof()
1938 + M_pressureFESpace.dof().numTotalDof() + lmIndex];
1941 M_Displayer.leaderPrint (
"!!! Warning - Lagrange multiplier for Flux BC not found!\n" );
1945 template<
typename MeshType,
typename SolverType>
1947 OseenSolver<MeshType, SolverType>::removeMean ( vector_Type& x )
1953 const UInt numVelocityComponent ( M_velocityFESpace.fieldDim() );
1954 const UInt velocityTotalDof ( M_velocityFESpace.dof().numTotalDof() );
1957 if ( M_pressureMatrixMass.get() == 0 )
1959 M_pressureMatrixMass.reset (
new matrix_Type ( M_localMap ) );
1962 for (
UInt iElement = 0; iElement < M_velocityFESpace.mesh()->numElements(); iElement++ )
1966 M_pressureFESpace.fe().update ( M_pressureFESpace.mesh()->element ( iElement ) );
1968 M_elementMatrixPreconditioner.zero();
1971 AssemblyElemental::mass ( 1, M_elementMatrixPreconditioner, M_pressureFESpace.fe(), 0, 0, M_velocityFESpace.fieldDim() );
1975 assembleMatrix ( *M_pressureMatrixMass,
1976 M_elementMatrixPreconditioner,
1977 M_pressureFESpace.fe(),
1978 M_pressureFESpace.fe(),
1979 M_pressureFESpace.dof(),
1980 M_pressureFESpace.dof(),
1981 numVelocityComponent,
1982 numVelocityComponent,
1983 numVelocityComponent * velocityTotalDof,
1984 numVelocityComponent * velocityTotalDof );
1988 M_pressureMatrixMass->globalAssemble();
1990 vector_Type ones ( *M_solution );
1994 mean = ones * ( M_pressureMatrixMass * x );
1997 ASSERT ( std::fabs ( ones * ( M_pressureMatrixMass * x ) ) < 1e-9 ,
"after removeMean the mean pressure should be zero!");
2003 template<
typename MeshType,
typename SolverType>
2005 OseenSolver<MeshType, SolverType>::applyBoundaryConditions ( matrix_Type& matrix,
2006 vector_Type& rightHandSide,
2007 bcHandler_Type& bcHandler )
2014 bcHandler.bcUpdate ( *M_velocityFESpace.mesh(),
2015 M_velocityFESpace.feBd(),
2016 M_velocityFESpace.dof() );
2022 vector_Type rightHandSideFull ( rightHandSide,
Unique );
2024 bcManage ( matrix, rightHandSideFull,
2025 *M_velocityFESpace.mesh(),
2026 M_velocityFESpace.dof(),
2028 M_velocityFESpace.feBd(),
2030 M_oseenData->dataTime()->time() );
2032 rightHandSide = rightHandSideFull;
2036 matrix.diagonalize ( M_velocityFESpace.fieldDim() *dimVelocity(),
2049 template<
typename MeshType,
typename SolverType>
2051 OseenSolver<MeshType, SolverType>::setupPostProc( )
2053 M_postProcessing.reset (
new PostProcessingBoundary<mesh_Type> ( M_velocityFESpace.mesh(),
2054 &M_velocityFESpace.feBd(),
2055 &M_velocityFESpace.dof(),
2056 &M_pressureFESpace.feBd(),
2057 &M_pressureFESpace.dof(),
2061 template<
typename MeshType,
typename SolverType>
2063 OseenSolver<MeshType, SolverType>::setTolMaxIteration (
const Real& tolerance,
const Int& maxIteration )
2065 M_linearSolver->setTolerance ( tolerance );
2066 M_linearSolver->setMaxNumIterations ( maxIteration );
BCBase & findBCWithFlag(const bcFlag_Type &aFlag)
Extract a BC in the list according to its flag.
double operator()(const char *VarName, const double &Default) const
bcType_Type type() const
Returns the boundary condition type.
void start()
Start the timer.
SolverAztecOO - Class to wrap linear solver.
BCHandler - class for handling boundary conditions.
const commPtr_Type & comm() const
Get the communicator.
int32_type Int
Generic integer data.
ID markerID_Type
markerID_Type is the type used to store the geometric entity marker IDs
void updateInverseJacobian(const UInt &iQuadPt)
bool hasOnlyEssential() const
Determine whether all the stored boundary conditions have EssentialXXX type.
Epetra_Import const & importer()
Getter for the Epetra_Import.
Real diff()
Compute the difference in time between start and stop.
double Real
Generic real data.
int operator()(const char *VarName, int Default) const
const UInt nDimensions(NDIM)
void stop()
Stop the timer.
bool bcUpdateDone() const
Determine whether bcUpdate has been done before.
bool operator()(const char *VarName, bool Default) const
Displayer - This class is used to display messages in parallel simulations.
uint32_type UInt
generic unsigned integer (used mainly for addressing)