47 #include <Xyce_config.h>
65 #include <N_UTL_Misc.h>
66 #include <N_UTL_fwd.h>
73 #include <N_LAS_MultiVector.h>
74 #include <N_LAS_Vector.h>
75 #include <N_LAS_Matrix.h>
76 #include <N_LAS_System.h>
77 #include <N_LAS_Builder.h>
79 #include <N_ERH_ErrorMgr.h>
80 #include <Teuchos_Utils.hpp>
99 solutionSize(tiaPtr->solutionSize),
100 stateSize(tiaPtr->stateSize),
101 tiaParamsPtr_(tiaPtr),
102 nextSolPtrSwitched(false),
114 savedNextSolutionPtr(0),
123 currStoreLeadCurrQCompPtr(0),
124 lastStoreLeadCurrQCompPtr(0),
125 oldStoreLeadCurrQCompPtr(0),
126 nextStoreLeadCurrQCompPtr(0),
127 currStoreLeadCurrQCompDerivPtr(0),
128 lastStoreLeadCurrQCompDerivPtr(0),
129 oldStoreLeadCurrQCompDerivPtr(0),
130 nextStoreLeadCurrQCompDerivPtr(0),
131 currSolutionDerivPtr(0),
132 lastSolutionDerivPtr(0),
133 oldeSolutionDerivPtr(0),
134 nextSolutionDerivPtr(0),
135 currStateDerivPtr(0),
136 lastStateDerivPtr(0),
137 oldeStateDerivPtr(0),
138 nextStateDerivPtr(0),
139 currSolutionDivDiffPtr(0),
140 lastSolutionDivDiffPtr(0),
141 oldeSolutionDivDiffPtr(0),
142 nextSolutionDivDiffPtr(0),
143 currStateDivDiffPtr(0),
144 lastStateDivDiffPtr(0),
145 oldeStateDivDiffPtr(0),
146 nextStateDivDiffPtr(0),
152 #ifdef Xyce_DEBUG_DEVICE
155 newtonCorrectionPtr(0),
157 indexVecsInitialized(false),
174 qNewtonCorrectionPtr(0),
175 sNewtonCorrectionPtr(0),
176 stoNewtonCorrectionPtr(0),
177 stoLeadCurrQCompNewtonCorrectionPtr(0),
276 for (
int i=0;i<sizeOfHistory;++i)
411 for (
int i=0;i<sizeOfHistory;++i)
491 #ifdef Xyce_DEBUG_TIME
492 Xyce::dout() <<
"\nN_TIA_DataStore::setConstantHistory" << std::endl;
573 while( currVecPtr != endVecPtr )
582 while( currVecPtr != endVecPtr )
591 while( currVecPtr != endVecPtr )
600 while( currVecPtr != endVecPtr )
624 #ifdef Xyce_DEBUG_TIME
627 Xyce::dout() <<
"\nN_TIA_DataStore::updateSolDataArrays " << std::endl;
721 #ifdef Xyce_DEBUG_TIME
722 Xyce::dout() <<
"\nN_TIA_DataStore::updateStateDataArrays " << std::endl;
784 << Xyce::section_divider << std::endl
786 <<
" Solution Vectors:\n Current Last Olde Error" << std::endl;
793 os << Xyce::section_divider << std::endl;
866 os << Xyce::subsection_divider << std::endl;
868 os <<
" Predicted Solution:" << std::endl;
875 os << Xyce::subsection_divider << std::endl;
888 os << Xyce::subsection_divider << std::endl;
890 os <<
" Predicted Derivative:" << std::endl;
897 os << Xyce::subsection_divider << std::endl;
919 double errorNorm = 0.0;
921 double sum = errorNorm*errorNorm;
976 const std::list<index_pair> & solGIDList,
977 const std::list<index_pair> & staGIDList)
1027 bool bsuccess =
true;
1106 #ifdef Xyce_DEBUG_TIME
1107 Xyce::dout() <<
"\nN_TIA_DataStore::setZeroHistory" << std::endl;
1154 int sizeOfHistory =
xHistory.size();
1155 for (
int i=0;i<sizeOfHistory;++i)
1186 bool nTDMF=
lasSysPtr->getNonTrivialDeviceMaskFlag();
1212 for (
int k = 0, currI = 0, currV = 0, currM = 0 ; k <
solutionSize; ++k)
1234 #ifdef Xyce_DEBUG_TIME
1239 Xyce::dout() << Xyce::section_divider << std::endl
1240 <<
"N_TIA_DataStore::setErrorWtVector" << std::endl << std::endl
1241 <<
" errorWtVector currSolution relErrorTol absErrorTol" << std::endl
1242 <<
" -------------- -------------- -------------- --------------" << std::endl;
1249 double currMaxValue = 0.0;
1254 #ifdef Xyce_DEBUG_TIME
1257 std::vector<int> index(1, -1);
1259 Xyce::dout() <<
"currMaxValue = " << currMaxValue <<
", currMaxValueIndex = " << index[0] << std::endl;
1261 #endif // Xyce_DEBUG_TIME
1267 #ifdef Xyce_DEBUG_TIME
1270 double currMaxValue = 0.0;
1272 std::vector<int> index(1, -1);
1274 Xyce::dout() <<
"currMaxValueoldLte = " << currMaxValue <<
", currMaxValueIndex = " << index[0] << std::endl;
1343 #ifdef Xyce_DEBUG_TIME
1348 sprintf(tmp,
"%16.6e%16.6e%16.6e%16.6e",
1354 Xyce::dout() << tmp << std::endl;
1359 #ifdef Xyce_DEBUG_TIME
1362 Xyce::dout() <<
"" << std::endl
1363 << Xyce::section_divider << std::endl;
1379 double errorNorm = 0.0, qErrorNorm = 0.0;
1384 #ifdef Xyce_DEBUG_TIME
1387 Xyce::dout() <<
"N_TIA_DataStore::errorNorm = " << errorNorm << std::endl;
1388 Xyce::dout() <<
"N_TIA_DataStore::qErrorNorm = " << qErrorNorm << std::endl;
1401 double totalSize = upperSize;
1402 double totalSum = errorNorm*errorNorm*upperSize;
1403 double totalQSum = qErrorNorm*qErrorNorm*upperSize;
1405 for (
int i=0;i<sumSize;++i)
1411 #ifdef Xyce_DEBUG_TIME
1412 Xyce::dout() <<
"DSdae:innerSum["<<i<<
"] = " << innerSum <<std::endl;
1413 Xyce::dout() <<
"DSdae:innerQSum["<<i<<
"] = " << innerQSum <<std::endl;
1414 Xyce::dout() <<
"DSdae:innerSize["<<i<<
"] = " << innerSize <<std::endl;
1417 totalSize += innerSize;
1418 totalSum += innerSum;
1419 totalQSum += innerQSum;
1422 double recip = 1.0/totalSize;
1423 errorNorm = sqrt(recip*totalSum);
1424 qErrorNorm = sqrt(recip*totalQSum);
1426 #ifdef Xyce_DEBUG_TIME
1427 Xyce::dout() <<
"DSdae:upperSize = " << upperSize << std::endl;
1428 Xyce::dout() <<
"DSdae:totalSum = " << totalSum << std::endl;
1429 Xyce::dout() <<
"DSdae:totalQSum = " << totalQSum << std::endl;
1430 Xyce::dout() <<
"DSdae:totalSize = " << totalSize << std::endl;
1431 Xyce::dout() <<
"DSdae:2-level errorNorm = " << errorNorm << std::endl;
1432 Xyce::dout() <<
"DSdae:2-level qErrorNorm = " << qErrorNorm << std::endl;
1437 #ifndef Xyce_USE_Q_NORM
1440 errorNorm = sqrt(0.5*errorNorm*errorNorm+0.5*qErrorNorm*qErrorNorm);
1465 double qErrorNorm = 0.0;
1467 double sum = qErrorNorm*qErrorNorm;
1564 if (currentOrder<maxOrder)
1618 double errorNorm = 0.0;
1629 double totalSize = upperSize;
1630 double totalSum = errorNorm*errorNorm*upperSize;
1632 for (
int i=0;i<sumSize;++i)
1637 totalSize += innerSize;
1638 totalSum += innerSum;
1641 double recip = 1.0/totalSize;
1642 errorNorm = sqrt(recip*totalSum);
1659 double errorNorm = 0.0;
1670 double totalSize = upperSize;
1671 double totalSum = errorNorm*errorNorm*upperSize;
1673 for (
int i=0;i<sumSize;++i)
1678 totalSize += innerSize;
1679 totalSum += innerSum;
1682 double recip = 1.0/totalSize;
1683 errorNorm = sqrt(recip*totalSum);
1700 double errorNorm = 0.0;
1711 double totalSize = upperSize;
1712 double totalSum = errorNorm*errorNorm*upperSize;
1714 for (
int i=0;i<sumSize;++i)
1719 totalSize += innerSize;
1720 totalSum += innerSum;
1723 double recip = 1.0/totalSize;
1724 errorNorm = sqrt(recip*totalSum);
1741 double errorNorm = 0.0;
1753 double totalSize = upperSize;
1754 double totalSum = errorNorm*errorNorm*upperSize;
1756 for (
int i=0;i<sumSize;++i)
1761 totalSize += innerSize;
1762 totalSum += innerSum;
1765 double recip = 1.0/totalSize;
1766 errorNorm = sqrt(recip*totalSum);
1800 #ifdef Xyce_DEBUG_TIME
1803 Xyce::dout() <<
"\n newtonCorrection: \n" << std::endl;
1805 Xyce::dout() << std::endl;
1806 Xyce::dout() <<
"\n qNewtonCorrection: \n" << std::endl;
1808 Xyce::dout() <<
"\n sNewtonCorrection: \n" << std::endl;
1810 Xyce::dout() << std::endl;
1812 #endif // Xyce_DEBUG_TIME
1826 std::vector<double> & varData )
1840 varData[i++] =
errWtVecPtr->getElementByGlobalIndex( gid );
1841 varData[i++] =
absErrTolPtr->getElementByGlobalIndex( gid );
1842 varData[i++] =
relErrTolPtr->getElementByGlobalIndex( gid );
1844 varData[i++] =
qErrWtVecPtr->getElementByGlobalIndex ( gid );
1845 varData[i++] =
daeQVectorPtr->getElementByGlobalIndex ( gid );
1846 varData[i++] =
daeFVectorPtr->getElementByGlobalIndex ( gid );
1847 varData[i++] =
xn0Ptr->getElementByGlobalIndex ( gid );
1848 varData[i++] =
qn0Ptr->getElementByGlobalIndex ( gid );
1849 varData[i++] =
qpn0Ptr->getElementByGlobalIndex ( gid );
1864 std::vector<double> & varData )
1867 varData.resize( 14 );
1871 varData[i++] =
currStatePtr->getElementByGlobalIndex( gid );
1872 varData[i++] =
lastStatePtr->getElementByGlobalIndex( gid );
1873 varData[i++] =
nextStatePtr->getElementByGlobalIndex( gid );
1880 varData[i++] =
sn0Ptr->getElementByGlobalIndex( gid );
1881 varData[i++] =
spn0Ptr->getElementByGlobalIndex( gid );
1895 std::vector<double> & varData )
1898 varData.resize( 6 );
1900 varData[i++] =
currStorePtr->getElementByGlobalIndex( gid );
1901 varData[i++] =
lastStorePtr->getElementByGlobalIndex( gid );
1902 varData[i++] =
nextStorePtr->getElementByGlobalIndex( gid );
1903 varData[i++] =
ston0Ptr->getElementByGlobalIndex( gid );
1904 varData[i++] =
stopn0Ptr->getElementByGlobalIndex( gid );
1917 const std::vector<double> & varData )
1930 errWtVecPtr->setElementByGlobalIndex ( gid, varData[i++] );
1931 absErrTolPtr->setElementByGlobalIndex ( gid, varData[i++] );
1932 relErrTolPtr->setElementByGlobalIndex ( gid, varData[i++] );
1934 qErrWtVecPtr->setElementByGlobalIndex ( gid, varData[i++] );
1935 daeQVectorPtr->setElementByGlobalIndex ( gid, varData[i++] );
1936 daeFVectorPtr->setElementByGlobalIndex ( gid, varData[i++] );
1937 xn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1938 qn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1939 qpn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1954 const std::vector<double> & varData )
1960 currStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
1961 lastStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
1962 nextStatePtr->setElementByGlobalIndex ( gid, varData[i++] );
1970 sn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1971 spn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1984 const std::vector<double> & varData )
1988 currStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
1989 lastStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
1990 nextStorePtr->setElementByGlobalIndex ( gid, varData[i++] );
1991 ston0Ptr->setElementByGlobalIndex ( gid, varData[i++] );
1992 stopn0Ptr->setElementByGlobalIndex ( gid, varData[i++] );