Panzer  Version of the Day
Panzer_LinearObjFactory.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Panzer: A partial differential equation assembly
5 // engine for strongly coupled complex multiphysics systems
6 // Copyright (2011) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39 // Eric C. Cyr (eccyr@sandia.gov)
40 // ***********************************************************************
41 // @HEADER
42 
43 #ifndef __Panzer_LinearObjFactory_hpp__
44 #define __Panzer_LinearObjFactory_hpp__
45 
46 #include "Phalanx_TemplateManager.hpp"
47 #include "Phalanx_Evaluator.hpp"
48 #include "Phalanx_Evaluator_Derived.hpp"
49 
53 
54 #include "Teuchos_DefaultMpiComm.hpp"
55 
56 // #include "Sacado_mpl_placeholders.hpp"
57 // using namespace Sacado::mpl::placeholders;
58 
59 namespace panzer {
60 
61 class UniqueGlobalIndexerBase; // forward declaration
62 
98 template <typename Traits>
100 public:
101  virtual ~LinearObjFactory() {}
102 
118  template <typename BuilderT>
119  void buildGatherScatterEvaluators(const BuilderT & builder);
120 
127  virtual void readVector(const std::string & identifier,LinearObjContainer & loc,int id) const = 0;
128 
135  virtual void writeVector(const std::string & identifier,const LinearObjContainer & loc,int id) const = 0;
136 
140  virtual Teuchos::RCP<LinearObjContainer> buildLinearObjContainer() const = 0;
141 
149  virtual Teuchos::RCP<LinearObjContainer> buildPrimitiveLinearObjContainer() const = 0;
150 
154  virtual Teuchos::RCP<LinearObjContainer> buildGhostedLinearObjContainer() const = 0;
155 
163  virtual Teuchos::RCP<LinearObjContainer> buildPrimitiveGhostedLinearObjContainer() const = 0;
164 
169  virtual Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> buildDomainContainer() const = 0;
170 
171  virtual void globalToGhostContainer(const LinearObjContainer & container,
172  LinearObjContainer & ghostContainer,int) const = 0;
173  virtual void ghostToGlobalContainer(const LinearObjContainer & ghostContainer,
174  LinearObjContainer & container,int) const = 0;
175 
181  virtual void initializeContainer(int,LinearObjContainer & loc) const = 0;
182 
188  virtual void initializeGhostedContainer(int,LinearObjContainer & loc) const = 0;
189 
216  virtual void adjustForDirichletConditions(const LinearObjContainer & localBCRows,
217  const LinearObjContainer & globalBCRows,
218  LinearObjContainer & ghostedObjs,
219  bool zeroVectorRows=false, bool adjustX=false) const = 0;
220 
229  virtual void applyDirichletBCs(const LinearObjContainer & counter,
230  LinearObjContainer & result) const = 0;
231 
234  virtual Teuchos::MpiComm<int> getComm() const = 0;
235 
237  template <typename EvalT>
238  Teuchos::RCP<PHX::Evaluator<Traits> > buildScatter(const Teuchos::ParameterList & pl) const
239  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(scatterManager_->template getAsBase<EvalT>()->clone(pl)); }
240 
242  template <typename EvalT>
243  Teuchos::RCP<PHX::Evaluator<Traits> > buildGather(const Teuchos::ParameterList & pl) const
244  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(gatherManager_->template getAsBase<EvalT>()->clone(pl)); }
245 
247  template <typename EvalT>
248  Teuchos::RCP<PHX::Evaluator<Traits> > buildGatherTangent(const Teuchos::ParameterList & pl) const
249  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(gatherTangentManager_->template getAsBase<EvalT>()->clone(pl)); }
250 
252  template <typename EvalT>
253  Teuchos::RCP<PHX::Evaluator<Traits> > buildGatherDomain(const Teuchos::ParameterList & pl) const
254  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(gatherDomainManager_->template getAsBase<EvalT>()->clone(pl)); }
255 
257  template <typename EvalT>
258  Teuchos::RCP<PHX::Evaluator<Traits> > buildGatherOrientation(const Teuchos::ParameterList & pl) const
259  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(gatherOrientManager_->template getAsBase<EvalT>()->clone(pl)); }
260 
262  template <typename EvalT>
263  Teuchos::RCP<PHX::Evaluator<Traits> > buildScatterDirichlet(const Teuchos::ParameterList & pl) const
264  { return Teuchos::rcp_dynamic_cast<PHX::Evaluator<Traits> >(scatterDirichletManager_->template getAsBase<EvalT>()->clone(pl)); }
265 
267  PANZER_DEPRECATED Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> getUniqueGlobalIndexerBase() const
268  { return getRangeGlobalIndexer(); }
269 
271  virtual Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> getDomainGlobalIndexer() const = 0;
272 
274  virtual Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> getRangeGlobalIndexer() const = 0;
275 
276  virtual void beginFill(LinearObjContainer & loc) const {}
277  virtual void endFill(LinearObjContainer & loc) const {}
278 
279 private:
280  typedef PHX::TemplateManager<typename Traits::EvalTypes,
282  PHX::EvaluatorDerived<_,Traits> >
284 
285  // managers to build the scatter/gather evaluators
286  Teuchos::RCP<Evaluator_TemplateManager> scatterManager_;
287  Teuchos::RCP<Evaluator_TemplateManager> scatterDirichletManager_;
288  Teuchos::RCP<Evaluator_TemplateManager> gatherManager_;
289  Teuchos::RCP<Evaluator_TemplateManager> gatherTangentManager_;
290  Teuchos::RCP<Evaluator_TemplateManager> gatherDomainManager_;
291  Teuchos::RCP<Evaluator_TemplateManager> gatherOrientManager_;
292 
293  template <typename BuilderT>
295  Teuchos::RCP<const BuilderT> builder_;
296 
297  Scatter_Builder(const Teuchos::RCP<const BuilderT> & builder)
298  : builder_(builder) {}
299 
300  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
301  { return builder_->template buildScatter<EvalT>(); }
302  };
303 
304  template <typename BuilderT>
306  Teuchos::RCP<const BuilderT> builder_;
307 
308  ScatterDirichlet_Builder(const Teuchos::RCP<const BuilderT> & builder)
309  : builder_(builder) {}
310 
311  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
312  { return builder_->template buildScatterDirichlet<EvalT>(); }
313  };
314 
315  template <typename BuilderT>
316  struct Gather_Builder {
317  Teuchos::RCP<const BuilderT> builder_;
318 
319  Gather_Builder(const Teuchos::RCP<const BuilderT> & builder)
320  : builder_(builder) {}
321 
322  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
323  { return builder_->template buildGather<EvalT>(); }
324  };
325 
326  template <typename BuilderT>
328  Teuchos::RCP<const BuilderT> builder_;
329 
330  GatherTangent_Builder(const Teuchos::RCP<const BuilderT> & builder)
331  : builder_(builder) {}
332 
333  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
334  { return builder_->template buildGatherTangent<EvalT>(); }
335  };
336 
337  template <typename BuilderT>
339  Teuchos::RCP<const BuilderT> builder_;
340 
341  GatherDomain_Builder(const Teuchos::RCP<const BuilderT> & builder)
342  : builder_(builder) {}
343 
344  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
345  { return builder_->template buildGatherDomain<EvalT>(); }
346  };
347 
348  template <typename BuilderT>
350  Teuchos::RCP<const BuilderT> builder_;
351 
352  GatherOrientation_Builder(const Teuchos::RCP<const BuilderT> & builder)
353  : builder_(builder) {}
354 
355  template <typename EvalT> Teuchos::RCP<panzer::CloneableEvaluator> build() const
356  { return builder_->template buildGatherOrientation<EvalT>(); }
357  };
358 };
359 
360 template<typename Traits>
361 template <typename BuilderT>
362 inline void LinearObjFactory<Traits>::
363 buildGatherScatterEvaluators(const BuilderT & builder)
364 {
365  using Teuchos::rcp;
366  using Teuchos::rcpFromRef;
367 
368  scatterManager_ = rcp(new Evaluator_TemplateManager);
369  scatterManager_->buildObjects(Scatter_Builder<BuilderT>(rcpFromRef(builder)));
370 
371  scatterDirichletManager_ = Teuchos::rcp(new Evaluator_TemplateManager);
372  scatterDirichletManager_->buildObjects(ScatterDirichlet_Builder<BuilderT>(rcpFromRef(builder)));
373 
374  gatherManager_ = Teuchos::rcp(new Evaluator_TemplateManager);
375  gatherManager_->buildObjects(Gather_Builder<BuilderT>(rcpFromRef(builder)));
376 
377  gatherTangentManager_ = Teuchos::rcp(new Evaluator_TemplateManager);
378  gatherTangentManager_->buildObjects(GatherTangent_Builder<BuilderT>(rcpFromRef(builder)));
379 
380  gatherDomainManager_ = Teuchos::rcp(new Evaluator_TemplateManager);
381  gatherDomainManager_->buildObjects(GatherDomain_Builder<BuilderT>(rcpFromRef(builder)));
382 
383  gatherOrientManager_ = Teuchos::rcp(new Evaluator_TemplateManager);
384  gatherOrientManager_->buildObjects(GatherOrientation_Builder<BuilderT>(rcpFromRef(builder)));
385 }
386 
387 }
388 
389 #endif
Teuchos::RCP< PHX::Evaluator< Traits > > buildScatterDirichlet(const Teuchos::ParameterList &pl) const
Use preconstructed dirichlet scatter evaluators.
virtual Teuchos::MpiComm< int > getComm() const =0
Teuchos::RCP< Evaluator_TemplateManager > gatherManager_
Sacado::mpl::vector< Residual, Jacobian, Tangent > EvalTypes
GatherDomain_Builder(const Teuchos::RCP< const BuilderT > &builder)
Teuchos::RCP< panzer::CloneableEvaluator > build() const
Teuchos::RCP< Evaluator_TemplateManager > scatterDirichletManager_
GatherOrientation_Builder(const Teuchos::RCP< const BuilderT > &builder)
Scatter_Builder(const Teuchos::RCP< const BuilderT > &builder)
Teuchos::RCP< panzer::CloneableEvaluator > build() const
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const =0
Teuchos::RCP< PHX::Evaluator< Traits > > buildGatherTangent(const Teuchos::ParameterList &pl) const
Use preconstructed gather evaluators.
Teuchos::RCP< panzer::CloneableEvaluator > build() const
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildDomainContainer() const =0
Teuchos::RCP< PHX::Evaluator< Traits > > buildGather(const Teuchos::ParameterList &pl) const
Use preconstructed gather evaluators.
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const =0
Teuchos::RCP< Evaluator_TemplateManager > gatherTangentManager_
virtual void initializeContainer(int, LinearObjContainer &loc) const =0
Teuchos::RCP< panzer::CloneableEvaluator > build() const
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const =0
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const =0
Teuchos::RCP< Evaluator_TemplateManager > gatherOrientManager_
PHX::TemplateManager< typename Traits::EvalTypes, panzer::CloneableEvaluator, PHX::EvaluatorDerived< _, Traits > > Evaluator_TemplateManager
virtual Teuchos::RCP< const panzer::UniqueGlobalIndexerBase > getDomainGlobalIndexer() const =0
Get the domain global indexer object associated with this factory.
virtual Teuchos::RCP< const panzer::UniqueGlobalIndexerBase > getRangeGlobalIndexer() const =0
Get the range global indexer object associated with this factory.
Teuchos::RCP< PHX::Evaluator< Traits > > buildScatter(const Teuchos::ParameterList &pl) const
Use preconstructed scatter evaluators.
virtual void writeVector(const std::string &identifier, const LinearObjContainer &loc, int id) const =0
GatherTangent_Builder(const Teuchos::RCP< const BuilderT > &builder)
PANZER_DEPRECATED Teuchos::RCP< const panzer::UniqueGlobalIndexerBase > getUniqueGlobalIndexerBase() const
Get the range global indexer object associated with this factory.
virtual void readVector(const std::string &identifier, LinearObjContainer &loc, int id) const =0
virtual void beginFill(LinearObjContainer &loc) const
Teuchos::RCP< PHX::Evaluator< Traits > > buildGatherDomain(const Teuchos::ParameterList &pl) const
Use preconstructed gather evaluators.
Teuchos::RCP< Evaluator_TemplateManager > scatterManager_
Gather_Builder(const Teuchos::RCP< const BuilderT > &builder)
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const =0
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const =0
virtual void initializeGhostedContainer(int, LinearObjContainer &loc) const =0
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const =0
Teuchos::RCP< panzer::CloneableEvaluator > build() const
void buildGatherScatterEvaluators(const BuilderT &builder)
Teuchos::RCP< Evaluator_TemplateManager > gatherDomainManager_
ScatterDirichlet_Builder(const Teuchos::RCP< const BuilderT > &builder)
Non-templated empty base class for template managers.
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const =0
virtual void endFill(LinearObjContainer &loc) const
Teuchos::RCP< PHX::Evaluator< Traits > > buildGatherOrientation(const Teuchos::ParameterList &pl) const
Use preconstructed gather evaluators.
Teuchos::RCP< panzer::CloneableEvaluator > build() const