LifeV
FSIOperator.hpp
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 /*!
28  @file
29  @brief Pure virtual operator class for FSI solvers
30 
31  @author Simone Deparis <simone.deparis@epfl.ch>
32  @contributor Gilles Fourestey <fourestey@cscs.ch>
33  @contributor Paolo Crosetto <paolo.crosetto@epfl.ch>
34  @maintainer Paolo Crosetto <paolo.crosetto@epfl.ch>
35 
36  @date 10-12-2010
37 
38  This is the base class for the FSI solvers in LifeV. It contains the methods to evaluate the residual and compute the
39  Jacobian matrix, which make it suited for the generalized Newton algorithm implemented in NonlinearRichardson.hpp. The fluid
40  and structure classes are members of this class and different formulations (e.g. Monolithic \cite CrosettoEtAl2009 , segregated
41  Newton \cite FernandezMoubachir2005 , Dirichlet--Neumann \cite DeparisDiscacciati2006 , Robin Neumann \cite BadiaNobileVergara2008 ) are implemented in the derived classes.
42 
43  */
44 
45 
46 #ifndef FSIOPERATOR_H
47 #define FSIOPERATOR_H
48 
49 #include <Epetra_ConfigDefs.h>
50 #ifdef EPETRA_MPI
51 #include <Epetra_MpiComm.h>
52 #else
53 #include <Epetra_SerialComm.h>
54 #endif
55 
56 
57 #include <lifev/core/util/Factory.hpp>
58 #include <lifev/core/util/FactorySingleton.hpp>
59 
60 #include <lifev/core/mesh/MeshData.hpp>
61 #include <lifev/core/mesh/RegionMesh.hpp>
62 
63 #include <lifev/core/algorithm/NonLinearAitken.hpp>
64 
65 #include <lifev/structure/solver/StructuralOperator.hpp>
66 
67 #include <lifev/structure/solver/isotropic/VenantKirchhoffMaterialNonLinear.hpp>
68 #include <lifev/structure/solver/isotropic/VenantKirchhoffMaterialLinear.hpp>
69 #include <lifev/structure/solver/isotropic/ExponentialMaterialNonLinear.hpp>
70 #include <lifev/structure/solver/isotropic/NeoHookeanMaterialNonLinear.hpp>
71 #include <lifev/structure/solver/isotropic/VenantKirchhoffMaterialNonLinearPenalized.hpp>
72 #include <lifev/structure/solver/isotropic/SecondOrderExponentialMaterialNonLinear.hpp>
73 
74 #ifdef ENABLE_ANISOTROPIC_LAW
75 #include <lifev/structure/solver/anisotropic/HolzapfelMaterialNonLinear.hpp>
76 #include <lifev/structure/solver/anisotropic/HolzapfelGeneralizedMaterialNonLinear.hpp>
77 #endif
78 
79 #include <lifev/core/fem/DOFInterface3Dto3D.hpp>
80 #include <lifev/core/fem/DOFInterface3Dto2D.hpp>
81 #include <lifev/core/fem/BCHandler.hpp>
82 #include <lifev/core/fem/BCFunction.hpp>
83 #include <lifev/core/fem/TimeAdvanceBDF.hpp>
84 #include <lifev/core/fem/FESpace.hpp>
85 #include <lifev/eta/fem/ETFESpace.hpp>
86 
87 #ifdef HAVE_HDF5
88 #include <lifev/core/filter/ExporterHDF5Mesh3D.hpp>
89 #endif
90 
91 #include <lifev/fsi/solver/FSIData.hpp>
92 #include <lifev/navier_stokes/solver/OseenSolverShapeDerivative.hpp>
93 #include <lifev/fsi/solver/HarmonicExtensionSolver.hpp>
94 
95 namespace LifeV
96 {
97 /*!
98  @class FSIOperator
99  @brief Fluid-Structure Interface operator class
100 
101  This is the base class for the FSI solvers in LifeV. It contains the methods to evaluate the residual and compute the
102  Jacobian matrix, which make it suited for the generalized Newton algorithm implemented in NonlinearRichardson.hpp. The fluid
103  and structure classes are members of this class and different formulations (e.g. Monolithic \cite CrosettoEtAl2009 , segregated
104  Newton \cite FernandezMoubachir2005 , Dirichlet--Neumann \cite DeparisDiscacciati2006 , Robin Neumann \cite BadiaNobileVergara2008 ) are implemented in the derived classes.
105 
106  @see
107  FSIExactJacobian
108  FSIFixedPoint
109  FSIMonolithic
110 */
111 class FSIOperator
112 {
113 
114 public:
115 
116  /** @name Typedefs
117  */
118  //@{
119 
120  typedef RegionMesh<LinearTetra> mesh_Type;
121 #ifdef HAVE_HDF5
122  typedef ExporterHDF5Mesh3D<mesh_Type> meshFilter_Type;
123 #endif
124 
125  typedef OseenSolverShapeDerivative <mesh_Type> fluid_Type;
126  typedef StructuralOperator <mesh_Type> solid_Type;
127  typedef HarmonicExtensionSolver<mesh_Type> meshMotion_Type;
128  typedef OseenSolverShapeDerivative <mesh_Type> fluidLin_Type;
129  typedef StructuralOperator <mesh_Type> solidLin_Type;
130  typedef std::shared_ptr<fluid_Type> fluidPtr_Type;
131  typedef std::shared_ptr<solid_Type> solidPtr_Type;
132  typedef std::shared_ptr<meshMotion_Type> meshMotionPtr_Type;
133  typedef std::shared_ptr<fluidLin_Type> fluidLinPtr_Type;
134  typedef std::shared_ptr<solidLin_Type> solidLinPtr_Type;
135  typedef fluid_Type::vector_Type/*fluidPtr_Type::vector_Type*/ vector_Type;
136  typedef std::shared_ptr<vector_Type> vectorPtr_Type;
137  typedef vector_Type solution_Type;
138  typedef std::shared_ptr<solution_Type> solutionPtr_Type;
139  typedef fluid_Type::source_Type/*fluidPtr_Type::source_Type*/ fluidSource_Type;
140  typedef solid_Type::source_Type solidSource_Type;
141  typedef std::function < Real ( const Real&, const Real&,
142  const Real&, const Real&, const ID& ) > function_Type;
143  typedef Real ( *bcFunction_Type ) ( const Real&, const Real&,
144  const Real&, const Real&, const ID& );
145  typedef std::shared_ptr<DOFInterface3Dto3D> dofInterface3DPtr_Type;
146  typedef std::shared_ptr<DOFInterface3Dto2D> dofInterface2DPtr_Type;
147  typedef std::shared_ptr<BCVectorInterface> bcVectorInterfacePtr_Type;
148  typedef fluid_Type::bcHandlerPtr_Type/*fluidPtr_Type::bchandlerPtr_Type*/ fluidBchandlerPtr_Type;
149  typedef fluid_Type::bcHandler_Type/*fluidPtr_Type::bchandler_Type*/ fluidBchandler_Type;
150  typedef BCHandler solidBchandler_Type;
151  typedef std::shared_ptr<solidBchandler_Type> solidBchandlerPtr_Type;
152  typedef FSIData data_Type;
153  typedef std::shared_ptr<data_Type> dataPtr_Type;
154  typedef std::map<ID, ID>::const_iterator iterator_Type;
155  typedef FactorySingleton<Factory<FSIOperator, std::string> > FSIFactory_Type;
156  typedef Displayer::commPtr_Type/*Displayer::commPtr_Type*/ commPtr_Type;
157  typedef GetPot dataFile_Type;
158  typedef std::shared_ptr<dataFile_Type> dataFilePtr_Type;
159  //@}
160 
161 
162 
163  /** @name Constructors, Destructor
164  */
165  //@{
166 
167  FSIOperator();
168 
169  virtual ~FSIOperator();
170 
171  //@}
172 
173 
174  /** @name Virtual Public Methods
175  */
176  //@{
177 
178  //! initializes the GetPot data file
179  virtual void setDataFile ( const dataFile_Type& data );
180 
181  //! sets the space discretization parameters
182  /*!
183  The FE discretization is set accordingly to what specified in the FSIdata member (order of accuracy for the fluid
184  pressure, velocity and for the structure).
185  */
186  virtual void setupFEspace();
187 
188  //! partitions the meshes for the fluid and the structure
189  /**
190  This method is not called when the mesh partition is done offline
191  */
192  virtual void partitionMeshes();
193 
194 #ifdef HAVE_HDF5
195  //! reads the meshes already partitioned for the fluid and the structure
196  /**
197  The offline partitioning can avoid the call to partitionMesh and the memory overhead of saving the
198  entire unpartitioned mesh. The offline partitioned mesh must be saved in HDF5 format.
199  \TODO { This method still does not work for the partitioned algorithms }
200  */
201  void partitionMeshes ( meshFilter_Type& fluidMeshFilter, meshFilter_Type& solidMeshFilter );
202 #endif
203  //! sets up the correspondences between the fluid and structure degrees of freedom across the interface.
204  /**
205  This method introduces a non scalable loop, in DOFInterface3Dto3D. It is preferable to avoid it for massively
206  parallel computetions, using the offline partitioner. However it is much lighter that the correspondent
207  method for partitioned algorithms.
208  */
209  virtual void setupDOF();
210 
211 #ifdef HAVE_HDF5
212  //!reads from HDF5 file the correspondences between the fluid and structure degrees of freedom across the interface.
213  /*!still not implemented for all the FSI formulations*/
214  virtual void setupDOF ( meshFilter_Type& /*filterMesh*/ ) {}
215 #endif
216 
217  //! setup of the fluid and solid solver classes
218  /**
219  This method computes the number of fluxes assigned at the boundaries and calls setupFluidSolid(UInt fluxes)
220  */
221  virtual void setupFluidSolid();
222 
223  //! setup of the fluid and solid solver classes
224  /**
225  Fluid, solid and harmonic extension solvers are instantiated
226  */
227  virtual void setupFluidSolid ( UInt const fluxes );
228 
229  //! Setup method
230  /*!
231  the setup is called for the fluid, structure and harmonic extension solvers
232  */
233  virtual void setupSystem();
234 
235  //!Builds the local matrices
236  /**
237  The matrix for the harmonic extension, and the constant part of the matrices for the fluid and solid
238  solvers are built.
239  */
240  virtual void buildSystem();
241 
242  //!Updates the FSI system
243  /**
244  The system is updated for the next time iteration
245  */
246  virtual void updateSystem();
247 
248  //!Extrapolates an approximation of the solution
249  /**
250  Extrapolates the solution for the next time step. This method should be handled by a more general time-advance
251  class.
252  */
253  void couplingVariableExtrap( );
254 
255  //! solves the Jacobian system
256  /**
257  The implementation of this method distinguish the various FSI formulations which derive from this class.
258  For this reason it must be pure virtual, snd implemented in the child classes.
259  \param muk: unknown solution at the k-th nonlinear iteration
260  \param res: residual vector (the right hand side of the Jacobian system)
261  \param linearRelTol: tolerance for the nonlinear solver
262  */
263  virtual void solveJac ( vector_Type& muk,
264  const vector_Type& res,
265  const Real linearRelTol ) = 0;
266 
267  //! Evaluates the nonlinear residual of the FSI system
268  /**
269  The implementation of this method also depends on the child classes, though it does not characterize them.
270  \param res: residual vector to be computed
271  \param disp: current unknown solution
272  \param iter: nonlinear iteration counter. The part of th rhs related to the time discretization is computed only for iter=0
273  */
274  virtual void evalResidual ( vector_Type& res, const vector_Type& disp, const UInt iter ) = 0;
275 
276  //! Update the solution after NonLinearRichardson is called.
277  /*!
278  * Eventually it can update also some post-processing quantity.
279  */
280  virtual void updateSolution ( const vector_Type& solution );
281 
282  //! Set vectors for restart
283  /*!
284  * Set vectors for restart
285  */
286  virtual void setVectorInStencils ( const vectorPtr_Type& /*vel*/,
287  const vectorPtr_Type& /*pressure*/,
288  const vectorPtr_Type& /*solidDisp*/,
289  // const vectorPtr_Type& /*fluidDisp*/,
290  const UInt /*iter*/) {}
291 
292  virtual void setFluidVectorInStencil ( const vectorPtr_Type& /*vel*/, const vectorPtr_Type& /*pressure*/, const UInt /*iter*/) {}
293 
294  virtual void setSolidVectorInStencil ( const vectorPtr_Type& /*solidDisp*/, const UInt /*iter*/) {}
295 
296  virtual void setALEVectorInStencil ( const vectorPtr_Type& /*fluidDisp*/, const UInt /*iter*/, const bool /*lastVector*/ ) {}
297 
298  virtual void finalizeRestart( ) {}
299 
300  //! Initializes all the quantities using functions
301  /*!
302  * calls the initialize methods for the subproblems. The mesh velocity is used to compute the convective term in the fluid equations
303  * \param u0: initial fluid velocity
304  * \param p0: initial fluid pressure
305  * \param d0: initial solid displacement
306  * \param w0: initial mesh velocity
307  */
308  virtual void initialize ( fluid_Type::function_Type const& u0,
309  fluid_Type::function_Type const& p0,
310  solid_Type::function const& d0,
311  solid_Type::function const& w0,
312  fluid_Type::function_Type const& df0 );
313 
314  //@}
315 
316 
317 
318  //!@name MONOLITHIC Solver Methods - Implemented There
319  //{@
320  virtual void iterateMesh ( const vector_Type& /*disp*/ )
321  {
322  assert (false);
323  }
324  virtual void setupBDF ( const vector_Type& /*u0*/ ) { }
325  virtual void updateRHS() {}
326  virtual void applyBoundaryConditions() {}
327  //@}
328 
329 
330  //!@name Factory Methods
331  //@{
332  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createVenantKirchhoffLinear()
333  {
334  return new VenantKirchhoffMaterialLinear< FSIOperator::mesh_Type >();
335  }
336 
337  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createVenantKirchhoffNonLinear()
338  {
339  return new VenantKirchhoffMaterialNonLinear< FSIOperator::mesh_Type >();
340  }
341  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createExponentialMaterialNonLinear()
342  {
343  return new ExponentialMaterialNonLinear< FSIOperator::mesh_Type >();
344  }
345 
346  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createNeoHookeanMaterialNonLinear()
347  {
348  return new NeoHookeanMaterialNonLinear< FSIOperator::mesh_Type >();
349  }
350  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createVenantKirchhoffNonLinearPenalized()
351  {
352  return new VenantKirchhoffMaterialNonLinearPenalized< FSIOperator::mesh_Type >();
353  }
354 
355  static StructuralIsotropicConstitutiveLaw< FSIOperator::mesh_Type >* createSecondOrderExponentialMaterialNonLinear()
356  {
357  return new SecondOrderExponentialMaterialNonLinear< FSIOperator::mesh_Type >();
358  }
359 
360 #ifdef ENABLE_ANISOTROPIC_LAW
361  static StructuralAnisotropicConstitutiveLaw< FSIOperator::mesh_Type >* createHolzapfelMaterialNonLinear()
362  {
363  return new HolzapfelMaterialNonLinear<MeshType >();
364  }
365  static StructuralAnisotropicConstitutiveLaw< FSIOperator::mesh_Type >* createHolzapfelGeneralizedMaterialNonLinear()
366  {
367  return new HolzapfelGeneralizedMaterialNonLinear<MeshType >();
368  }
369 
370 
371 #endif
372 
373 
374  //@}
375 
376 
377  //!@name Public Methods
378  //@{
379 
380  //!@name Public Methods
381  //@{
382  //!Initializes the TimeAdvance scheme which should handle the fluid time discretization, solid and move mesh
383  /**
384  Initialization of the time advancing classes for fluid, structure and geometry problem.
385  */
386  void initializeTimeAdvance ( const std::vector<vectorPtr_Type>& initialFluidVel, const std::vector<vectorPtr_Type>& initialSolidDisp, const std::vector<vectorPtr_Type>& initialFluiDisp);
387 
388  virtual void initializeMonolithicOperator ( std::vector< vectorPtr_Type> /*u0*/, std::vector< vectorPtr_Type> /*ds0*/, std::vector< vectorPtr_Type> /*df0*/) {}
389 
390  //! initializes the fluid solver with vectors
391  /**
392  \param velAndPressure: initial vector containing the velocity and pressure
393  \param displacement: initial vector containing the mesh displacement
394  */
395  void initializeFluid ( const vector_Type& velAndPressure, const vector_Type& displacement );
396 
397  //! initializes the solid solver with vectors
398  /**
399  \param displacement: initial vector containing the structure displacement
400  \param velocity: initial vector containing the velocity, used for the initialization of the TimeAdvanceNewmark scheme
401  */
402  void initializeSolid ( vectorPtr_Type displacement, vectorPtr_Type /*velocity*/ );
403 
404  //!moves the mesh using the solution of the harmonic extension equation
405  /**
406  \param disp displacement of the mesh, must be the difference between the current solution of the HE problem and the one at the previous time step.
407  */
408  void moveMesh ( const vector_Type& disp );
409 
410  // void solveLinearFluid();
411  // void solveLinearSolid();
412 
413  //! Creates the Epetra maps for the interface
414  /**
415  Given a std::map holding the numeration of the interface according to the fluid (first) and the solid (second),
416  builds the MapEpetras for the interface dofs (e.g. M_fluidInterfaceMap). Note that when both the fluid and solid
417  meshes are partitioned (e.g. in the monolithic solver) the local dofs are those of the FLUID partition of the
418  interface, even when the numeration refers to the solid.
419  */
420  void createInterfaceMaps (std::map<ID, ID> const& locDofMap);
421 
422  //!Method to import an VectorEpetra defined on the fluid map (i.e. with the fluid numeration of the dofs) to the interface
423  /**
424  Note that the output vector will have the solid numeration on the interface! By default in fact the vectors on the
425  FSI interface in LifeV are numerated according to the solid.
426  */
427  void transferFluidOnInterface ( const vector_Type& _vec1, vector_Type& _vec2 );
428 
429  void transferSolidOnFluid ( const vector_Type& _vec1, vector_Type& _vec2 );
430 
431  //!Method to import an VectorEpetra defined on the solid map (i.e. with the solid numeration of the dofs) to the interface
432  /**
433  The output vector has the solid numeration of the dofs and is partitioned according to the solid partition. This method is not used in the monolithic solvers.
434  */
435  void transferSolidOnInterface ( const vector_Type& _vec1, vector_Type& _vec2 );
436  // void transferInterfaceOnFluid( const vector_Type& _vec1, vector_Type& _vec2 );
437 
438  //!Method to import an VectorEpetra defined on the solid map (i.e. with the solid numeration of the dofs) to the interface
439  /**
440  the output vector have the numeration of the solid, as in transferSolidOnInterface, but is partitioned according to the fluid! This method is not used in the monolithic solvers.
441  */
442  void transferInterfaceOnSolid ( const vector_Type& _vec1, vector_Type& _vec2 );
443 
444  //! Update the RHS on the base of the fluid BC
445  /*!
446  * This method is used by the Multiscale to update the RHS vector for the nonlinear subiterations.
447  * @param bcHandlerFluid fluid BC handler
448  * @param rhs RHS of the FSI problem
449  */
450  void bcManageVectorRHS ( const fluidBchandlerPtr_Type& bch, vector_Type& rhs );
451 
452  //! Update the RHS on the base of the fluid and solid BC
453  /*!
454  * This method is used by the Multiscale to update the RHS vector for the nonlinear subiterations.
455  * @param bcHandlerFluid fluid BC handler
456  * @param bcHandlerSolid solid BC handler
457  * @param rhs RHS of the FSI problem
458  */
459  void bcManageVectorRHS ( const fluidBchandlerPtr_Type& bcHandlerFluid, const solidBchandlerPtr_Type& bcHandlerSolid, vector_Type& rhs );
460 
461  //! Method to set the Robin vector coefficient of the Robin--Neumann coupling scheme (as a constant vector vector)
462  void setAlphaf()
463  {
464  M_alphaF->epetraVector().PutScalar ( M_alphaFCoef );
465  }
466  //! Method to compute the scalar coefficient \f$\alpha\f$ of the Robin--Neumann coupling scheme
467  void setAlphafCoef();
468  //! Method calling setAlphaf and setAlphafCoef
469  void setStructureToFluidParameters();
470 
471  //! Reset the right hand side to zero
472  /*!
473  * This method is used in the multiscale framework during subiterations
474  */
475  void resetRHS()
476  {
477  *M_rhs = 0;
478  }
479 
480  //@}
481 
482 
483 
484  /** @name Display Methods
485  */
486  //@{
487 
488  bool isLeader() const;
489 
490  //! Getter for the Displayer attribute
491  Displayer const& displayer();
492 
493  //@}
494 
495 
496 
497  /** @name Get Functions
498  */
499  //@{
500 
501  //! Get the extrapolation of the solution
502  /*!
503  * @param extrapolation vector to be filled with the extrapolated solution
504  */
505  void extrapolation ( vector_Type& extrapolation ) const
506  {
507  M_fluidTimeAdvance->extrapolation ( extrapolation );
508  }
509 
510  // vector_Type & displacement() { return *M_lambdaSolid; }
511  // vector_Type & displacementOld() { return *M_lambdaSolidOld; }
512  // vector_Type & residual();
513  // vector_Type const & velocity() const { return *M_lambdaDotSolid; }
514  // vector_Type & residualFSI();
515 
516  //! Returns the number of imposed fluxes
517  UInt imposedFluxes();
518 
519  const vector_Type& lambdaFluid() const
520  {
521  return *M_lambdaFluid;
522  }
523  const vector_Type& lambdaSolid() const
524  {
525  return *M_lambdaSolid;
526  }
527  const vector_Type& lambdaSolidOld() const
528  {
529  return *M_lambdaSolidOld;
530  }
531  const vector_Type& lambdaDotSolid() const
532  {
533  return *M_lambdaDotSolid;
534  }
535  const vector_Type& sigmaFluid() const
536  {
537  return *M_sigmaFluid;
538  }
539  const vector_Type& sigmaSolid() const
540  {
541  return *M_sigmaSolid;
542  }
543 
544  const vector_Type& lambdaFluidRepeated() const
545  {
546  return *M_lambdaFluidRepeated;
547  }
548  const vector_Type& lambdaSolidRepeated() const
549  {
550  return *M_lambdaSolidRepeated;
551  }
552  const vector_Type& lambdaDotSolidRepeated() const
553  {
554  return *M_lambdaDotSolidRepeated;
555  }
556  const vector_Type& sigmaFluidRepeated() const
557  {
558  return *M_sigmaFluidRepeated;
559  }
560  const vector_Type& sigmaSolidRepeated() const
561  {
562  return *M_sigmaSolidRepeated;
563  }
564 
565  //!\todo{remove this method}
566  // now residual is Ax-b, but we should decide for b-Ax. In the meantime, we need b-Ax:
567  const vector_Type& minusSigmaFluid() const
568  {
569  return *M_minusSigmaFluid;
570  }
571  //!\todo{remove this method}
572  const vector_Type& minusSigmaFluidRepeated() const
573  {
574  return *M_minusSigmaFluidRepeated;
575  }
576 
577  //!coefficient for the Robin--Neumann coupling scheme
578  vector_Type& Alphaf() const
579  {
580  return *M_alphaF;
581  }
582 
583  commPtr_Type worldComm() const
584  {
585  return M_epetraWorldComm;
586  }
587 
588  bool isFluid() const
589  {
590  return M_isFluid;
591  }
592  bool isSolid() const
593  {
594  return M_isSolid;
595  }
596 
597  bool isLinearFluid() const
598  {
599  return M_linearFluid;
600  }
601  bool isLinearSolid() const
602  {
603  return M_linearSolid;
604  }
605 
606  int getFluidLeaderId() const
607  {
608  return M_fluidLeader;
609  }
610  int getSolidLeaderId() const
611  {
612  return M_solidLeader;
613  }
614 
615  //! Getter for the fluid solver
616  const fluid_Type& fluid() const
617  {
618  return *M_fluid;
619  }
620  //! Getter for the solid solver
621  const solid_Type& solid() const
622  {
623  return *M_solid;
624  }
625  //! Getter for the harmonic extension solver
626  const meshMotion_Type& meshMotion() const
627  {
628  return *M_meshMotion;
629  }
630 
631  //! Getter-Setter for the fluid solver
632  /** \todo{mark as deprecated}*/
633  fluid_Type& fluid()
634  {
635  return *M_fluid;
636  }
637  //! Getter-Setter for the solid solver
638  /** \todo{mark as deprecated}*/
639  solid_Type& solid()
640  {
641  return *M_solid;
642  }
643  //! Getter-Setter for the mesh motion solver
644  /** \todo{mark as deprecated}*/
645  meshMotion_Type& meshMotion()
646  {
647  return *M_meshMotion;
648  }
649  // fluidLin_Type & fluidLin() { return *M_fluidLin; }
650  // solidLin_Type & solidLin() { return *M_solidLin; }
651 
652  //!getter for the FSI data container
653  const data_Type& data() const
654  {
655  return *M_data;
656  }
657  //!getter for the fluid data container
658  const data_Type::dataFluidPtr_Type& dataFluid() const
659  {
660  return M_data->dataFluid();
661  }
662  //!getter for the solid data container
663  const data_Type::dataSolidPtr_Type& dataSolid() const
664  {
665  return M_data->dataSolid();
666  }
667 
668  //!getter for the unpartitioned fluid mesh
669  mesh_Type& fluidMesh() const
670  {
671  return *M_fluidMesh;
672  }
673  //!getter for the unpartitioned solid mesh
674  mesh_Type& solidMesh() const
675  {
676  return *M_solidMesh;
677  }
678 
679  // const mesh_Type& fluidMesh() const { return *M_fluidMesh; }
680  // const mesh_Type& solidMesh() const { return *M_solidMesh; }
681 
682  //!getter for the partitioned fluid mesh
683  mesh_Type& fluidLocalMesh()
684  {
685  return *M_fluidLocalMesh;
686  }
687  //!getter for the partitioned solid mesh
688  mesh_Type& solidLocalMesh()
689  {
690  return *M_solidLocalMesh;
691  }
692 
693  //!getter for the fluid velocity FESpace
694  const FESpace<mesh_Type, MapEpetra>& uFESpace() const
695  {
696  return *M_uFESpace;
697  }
698  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > uFESpacePtr() const
699  {
700  return M_uFESpace;
701  }
702  //!getter for the fluid pressure FESpace
703  const FESpace<mesh_Type, MapEpetra>& pFESpace() const
704  {
705  return *M_pFESpace;
706  }
707  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > pFESpacePtr() const
708  {
709  return M_pFESpace;
710  }
711  //!getter for the solid displacement FESpace
712  const FESpace<mesh_Type, MapEpetra>& dFESpace() const
713  {
714  return *M_dFESpace;
715  }
716  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > dFESpacePtr() const
717  {
718  return M_dFESpace;
719  }
720  //!getter for the solid displacement FESpace
721  const ETFESpace<mesh_Type, MapEpetra, 3, 3>& dFESpaceET() const
722  {
723  return *M_dETFESpace;
724  }
725  std::shared_ptr<ETFESpace<mesh_Type, MapEpetra, 3, 3> > dFESpaceETPtr() const
726  {
727  return M_dETFESpace;
728  }
729  //!getter for the harmonic extension solution FESpace
730  const FESpace<mesh_Type, MapEpetra>& mmFESpace() const
731  {
732  return *M_mmFESpace;
733  }
734  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > mmFESpacePtr() const
735  {
736  return M_mmFESpace;
737  }
738  //!getter for the harmonic extension solution
739  const vector_Type& meshDisp() const
740  {
741  return M_ALETimeAdvance->singleElement (0);
742  }
743  //!getter for the harmonic extension solution of the previous time step
744  const vector_Type& dispFluidMeshOld() const
745  {
746  return *M_dispFluidMeshOld;
747  }
748  //!getter for the mesh velocity
749  virtual vector_Type& veloFluidMesh()
750  {
751  return *M_veloFluidMesh;
752  }
753  //!getter for the mesh velocity increment (used for Newton FSI)
754  //! \todo{try to remove this method}
755  vector_Type& derVeloFluidMesh()
756  {
757  return *M_derVeloFluidMesh;
758  }
759 
760  const dofInterface3DPtr_Type& dofFluidToStructure() const
761  {
762  return M_dofFluidToStructure;
763  }
764  const dofInterface3DPtr_Type& dofStructureToSolid() const
765  {
766  return M_dofStructureToSolid;
767  }
768  const dofInterface3DPtr_Type& dofStructureToHarmonicExtension() const
769  {
770  return M_dofStructureToHarmonicExtension;
771  }
772  const dofInterface3DPtr_Type& dofHarmonicExtensionToFluid() const
773  {
774  return M_dofHarmonicExtensionToFluid;
775  }
776 
777  std::shared_ptr<MapEpetra>& fluidInterfaceMap()
778  {
779  return M_fluidInterfaceMap;
780  }
781  std::shared_ptr<MapEpetra>& solidInterfaceMap()
782  {
783  return M_solidInterfaceMap;
784  }
785 
786  //! Getter for the map of the variable used for the coupling
787  virtual std::shared_ptr<MapEpetra>& couplingVariableMap()
788  {
789  return M_solidInterfaceMap;
790  }
791 
792  //! Method to implement Robin boundary conditions on the external wall for the structure
793  BCFunctionRobin& bcfRobinOuterWall()
794  {
795  return M_bcfRobinOuterWall;
796  }
797 
798  bcVectorInterfacePtr_Type bcvStructureDisptoFluid() const
799  {
800  return M_bcvStructureDispToFluid;
801  }
802  bcVectorInterfacePtr_Type bcvStructureToFluid() const
803  {
804  return M_bcvStructureToFluid;
805  }
806  bcVectorInterfacePtr_Type bcvSolidLoadToStructure() const
807  {
808  return M_bcvSolidLoadToStructure;
809  }
810  bcVectorInterfacePtr_Type bcvFluidInterfaceDisp() const
811  {
812  return M_bcvFluidInterfaceDisp;
813  }
814  bcVectorInterfacePtr_Type bcvHarmonicExtensionVelToFluid() const
815  {
816  return M_bcvHarmonicExtensionVelToFluid;
817  }
818  bcVectorInterfacePtr_Type bcvDerHarmonicExtensionVelToFluid() const
819  {
820  return M_bcvDerHarmonicExtensionVelToFluid;
821  }
822  bcVectorInterfacePtr_Type bcvStructureDispToHarmonicExtension() const
823  {
824  return M_bcvStructureDispToHarmonicExtension;
825  }
826  bcVectorInterfacePtr_Type bcvStructureDispToSolid() const
827  {
828  return M_bcvStructureDispToSolid;
829  }
830  bcVectorInterfacePtr_Type bcvDerStructureDispToSolid() const
831  {
832  return M_bcvDerStructureDispToSolid;
833  }
834  bcVectorInterfacePtr_Type bcvFluidLoadToStructure() const
835  {
836  return M_bcvFluidLoadToStructure;
837  }
838  bcVectorInterfacePtr_Type bcvDerFluidLoadToStructure() const
839  {
840  return M_bcvDerFluidLoadToStructure;
841  }
842  bcVectorInterfacePtr_Type bcvDerFluidLoadToFluid() const
843  {
844  return M_bcvDerFluidLoadToFluid;
845  }
846  // bcVectorInterfacePtr_Type bcvDerReducedFluidLoadToStructure() { return M_bcvDerReducedFluidLoadToStructure; }
847  // bcVectorInterfacePtr_Type bcvDerStructureAccToReducedFluid() { return M_bcvDerStructureAccToReducedFluid; }
848 
849  //! Getter for the BCHandler of the fluid problem
850  const fluidBchandlerPtr_Type& BCh_fluid() const
851  {
852  return M_BCh_u;
853  }
854  //! Getter for the BCHandler of the harmonic extension problem
855  const fluidBchandlerPtr_Type& BCh_harmonicExtension() const
856  {
857  return M_BCh_mesh;
858  }
859  //! Getter for the BCHandler of the linearized fluid problem (to be used in Newton for the partitioned FSI)
860  const fluidBchandlerPtr_Type& BCh_du() const
861  {
862  return M_BCh_du;
863  }
864  //! Getter for the BCHandler of the linearized inverse of the fluid Steklov Poincare' operator (not used)
865  //! \todo{mark as deprecated untill debugged}
866  const fluidBchandlerPtr_Type& BCh_du_inv() const
867  {
868  return M_BCh_du_inv;
869  }
870  //! Getter for the BCHandler of the solid problem
871  const solidBchandlerPtr_Type& BCh_solid() const
872  {
873  return M_BCh_d;
874  }
875  //! Getter for the BCHandler of the linearized solid problem
876  const solidBchandlerPtr_Type& BCh_dz() const
877  {
878  return M_BCh_dz;
879  }
880  //! Getter for the BCHandler of the linearized inverse of the solid Steklov Poincare' operator (not used)
881  //! \todo{mark as deprecated untill debugged}
882  const solidBchandlerPtr_Type& BCh_dz_inv() const
883  {
884  return M_BCh_dz_inv;
885  }
886 
887  //! Getter for the right hand side
888  const vectorPtr_Type& getRHS() const
889  {
890  return M_rhs;
891  }
892 
893  const std::shared_ptr<TimeAdvance<vector_Type> > ALETimeAdvance() const
894  {
895  return M_ALETimeAdvance;
896  }
897  const std::shared_ptr<TimeAdvance<vector_Type> > fluidTimeAdvance() const
898  {
899  return M_fluidTimeAdvance;
900  }
901  const std::shared_ptr<TimeAdvance<vector_Type> > solidTimeAdvance() const
902  {
903  return M_solidTimeAdvance;
904  }
905 
906  const std::string ALETimeAdvanceMethod() const
907  {
908  return M_ALETimeAdvanceMethod;
909  }
910  const std::string fluidTimeAdvanceMethod() const
911  {
912  return M_fluidTimeAdvanceMethod;
913  }
914  const std::string solidTimeAdvanceMethod() const
915  {
916  return M_solidTimeAdvanceMethod;
917  }
918 
919  //! gets the solution vector by reference
920  virtual const vector_Type& solution() const
921  {
922  return *M_lambda;
923  }
924 
925  //! gets the solid displacement by copy
926  virtual void getSolidDisp ( vector_Type& soliddisp )
927  {
928  soliddisp = M_solid->displacement();
929  }
930 
931  //! gets the solid velocity by copy
932  virtual void getSolidVel ( vector_Type& solidvel )
933  {
934  solidvel = M_solidTimeAdvance->firstDerivative();
935  }
936 
937  //! Export the solid displacement by copying it to an external vector
938  /*!
939  * @param solidDisplacement vector to be filled with the solid displacement
940  */
941  virtual void exportSolidDisplacement ( vector_Type& solidDisplacement )
942  {
943  solidDisplacement = M_solid->displacement();
944  }
945 
946  //! Export the solid velocity by copying it to an external vector
947  /*!
948  * @param solidVelocity vector to be filled with the solid velocity
949  */
950  virtual void exportSolidVelocity ( vector_Type& solidVelocity )
951  {
952  solidVelocity = M_solidTimeAdvance->firstDerivative();
953  }
954 
955  //! Export the solid acceleration by copying it to an external vector
956  /*!
957  * @param solidAcc vector to be filled with the solid acceleration
958  */
959  virtual void exportSolidAcceleration ( vector_Type& solidAcc )
960  {
961  solidAcc = M_solidTimeAdvance->secondDerivative();
962  }
963 
964  //! Export the fluid velocity by copying it to an external vector
965  /*!
966  * @param fluidVelocity vector to be filled with the fluid velocity
967  */
968  virtual void exportFluidVelocity ( vector_Type& fluidVelocity )
969  {
970  fluidVelocity = *M_fluid->solution();
971  }
972 
973  //! Export the fluid pressure by copying it to an external vector
974  /*!
975  * @param fluidPressure vector to be filled with the fluid pressure
976  */
977  virtual void exportFluidPressure ( vector_Type& fluidPressure )
978  {
979  fluidPressure = *M_fluid->solution();
980  }
981 
982  //! Export the fluid velocity and pressure by copying it to an external vector
983  /*!
984  * @param fluidVelocityAndPressure vector to be filled with the fluid velocity and pressure
985  */
986  virtual void exportFluidVelocityAndPressure ( vector_Type& fluidVelocityAndPressure )
987  {
988  fluidVelocityAndPressure = *M_fluid->solution();
989  }
990 
991  //! Export the fluid displacement by copying it to an external vector
992  /*!
993  * @param fluidDisplacement vector to be filled with the fluid displacement
994  */
995  virtual void exportFluidDisplacement ( vector_Type& fluidDisplacement )
996  {
997  fluidDisplacement = M_ALETimeAdvance->singleElement (0);
998  }
999 
1000  //@}
1001 
1002 
1003 
1004  /** @name Set Functions
1005  */
1006  //@{
1007  //! Setter for the local and world communicators
1008  /**
1009  The communicator can be different depending on which type of subdomain we are considering
1010  */
1011  void setComm ( const commPtr_Type& comm, const commPtr_Type& worldComm );
1012 
1013  //! Setter for the FSI data
1014  void setData ( const dataPtr_Type& data )
1015  {
1016  M_data = data;
1017  }
1018 
1019  //! Setter for the fluid and geometry problems
1020  void setFluid ( const fluidPtr_Type& fluid, const meshMotionPtr_Type& meshmotion );
1021  //! Setter for the solid problem
1022  void setSolid ( const solidPtr_Type& solid );
1023 
1024  //!Setter for the "fluid" flag
1025  void setFluid ( const bool& isFluid )
1026  {
1027  M_isFluid = isFluid;
1028  }
1029  //!Setter for the "solid" flag
1030  void setSolid ( const bool& isSolid )
1031  {
1032  M_isSolid = isSolid;
1033  }
1034 
1035  //!Setter for the "linear fluid" flag
1036  void setLinearFluid ( const bool& linFluid )
1037  {
1038  M_linearFluid = linFluid;
1039  }
1040  //!Setter for the "linear solid" flag
1041  void setLinearSolid ( const bool& linSolid )
1042  {
1043  M_linearSolid = linSolid;
1044  }
1045 
1046  void setFluidLeader ( const int& fluidLeader )
1047  {
1048  M_fluidLeader = fluidLeader;
1049  }
1050  void setSolidLeader ( const int& solidLeader )
1051  {
1052  M_solidLeader = solidLeader;
1053  }
1054 
1055  // void setBC( fluidBchandlerPtr_Type& bc_u, solidBchandlerPtr_Type& bc_d, fluidBchandlerPtr_Type& bc_m );
1056 
1057  //!Setter for the fluid BCHandler
1058  /**
1059  \todo{see if this needs to be virtual}
1060  */
1061  virtual void setFluidBC ( const fluidBchandlerPtr_Type& bc_fluid );
1062  //!Setter for the BCHandler of the linearized fluid problem (to be used in segregated Newton FSI)
1063  void setLinFluidBC ( const fluidBchandlerPtr_Type& bc_dfluid )
1064  {
1065  M_BCh_du = bc_dfluid;
1066  }
1067  //!Setter for the BCHandler of the inverse linearized fluid steklov Poincare' operator (to be used in SP FSI formulation)
1068  /**
1069  \todo{mark as deprecated until not debugged}
1070  */
1071  void setInvLinFluidBC ( const fluidBchandlerPtr_Type& bc_dfluid_inv )
1072  {
1073  M_BCh_du_inv = bc_dfluid_inv;
1074  }
1075  //!Setter for the BCHandler of the gerometry problem (to be used in segregated Newton FSI)
1076  void setHarmonicExtensionBC ( const fluidBchandlerPtr_Type& bc_he );
1077 
1078  //!Setter for the fluid BCHandler
1079  /**
1080  \todo{see if this needs to be virtual}
1081  */
1082  virtual void setSolidBC ( const solidBchandlerPtr_Type& bc_solid );
1083  //!Setter for the BCHandler of the linearized solid problem (to be used in segregated Newton FSI)
1084  void setLinSolidBC ( const solidBchandlerPtr_Type& bc_dsolid )
1085  {
1086  M_BCh_dz = bc_dsolid;
1087  }
1088  //!Setter for the BCHandler of the inverse linearized solid steklov Poincare' operator (to be used in SP FSI formulation)
1089  /**
1090  \todo{mark as deprecated until not debugged}
1091  */
1092  void setInvLinSolidBC ( const solidBchandlerPtr_Type& bc_dsolid_inv )
1093  {
1094  M_BCh_dz_inv = bc_dsolid_inv;
1095  }
1096 
1097  //! Setter for the interface displacement (partitioned according to the fluid)
1098  void setLambdaFluid ( const vector_Type& lambda );
1099  //! Setter for the interface displacement (partitioned according to the solid)
1100  void setLambdaSolid ( const vector_Type& lambda );
1101 
1102  //! Setter for the solid interface displacement at the previous time step
1103  /**\todo{see if we can remove these}*/
1104  void setLambdaSolidOld ( const vector_Type& lambda );
1105  //! Setter for the solid interface velocity at the previous time step
1106  /**\todo{see if we can remove these}*/
1107  void setLambdaDotSolid ( const vector_Type& lambda );
1108 
1109  //!Setter for the fluid interface stress
1110  void setSigmaFluid ( const vector_Type& sigma );
1111  //!Setter for the solid interface stress
1112  void setSigmaSolid ( const vector_Type& sigma );
1113  //\todo{try to remove this}
1114  void setMinusSigmaFluid ( const vector_Type& sigma );
1115 
1116  //! Setter for the Robin coefficient of the Robin--Neumann coupling scheme (as a BCFunction)
1117  void setAlphafbcf ( const bcFunction_Type& alphafbcf );
1118 
1119  // void setMpi (bool mpi ){M_mpi = mpi;}
1120  // void setFluidMpi(bool fluid){M_isFluidMpi = fluid;}
1121  // void setSolidMpi(bool solid){M_issolidMpi = solid;}
1122 
1123  // bool mpi(){return M_mpi;}
1124 
1125  // void setRobinOuterWall ( function_Type const& dload,
1126  // function_Type const& E ) { M_bcfRobinOuterWall.setFunctions_Robin(dload, E); }
1127  void setStructureDispToHarmonicExtension ( const vector_Type& disp, UInt type = 0 );
1128  void setStructureToFluid ( const vector_Type& vel, UInt type = 0 );
1129  void setStructureDispToFluid ( const vector_Type& vel, UInt type = 0 );
1130  void setStructureDispToSolid ( const vector_Type& disp, UInt type = 0 );
1131  void setDerStructureDispToSolid ( const vector_Type& ddisp, UInt type = 0 );
1132  void setSolidLoadToStructure ( const vector_Type& load, UInt type = 0 );
1133  void setHarmonicExtensionVelToFluid ( const vector_Type& vel, UInt type = 0 );
1134  void setDerHarmonicExtensionVelToFluid ( const vector_Type& dvel, UInt type = 0 );
1135  //void setFluidInterfaceDisp ( const vector_Type& disp, UInt type = 0 );
1136  void setFluidLoadToStructure ( const vector_Type& load, UInt type = 0 );
1137  void setDerFluidLoadToStructure ( const vector_Type& dload, UInt type = 0 );
1138  void setDerFluidLoadToFluid ( const vector_Type& dload, UInt type = 0 );
1139  void setRobinOuterWall ( const function_Type& dload, const function_Type& E);
1140 
1141  //! Setter for the time derivative of the interface displacement
1142  void setSolutionDerivative ( const vector_Type& solutionDerivative )
1143  {
1144  M_lambdaDot.reset ( new vector_Type ( solutionDerivative ) );
1145  }
1146 
1147  //! Setup of the TimeAdvance classes given the input data file
1148  void
1149  setupTimeAdvance ( const dataFile_Type& dataFile );
1150 
1151  //@}
1152 
1153 
1154 protected:
1155 
1156  //virtual void variablesInit(const ReferenceFE* refFE_struct,const LifeV::QuadratureRule* bdQr_struct, const LifeV::QuadratureRule* qR_struct);
1157  //!@name Protected Methods
1158  //@{
1159  //!initailize the variables
1160  /**
1161  instantiates the pointers which are used in the segregated FSI solvers. Reimplemented in the Monolithic class.
1162  \param dorder: unused parameter
1163  */
1164  virtual void variablesInit ( const std::string& dOrder );
1165 
1166  //!Interpolates the mesh motion dofs on the fluid
1167  /**
1168  The order of the spatial approximation depends on this method: when the mesh motion approximation is first order
1169  in space the overall approximation is of the first order even if the fluid is solved with hicher order FEs.
1170  Calls the interpolateVelocity method
1171  */
1172  void transferMeshMotionOnFluid ( const vector_Type& _vec1, vector_Type& _vec2 );
1173 
1174  //! Interpolates mesh motion into velocity
1175  /**
1176  Interpolates a vector with the map of the harmonic extension into one with the map of the fluid velocity
1177  */
1178  void interpolateVelocity (const vector_Type& _vec1, vector_Type& _vec2);
1179 
1180 
1181  //!Interpolates to vectors on the interface
1182  /**
1183  The two vectors can have different numeration, for different discretizations this method is not tested.
1184  */
1185  void interpolateInterfaceDofs (const FESpace<mesh_Type, MapEpetra>& _fespace1,
1186  const vector_Type& _vec1,
1187  const FESpace<mesh_Type, MapEpetra>& _fespace2,
1188  vector_Type& _vec2,
1189  dofInterface3DPtr_Type& _dofInterface);
1190 
1191  //@}
1192 
1193  //!@name Protected Attributes
1194  //@{
1195 
1196  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > M_uFESpace;
1197  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > M_pFESpace;
1198  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > M_dFESpace;
1199  std::shared_ptr<ETFESpace<mesh_Type, MapEpetra, 3, 3> > M_dETFESpace;
1200  std::shared_ptr<FESpace<mesh_Type, MapEpetra> > M_mmFESpace;
1201 
1202  std::shared_ptr<mesh_Type> M_fluidMesh;
1203  std::shared_ptr<mesh_Type> M_solidMesh;
1204 
1205  std::shared_ptr<mesh_Type> M_fluidLocalMesh;
1206  std::shared_ptr<mesh_Type> M_solidLocalMesh;
1207 
1208  fluidBchandlerPtr_Type M_BCh_u;
1209  solidBchandlerPtr_Type M_BCh_d;
1210  fluidBchandlerPtr_Type M_BCh_mesh;
1211 
1212  // interface operators BCs
1213  fluidBchandlerPtr_Type M_BCh_du;
1214  fluidBchandlerPtr_Type M_BCh_du_inv;
1215 
1216  solidBchandlerPtr_Type M_BCh_dz;
1217  solidBchandlerPtr_Type M_BCh_dz_inv;
1218 
1219  fluidBchandlerPtr_Type M_BCh_dp;
1220  fluidBchandlerPtr_Type M_BCh_dp_inv;
1221 
1222  fluidPtr_Type M_fluid;
1223  solidPtr_Type M_solid;
1224  meshMotionPtr_Type M_meshMotion;
1225 
1226  std::string M_fluidTimeAdvanceMethod;
1227  std::string M_solidTimeAdvanceMethod;
1228  std::string M_ALETimeAdvanceMethod;
1229 
1230  std::shared_ptr<TimeAdvance<vector_Type> > M_fluidTimeAdvance;
1231  std::shared_ptr<TimeAdvance<vector_Type> > M_fluidMassTimeAdvance;
1232  std::shared_ptr<TimeAdvance<vector_Type> > M_solidTimeAdvance;
1233  std::shared_ptr<TimeAdvance<vector_Type> > M_ALETimeAdvance;
1234 
1235 
1236  dataFile_Type M_dataFile;
1237 
1238  std::shared_ptr<MeshData> M_meshDataFluid;
1239  std::shared_ptr<MeshData> M_meshDataSolid;
1240 
1241  dataPtr_Type M_data;
1242 
1243  std::shared_ptr<MapEpetra> M_fluidInterfaceMap;
1244  std::shared_ptr<MapEpetra> M_solidInterfaceMap;
1245 
1246  //!\todo{kill this attribute}
1247  std::shared_ptr<MapEpetra> M_fluidInterfaceMapOnZero;
1248  //!\todo{kill this attribute}
1249  std::shared_ptr<MapEpetra> M_solidInterfaceMapOnZero;
1250 
1251  dofInterface3DPtr_Type M_dofFluidToStructure; // Needed
1252  // dofInterface3DPtr_Type M_dofSolidToFluid;
1253  dofInterface3DPtr_Type M_dofStructureToFluid; // Needed
1254  dofInterface3DPtr_Type M_dofStructureToSolid; // Needed to construct M_bcvStructureDispToSolid
1255  dofInterface3DPtr_Type M_dofStructureToHarmonicExtension; // Needed to construct interface maps
1256  dofInterface3DPtr_Type M_dofHarmonicExtensionToFluid; // Needed to construct M_bcvStructureToFluid
1257  // dofInterface3DPtr_Type M_dofStructureToReducedFluid;
1258  // dofInterface3DPtr_Type M_dofReducedFluidToStructure;
1259 
1260  dofInterface2DPtr_Type M_dofFluid;
1261  dofInterface2DPtr_Type M_dofSolid;
1262  dofInterface2DPtr_Type M_dofFluidInv;
1263  dofInterface2DPtr_Type M_dofSolidInv;
1264 
1265  bcVectorInterfacePtr_Type M_bcvFluidInterfaceDisp;
1266  bcVectorInterfacePtr_Type M_bcvFluidLoadToStructure;
1267  bcVectorInterfacePtr_Type M_bcvSolidLoadToStructure;
1268  bcVectorInterfacePtr_Type M_bcvStructureToFluid;
1269  bcVectorInterfacePtr_Type M_bcvStructureDispToFluid;
1270  bcVectorInterfacePtr_Type M_bcvStructureDispToSolid;
1271  bcVectorInterfacePtr_Type M_bcvStructureDispToHarmonicExtension;
1272  bcVectorInterfacePtr_Type M_bcvHarmonicExtensionVelToFluid;
1273  // bcVectorInterfacePtr_Type M_bcvStructureToReducedFluid;
1274  // bcVectorInterfacePtr_Type M_bcvReducedFluidToStructure;
1275 
1276  bcVectorInterfacePtr_Type M_bcvDerHarmonicExtensionVelToFluid;
1277  bcVectorInterfacePtr_Type M_bcvDerFluidLoadToStructure;
1278  bcVectorInterfacePtr_Type M_bcvDerFluidLoadToFluid;
1279  bcVectorInterfacePtr_Type M_bcvDerStructureDispToSolid;
1280  BCFunctionRobin M_bcfRobinOuterWall;
1281 
1282  // bcVectorInterfacePtr_Type M_bcvDerReducedFluidLoadToStructure;
1283  // bcVectorInterfacePtr_Type M_bcvDerStructureAccToReducedFluid;
1284 
1285  vectorPtr_Type M_lambdaFluid;
1286  vectorPtr_Type M_lambdaFluidRepeated;
1287  vectorPtr_Type M_lambda;
1288  vectorPtr_Type M_lambdaDot;
1289 
1290 
1291  vectorPtr_Type M_rhs;
1292  vectorPtr_Type M_alphaF;
1293 
1294  Real M_alphaFCoef;
1295  //\todo{try to set as deprecated}
1296  Real M_betaMean;
1297 
1298  commPtr_Type M_epetraComm;
1299  commPtr_Type M_epetraWorldComm;
1300 
1301  bool M_structureNonLinear;
1302  //@}
1303 private:
1304 
1305  //!@name Private Methods
1306  //@{
1307  //!Private Copy Constructor
1308  FSIOperator ( const FSIOperator& /*copy*/) {}
1309  //@}
1310 
1311  //! @name Private Attributes
1312  //@{
1313  // displacement on the interface
1314  vectorPtr_Type M_lambdaSolid;
1315  vectorPtr_Type M_lambdaSolidRepeated;
1316 
1317  vectorPtr_Type M_lambdaSolidOld;
1318  vectorPtr_Type M_lambdaDotSolid;
1319  vectorPtr_Type M_lambdaDotSolidRepeated;
1320 
1321  vectorPtr_Type M_sigmaFluid;
1322  vectorPtr_Type M_sigmaSolid;
1323 
1324  vectorPtr_Type M_sigmaFluidRepeated;
1325  vectorPtr_Type M_sigmaSolidRepeated;
1326 
1327  //\todo{try to remove}
1328  vectorPtr_Type M_minusSigmaFluid;
1329  //\todo{try to remove}
1330  vectorPtr_Type M_minusSigmaFluidRepeated;
1331 
1332  vectorPtr_Type M_dispFluidMeshOld;
1333  vectorPtr_Type M_veloFluidMesh;
1334  vectorPtr_Type M_derVeloFluidMesh;
1335 
1336  //\todo{try to set as deprecated}
1337  bool M_mpi;
1338 
1339  bool M_isFluid;
1340  bool M_isSolid;
1341 
1342  bool M_linearFluid;
1343  bool M_linearSolid;
1344 
1345  int M_fluidLeader;
1346  int M_solidLeader;
1347 
1348  std::string M_aleOrder;
1349  //@}
1350 
1351 };
1352 
1353 } // Namespace LifeV
1354 
1355 #endif /* FSIOPERATOR_H */
void assignFunction(bcBase_Type &base)
Assign the function to the base of the BCHandler.
FESpace - Short description here please!
Definition: FESpace.hpp:78
uint32_type ID
IDs.
Definition: LifeV.hpp:194
double Real
Generic real data.
Definition: LifeV.hpp:175
class ETFESpace A light, templated version of the FESpace
Definition: ETFESpace.hpp:93
uint32_type UInt
generic unsigned integer (used mainly for addressing)
Definition: LifeV.hpp:191