47 #include <Xyce_config.h>
55 #include <N_LAS_Builder.h>
56 #include <N_LAS_Matrix.h>
57 #include <N_LAS_MultiVector.h>
58 #include <N_LAS_System.h>
59 #include <N_LAS_Vector.h>
61 #include <N_UTL_DeleteList.h>
62 #include <N_UTL_fwd.h>
75 solutionSize(tiaPtr->solutionSize),
76 stateSize(tiaPtr->stateSize),
77 tiaParamsPtr_(tiaPtr),
78 nextSolPtrSwitched(false),
90 savedNextSolutionPtr(0),
99 currStoreLeadCurrQPtr(0),
100 lastStoreLeadCurrQPtr(0),
101 oldeStoreLeadCurrQPtr(0),
102 nextStoreLeadCurrQPtr(0),
103 currStoreLeadCurrQDerivPtr(0),
104 lastStoreLeadCurrQDerivPtr(0),
105 oldeStoreLeadCurrQDerivPtr(0),
106 nextStoreLeadCurrQDerivPtr(0),
107 currSolutionDerivPtr(0),
108 lastSolutionDerivPtr(0),
109 oldeSolutionDerivPtr(0),
110 nextSolutionDerivPtr(0),
111 currStateDerivPtr(0),
112 lastStateDerivPtr(0),
113 oldeStateDerivPtr(0),
114 nextStateDerivPtr(0),
116 currSolutionDivDiffPtr(0),
117 lastSolutionDivDiffPtr(0),
118 oldeSolutionDivDiffPtr(0),
119 nextSolutionDivDiffPtr(0),
120 currStateDivDiffPtr(0),
121 lastStateDivDiffPtr(0),
122 oldeStateDivDiffPtr(0),
123 nextStateDivDiffPtr(0),
129 #ifdef Xyce_DEBUG_DEVICE
132 newtonCorrectionPtr(0),
134 indexVecsInitialized(false),
153 qNewtonCorrectionPtr(0),
154 sNewtonCorrectionPtr(0),
155 stoNewtonCorrectionPtr(0),
156 stoLeadCurrQNewtonCorrectionPtr(0),
250 for (
int i=0;i<sizeOfHistory;++i)
421 for (
int ip=0;ip<numParams;++ip)
472 for (
int i=0;i<sizeOfHistory;++i)
553 N_LAS_Builder & bld_ =
lasSysPtr->builder();
619 for (
int ip=0;ip<numParams;++ip)
670 for (
int i=0;i<sizeOfHistory;++i)
715 #ifdef Xyce_DEBUG_TIME
716 Xyce::dout() <<
"\nN_TIA_DataStore::setConstantHistory" << std::endl;
859 #ifdef Xyce_DEBUG_TIME
862 Xyce::dout() <<
"\nN_TIA_DataStore::updateSolDataArrays " << std::endl;
924 for (
int ip=0;ip<iparamSizeF;++ip)
933 for (
int ip=0;ip<iparamSizeQ;++ip)
942 for (
int ip=0;ip<iparamSizeQderiv;++ip)
951 for (
int ip=0;ip<iparamSizeB;++ip)
960 for (
int ip=0;ip<iparamSizeX;++ip)
969 for (
int ip=0;ip<iparamSizeQX;++ip)
979 for (
int ip=0;ip<iparamSizeQXd;++ip)
1020 #ifdef Xyce_DEBUG_TIME
1021 Xyce::dout() <<
"\nN_TIA_DataStore::updateStateDataArrays " << std::endl;
1082 << Xyce::section_divider << std::endl
1084 <<
" Solution Vectors:\n Current Last Olde Error" << std::endl;
1091 os << Xyce::section_divider << std::endl;
1151 for (
int ip=0;ip<iparamSizeF;++ip)
1160 for (
int ip=0;ip<iparamSizeQ;++ip)
1169 for (
int ip=0;ip<iparamSizeQ;++ip)
1178 for (
int ip=0;ip<iparamSizeB;++ip)
1187 for (
int ip=0;ip<iparamSizeX;++ip)
1196 for (
int ip=0;ip<iparamSizeQX;++ip)
1206 for (
int ip=0;ip<iparamSizeQX;++ip)
1226 os << Xyce::subsection_divider << std::endl;
1228 os <<
" Predicted Solution:" << std::endl;
1235 os << Xyce::subsection_divider << std::endl;
1248 os << Xyce::subsection_divider << std::endl;
1250 os <<
" Predicted Derivative:" << std::endl;
1257 os << Xyce::subsection_divider << std::endl;
1279 double errorNorm = 0.0;
1281 double sum = errorNorm*errorNorm;
1336 const std::list<index_pair> & solGIDList,
1337 const std::list<index_pair> & staGIDList)
1380 bool bsuccess =
true;
1458 #ifdef Xyce_DEBUG_TIME
1459 Xyce::dout() <<
"\nN_TIA_DataStore::setZeroHistory" << std::endl;
1539 int sizeOfHistory =
xHistory.size();
1540 for (
int i = 0; i < sizeOfHistory; ++i)
1550 std::vector<N_LAS_Vector *> dfdp =
dfdpHistory[ip];
1551 std::vector<N_LAS_Vector *> dqdp =
dqdpHistory[ip];
1552 std::vector<N_LAS_Vector *> dbdp =
dbdpHistory[ip];
1553 std::vector<N_LAS_Vector *> dXdp =
dXdpHistory[ip];
1556 dfdp[i]->putScalar(0.0);
1557 dqdp[i]->putScalar(0.0);
1558 dbdp[i]->putScalar(0.0);
1559 dXdp[i]->putScalar(0.0);
1560 dQdxdXdp[i]->putScalar(0.0);
1586 bool nTDMF=
lasSysPtr->getNonTrivialDeviceMaskFlag();
1612 for (
int k = 0, currI = 0, currV = 0, currM = 0 ; k <
solutionSize; ++k)
1634 #ifdef Xyce_DEBUG_TIME
1639 Xyce::dout() << Xyce::section_divider << std::endl
1640 <<
"N_TIA_DataStore::setErrorWtVector" << std::endl << std::endl
1641 <<
" errorWtVector currSolution relErrorTol absErrorTol" << std::endl
1642 <<
" -------------- -------------- -------------- --------------" << std::endl;
1649 double currMaxValue = 0.0;
1654 #ifdef Xyce_DEBUG_TIME
1657 std::vector<int> index(1, -1);
1659 Xyce::dout() <<
"currMaxValue = " << currMaxValue <<
", currMaxValueIndex = " << index[0] << std::endl;
1661 #endif // Xyce_DEBUG_TIME
1667 #ifdef Xyce_DEBUG_TIME
1670 double currMaxValue = 0.0;
1672 std::vector<int> index(1, -1);
1674 Xyce::dout() <<
"currMaxValueoldLte = " << currMaxValue <<
", currMaxValueIndex = " << index[0] << std::endl;
1743 #ifdef Xyce_DEBUG_TIME
1748 sprintf(tmp,
"%16.6e%16.6e%16.6e%16.6e",
1754 Xyce::dout() << tmp << std::endl;
1759 #ifdef Xyce_DEBUG_TIME
1762 Xyce::dout() <<
"" << std::endl
1763 << Xyce::section_divider << std::endl;
1779 double errorNorm = 0.0, qErrorNorm = 0.0;
1783 #ifdef Xyce_DEBUG_TIME
1786 Xyce::dout() <<
"N_TIA_DataStore::errorNorm = " << errorNorm << std::endl;
1787 Xyce::dout() <<
"N_TIA_DataStore::qErrorNorm = " << qErrorNorm << std::endl;
1800 double totalSize = upperSize;
1801 double totalSum = errorNorm*errorNorm*upperSize;
1802 double totalQSum = qErrorNorm*qErrorNorm*upperSize;
1804 for (
int i=0;i<sumSize;++i)
1810 #ifdef Xyce_DEBUG_TIME
1811 Xyce::dout() <<
"DSdae:innerSum["<<i<<
"] = " << innerSum <<std::endl;
1812 Xyce::dout() <<
"DSdae:innerQSum["<<i<<
"] = " << innerQSum <<std::endl;
1813 Xyce::dout() <<
"DSdae:innerSize["<<i<<
"] = " << innerSize <<std::endl;
1816 totalSize += innerSize;
1817 totalSum += innerSum;
1818 totalQSum += innerQSum;
1821 double recip = 1.0/totalSize;
1822 errorNorm = sqrt(recip*totalSum);
1823 qErrorNorm = sqrt(recip*totalQSum);
1825 #ifdef Xyce_DEBUG_TIME
1826 Xyce::dout() <<
"DSdae:upperSize = " << upperSize << std::endl;
1827 Xyce::dout() <<
"DSdae:totalSum = " << totalSum << std::endl;
1828 Xyce::dout() <<
"DSdae:totalQSum = " << totalQSum << std::endl;
1829 Xyce::dout() <<
"DSdae:totalSize = " << totalSize << std::endl;
1830 Xyce::dout() <<
"DSdae:2-level errorNorm = " << errorNorm << std::endl;
1831 Xyce::dout() <<
"DSdae:2-level qErrorNorm = " << qErrorNorm << std::endl;
1835 #ifndef Xyce_USE_Q_NORM
1838 errorNorm = sqrt(0.5*errorNorm*errorNorm+0.5*qErrorNorm*qErrorNorm);
1863 double qErrorNorm = 0.0;
1865 double sum = qErrorNorm*qErrorNorm;
1962 if (currentOrder<maxOrder)
2016 double errorNorm = 0.0;
2026 double totalSize = upperSize;
2027 double totalSum = errorNorm*errorNorm*upperSize;
2029 for (
int i=0;i<sumSize;++i)
2034 totalSize += innerSize;
2035 totalSum += innerSum;
2038 double recip = 1.0/totalSize;
2039 errorNorm = sqrt(recip*totalSum);
2055 double errorNorm = 0.0;
2065 double totalSize = upperSize;
2066 double totalSum = errorNorm*errorNorm*upperSize;
2068 for (
int i=0;i<sumSize;++i)
2073 totalSize += innerSize;
2074 totalSum += innerSum;
2077 double recip = 1.0/totalSize;
2078 errorNorm = sqrt(recip*totalSum);
2094 double errorNorm = 0.0;
2104 double totalSize = upperSize;
2105 double totalSum = errorNorm*errorNorm*upperSize;
2107 for (
int i=0;i<sumSize;++i)
2112 totalSize += innerSize;
2113 totalSum += innerSum;
2116 double recip = 1.0/totalSize;
2117 errorNorm = sqrt(recip*totalSum);
2133 double errorNorm = 0.0;
2143 double totalSize = upperSize;
2144 double totalSum = errorNorm*errorNorm*upperSize;
2146 for (
int i=0;i<sumSize;++i)
2151 totalSize += innerSize;
2152 totalSum += innerSum;
2155 double recip = 1.0/totalSize;
2156 errorNorm = sqrt(recip*totalSum);
2197 #ifdef Xyce_DEBUG_TIME
2200 Xyce::dout() <<
"\n newtonCorrection: \n" << std::endl;
2202 Xyce::dout() << std::endl;
2203 Xyce::dout() <<
"\n qNewtonCorrection: \n" << std::endl;
2205 Xyce::dout() <<
"\n sNewtonCorrection: \n" << std::endl;
2207 Xyce::dout() << std::endl;
2209 #endif // Xyce_DEBUG_TIME
2223 std::vector<double> & varData )
2237 varData[i++] =
errWtVecPtr->getElementByGlobalIndex( gid );
2238 varData[i++] =
absErrTolPtr->getElementByGlobalIndex( gid );
2239 varData[i++] =
relErrTolPtr->getElementByGlobalIndex( gid );
2241 varData[i++] =
qErrWtVecPtr->getElementByGlobalIndex ( gid );
2242 varData[i++] =
daeQVectorPtr->getElementByGlobalIndex ( gid );
2243 varData[i++] =
daeFVectorPtr->getElementByGlobalIndex ( gid );
2244 varData[i++] =
daeBVectorPtr->getElementByGlobalIndex ( gid );
2245 varData[i++] =
xn0Ptr->getElementByGlobalIndex ( gid );
2246 varData[i++] =
qn0Ptr->getElementByGlobalIndex ( gid );
2247 varData[i++] =
qpn0Ptr->getElementByGlobalIndex ( gid );
2262 std::vector<double> & varData )
2265 varData.resize( 14 );
2269 varData[i++] =
currStatePtr->getElementByGlobalIndex( gid );
2270 varData[i++] =
lastStatePtr->getElementByGlobalIndex( gid );
2271 varData[i++] =
nextStatePtr->getElementByGlobalIndex( gid );
2278 varData[i++] =
sn0Ptr->getElementByGlobalIndex( gid );
2279 varData[i++] =
spn0Ptr->getElementByGlobalIndex( gid );
2293 std::vector<double> & varData )
2296 varData.resize( 6 );
2298 varData[i++] =
currStorePtr->getElementByGlobalIndex( gid );
2299 varData[i++] =
lastStorePtr->getElementByGlobalIndex( gid );
2300 varData[i++] =
nextStorePtr->getElementByGlobalIndex( gid );
2301 varData[i++] =
ston0Ptr->getElementByGlobalIndex( gid );
2302 varData[i++] =
stopn0Ptr->getElementByGlobalIndex( gid );
2315 const std::vector<double> & varData )
2328 errWtVecPtr->setElementByGlobalIndex ( gid, varData[i++] );
2329 absErrTolPtr->setElementByGlobalIndex ( gid, varData[i++] );
2330 relErrTolPtr->setElementByGlobalIndex ( gid, varData[i++] );
2332 qErrWtVecPtr->setElementByGlobalIndex ( gid, varData[i++] );
2333 daeQVectorPtr->setElementByGlobalIndex ( gid, varData[i++] );
2334 daeFVectorPtr->setElementByGlobalIndex ( gid, varData[i++] );
2335 daeBVectorPtr->setElementByGlobalIndex ( gid, varData[i++] );
2336 xn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2337 qn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2338 qpn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2353 const std::vector<double> & varData )
2359 currStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
2360 lastStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
2361 nextStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
2369 sn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2370 spn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2383 const std::vector<double> & varData )
2387 currStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
2388 lastStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
2389 nextStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
2390 ston0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
2391 stopn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );