Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_Response_Functional.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Panzer: A partial differential equation assembly
4 // engine for strongly coupled complex multiphysics systems
5 //
6 // Copyright 2011 NTESS and the Panzer contributors.
7 // SPDX-License-Identifier: BSD-3-Clause
8 // *****************************************************************************
9 // @HEADER
10 
11 #ifndef __Panzer_Response_Functional_hpp__
12 #define __Panzer_Response_Functional_hpp__
13 
14 #include <string>
15 
16 
17 #include <mpi.h> // need for comm
18 
19 #include "Teuchos_RCP.hpp"
20 
21 #include "Thyra_VectorBase.hpp"
22 #include "Thyra_VectorSpaceBase.hpp"
23 
24 #include "PanzerDiscFE_config.hpp"
25 #ifdef PANZER_HAVE_EPETRA_STACK
26 #include "Epetra_Map.h"
27 #include "Epetra_Vector.h"
28 #include "Epetra_MpiComm.h"
29 #endif
30 
36 
37 
38 namespace panzer {
39 
44 template <typename EvalT>
47 public:
48  typedef typename EvalT::ScalarT ScalarT;
49 
50  Response_Functional(const std::string & responseName,MPI_Comm comm,
51  const Teuchos::RCP<const panzer::LinearObjFactory<panzer::Traits> > & linObjFact=Teuchos::null)
52  : ResponseMESupport_Default<EvalT>(responseName,comm), value(0.0), linObjFactory_(linObjFact)
53  {
54  if(linObjFactory_!=Teuchos::null) {
55  // requires thyra object factory
56  thyraObjFactory_ = Teuchos::rcp_dynamic_cast<const panzer::ThyraObjFactory<double> >(linObjFactory_,true);
57  setSolnVectorSpace(thyraObjFactory_->getThyraDomainSpace());
58 
59  // build a ghosted container, with a solution vector
60  ghostedContainer_ = linObjFactory_->buildGhostedLinearObjContainer();
61 
62  // set ghosted container (work space for assembly)
63  linObjFactory_->initializeGhostedContainer(panzer::LinearObjContainer::X,*ghostedContainer_);
64 
65  using Teuchos::rcp_dynamic_cast;
66  }
67  }
68 
71 
73  virtual void scatterResponse();
74 
75  virtual void initializeResponse()
76  { value = 0.0; if(ghostedContainer_!=Teuchos::null) ghostedContainer_->initialize(); }
77 
78  // from ResponseMESupport_Default
79 
81  virtual std::size_t localSizeRequired() const { return 1; }
82 
84  virtual bool vectorIsDistributed() const { return false; }
85 
88  { return Teuchos::rcp_dynamic_cast<const ThyraObjContainer<double> >(ghostedContainer_)->get_x_th(); }
89 
90  void adjustForDirichletConditions(const GlobalEvaluationData & localBCRows,const GlobalEvaluationData & globalBCRows);
91 
92 private:
95 
96  // hide these methods
99 
102 
105 };
106 
107 }
108 
109 #endif
Response_Functional(const std::string &responseName, MPI_Comm comm, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &linObjFact=Teuchos::null)
ScalarT value
provide direct access, this thing is pretty simple
Teuchos::RCP< LinearObjContainer > ghostedContainer_
virtual bool vectorIsDistributed() const
Is the vector distributed (or replicated)
virtual void scatterResponse()
This simply does global summation, then shoves the result into a vector.
Teuchos::RCP< const panzer::ThyraObjFactory< double > > thyraObjFactory_
virtual std::size_t localSizeRequired() const
What is the number of values you need locally.
Teuchos::RCP< LinearObjContainer > uniqueContainer_
void setSolnVectorSpace(const Teuchos::RCP< const Thyra::VectorSpaceBase< double > > &soln_vs)
Set solution vector space.
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > linObjFactory_
void adjustForDirichletConditions(const GlobalEvaluationData &localBCRows, const GlobalEvaluationData &globalBCRows)
Teuchos::RCP< Thyra::VectorBase< double > > getGhostedVector() const
Get ghosted responses (this will be filled by the evaluator)