38 #include <Xyce_config.h>
40 #include <N_UTL_APFT.h>
47 #include <N_MPDE_Manager.h>
48 #include <N_MPDE_Discretization.h>
54 #include <N_LOA_HBLoader.h>
55 #include <N_LOA_NonlinearEquationLoader.h>
56 #include <N_LAS_HBBuilder.h>
57 #include <N_LAS_HBPrecondFactory.h>
58 #include <N_LAS_PrecondFactory.h>
59 #include <N_LAS_System.h>
60 #include <N_LAS_BlockSystemHelpers.h>
65 #include <N_IO_ActiveOutput.h>
67 #include <N_UTL_FFTInterface.hpp>
68 #include <N_UTL_Timer.h>
70 #include <Teuchos_BLAS.hpp>
71 #include <Teuchos_Utils.hpp>
72 #include <Teuchos_ScalarTraits.hpp>
73 #include <Teuchos_SerialDenseMatrix.hpp>
74 #include <Teuchos_SerialDenseVector.hpp>
75 #include <Teuchos_SerialDenseHelpers.hpp>
76 #include <Teuchos_SerialDenseSolver.hpp>
80 using Teuchos::rcp_dynamic_cast;
95 Util::ListenerAutoSubscribe<
StepEvent>(&analysis_manager),
106 startUpPeriodsGiven_(false),
107 startUpPeriodsFinished_(false),
114 intmodMaxGiven_(false),
116 fastTimeDiscOrder_(1),
117 resetForStepCalledBefore_(false),
159 std::vector<std::string> srcVec;
368 bool bsuccess =
true;
370 bsuccess = bsuccess &
init();
377 bsuccess = bsuccess &
finish();
393 bool returnValue=
true;
395 Xyce::lout() <<
" ***** Running HB initial conditions....\n" << std::endl;
397 Xyce::dout() << std::endl
398 << section_divider << std::endl
399 <<
" HB::init()" << std::endl;
400 #endif // Xyce_DEBUG_HB
414 Xyce::dout() <<
"HB period =" <<
period_ << std::endl;
437 Xyce::dout() <<
"HB::init(): Generate Maps\n";
438 #endif // Xyce_DEBUG_HB
440 rcp(
pdsMgrPtr_->getParallelMap(
"SOLUTION_OVERLAP_GND" ),
false) );
460 std::vector<std::string> srcVec;
485 ftInterface_ = Teuchos::rcp(
new N_UTL_FFTInterface<std::vector<double> >(
size_ ) );
490 ftInterface_ = Teuchos::rcp(
new N_UTL_FFTInterface<std::vector<double> >(
size_ ) );
509 for (
int i=0 ; i<
size_ ; ++i)
514 Xyce::dout() <<
"HB::init(): Loading initial condition data from time: fastTimes_["
517 #endif // Xyce_DEBUG_HB
531 Xyce::dout() <<
"HB Initial Condition Solution!\n";
533 Xyce::dout() <<
"HB Initial Condition State Vector!\n";
535 Xyce::dout() <<
"HB Initial Condition Store Vector!\n";
538 #endif // Xyce_DEBUG_HB
559 for(
int i = 0; i <
size_; ++i )
600 RCP<N_LAS_HBPrecondFactory> tmpPrecFactory
601 = rcp_dynamic_cast<N_LAS_HBPrecondFactory>(
precFactory_ );
604 tmpPrecFactory->registerHBLoader( rcp(
hbLoaderPtr_,
false) );
623 Xyce::dout() << section_divider << std::endl;
624 #endif // Xyce_DEBUG_HB
639 bool returnValue =
true;
641 Xyce::lout() <<
" ***** Beginning full HB simulation....\n" << std::endl;
644 Xyce::dout() << std::endl
645 << section_divider << std::endl
646 <<
" HB::loopProcess" << std::endl;
647 #endif // Xyce_DEBUG_HB
662 Xyce::lout() <<
" ***** Harmonic Balance Computation Summary *****" << std::endl;
666 dout() << section_divider << std::endl;
667 #endif // Xyce_DEBUG_HB
767 Util::ParameterList::const_iterator iterPL = OB.getParams().begin();
768 Util::ParameterList::const_iterator endPL = OB.getParams().end();
770 for( ; iterPL != endPL; ++iterPL )
772 ExtendedString tag = iterPL->tag();
775 if (std::string(tag,0,7) ==
"NUMFREQ" )
777 size_ = iterPL->getImmutableValue<
int>();
780 else if ( tag ==
"STARTUPPERIODS" )
787 else if( tag ==
"SAVEICDATA" )
791 else if( tag ==
"TEST" )
793 test_ =
static_cast<bool> (iterPL->getImmutableValue<
int>());
795 else if (tag ==
"DEBUGLEVEL" )
797 debugLevel = iterPL->getImmutableValue<
int>();
799 else if ( tag ==
"TAHB" )
801 taHB_ = iterPL->getImmutableValue<
int>();
803 else if ( tag ==
"VOLTLIM" )
805 voltLimFlag_ =
static_cast<bool> (iterPL->getImmutableValue<
int>());
807 else if ( tag ==
"INTMODMAX" )
809 intmodMax_ = iterPL->getImmutableValue<
int>();
814 else if ( tag ==
"METHOD" )
816 ExtendedString stringVal ( iterPL->stringValue() );
822 UserWarning(*
this) <<
"Unrecognized HBINT option " << tag;
828 Report::UserError() <<
"The size of numFreq does not match the number of tones in .hb!";
894 bool returnValue =
false;
916 N_LAS_Vector & solnVecPtr,
917 std::vector<double> & timePoints,
918 std::vector<double> & freqPoints,
919 RCP<N_LAS_BlockVector> & timeDomainSolnVec,
920 RCP<N_LAS_BlockVector> & freqDomainSolnVecReal,
921 RCP<N_LAS_BlockVector> & freqDomainSolnVecImag,
922 RCP<N_LAS_BlockVector> & timeDomainStoreVec,
923 RCP<N_LAS_BlockVector> & freqDomainStoreVecReal,
924 RCP<N_LAS_BlockVector> & freqDomainStoreVecImag
927 N_LAS_BlockVector & blockSolVecPtr =
dynamic_cast<N_LAS_BlockVector &
>(solnVecPtr);
929 Teuchos::RCP<N_LAS_BlockVector> bStoreVecFreqPtr_ =
hbLoaderPtr_->getStoreVecFreqPtr();
931 timeDomainStoreVec =
hbBuilderPtr_->createTimeDomainStoreBlockVector();
933 if (bStoreVecFreqPtr_->blockCount() > 0 )
935 hbLoaderPtr_->permutedIFT(*bStoreVecFreqPtr_, &*timeDomainStoreVec);
939 timeDomainSolnVec =
hbBuilderPtr_->createTimeDomainBlockVector();
940 int blockCount = timeDomainSolnVec->blockCount();
941 int N = timeDomainSolnVec->block(0).globalLength();
943 timePoints.resize(
size_);
945 for(
int i = 0; i <
size_; ++i )
953 Teuchos::RCP<N_PDS_ParMap> baseMap = Teuchos::rcp_const_cast<N_PDS_ParMap>(
hbBuilderPtr_->getBaseSolutionMap() );
954 Teuchos::RCP<N_PDS_ParMap> globalMap = createBlockParMap( blockCount, *baseMap );
955 freqDomainSolnVecReal = Teuchos::rcp(
new N_LAS_BlockVector( blockCount, globalMap, baseMap ) );
956 freqDomainSolnVecImag = Teuchos::rcp(
new N_LAS_BlockVector( blockCount, globalMap, baseMap ) );
958 hbLoaderPtr_->permutedIFT(blockSolVecPtr, &*timeDomainSolnVec);
961 for (
int j=0; j<N; j++)
966 int lid = baseMap->globalToLocalIndex( j );
967 N_LAS_Vector& solBlock = blockSolVecPtr.block( j );
969 N_LAS_Vector& realVecRef = freqDomainSolnVecReal->block((blockCount-1)/2);
970 N_LAS_Vector& imagVecRef = freqDomainSolnVecImag->block((blockCount-1)/2);
974 realVecRef[lid] = solBlock[0];
975 imagVecRef[lid] = solBlock[1];
978 for (
int i=1; i <= (blockCount-1)/2; ++i)
980 N_LAS_Vector& realVecRef_neg = freqDomainSolnVecReal->block((blockCount-1)/2 - i);
981 N_LAS_Vector& imagVecRef_neg = freqDomainSolnVecImag->block((blockCount-1)/2 - i);
982 N_LAS_Vector& realVecRef_pos = freqDomainSolnVecReal->block((blockCount-1)/2 + i);
983 N_LAS_Vector& imagVecRef_pos = freqDomainSolnVecImag->block((blockCount-1)/2 + i);
987 realVecRef_neg[lid] = solBlock[ 2*(blockCount-i) ];
988 imagVecRef_neg[lid] = solBlock[ 2*(blockCount-i) + 1 ];
989 realVecRef_pos[lid] = solBlock[ 2*i ];
990 imagVecRef_pos[lid] = solBlock[ 2*i+1 ];
996 Teuchos::RCP<N_PDS_ParMap> baseStoreMap = Teuchos::rcp_const_cast<N_PDS_ParMap>(
hbBuilderPtr_->getBaseStoreMap() );
997 Teuchos::RCP<N_PDS_ParMap> globalStoreMap = createBlockParMap( blockCount, *baseStoreMap );
998 freqDomainStoreVecReal = Teuchos::rcp(
new N_LAS_BlockVector( blockCount, globalStoreMap, baseStoreMap ) );
999 freqDomainStoreVecImag = Teuchos::rcp(
new N_LAS_BlockVector( blockCount, globalStoreMap, baseStoreMap ) );
1001 N = timeDomainStoreVec->block(0).globalLength();
1003 for (
int j=0; j<N; j++)
1008 int lid = baseStoreMap->globalToLocalIndex( j );
1009 N_LAS_Vector& storeBlock = bStoreVecFreqPtr_->block( j );
1011 N_LAS_Vector& realVecRef = freqDomainStoreVecReal->block((blockCount-1)/2);
1012 N_LAS_Vector& imagVecRef = freqDomainStoreVecImag->block((blockCount-1)/2);
1016 realVecRef[lid] = storeBlock[0];
1017 imagVecRef[lid] = storeBlock[1];
1020 for (
int i=1; i <= (blockCount-1)/2; ++i)
1022 N_LAS_Vector& realVecRef_neg = freqDomainStoreVecReal->block((blockCount-1)/2 - i);
1023 N_LAS_Vector& imagVecRef_neg = freqDomainStoreVecImag->block((blockCount-1)/2 - i);
1024 N_LAS_Vector& realVecRef_pos = freqDomainStoreVecReal->block((blockCount-1)/2 + i);
1025 N_LAS_Vector& imagVecRef_pos = freqDomainStoreVecImag->block((blockCount-1)/2 + i);
1029 realVecRef_neg[lid] = storeBlock[ 2*(blockCount-i) ];
1030 imagVecRef_neg[lid] = storeBlock[ 2*(blockCount-i) + 1 ];
1031 realVecRef_pos[lid] = storeBlock[ 2*i ];
1032 imagVecRef_pos[lid] = storeBlock[ 2*i+1 ];
1037 #ifdef Xyce_DEBUG_HB
1039 freqDomainSolnVecReal->printPetraObject(std::cout);
1040 freqDomainSolnVecImag->printPetraObject(std::cout);
1042 Xyce::dout() <<
"HB Store Vector FD" << std::endl;
1044 freqDomainStoreVecReal->printPetraObject(std::cout);
1045 freqDomainStoreVecImag->printPetraObject(std::cout);
1046 #endif // Xyce_DEBUG_HB
1077 bool returnValue =
true;
1079 Xyce::lout() <<
" ***** Computing tolerance parameters for HB IC calculation....\n" << std::endl;
1088 tiaParams.
resume =
false;
1109 Report::UserError() <<
"Calculation of tolerance parameters failed for relErrorTol = " << tiaParams.
relErrorTol;
1118 Report::UserWarning() <<
"Tolerance parameters refined, re-running with relErrorTol = " << tiaParams.
relErrorTol/10;
1139 Report::UserError() <<
"Calculation of tolerance parameters failed for relErrorTol = " << tiaParams.
relErrorTol;
1142 returnValue = retV && returnValue;
1171 bool returnValue =
true;
1173 Xyce::lout() <<
" ***** Computing " <<
startUpPeriods_ <<
" start up periods for HB IC calculation...." << std::endl;
1184 #ifdef Xyce_DEBUG_HB
1185 Xyce::dout() <<
"HB::runStartupPeriods_(): Advancing time through "
1188 <<
" finalTime = " << tiaParams.
finalTime << std::endl;
1190 Xyce::dout() <<
"HB::runStartupPeriods_(): Double DCOP tiaParams:"
1193 <<
" lastDCOPStep = " << tiaParams.
lastDCOPStep << std::endl;
1195 Xyce::dout() <<
"HB::runStartupPeriods_(): Double DCOP tiaParamsSave:"
1198 <<
" lastDCOPStep = " << tiaParamsSave.
lastDCOPStep << std::endl;
1200 #endif // Xyce_DEBUG_HB
1204 x.add(Xyce::IO::PrintType::HB_STARTUP,
ANP_MODE_HB);
1273 maxValue = (
size_ - 1)/2;
1289 k.resize(numAnalysisFreqs);
1298 int numTotalFrequencies;
1300 int numExtraFreqs = 0;
1310 for (
int i=1; i < numAnalysisFreqs; i++)
1322 numTotalFrequencies *= numFreqs_[i];
1325 #ifdef Xyce_DEBUG_HB
1326 for (
int i=0; i< numAnalysisFreqs; i++)
1328 Xyce::dout() <<
"HB index i" << i << std::endl;
1329 Xyce::dout() <<
"HB numPosFreqs =" <<
numPosFreqs[i] << std::endl;
1330 Xyce::dout() <<
"HB k =" << k[i] << std::endl;
1332 Xyce::dout() <<
"HB numTotalFrequencies =" << numTotalFrequencies<< std::endl;
1334 Xyce::dout() <<
"HB numextrafreqs =" << numExtraFreqs << std::endl;
1338 int numIndex = numTotalFrequencies;
1340 Teuchos::SerialDenseMatrix<int,double> indexMatrix(numAnalysisFreqs, numTotalFrequencies);
1344 #ifdef Xyce_DEBUG_HB
1345 Xyce::dout() <<
"HB intmodMax =" <<
intmodMax_ << std::endl;
1350 int idxMod, idxValues;
1353 std::vector<int> goodIndex;
1354 for (
int i=0; i < numIndex; i++)
1359 for (
int j= (numAnalysisFreqs - 1); j >= 0; j-- )
1361 idxMod = nextIndex%k[j];
1362 idxValues = (nextIndex - idxMod)/k[j];
1364 indexMatrix (j, i) =
static_cast<double>(idxValues - (
numFreqs_[j] - 1)/2 );
1366 sumIndex += abs(idxValues - (
numFreqs_[j] - 1)/2 );
1371 goodIndex.push_back(i);
1375 int diaindexSize = goodIndex.size();
1377 Teuchos::SerialDenseMatrix<int,double> diaindexMatrix( numAnalysisFreqs, (diaindexSize + numExtraFreqs) );
1378 diaindexMatrix.putScalar(0.0);
1380 for (
int i=0; i < diaindexSize; i++)
1382 for (
int j= (numAnalysisFreqs - 1); j >= 0; j-- )
1383 diaindexMatrix (j, i) = indexMatrix (j, goodIndex[i]);
1386 #ifdef Xyce_DEBUG_HB
1387 for (
int i=0; i< diaindexSize; i++)
1389 std::cout <<
"good index i = " << i << goodIndex[i] << std::endl;
1393 std::cout <<
" checking diamond indexMatrix" << std::endl;
1394 diaindexMatrix.print(std::cout);
1396 std::cout <<
" checking indexMatrix" << std::endl;
1397 indexMatrix.print(std::cout);
1401 int extraIndexPos = diaindexSize;
1402 for (
int i=0; i < numAnalysisFreqs ; i++)
1409 diaindexMatrix (i, extraIndexPos + j ) =
static_cast<double>(
intmodMax_ + j + 1 );
1418 #ifdef Xyce_DEBUG_HB
1419 std::cout <<
" checking diamond indexMatrix after axis" << std::endl;
1420 diaindexMatrix.print(std::cout);
1425 std::vector<double> posfreqPoints_;
1427 int posindexSize = (diaindexSize - 1)/2;
1428 posfreqPoints_.resize(posindexSize + numExtraFreqs);
1430 Teuchos::SerialDenseMatrix<int,double> currindexMatrix( Teuchos::View, diaindexMatrix, numAnalysisFreqs, (posindexSize + numExtraFreqs), 0, posindexSize+1 );
1431 Teuchos::SerialDenseVector<int,double> currfreqPoints( Teuchos::View, &posfreqPoints_[0], (posindexSize + numExtraFreqs ) );
1433 Teuchos::SerialDenseVector<int,double> hbFreqs( Teuchos::View, &
transTiaParams_.
freqs[0], numAnalysisFreqs);
1435 currfreqPoints.multiply( Teuchos::TRANS, Teuchos::NO_TRANS, 1.0, currindexMatrix, hbFreqs, 0.0 );
1438 #ifdef Xyce_DEBUG_HB
1439 std::cout <<
"checking positive frequencies" << std::endl;
1440 currindexMatrix.print(std::cout);
1441 hbFreqs.print(std::cout);
1442 currfreqPoints.print(std::cout);
1445 for (
int i=0; i < posindexSize; i++)
1448 if (posfreqPoints_[i] < 0.0)
1449 posfreqPoints_[i] = fabs( posfreqPoints_[i]);
1455 std::sort(posfreqPoints_.begin(), posfreqPoints_.end() );
1458 #ifdef Xyce_DEBUG_HB
1459 for (
int i=0; i< posfreqPoints_.size(); i++)
1461 std::cout <<
"pos frequency point " << posfreqPoints_[i] << std::endl;
1464 posfreqPoints_.erase(std::unique(posfreqPoints_.begin(), posfreqPoints_.end() ), posfreqPoints_.end() );
1467 if (abs( posfreqPoints_[0]) < 2.0*Util::MachineDependentParams::MachinePrecision() )
1468 posfreqPoints_.erase( posfreqPoints_.begin());
1470 size_ = ( posfreqPoints_.size() ) *2 + 1;
1471 #ifdef Xyce_DEBUG_HB
1472 for (
int i=0; i<posfreqPoints_.size(); i++)
1474 std::cout <<
"pos frequency point after " << posfreqPoints_[i] << std::endl;
1477 Xyce::dout() <<
"HB size =" <<
size_ << std::endl;
1483 for( i = 0; i <
size_; ++i )
1485 if (i < (size_-1)/2)
1486 freqPoints_[i] = - posfreqPoints_[ (size_-1)/2 - i - 1 ];
1487 else if (i > (size_-1)/2)
1488 freqPoints_[i] = posfreqPoints_[ i - (size_-1)/2 - 1 ];
1493 #ifdef Xyce_DEBUG_HB
1496 std::cout <<
" frequency point " <<
freqPoints_[i] << std::endl;
1516 int posFreq = (
size_-1)/2;
1517 int oversampleRate = 2;
1518 int periodSampleMultiplier = 1;
1521 Teuchos::BLAS<int,double> blas;
1522 std::vector<double> testPoints(oversampleRate*
size_);
1525 for (
int i=0; i<oversampleRate*
size_; ++i)
1527 testPoints[i] = periodSampleMultiplier*
period_*((Teuchos::ScalarTraits<double>::random()+1)/2);
1532 Teuchos::SerialDenseMatrix<int,double> testMatrix(size_,oversampleRate*size_);
1535 for (
int j=0; j<oversampleRate*
size_; ++j)
1537 testMatrix(0,j) = 1.0;
1540 for (
int i=1; i<=posFreq; i++)
1543 for (
int j=0; j<oversampleRate*
size_; j++)
1545 testMatrix(2*i-1,j) = cos(2*
M_PI*
freqPoints_[posFreq+i]*testPoints[j]);
1554 std::vector<double> weightVector(oversampleRate*size_);
1555 for (
int i=0; i<
size_; ++i)
1559 double maxValue = 0.0;
1560 for (
int j=i; j<oversampleRate*
size_; ++j)
1562 Teuchos::SerialDenseMatrix<int,double> tempVector( Teuchos::View, testMatrix, size_, 1, 0, j );
1563 weightVector[j] = tempVector.normFrobenius();
1565 if (weightVector[j] > maxValue)
1568 maxValue = weightVector[j];
1574 std::swap( testPoints[i], testPoints[maxIndex] );
1575 Teuchos::SerialDenseVector<int,double> newSwapVector2 = Teuchos::getCol<int,double>( Teuchos::Copy, testMatrix, maxIndex );
1576 Teuchos::SerialDenseVector<int,double> newSwapVector = Teuchos::getCol<int,double>( Teuchos::View, testMatrix, i );
1577 Teuchos::setCol<int,double>( newSwapVector, maxIndex, testMatrix );
1578 Teuchos::setCol<int,double>( newSwapVector2, i, testMatrix );
1584 Teuchos::SerialDenseMatrix<int,double> currTestMatrix( Teuchos::View, testMatrix, size_, oversampleRate*size_-(i+1), 0, i+1 );
1585 Teuchos::SerialDenseVector<int,double> currWeightVector( Teuchos::View, &weightVector[i+1], oversampleRate*size_-(i+1) );
1587 currWeightVector.multiply( Teuchos::TRANS, Teuchos::NO_TRANS, 1.0, currTestMatrix, newSwapVector, 0.0 );
1594 for (
int j=i+1; j<oversampleRate*
size_; ++j)
1596 Teuchos::SerialDenseMatrix<int,double> currVector( Teuchos::View, testMatrix, size_, 1, 0, j );
1597 blas.AXPY( size_, -(currWeightVector[j-(i+1)]/(maxValue*maxValue) ), newSwapVector.values(), 1, currVector.values(), 1 );
1608 std::sort( testPoints.begin(), testPoints.begin()+
size_ );
1612 for (
int i=0; i<
size_; ++i)
1630 int posFreq = (
size_-1)/2;
1635 for (
int i=0; i<
size_; ++i)
1640 for (
int i=0; i<
size_; i++)
1642 for (
int j=1; j<=posFreq; j++)
1649 std::cout <<
"Checking IDFTmatrix" << std::endl;
1654 Teuchos::SerialDenseSolver<int,double> ftSolver;
1655 ftSolver.setMatrix( Teuchos::rcp( &
dftMatrix_,
false ) );
1658 std::cout <<
"Checking DFTmatrix" << std::endl;
1661 std::cout <<
"Checking IDFTmatrix after inverse:" << std::endl;
1679 bool returnValue =
true;
1683 bool retTol1 =
runTol_(); returnValue = returnValue && retTol1;
1690 if (!startupPeriodsSuccess)
1692 Report::UserError() <<
"Failed to calculate the startup periods";
1695 returnValue = returnValue && startupPeriodsSuccess;
1700 Report::UserError() <<
"Initial HB Transient failed";
1703 returnValue = returnValue && icSuccess;
1717 for(
int i = 0; i <=
size_; ++i )
1738 bool returnValue =
true;
1740 Xyce::lout() <<
" ***** Running transient to compute HB initial condition....\n" << std::endl;
1763 #ifdef Xyce_DEBUG_HB
1764 Xyce::dout() <<
"HB::runTransientIC_(): Advancing time from"
1766 <<
" finalTime = " << tiaParams.
finalTime << std::endl;
1767 #endif // Xyce_DEBUG_HB
1772 tiaParams.
NOOP =
true;
1819 Xyce::lout() <<
" ***** Interpolating transient solution for IC calculation....\n" << std::endl;
1822 int numPoints = dsPtr->
timeSteps.size();
1824 #ifdef Xyce_DEBUG_HB
1825 Xyce::dout() <<
"HB::interpolateIC_(): Initial transient run produced " << numPoints <<
" points." << std::endl;
1828 std::vector<int> goodIndicies;
1833 for(
int i = 0; i <
size_; ++i )
1841 int breakpoints = 0;
1845 goodIndicies.push_back(startIndex);
1846 int GoodTimePointIndex = startIndex + 1;
1848 for(
int i=startIndex; i < numPoints - 1 ; i++ )
1856 #ifdef Xyce_DEBUG_HB
1859 Xyce::dout() <<
"\t\t timeStep[ " << i <<
" ] = " << dsPtr->
timeSteps[i];
1862 Xyce::dout() <<
" Breakpoint";
1864 Xyce::dout() << std::endl;
1870 goodIndicies.push_back( i );
1871 GoodTimePointIndex = GoodTimePointIndex+1;
1875 for(
int i=0; i<
size_; i++ )
1877 int currentIndex = goodIndicies[i];
1882 N_LAS_Vector * secondStateVecPtr = dsPtr->
fastTimeStateVec[currentIndex+1];
1884 N_LAS_Vector * firstQVecPtr = dsPtr->
fastTimeQVec[currentIndex];
1885 N_LAS_Vector * secondQVecPtr = dsPtr->
fastTimeQVec[currentIndex+1];
1888 N_LAS_Vector * secondStoreVecPtr = dsPtr->
fastTimeStoreVec[currentIndex+1];
1892 RCP<N_LAS_Vector> InterpICSolVecPtr = rcp(
new N_LAS_Vector( *secondSolVecPtr ) );
1893 RCP<N_LAS_Vector> InterpICStateVecPtr = rcp(
new N_LAS_Vector( *secondStateVecPtr ) );
1894 RCP<N_LAS_Vector> InterpICQVecPtr = rcp(
new N_LAS_Vector( *secondQVecPtr ) );
1895 RCP<N_LAS_Vector> InterpICStoreVecPtr = rcp(
new N_LAS_Vector( *secondStoreVecPtr ) );
1897 InterpICSolVecPtr->putScalar(0.0);
1898 InterpICStateVecPtr->putScalar(0.0);
1899 InterpICQVecPtr->putScalar(0.0);
1900 InterpICStoreVecPtr->putScalar(0.0);
1902 InterpICSolVecPtr->linearCombo(-1.0, *firstSolVecPtr, 1.0, *secondSolVecPtr );
1903 InterpICSolVecPtr->linearCombo(1.0, *firstSolVecPtr, fraction , *InterpICSolVecPtr);
1905 InterpICStateVecPtr->linearCombo(-1.0, *firstStateVecPtr, 1.0, *secondStateVecPtr );
1906 InterpICStateVecPtr->linearCombo(1.0, *firstStateVecPtr, fraction , *InterpICStateVecPtr);
1908 InterpICQVecPtr->linearCombo(-1.0, *firstQVecPtr, 1.0, *secondQVecPtr );
1909 InterpICQVecPtr->linearCombo(1.0, *firstQVecPtr, fraction , *InterpICQVecPtr);
1911 InterpICStoreVecPtr->linearCombo(-1.0, *firstStoreVecPtr, 1.0, *secondStoreVecPtr );
1912 InterpICStoreVecPtr->linearCombo(1.0, *firstStoreVecPtr, fraction , *InterpICStoreVecPtr);