39 #include <Xyce_config.h>
48 #include <N_MPDE_Discretization.h>
49 #include <N_ERH_ErrorMgr.h>
51 #include <N_LAS_Builder.h>
52 #include <N_LAS_HBBuilder.h>
53 #include <N_LAS_Matrix.h>
54 #include <N_LAS_BlockVector.h>
55 #include <N_LAS_BlockMatrix.h>
56 #include <N_LAS_BlockSystemHelpers.h>
57 #include <N_LAS_SystemHelpers.h>
58 #include <N_LAS_MultiVector.h>
60 #include <N_UTL_fwd.h>
61 #include <N_UTL_FeatureTest.h>
62 #include <N_UTL_Math.h>
64 #include <N_PDS_ParMap.h>
67 #include <Epetra_BlockMap.h>
68 #include <Epetra_CrsGraph.h>
69 #include <Epetra_CrsMatrix.h>
73 using Teuchos::rcp_dynamic_cast;
79 const Teuchos::RCP<const N_MPDE_Discretization> discPtr,
81 Linear::Builder & builder)
85 fastTimeDiscPtr_(discPtr),
86 periodicTimesOffset_(0),
88 matrixFreeFlag_(false)
177 Linear::Vector * dSdt,
178 Linear::Vector * Store,
179 Linear::Matrix * dQdx,
180 Linear::Matrix * dFdx)
186 Xyce::dout() << std::endl
187 << Xyce::section_divider << std::endl
188 <<
" HBLoader::loadDAEMatrices: matrixFree case" << std::endl;
198 Report::DevelFatal0().in(
"HBLoader::loadDAEMatrices") <<
"This function actually was called in a non matrix free case";
202 Xyce::dout() << std::endl
203 << Xyce::section_divider << std::endl
204 <<
" HBLoader::loadDAEMatrices: Time dependent with matrix case" << std::endl;
222 Linear::Vector * dSdt,
223 Linear::Vector * Store,
224 Linear::Matrix * dQdx,
225 Linear::Matrix * dFdx)
229 Xyce::dout() << std::endl
230 << Xyce::section_divider << std::endl
231 <<
" HBLoader::loadTimeDepDAEMatrices" << std::endl;
240 Linear::BlockMatrix & bdQdx = *
dynamic_cast<Linear::BlockMatrix*
>(dQdx);
241 Linear::BlockMatrix & bdFdx = *
dynamic_cast<Linear::BlockMatrix*
>(dFdx);
242 Linear::BlockVector & bX = *
dynamic_cast<Linear::BlockVector*
>(X);
243 #ifdef Xyce_FLEXIBLE_DAE_LOADS
244 Linear::BlockVector & bS = *
dynamic_cast<Linear::BlockVector*
>(S);
245 Linear::BlockVector & bdSdt = *
dynamic_cast<Linear::BlockVector*
>(dSdt);
246 Linear::BlockVector & bStore = *
dynamic_cast<Linear::BlockVector*
>(Store);
247 #endif // Xyce_FLEXIBLE_DAE_LOADS
249 int BlockCount = bX.blockCount();
251 for(
int i = 0; i < BlockCount; ++i )
255 Xyce::dout() <<
"Processing diagonal matrix block " << i <<
" of " << BlockCount-1 << std::endl;
258 #ifdef Xyce_FLEXIBLE_DAE_LOADS
268 appdSdt = bdSdt.block(i);
278 bdQdx.block(i,i).add(
bmdQdxPtr_->block(i,i) );
279 bdFdx.block(i,i).add(
bmdFdxPtr_->block(i,i) );
281 #endif // Xyce_FLEXIBLE_DAE_LOADS
294 for(
int i = 0; i < BlockCount; ++i )
298 Xyce::dout() <<
"Processing off diagonal matrix blocks on row " << i <<
" of " << BlockCount-1 << std::endl;
303 int indexT2 = indexT1 + Width - 1;
306 for(
int j = 0; j < Width; ++j )
314 else if( Loc > (BlockCount-1) )
320 dQdxdt.add( bdQdx.block(Loc,Loc) );
321 dQdxdt.scale( Coeffs[j]*invh2 );
322 bdFdx.block(i,Loc).add( dQdxdt );
326 dQdx->fillComplete();
327 dFdx->fillComplete();
331 Xyce::dout() <<
"HB bX:" << std::endl;
332 bX.printPetraObject(dout());
333 Xyce::dout() <<
"HB bdQdx:" << std::endl;
334 bdQdx.printPetraObject(dout());
335 Xyce::dout() <<
"HB bdFdx:" << std::endl;
336 bdFdx.printPetraObject(dout());
337 #ifdef Xyce_FLEXIBLE_DAE_LOADS
338 Xyce::dout() <<
"HB bS:" << std::endl;
339 bS.printPetraObject(dout());
340 Xyce::dout() <<
"HB dSdt:" << std::endl;
341 bdSdt.printPetraObject(dout());
342 Xyce::dout() <<
"HB bStore:" << std::endl;
343 bStore.printPetraObject(dout());
344 #endif // Xyce_FLEXIBLE_DAE_LOADS
346 Xyce::dout() << Xyce::section_divider << std::endl;
362 Linear::Vector * dSdt,
363 Linear::Vector * Store,
364 const Linear::Vector & Vf,
365 Linear::Vector * dQdxV,
366 Linear::Vector * dFdxV )
370 Report::DevelFatal0().in(
"HBLoader::applyDAEMatrices") <<
"This function should only be called in the matrix free case";
374 Xyce::dout() << std::endl
375 << Xyce::section_divider << std::endl
376 <<
" HBLoader::applyDAEMatrices" << std::endl;
379 Linear::BlockVector & bXf = *
dynamic_cast<Linear::BlockVector*
>(Xf);
384 const Linear::BlockVector bVf(Vf, bXf.blockSize());
389 Linear::BlockVector * bdQdxV =
dynamic_cast<Linear::BlockVector*
>(dQdxV);
390 Linear::BlockVector * bdFdxV =
dynamic_cast<Linear::BlockVector*
>(dFdxV);
392 Teuchos::RCP<Linear::BlockVector> bdQdxVt =
hbBuilderPtr_->createTimeDomainBlockVector();
393 Teuchos::RCP<Linear::BlockVector> bdFdxVt =
hbBuilderPtr_->createTimeDomainBlockVector();
395 int BlockCount =
bVtPtr_->blockCount();
397 for(
int i = 0; i < BlockCount; ++i )
401 Xyce::dout() <<
"Processing diagonal matrix block " << i <<
" of " << BlockCount-1 << std::endl;
406 Xyce::dout() <<
"bVtPtr block i = " << i <<
" : " << std::endl;
407 bVtPtr_->block(i).printPetraObject(dout());
409 std::cout <<
" old way app matrices " << std::endl;
411 Xyce::dout() <<
"appdQdxPtr_ = " << i <<
" : " << std::endl;
414 Xyce::dout() <<
"appdFdxPtr_ = " << i <<
" : " << std::endl;
420 Xyce::dout() <<
"bdQdxVt block (old style) i = " << i <<
" : " << std::endl;
421 bdQdxVt->block(i).printPetraObject(dout());
423 Xyce::dout() <<
"bdFdxVt block (old style) i = " << i <<
" : " << std::endl;
424 bdFdxVt->block(i).printPetraObject(dout());
440 int blockCount = bXf.blockCount();
441 int blockSize = bXf.block(0).globalLength();
444 int size_ =
freqs_.size();
445 int posFreq = (size_-1)/2;
453 Teuchos::RCP<Linear::BlockVector> permlindQdxV =
hbBuilderPtr_->createExpandedRealFormTransposeBlockVector();
454 Teuchos::RCP<Linear::BlockVector> permlindFdxV =
hbBuilderPtr_->createExpandedRealFormTransposeBlockVector();
461 bdQdxV->update (1.0, *permlindQdxV, 1.0);
462 bdFdxV->update (1.0, *permlindFdxV, 1.0);
465 Teuchos::RCP<Linear::BlockVector> bQVec =
hbBuilderPtr_->createExpandedRealFormTransposeBlockVector();
467 for(
int i = 0; i < blockCount; ++i )
471 Linear::Vector& QVec = bQVec->block(i);
472 Linear::Vector& freqVec = bdQdxV->block(i);
475 if (freqVec.localLength() > 0)
477 omega = 2.0 *
M_PI * freqs_[posFreq];
479 QVec[0] = -freqVec[1]*omega;
480 QVec[1] = freqVec[0]*omega;
482 for (
int j=1; j < (blockSize/2+1)/2; ++j)
484 omega = 2.0 *
M_PI * freqs_[posFreq+j];
485 QVec[2*j] = -freqVec[2*j+1]*omega;
486 QVec[2*(blockSize/2-j)] = -freqVec[2*j+1]*omega;
488 QVec[2*j+1] = freqVec[2*j]*omega;
489 QVec[2*(blockSize/2-j)+1] = -freqVec[2*j]*omega;
493 bdFdxV->block(i).update(1.0, QVec , 1.0);
498 Xyce::dout() <<
"HB bdQdxV:" << std::endl;
499 bdQdxV->printPetraObject(dout());
500 Xyce::dout() <<
"HB bdFdxV:" << std::endl;
501 bdFdxV->printPetraObject(dout());
503 Xyce::dout() << Xyce::section_divider << std::endl;
527 (Linear::Vector * nextSolVectorPtr,
528 Linear::Vector * currSolVectorPtr,
529 Linear::Vector * lastSolVectorPtr,
530 Linear::Vector * nextStaVectorPtr,
531 Linear::Vector * currStaVectorPtr,
532 Linear::Vector * lastStaVectorPtr,
533 Linear::Vector * nextStoVectorPtr,
534 Linear::Vector * currStoVectorPtr,
535 Linear::Vector * lastStoVectorPtr
538 bool bsuccess =
true;
554 Linear::BlockVector & permlindQdxV,
555 Linear::BlockVector & permlindFdxV )
558 Linear::MultiVector lindQdxV( *(
bVtPtr_->blockPmap()), bVf.blockSize()/2 );
559 Linear::MultiVector lindFdxV( *(
bVtPtr_->blockPmap()), bVf.blockSize()/2 );
561 int first = bVf.startBlock();
562 int last = bVf.endBlock();
563 Linear::MultiVector permVf( *(
bVtPtr_->blockPmap()), bVf.blockSize()/2 );
566 for (
int i=first, lid=0; i<last; i++, lid++)
568 Linear::Vector & currBlock = bVf.block(i);
571 permVf[0][lid] = currBlock[0];
572 for (
int j=1; j<currBlock.localLength()/2; j++)
574 permVf[j][lid] = currBlock[j+1];
581 int numharms =
bVtPtr_->blockCount();
584 for (
int i=first, lid=0; i<last; i++, lid++)
586 Linear::Vector & currBlock = permlindQdxV.block(i);
587 Linear::Vector & currBlockF = permlindFdxV.block(i);
589 currBlock[0] = lindQdxV[0][lid];
592 currBlockF[0] = lindFdxV[0][lid];
595 for (
int j=1; j< (numharms + 1)/2; j++)
597 currBlock[2*j] = lindQdxV[2*j-1][lid];
598 currBlock[2*(numharms-j)] = lindQdxV[2*j-1][lid];
600 currBlockF[2*j] = lindFdxV[2*j-1][lid];
601 currBlockF[2*(numharms-j)] = lindFdxV[2*j-1][lid];
603 currBlock[2*j+1] = lindQdxV[2*j][lid];
604 currBlock[2*( numharms - j) + 1] = -lindQdxV[2*j][lid];
606 currBlockF[2*j+1] = lindFdxV[2*j][lid];
607 currBlockF[2*( numharms - j) + 1] = -lindFdxV[2*j][lid];
624 Linear::Vector * currX,
625 Linear::Vector * lastX,
627 Linear::Vector * currS,
628 Linear::Vector * lastS,
629 Linear::Vector * dSdt,
630 Linear::Vector * Store,
631 Linear::Vector * currStore,
632 Linear::Vector * lastStore,
633 Linear::Vector * storeLeadCurrQ,
634 Linear::Vector * nextLeadFVectorPtr,
635 Linear::Vector * currLeadFVectorPtr,
636 Linear::Vector * lastLeadFVectorPtr,
637 Linear::Vector * nextLeadQVectorPtr,
638 Linear::Vector * nextJunctionVVectorPtr,
639 Linear::Vector * currJunctionVVectorPtr,
640 Linear::Vector * lastJunctionVVectorPtr,
644 Linear::Vector * dFdxdVp,
645 Linear::Vector * dQdxdVp )
649 Xyce::dout() << std::endl
650 << Xyce::section_divider << std::endl
651 <<
" HBLoader::loadDAEVectors" << std::endl;
678 Linear::BlockVector & bXf = *
dynamic_cast<Linear::BlockVector*
>(Xf);
683 Linear::BlockVector & bX = *
bXtPtr_;
684 Linear::BlockVector & bS = *
dynamic_cast<Linear::BlockVector*
>(S);
685 Linear::BlockVector & bcurrS = *
dynamic_cast<Linear::BlockVector*
>(currS);
686 Linear::BlockVector & blastS = *
dynamic_cast<Linear::BlockVector*
>(lastS);
687 Linear::BlockVector & bdSdt = *
dynamic_cast<Linear::BlockVector*
>(dSdt);
688 Linear::BlockVector & bStore = *
dynamic_cast<Linear::BlockVector*
>(Store);
689 Linear::BlockVector & bcurrStore = *
dynamic_cast<Linear::BlockVector*
>(currStore);
690 Linear::BlockVector & blastStore = *
dynamic_cast<Linear::BlockVector*
>(lastStore);
692 Linear::BlockVector & bNextLeadF = *
dynamic_cast<Linear::BlockVector*
>(nextLeadFVectorPtr);
693 Linear::BlockVector & bCurrLeadF = *
dynamic_cast<Linear::BlockVector*
>(currLeadFVectorPtr);
694 Linear::BlockVector & bLastLeadF = *
dynamic_cast<Linear::BlockVector*
>(lastLeadFVectorPtr);
695 Linear::BlockVector & bLeadQ = *
dynamic_cast<Linear::BlockVector*
>(nextLeadQVectorPtr);
696 Linear::BlockVector & bNextJunctionV = *
dynamic_cast<Linear::BlockVector*
>(nextJunctionVVectorPtr);
697 Linear::BlockVector & bCurrJunctionV = *
dynamic_cast<Linear::BlockVector*
>(currJunctionVVectorPtr);
698 Linear::BlockVector & bLastJunctionV = *
dynamic_cast<Linear::BlockVector*
>(lastJunctionVVectorPtr);
700 Linear::BlockVector * bQ =
dynamic_cast<Linear::BlockVector*
>(Q);
701 Linear::BlockVector * bF =
dynamic_cast<Linear::BlockVector*
>(F);
702 Linear::BlockVector * bB =
dynamic_cast<Linear::BlockVector*
>(B);
704 Linear::BlockVector * bdFdxdVp =
dynamic_cast<Linear::BlockVector*
>(dFdxdVp);
705 Linear::BlockVector * bdQdxdVp =
dynamic_cast<Linear::BlockVector*
>(dQdxdVp);
710 Linear::BlockVector & bstoreLeadCurrQ = *
dynamic_cast<Linear::BlockVector*
>(storeLeadCurrQ);
712 Linear::BlockVector bQt(*
bXtPtr_);
713 Linear::BlockVector bFt(*
bXtPtr_);
714 Linear::BlockVector bBt(*
bXtPtr_);
716 Linear::BlockVector bdQdxdVpt(*
bXtPtr_);
717 Linear::BlockVector bdFdxdVpt(*
bXtPtr_);
722 #ifndef Xyce_FLEXIBLE_DAE_LOADS
727 int BlockCount = bX.blockCount();
728 int BlockSize = bX.blockSize();
731 Xyce::dout() <<
"bX.blockCount = "<< BlockCount <<std::endl;
732 Xyce::dout() <<
"bX.blockSize = "<< BlockSize <<std::endl;
736 Teuchos::RCP<Epetra_CrsGraph> linearGraph, nonlinGraph;
737 builder_.getSeparatedGraph(linearGraph, nonlinGraph);
743 if (Teuchos::is_null(linearGraph) || Teuchos::is_null(nonlinGraph))
746 builder_.getSeparatedGraph(linearGraph, nonlinGraph);
749 if (nonlinGraph->GlobalMaxNumIndices())
753 for (
int i=0; i < BlockCount; ++i )
755 Epetra_CrsMatrix* newdQdx_i =
new Epetra_CrsMatrix( Copy, *nonlinGraph );
756 vecNLAppdQdxPtr_[i] = Teuchos::rcp(
new Linear::Matrix( newdQdx_i,
true ) );
757 Epetra_CrsMatrix* newdFdx_i =
new Epetra_CrsMatrix( Copy, *nonlinGraph );
758 vecNLAppdFdxPtr_[i] = Teuchos::rcp(
new Linear::Matrix( newdFdx_i,
true ) );
761 if (linearGraph->GlobalMaxNumIndices())
763 Epetra_CrsMatrix* newdQdx =
new Epetra_CrsMatrix( Copy, *linearGraph );
764 linAppdQdxPtr_ = Teuchos::rcp(
new Linear::Matrix( newdQdx,
true ) );
765 Epetra_CrsMatrix* newdFdx =
new Epetra_CrsMatrix( Copy, *linearGraph );
766 linAppdFdxPtr_ = Teuchos::rcp(
new Linear::Matrix( newdFdx,
true ) );
771 for(
int i = 0; i < BlockCount; ++i )
775 Xyce::dout() <<
"Processing vectors for block " << i <<
" of " << BlockCount-1 << std::endl;
784 Xyce::dout() <<
"Calling updateSources on the appLoader" << std::endl;
794 appdSdt = bdSdt.block(i);
811 Xyce::dout() <<
"Updating State for block " << i <<
" of " << BlockCount-1 << std::endl;
834 Xyce::dout() <<
"Calling loadDAEVectors on the appLoader" << std::endl;
841 appdFdxdVp.putScalar(0.0);
842 appdQdxdVp.putScalar(0.0);
853 &appdFdxdVp, &appdQdxdVp );
859 bdQdxdVpt.block(i) = appdQdxdVp;
860 bdFdxdVpt.block(i) = appdFdxdVp;
879 std::vector< RCP<Linear::Matrix> > outMatrices;
884 Linear::extractValues( *
appdQdxPtr_, outMatrices );
893 Linear::extractValues( *
appdFdxPtr_, outMatrices );
917 int blockCount = bXf.blockCount();
918 int blockSize = bXf.block(0).globalLength();
921 int size_ =
freqs_.size();
922 int posFreq = (size_-1)/2;
925 for(
int i = 0; i < blockCount; ++i )
930 Linear::Vector QVec(bQ->block(i));
931 Linear::Vector freqVec = bQ->block(i);
933 Linear::Vector dQdxdVpVec(bdQdxdVp->block(i));
934 Linear::Vector freqVec1 = bdQdxdVp->block(i);
937 if (freqVec.localLength() > 0)
939 omega = 2.0 *
M_PI * freqs_[posFreq];
941 QVec[0] = -freqVec[1]*omega;
942 QVec[1] = freqVec[0]*omega;
944 dQdxdVpVec[0] = -freqVec1[1]*omega;
945 dQdxdVpVec[1] = freqVec1[0]*omega;
947 for (
int j=1; j < (blockSize/2+1)/2; ++j)
950 omega = 2.0 *
M_PI * freqs_[posFreq + j];
952 QVec[2*j] = -freqVec[2*j+1]*omega;
953 QVec[2*(blockSize/2-j)] = -freqVec[2*j+1]*omega;
955 QVec[2*j+1] = freqVec[2*j]*omega;
956 QVec[2*(blockSize/2-j)+1] = -freqVec[2*j]*omega;
958 dQdxdVpVec[2*j] = -freqVec1[2*j+1]*omega;
959 dQdxdVpVec[2*(blockSize/2-j)] = -freqVec1[2*j+1]*omega;
961 dQdxdVpVec[2*j+1] = freqVec1[2*j]*omega;
962 dQdxdVpVec[2*(blockSize/2-j)+1] = -freqVec1[2*j]*omega;
967 bF->block(i).update(1.0, QVec , 1.0);
969 bdFdxdVp->block(i).update(1.0, dQdxdVpVec, 1.0);
975 for(
int i = 0; i < blockCount; ++i )
984 if (stoLeadCurrQVec.localLength() > 0)
987 omega = 2.0 *
M_PI * freqs_[posFreq];
988 stoLeadCurrdQdtVec[0] = stoLeadCurrQVec[1]*omega;
989 stoLeadCurrdQdtVec[1] = stoLeadCurrQVec[0]*omega;
991 for (
int j=1; j < (blockSize/2+1)/2; ++j)
993 omega = 2.0 *
M_PI * freqs_[posFreq+ j];
995 stoLeadCurrdQdtVec[2*j] = -stoLeadCurrQVec[2*j+1]*omega;
996 stoLeadCurrdQdtVec[2*(blockSize/2-j)] = -stoLeadCurrQVec[2*j+1]*omega;
998 stoLeadCurrdQdtVec[2*j+1] = stoLeadCurrQVec[2*j]*omega;
999 stoLeadCurrdQdtVec[2*(blockSize/2-j)+1] = -stoLeadCurrQVec[2*j]*omega;
1011 for(
int i = 0; i < blockCount; ++i )
1020 if (leadCurrQVec.localLength() > 0)
1023 omega = 2.0 *
M_PI * freqs_[posFreq];
1024 leadCurrdQdtVec[0] = leadCurrQVec[1]*omega;
1025 leadCurrdQdtVec[1] = leadCurrQVec[0]*omega;
1027 for (
int j=1; j < (blockSize/2+1)/2; ++j)
1029 omega = 2.0 *
M_PI * freqs_[posFreq+ j];
1031 leadCurrdQdtVec[2*j] = -leadCurrQVec[2*j+1]*omega;
1032 leadCurrdQdtVec[2*(blockSize/2-j)] = -leadCurrQVec[2*j+1]*omega;
1034 leadCurrdQdtVec[2*j+1] = leadCurrQVec[2*j]*omega;
1035 leadCurrdQdtVec[2*(blockSize/2-j)+1] = -leadCurrQVec[2*j]*omega;
1046 Xyce::dout() <<
"HB X Vector" << std::endl;
1047 bX.printPetraObject(std::cout);
1052 Xyce::dout() <<
"HB Store Vector" << std::endl;
1053 bStore.printPetraObject(std::cout);
1054 Xyce::dout() <<
"HB Q Vector" << std::endl;
1055 bQ->printPetraObject(std::cout);
1056 Xyce::dout() <<
"HB F Vector" << std::endl;
1057 bF->printPetraObject(std::cout);
1058 Xyce::dout() <<
"HB bdFdxdVp Vector" << std::endl;
1059 bdFdxdVp->printPetraObject(std::cout);
1060 Xyce::dout() <<
"HB bdQdxdVp Vector" << std::endl;
1061 bdQdxdVp->printPetraObject(std::cout);
1063 #ifndef Xyce_FLEXIBLE_DAE_LOADS
1064 Xyce::dout() <<
"HB bmdQdx_" << std::endl;
1066 Xyce::dout() <<
"HB bmdFdx_" << std::endl;
1068 #endif // Xyce_FLEXIBLE_DAE_LOADS
1069 Xyce::dout() << Xyce::section_divider << std::endl;
1085 Linear::Vector * deviceMask)
const
1088 Linear::BlockVector & bDevMask = *
dynamic_cast<Linear::BlockVector*
>(deviceMask);
1091 Xyce::dout() <<
"HBLoader::loadDeviceErrorWeightMask. Original (nonblock) deviceMask.size = "
1098 int blockCount = bDevMask.blockCount();
1099 int blockSize = bDevMask.blockSize();
1102 Xyce::dout() <<
"bDevMask.blockCount = "<< blockCount <<std::endl;
1103 Xyce::dout() <<
"bDevMask.blockSize = "<< blockSize <<std::endl;
1109 for(
int i = 0; i < blockCount; ++i )
1115 Linear::Vector& localVecRef = bDevMask.block(i);
1117 for (
int j=0;j<blockSize;++j)
1119 localVecRef[j] = (*appVecPtr_)[i];
1124 bDevMask.printPetraObject(Xyce::dout());
1184 return appLoaderPtr_->setVoltageLimiterStatus(voltageLimterStatus);
HBLoader(const Teuchos::RCP< const N_MPDE_Discretization > discPtr, Device::DeviceMgr &device_manager, Linear::Builder &builder)
Teuchos::RCP< Linear::Vector > appLastStaVecPtr_
virtual void setVoltageLimiterStatus(bool voltageLimterStatus)
Teuchos::RCP< Linear::Vector > appCurrStoVecPtr_
Teuchos::RCP< Linear::BlockMatrix > bmdFdxPtr_
Linear::Builder & builder_
std::vector< double > periodicTimes_
bool loadErrorWeightMask(Linear::Vector *deviceMaskPtr)
Pure virtual class to augment a linear system.
void setFastTimes(const std::vector< double > ×)
bool updateState(Linear::Vector *nextSolVectorPtr, Linear::Vector *currSolVectorPtr, Linear::Vector *lastSolVectorPtr, Linear::Vector *nextStaVectorPtr, Linear::Vector *currStaVectorPtr, Linear::Vector *lastStaVectorPtr, Linear::Vector *nextStoVectorPtr, Linear::Vector *currStoVectorPtr, Linear::Vector *lastStoVectorPtr)
void setFastTime(double timeVal)
Device::DeviceMgr & deviceManager_
void permutedIFT(const Linear::BlockVector &xf, Linear::BlockVector *xt, int numTimePts_=0)
bool loadDAEMatrices(Linear::Vector *X, Linear::Vector *S, Linear::Vector *dSdt, Linear::Vector *Store, Linear::Matrix *dQdx, Linear::Matrix *dFdx)
Teuchos::RCP< Loader > appLoaderPtr_
Actually a CktLoader.
Teuchos::RCP< const N_MPDE_Discretization > fastTimeDiscPtr_
Teuchos::RCP< Linear::Matrix > appdQdxPtr_
Teuchos::RCP< Linear::Vector > appStoLeadCurrQVecPtr_
void permutedFFT(const Linear::BlockVector &xt, Linear::BlockVector *xf)
Teuchos::RCP< Linear::Vector > appCurrStaVecPtr_
Teuchos::RCP< Linear::HBBuilder > hbBuilderPtr_
Teuchos::RCP< Linear::Matrix > linAppdFdxPtr_
Device::DeviceMgr & deviceManager_
Teuchos::RCP< Linear::Vector > appCurrLeadFVecPtr_
Teuchos::RCP< Linear::BlockVector > bXtPtr_
Teuchos::RCP< Linear::BlockVector > bLeadCurrentVecFreqPtr_
Teuchos::RCP< Linear::BlockVector > bStoreVecFreqPtr_
Teuchos::RCP< Linear::BlockVector > bVtPtr_
Teuchos::RCP< Linear::Vector > appNextJunctionVVecPtr_
Teuchos::RCP< Linear::BlockVector > bStoreLeadCurrQVecFreqPtr_
Teuchos::RCP< Linear::BlockMatrix > bmdQdxPtr_
bool applyLinearMatrices(const Linear::BlockVector &bVf, Linear::BlockVector &permlindQdxV, Linear::BlockVector &permlindFdxV)
void setHBFreqs(const std::vector< double > &freqs)
void registerHBBuilder(Teuchos::RCP< Linear::HBBuilder > hbBuilderPtr)
virtual bool getVoltageLimiterStatus()
Teuchos::RCP< N_UTL_DFTInterfaceDecl< std::vector< double > > > dftInterface_
Teuchos::RCP< Linear::Vector > appLeadQVecPtr_
std::vector< Teuchos::RCP< Linear::Matrix > > vecNLAppdQdxPtr_
Teuchos::RCP< Linear::Vector > appLastLeadFVecPtr_
bool loadTimeDepDAEMatrices(Linear::Vector *X, Linear::Vector *S, Linear::Vector *dSdt, Linear::Vector *Store, Linear::Matrix *dQdx, Linear::Matrix *dFdx)
Teuchos::RCP< Linear::Matrix > appdFdxPtr_
bool applyDAEMatrices(Linear::Vector *X, Linear::Vector *S, Linear::Vector *dSdt, Linear::Vector *Store, const Linear::Vector &V, Linear::Vector *dQdxV, Linear::Vector *dFdxV)
std::vector< double > times_
Linear::Builder & builder_
Teuchos::RCP< Linear::Vector > appLastStoVecPtr_
std::vector< Teuchos::RCP< Linear::Matrix > > vecNLAppdFdxPtr_
Teuchos::RCP< Linear::BlockVector > bLeadCurrentQVecFreqPtr_
Teuchos::RCP< Linear::Vector > appNextLeadFVecPtr_
Teuchos::RCP< Linear::Vector > appLastJunctionVVecPtr_
std::vector< double > freqs_
Teuchos::RCP< Linear::Vector > appVecPtr_
Teuchos::RCP< Linear::Matrix > linAppdQdxPtr_
bool loadDAEVectors(Linear::Vector *X, Linear::Vector *currX, Linear::Vector *lastX, Linear::Vector *S, Linear::Vector *currS, Linear::Vector *lastS, Linear::Vector *dSdt, Linear::Vector *Store, Linear::Vector *currStore, Linear::Vector *lastStore, Linear::Vector *storeLeadCurrQ, Linear::Vector *nextLeadFVectorPtr, Linear::Vector *currLeadFVectorPtr, Linear::Vector *lastLeadFVectorPtr, Linear::Vector *nextLeadQVectorPtr, Linear::Vector *nextJunctionVVectorPtr, Linear::Vector *currJunctionVVectorPtr, Linear::Vector *lastJunctionVVectorPtr, Linear::Vector *Q, Linear::Vector *F, Linear::Vector *B, Linear::Vector *dFdxdVp, Linear::Vector *dQdxdVp)
Teuchos::RCP< Linear::Vector > appCurrJunctionVVecPtr_
Teuchos::RCP< Linear::Vector > appNextStoVecPtr_
Teuchos::RCP< Linear::Vector > appNextStaVecPtr_
bool loadDeviceErrorWeightMask(Linear::Vector *deviceMask) const