Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_BlockedTpetraLinearObjFactory.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_BlockedTpetraLinearObjFactory_hpp__
44#define __Panzer_BlockedTpetraLinearObjFactory_hpp__
45
46#include <map>
47
48// Tpetra includes
49#include "Tpetra_Map.hpp"
50#include "Tpetra_CrsGraph.hpp"
51#include "Tpetra_Import.hpp"
52#include "Tpetra_Export.hpp"
53
54#include "PanzerDiscFE_config.hpp"
62#include "Panzer_HashUtils.hpp" // for pair_hash
63
64#include "Panzer_GatherOrientation.hpp"
70
71#include "Thyra_BlockedLinearOpBase.hpp"
72#include "Thyra_ProductVectorBase.hpp"
73
74#include "Teuchos_RCP.hpp"
75#include "Teuchos_DefaultMpiComm.hpp"
76#include "Teuchos_OpaqueWrapper.hpp"
77
78namespace panzer {
79
80template <typename Traits,typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT=panzer::TpetraNodeType>
82 , public ThyraObjFactory<double> {
83public:
85 typedef Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> VectorType;
86 typedef Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> CrsMatrixType;
87 typedef Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> OperatorType;
88 typedef Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> CrsGraphType;
89 typedef Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> MapType;
90 typedef Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> ImportType;
91 typedef Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> ExportType;
92
93 typedef Thyra::TpetraVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> ThyraVector;
94 typedef Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> ThyraLinearOp;
95
96
97 BlockedTpetraLinearObjFactory(const Teuchos::RCP<const Teuchos::MpiComm<int> > & comm,
98 const Teuchos::RCP<const BlockedDOFManager> & gidProvider);
99
104 BlockedTpetraLinearObjFactory(const Teuchos::RCP<const Teuchos::MpiComm<int> > & comm,
105 const std::vector<Teuchos::RCP<const panzer::GlobalIndexer>> & gidProviders);
106
108
109/*************** Linear object factory methods *******************/
110
111 virtual void readVector(const std::string & /* identifier */, LinearObjContainer & /* loc */, int /* id */) const
112 { TEUCHOS_ASSERT(false); }
113
114 virtual void writeVector(const std::string & /* identifier */, const LinearObjContainer & /* loc */, int /* id */) const
115 { TEUCHOS_ASSERT(false); }
116
117 virtual Teuchos::RCP<LinearObjContainer> buildLinearObjContainer() const;
118
119 virtual Teuchos::RCP<LinearObjContainer> buildPrimitiveLinearObjContainer() const
120 { return buildLinearObjContainer(); }
121
122 virtual Teuchos::RCP<LinearObjContainer> buildGhostedLinearObjContainer() const;
123
124 virtual Teuchos::RCP<LinearObjContainer> buildPrimitiveGhostedLinearObjContainer() const
126
127 virtual void globalToGhostContainer(const LinearObjContainer & container,
128 LinearObjContainer & ghostContainer,int) const;
129 virtual void ghostToGlobalContainer(const LinearObjContainer & ghostContainer,
130 LinearObjContainer & container,int) const;
131
138 virtual void adjustForDirichletConditions(const LinearObjContainer & localBCRows,
139 const LinearObjContainer & globalBCRows,
140 LinearObjContainer & ghostedObjs,
141 bool zeroVectorRows=false, bool adjustX = false) const;
142
146 virtual void applyDirichletBCs(const LinearObjContainer & counter,
147 LinearObjContainer & result) const;
148
153 virtual Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData> buildReadOnlyDomainContainer() const;
154
155#ifdef PANZER_HAVE_EPETRA_STACK
160 virtual Teuchos::RCP<WriteVector_GlobalEvaluationData> buildWriteDomainContainer() const;
161#endif
162
164
166 template <typename EvalT>
167 Teuchos::RCP<panzer::CloneableEvaluator> buildScatter() const
169
171 template <typename EvalT>
172 Teuchos::RCP<panzer::CloneableEvaluator > buildGather() const
174
176 template <typename EvalT>
177 Teuchos::RCP<panzer::CloneableEvaluator > buildGatherTangent() const
179
181 template <typename EvalT>
182 Teuchos::RCP<panzer::CloneableEvaluator > buildGatherDomain() const
184
186 template <typename EvalT>
187 Teuchos::RCP<panzer::CloneableEvaluator > buildGatherOrientation() const
188 { return Teuchos::rcp(new GatherOrientation<EvalT,Traits,LocalOrdinalT,GlobalOrdinalT>(nc2c_vector(blockedDOFManager_->getFieldDOFManagers()))); }
189
191 template <typename EvalT>
192 Teuchos::RCP<panzer::CloneableEvaluator> buildScatterDirichlet() const
194
195/*************** Generic helper functions for container setup *******************/
196
202 void initializeContainer(int,LinearObjContainer & loc) const;
203
209 void initializeContainer(int mem,BTLOC & loc) const;
210
217
223 void initializeGhostedContainer(int mem,BTLOC & loc) const;
224
225/*************** Thyra based methods *******************/
226
228 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getThyraDomainSpace() const;
229
231 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getThyraRangeSpace() const;
232
234 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getThyraDomainSpace(int blk) const;
235
237 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getThyraRangeSpace(int blk) const;
238
240 Teuchos::RCP<Thyra::VectorBase<ScalarT> > getThyraDomainVector() const;
241
243 Teuchos::RCP<Thyra::VectorBase<ScalarT> > getThyraRangeVector() const;
244
246 Teuchos::RCP<Thyra::LinearOpBase<ScalarT> > getThyraMatrix() const;
247
248 // and now the ghosted versions
249
251 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getGhostedThyraDomainSpace() const;
252
254 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > getGhostedThyraRangeSpace() const;
255
257 Teuchos::RCP<Thyra::VectorBase<ScalarT> > getGhostedThyraDomainVector() const;
258
260 Teuchos::RCP<Thyra::VectorBase<ScalarT> > getGhostedThyraRangeVector() const;
261
263 Teuchos::RCP<Thyra::BlockedLinearOpBase<ScalarT> > getGhostedThyraMatrix() const;
264
265/*************** Tpetra based methods *******************/
266
268 virtual Teuchos::RCP<const MapType> getMap(int i) const;
269
271 virtual Teuchos::RCP<const MapType> getGhostedMap(int i) const;
272
274 virtual Teuchos::RCP<const CrsGraphType> getGraph(int i,int j) const;
275
277 virtual Teuchos::RCP<const CrsGraphType> getGhostedGraph(int i,int j) const;
278
280 virtual Teuchos::RCP<const ImportType> getGhostedImport(int i) const;
281
283 virtual Teuchos::RCP<const ExportType> getGhostedExport(int j) const;
284
285 Teuchos::RCP<CrsMatrixType> getTpetraMatrix(int i,int j) const;
286 Teuchos::RCP<CrsMatrixType> getGhostedTpetraMatrix(int i,int j) const;
287
288 Teuchos::RCP<VectorType> getTpetraDomainVector(int i) const;
289 Teuchos::RCP<VectorType> getGhostedTpetraDomainVector(int i) const;
290
291 Teuchos::RCP<VectorType> getTpetraRangeVector(int i) const;
292 Teuchos::RCP<VectorType> getGhostedTpetraRangeVector(int i) const;
293
295 int getBlockRowCount() const;
296
298 int getBlockColCount() const;
299
301 void addExcludedPair(int rowBlock,int colBlock);
302
304 void addExcludedPairs(const std::vector<std::pair<int,int> > & exPairs);
305
306 virtual void beginFill(LinearObjContainer & loc) const;
307 virtual void endFill(LinearObjContainer & loc) const;
308
309 Teuchos::RCP<const panzer::BlockedDOFManager> getGlobalIndexer() const
310 { return blockedDOFManager_; }
311
313 Teuchos::RCP<const panzer::GlobalIndexer> getDomainGlobalIndexer() const
314 { return blockProvider_; }
315
317 Teuchos::RCP<const panzer::GlobalIndexer> getRangeGlobalIndexer() const
318 { return blockProvider_; }
319
320protected:
321/*************** Generic methods/members *******************/
322
323 // Get the global indexer associated with a particular block
324 Teuchos::RCP<const GlobalIndexer> getGlobalIndexer(int i) const;
325
327 void makeRoomForBlocks(std::size_t blockCnt);
328
329 Teuchos::RCP<const GlobalIndexer> blockProvider_;
330 Teuchos::RCP<const BlockedDOFManager> blockedDOFManager_;
331 std::vector<Teuchos::RCP<const GlobalIndexer> > gidProviders_;
332
333 // which block entries are ignored
334 std::unordered_set<std::pair<int,int>,panzer::pair_hash> excludedPairs_;
335
336/*************** Thyra based methods/members *******************/
337
338 void ghostToGlobalThyraVector(const Teuchos::RCP<const Thyra::VectorBase<ScalarT> > & in,
339 const Teuchos::RCP<Thyra::VectorBase<ScalarT> > & out) const;
341 void globalToGhostThyraVector(const Teuchos::RCP<const Thyra::VectorBase<ScalarT> > & in,
342 const Teuchos::RCP<Thyra::VectorBase<ScalarT> > & out) const;
343
344 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> > rangeSpace_;
345 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> > domainSpace_;
346
347 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> > ghostedRangeSpace_;
348 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> > ghostedDomainSpace_;
349
350/*************** Tpetra based methods/members *******************/
351
352 void adjustForDirichletConditions(const VectorType & local_bcs,
353 const VectorType & global_bcs,
354 const Teuchos::Ptr<VectorType> & f,
355 const Teuchos::Ptr<CrsMatrixType> & A,
356 bool zeroVectorRows) const;
357
358 void ghostToGlobalTpetraVector(int i,const VectorType & in,VectorType & out) const;
359 void ghostToGlobalTpetraMatrix(int blockRow,const CrsMatrixType & in,CrsMatrixType & out) const;
360 void globalToGhostTpetraVector(int i,const VectorType & in,VectorType & out) const;
361
362 // get the map from the matrix
363 virtual Teuchos::RCP<const MapType> buildTpetraMap(int i) const;
364 virtual Teuchos::RCP<const MapType> buildTpetraGhostedMap(int i) const;
365
366 // get the graph of the crs matrix
367 virtual Teuchos::RCP<const CrsGraphType> buildTpetraGraph(int i,int j) const;
368 virtual Teuchos::RCP<const CrsGraphType> buildTpetraGhostedGraph(int i,int j) const;
369
370 // storage for Tpetra graphs and maps
371 Teuchos::RCP<const Teuchos::MpiComm<int> > comm_;
372 mutable std::vector<Teuchos::RCP<const MapType> > maps_;
373 mutable std::vector<Teuchos::RCP<const MapType> > ghostedMaps_;
374 mutable std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,panzer::pair_hash> graphs_ ;
375 mutable std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,panzer::pair_hash> ghostedGraphs_;
376
377 mutable std::vector<Teuchos::RCP<const ImportType> > importers_;
378 mutable std::vector<Teuchos::RCP<const ExportType> > exporters_;
379};
380
381}
382
383#endif
PHX::MDField< ScalarT, panzer::Cell, panzer::IP > result
A field that will be used to build up the result of the integral we're performing.
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherDomain() const
Use preconstructed gather evaluators.
Teuchos::RCP< const panzer::GlobalIndexer > getRangeGlobalIndexer() const
Get the range unique global indexer this factory was created with.
Tpetra::Operator< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > OperatorType
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraRangeVector() const
Get a range vector.
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Teuchos::RCP< panzer::CloneableEvaluator > buildGather() const
Use preconstructed gather evaluators.
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
Teuchos::RCP< const panzer::GlobalIndexer > getDomainGlobalIndexer() const
Get the domain unique global indexer this factory was created with.
std::vector< Teuchos::RCP< const GlobalIndexer > > gidProviders_
void initializeGhostedContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraDomainVector() const
Get a domain vector.
Teuchos::RCP< const Teuchos::MpiComm< int > > comm_
std::vector< Teuchos::RCP< const MapType > > ghostedMaps_
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraDomainSpace() const
Get the domain vector space (x and dxdt)
Teuchos::RCP< const BlockedDOFManager > blockedDOFManager_
virtual Teuchos::RCP< const CrsGraphType > getGhostedGraph(int i, int j) const
get the ghosted graph of the crs matrix
virtual Teuchos::RCP< const MapType > getMap(int i) const
get the map from the matrix
Teuchos::RCP< panzer::CloneableEvaluator > buildScatterDirichlet() const
Use preconstructed dirichlet scatter evaluators.
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
std::vector< Teuchos::RCP< const ExportType > > exporters_
virtual Teuchos::RCP< const MapType > buildTpetraGhostedMap(int i) const
virtual Teuchos::RCP< const MapType > buildTpetraMap(int i) const
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGraph(int i, int j) const
Teuchos::RCP< VectorType > getGhostedTpetraRangeVector(int i) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain vector space (x and dxdt)
void makeRoomForBlocks(std::size_t blockCnt)
Allocate the space in the std::vector objects so we can fill with appropriate Tpetra data.
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraRangeVector() const
Get a range vector.
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildReadOnlyDomainContainer() const
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > graphs_
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
Teuchos::RCP< panzer::CloneableEvaluator > buildScatter() const
Use preconstructed scatter evaluators.
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGhostedGraph(int i, int j) const
virtual Teuchos::RCP< const MapType > getGhostedMap(int i) const
get the ghosted map from the matrix
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherTangent() const
Use preconstructed gather evaluators.
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
Teuchos::RCP< VectorType > getGhostedTpetraDomainVector(int i) const
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedDomainSpace_
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraRangeSpace() const
Get the range vector space (f)
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > ghostedGraphs_
virtual void writeVector(const std::string &, const LinearObjContainer &, int) const
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherOrientation() const
Use preconstructed gather evaluators.
Teuchos::RCP< CrsMatrixType > getTpetraMatrix(int i, int j) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
std::vector< Teuchos::RCP< const MapType > > maps_
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
void globalToGhostTpetraVector(int i, const VectorType &in, VectorType &out) const
virtual void readVector(const std::string &, LinearObjContainer &, int) const
BlockedTpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::MpiComm< int > > &comm, const Teuchos::RCP< const BlockedDOFManager > &gidProvider)
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
std::vector< Teuchos::RCP< const ImportType > > importers_
void ghostToGlobalTpetraVector(int i, const VectorType &in, VectorType &out) const
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< ScalarT > &in, Thyra::LinearOpBase< ScalarT > &out) const
void ghostToGlobalTpetraMatrix(int blockRow, const CrsMatrixType &in, CrsMatrixType &out) const
std::unordered_set< std::pair< int, int >, panzer::pair_hash > excludedPairs_
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > domainSpace_
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range vector space (f)
Thyra::TpetraLinearOp< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraLinearOp
Teuchos::RCP< CrsMatrixType > getGhostedTpetraMatrix(int i, int j) const
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedRangeSpace_
virtual Teuchos::RCP< const ImportType > getGhostedImport(int i) const
get importer for converting an overalapped object to a "normal" object
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > rangeSpace_
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const
BlockedTpetraLinearObjContainer< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > BTLOC
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
virtual Teuchos::RCP< const ExportType > getGhostedExport(int j) const
get exporter for converting an overalapped object to a "normal" object
Thyra::TpetraVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraVector
Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a Thyra operator.
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraDomainVector() const
Get a domain vector.
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const
virtual Teuchos::RCP< const CrsGraphType > getGraph(int i, int j) const
get the graph of the crs matrix
Teuchos::RCP< const panzer::BlockedDOFManager > getGlobalIndexer() const
Teuchos::RCP< Thyra::BlockedLinearOpBase< ScalarT > > getGhostedThyraMatrix() const
Get a Thyra operator.
Gathers orientations per field from the global indexer and stores them in the field manager.
Gathers solution values from the Newton solution vector into the nodal fields of the field manager.
Gathers tangent vectors dx/dp for computing df/dx*dx/dp + df/dp into the nodal fields of the field ma...
Pushes residual values into the residual vector for a Newton-based solve.
Pushes residual values into the residual vector for a Newton-based solve.
std::vector< Teuchos::RCP< const GlobalIndexer > > nc2c_vector(const std::vector< Teuchos::RCP< GlobalIndexer > > &ugis)