45 #include <Xyce_config.h>
49 #include <N_UTL_Misc.h>
70 #include <N_ERH_ErrorMgr.h>
75 #include <N_LAS_Vector.h>
76 #include <N_LAS_Matrix.h>
78 #include <Teuchos_RefCountPtr.hpp>
79 using Teuchos::RefCountPtr;
86 namespace MutIndNonLin {
147 NULL,
U_VOLT,
CAT_NONE,
"Smoothing coefficient for voltage difference over first inductor");
151 NULL,
U_VOLT,
CAT_NONE,
"Use constant scaling factor to smooth voltage difference over first inductor");
241 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
243 temp(getDeviceOptions().temp.getImmutableValue<double>()),
244 outputStateVarsFlag( false ),
245 maxVoltageDrop(1.0e-10)
293 LOI.resize( numInductors );
294 LO.resize( numInductors );
297 LO[i].resize( numInductors );
323 std::string filename(
"Inductor_" );
325 filename.append(
".dat" );
327 replace( filename.begin(), filename.end(),
'%',
'_' );
328 replace( filename.begin(), filename.end(),
':',
'_' );
331 outputFileStreamPtr->open( filename.c_str() );
332 if( !(*outputFileStreamPtr) )
334 std::string msg(
"Instance constructor.\n");
335 msg +=
"\tCould not open file for output of state variables. name =" +
getName();
336 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
338 (*outputFileStreamPtr).setf(std::ios::scientific, std::ios::floatfield );
339 (*outputFileStreamPtr).width(20);
340 (*outputFileStreamPtr).precision(12);
344 dHe_dI.resize( numInductors );
348 dP_dI.resize( numInductors );
383 jacStamp.resize( 3 * numInductors + 2);
402 jacStamp[2*numInductors + i].resize(numInductors + 5);
409 jacStamp[2*i ][0] = 2*numInductors + i;
411 jacStamp[2*i+1][0] = 2*numInductors + i;
425 jacStamp[2*numInductors + i][0] = 0;
426 jacStamp[2*numInductors + i][1] = 1;
427 jacStamp[2*numInductors + i][2] = 2*i;
428 jacStamp[2*numInductors + i][3] = 2*i + 1;
431 jacStamp[2*numInductors + i][j+4] = 2*numInductors + j;
440 jacStamp[ 3*numInductors + 1].resize(numInductors + 1);
450 jacStamp[ 3*numInductors + 1 ][i]=2*numInductors+i;
460 #ifdef Xyce_DEBUG_DEVICE
463 Xyce::dout() <<
"Instance::Instance----------" << std::endl;
464 Xyce::dout() <<
"numExtVars = " <<
numExtVars <<
", " << ibev << std::endl
465 <<
"numIntVars = " <<
numIntVars <<
", " << ibiv << std::endl
467 <<
"numInductors = " << numInductors << std::endl
468 <<
"jacStamp = " << std::endl;
469 for(
int i = 0; i<
jacStamp.size(); ++i )
471 Xyce::dout() <<
"jacStamp[ " << i <<
" ] = { ";
472 for(
int j=0; j<
jacStamp[i].size(); ++j)
475 if( j != (
jacStamp[i].size() -1 ) )
477 Xyce::dout() <<
", ";
480 Xyce::dout() <<
" }" << std::endl;
502 std::string msg(
"Instance destructor.\n");
503 msg+=
"\tCould not close file for output of state variables. name =" +
getName();
504 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
510 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
511 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
512 for ( ; currentInductor != endInductor ; ++currentInductor)
514 if (*currentInductor != NULL)
516 delete *currentInductor;
517 *currentInductor = NULL;
551 const std::vector<int> & extLIDVecRef)
564 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
565 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
568 while( currentInductor != endInductor )
570 (*currentInductor)->li_Pos =
extLIDVec[ i++ ];
571 (*currentInductor)->li_Neg =
extLIDVec[ i++ ];
572 (*currentInductor)->li_Branch = intLIDVec[ j++ ];
580 #ifdef Xyce_DEBUG_DEVICE
583 Xyce::dout() <<
"Instance::registerLIDs------------------------" << std::endl;
586 while( currentInductor != endInductor )
588 Xyce::dout() <<
"Inductor [ " << i++ <<
" ] "
589 <<
" li_Pos = " << (*currentInductor)->li_Pos
590 <<
" li_Neg = " << (*currentInductor)->li_Neg
591 <<
" li_Branch = " << (*currentInductor)->li_Branch << std::endl;
594 Xyce::dout() <<
" li_MagVar = " <<
li_MagVar << std::endl
595 <<
" li_RVar = " <<
li_RVar << std::endl;
613 std::string baseString(
getName() +
"_");
614 std::string tempString;
615 std::vector< InductorInstanceData* >::iterator
617 std::vector< InductorInstanceData* >::iterator
621 while( currentInductor != endInductor )
623 tempString = baseString + (*currentInductor)->name +
"_branch";
625 intNameMap[ (*currentInductor)->li_Branch ] = tempString;
629 tempString = baseString +
"m";
631 tempString = baseString +
"r";
658 #ifdef Xyce_DEBUG_DEVICE
661 Xyce::dout() <<
"Instance::registerStateLIDs-------------------" << std::endl;
663 Xyce::dout() <<
"li_MagVarState = " <<
li_MagVarState << std::endl
703 std::string baseString(
getName() +
"_");
704 std::string tempString;
705 tempString = baseString +
"m";
707 tempString = baseString +
"dmdt";
729 std::string baseString(
getName() +
"_");
730 std::string tempString;
731 tempString = baseString +
"r";
733 tempString = baseString +
"b";
735 tempString = baseString +
"h";
765 #ifdef Xyce_DEBUG_DEVICE
768 Xyce::dout() <<
"Instance::registerJacLIDs ----------------------------" << std::endl;
770 Xyce::dout() <<
"jacLIDVec = " << std::endl;
771 for(
int i = 0; i<
jacStamp.size(); ++i )
773 Xyce::dout() <<
"jacLIDVec[ " << i <<
" ] = { ";
774 for(
int j=0; j<jacLIDVec[i].size(); ++j)
776 Xyce::dout() << jacLIDVec[i][j];
777 if( j != ( jacLIDVec[i].size() -1 ) )
779 Xyce::dout() <<
", ";
782 Xyce::dout() <<
" }" << std::endl;
787 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
788 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
791 while( currentInductor != endInductor )
793 (*currentInductor)->APosEquBraVarOffset = jacLIDVec[ 2*i ][ 0 ];
794 (*currentInductor)->ANegEquBraVarOffset = jacLIDVec[ 2*i + 1 ][ 0 ];
795 (*currentInductor)->vPosOffset = jacLIDVec[ 2*
numInductors + i ][ 0 ];
796 (*currentInductor)->vNegOffset = jacLIDVec[ 2*
numInductors + i ][ 1 ];
802 (*currentInductor)->ABraEquPosNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 0 + extraOffset ];
803 (*currentInductor)->ABraEquNegNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 1 + extraOffset ];
808 (*currentInductor)->ABraEquBraVarOffset = jacLIDVec[ 2*numInductors + i ][ j + 2 + extraOffset ];
810 (*currentInductor)->inductorCurrentOffsets[ j ] = jacLIDVec[ 2*numInductors + i ][ j + 2 + extraOffset ];
812 (*currentInductor)->magOffset = jacLIDVec[ 2*numInductors + i ][ numInductors + 2 + extraOffset ];
834 #ifdef Xyce_DEBUG_DEVICE
839 while( currentInductor != endInductor )
841 Xyce::dout() <<
"Inductor [ " << i <<
" ] " << (*currentInductor)->name << std::endl
842 <<
" APosEquBraVarOffset = " << (*currentInductor)->APosEquBraVarOffset << std::endl
843 <<
" ANegEquBraVarOffset = " << (*currentInductor)->ANegEquBraVarOffset << std::endl
844 <<
" vPosOffset = " << (*currentInductor)->vPosOffset << std::endl
845 <<
" vNegOffset = " << (*currentInductor)->vNegOffset << std::endl
846 <<
" ABraEquPosNodeOffset = " << (*currentInductor)->ABraEquPosNodeOffset << std::endl
847 <<
" ABraEquNegNodeOffset = " << (*currentInductor)->ABraEquNegNodeOffset << std::endl
848 <<
" ABraEquBraVarOffset = " << (*currentInductor)->ABraEquBraVarOffset << std::endl
849 <<
" magOffset = " << (*currentInductor)->magOffset << std::endl;
850 Xyce::dout() <<
"\tInductor branch offsets = { ";
853 Xyce::dout() << (*currentInductor)->inductorCurrentOffsets[ j ] <<
", ";
855 Xyce::dout() <<
"} " << std::endl;
861 Xyce::dout() <<
"mEquInductorOffsets = ";
866 Xyce::dout() << std::endl
869 Xyce::dout() <<
"rEquInductorOffsets = ";
874 Xyce::dout() << std::endl
890 bool bsuccess =
true;
895 std::vector< InductorInstanceData* >::iterator currentData =
instanceData.begin();
900 (*currentData)->L = ((*currentData)->baseL)*factor;
920 bool bsuccess =
true;
922 #ifdef Xyce_DEBUG_DEVICE
925 Xyce::dout() <<
"Instance::updateIntermediateVars " << std::endl;
955 double voltageDrop= Vpos - Vneg;
964 Xyce::dout() << std::endl <<
" maxVoltageDrop = " <<
maxVoltageDrop << std::endl;
971 qV = DeltaVScaling * voltageDrop;
978 double tanh_qV = 0.0;
994 std::vector< InductorInstanceData* >::iterator currentInductor = instanceData.begin();
995 std::vector< InductorInstanceData* >::iterator endInductor = instanceData.end();
997 while( currentInductor != endInductor )
1005 double latestMag = mVarScaling * solVector[
li_MagVar ];
1011 double H =
Happ - (Gap / Path) * latestMag;
1013 He = H + Alpha * latestMag;
1018 const double gap_path = Gap / Path;
1019 const double He2 = He*
He;
1020 const double Heo2 =
Heo*
Heo;
1021 const double sq_Heo2He2 = sqrt(Heo2 + He2);
1024 double Man = Ms * He / ( A + sq_Heo2He2 );
1025 delM = Man - latestMag;
1030 const double sq_delM02delM2 = sqrt( delM02 + delM2 );
1034 Mirrp = (delM * tanh_qV + sq_delM02delM2 ) / (2*( Kirr- Alpha * sq_delM02delM2));
1035 Manp = Ms * (A + Heo2/sq_Heo2He2) / pow(A + sq_Heo2He2, 2.0);
1036 P = ( C *
Manp + (1 - C) *
Mirrp) / ((1 + (gap_path - Alpha) * C *
Manp + gap_path * (1-C) *
Mirrp)*Ms);
1040 Mirrp = (delM * tanh_qV + sq_delM02delM2 ) / (2*( Kirr- Alpha * sq_delM02delM2));
1041 Manp = Ms * (A + Heo2/sq_Heo2He2) / pow(A + sq_Heo2He2, 2.0);
1042 P = ( C *
Manp + (1 - C) *
Mirrp) / (1 + (gap_path - Alpha) * C *
Manp + gap_path * (1-C) *
Mirrp);
1045 #ifdef Xyce_DEBUG_DEVICE
1048 Xyce::dout() <<
"\tA = " << A << std::endl
1049 <<
"\tArea = " << Area << std::endl
1050 <<
"\tPath = " << Path << std::endl
1051 <<
"\tGap = " << Gap << std::endl
1052 <<
"\tC = " << C << std::endl
1053 <<
"\tVpos = " << Vpos << std::endl
1054 <<
"\tVneg = " << Vneg << std::endl
1055 <<
"\tvoltageDrop = " << voltageDrop << std::endl
1056 <<
"\tqV = " <<
qV << std::endl
1057 <<
"\tdelM0 = " << delM0 << std::endl
1058 <<
"\tHapp = " <<
Happ
1059 <<
"\tlatestMag = " << latestMag
1060 <<
"\tlatestR = " << rVarScaling * solVector[
li_RVar ] << std::endl
1061 <<
"\tHe = " << He << std::endl
1062 <<
"\tH = " << H << std::endl
1063 <<
"\tHeo = " << Heo << std::endl
1064 <<
"\tMan = " << Man << std::endl
1065 <<
"\tdelM = " << delM << std::endl
1066 <<
"\tMirrp = " <<
Mirrp << std::endl
1067 <<
"\tManp = " <<
Manp << std::endl
1068 <<
"\tP = " <<
P << std::endl
1076 double dHe_dM = ((Alpha - gap_path) * mVarScaling);
1078 double dManp_dM = ( -Ms * He / (pow(A + sq_Heo2He2, 2.0)*sq_Heo2He2)) *
1079 ( (Heo2 / (Heo2 + He2)) + (2.0*(A + Heo2 / sq_Heo2He2)/(A+sq_Heo2He2)) ) * dHe_dM;
1081 double ddelM_dM = ( dHe_dM*Ms/(A + sq_Heo2He2) ) * (1.0 - He2 / ((A + sq_Heo2He2)*sq_Heo2He2)) - mVarScaling;
1083 double dMirrp_dM = (1.0/(2.0*(Kirr - Alpha*sq_delM02delM2))) *
1084 (tanh_qV + delM/sq_delM02delM2 +
1085 (2.0*Alpha*delM*(delM*tanh_qV + sq_delM02delM2)
1086 /(2.0*(Kirr-Alpha*sq_delM02delM2)*sq_delM02delM2))) * ddelM_dM;
1088 double dP_Denom=0.0;
1091 dP_Denom = 1.0 + (gap_path - Alpha)*C*
Manp + gap_path * (1.0-C) *
Mirrp;
1093 dP_dM = (1.0/dP_Denom) * (C * dManp_dM + (1.0-C) * dMirrp_dM) -
1094 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1095 ( (gap_path - Alpha)*C*dManp_dM + gap_path*(1.0-C)*dMirrp_dM );
1100 dP_Denom = 1.0 + (gap_path - Alpha)*C*
Manp + gap_path * (1.0-C) *
Mirrp;
1102 dP_dM = (1.0/dP_Denom) * (C * dManp_dM + (1.0-C) * dMirrp_dM) -
1103 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1104 ( (gap_path - Alpha)*C*dManp_dM + gap_path*(1.0-C)*dMirrp_dM );
1107 #ifdef Xyce_DEBUG_DEVICE
1110 Xyce::dout() <<
"\tA = " << A << std::endl
1111 <<
"\tAlpha = " << Alpha << std::endl
1112 <<
"\tC = " << C << std::endl
1113 <<
"\tGap = " << Gap << std::endl
1114 <<
"\tMs = " << Ms << std::endl
1115 <<
"\tKirr = " << Kirr << std::endl
1116 <<
"\tPath = " << Path << std::endl
1117 <<
"\tHe2 = " << He2 << std::endl
1118 <<
"\tHeo2 = " << Heo2 << std::endl
1119 <<
"\tdelM2 = " << delM2 << std::endl
1120 <<
"\tdelM02 = " << delM02 << std::endl
1121 <<
"\tdHe_dM = " << dHe_dM << std::endl
1122 <<
"\tdManp_dM = " << dManp_dM << std::endl
1123 <<
"\tddelM_dM = " << ddelM_dM << std::endl
1124 <<
"\tdMirrp_dM = " << dMirrp_dM << std::endl
1125 <<
"\tdP_dM = " <<
dP_dM << std::endl
1126 <<
"\tdenom 1+(1-lg/lt)P = " << (1+(1-Gap/Path)*
P) << std::endl;
1131 currentInductor = instanceData.begin();
1137 dManp_dI[i] = ( -Ms * He / (pow(A + sq_Heo2He2, 2.0)*sq_Heo2He2)) *
1138 ( (Heo2 / (Heo2 + He2)) + (2.0*(A + Heo2 / sq_Heo2He2)/(A+sq_Heo2He2)) ) *
dHe_dI[i];
1139 ddelM_dI[i] = (Ms / (A + sq_Heo2He2)) * (1.0 - He2/((A + sq_Heo2He2)*sq_Heo2He2)) *
dHe_dI[i];
1140 dMirrp_dI[i] = (1.0/(2.0*(Kirr - Alpha*sq_delM02delM2))) *
1141 (tanh_qV + delM/sq_delM02delM2 +
1142 (2.0*Alpha*delM*(delM*tanh_qV +
1143 sq_delM02delM2)/(2.0*(Kirr-Alpha*sq_delM02delM2)*sq_delM02delM2))) *
ddelM_dI[i];
1145 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1153 #ifdef Xyce_DEBUG_DEVICE
1156 Xyce::dout() <<
"\tdHe_dI[ " << i <<
" ] =" <<
dHe_dI[ i ] << std::endl
1157 <<
"\tdManp_dI[ " << i <<
" ] = " <<
dManp_dI[i] << std::endl
1158 <<
"\tddelM_dI[ " << i <<
" ] = " <<
ddelM_dI[i] << std::endl
1159 <<
"\tMirrp_dI[ " << i <<
" ] = " <<
dMirrp_dI[i] << std::endl
1160 <<
"\tdP_dI[ " << i <<
" ] = " <<
dP_dI[i] << std::endl;
1167 double dMirrp_dVp = (delM * DeltaVScaling * (1.0-pow(tanh_qV,2.0))) /
1168 (2.0 * (Kirr - Alpha * sq_delM02delM2));
1169 double dMirrp_dVn = -dMirrp_dVp;
1171 dP_dVp = (1.0/dP_Denom) * ((1.0-C) * dMirrp_dVp) -
1172 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) * ( gap_path*(1.0-C)*dMirrp_dVp );
1181 #ifdef Xyce_DEBUG_DEVICE
1184 Xyce::dout() <<
"\tdMirrp_dVp = " << dMirrp_dVp << std::endl
1185 <<
"\tdMirrp_dVn = " << dMirrp_dVn << std::endl
1186 <<
"\tdP_dVp = " <<
dP_dVp << std::endl
1187 <<
"\tdP_dVn = " <<
dP_dVn << std::endl;
1208 std::vector< InductorInstanceData* >::iterator
1210 std::vector< InductorInstanceData* >::iterator
1215 while( currentInductor != endInductor )
1248 bool bsuccess =
true;
1249 #ifdef Xyce_DEBUG_DEVICE
1252 Xyce::dout() <<
"Instance::updatePrimaryState---------------" << std::endl
1253 <<
"\tname = " <<
getName() << std::endl;
1271 double latestMag = mVarScaling * solVector[
li_MagVar ];
1295 bool bsuccess =
true;
1296 #ifdef Xyce_DEBUG_DEVICE
1299 Xyce::dout() <<
"Instance::updateSecondaryState-------------" << std::endl
1300 <<
"\tname = " <<
getName() << std::endl;
1330 bool bsuccess =
true;
1336 #ifdef Xyce_DEBUG_DEVICE
1339 Xyce::dout() <<
"Instance::loadDAEQVector------------------------" << std::endl
1340 <<
"\tname = " <<
getName() << std::endl;
1357 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1358 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1360 while( currentInductor != endInductor )
1362 if( (
getSolverState().dcopFlag) && (*currentInductor)->ICGiven ==
true )
1388 while( currentInductor != endInductor )
1391 qVec[((*currentInductor)->li_Branch)] +=
LOI[ i ];
1394 double windings = (*currentInductor)->L;
1396 qVec[
li_RVar ] += rEqScaling * current * windings;
1407 qVec[
li_MagVar ] += mEqScaling * latestMag;
1434 #ifdef Xyce_DEBUG_DEVICE
1437 Xyce::dout() <<
"Instance::loadDAEFVector------------------------" << std::endl
1438 <<
"\tname = " <<
getName() << std::endl;
1449 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1486 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1487 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1489 while( currentInductor != endInductor )
1491 double current = solVector[(*currentInductor)->li_Branch];
1492 double vNodePos = solVector[(*currentInductor)->li_Pos];
1493 double vNodeNeg = solVector[(*currentInductor)->li_Neg];
1496 fVec[((*currentInductor)->li_Pos)] +=
scalingRHS * current;
1498 fVec[((*currentInductor)->li_Neg)] += -
scalingRHS * current;
1500 fVec[((*currentInductor)->li_Branch)] += -((vNodePos - vNodeNeg)/mid);
1501 double windings = (*currentInductor)->L;
1503 #ifdef Xyce_DEBUG_DEVICE
1506 Xyce::dout() <<
" Inductor = " << (*currentInductor)->name
1507 <<
" li_Pos = " << (*currentInductor)->li_Pos
1508 <<
" li_Neg = " << (*currentInductor)->li_Neg
1509 <<
" li_Branch = " << (*currentInductor)->li_Branch
1510 <<
"\tPos/Neg current*windings = " <<
scalingRHS*current*windings
1511 <<
"\tBranch = " << ((vNodePos - vNodeNeg)/mid)
1533 bool bsuccess =
true;
1542 #ifdef Xyce_DEBUG_DEVICE
1545 Xyce::dout() <<
"Instance::loadDAEdQdx-----------------------" << std::endl
1546 <<
"\tname = " <<
getName() << std::endl;
1568 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1569 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1571 while( currentInductor != endInductor )
1576 (*dQdxMatPtr)[((*currentInductor)->li_Branch)]
1577 [(*currentInductor)->inductorCurrentOffsets[j]] +=
LO[i][j];
1601 bool bsuccess =
true;
1607 #ifdef Xyce_DEBUG_DEVICE
1610 Xyce::dout() <<
"Instance::loadDAEdFdx----------------------" << std::endl
1611 <<
"\tname = " <<
getName() << std::endl;
1630 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1648 mEqScaling *
dP_dI[i] * latestR / Path;
1684 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1685 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1686 while( currentInductor != endInductor )
1690 (*dFdxMatPtr)[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] +=
scalingRHS;
1692 (*dFdxMatPtr)[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] += -
scalingRHS;
1694 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] += -1.0/mid;
1696 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] += 1.0/mid;
1698 #ifdef Xyce_DEBUG_DEVICE
1702 <<
"(*currentInductor)->li_Pos = " << (*currentInductor)->li_Pos << std::endl
1703 <<
"(*currentInductor)->li_Neg = " << (*currentInductor)->li_Neg << std::endl
1704 <<
"(*currentInductor)->li_Branch = " << (*currentInductor)->li_Branch << std::endl
1705 <<
"(*currentInductor)->APosEquBraVarOffset = " << (*currentInductor)->APosEquBraVarOffset << std::endl
1706 <<
"(*currentInductor)->ANegEquBraVarOffset = " << (*currentInductor)->ANegEquBraVarOffset << std::endl
1707 <<
"(*currentInductor)->ABraEquPosNodeOffset = " << (*currentInductor)->ABraEquPosNodeOffset << std::endl
1708 <<
"(*currentInductor)->ABraEquNegNodeOffset = " << (*currentInductor)->ABraEquNegNodeOffset << std::endl
1709 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Pos)<<
"] ["<<((*currentInductor)->APosEquBraVarOffset)<<
"] = " <<
scalingRHS << std::endl
1710 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Neg)<<
"] ["<<((*currentInductor)->ANegEquBraVarOffset)<<
"] = " << -
scalingRHS << std::endl
1711 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Branch)<<
"]["<<((*currentInductor)->ABraEquPosNodeOffset)<<
"] = " << -1/mid << std::endl
1712 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Branch)<<
"]["<<((*currentInductor)->ABraEquNegNodeOffset)<<
"] = " << 1/mid << std::endl;
1716 double delV = solVector[(*currentInductor)->li_Pos] - solVector[(*currentInductor)->li_Neg];
1721 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] +=
1722 delV * (1.0 - (Gap/Path)) *
dP_dI[j]/(mid*mid);
1724 #ifdef Xyce_DEBUG_DEVICE
1727 Xyce::dout() <<
"(*dFdxMatPtr)[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] = " << delV * (1 - (Gap/Path)) *
dP_dI[j]/(mid*mid) << std::endl;
1732 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->magOffset] += delV * (1.0 - (Gap/Path)) *
dP_dM/(mid*mid);
1734 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vPosOffset] += delV * (1.0 - (Gap/Path)) *
dP_dVp/(mid*mid);
1736 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vNegOffset] += delV * (1.0 - (Gap/Path)) *
dP_dVn/(mid*mid);
1738 #ifdef Xyce_DEBUG_DEVICE
1741 Xyce::dout() <<
"(*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->magOffset] = " << delV * (1 - (Gap/Path)) *
dP_dM/(mid*mid) << std::endl
1742 <<
"(*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vPosOffset] = " << delV * (1 - (Gap/Path)) *
dP_dVp/(mid*mid) << std::endl
1743 <<
"(*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vNegOffset] = " << delV * (1 - (Gap/Path)) *
dP_dVn/(mid*mid) << std::endl;
1766 bool bsuccess =
true;
1780 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1781 (*outputFileStreamPtr)
1783 << latestMag <<
"\t "
1807 bool bsuccess =
true;
1824 varTypeVec[i] =
'I';
1828 varTypeVec[numInductors+1] =
'R';
1854 std::vector<Instance*>::iterator iter;
1858 for (iter=first; iter!=last; ++iter)
1860 (*iter)->processParams();
1878 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1894 BCgsFactor( 10000.0 ),
1895 HCgsFactor( 0.012566370614359 ),
1896 UseConstantDeltaVScaling( true ),
1897 tnom(getDeviceOptions().tnom)
1954 std::vector<Instance*>::iterator iter;
1958 for (iter=first; iter!=last; ++iter)
1976 std::vector<Instance*>::const_iterator iter;
1984 os <<
"Number of MutIndNonLin instances: " << isize << std::endl;
1985 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1986 for (i=0, iter=first; iter!=last; ++iter, ++i)
1988 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
2014 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
2029 bool bsuccess =
true;
2030 bool tmpBool =
true;
2034 tmpBool = (*it)->updatePrimaryState ();
2035 bsuccess = bsuccess && tmpBool;
2051 bool bsuccess =
true;
2052 bool tmpBool =
true;
2056 tmpBool = (*it)->updateSecondaryState ();
2057 bsuccess = bsuccess && tmpBool;
2073 bool bsuccess =
true;
2074 bool tmpBool =
true;
2078 tmpBool = (*it)->loadDAEFVector();
2079 bsuccess = bsuccess && tmpBool;
2080 tmpBool = (*it)->loadDAEQVector();
2081 bsuccess = bsuccess && tmpBool;
2097 bool bsuccess =
true;
2098 bool tmpBool =
true;
2102 tmpBool = (*it)->loadDAEdFdx ();
2103 bsuccess = bsuccess && tmpBool;
2104 tmpBool = (*it)->loadDAEdQdx ();
2105 bsuccess = bsuccess && tmpBool;
2120 .registerDevice(
"min", 1)
2121 .registerModelType(
"min", 1)
2122 .registerModelType(
"core", 1);