9#include <fei_iostream.hpp>
10#include <fei_sstream.hpp>
11#include <fei_DirichletBCManager.hpp>
12#include <fei_DirichletBCRecord.hpp>
13#include <fei_NodeDatabase.hpp>
14#include <fei_EqnBuffer.hpp>
15#include <fei_SharedPtr.hpp>
16#include <fei_VectorSpace.hpp>
17#include <fei_Matrix.hpp>
22typedef std::vector<fei::DirichletBCRecord> DBCvec;
25#define fei_file "fei_DirichletBCManager.cpp"
26#include <fei_ErrMacros.hpp>
31DirichletBCManager::getEqnNumber(
int IDType,
int ID,
int fieldID,
int offsetIntoField)
35 if (vecSpace_.get() != NULL) {
36 vecSpace_->getGlobalIndex(IDType, ID, fieldID, eqn);
39 if (structure_ == NULL) {
40 throw std::runtime_error(
"fei::DirichletBCManager has NULL SNL_FEI_Structure.");
46 throw std::runtime_error(
"fei::DirichletBCManager::getEqnNumber failed to get node.");
51 catch(std::runtime_error& exc) {
52 FEI_OSTRINGSTREAM osstr;
53 osstr <<
"fei::DirichletBCManager::finalizeBCEqns caught exception: "
54 << exc.what() <<
" BC IDType="<<IDType<<
", ID="<<ID
55 <<
", fieldID="<<fieldID;
60 return eqn + offsetIntoField;
64DirichletBCManager::addBCRecords(
int numBCs,
69 const double* prescribedValues)
71 for(
int i=0; i<numBCs; ++i) {
72 int eqn = getEqnNumber(IDType, IDs[i], fieldID, offsetIntoField);
74 bc_map::iterator iter = bcs_.lower_bound(eqn);
76 if (iter == bcs_.end() || iter->first != eqn) {
77 bcs_.insert(iter, std::make_pair(eqn, prescribedValues[i]));
80 else iter->second = prescribedValues[i];
85DirichletBCManager::addBCRecords(
int numBCs,
89 const int* offsetsIntoField,
90 const double* prescribedValues)
92 for(
int i=0; i<numBCs; ++i) {
93 int eqn = getEqnNumber(IDType, IDs[i], fieldID, offsetsIntoField[i]);
95 bc_map::iterator iter = bcs_.lower_bound(eqn);
97 if (iter == bcs_.end() || iter->first != eqn) {
98 bcs_.insert(iter, std::make_pair(eqn, prescribedValues[i]));
101 else iter->second = prescribedValues[i];
106DirichletBCManager::finalizeBCEqns(
fei::Matrix& matrix,
107 bool throw_if_bc_slave_conflict)
110 bool haveSlaves = reducer.
get()!=NULL;
118 bc_map::iterator iter = bcs_.begin(), iter_end = bcs_.end();
120 for(; iter!=iter_end; ++iter) {
122 int eqn = iter->first;
125 if (reducer->isSlaveEqn(eqn)) {
126 if (throw_if_bc_slave_conflict) {
127 FEI_OSTRINGSTREAM osstr;
128 osstr <<
"fei BCManager::finalizeBCeqns ERROR, eqn="<<eqn
129 <<
" is both a BC eqn and slave-constraint eqn.";
130 throw std::runtime_error(osstr.str());
136 double* ptr = &iter->second;
138 CHK_ERR( matrix.
copyIn(1, &eqn, 1, &eqn, &ptr) );
146DirichletBCManager::finalizeBCEqns(
EqnBuffer& bcEqns)
150 bc_map::iterator iter = bcs_.begin(), iter_end = bcs_.end();
152 for(; iter!=iter_end; ++iter) {
153 int eqn = iter->first;
154 double coef = iter->second;
156 CHK_ERR( bcEqns.
addEqn(eqn, &coef, &eqn, 1,
false) );
164DirichletBCManager::getNumBCRecords()
const
170DirichletBCManager::clearAllBCs()
int addEqn(int eqnNumber, const double *coefs, const int *indices, int len, bool accumulate, bool create_indices_union=false)
int getNodeWithID(GlobalID nodeID, const NodeDescriptor *&node) const
bool getFieldEqnNumber(int fieldID, int &eqnNumber) const
virtual fei::SharedPtr< fei::Reducer > getReducer()=0
virtual fei::SharedPtr< fei::MatrixGraph > getMatrixGraph() const =0
virtual int copyIn(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, int format=0)=0
std::ostream & console_out()