45 #include <Xyce_config.h>
48 #include <N_UTL_Misc.h>
67 #include <N_ERH_ErrorMgr.h>
69 #include <N_LAS_Vector.h>
70 #include <N_LAS_Matrix.h>
72 #include <N_UTL_Expression.h>
100 APosEquBraVarOffset(-1),
101 ANegEquBraVarOffset(-1),
102 ABraEquPosNodeOffset(-1),
103 ABraEquNegNodeOffset(-1),
104 ABraEquBraVarOffset(-1),
110 f_PosEquBraVarPtr(0),
111 f_NegEquBraVarPtr(0),
112 f_BraEquPosNodePtr(0),
113 f_BraEquNegNodePtr(0),
114 f_BraEquBraVarPtr(0),
119 q_PosEquBraVarPtr(0),
120 q_NegEquBraVarPtr(0),
121 q_BraEquPosNodePtr(0),
122 q_BraEquNegNodePtr(0),
123 q_BraEquBraVarPtr(0),
131 namespace MutIndLin {
186 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
190 mutualCupGiven(false),
192 temp(getDeviceOptions().temp.getImmutableValue<double>()),
257 int indexInductorOne = -1;
258 int indexInductorTwo = -1;
263 indexInductorOne = j;
267 indexInductorTwo = j;
269 if( indexInductorOne != -1 && indexInductorTwo != -1 )
294 #ifdef Xyce_DEBUG_DEVICE
297 Xyce::dout() <<
"mutualCouplingCoef: " << std::endl;
304 Xyce::dout() << std::endl;
310 dIdt.resize( numInductors );
313 LOI.resize( numInductors );
314 LO.resize( numInductors );
317 LO[i].resize( numInductors );
360 jacStamp.resize( 3 * numInductors );
365 jacStamp[2*numInductors + i].resize(numInductors + 2);
367 jacStamp[2*i ][0] = 2*numInductors + i;
368 jacStamp[2*i+1][0] = 2*numInductors + i;
369 jacStamp[2*numInductors + i][0] = 2*i;
370 jacStamp[2*numInductors + i][1] = 2*i + 1;
373 jacStamp[2*numInductors + i][j+2] = 2*numInductors + j;
382 std::vector<Depend>::const_iterator d;
386 for (d=begin; d != end; ++d)
389 if (d->name ==
"COUPLING" && d->vectorIndex != -1)
399 expPtrs[d->vectorIndex] = d->expr;
402 int indexInductorOne =
indexPairs[d->vectorIndex].first;
403 int indexInductorTwo =
indexPairs[d->vectorIndex].second;
406 int inductorOneBranchSize =
jacStamp[2*numInductors+
407 indexInductorOne].size();
408 int inductorTwoBranchSize =
jacStamp[2*numInductors+
409 indexInductorTwo].size();
410 jacStamp[2*numInductors+indexInductorOne].resize(inductorOneBranchSize+
412 jacStamp[2*numInductors+indexInductorTwo].resize(inductorTwoBranchSize+
414 for (
int i=0; i<d->n_vars; i++)
416 jacStamp[2*numInductors+indexInductorOne][inductorOneBranchSize+i]
418 jacStamp[2*numInductors+indexInductorTwo][inductorTwoBranchSize+i]
428 std::pair<int,int>(d->vectorIndex,i));
430 std::pair<int,int>(d->vectorIndex,i));
436 std::string msg=
"Error in mutual inductor constructor for ";
438 msg +=
": Found a dependent parameter that fails sanity check.";
439 msg +=
"Name:" + d->name +
" ";
440 msg +=
"Value: " + (d->expr)->get_expression() +
" ";
441 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
453 #ifdef Xyce_DEBUG_DEVICE
456 Xyce::dout() <<
"Instance::Instance-----------------" << std::endl;
457 Xyce::dout() <<
"numExtVars = " <<
numExtVars << std::endl
460 <<
"numInductors = " << numInductors << std::endl
461 <<
"jacStamp = " << std::endl;
462 for(
int i = 0; i<
jacStamp.size(); ++i )
464 Xyce::dout() <<
"jacStamp[ " << i <<
" ] = { ";
465 for(
int j=0; j<
jacStamp[i].size(); ++j)
468 if( j != (
jacStamp[i].size() -1 ) )
470 Xyce::dout() <<
", ";
473 Xyce::dout() <<
" }" << std::endl;
490 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
491 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
492 for ( ; currentInductor != endInductor ; ++currentInductor)
494 delete *currentInductor;
507 const std::vector<int> & extLIDVecRef)
520 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
521 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
524 while( currentInductor != endInductor )
526 (*currentInductor)->li_Pos =
extLIDVec[ i++ ];
527 (*currentInductor)->li_Neg =
extLIDVec[ i++ ];
528 (*currentInductor)->li_Branch = intLIDVec[ j++ ];
532 #ifdef Xyce_DEBUG_DEVICE
535 Xyce::dout() <<
"Instance::registerLIDs----------------------------" << std::endl;
538 while( currentInductor != endInductor )
540 Xyce::dout() <<
"Inductor [ " << i++ <<
" ] "
541 <<
" li_Pos = " << (*currentInductor)->li_Pos
542 <<
" li_Neg = " << (*currentInductor)->li_Neg
543 <<
" li_Branch = " << (*currentInductor)->li_Branch << std::endl;
625 #ifdef Xyce_DEBUG_DEVICE
628 Xyce::dout() <<
"Instance::registerJacLIDs ----------------------------" << std::endl;
631 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
632 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
634 while( currentInductor != endInductor )
636 (*currentInductor)->APosEquBraVarOffset = jacLIDVec[ 2*i ][ 0 ];
637 (*currentInductor)->ANegEquBraVarOffset = jacLIDVec[ 2*i + 1 ][ 0 ];
638 (*currentInductor)->ABraEquPosNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 0 ];
639 (*currentInductor)->ABraEquNegNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 1 ];
644 (*currentInductor)->ABraEquBraVarOffset = jacLIDVec[ 2*numInductors + i ][ j + 2 ];
646 (*currentInductor)->inductorCurrentOffsets[ j ] = jacLIDVec[ 2*numInductors + i ][ j + 2 ];
649 int numdepvars=(*currentInductor)->depVarPairs.size();
650 (*currentInductor)->ABraEquDepVarOffsets.resize(numdepvars);
651 for (
int j = 0; j < numdepvars; ++j)
653 (*currentInductor)->ABraEquDepVarOffsets[j] =
654 jacLIDVec[2*numInductors+i][numInductors+2+j];
660 #ifdef Xyce_DEBUG_DEVICE
663 Xyce::dout() <<
"Instance::registerJacLIDs--------------------------" << std::endl;
666 while( currentInductor != endInductor )
668 Xyce::dout() <<
"Inductor [ " << i <<
" ] " << (*currentInductor)->name
669 <<
" APosEquBraVarOffset = " << (*currentInductor)->APosEquBraVarOffset
670 <<
" ANegEquBraVarOffset = " << (*currentInductor)->ANegEquBraVarOffset
671 <<
" ABraEquPosNodeOffset = " << (*currentInductor)->ABraEquPosNodeOffset
672 <<
" ABraEquNegNodeOffset = " << (*currentInductor)->ABraEquNegNodeOffset
673 <<
" ABraEquBraVarOffset = " << (*currentInductor)->ABraEquBraVarOffset << std::endl;
674 Xyce::dout() <<
"\tInductor branch offsets = { ";
677 Xyce::dout() << (*currentInductor)->inductorCurrentOffsets[ j ] <<
", ";
679 Xyce::dout() <<
"} " << std::endl;
697 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
701 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
702 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
704 while( currentInductor != endInductor )
707 (*currentInductor)->f_PosEquBraVarPtr =
708 &(dFdx[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] );
710 (*currentInductor)->f_NegEquBraVarPtr =
711 &(dFdx[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] );
713 (*currentInductor)->f_BraEquPosNodePtr =
714 &(dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] );
716 (*currentInductor)->f_BraEquNegNodePtr =
717 &(dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] );
727 (*currentInductor)->f_inductorCurrentPtrs[ j ] =
728 &(dFdx[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] );
731 int numdepvars=(*currentInductor)->depVarPairs.size();
732 (*currentInductor)->f_BraEquDepVarPtrs.resize(numdepvars);
734 for (
int j = 0; j < numdepvars; ++j)
736 (*currentInductor)->f_BraEquDepVarPtrs[j] =
737 &(dFdx[((*currentInductor)->li_Branch)][(*currentInductor)->ABraEquDepVarOffsets[j]] );
742 (*currentInductor)->q_PosEquBraVarPtr =
743 &(dQdx[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] );
745 (*currentInductor)->q_NegEquBraVarPtr =
746 &(dQdx[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] );
748 (*currentInductor)->q_BraEquPosNodePtr =
749 &(dQdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] );
751 (*currentInductor)->q_BraEquNegNodePtr =
752 &(dQdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] );
762 (*currentInductor)->q_inductorCurrentPtrs[ j ] =
763 &(dQdx[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] );
766 numdepvars=(*currentInductor)->depVarPairs.size();
767 (*currentInductor)->q_BraEquDepVarPtrs.resize(numdepvars);
769 for (
int j = 0; j < numdepvars; ++j)
771 (*currentInductor)->q_BraEquDepVarPtrs[j] =
772 &(dQdx[((*currentInductor)->li_Branch)][(*currentInductor)->ABraEquDepVarOffsets[j]] );
801 for( i=0; i<j ; ++i )
816 #ifdef Xyce_DEBUG_DEVICE
819 Xyce::dout() <<
"processParams: mutualCouplingCoef: " << std::endl;
826 Xyce::dout() << std::endl;
847 bool bsuccess =
true;
852 std::vector< InductorInstanceData* >::iterator currentData =
instanceData.begin();
857 (*currentData)->L = ((*currentData)->baseL)*factor;
877 bool bsuccess =
true;
898 std::vector< InductorInstanceData* >::iterator
900 std::vector< InductorInstanceData* >::iterator
905 while( currentInductor != endInductor )
935 #ifdef Xyce_DEBUG_DEVICE
938 Xyce::dout() <<
"Instance::updatePrimaryState------------------" << std::endl
939 <<
"\tname = " <<
getName() << std::endl;
948 for (
int i=0; i<ncoupcoef; ++i)
958 std::vector< InductorInstanceData* >::iterator
960 std::vector< InductorInstanceData* >::iterator
963 while( currentInductor != endInductor )
965 if( (
getSolverState().dcopFlag) && ((*currentInductor)->ICGiven) )
995 bool returnVal=
false;
996 #ifndef Xyce_NO_MUTINDLIN_MASK
999 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1000 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1001 while( currentInductor != endInductor )
1003 (*maskVectorPtr)[((*currentInductor)->li_Branch)] = 0.0;
1028 #ifdef Xyce_DEBUG_DEVICE
1031 Xyce::dout() <<
"Instance::loadDAEQVector---------------------------" << std::endl
1032 <<
"\tname = " <<
getName() << std::endl;
1056 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1057 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1059 while( currentInductor != endInductor )
1061 qVec[(*currentInductor)->li_Branch] +=
LOI[ i ];
1083 #ifdef Xyce_DEBUG_DEVICE
1086 Xyce::dout() <<
"Instance::loadDAEFVector---------------------------" << std::endl
1087 <<
"\tname = " <<
getName() << std::endl;
1095 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1096 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1099 while( currentInductor != endInductor )
1101 double current = solVec[(*currentInductor)->li_Branch];
1102 double vNodePos = solVec[(*currentInductor)->li_Pos];
1103 double vNodeNeg = solVec[(*currentInductor)->li_Neg];
1104 fVec[((*currentInductor)->li_Pos)] +=
scalingRHS * current;
1105 fVec[((*currentInductor)->li_Neg)] += -
scalingRHS * current;
1106 fVec[((*currentInductor)->li_Branch)] += -(vNodePos - vNodeNeg);
1108 #ifdef Xyce_DEBUG_DEVICE
1111 Xyce::dout() <<
" Inductor = " << (*currentInductor)->name
1112 <<
"\tcurrent = " << current
1113 <<
"\tvNodePos = " << vNodePos
1114 <<
"\tvNodeNeg = " << vNodeNeg
1137 #ifdef Xyce_DEBUG_DEVICE
1140 Xyce::dout() <<
"Instance::loadDAEdQdx--------------------------" << std::endl
1141 <<
"\tname = " <<
getName() << std::endl;
1152 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1153 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1155 while( currentInductor != endInductor )
1159 dQdx[((*currentInductor)->li_Branch)]
1163 int numdepterms=(*currentInductor)->depVarPairs.size();
1164 for (
int j=0 ; j<numdepterms; ++j)
1166 int coefficientNumber=(*currentInductor)->depVarPairs[j].first;
1167 int depVarNumber=(*currentInductor)->depVarPairs[j].second;
1176 otherInductor=
indexPairs[coefficientNumber].second;
1178 otherInductor=
indexPairs[coefficientNumber].first;
1180 dQdx[((*currentInductor)->li_Branch)][(*currentInductor)->ABraEquDepVarOffsets[j]] +=
1210 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1211 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1212 while( currentInductor != endInductor )
1214 dFdx[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] +=
scalingRHS;
1215 dFdx[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] += -
scalingRHS;
1216 dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] += -1.0;
1217 dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] += 1.0;
1238 bool bsuccess =
true;
1255 varTypeVec[i] =
'I';
1282 std::vector<Instance*>::iterator iter;
1286 for (iter=first; iter!=last; ++iter)
1288 (*iter)->processParams();
1306 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1309 tnom(getDeviceOptions().tnom)
1339 std::vector<Instance*>::iterator iter;
1343 for (iter=first; iter!=last; ++iter)
1362 std::vector<Instance*>::const_iterator iter;
1370 os <<
"Number of MutIndLin instances: " << isize << std::endl;
1371 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1372 for (i=0, iter=first; iter!=last; ++iter, ++i)
1374 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1400 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1424 for (
int i=0; i<ncoupcoef; ++i)
1434 std::vector< InductorInstanceData* >::iterator
1436 std::vector< InductorInstanceData* >::iterator
1440 while( currentInductor != endInductor )
1442 if( (
getSolverState().dcopFlag) && ((*currentInductor)->ICGiven) )
1467 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
1475 std::vector< InductorInstanceData* >::iterator currentInductor = inst.
instanceData.begin();
1476 std::vector< InductorInstanceData* >::iterator endInductor = inst.
instanceData.end();
1478 while( currentInductor != endInductor )
1480 double current = solVec[(*currentInductor)->li_Branch];
1481 double vNodePos = solVec[(*currentInductor)->li_Pos];
1482 double vNodeNeg = solVec[(*currentInductor)->li_Neg];
1484 fVec[((*currentInductor)->li_Pos)] += inst.
scalingRHS * current;
1485 fVec[((*currentInductor)->li_Neg)] += -inst.
scalingRHS * current;
1486 fVec[((*currentInductor)->li_Branch)] += -(vNodePos - vNodeNeg);
1503 inst.
LOI[ i ] = 0.0;
1514 while( currentInductor != endInductor )
1516 qVec[(*currentInductor)->li_Branch] += inst.
LOI[ li ];
1524 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1539 std::vector< InductorInstanceData* >::iterator currentInductor = inst.
instanceData.begin();
1540 std::vector< InductorInstanceData* >::iterator endInductor = inst.
instanceData.end();
1541 while( currentInductor != endInductor )
1543 *((*currentInductor)->f_PosEquBraVarPtr) += inst.
scalingRHS;
1544 *((*currentInductor)->f_NegEquBraVarPtr) += -inst.
scalingRHS;
1545 *((*currentInductor)->f_BraEquPosNodePtr) += -1.0;
1546 *((*currentInductor)->f_BraEquNegNodePtr) += 1.0;
1559 while( currentInductor != endInductor )
1563 *((*currentInductor)->q_inductorCurrentPtrs[j]) += inst.
mutualCouplingCoef[li][j] * inst.
LO[li][j];
1566 int numdepterms=(*currentInductor)->depVarPairs.size();
1567 for (
int j=0 ; j<numdepterms; ++j)
1569 int coefficientNumber=(*currentInductor)->depVarPairs[j].first;
1570 int depVarNumber=(*currentInductor)->depVarPairs[j].second;
1578 if (li==inst.
indexPairs[coefficientNumber].first)
1579 otherInductor=inst.
indexPairs[coefficientNumber].second;
1581 otherInductor=inst.
indexPairs[coefficientNumber].second;
1583 *((*currentInductor)->q_BraEquDepVarPtrs[j]) +=
1608 int sizeInstances = instanceContainer_.size();
1609 for (
int i=0; i<sizeInstances; ++i)
1611 Instance & inst = *(instanceContainer_.at(i));
1613 std::vector< InductorInstanceData* >::iterator currentInductor = inst.
instanceData.begin();
1614 std::vector< InductorInstanceData* >::iterator endInductor = inst.
instanceData.end();
1615 while( currentInductor != endInductor )
1617 dFdx[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] += inst.
scalingRHS;
1618 dFdx[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] += -inst.
scalingRHS;
1619 dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] += -1.0;
1620 dFdx[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] += 1.0;
1633 while( currentInductor != endInductor )
1637 dQdx[((*currentInductor)->li_Branch)]
1638 [(*currentInductor)->inductorCurrentOffsets[j]] += inst.
mutualCouplingCoef[i][j] * inst.
LO[i][j];
1641 int numdepterms=(*currentInductor)->depVarPairs.size();
1642 for (
int j=0 ; j<numdepterms; ++j)
1644 int coefficientNumber=(*currentInductor)->depVarPairs[j].first;
1645 int depVarNumber=(*currentInductor)->depVarPairs[j].second;
1653 if (i==inst.
indexPairs[coefficientNumber].first)
1654 otherInductor=inst.
indexPairs[coefficientNumber].second;
1656 otherInductor=inst.
indexPairs[coefficientNumber].second;
1658 dQdx[((*currentInductor)->li_Branch)][(*currentInductor)->ABraEquDepVarOffsets[j]] +=
1681 .registerDevice(
"mil", 1)
1682 .registerModelType(
"mil", 1);