FEI Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
snl_fei_Broker_FEData.hpp
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright 2005 Sandia Corporation. */
3/* Under the terms of Contract DE-AC04-94AL85000, there is a */
4/* non-exclusive license for use of this work by or on behalf */
5/* of the U.S. Government. Export of this program may require */
6/* a license from the United States Government. */
7/*--------------------------------------------------------------------*/
8
9#ifndef _snl_fei_Broker_FEData_hpp_
10#define _snl_fei_Broker_FEData_hpp_
11
12#include <fei_macros.hpp>
13#include <fei_mpi.h>
14#include <snl_fei_Broker.hpp>
16#include <fei_VectorSpace.hpp>
17#include <fei_MatrixGraph.hpp>
18#include <fei_Matrix_Impl.hpp>
19#include <fei_Pattern.hpp>
20#include <fei_Vector_Impl.hpp>
23#include <fei_Lookup_Impl.hpp>
24
25#undef fei_file
26#define fei_file "snl_fei_Broker_FEData.hpp"
27#include <fei_ErrMacros.hpp>
28
29namespace snl_fei {
30
35 public:
39 int nodeIDType);
40
42 virtual ~Broker_FEData();
43
53 virtual fei::SharedPtr<fei::Vector> createVector(bool isSolutionVector=false)
54 {
56 if (matrixGraph_.get() == NULL) return(vptr);
57
58 if (setStructure() != 0) return(vptr);
59
60 int localsize = matrixGraph_->getRowSpace()->getNumIndices_Owned();
63 feData_.get(), localsize,
64 isSolutionVector));
65 return(vecptr);
66 }
67
71 {
73 if (matrixGraph_.get() == NULL) return(mptr);
74
75 if (setStructure() != 0) return(mptr);
76 int localsize = matrixGraph_->getRowSpace()->getNumIndices_Owned();
77
78 bool zeroSharedRows = false;
81 matrixGraph_, localsize, zeroSharedRows));
82 return(matptr);
83 }
84
88 {
90 if (matrixGraph_.get() == NULL) return(lsptr);
91
92 if (setStructure() != 0) return(lsptr);
93
95 linsysfed = new LinearSystem_FEData(feData_,
97 linsysfed->setLookup(lookup_);
98 fei::SharedPtr<fei::LinearSystem> linsysptr(linsysfed);
99 return(linsysptr);
100 }
101
104 {
105 matrixGraph_ = matrixGraph;
106 }
107
108 private:
110 {
111 if (matrixGraph_.get() == NULL) ERReturn(-1);
112 if (setStructure_ == true) return(0);
113
115
117
119
120 int numLocalNodes = vspace->getNumOwnedAndSharedIDs(nodeIDType_);
121
122 int numElemBlocks = matrixGraph_->getNumConnectivityBlocks();
123
124 int nodeType = 0;
125 snl_fei::RecordCollection* nodeRecords = NULL;
126 vspace->getRecordCollection(nodeType, nodeRecords);
127
128 int* intData = new int[numElemBlocks*3];
129 int* numElemsPerBlock = intData;
130 int* numNodesPerElem = intData+numElemBlocks;
131 int* elemMatrixSizePerBlock = intData+2*numElemBlocks;
132 int i;
133
134 std::vector<int> elemBlockIDs;
136
137 for(i=0; i<numElemBlocks; ++i) {
138 const fei::ConnectivityBlock* cblock =
139 matrixGraph_->getConnectivityBlock(elemBlockIDs[i]);
140 if (cblock==NULL) return(-1);
141 numElemsPerBlock[i] = cblock->getConnectivityIDs().size();
142 numNodesPerElem[i] = cblock->getRowPattern()->getNumIDs();
143 elemMatrixSizePerBlock[i] = cblock->getRowPattern()->getNumIndices();
144 }
145
146 int numSharedNodes = 0;
147 CHK_ERR( vspace->getNumSharedIDs(nodeIDType_, numSharedNodes) );
148
149 int numLagrangeConstraints = matrixGraph_->getLocalNumLagrangeConstraints();
150
151 CHK_ERR( feData_->describeStructure(numElemBlocks,
152 numElemsPerBlock,
153 numNodesPerElem,
154 elemMatrixSizePerBlock,
155 numLocalNodes,
156 numSharedNodes,
157 numLagrangeConstraints) );
158
159 std::map<int,fei::ConnectivityBlock*>::const_iterator
160 cdb_iter = matrixGraph_->getConnectivityBlocks().begin();
161
162 std::vector<int> nodeNumbers, numDofPerNode, dof_ids;
163 int total_num_dof = 0;
164 for(i=0; i<numElemBlocks; ++i, ++cdb_iter) {
165 fei::ConnectivityBlock* cblock = (*cdb_iter).second;
166 fei::Pattern* pattern = cblock->getRowPattern();
167
168 int numConnectedNodes = pattern->getNumIDs();
169 nodeNumbers.resize(numConnectedNodes);
170 numDofPerNode.resize(numConnectedNodes);
171 int* nodeNumPtr = &nodeNumbers[0];
172 int* numDofPtr = &numDofPerNode[0];
173
174 //For the calls to FiniteElementData::setConnectivity, we're going to
175 //need a list of num-dof-per-node. So construct that now.
176 const int* numFieldsPerID = pattern->getNumFieldsPerID();
177 const int* fieldIDs = pattern->getFieldIDs();
178
179 int foffset = 0;
180 for(int ii=0; ii<numConnectedNodes; ++ii) {
181 int dof = 0;
182 for(int f=0; f<numFieldsPerID[ii]; ++f) {
183 dof += vspace->getFieldSize(fieldIDs[foffset++]);
184 }
185 numDofPtr[ii] = dof;
186 total_num_dof += dof;
187 }
188
189 dof_ids.resize(total_num_dof, 0);
190 int* dof_ids_ptr = &dof_ids[0];
191
193 //Next we'll loop over the connectivity-lists in this block,
194 //making a call to FiniteElementData::setConnectivity for each one.
195
196 std::map<int,int>& elemIDs = cblock->getConnectivityIDs();
197 int numElems = elemIDs.size();
198 int* nodes = &(cblock->getRowConnectivities()[0]);
199
200 int offset = 0;
201 for(int elem=0; elem<numElems; ++elem) {
202 for(int n=0; n<numConnectedNodes; ++n) {
203 fei::Record<int>* node = nodeRecords->getRecordWithLocalID(nodes[offset++]);
204 nodeNumPtr[n] = node->getNumber();
205 }
206
207 CHK_ERR( feData_->setConnectivity(elemBlockIDs[i], elem,
208 numConnectedNodes,
209 nodeNumPtr, numDofPtr, dof_ids_ptr));
210 }//end for(...numElems...)
211 }//end for(...numElemBlocks...)
212
213 delete [] intData;
214
215 setStructure_ = true;
216 return(0);
217 }
218
221
225
227 };//class Broker_FEData
228}//namespace snl_fei
229
230
231#endif // _snl_fei_Broker_FEData_hpp_
virtual int setLookup(Lookup &lookup)=0
virtual int describeStructure(int numElemBlocks, const int *numElemsPerBlock, const int *numNodesPerElem, const int *elemMatrixSizePerBlock, int totalNumNodes, int numSharedNodes, int numMultCRs)=0
virtual int setConnectivity(int elemBlockID, int elemID, int numNodes, const int *nodeNumbers, const int *numDofPerNode, const int *dof_ids)=0
std::vector< int > & getRowConnectivities()
const std::map< int, int > & getConnectivityIDs() const
const fei::Pattern * getRowPattern() const
virtual const fei::ConnectivityBlock * getConnectivityBlock(int blockID) const =0
virtual int getLocalNumLagrangeConstraints() const =0
virtual std::map< int, fei::ConnectivityBlock * > & getConnectivityBlocks()=0
virtual fei::SharedPtr< fei::VectorSpace > getRowSpace()=0
virtual int getConnectivityBlockIDs(std::vector< int > &blockIDs) const =0
virtual int getNumConnectivityBlocks() const =0
const int * getNumFieldsPerID() const
int getNumIDs() const
int getNumIndices() const
const int * getFieldIDs() const
GlobalIDType getNumber() const
void reset(T *p=0)
int getNumIndices_Owned() const
virtual void setMatrixGraph(fei::SharedPtr< fei::MatrixGraph > matrixGraph)
virtual fei::SharedPtr< fei::Vector > createVector(bool isSolutionVector=false)
fei::SharedPtr< FiniteElementData > feData_
virtual fei::SharedPtr< fei::LinearSystem > createLinearSystem()
Broker_FEData(fei::SharedPtr< FiniteElementData > feData, fei::SharedPtr< fei::MatrixGraph > matrixGraph, int nodeIDType)
virtual fei::SharedPtr< fei::Matrix > createMatrix()
fei::SharedPtr< fei::MatrixGraph > matrixGraph_
fei::Record< int > * getRecordWithLocalID(int lid)
#define ERReturn(a)
#define CHK_ERR(a)