47 #include <Xyce_config.h>
52 #include <N_UTL_Misc.h>
56 #include "N_LAS_Vector.h"
57 #include "N_LAS_Matrix.h"
58 #include "Epetra_MapColoring.h"
59 #include "N_ERH_ErrorMgr.h"
71 Xyce::NodeNamePairMap & op_in,
72 const Teuchos::RefCountPtr <Epetra_MapColoring>& ICcolor_map,
73 const std::vector<int>& vnodeGIDVec,
74 N_LAS_Vector* cloneVector,
75 double scaledEndValue,
80 node_list_type_(NLT_VoltageNodes),
81 vnodeGIDVec_(vnodeGIDVec),
82 scaled_end_value_(scaledEndValue),
83 residualConductance_(resCond)
86 vecptr1_ =
new N_LAS_Vector(*cloneVector);
87 vecptr2_ =
new N_LAS_Vector(*cloneVector);
99 Xyce::NodeNamePairMap & op_in,
100 const Teuchos::RefCountPtr <Epetra_MapColoring>& ICcolor_map,
101 const Teuchos::RefCountPtr <Epetra_MapColoring>& GMINcolor_map,
102 N_LAS_Vector* cloneVector,
103 double scaledEndValue,
108 node_list_type_(NLT_VoltageNodes),
109 scaled_end_value_(scaledEndValue),
110 residualConductance_(resCond)
114 vecptr1_ =
new N_LAS_Vector(*cloneVector);
115 vecptr2_ =
new N_LAS_Vector(*cloneVector);
146 conductance_ = pow(10.0, conductance) - pow(10.0, scaled_end_value_) + residualConductance_;
158 (
const N_LAS_Vector * solution, N_LAS_Vector * residual_vector)
160 #ifdef Xyce_DEBUG_IC_Gmin
161 cout <<
"Inside AugmentLinSysIC_Gmin::augmentResidual:" << endl;
165 if (node_list_type_ == NLT_VoltageNodes)
167 std::vector<int>::const_iterator i = vnodeGIDVec_.begin();
168 std::vector<int>::const_iterator stop = vnodeGIDVec_.end();
169 for ( ; i < stop; ++i)
171 double value = conductance_ *
172 (
const_cast<N_LAS_Vector*
>(solution))->getElementByGlobalIndex(*i);
174 residual_vector->sumElementByGlobalIndex(*i, value);
179 for (std::size_t i = 0; i < vecptr1_->localLength(); ++i)
181 if ( (*GMINcolor_map_)[i] == 0)
183 (*residual_vector)[i] += conductance_ * (
const_cast<N_LAS_Vector&
>(*solution))[i];
189 Xyce::NodeNamePairMap::iterator op_i = op_.begin();
190 Xyce::NodeNamePairMap::iterator op_end = op_.end();
191 for ( ; op_i != op_end ; ++op_i)
193 int row = (*op_i).second.first;
196 if ( (*ICcolor_map_)[row] == 0)
198 (*residual_vector)[row] = 0.0;
217 #ifdef Xyce_DEBUG_IC_Gmin
218 cout <<
"Inside AugmentLinSysIC_Gmin::augmentJacobian:" << endl;
222 jacobian->getDiagonal(*vecptr1_);
223 if (node_list_type_ == NLT_VoltageNodes)
225 std::vector<int>::const_iterator i = vnodeGIDVec_.begin();
226 std::vector<int>::const_iterator stop = vnodeGIDVec_.end();
227 for ( ; i < stop; ++i)
229 vecptr1_->sumElementByGlobalIndex(*i, conductance_);
234 for (std::size_t i = 0; i < vecptr1_->localLength(); ++i)
236 if ( (*GMINcolor_map_)[i] == 0)
238 (*vecptr1_)[i] += conductance_;
242 jacobian->replaceDiagonal(*vecptr1_);
245 std::vector<int> col;
246 std::vector<double> val;
247 Xyce::NodeNamePairMap::iterator op_i = op_.begin();
248 Xyce::NodeNamePairMap::iterator op_end = op_.end();
250 jacobian->getDiagonal(*vecptr2_);
252 for ( ; op_i != op_end ; ++op_i)
254 int row = (*op_i).second.first;
258 if ( (*ICcolor_map_)[row] == 0)
260 rowLen = jacobian->getLocalRowLength(row);
262 col.resize(rowLen,0);
263 val.resize(rowLen,0.0);
264 jacobian->getLocalRowCopy(row, rowLen, numEntries, &val[0], &col[0]);
267 for (
int i=0;i<val.size();++i) val[i] = 0.0;
269 jacobian->putLocalRow(row, rowLen, &val[0], &col[0]);
272 (*vecptr2_)[row] = 1.0;
276 jacobian->replaceDiagonal(*vecptr2_);