LifeV
3d/darcy.cpp
Go to the documentation of this file.
1 //@HEADER
2 /*
3 *******************************************************************************
4 
5  Copyright (C) 2004, 2005, 2007 EPFL, Politecnico di Milano, INRIA
6  Copyright (C) 2010 EPFL, Politecnico di Milano, Emory University
7 
8  This file is part of LifeV.
9 
10  LifeV is free software; you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  LifeV is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with LifeV. If not, see <http://www.gnu.org/licenses/>.
22 
23 *******************************************************************************
24 */
25 //@HEADER
26 /**
27  @file darcy.cpp
28  @author A. Fumagalli <alessio.fumagalli@mail.polimi.it>
29  @date 2012-06-13
30  */
31 
32 // ===================================================
33 //! Includes
34 // ===================================================
35 
36 #include "darcy.hpp"
37 #include "user_fun.hpp"
38 
39 // ===================================================
40 //! Namespaces & define
41 // ===================================================
42 
43 using namespace LifeV;
44 
45 // ===================================================
46 //! Standard functions
47 // ===================================================
48 
49 Real UOne ( const Real& /* t */,
50  const Real& /* x */,
51  const Real& /* y */,
52  const Real& /* z */,
53  const ID& /* icomp */)
54 {
55  return 1.;
56 }
57 
58 // ===================================================
59 //! Private Members
60 // ===================================================
61 
63 {
64  Private() {}
65 
66  // Policy for scalar functions
67  typedef std::function < Real ( const Real&, const Real&,
68  const Real&, const Real&, const ID& ) >
70 
74 
76 
77  // Function Types
78 
80  {
81  fct_type f;
82  f = std::bind ( &UOne, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5 );
83  return f;
84  }
85 
87  {
88  fct_type f;
89  f = std::bind ( &dataProblem::analyticalSolution, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5 );
90  return f;
91  }
92 
94  {
95  fct_type f;
96  f = std::bind ( &dataProblem::analyticalFlux, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5 );
97  return f;
98  }
99 
100 };
101 
102 // ===================================================
103 //! Constructors
104 // ===================================================
105 
106 darcy_linear::darcy_linear ( int argc, char** argv )
107  : Members ( new Private )
108 {
109  GetPot command_line (argc, argv);
110  Members->data_file_name = command_line.follow ("data", 2, "-f", "--file");
111  Members->xml_file_name = command_line.follow ("parameterList.xml", "--xml");
112 
113  GetPot dataFile ( Members->data_file_name );
114 
115  Members->discretization_section = "darcy";
116 
117 #ifdef EPETRA_MPI
118  Members->comm.reset ( new Epetra_MpiComm ( MPI_COMM_WORLD ) );
119 #else
120  Members->comm.reset ( new Epetra_SerialComm() );
121 #endif
122 
123 }
124 
125 // ===================================================
126 //! Methods
127 // ===================================================
128 
129 Real
131 {
132  using namespace dataProblem;
133 
134  // Life chonos
135  LifeChrono chronoTotal;
136  LifeChrono chronoReadAndPartitionMesh;
137  LifeChrono chronoBoundaryCondition;
138  LifeChrono chronoFiniteElementSpace;
139  LifeChrono chronoProblem;
140  LifeChrono chronoProcess;
141  LifeChrono chronoError;
142 
143  // Displayer to print on screen
144  std::shared_ptr < Displayer > displayer ( new Displayer ( Members->comm ) );
145 
146  // Start chronoTotal for measure the total time for the computation
147  chronoTotal.start();
148 
149  // Reading from data file
150  GetPot dataFile ( Members->data_file_name.c_str() );
151 
152  //
153  // The Darcy Solver
154  //
155 
156  displayer->leaderPrint ( "The Darcy solver\n" );
157 
158  // Start chronoReadAndPartitionMesh for measure the total time for the creation of the local meshes
159  chronoReadAndPartitionMesh.start();
160 
161  // Create the data file
162  darcyDataPtr_Type darcyData ( new darcyData_Type );
163 
164  // Set up the data
165  darcyData->setup ( dataFile );
166 
167  // Create a Teuchos parameter list for the linear algebra.
168  darcyData_Type::paramListPtr_Type linearAlgebraList = Teuchos::rcp ( new darcyData_Type::paramList_Type );
169  linearAlgebraList = Teuchos::getParametersFromXmlFile ( Members->xml_file_name );
170 
171  // Set the parameter list into the data darcy.
172  darcyData->setLinearAlgebraList ( linearAlgebraList );
173 
174  // Create the mesh file handler
175  MeshData meshData;
176 
177  // Set up the mesh file
178  meshData.setup ( dataFile, Members->discretization_section + "/space_discretization");
179 
180  // Create the the mesh
181  regionMeshPtr_Type fullMeshPtr ( new regionMesh_Type ( Members->comm ) );
182 
183  // Select if the mesh is structured or not
184  if ( meshData.meshType() != "structured" )
185  {
186  // Set up the mesh
187  readMesh ( *fullMeshPtr, meshData );
188  }
189  else
190  {
191  // Section of the structured mesh
192  const std::string structuredSection = Members->discretization_section + "/space_discretization/";
193 
194  // Set up the structured mesh
195  regularMesh3D ( *fullMeshPtr, 0,
196  dataFile ( ( structuredSection + "nx" ).data(), 4 ),
197  dataFile ( ( structuredSection + "ny" ).data(), 4 ),
198  dataFile ( ( structuredSection + "nz" ).data(), 4 ),
199  dataFile ( ( structuredSection + "verbose" ).data(), false ),
200  dataFile ( ( structuredSection + "lx" ).data(), 1. ),
201  dataFile ( ( structuredSection + "ly" ).data(), 1. ),
202  dataFile ( ( structuredSection + "lz" ).data(), 1. ) );
203  }
204 
205  // Create the local mesh ( local scope used to delete the meshPart object )
206  regionMeshPtr_Type meshPtr;
207  {
208  // Create the partitioner
209  MeshPartitioner< regionMesh_Type > meshPart;
210 
211  // Partition the mesh using ParMetis
212  meshPart.doPartition ( fullMeshPtr, Members->comm );
213 
214  // Get the local mesh
215  meshPtr = meshPart.meshPartition();
216  }
217 
218  // Stop chronoReadAndPartitionMesh
219  chronoReadAndPartitionMesh.stop();
220 
221  // The leader process print chronoReadAndPartitionMesh
222  displayer->leaderPrint ( "Time for read and partition the mesh ",
223  chronoReadAndPartitionMesh.diff(), "\n" );
224 
225  // Create the boundary conditions
226 
227  // Start chronoBoundaryCondition for measure the total time for create the boundary conditions
228  chronoBoundaryCondition.start();
229 
230  bcHandlerPtr_Type bcDarcy ( new bcHandler_Type );
231 
232  setBoundaryConditions ( bcDarcy );
233 
234  // Stop chronoBoundaryCondition
235  chronoBoundaryCondition.stop();
236 
237  // The leader process print chronoBoundaryCondition
238  displayer->leaderPrint ( "Time for create the boundary conditions handler ",
239  chronoBoundaryCondition.diff(), "\n" );
240 
241  // Create the solution spaces
242 
243  // Start chronoFiniteElementSpace for measure the total time for create the finite element spaces
244  chronoFiniteElementSpace.start();
245 
246  // Primal solution parameters
247  const ReferenceFE* refFE_primal ( static_cast<ReferenceFE*> (NULL) );
248  const QuadratureRule* qR_primal ( static_cast<QuadratureRule*> (NULL) );
249  const QuadratureRule* bdQr_primal ( static_cast<QuadratureRule*> (NULL) );
250 
251  refFE_primal = &feTetraP0;
252  qR_primal = &quadRuleTetra15pt;
253  bdQr_primal = &quadRuleTria4pt;
254 
255  // Dual solution parameters
256  const ReferenceFE* refFE_dual ( static_cast<ReferenceFE*> (NULL) );
257  const QuadratureRule* qR_dual ( static_cast<QuadratureRule*> (NULL) );
258  const QuadratureRule* bdQr_dual ( static_cast<QuadratureRule*> (NULL) );
259 
260  refFE_dual = &feTetraRT0;
261  qR_dual = &quadRuleTetra15pt;
262  bdQr_dual = &quadRuleTria4pt;
263 
264  // Interpolate of dual solution parameters
265  const ReferenceFE* refFE_dualInterpolate ( static_cast<ReferenceFE*> (NULL) );
266  const QuadratureRule* qR_dualInterpolate ( static_cast<QuadratureRule*> (NULL) );
267  const QuadratureRule* bdQr_dualInterpolate ( static_cast<QuadratureRule*> (NULL) );
268 
269  refFE_dualInterpolate = &feTetraP0;
270  qR_dualInterpolate = &quadRuleTetra15pt;
271  bdQr_dualInterpolate = &quadRuleTria4pt;
272 
273  // Hybrid solution parameters
274  // hybrid
275  const ReferenceFE* refFE_hybrid ( static_cast<ReferenceFE*> (NULL) );
276  const QuadratureRule* qR_hybrid ( static_cast<QuadratureRule*> (NULL) );
277  const QuadratureRule* bdQr_hybrid ( static_cast<QuadratureRule*> (NULL) );
278 
279  refFE_hybrid = &feTetraRT0Hyb;
280  qR_hybrid = &quadRuleTetra15pt;
281  bdQr_hybrid = &quadRuleTria4pt;
282 
283 
284  // Finite element space of the primal variable
285  fESpacePtr_Type p_FESpacePtr ( new fESpace_Type ( meshPtr, *refFE_primal, *qR_primal,
286  *bdQr_primal, 1, Members->comm ) );
287 
288  // Finite element space of the dual variable
289  fESpacePtr_Type u_FESpacePtr ( new fESpace_Type ( meshPtr, *refFE_dual, *qR_dual,
290  *bdQr_dual, 1, Members->comm ) );
291 
292  // Finite element space of the hybrid variable
293  fESpacePtr_Type hybrid_FESpacePtr ( new fESpace_Type ( meshPtr, *refFE_hybrid, *qR_hybrid,
294  *bdQr_hybrid, 1, Members->comm ) );
295 
296  // Finite element space of the interpolation of dual variable
297  fESpacePtr_Type uInterpolate_FESpacePtr ( new fESpace_Type ( meshPtr, *refFE_dualInterpolate, *qR_dualInterpolate,
298  *bdQr_dualInterpolate, 3, Members->comm ) );
299 
300  // Stop chronoFiniteElementSpace
301  chronoFiniteElementSpace.stop();
302 
303  // The leader process print chronoFiniteElementSpace
304  displayer->leaderPrint ( "Time for create the finite element spaces ",
305  chronoFiniteElementSpace.diff(), "\n" );
306 
307  // Start chronoProblem for measure the total time for create the problem
308  chronoProblem.start();
309 
310  // Instantiation of the DarcySolver class
311  darcySolver_Type darcySolver;
312 
313  // Stop chronoProblem
314  chronoProblem.stop();
315 
316  // The leader process print chronoProblem
317  displayer->leaderPrint ( "Time for create the problem ", chronoProblem.diff(), "\n" );
318 
319  // Process the problem
320 
321  // Start chronoProcess for measure the total time for the simulation
322  chronoProcess.start ();
323 
324  // Set the data for the solver.
325  darcySolver.setData ( darcyData );
326 
327  // Set the displayer.
328  darcySolver.setDisplayer ( displayer );
329 
330  // Setup phase for the linear solver
331  darcySolver.setup ();
332 
333  // Create the fields for the solver
334 
335  // Scalar field for primal variable
336  scalarFieldPtr_Type primalField ( new scalarField_Type ( p_FESpacePtr ) );
337 
338  // Scalar field for dual variable
339  scalarFieldPtr_Type dualField ( new scalarField_Type ( u_FESpacePtr ) );
340 
341  // Scalar field for hybrid variable
342  scalarFieldPtr_Type hybridField ( new scalarField_Type ( hybrid_FESpacePtr ) );
343 
344  // Vector for the interpolated dual solution
345  vectorFieldPtr_Type dualInterpolated ( new vectorField_Type ( uInterpolate_FESpacePtr, Repeated ) );
346 
347  // Set the field for the solver
348 
349  // Set the h
350  darcySolver.setHybridField ( hybridField );
351 
352  // Set the primal field
353  darcySolver.setPrimalField ( primalField );
354 
355  // Set the dual field
356  darcySolver.setDualField ( dualField );
357 
358  // Set the source term
359  scalarFctPtr_Type scalarSourceFct ( new scalarSource );
360  darcySolver.setScalarSource ( scalarSourceFct );
361 
362  // Set the vector source term
363  vectorFctPtr_Type vectorSourceFct ( new vectorSource );
364  darcySolver.setVectorSource ( vectorSourceFct );
365 
366  // Set the reaction term
367  scalarFctPtr_Type reactionTermFct ( new reactionTerm );
368  darcySolver.setReactionTerm ( reactionTermFct );
369 
370  // Set the inverse of the permeability
371  matrixFctPtr_Type inversePermeabilityFct ( new inversePermeability );
372  darcySolver.setInversePermeability ( inversePermeabilityFct );
373 
374  // Set the boudary conditions
375  darcySolver.setBoundaryConditions ( bcDarcy );
376 
377  // Set the exporter for the solution
378  std::shared_ptr< Exporter< regionMesh_Type > > exporter;
379 
380  // Shared pointer used in the exporter for the primal solution
381  vectorPtr_Type primalExporter;
382 
383  // Shared pointer used in the exporter for the error of the primal solution
384  vectorPtr_Type primalErrorExporter;
385 
386  // Shared pointer used for the exact primal solution
387  vectorPtr_Type primalExact;
388 
389  // Shared pointer used in the exporter for the dual solution
390  vectorPtr_Type dualExporter;
391 
392  // Shared pointer used in the exporter for the error of the dual solution
393  vectorPtr_Type dualErrorExporter;
394 
395  // Shared pointer used for the exact dual solution
396  vectorPtr_Type dualExact;
397 
398  // Type of the exporter
399  std::string const exporterType = dataFile ( "exporter/type", "none" );
400 
401  // The name of the file
402  const std::string exporterFileName = dataFile ( "exporter/file_name", "PressureVelocity" );
403 
404  // Choose the exporter
405 #ifdef HAVE_HDF5
406  if ( exporterType.compare ("hdf5") == 0 )
407  {
408  exporter.reset ( new ExporterHDF5 < regionMesh_Type > ( dataFile, exporterFileName ) );
409  }
410  else
411 #endif
412  {
413  exporter.reset ( new ExporterEmpty < regionMesh_Type > ( dataFile, exporterFileName ) );
414  }
415 
416  // Set directory where to save the solution
417  exporter->setPostDir ( dataFile ( "exporter/folder", "./" ) );
418 
419  exporter->setMeshProcId ( meshPtr, Members->comm->MyPID() );
420 
421  // Set the exporter primal pointer
422  primalExporter.reset ( new vector_Type ( primalField->getVector(), exporter->mapType() ) );
423 
424  // Add the primal variable to the exporter
425  exporter->addVariable ( ExporterData < regionMesh_Type >::ScalarField,
426  dataFile ( "exporter/name_primal", "Pressure" ),
427  p_FESpacePtr,
428  primalExporter,
429  static_cast<UInt> ( 0 ),
430  ExporterData < regionMesh_Type >::SteadyRegime,
431  ExporterData < regionMesh_Type >::Cell );
432 
433  // Set the exporter dual pointer
434  dualExporter.reset ( new vector_Type ( dualInterpolated->getVector(), exporter->mapType() ) );
435 
436  // Add the variable to the exporter
437  exporter->addVariable ( ExporterData < regionMesh_Type >::VectorField,
438  dataFile ( "exporter/name_dual", "Velocity" ),
439  uInterpolate_FESpacePtr,
440  dualExporter,
441  static_cast<UInt> ( 0 ),
442  ExporterData < regionMesh_Type >::SteadyRegime,
443  ExporterData < regionMesh_Type >::Cell );
444 
445  // Set the exporter to the error of the primal pointer
446  primalErrorExporter.reset ( new vector_Type ( primalField->getVector(), exporter->mapType() ) );
447 
448  // Set the primal exact pointer
449  primalExact.reset ( new vector_Type ( primalField->getVector(), exporter->mapType() ) );
450 
451  // Add the error of the primal variable to the exporter
452  exporter->addVariable ( ExporterData < regionMesh_Type >::ScalarField,
453  dataFile ( "exporter/name_primal", "Pressure" ) + std::string ("Error"),
454  p_FESpacePtr,
455  primalErrorExporter,
456  static_cast<UInt> ( 0 ),
457  ExporterData < regionMesh_Type >::SteadyRegime,
458  ExporterData < regionMesh_Type >::Cell );
459 
460  // Set the exporter to the error of the dual pointer
461  dualErrorExporter.reset ( new vector_Type ( dualInterpolated->getVector(), exporter->mapType() ) );
462 
463  // Set the primal exact pointer
464  dualExact.reset ( new vector_Type ( dualInterpolated->getVector(), exporter->mapType() ) );
465 
466  // Add the error of the primal variable to the exporter
467  exporter->addVariable ( ExporterData < regionMesh_Type >::VectorField,
468  dataFile ( "exporter/name_dual", "Velocity" ) + std::string ("Error"),
469  uInterpolate_FESpacePtr,
470  dualErrorExporter,
471  static_cast<UInt> ( 0 ),
472  ExporterData < regionMesh_Type >::SteadyRegime,
473  ExporterData < regionMesh_Type >::Cell );
474 
475  // Display the total number of unknowns
476  displayer->leaderPrint ( "Number of unknowns : ",
477  hybrid_FESpacePtr->map().map ( Unique )->NumGlobalElements(), "\n" );
478 
479  // Export the partitioning
480  exporter->exportPID ( meshPtr, Members->comm );
481 
482  // Solve the problem
483  darcySolver.solve ();
484 
485  // Save the solution
486 
487  // Copy the primal solution to the exporter
488  *primalExporter = primalField->getVector ();
489 
490  // Interpolate the dual vector field spammed as Raviart-Thomas into a P0 vector field
491  dualInterpolated->getVector() = uInterpolate_FESpacePtr->feToFEInterpolate ( *u_FESpacePtr, dualField->getVector() );
492 
493  // Copy the dual interpolated solution to the exporter
494  *dualExporter = dualInterpolated->getVector();
495 
496  // Interpolate the exact primal solution
497  p_FESpacePtr->interpolate ( Members->getAnalyticalSolution(), *primalExact );
498 
499  // Copy the error of the primal solution to the exporter
500  *primalErrorExporter = *primalExact - primalField->getVector ();
501 
502  // Interpolate the exact dual solution
503  uInterpolate_FESpacePtr->interpolate ( Members->getAnalyticalFlux(), *dualExact );
504 
505  // Copy the error of the dual solution to the exporter
506  *dualErrorExporter = *dualExact - *dualExporter;
507 
508  // Save the solution into the exporter
509  exporter->postProcess ( static_cast<Real> (0) );
510 
511  // Stop chronoProcess
512  chronoProcess.stop();
513 
514  // The leader process print chronoProcess
515  displayer->leaderPrint ( "Time for process ", chronoProcess.diff(), "\n" );
516 
517  // Compute the errors
518  // For non time dependences problem the time where the errors are computed is useless,
519  // but thanks to common interface we handle both cases.
520 
521  // Start chronoError for measure the total time for computing the errors.
522  chronoError.start();
523 
524  // Compute the error L2 norms
525  Real primalL2Norm (0), exactPrimalL2Norm (0), primalL2Error (0), primalL2RelativeError (0);
526  Real dualL2Norm (0), exactDualL2Norm (0), dualL2Error (0), dualL2RelativeError (0);
527 
528  // Norms and errors for the pressure
529  displayer->leaderPrint ( "\nPRESSURE ERROR\n" );
530 
531  // Compute the L2 norm for the primal solution
532  primalL2Norm = p_FESpacePtr->l2Norm ( primalField->getVector () );
533 
534  // Display the L2 norm for the primal solution
535  displayer->leaderPrint ( " L2 norm of primal unknown: ", primalL2Norm, "\n" );
536 
537  // Compute the L2 norm for the analytical primal
538  exactPrimalL2Norm = p_FESpacePtr->l2NormFunction ( Members->getAnalyticalSolution(),
539  darcyData->dataTimePtr()->endTime() );
540 
541  // Display the L2 norm for the analytical primal
542  displayer->leaderPrint ( " L2 norm of primal exact: ", exactPrimalL2Norm, "\n" );
543 
544  // Compute the L2 error for the primal solution
545  primalL2Error = p_FESpacePtr->l2ErrorWeighted ( Members->getAnalyticalSolution(),
546  primalField->getVector(),
547  Members->getUOne(),
548  darcyData->dataTimePtr()->endTime() );
549 
550  // Display the L2 error for the primal solution
551  displayer->leaderPrint ( " L2 error of primal unknown: ", primalL2Error, "\n" );
552 
553  // Compute the L2 realative error for the primal solution
554  primalL2RelativeError = primalL2Error / exactPrimalL2Norm;
555 
556  // Display the L2 relative error for the primal solution
557  displayer->leaderPrint ( " L2 relative error of primal unknown: ", primalL2RelativeError, "\n" );
558 
559  // Norms and errors for the interpolated dual
560  displayer->leaderPrint ( "\nINTERPOLATED DARCY VELOCITY ERROR\n" );
561 
562  // Compute the L2 norm for the interpolated dual solution
563  dualL2Norm = uInterpolate_FESpacePtr->l2Norm ( dualInterpolated->getVector() );
564 
565  // Display the L2 norm for the interpolated dual solution
566  displayer->leaderPrint ( " L2 norm of dual unknown: ", dualL2Norm, "\n" );
567 
568  // Compute the L2 norm for the analytical dual
569  exactDualL2Norm = uInterpolate_FESpacePtr->l2NormFunction ( Members->getAnalyticalFlux(),
570  darcyData->dataTimePtr()->endTime() );
571 
572  // Display the L2 norm for the analytical dual
573  displayer->leaderPrint ( " L2 norm of dual exact: ", exactDualL2Norm, "\n" );
574 
575  // Compute the L2 error for the dual solution
576  dualL2Error = uInterpolate_FESpacePtr->l2Error ( Members->getAnalyticalFlux(),
577  dualInterpolated->getVector(),
578  darcyData->dataTimePtr()->endTime(),
579  NULL );
580 
581  // Display the L2 error for the dual solution
582  displayer->leaderPrint ( " L2 error of dual unknown: ", dualL2Error, "\n" );
583 
584  // Compute the L2 relative error for the dual solution
585  dualL2RelativeError = dualL2Error / exactDualL2Norm;
586 
587  // Display the L2 relative error for the dual solution
588  displayer->leaderPrint ( " L2 relative error of Dual unknown: ", dualL2RelativeError, "\n" );
589 
590  // Stop chronoError
591  chronoError.stop();
592 
593  // The leader process print chronoError
594  displayer->leaderPrint ( "Time for compute errors ", chronoError.diff(), "\n" );
595 
596  // Stop chronoTotal
597  chronoTotal.stop();
598 
599  // The leader process print chronoTotal
600  displayer->leaderPrint ( "Total time for the computation ", chronoTotal.diff(), "\n" );
601 
602  // Return the error, needed for the succes/failure of the test
603  return primalL2Error;
604 
605 } // run
Real UOne(const Real &, const Real &, const Real &, const Real &, const ID &)
Standard functions.
Definition: 3d/darcy.cpp:49
LifeV::Real run()
To lunch the simulation.
Definition: 3d/darcy.cpp:130
Includes.
Definition: 3d/darcy.hpp:152
darcySolver_Type::dataPtr_Type darcyDataPtr_Type
std::string discretization_section
Definition: 3d/darcy.cpp:73
std::string xml_file_name
Definition: 3d/darcy.cpp:72
fct_type getAnalyticalFlux()
Definition: 3d/darcy.cpp:93
fct_type getAnalyticalSolution()
Definition: 3d/darcy.cpp:86
std::string data_file_name
Definition: 3d/darcy.cpp:71
darcy_linear(int argc, char **argv)
Constructor.
Definition: 3d/darcy.cpp:106
uint32_type ID
IDs.
Definition: LifeV.hpp:194
Private Members.
Definition: 3d/darcy.cpp:62
double Real
Generic real data.
Definition: LifeV.hpp:175
std::shared_ptr< Epetra_Comm > comm
Definition: 3d/darcy.cpp:75
std::function< Real(const Real &, const Real &, const Real &, const Real &, const ID &) > fct_type
Definition: 3d/darcy.cpp:69
fct_type getUOne()
Definition: 3d/darcy.cpp:79