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>
58 #include <N_UTL_fwd.h>
59 #include <N_UTL_FeatureTest.h>
60 #include <N_UTL_Math.h>
62 #include <N_PDS_ParMap.h>
65 #include <Epetra_MultiVector.h>
66 #include <Epetra_BlockMap.h>
70 using Teuchos::rcp_dynamic_cast;
78 const Teuchos::RCP<const N_MPDE_Discretization> discPtr,
80 Linear::Builder & builder)
84 fastTimeDiscPtr_(discPtr),
85 periodicTimesOffset_(0),
87 matrixFreeFlag_(false)
176 Linear::Vector * dSdt,
177 Linear::Vector * Store,
178 Linear::Matrix * dQdx,
179 Linear::Matrix * dFdx)
185 Xyce::dout() << std::endl
186 << Xyce::section_divider << std::endl
187 <<
" HBLoader::loadDAEMatrices: matrixFree case" << std::endl;
199 Xyce::dout() << std::endl
200 << Xyce::section_divider << std::endl
201 <<
" HBLoader::loadDAEMatrices: Time dependent with matrix case" << std::endl;
219 Linear::Vector * dSdt,
220 Linear::Vector * Store,
221 Linear::Matrix * dQdx,
222 Linear::Matrix * dFdx)
226 Xyce::dout() << std::endl
227 << Xyce::section_divider << std::endl
228 <<
" HBLoader::loadTimeDepDAEMatrices" << std::endl;
237 Linear::BlockMatrix & bdQdx = *
dynamic_cast<Linear::BlockMatrix*
>(dQdx);
238 Linear::BlockMatrix & bdFdx = *
dynamic_cast<Linear::BlockMatrix*
>(dFdx);
239 Linear::BlockVector & bX = *
dynamic_cast<Linear::BlockVector*
>(X);
240 #ifdef Xyce_FLEXIBLE_DAE_LOADS
241 Linear::BlockVector & bS = *
dynamic_cast<Linear::BlockVector*
>(S);
242 Linear::BlockVector & bdSdt = *
dynamic_cast<Linear::BlockVector*
>(dSdt);
243 Linear::BlockVector & bStore = *
dynamic_cast<Linear::BlockVector*
>(Store);
244 #endif // Xyce_FLEXIBLE_DAE_LOADS
246 int BlockCount = bX.blockCount();
248 for(
int i = 0; i < BlockCount; ++i )
252 Xyce::dout() <<
"Processing diagonal matrix block " << i <<
" of " << BlockCount-1 << std::endl;
255 #ifdef Xyce_FLEXIBLE_DAE_LOADS
265 appdSdt = bdSdt.block(i);
275 bdQdx.block(i,i).add(
bmdQdxPtr_->block(i,i) );
276 bdFdx.block(i,i).add(
bmdFdxPtr_->block(i,i) );
278 #endif // Xyce_FLEXIBLE_DAE_LOADS
291 for(
int i = 0; i < BlockCount; ++i )
295 Xyce::dout() <<
"Processing off diagonal matrix blocks on row " << i <<
" of " << BlockCount-1 << std::endl;
300 int indexT2 = indexT1 + Width - 1;
303 for(
int j = 0; j < Width; ++j )
311 else if( Loc > (BlockCount-1) )
317 dQdxdt.add( bdQdx.block(Loc,Loc) );
318 dQdxdt.scale( Coeffs[j]*invh2 );
319 bdFdx.block(i,Loc).add( dQdxdt );
323 dQdx->fillComplete();
324 dFdx->fillComplete();
328 Xyce::dout() <<
"HB bX:" << std::endl;
329 bX.printPetraObject(dout());
330 Xyce::dout() <<
"HB bdQdx:" << std::endl;
331 bdQdx.printPetraObject(dout());
332 Xyce::dout() <<
"HB bdFdx:" << std::endl;
333 bdFdx.printPetraObject(dout());
334 #ifdef Xyce_FLEXIBLE_DAE_LOADS
335 Xyce::dout() <<
"HB bS:" << std::endl;
336 bS.printPetraObject(dout());
337 Xyce::dout() <<
"HB dSdt:" << std::endl;
338 bdSdt.printPetraObject(dout());
339 Xyce::dout() <<
"HB bStore:" << std::endl;
340 bStore.printPetraObject(dout());
341 #endif // Xyce_FLEXIBLE_DAE_LOADS
343 Xyce::dout() << Xyce::section_divider << std::endl;
359 Linear::Vector * dSdt,
360 Linear::Vector * Store,
361 const Linear::Vector & Vf,
362 Linear::Vector * dQdxV,
363 Linear::Vector * dFdxV )
367 std::string msg=
"HBLoader::applyDAEMatrices. This function should only be called in the matrix free case.";
368 N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL, msg);
372 Xyce::dout() << std::endl
373 << Xyce::section_divider << std::endl
374 <<
" HBLoader::applyDAEMatrices" << std::endl;
378 dQdxV->putScalar(0.0);
379 dFdxV->putScalar(0.0);
384 Linear::BlockVector & bXf = *
dynamic_cast<Linear::BlockVector*
>(Xf);
389 const Linear::BlockVector bVf(Vf, bXf.blockSize());
394 Linear::BlockVector & bX = *
bXtPtr_;
396 Linear::BlockVector * bdQdxV =
dynamic_cast<Linear::BlockVector*
>(dQdxV);
397 Linear::BlockVector * bdFdxV =
dynamic_cast<Linear::BlockVector*
>(dFdxV);
399 Teuchos::RCP<Linear::BlockVector> bdQdxVt =
hbBuilderPtr_->createTimeDomainBlockVector();
400 Teuchos::RCP<Linear::BlockVector> bdFdxVt =
hbBuilderPtr_->createTimeDomainBlockVector();
402 int BlockCount = bX.blockCount();
403 for(
int i = 0; i < BlockCount; ++i )
407 Xyce::dout() <<
"Processing diagonal matrix block " << i <<
" of " << BlockCount-1 << std::endl;
416 Xyce::dout() <<
"bVtPtr block i = " << i <<
" : " << std::endl;
417 bVtPtr_->block(i).printPetraObject(dout());
419 Xyce::dout() <<
"appdQdxPtr_ = " << i <<
" : " << std::endl;
422 Xyce::dout() <<
"appdFdxPtr_ = " << i <<
" : " << std::endl;
432 Xyce::dout() <<
"bdQdxVt block i = " << i <<
" : " << std::endl;
433 bdQdxVt->block(i).printPetraObject(dout());
435 Xyce::dout() <<
"bdFdxVt block i = " << i <<
" : " << std::endl;
436 bdFdxVt->block(i).printPetraObject(dout());
443 int blockCount = bXf.blockCount();
444 int blockSize = bXf.block(0).globalLength();
447 int size_ =
freqs_.size();
448 int posFreq = (size_-1)/2;
450 for(
int i = 0; i < blockCount; ++i )
452 Linear::Vector QVec(bXf.block(i));
453 Linear::Vector freqVec = bdQdxV->block(i);
456 if (freqVec.localLength() > 0)
459 omega = 2.0 *
M_PI * freqs_[posFreq];
461 QVec[0] = -freqVec[1]*omega;
462 QVec[1] = freqVec[0]*omega;
464 for (
int j=1; j < (blockSize/2+1)/2; ++j)
466 omega = 2.0 *
M_PI * freqs_[posFreq+j];
467 QVec[2*j] = -freqVec[2*j+1]*omega;
468 QVec[2*(blockSize/2-j)] = -freqVec[2*j+1]*omega;
470 QVec[2*j+1] = freqVec[2*j]*omega;
471 QVec[2*(blockSize/2-j)+1] = -freqVec[2*j]*omega;
475 bdFdxV->block(i).update(1.0, QVec , 1.0);
480 Xyce::dout() <<
"HB bX:" << std::endl;
481 bX.printPetraObject(dout());
482 Xyce::dout() <<
"HB bdQdxV:" << std::endl;
483 bdQdxV->printPetraObject(dout());
484 Xyce::dout() <<
"HB bdFdxV:" << std::endl;
485 bdFdxV->printPetraObject(dout());
487 Xyce::dout() << Xyce::section_divider << std::endl;
511 (Linear::Vector * nextSolVectorPtr,
512 Linear::Vector * currSolVectorPtr,
513 Linear::Vector * lastSolVectorPtr,
514 Linear::Vector * nextStaVectorPtr,
515 Linear::Vector * currStaVectorPtr,
516 Linear::Vector * lastStaVectorPtr,
517 Linear::Vector * nextStoVectorPtr,
518 Linear::Vector * currStoVectorPtr,
519 Linear::Vector * lastStoVectorPtr
522 bool bsuccess =
true;
538 Linear::Vector * currX,
539 Linear::Vector * lastX,
541 Linear::Vector * currS,
542 Linear::Vector * lastS,
543 Linear::Vector * dSdt,
544 Linear::Vector * Store,
545 Linear::Vector * currStore,
546 Linear::Vector * lastStore,
547 Linear::Vector * storeLeadCurrQ,
548 Linear::Vector * nextLeadFVectorPtr,
549 Linear::Vector * currLeadFVectorPtr,
550 Linear::Vector * lastLeadFVectorPtr,
551 Linear::Vector * nextLeadQVectorPtr,
552 Linear::Vector * nextJunctionVVectorPtr,
553 Linear::Vector * currJunctionVVectorPtr,
554 Linear::Vector * lastJunctionVVectorPtr,
558 Linear::Vector * dFdxdVp,
559 Linear::Vector * dQdxdVp )
563 Xyce::dout() << std::endl
564 << Xyce::section_divider << std::endl
565 <<
" HBLoader::loadDAEVectors" << std::endl;
592 Linear::BlockVector & bXf = *
dynamic_cast<Linear::BlockVector*
>(Xf);
597 Linear::BlockVector & bX = *
bXtPtr_;
598 Linear::BlockVector & bS = *
dynamic_cast<Linear::BlockVector*
>(S);
599 Linear::BlockVector & bcurrS = *
dynamic_cast<Linear::BlockVector*
>(currS);
600 Linear::BlockVector & blastS = *
dynamic_cast<Linear::BlockVector*
>(lastS);
601 Linear::BlockVector & bdSdt = *
dynamic_cast<Linear::BlockVector*
>(dSdt);
602 Linear::BlockVector & bStore = *
dynamic_cast<Linear::BlockVector*
>(Store);
603 Linear::BlockVector & bcurrStore = *
dynamic_cast<Linear::BlockVector*
>(currStore);
604 Linear::BlockVector & blastStore = *
dynamic_cast<Linear::BlockVector*
>(lastStore);
606 Linear::BlockVector & bNextLeadF = *
dynamic_cast<Linear::BlockVector*
>(nextLeadFVectorPtr);
607 Linear::BlockVector & bCurrLeadF = *
dynamic_cast<Linear::BlockVector*
>(currLeadFVectorPtr);
608 Linear::BlockVector & bLastLeadF = *
dynamic_cast<Linear::BlockVector*
>(lastLeadFVectorPtr);
609 Linear::BlockVector & bLeadQ = *
dynamic_cast<Linear::BlockVector*
>(nextLeadQVectorPtr);
610 Linear::BlockVector & bNextJunctionV = *
dynamic_cast<Linear::BlockVector*
>(nextJunctionVVectorPtr);
611 Linear::BlockVector & bCurrJunctionV = *
dynamic_cast<Linear::BlockVector*
>(currJunctionVVectorPtr);
612 Linear::BlockVector & bLastJunctionV = *
dynamic_cast<Linear::BlockVector*
>(lastJunctionVVectorPtr);
614 Linear::BlockVector * bQ =
dynamic_cast<Linear::BlockVector*
>(Q);
615 Linear::BlockVector * bF =
dynamic_cast<Linear::BlockVector*
>(F);
616 Linear::BlockVector * bB =
dynamic_cast<Linear::BlockVector*
>(B);
618 Linear::BlockVector * bdFdxdVp =
dynamic_cast<Linear::BlockVector*
>(dFdxdVp);
619 Linear::BlockVector * bdQdxdVp =
dynamic_cast<Linear::BlockVector*
>(dQdxdVp);
624 Linear::BlockVector & bstoreLeadCurrQ = *
dynamic_cast<Linear::BlockVector*
>(storeLeadCurrQ);
626 Linear::BlockVector bQt(*
bXtPtr_);
627 Linear::BlockVector bFt(*
bXtPtr_);
628 Linear::BlockVector bBt(*
bXtPtr_);
630 Linear::BlockVector bdQdxdVpt(*
bXtPtr_);
631 Linear::BlockVector bdFdxdVpt(*
bXtPtr_);
636 #ifndef Xyce_FLEXIBLE_DAE_LOADS
641 int BlockCount = bX.blockCount();
642 int BlockSize = bX.blockSize();
645 Xyce::dout() <<
"bX.blockCount = "<< BlockCount <<std::endl;
646 Xyce::dout() <<
"bX.blockSize = "<< BlockSize <<std::endl;
654 for (
int i=0; i < BlockCount; ++i )
662 for(
int i = 0; i < BlockCount; ++i )
666 Xyce::dout() <<
"Processing vectors for block " << i <<
" of " << BlockCount-1 << std::endl;
675 Xyce::dout() <<
"Calling updateSources on the appLoader" << std::endl;
685 appdSdt = bdSdt.block(i);
702 Xyce::dout() <<
"Updating State for block " << i <<
" of " << BlockCount-1 << std::endl;
725 Xyce::dout() <<
"Calling loadDAEVectors on the appLoader" << std::endl;
732 appdFdxdVp.putScalar(0.0);
733 appdQdxdVp.putScalar(0.0);
744 &appdFdxdVp, &appdQdxdVp );
750 bdQdxdVpt.block(i) = appdQdxdVp;
751 bdFdxdVpt.block(i) = appdFdxdVp;
800 int blockCount = bXf.blockCount();
801 int blockSize = bXf.block(0).globalLength();
804 int size_ =
freqs_.size();
805 int posFreq = (size_-1)/2;
808 for(
int i = 0; i < blockCount; ++i )
813 Linear::Vector QVec(bQ->block(i));
814 Linear::Vector freqVec = bQ->block(i);
816 Linear::Vector dQdxdVpVec(bdQdxdVp->block(i));
817 Linear::Vector freqVec1 = bdQdxdVp->block(i);
820 if (freqVec.localLength() > 0)
822 omega = 2.0 *
M_PI * freqs_[posFreq];
824 QVec[0] = -freqVec[1]*omega;
825 QVec[1] = freqVec[0]*omega;
827 dQdxdVpVec[0] = -freqVec1[1]*omega;
828 dQdxdVpVec[1] = freqVec1[0]*omega;
830 for (
int j=1; j < (blockSize/2+1)/2; ++j)
833 omega = 2.0 *
M_PI * freqs_[posFreq + j];
835 QVec[2*j] = -freqVec[2*j+1]*omega;
836 QVec[2*(blockSize/2-j)] = -freqVec[2*j+1]*omega;
838 QVec[2*j+1] = freqVec[2*j]*omega;
839 QVec[2*(blockSize/2-j)+1] = -freqVec[2*j]*omega;
841 dQdxdVpVec[2*j] = -freqVec1[2*j+1]*omega;
842 dQdxdVpVec[2*(blockSize/2-j)] = -freqVec1[2*j+1]*omega;
844 dQdxdVpVec[2*j+1] = freqVec1[2*j]*omega;
845 dQdxdVpVec[2*(blockSize/2-j)+1] = -freqVec1[2*j]*omega;
850 bF->block(i).update(1.0, QVec , 1.0);
852 bdFdxdVp->block(i).update(1.0, dQdxdVpVec, 1.0);
858 for(
int i = 0; i < blockCount; ++i )
867 if (stoLeadCurrQVec.localLength() > 0)
870 omega = 2.0 *
M_PI * freqs_[posFreq];
871 stoLeadCurrdQdtVec[0] = stoLeadCurrQVec[1]*omega;
872 stoLeadCurrdQdtVec[1] = stoLeadCurrQVec[0]*omega;
874 for (
int j=1; j < (blockSize/2+1)/2; ++j)
876 omega = 2.0 *
M_PI * freqs_[posFreq+ j];
878 stoLeadCurrdQdtVec[2*j] = -stoLeadCurrQVec[2*j+1]*omega;
879 stoLeadCurrdQdtVec[2*(blockSize/2-j)] = -stoLeadCurrQVec[2*j+1]*omega;
881 stoLeadCurrdQdtVec[2*j+1] = stoLeadCurrQVec[2*j]*omega;
882 stoLeadCurrdQdtVec[2*(blockSize/2-j)+1] = -stoLeadCurrQVec[2*j]*omega;
896 for(
int i = 0; i < blockCount; ++i )
905 if (leadCurrQVec.localLength() > 0)
908 omega = 2.0 *
M_PI * freqs_[posFreq];
909 leadCurrdQdtVec[0] = leadCurrQVec[1]*omega;
910 leadCurrdQdtVec[1] = leadCurrQVec[0]*omega;
912 for (
int j=1; j < (blockSize/2+1)/2; ++j)
914 omega = 2.0 *
M_PI * freqs_[posFreq+ j];
916 leadCurrdQdtVec[2*j] = -leadCurrQVec[2*j+1]*omega;
917 leadCurrdQdtVec[2*(blockSize/2-j)] = -leadCurrQVec[2*j+1]*omega;
919 leadCurrdQdtVec[2*j+1] = leadCurrQVec[2*j]*omega;
920 leadCurrdQdtVec[2*(blockSize/2-j)+1] = -leadCurrQVec[2*j]*omega;
931 Xyce::dout() <<
"HB X Vector" << std::endl;
932 bX.printPetraObject(std::cout);
937 Xyce::dout() <<
"HB Store Vector" << std::endl;
938 bStore.printPetraObject(std::cout);
939 Xyce::dout() <<
"HB Q Vector" << std::endl;
940 bQ->printPetraObject(std::cout);
941 Xyce::dout() <<
"HB F Vector" << std::endl;
942 bF->printPetraObject(std::cout);
943 Xyce::dout() <<
"HB bdFdxdVp Vector" << std::endl;
944 bdFdxdVp->printPetraObject(std::cout);
945 Xyce::dout() <<
"HB bdQdxdVp Vector" << std::endl;
946 bdQdxdVp->printPetraObject(std::cout);
948 #ifndef Xyce_FLEXIBLE_DAE_LOADS
949 Xyce::dout() <<
"HB bmdQdx_" << std::endl;
951 Xyce::dout() <<
"HB bmdFdx_" << std::endl;
953 #endif // Xyce_FLEXIBLE_DAE_LOADS
954 Xyce::dout() << Xyce::section_divider << std::endl;
970 Linear::Vector * deviceMask)
const
973 Linear::BlockVector & bDevMask = *
dynamic_cast<Linear::BlockVector*
>(deviceMask);
976 Xyce::dout() <<
"HBLoader::loadDeviceErrorWeightMask. Original (nonblock) deviceMask.size = "
983 int blockCount = bDevMask.blockCount();
984 int blockSize = bDevMask.blockSize();
987 Xyce::dout() <<
"bDevMask.blockCount = "<< blockCount <<std::endl;
988 Xyce::dout() <<
"bDevMask.blockSize = "<< blockSize <<std::endl;
994 for(
int i = 0; i < blockCount; ++i )
1000 Linear::Vector& localVecRef = bDevMask.block(i);
1002 for (
int j=0;j<blockSize;++j)
1004 localVecRef[j] = (*appVecPtr_)[i];
1009 bDevMask.printPetraObject(Xyce::dout());
HBLoader(const Teuchos::RCP< const N_MPDE_Discretization > discPtr, Device::DeviceMgr &device_manager, Linear::Builder &builder)
Teuchos::RCP< Linear::Vector > appLastStaVecPtr_
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_
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_
std::vector< Teuchos::RCP< Linear::Matrix > > vecAppdFdxPtr_
void permutedFFT(const Linear::BlockVector &xt, Linear::BlockVector *xf)
Teuchos::RCP< Linear::Vector > appCurrStaVecPtr_
Teuchos::RCP< Linear::HBBuilder > hbBuilderPtr_
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_
void setHBFreqs(const std::vector< double > &freqs)
void registerHBBuilder(Teuchos::RCP< Linear::HBBuilder > hbBuilderPtr)
Teuchos::RCP< N_UTL_DFTInterfaceDecl< std::vector< double > > > dftInterface_
Teuchos::RCP< Linear::Vector > appLeadQVecPtr_
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_
Teuchos::RCP< Linear::BlockVector > bLeadCurrentQVecFreqPtr_
Teuchos::RCP< Linear::Vector > appNextLeadFVecPtr_
Teuchos::RCP< Linear::Vector > appLastJunctionVVecPtr_
std::vector< double > freqs_
Teuchos::RCP< Linear::Vector > appVecPtr_
void permutedIFT(const Linear::BlockVector &xf, Linear::BlockVector *xt)
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_
std::vector< Teuchos::RCP< Linear::Matrix > > vecAppdQdxPtr_
Teuchos::RCP< Linear::Vector > appNextStoVecPtr_
Teuchos::RCP< Linear::Vector > appNextStaVecPtr_
bool loadDeviceErrorWeightMask(Linear::Vector *deviceMask) const