Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_OrientationContainer_impl.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_OrientationContainer_impl_hpp__
44#define __Panzer_OrientationContainer_impl_hpp__
45
46#include "PanzerDiscFE_config.hpp"
47
49
50namespace panzer {
51
52template <typename Scalar,typename Array,typename LocalOrdinal,typename GlobalOrdinal>
54OrientationContainer(const Teuchos::RCP<const GlobalIndexer> & globalIndexer,
55 const std::string & fieldName)
56 : globalIndexer_(globalIndexer)
57 , fieldName_(fieldName)
58{
59}
60
61template <typename Scalar,typename Array,typename LocalOrdinal,typename GlobalOrdinal>
62void
64getOrientations(const std::string & blockId,
65 const std::vector<std::size_t> & cell_local_ids,
66 Array & orientationsArray) const
67{
68 int fieldNum = globalIndexer_->getFieldNum(fieldName_);
69 const std::vector<int> & elmtOffset = globalIndexer_->getGIDFieldOffsets(blockId,fieldNum);
70
71 // gather operation for each cell in workset
72 for(std::size_t cellIndex=0;cellIndex<cell_local_ids.size();++cellIndex) {
73 std::vector<double> orientation;
74 std::size_t cellLocalId = cell_local_ids[cellIndex];
75
76 globalIndexer_->getElementOrientation(cellLocalId,orientation);
77
78 // loop over basis functions and fill the fields
79 for(std::size_t basis=0;basis<elmtOffset.size();basis++) {
80 int offset = elmtOffset[basis];
81 orientationsArray(cellIndex,basis) = orientation[offset];
82 }
83 }
84}
85
86template <typename Scalar,typename Array>
87Teuchos::RCP<const OrientationContainerBase<Scalar,Array> >
88buildOrientationContainer(const Teuchos::RCP<const GlobalIndexer> & globalIndexer,
89 const std::string & fieldName)
90{
91 using Teuchos::rcp_dynamic_cast;
92 using Teuchos::RCP;
93 using Teuchos::rcp;
94
95 // int, int
96 {
97 typedef int LO;
98 typedef int GO;
99
100 RCP<const GlobalIndexer> ugi
101 = rcp_dynamic_cast<const GlobalIndexer>(globalIndexer);
102 if(ugi!=Teuchos::null)
103 return rcp(new OrientationContainer<Scalar,Array,LO,GO>(ugi,fieldName));
104 }
105
106 // int, panzer::GlobalOrdinal
107 {
108 typedef int LO;
109 typedef panzer::GlobalOrdinal GO;
110
111 RCP<const GlobalIndexer> ugi
112 = rcp_dynamic_cast<const GlobalIndexer>(globalIndexer);
113 if(ugi!=Teuchos::null)
114 return rcp(new OrientationContainer<Scalar,Array,LO,GO>(ugi,fieldName));
115 }
116
117 // int, pair<int,int>
118 {
119 typedef int LO;
120 typedef std::pair<int,int> GO;
121
122 RCP<const GlobalIndexer> ugi
123 = rcp_dynamic_cast<const GlobalIndexer>(globalIndexer);
124 if(ugi!=Teuchos::null)
125 return rcp(new OrientationContainer<Scalar,Array,LO,GO>(ugi,fieldName));
126 }
127
128 // int, pair<int,panzer::GlobalOrdinal>
129 {
130 typedef int LO;
131 typedef std::pair<int,panzer::GlobalOrdinal> GO;
132
133 RCP<const GlobalIndexer> ugi
134 = rcp_dynamic_cast<const GlobalIndexer>(globalIndexer);
135 if(ugi!=Teuchos::null)
136 return rcp(new OrientationContainer<Scalar,Array,LO,GO>(ugi,fieldName));
137 }
138
139 TEUCHOS_TEST_FOR_EXCEPTION(true,std::logic_error,
140 "panzer::buildOrientationContainer: Could not cast GlobalIndexer");
141}
142
143} // end namespace panzer
144
145#endif
OrientationContainer(const Teuchos::RCP< const panzer::GlobalIndexer > &globalIndexer, const std::string &fieldName)
virtual void getOrientations(const std::string &blockId, const std::vector< std::size_t > &cell_local_ids, Array &orientations) const
Teuchos::RCP< const panzer::OrientationContainerBase< Scalar, Array > > buildOrientationContainer(const Teuchos::RCP< const panzer::GlobalIndexer > &globalIndexer, const std::string &fieldName)