40 #include <Xyce_config.h>
48 #include <N_ERH_Message.h>
49 #include <N_IO_CircuitBlock.h>
50 #include <N_IO_CmdParse.h>
51 #include <N_IO_InitialConditions.h>
52 #include <N_IO_OptionBlock.h>
53 #include <N_IO_PkgOptionsMgr.h>
54 #include <N_IO_SpiceSeparatedFieldTool.h>
55 #include <N_LAS_BlockMatrix.h>
56 #include <N_LAS_BlockSystemHelpers.h>
57 #include <N_LAS_BlockVector.h>
58 #include <N_LAS_Builder.h>
59 #include <N_LAS_Matrix.h>
60 #include <N_LAS_MultiVector.h>
61 #include <N_LAS_System.h>
68 #include <N_UTL_Diagnostic.h>
69 #include <N_TOP_Topology.h>
70 #include <N_UTL_Factory.h>
71 #include <N_UTL_FeatureTest.h>
72 #include <N_UTL_LogStream.h>
73 #include <N_UTL_Math.h>
74 #include <N_UTL_Timer.h>
76 #include <N_PDS_ParMap.h>
78 #include <Epetra_SerialComm.h>
79 #include <Epetra_Map.h>
80 #include <Epetra_BlockMap.h>
81 #include <Epetra_CrsMatrix.h>
82 #include <Epetra_CrsGraph.h>
83 #include <Epetra_MultiVector.h>
84 #include <Epetra_Vector.h>
85 #include <Epetra_Export.h>
86 #include <Epetra_LinearProblem.h>
89 #include<N_UTL_ExtendedString.h>
90 #include<N_UTL_ExpressionData.h>
93 #include <Teuchos_RCP.hpp>
109 const Util::OptionBlock & option_block)
111 for (Util::ParamList::const_iterator it = option_block.begin(), end = option_block.end(); it != end; ++it)
113 const Util::Param ¶m = *it;
115 if (param.uTag() ==
"DEBUGLEVEL" )
124 Report::UserError() << param.uTag() <<
" is not a recognized time integration option";
141 Linear::System & linear_system,
144 Topo::Topology & topology,
145 IO::InitialConditionsManager & initial_conditions_manager)
154 outputManagerAdapter_(analysis_manager.getOutputManagerAdapter()),
227 const Util::OptionBlock & paramsBlock)
229 for (Util::ParamList::const_iterator it = paramsBlock.begin(), end = paramsBlock.end(); it != end; ++it)
231 if ((*it).uTag() ==
"TYPE")
233 type_ = (*it).stringValue();
235 else if ((*it).uTag() ==
"NP")
237 np_ = (*it).getImmutableValue<
double>();
239 else if ((*it).uTag() ==
"FSTART")
241 fStart_ = (*it).getImmutableValue<
double>();
243 else if ((*it).uTag() ==
"FSTOP")
245 fStop_ = (*it).getImmutableValue<
double>();
249 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
251 dout() << section_divider << std::endl
252 <<
"AC simulation parameters"
254 <<
"number of points = " <<
np_ << std::endl
255 <<
"starting frequency = " <<
fStart_ << std::endl
256 <<
"stop frequency = " <<
fStop_
299 bool bsuccess =
true;
346 Report::UserError() <<
"Solving for DC operating point failed! Cannot continue AC analysis";
443 if (DEBUG_TIME && isActive(Diag::TIME_PARAMETERS))
445 Xyce::dout() <<
"dQdxMatrixPtr:" << std::endl;
448 Xyce::dout() <<
"dFdxMatrixPtr:" << std::endl;
451 Xyce::dout() << std::endl;
458 for (
int currentStep = 0; currentStep <
acLoopSize_; ++currentStep)
466 bool stepAttemptStatus;
468 Stats::StatTop _nonlinearStat(
"Nonlinear Solve");
469 Stats::TimeBlock _nonlinearTimer(_nonlinearStat);
474 if (stepAttemptStatus)
502 bool bsuccess =
true;
506 RCP<N_PDS_ParMap> baseMap = rcp(pds_manager.getParallelMap( Parallel::SOLUTION ),
false);
507 Epetra_CrsGraph &baseFullGraph = *pds_manager.getMatrixGraph(Parallel::JACOBIAN);
511 RCP<N_PDS_ParMap> blockMap = Linear::createBlockParMap(numBlocks, *baseMap);
515 B_ =
new Linear::BlockVector(numBlocks, blockMap, baseMap);
521 std::vector<std::vector<int> > blockPattern(2);
522 blockPattern[0].resize(2);
523 blockPattern[0][0] = 0; blockPattern[0][1] = 1;
524 blockPattern[1].resize(2);
525 blockPattern[1][0] = 0; blockPattern[1][1] = 1;
527 int offset = Linear::generateOffset( *baseMap );
529 RCP<Epetra_CrsGraph> blockGraph = Linear::createBlockGraph( offset, blockPattern, *blockMap, baseFullGraph);
532 ACMatrix_ =
new Linear::BlockMatrix( numBlocks, offset, blockPattern, *blockGraph, baseFullGraph);
541 B_->putScalar( 0.0 );
545 Amesos amesosFactory;
548 X_ =
new Linear::BlockVector (numBlocks, blockMap, baseMap);
549 X_->putScalar( 0.0 );
555 blockSolver_ = amesosFactory.Create(
"Klu", *
blockProblem_ );
558 Teuchos::ParameterList params;
559 params.set(
"Reindex",
true );
560 blockSolver_->SetParameters( params );
563 int linearStatus = blockSolver_->SymbolicFactorization();
565 if (linearStatus != 0)
567 Xyce::dout() <<
"Amesos symbolic factorization exited with error: " << linearStatus;
610 bool bsuccess =
true;
613 int linearStatus =
blockSolver_->NumericFactorization();
615 if (linearStatus != 0)
617 Xyce::dout() <<
"Amesos numeric factorization exited with error: " << linearStatus;
622 if (linearStatus != 0)
624 Xyce::dout() <<
"Amesos solve exited with error: " << linearStatus;
641 bool bsuccess =
true;
672 bool bsuccess =
true;
692 bool bsuccess =
true;
696 Xyce::dout() <<
"Calling AC::doFinish() outputs!" << std::endl;
757 Report::DevelFatal().in(
"AC::updateCurrentFreq_") <<
"AC::updateCurrentFreq_: unsupported STEP type";
773 double fstart, fstop;
779 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
781 Xyce::dout() << std::endl << std::endl;
782 Xyce::dout() << section_divider << std::endl;
783 Xyce::dout() <<
"AC::setupSweepParam_" << std::endl;
788 int np =
static_cast<int>(
np_);
796 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
798 Xyce::dout() <<
"fstep = " <<
fstep_ << std::endl;
801 else if (
type_ ==
"DEC")
804 fcount = floor(fabs(log10(fstart) - log10(fstop)) *
np_ + 1.0);
805 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
807 Xyce::dout() <<
"stepMult_ = " <<
stepMult_ << std::endl;
810 else if (
type_ ==
"OCT")
817 double ln2 = log(2.0);
818 fcount = floor(fabs(log(fstart) - log(fstop))/ln2 *
np_ + 1.0);
819 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
821 Xyce::dout() <<
"stepMult_ = " <<
stepMult_ << std::endl;
826 Report::DevelFatal().in(
"AC::setupSweepParam") <<
"Unsupported type";
831 return static_cast<int> (fcount);
836 typedef Util::Factory<AnalysisBase, AC> ACFactoryBase;
849 class ACFactory :
public ACFactoryBase
877 Linear::System & linear_system,
880 Topo::Topology & topology,
881 IO::InitialConditionsManager & initial_conditions_manager)
932 void setACAnalysisOptionBlock(
const Util::OptionBlock &option_block)
952 bool setTimeIntegratorOptionBlock(
const Util::OptionBlock &option_block)
973 struct ACAnalysisReg :
public IO::PkgOptionsReg
976 ACFactory & factory )
980 bool operator()(
const Util::OptionBlock &option_block)
982 factory_.setACAnalysisOptionBlock(option_block);
1003 IO::PkgOptionsMgr & options_manager,
1004 IO::CircuitBlock & circuit_block,
1005 const std::string & netlist_filename,
1006 const IO::TokenVector & parsed_line)
1008 Util::OptionBlock option_block(
"AC", Util::OptionBlock::NO_EXPRESSIONS, netlist_filename, parsed_line[0].lineNumber_);
1010 int numFields = parsed_line.size();
1015 Report::UserError0().at(netlist_filename, parsed_line[0].lineNumber_)
1016 <<
".AC line has an unexpected number of fields";
1020 int linePosition = 1;
1022 Util::Param parameter(
"",
"");
1025 parameter.setTag(
"TYPE" );
1027 ExtendedString stringVal ( parsed_line[linePosition].string_ );
1028 stringVal.toUpper();
1029 parameter.setVal(std::string(stringVal));
1030 option_block.addParam( parameter );
1035 parameter.setTag(
"NP" );
1036 parameter.setVal( parsed_line[linePosition].string_ );
1037 option_block.addParam( parameter );
1041 parameter.setTag(
"FSTART" );
1042 parameter.setVal( parsed_line[linePosition].string_ );
1043 option_block.addParam( parameter );
1048 parameter.setTag(
"FSTOP" );
1049 parameter.setVal( parsed_line[linePosition].string_ );
1050 option_block.addParam( parameter );
1053 circuit_block.addOptions(option_block);
1071 factory_block.
optionsManager_.addCommandProcessor(
"AC",
new ACAnalysisReg(*factory));
1073 factory_block.
optionsManager_.addOptionsProcessor(
"TIMEINT", IO::createRegistrationOptions(*factory, &ACFactory::setTimeIntegratorOptionBlock));
bool doProcessSuccessfulStep()
Linear::Vector * lastSolutionPtr
IO::PkgOptionsMgr & optionsManager_
bool registerACFactory(FactoryBlock &factory_block)
unsigned int successStepsThisParameter_
bool createLinearSystem_()
unsigned int successfulStepsTaken_
Number of consecutive successful time-integration steps.
int newtonConvergenceStatus
virtual bool setInitialGuess(Linear::Vector *solVectorPtr)
Linear::Vector * lastLeadDeltaVPtr
bool setAnalysisParams(const Util::OptionBlock ¶msBlock)
IO::InitialConditionsManager & initialConditionsManager_
bool setTimeIntegratorOption(const Util::Param ¶m)
void outputAC(double freq, const Linear::Vector &solnVecRealPtr, const Linear::Vector &solnVecImaginaryPtr)
void evaluateStepError(const Loader::Loader &loader, const TIAParams &tia_params)
Pure virtual class to augment a linear system.
TimeIntg::TIAParams tiaParams_
Util::OptionBlock timeIntegratorOptionBlock_
virtual bool loadDAEVectors(Linear::Vector *nextSolVectorPtr, Linear::Vector *currSolVectorPtr, Linear::Vector *lastSolVectorPtr, Linear::Vector *nextStaVectorPtr, Linear::Vector *currStaVectorPtr, Linear::Vector *lastStaVectorPtr, Linear::Vector *StaDerivVectorPtr, Linear::Vector *nextStoVectorPtr, Linear::Vector *currStoVectorPtr, Linear::Vector *lastStoVectorPtr, Linear::Vector *stoLeadCurrQVectorPtr, Linear::Vector *nextLeadFVectorPtr, Linear::Vector *currLeadFVectorPtr, Linear::Vector *lastLeadFVectorPtr, Linear::Vector *nextLeadQVectorPtr, Linear::Vector *nextJunctionVVectorPtr, Linear::Vector *currJunctionVVectorPtr, Linear::Vector *lastJunctionVVectorPtr, Linear::Vector *QVectorPtr, Linear::Vector *FVectorPtr, Linear::Vector *BVectorPtr, Linear::Vector *dFdxdVpVectorPtr, Linear::Vector *dQdxdVpVectorPtr)
virtual bool outputPlotFiles() const
bool resetForStepAnalysis()
unsigned int stepNumber
Time-integration step number counter.
virtual bool loadBVectorsforAC(Linear::Vector *bVecRealPtr, Linear::Vector *bVecImagPtr)
bool doProcessFailedStep()
Linear::Vector * currStorePtr
Linear::Vector * lastStatePtr
Topo::Topology & topology_
void gatherStepStatistics(StatCounts &stats, Nonlinear::NonLinearSolver &nonlinear_solver, int newton_convergence_status)
Topo::Topology & topology_
void createTimeIntegratorMethod(const TimeIntg::TIAParams &tia_params, const unsigned int integration_method)
bool resetAll(const TIAParams &tia_params)
std::vector< int > acSweepFailures_
Util::ListenerAutoSubscribe< StepEvent > StepEventListener
Linear::Vector * nextLeadDeltaVPtr
Linear::Vector * currStatePtr
unsigned int failedStepsAttempted_
Total number of failed time-integration steps.
void obtainCorrectorDeriv()
Parallel::Manager * getPDSManager() const
bool setDCOPOption(const Util::Param ¶m)
TimeIntg::StepErrorControl & getStepErrorControl()
bool setTimeIntegratorOptions(const Util::OptionBlock &option_block)
bool getBeginningIntegrationFlag() const
Linear::Vector * bVecRealPtr
void computeDividedDifferences()
Topo::Topology & topology_
NonLinearSolver & getNonlinearSolver()
std::vector< double > scaled_dOdpVec_
Linear::Vector * daeQVectorPtr
void setConstantHistory()
Linear::Vector * lastLeadCurrentPtr
virtual bool startTimeStep(bool beginIntegrationFlag, double nextTimeStep, double nextTime, int currentOrder)
void setErrorWtVector(const TIAParams &tia_params)
virtual bool isPDESystem() const
std::vector< double > dOdpAdjVec_
Amesos_BaseSolver * blockSolver_
Linear::Vector * daeFVectorPtr
Linear::Vector * currLeadCurrentQPtr
Nonlinear::Manager & nonlinearManager_
AC(AnalysisManager &analysis_manager, Linear::System &linear_system, Nonlinear::Manager &nonlinear_manager, Loader::Loader &loader, Topo::Topology &topology, IO::InitialConditionsManager &initial_conditions_manager)
OutputMgrAdapter & outputManagerAdapter_
The FactoryBlock contains parameters needed by the analysis creation functions.
Linear::System & linearSystem_
IO::InitialConditionsManager & initialConditionsManager_
Linear::Matrix * dFdxMatrixPtr
virtual bool updateSources()
Linear::Vector * nextStatePtr
AnalysisManager & analysisManager_
Linear::Vector * dFdxdVpVectorPtr
virtual bool loadDAEMatrices(Linear::Vector *tmpSolVectorPtr, Linear::Vector *tmpStaVectorPtr, Linear::Vector *tmpStaDerivVectorPtr, Linear::Vector *tmpStoVectorPtr, Linear::Matrix *tmpdQdxMatrixPtr, Linear::Matrix *tmpdFdxMatrixPtr)
virtual 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)
Linear::Vector * currLeadDeltaVPtr
AnalysisManager & analysisManager_
void setDoubleDCOPEnabled(bool enable)
int numberSuccessiveFailures
Nonlinear::Manager & nonlinearManager_
bool updateCurrentFreq_(int stepNumber)
std::vector< double > scaled_dOdpAdjVec_
IO::InitialConditionsManager & initialConditionsManager_
Linear::Vector * nextSolutionPtr
void dcOutput(int dcStepNumber, Linear::Vector &currSolutionPtr, Linear::Vector &stateVecPtr, Linear::Vector &storeVecPtr, Linear::Vector &lead_current_vector, Linear::Vector &junction_voltage_vector, Linear::Vector &lead_current_dqdt_vector, std::vector< double > &objectiveVec_, std::vector< double > &dOdpVec_, std::vector< double > &dOdpAdjVec_, std::vector< double > &scaled_dOdpVec_, std::vector< double > &scaled_dOdpAdjVec_)
Linear::Vector * nextStorePtr
bool updateLinearSystemFreq_()
void addAnalysisFactory(FactoryBlock &factory_block, Util::Factory< AnalysisBase, void > *factory)
Linear::Vector * dQdxdVpVectorPtr
Util::OptionBlock acAnalysisOptionBlock_
Linear::Vector * currLeadCurrentPtr
Linear::Vector * lastStorePtr
void setInputOPFlag(bool initial_conditions_loaded)
TimeIntg::WorkingIntegrationMethod & getWorkingIntegrationMethod()
const IO::CmdParse & getCommandLine() const
void obtainPredictorDeriv()
AnalysisManager & analysisManager_
std::vector< double > objectiveVec_
Linear::Vector * bVecImagPtr
Linear::Vector * nextLeadCurrentQDerivPtr
int getIntegrationMethod() const
Linear::Vector * currSolutionPtr
bool firstDoubleDCOPStep() const
TimeIntg::DataStore * getDataStore()
Linear::BlockMatrix * ACMatrix_
unsigned int baseIntegrationMethod_
Current time-integration method flag.
Parallel::Machine getComm()
Linear::Vector * nextStoreLeadCurrQPtr
Linear::Vector * nextStateDerivPtr
std::vector< double > dOdpVec_
Nonlinear::Manager & nonlinearManager_
Linear::Matrix * dQdxMatrixPtr
bool solveLinearSystem_()
Epetra_LinearProblem * blockProblem_
Linear::Vector * flagSolutionPtr
void notify(const StepEvent &event)
Linear::Vector * daeBVectorPtr
bool setReturnCodeOption(const Util::Param ¶m)
Linear::System & linearSystem_
Linear::Vector * nextLeadCurrentPtr