48 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
63 #include <N_ERH_ErrorMgr.h>
65 #include <N_LAS_Vector.h>
66 #include <N_LAS_Matrix.h>
111 #ifdef Xyce_DEBUG_DEVICE
122 os <<
" XygraCoilData for: name = " << xcd.
getName() <<
176 bool bsuccess =
true;
194 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
235 int totalNumIntVars=0;
239 #ifdef Xyce_DEBUG_DEVICE
240 Xyce::dout() <<
" We were given a coil spec." << std::endl;
241 Xyce::dout() <<
" There were " <<
coilDataVec.size() <<
" coils." << std::endl;
250 UserError0(*
this) <<
"Xygra Device " <<
getName() <<
"has "<<
coilDataVec.size() <<
" coils and " <<
numExtVars <<
" external nodes. Number of external nodes should be twice number of coils.";
256 for (
int i = 0; i <
nCoils; ++i)
258 #ifdef Xyce_DEBUG_DEVICE
259 Xyce::dout() <<
" Coil["<< i <<
"] name is " <<
coilDataVec[i]->getName() <<
", has " <<
coilDataVec[i]->getNumWindings() <<
" windings. " << std::endl;
260 #endif // Xyce_DEBUG_DEVICE
261 totalNumIntVars +=
coilDataVec[i]->getNumWindings() - 1;
267 #ifdef Xyce_DEBUG_DEVICE
268 Xyce::dout() <<
" We would have " << totalNumIntVars <<
" internal vars " << std::endl;
280 std::ostringstream ost;
282 ost <<
"Instance::Instance:";
283 ost <<
"Number of nodes given to device " <<
getName() <<
"is not even."
285 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str() );
334 for (
int i=0; i<numNodes; ++i)
337 for (
int j=0; j<numNodes; ++j)
356 if (cM.size() != numNodes)
358 std::ostringstream ost;
360 ost <<
"Instance::setConductances:";
361 ost <<
" Input matrix passed to device " <<
getName()
363 <<
") does not have number of rows required by netlist specification ("
364 << numNodes <<
")." << std::endl;
365 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
368 for (
int i=0; i<numNodes; ++i)
370 if (cM[i].size() != numNodes)
372 std::ostringstream ost;
374 ost <<
"Instance::setConductances:";
375 ost <<
" row " << i <<
"of matrix passed to device " <<
getName()
376 <<
" has " << cM[i].size()
377 <<
" columns instead of number required by netlist specification ("
378 << numNodes <<
")." << std::endl;
379 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
382 #ifdef Xyce_DEBUG_DEVICE
385 Xyce::dout() << std::endl << subsection_divider << std::endl;
387 Xyce::dout() << std::endl << subsection_divider << std::endl;
408 std::vector<std::vector<double> > * kPtr;
428 std::ostringstream ost;
430 ost <<
"Instance::setK:";
431 ost <<
" Input matrix passed to device " <<
getName()
433 <<
") does not have number of rows required by netlist specification ("
435 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
442 std::ostringstream ost;
444 ost <<
"Instance::setK:";
445 ost <<
" row " << i <<
"of matrix passed to device " <<
getName()
446 <<
" has " << kM[i].size()
447 <<
" columns instead of number required by netlist specification ("
448 << totalNumWindings <<
")." << std::endl;
449 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
464 #ifdef Xyce_DEBUG_DEVICE
467 Xyce::dout() << std::endl << subsection_divider << std::endl;
469 Xyce::dout() << std::endl << subsection_divider << std::endl;
498 for (
int coil=0; coil <
nCoils; ++coil)
501 for (
int winding=0; winding<
nWindings[coil]-1; ++winding)
505 nV[offset++] = (*solVectorPtr)[
li_Nodes_[coilExtStart[coil]+1]];
554 std::vector<double> * sPtr;
556 #ifdef Xyce_DEBUG_DEVICE
559 Xyce::dout() << std::endl << subsection_divider << std::endl;
560 Xyce::dout() <<
" Device " <<
getName() <<
" setSources called for time " <<
getSolverState().
currTime <<
" with value t= " << t << std::endl;
561 Xyce::dout() << std::endl << subsection_divider << std::endl;
570 #ifdef Xyce_DEBUG_DEVICE
573 Xyce::dout() <<
" setting source s0 for t=" << t << std::endl;
584 #ifdef Xyce_DEBUG_DEVICE
587 Xyce::dout() <<
" setting source s1 for t=" << t << std::endl;
595 std::ostringstream ost;
597 ost <<
"Instance::setSources:";
598 ost <<
" Input vector passed to device " <<
getName()
600 <<
") does not have number of rows required by netlist specification ("
602 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
639 #ifdef Xyce_DEBUG_DEVICE
643 Xyce::dout() <<
" source vector is: " << std::endl;
644 Xyce::dout() <<
" s0["<<i<<
"] = " <<
s0_[i] << std::endl;
645 Xyce::dout() <<
" s1["<<i<<
"] = " <<
s1_[i] << std::endl;
646 Xyce::dout() <<
" fac = " << fac << std::endl;
681 const std::vector<int> & extLIDVecRef)
686 #ifdef Xyce_DEBUG_DEVICE
689 Xyce::dout() << std::endl << section_divider << std::endl;
690 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
691 Xyce::dout() <<
" name = " <<
getName() << std::endl;
708 for (
int coil=0; coil<
nCoils; ++coil)
716 for (
int coil=0; coil<
nCoils; ++coil)
730 for (
int coil=0; coil<
nCoils; ++coil)
732 for (
int coilWinding=0; coilWinding<
nWindings[coil]; coilWinding++)
744 if (coilWinding==nWindings[coil]-1)
752 windingNodes[globalWinding++] = std::pair<int,int>(posNode,negNode);
756 #ifdef Xyce_DEBUG_DEVICE
759 for (
int i=0; i<numNodes; ++i)
761 Xyce::dout() <<
" li_Nodes_[" <<i <<
"] = " <<
li_Nodes_[i] << std::endl;
766 Xyce::dout() <<
"Winding " << winding <<
" between node "
773 #ifdef Xyce_DEBUG_DEVICE
776 Xyce::dout() << section_divider << std::endl;
798 for (
int coil = 0; coil<
nCoils; ++coil)
803 for (
int nodeOffset=1; nodeOffset<
nWindings[coil]; ++nodeOffset)
806 std::ostringstream ost;
807 ost <<
"coil" << coil <<
"_Internal" << nodeOffset;
860 for (
int equ=0; equ < numNodes; ++equ)
863 for (
int node=0; node < numNodes; ++node)
881 bool bsuccess =
true;
883 #ifdef Xyce_DEBUG_DEVICE
886 Xyce::dout() <<
"Instance::updatePrimaryState" <<std::endl;
903 bool bsuccess =
true;
925 #ifdef Xyce_DEBUG_DEVICE
929 Xyce::dout() << subsection_divider << std::endl;
930 Xyce::dout() <<
"Instance::updateIntermediateVars "<<std::endl;
931 Xyce::dout() <<
" name = " <<
getName() << std::endl;
952 for (
int node=0 ; node<numNodes ; ++node)
959 dV[winding].resize(numNodes);
964 for (
int node=0; node<numNodes; ++node)
978 for (
int node=0; node<numNodes; ++node)
982 #ifdef Xyce_DEBUG_DEVICE
983 Xyce::dout() <<
"solutionVar[" << node <<
"] = " <<
solutionVars[node] << std::endl;
1018 #ifdef Xyce_DEBUG_DEVICE
1019 Xyce::dout() <<
"Winding " << winding <<
" adding " <<
windingCurrents[winding]
1020 <<
"to contribution to node " << posNode <<
" and subtracting same "
1021 <<
" from node " << negNode << std::endl;
1027 #ifdef Xyce_DEBUG_DEVICE
1028 Xyce::dout() <<
" Contributions for device " <<
getName() << std::endl;
1029 for (
int node=0; node<numNodes; ++node)
1031 Xyce::dout() <<
" F[" << node <<
"] = " <<
fContributions[node] << std::endl;
1033 Xyce::dout() <<
"Winding potential drops and currents: " << std::endl;
1036 Xyce::dout() <<
" dV[" << winding <<
"] = " <<
dV[winding] << std::endl;
1037 Xyce::dout() <<
" I[" << winding <<
"] = " <<
windingCurrents[winding] << std::endl;
1061 bool bsuccess =
true;
1090 #ifdef Xyce_DEBUG_DEVICE
1094 Xyce::dout() << subsection_divider << std::endl;
1095 Xyce::dout() <<
"Instance::loadDAEFVector "<<std::endl;
1096 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1100 for (
int node=0; node<numNodes; ++node)
1103 #ifdef Xyce_DEBUG_DEVICE
1104 Xyce::dout() <<
" fVec[" << node <<
"] += "
1106 Xyce::dout() <<
" loaded into local ID " << li_Nodes_[node] << std::endl;
1124 bool bsuccess =
true;
1147 bool bsuccess =
true;
1154 #ifdef Xyce_DEBUG_DEVICE
1158 Xyce::dout() << subsection_divider << std::endl;
1159 Xyce::dout() <<
"Instance::loadDAEdFdx "<<std::endl;
1160 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1179 for (
int equ=0; equ < numNodes; ++equ)
1188 for (
int equ=0; equ < numNodes; ++equ)
1190 for (
int node=0; node < numNodes; ++node)
1194 #ifdef Xyce_DEBUG_DEVICE
1195 Xyce::dout() <<
" dFdX[" << equ <<
"]["<<node<<
"] += "
1215 bool bsuccess =
true;
1244 if (cName ==
"COIL")
1248 return (static_cast<CompositeParam *> (xcd));
1253 "Instance::constructComposite: unrecognized composite name: ";
1255 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
1285 std::vector<Instance*>::iterator iter;
1289 for (iter=first; iter!=last; ++iter)
1291 (*iter)->processParams();
1309 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
1347 std::vector<Instance*>::iterator iter;
1351 for (iter=first; iter!=last; ++iter)
1370 std::vector<Instance*>::const_iterator iter;
1378 os <<
"Number of Xygra instances: " << isize << std::endl;
1379 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1380 for (i=0, iter=first; iter!=last; ++iter, ++i)
1382 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1408 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1422 .registerDevice(
"xygra", 1)
1423 .registerModelType(
"xygra", 1);