VertexCFD  0.0-dev
CDR_Model.hpp
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
9 // ****************************************************************************
10 // Adapted for use in VertexCFD from Trilinos/packages/tempus/test/TestModels
11 // ****************************************************************************
12 
13 #ifndef VERTEXCFD_CDR_MODEL_HPP
14 #define VERTEXCFD_CDR_MODEL_HPP
15 
16 #include "Thyra_StateFuncModelEvaluatorBase.hpp"
17 
18 class Epetra_Comm;
19 class Epetra_Map;
20 class Epetra_Vector;
21 class Epetra_CrsGraph;
22 class Epetra_Import;
23 
24 namespace VertexCFD
25 {
26 namespace Test
27 {
28 template<class Scalar>
30 
51 template<class Scalar>
52 class CDR_Model final : public ::Thyra::StateFuncModelEvaluatorBase<Scalar>
53 {
54  public:
55  CDR_Model(const Teuchos::RCP<const Epetra_Comm>& comm,
56  const int num_global_elements,
57  const Scalar z_min,
58  const Scalar z_max,
59  const Scalar a, // convection
60  const Scalar k); // source
61 
64 
65  void set_x0(const Teuchos::ArrayView<const Scalar>& x0);
66 
67  void setShowGetInvalidArgs(bool showGetInvalidArg);
68 
69  void set_W_factory(
70  const Teuchos::RCP<const ::Thyra::LinearOpWithSolveFactoryBase<Scalar>>&
71  W_factory);
72 
74 
77 
78  Teuchos::RCP<const ::Thyra::VectorSpaceBase<Scalar>>
79  get_x_space() const override;
80  Teuchos::RCP<const ::Thyra::VectorSpaceBase<Scalar>>
81  get_f_space() const override;
82  ::Thyra::ModelEvaluatorBase::InArgs<Scalar>
83  getNominalValues() const override;
84  Teuchos::RCP<Thyra::LinearOpWithSolveBase<double>>
85  create_W() const override;
86  Teuchos::RCP<::Thyra::LinearOpBase<Scalar>> create_W_op() const override;
87  Teuchos::RCP<const ::Thyra::LinearOpWithSolveFactoryBase<Scalar>>
88  get_W_factory() const override;
89  ::Thyra::ModelEvaluatorBase::InArgs<Scalar> createInArgs() const override;
90  Teuchos::RCP<::Thyra::PreconditionerBase<Scalar>>
91  create_W_prec() const override;
93 
94  private:
96  Teuchos::RCP<Epetra_CrsGraph> createGraph();
97 
100 
101  ::Thyra::ModelEvaluatorBase::OutArgs<Scalar>
102  createOutArgsImpl() const override;
103  void
104  evalModelImpl(const ::Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
105  const ::Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs)
106  const override;
107 
109 
110  private: // data members
111  const Teuchos::RCP<const Epetra_Comm> comm_;
112  const int num_global_elements_;
113  const Scalar z_min_;
114  const Scalar z_max_;
115  const Scalar a_;
116  const Scalar k_;
117 
118  Teuchos::RCP<const ::Thyra::VectorSpaceBase<Scalar>> x_space_;
119  Teuchos::RCP<const Epetra_Map> x_owned_map_;
120  Teuchos::RCP<const Epetra_Map> x_ghosted_map_;
121  Teuchos::RCP<const Epetra_Import> importer_;
122 
123  Teuchos::RCP<const ::Thyra::VectorSpaceBase<Scalar>> f_space_;
124  Teuchos::RCP<const Epetra_Map> f_owned_map_;
125 
126  Teuchos::RCP<Epetra_CrsGraph> W_graph_;
127 
128  Teuchos::RCP<const ::Thyra::LinearOpWithSolveFactoryBase<Scalar>> W_factory_;
129 
130  Teuchos::RCP<Epetra_Vector> node_coordinates_;
131  Teuchos::RCP<Epetra_Vector> ghosted_node_coordinates_;
132 
133  mutable Teuchos::RCP<Epetra_Vector> u_ptr;
134  mutable Teuchos::RCP<Epetra_Vector> u_dot_ptr;
135  mutable Teuchos::RCP<Epetra_Vector> x_ptr;
136 
137  mutable Teuchos::RCP<Epetra_Vector> J_diagonal_;
138 
139  ::Thyra::ModelEvaluatorBase::InArgs<Scalar> nominalValues_;
140  Teuchos::RCP<::Thyra::VectorBase<Scalar>> x0_;
141  Teuchos::Array<Scalar> p_;
142  bool showGetInvalidArg_;
143  ::Thyra::ModelEvaluatorBase::InArgs<Scalar> prototypeInArgs_;
144  ::Thyra::ModelEvaluatorBase::OutArgs<Scalar> prototypeOutArgs_;
145 };
146 
147 //==================================================================
148 // Finite Element Basis Object
149 class Basis
150 {
151  public:
152  // Constructor
153  Basis();
154 
155  // Destructor
156  ~Basis();
157 
158  // Calculates the values of u and x at the specified gauss point
159  void computeBasis(int gp, double* z, double* u, double* u_dot = nullptr);
160 
161  public:
162  // Variables that are calculated at the gauss point
163  double *phi, *dphide;
164  double uu, zz, duu, eta, wt;
165  double dz;
166  // These are only needed for transient
167  double uu_dot, duu_dot;
168 };
169 
170 } // namespace Test
171 } // namespace VertexCFD
172 
173 #include "CDR_Model_impl.hpp"
174 
175 #endif
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::Test::ModelEvaluator1DFEM
Definition: CDR_Model.hpp:29
VertexCFD::Test::Basis
Definition: CDR_Model.hpp:150
VertexCFD::Test::CDR_Model
1D CGFEM model for convection/diffusion/reaction
Definition: CDR_Model.hpp:53