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;
87 namespace MutIndNonLin {
147 NULL,
U_NONE,
CAT_MATERIAL,
"Value below which domain flexing parameter will be treated as zero.");
151 NULL,
U_VOLT,
CAT_NONE,
"Smoothing coefficient for voltage difference over first inductor");
155 NULL,
U_VOLT,
CAT_NONE,
"Use constant scaling factor to smooth voltage difference over first inductor");
160 U_NONE,
CAT_NONE,
"Flag to include the magnetics in the solution.");
250 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
252 temp(getDeviceOptions().temp.getImmutableValue<double>()),
253 outputStateVarsFlag( false ),
254 maxVoltageDrop(1.0e-10)
302 LOI.resize( numInductors );
303 LO.resize( numInductors );
306 LO[i].resize( numInductors );
332 std::string filename(
"Inductor_" );
333 filename.append(
getName().getEncodedName() );
334 filename.append(
".dat" );
336 replace( filename.begin(), filename.end(),
'%',
'_' );
337 replace( filename.begin(), filename.end(),
':',
'_' );
340 outputFileStreamPtr->open( filename.c_str() );
341 if( !(*outputFileStreamPtr) )
343 UserError(*
this) <<
"Could not open file " << filename <<
" for output of state variables";
346 (*outputFileStreamPtr).setf(std::ios::scientific, std::ios::floatfield );
347 (*outputFileStreamPtr).width(20);
348 (*outputFileStreamPtr).precision(12);
353 dHe_dI.resize( numInductors );
357 dP_dI.resize( numInductors );
368 int numExtraEquations = 1;
373 numIntVars = numInductors + numExtraEquations;
432 jacStamp[2*numInductors + i].resize(numInductors + 5);
436 jacStamp[2*numInductors + i].resize(numInductors + 4);
444 jacStamp[2*i ][0] = 2*numInductors + i;
446 jacStamp[2*i+1][0] = 2*numInductors + i;
460 jacStamp[2*numInductors + i][0] = 0;
461 jacStamp[2*numInductors + i][1] = 1;
462 jacStamp[2*numInductors + i][2] = 2*i;
463 jacStamp[2*numInductors + i][3] = 2*i + 1;
466 jacStamp[2*numInductors + i][j+4] = 2*numInductors + j;
496 jacStamp[ 3*numInductors + rOffset].resize(numInductors + 1);
501 jacStamp[ 3*numInductors + rOffset ][i]=2*numInductors+i;
507 #ifdef Xyce_DEBUG_DEVICE
510 Xyce::dout() <<
"Instance::Instance----------" << std::endl;
511 Xyce::dout() <<
"numExtVars = " <<
numExtVars <<
", " << ibev << std::endl
512 <<
"numIntVars = " <<
numIntVars <<
", " << ibiv << std::endl
514 <<
"numInductors = " << numInductors << std::endl
515 <<
"jacStamp = " << std::endl;
516 for(
int i = 0; i<
jacStamp.size(); ++i )
518 Xyce::dout() <<
"jacStamp[ " << i <<
" ] = { ";
519 for(
int j=0; j<
jacStamp[i].size(); ++j)
522 if( j != (
jacStamp[i].size() -1 ) )
524 Xyce::dout() <<
", ";
527 Xyce::dout() <<
" }" << std::endl;
549 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
550 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
551 for ( ; currentInductor != endInductor ; ++currentInductor)
553 if (*currentInductor != NULL)
555 delete *currentInductor;
556 *currentInductor = NULL;
590 const std::vector<int> & extLIDVecRef)
603 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
604 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
607 while( currentInductor != endInductor )
609 (*currentInductor)->li_Pos =
extLIDVec[ i++ ];
610 (*currentInductor)->li_Neg =
extLIDVec[ i++ ];
611 (*currentInductor)->li_Branch = intLIDVec[ j++ ];
622 #ifdef Xyce_DEBUG_DEVICE
625 Xyce::dout() <<
"Instance::registerLIDs------------------------" << std::endl;
628 while( currentInductor != endInductor )
630 Xyce::dout() <<
"Inductor [ " << i++ <<
" ] "
631 <<
" li_Pos = " << (*currentInductor)->li_Pos
632 <<
" li_Neg = " << (*currentInductor)->li_Neg
633 <<
" li_Branch = " << (*currentInductor)->li_Branch << std::endl;
636 Xyce::dout() <<
" li_MagVar = " <<
li_MagVar << std::endl
637 <<
" li_RVar = " <<
li_RVar << std::endl;
655 for (std::vector< InductorInstanceData* >::const_iterator it =
instanceData.begin(), end =
instanceData.end(); it != end; ++it )
689 #ifdef Xyce_DEBUG_DEVICE
692 Xyce::dout() <<
"Instance::registerStateLIDs-------------------" << std::endl;
694 Xyce::dout() <<
"li_MagVarState = " <<
li_MagVarState << std::endl
787 #ifdef Xyce_DEBUG_DEVICE
790 Xyce::dout() <<
"Instance::registerJacLIDs ----------------------------" << std::endl;
792 Xyce::dout() <<
"jacLIDVec = " << std::endl;
793 for(
int i = 0; i<
jacStamp.size(); ++i )
795 Xyce::dout() <<
"jacLIDVec[ " << i <<
" ] = { ";
796 for(
int j=0; j<jacLIDVec[i].size(); ++j)
798 Xyce::dout() << jacLIDVec[i][j];
799 if( j != ( jacLIDVec[i].size() -1 ) )
801 Xyce::dout() <<
", ";
804 Xyce::dout() <<
" }" << std::endl;
809 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
810 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
813 while( currentInductor != endInductor )
815 (*currentInductor)->APosEquBraVarOffset = jacLIDVec[ 2*i ][ 0 ];
816 (*currentInductor)->ANegEquBraVarOffset = jacLIDVec[ 2*i + 1 ][ 0 ];
817 (*currentInductor)->vPosOffset = jacLIDVec[ 2*
numInductors + i ][ 0 ];
818 (*currentInductor)->vNegOffset = jacLIDVec[ 2*
numInductors + i ][ 1 ];
824 (*currentInductor)->ABraEquPosNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 0 + extraOffset ];
825 (*currentInductor)->ABraEquNegNodeOffset = jacLIDVec[ 2*
numInductors + i ][ 1 + extraOffset ];
830 (*currentInductor)->ABraEquBraVarOffset = jacLIDVec[ 2*numInductors + i ][ j + 2 + extraOffset ];
832 (*currentInductor)->inductorCurrentOffsets[ j ] = jacLIDVec[ 2*numInductors + i ][ j + 2 + extraOffset ];
836 (*currentInductor)->magOffset = jacLIDVec[ 2*numInductors + i ][ numInductors + 2 + extraOffset ];
865 #ifdef Xyce_DEBUG_DEVICE
870 while( currentInductor != endInductor )
872 Xyce::dout() <<
"Inductor [ " << i <<
" ] " << (*currentInductor)->name << std::endl
873 <<
" APosEquBraVarOffset = " << (*currentInductor)->APosEquBraVarOffset << std::endl
874 <<
" ANegEquBraVarOffset = " << (*currentInductor)->ANegEquBraVarOffset << std::endl
875 <<
" vPosOffset = " << (*currentInductor)->vPosOffset << std::endl
876 <<
" vNegOffset = " << (*currentInductor)->vNegOffset << std::endl
877 <<
" ABraEquPosNodeOffset = " << (*currentInductor)->ABraEquPosNodeOffset << std::endl
878 <<
" ABraEquNegNodeOffset = " << (*currentInductor)->ABraEquNegNodeOffset << std::endl
879 <<
" ABraEquBraVarOffset = " << (*currentInductor)->ABraEquBraVarOffset << std::endl
880 <<
" magOffset = " << (*currentInductor)->magOffset << std::endl;
881 Xyce::dout() <<
"\tInductor branch offsets = { ";
884 Xyce::dout() << (*currentInductor)->inductorCurrentOffsets[ j ] <<
", ";
886 Xyce::dout() <<
"} " << std::endl;
892 Xyce::dout() <<
"mEquInductorOffsets = ";
897 Xyce::dout() << std::endl
900 Xyce::dout() <<
"rEquInductorOffsets = ";
905 Xyce::dout() << std::endl
921 bool bsuccess =
true;
926 std::vector< InductorInstanceData* >::iterator currentData =
instanceData.begin();
931 (*currentData)->L = ((*currentData)->baseL)*factor;
951 bool bsuccess =
true;
953 #ifdef Xyce_DEBUG_DEVICE
956 Xyce::dout() <<
"Instance::updateIntermediateVars " << std::endl;
987 double voltageDrop= Vpos - Vneg;
1002 qV = DeltaVScaling * voltageDrop;
1009 double tanh_qV = 0.0;
1025 std::vector< InductorInstanceData* >::iterator currentInductor = instanceData.begin();
1026 std::vector< InductorInstanceData* >::iterator endInductor = instanceData.end();
1028 while( currentInductor != endInductor )
1036 double latestMag=0.0;
1039 latestMag = mVarScaling * solVector[
li_MagVar ];
1051 double H =
Happ - (Gap / Path) * latestMag;
1053 He = H + Alpha * latestMag;
1058 const double gap_path = Gap / Path;
1059 const double He2 = He*
He;
1060 const double Heo2 =
Heo*
Heo;
1061 const double sq_Heo2He2 = sqrt(Heo2 + He2);
1064 double Man = Ms * He / ( A + sq_Heo2He2 );
1065 delM = Man - latestMag;
1070 const double sq_delM02delM2 = sqrt( delM02 + delM2 );
1074 Mirrp = (delM * tanh_qV + sq_delM02delM2 ) / (2*( Kirr- Alpha * sq_delM02delM2));
1075 Manp = Ms * (A + Heo2/sq_Heo2He2) / pow(A + sq_Heo2He2, 2.0);
1076 P = ( C *
Manp + (1 - C) *
Mirrp) / ((1 + (gap_path - Alpha) * C *
Manp + gap_path * (1-C) *
Mirrp)*Ms);
1080 Mirrp = (delM * tanh_qV + sq_delM02delM2 ) / (2*( Kirr- Alpha * sq_delM02delM2));
1081 Manp = Ms * (A + Heo2/sq_Heo2He2) / pow(A + sq_Heo2He2, 2.0);
1082 P = ( C *
Manp + (1 - C) *
Mirrp) / (1 + (gap_path - Alpha) * C *
Manp + gap_path * (1-C) *
Mirrp);
1085 #ifdef Xyce_DEBUG_DEVICE
1088 Xyce::dout() <<
"\tA = " << A << std::endl
1089 <<
"\tArea = " << Area << std::endl
1090 <<
"\tPath = " << Path << std::endl
1091 <<
"\tGap = " << Gap << std::endl
1092 <<
"\tC = " << C << std::endl
1093 <<
"\tVpos = " << Vpos << std::endl
1094 <<
"\tVneg = " << Vneg << std::endl
1095 <<
"\tvoltageDrop = " << voltageDrop << std::endl
1096 <<
"\tqV = " <<
qV << std::endl
1097 <<
"\tdelM0 = " << delM0 << std::endl
1098 <<
"\tHapp = " <<
Happ
1099 <<
"\tlatestMag = " << latestMag
1100 <<
"\tlatestR = " << rVarScaling * solVector[
li_RVar ] << std::endl
1101 <<
"\tHe = " << He << std::endl
1102 <<
"\tH = " << H << std::endl
1103 <<
"\tHeo = " << Heo << std::endl
1104 <<
"\tMan = " << Man << std::endl
1105 <<
"\tdelM = " << delM << std::endl
1106 <<
"\tMirrp = " <<
Mirrp << std::endl
1107 <<
"\tManp = " <<
Manp << std::endl
1108 <<
"\tP = " <<
P << std::endl
1116 double dHe_dM = ((Alpha - gap_path) * mVarScaling);
1118 double dManp_dM = ( -Ms * He / (pow(A + sq_Heo2He2, 2.0)*sq_Heo2He2)) *
1119 ( (Heo2 / (Heo2 + He2)) + (2.0*(A + Heo2 / sq_Heo2He2)/(A+sq_Heo2He2)) ) * dHe_dM;
1121 double ddelM_dM = ( dHe_dM*Ms/(A + sq_Heo2He2) ) * (1.0 - He2 / ((A + sq_Heo2He2)*sq_Heo2He2)) - mVarScaling;
1123 double dMirrp_dM = (1.0/(2.0*(Kirr - Alpha*sq_delM02delM2))) *
1124 (tanh_qV + delM/sq_delM02delM2 +
1125 (2.0*Alpha*delM*(delM*tanh_qV + sq_delM02delM2)
1126 /(2.0*(Kirr-Alpha*sq_delM02delM2)*sq_delM02delM2))) * ddelM_dM;
1128 double dP_Denom=0.0;
1131 dP_Denom = 1.0 + (gap_path - Alpha)*C*
Manp + gap_path * (1.0-C) *
Mirrp;
1133 dP_dM = (1.0/dP_Denom) * (C * dManp_dM + (1.0-C) * dMirrp_dM) -
1134 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1135 ( (gap_path - Alpha)*C*dManp_dM + gap_path*(1.0-C)*dMirrp_dM );
1140 dP_Denom = 1.0 + (gap_path - Alpha)*C*
Manp + gap_path * (1.0-C) *
Mirrp;
1142 dP_dM = (1.0/dP_Denom) * (C * dManp_dM + (1.0-C) * dMirrp_dM) -
1143 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1144 ( (gap_path - Alpha)*C*dManp_dM + gap_path*(1.0-C)*dMirrp_dM );
1147 #ifdef Xyce_DEBUG_DEVICE
1150 Xyce::dout() <<
"\tA = " << A << std::endl
1151 <<
"\tAlpha = " << Alpha << std::endl
1152 <<
"\tC = " << C << std::endl
1153 <<
"\tGap = " << Gap << std::endl
1154 <<
"\tMs = " << Ms << std::endl
1155 <<
"\tKirr = " << Kirr << std::endl
1156 <<
"\tPath = " << Path << std::endl
1157 <<
"\tHe2 = " << He2 << std::endl
1158 <<
"\tHeo2 = " << Heo2 << std::endl
1159 <<
"\tdelM2 = " << delM2 << std::endl
1160 <<
"\tdelM02 = " << delM02 << std::endl
1161 <<
"\tdHe_dM = " << dHe_dM << std::endl
1162 <<
"\tdManp_dM = " << dManp_dM << std::endl
1163 <<
"\tddelM_dM = " << ddelM_dM << std::endl
1164 <<
"\tdMirrp_dM = " << dMirrp_dM << std::endl
1165 <<
"\tdP_dM = " <<
dP_dM << std::endl
1166 <<
"\tdenom 1+(1-lg/lt)P = " << (1+(1-Gap/Path)*
P) << std::endl;
1171 currentInductor = instanceData.begin();
1177 dManp_dI[i] = ( -Ms * He / (pow(A + sq_Heo2He2, 2.0)*sq_Heo2He2)) *
1178 ( (Heo2 / (Heo2 + He2)) + (2.0*(A + Heo2 / sq_Heo2He2)/(A+sq_Heo2He2)) ) *
dHe_dI[i];
1179 ddelM_dI[i] = (Ms / (A + sq_Heo2He2)) * (1.0 - He2/((A + sq_Heo2He2)*sq_Heo2He2)) *
dHe_dI[i];
1180 dMirrp_dI[i] = (1.0/(2.0*(Kirr - Alpha*sq_delM02delM2))) *
1181 (tanh_qV + delM/sq_delM02delM2 +
1182 (2.0*Alpha*delM*(delM*tanh_qV +
1183 sq_delM02delM2)/(2.0*(Kirr-Alpha*sq_delM02delM2)*sq_delM02delM2))) *
ddelM_dI[i];
1185 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) *
1193 #ifdef Xyce_DEBUG_DEVICE
1196 Xyce::dout() <<
"\tdHe_dI[ " << i <<
" ] =" <<
dHe_dI[ i ] << std::endl
1197 <<
"\tdManp_dI[ " << i <<
" ] = " <<
dManp_dI[i] << std::endl
1198 <<
"\tddelM_dI[ " << i <<
" ] = " <<
ddelM_dI[i] << std::endl
1199 <<
"\tMirrp_dI[ " << i <<
" ] = " <<
dMirrp_dI[i] << std::endl
1200 <<
"\tdP_dI[ " << i <<
" ] = " <<
dP_dI[i] << std::endl;
1207 double dMirrp_dVp = (delM * DeltaVScaling * (1.0-pow(tanh_qV,2.0))) /
1208 (2.0 * (Kirr - Alpha * sq_delM02delM2));
1209 double dMirrp_dVn = -dMirrp_dVp;
1211 dP_dVp = (1.0/dP_Denom) * ((1.0-C) * dMirrp_dVp) -
1212 ( (C*
Manp + (1.0-C)*
Mirrp)/pow(dP_Denom,2.0) ) * ( gap_path*(1.0-C)*dMirrp_dVp );
1221 #ifdef Xyce_DEBUG_DEVICE
1224 Xyce::dout() <<
"\tdMirrp_dVp = " << dMirrp_dVp << std::endl
1225 <<
"\tdMirrp_dVn = " << dMirrp_dVn << std::endl
1226 <<
"\tdP_dVp = " <<
dP_dVp << std::endl
1227 <<
"\tdP_dVn = " <<
dP_dVn << std::endl;
1248 std::vector< InductorInstanceData* >::iterator
1250 std::vector< InductorInstanceData* >::iterator
1255 while( currentInductor != endInductor )
1288 bool bsuccess =
true;
1289 #ifdef Xyce_DEBUG_DEVICE
1292 Xyce::dout() <<
"Instance::updatePrimaryState---------------" << std::endl
1293 <<
"\tname = " <<
getName() << std::endl;
1308 double latestMag = 0.0;
1312 latestMag = mVarScaling * solVector[
li_MagVar ];
1343 bool bsuccess =
true;
1344 #ifdef Xyce_DEBUG_DEVICE
1347 Xyce::dout() <<
"Instance::updateSecondaryState-------------" << std::endl
1348 <<
"\tname = " <<
getName() << std::endl;
1378 bool bsuccess =
true;
1384 #ifdef Xyce_DEBUG_DEVICE
1387 Xyce::dout() <<
"Instance::loadDAEQVector------------------------" << std::endl
1388 <<
"\tname = " <<
getName() << std::endl;
1405 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1406 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1408 while( currentInductor != endInductor )
1410 if( (
getSolverState().dcopFlag) && (*currentInductor)->ICGiven ==
true )
1436 while( currentInductor != endInductor )
1439 qVec[((*currentInductor)->li_Branch)] +=
LOI[ i ];
1442 double windings = (*currentInductor)->L;
1444 qVec[
li_RVar ] += rEqScaling * current * windings;
1457 qVec[
li_MagVar ] += mEqScaling * latestMag;
1484 #ifdef Xyce_DEBUG_DEVICE
1487 Xyce::dout() <<
"Instance::loadDAEFVector------------------------" << std::endl
1488 <<
"\tname = " <<
getName() << std::endl;
1499 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1538 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1539 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1541 while( currentInductor != endInductor )
1543 double current = solVector[(*currentInductor)->li_Branch];
1544 double vNodePos = solVector[(*currentInductor)->li_Pos];
1545 double vNodeNeg = solVector[(*currentInductor)->li_Neg];
1548 fVec[((*currentInductor)->li_Pos)] +=
scalingRHS * current;
1550 fVec[((*currentInductor)->li_Neg)] += -
scalingRHS * current;
1552 fVec[((*currentInductor)->li_Branch)] += -((vNodePos - vNodeNeg)/mid);
1553 double windings = (*currentInductor)->L;
1555 #ifdef Xyce_DEBUG_DEVICE
1558 Xyce::dout() <<
" Inductor = " << (*currentInductor)->name
1559 <<
" li_Pos = " << (*currentInductor)->li_Pos
1560 <<
" li_Neg = " << (*currentInductor)->li_Neg
1561 <<
" li_Branch = " << (*currentInductor)->li_Branch
1562 <<
"\tPos/Neg current*windings = " <<
scalingRHS*current*windings
1563 <<
"\tBranch = " << ((vNodePos - vNodeNeg)/mid)
1585 bool bsuccess =
true;
1594 #ifdef Xyce_DEBUG_DEVICE
1597 Xyce::dout() <<
"Instance::loadDAEdQdx-----------------------" << std::endl
1598 <<
"\tname = " <<
getName() << std::endl;
1620 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1621 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1623 while( currentInductor != endInductor )
1627 (*dQdxMatPtr)[((*currentInductor)->li_Branch)]
1628 [(*currentInductor)->inductorCurrentOffsets[j]] +=
LO[i][j];
1652 bool bsuccess =
true;
1658 #ifdef Xyce_DEBUG_DEVICE
1661 Xyce::dout() <<
"Instance::loadDAEdFdx----------------------" << std::endl
1662 <<
"\tname = " <<
getName() << std::endl;
1681 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1696 mEqScaling *
dP_dI[i] * latestR / Path;
1731 std::vector< InductorInstanceData* >::iterator currentInductor =
instanceData.begin();
1732 std::vector< InductorInstanceData* >::iterator endInductor =
instanceData.end();
1733 while( currentInductor != endInductor )
1737 (*dFdxMatPtr)[((*currentInductor)->li_Pos)] [((*currentInductor)->APosEquBraVarOffset)] +=
scalingRHS;
1739 (*dFdxMatPtr)[((*currentInductor)->li_Neg)] [((*currentInductor)->ANegEquBraVarOffset)] += -
scalingRHS;
1741 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquPosNodeOffset)] += -1.0/mid;
1743 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][((*currentInductor)->ABraEquNegNodeOffset)] += 1.0/mid;
1745 #ifdef Xyce_DEBUG_DEVICE
1749 <<
"(*currentInductor)->li_Pos = " << (*currentInductor)->li_Pos << std::endl
1750 <<
"(*currentInductor)->li_Neg = " << (*currentInductor)->li_Neg << std::endl
1751 <<
"(*currentInductor)->li_Branch = " << (*currentInductor)->li_Branch << std::endl
1752 <<
"(*currentInductor)->APosEquBraVarOffset = " << (*currentInductor)->APosEquBraVarOffset << std::endl
1753 <<
"(*currentInductor)->ANegEquBraVarOffset = " << (*currentInductor)->ANegEquBraVarOffset << std::endl
1754 <<
"(*currentInductor)->ABraEquPosNodeOffset = " << (*currentInductor)->ABraEquPosNodeOffset << std::endl
1755 <<
"(*currentInductor)->ABraEquNegNodeOffset = " << (*currentInductor)->ABraEquNegNodeOffset << std::endl
1756 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Pos)<<
"] ["<<((*currentInductor)->APosEquBraVarOffset)<<
"] = " <<
scalingRHS << std::endl
1757 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Neg)<<
"] ["<<((*currentInductor)->ANegEquBraVarOffset)<<
"] = " << -
scalingRHS << std::endl
1758 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Branch)<<
"]["<<((*currentInductor)->ABraEquPosNodeOffset)<<
"] = " << -1/mid << std::endl
1759 <<
"(*dFdxMatPtr)["<<((*currentInductor)->li_Branch)<<
"]["<<((*currentInductor)->ABraEquNegNodeOffset)<<
"] = " << 1/mid << std::endl;
1763 double delV = solVector[(*currentInductor)->li_Pos] - solVector[(*currentInductor)->li_Neg];
1768 (*dFdxMatPtr)[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] +=
1769 delV * (1.0 - (Gap/Path)) *
dP_dI[j]/(mid*mid);
1771 #ifdef Xyce_DEBUG_DEVICE
1774 Xyce::dout() <<
"(*dFdxMatPtr)[((*currentInductor)->li_Branch)][(*currentInductor)->inductorCurrentOffsets[j]] = " << delV * (1 - (Gap/Path)) *
dP_dI[j]/(mid*mid) << std::endl;
1780 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->magOffset] += delV * (1.0 - (Gap/Path)) *
dP_dM/(mid*mid);
1782 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vPosOffset] += delV * (1.0 - (Gap/Path)) *
dP_dVp/(mid*mid);
1784 (*dFdxMatPtr)[(*currentInductor)->li_Branch][(*currentInductor)->vNegOffset] += delV * (1.0 - (Gap/Path)) *
dP_dVn/(mid*mid);
1786 #ifdef Xyce_DEBUG_DEVICE
1814 bool bsuccess =
true;
1828 double latestR = rVarScaling * stoVector[
li_RVarStore ];
1829 (*outputFileStreamPtr)
1831 << latestMag <<
"\t "
1855 bool bsuccess =
true;
1872 varTypeVec[i] =
'I';
1876 varTypeVec[numInductors+1] =
'R';
1902 std::vector<Instance*>::iterator iter;
1906 for (iter=first; iter!=last; ++iter)
1908 (*iter)->processParams();
1926 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1942 BCgsFactor( 10000.0 ),
1943 HCgsFactor( 0.012566370614359 ),
1944 UseConstantDeltaVScaling( false ),
1945 tnom(getDeviceOptions().tnom)
2002 std::vector<Instance*>::iterator iter;
2006 for (iter=first; iter!=last; ++iter)
2024 std::vector<Instance*>::const_iterator iter;
2032 os <<
"Number of MutIndNonLin instances: " << isize << std::endl;
2033 os <<
" name=\t\tmodelName\tParameters" << std::endl;
2034 for (i=0, iter=first; iter!=last; ++iter, ++i)
2036 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
2062 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
2077 bool bsuccess =
true;
2078 bool tmpBool =
true;
2082 tmpBool = (*it)->updatePrimaryState ();
2083 bsuccess = bsuccess && tmpBool;
2099 bool bsuccess =
true;
2100 bool tmpBool =
true;
2104 tmpBool = (*it)->updateSecondaryState ();
2105 bsuccess = bsuccess && tmpBool;
2119 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
2121 bool bsuccess =
true;
2122 bool tmpBool =
true;
2126 tmpBool = (*it)->loadDAEFVector();
2127 bsuccess = bsuccess && tmpBool;
2128 tmpBool = (*it)->loadDAEQVector();
2129 bsuccess = bsuccess && tmpBool;
2145 bool bsuccess =
true;
2146 bool tmpBool =
true;
2150 tmpBool = (*it)->loadDAEdFdx ();
2151 bsuccess = bsuccess && tmpBool;
2152 tmpBool = (*it)->loadDAEdQdx ();
2153 bsuccess = bsuccess && tmpBool;
2168 .registerDevice(
"min", 1)
2169 .registerModelType(
"min", 1)
2170 .registerModelType(
"core", 1);