Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_STK_ParameterListCallbackBlocked.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_STK_ParameterListCallbackBlocked_hpp__
44#define __Panzer_STK_ParameterListCallbackBlocked_hpp__
45
46#include "PanzerAdaptersSTK_config.hpp"
47#ifdef PANZER_HAVE_TEKO
48
49#include "Teuchos_RCP.hpp"
50#include "Teuchos_ParameterList.hpp"
51
52#include "Teko_RequestCallback.hpp"
53
56#ifdef PANZER_HAVE_EPETRA_STACK
58#endif
60
61#include <vector>
62#include <map>
63
64namespace panzer_stk {
65
66class STKConnManager;
67
72class ParameterListCallbackBlocked : public Teko::RequestCallback<Teuchos::RCP<Teuchos::ParameterList> > {
73public:
74 ParameterListCallbackBlocked(const Teuchos::RCP<const panzer_stk::STKConnManager> & connManager,
75 const Teuchos::RCP<const panzer::BlockedDOFManager> & blkDofs,
76 const Teuchos::RCP<const panzer::BlockedDOFManager> & auxBlkDofs=Teuchos::null);
77
78 Teuchos::RCP<Teuchos::ParameterList> request(const Teko::RequestMesg & rm);
79
80 bool handlesRequest(const Teko::RequestMesg & rm);
81
82 void preRequest(const Teko::RequestMesg & rm);
83
84private:
85
86 bool isField(const std::string& field) const
87 {
88 // Check both the main and auxiliary UGIs.
89 bool useAux(true);
90 std::vector<Teuchos::RCP<panzer::GlobalIndexer>>
91 fieldDOFMngrs = blocked_ugi_->getFieldDOFManagers();
92 for (int b(0); b < static_cast<int>(fieldDOFMngrs.size()); ++b)
93 {
94 for (int f(0); f < fieldDOFMngrs[b]->getNumFields(); ++f)
95 {
96 if (fieldDOFMngrs[b]->getFieldString(f) == field)
97 useAux = false;
98 }
99 }
100 if (useAux)
101 return (aux_blocked_ugi_->getFieldNum(field) != -1);
102 else
103 return (blocked_ugi_->getFieldNum(field) != -1);
104 }
105
106 void buildArrayToVectorTpetra(int block,const std::string & field, const bool useAux = false);
107 void buildCoordinatesTpetra(const std::string & field, const bool useAux = false);
108
109#ifdef PANZER_HAVE_EPETRA_STACK
110 void buildArrayToVectorEpetra(int block,const std::string & field, const bool useAux = false);
111 void buildCoordinatesEpetra(const std::string & field, const bool useAux = false);
112#endif
113
114 // this method assumes handlesRequest(rm)==true
115 std::string getHandledField(const Teuchos::ParameterList & pl) const;
116
117 void setFieldByKey(const std::string & key,const std::string & field,Teuchos::ParameterList & pl) const;
118
119 // Get the coordinate vector by field, note that it will check to make sure "buildCoordinates" has
120 // been called.
121 const std::vector<double> & getCoordinateByField(int dim,const std::string & field) const;
122
123 // Access the field pattern associated with this field (this will not work if the field pattern
124 // and element blocks are different
125 Teuchos::RCP<const panzer::Intrepid2FieldPattern> getFieldPattern(const std::string & fieldName, const bool useAux = false) const;
126
127 // Generally used members
128 Teuchos::RCP<const panzer_stk::STKConnManager> connManager_;
129 Teuchos::RCP<const panzer::BlockedDOFManager> blocked_ugi_;
130 Teuchos::RCP<const panzer::BlockedDOFManager> aux_blocked_ugi_;
131
132 std::map<std::string,Teuchos::RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns_;
133
134 // look up by field name (field name to coordinates
135
136 std::map<std::string,std::vector<double> > xcoords_;
137 std::map<std::string,std::vector<double> > ycoords_;
138 std::map<std::string,std::vector<double> > zcoords_;
139
140 mutable std::map<std::string,Teuchos::RCP<const panzer::ArrayToFieldVector> > arrayToVectorTpetra_;
141#ifdef PANZER_HAVE_EPETRA_STACK
142 mutable std::map<std::string,Teuchos::RCP<const panzer::ArrayToFieldVectorEpetra> > arrayToVectorEpetra_;
143#endif
144
145 Teuchos::RCP<Tpetra::MultiVector<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> > coordsVecTp_;
146#ifdef PANZER_HAVE_EPETRA_STACK
147 Teuchos::RCP<Epetra_MultiVector> coordsVecEp_;
148#endif
149
150 bool returnTpetraObjects_;
151};
152
153}
154
155#endif // PANZER_HAVE_TEKO
156
157#endif
PHX::MDField< ScalarT, panzer::Cell, panzer::BASIS > field
A field to which we'll contribute, or in which we'll store, the result of computing this integral.