38 #include <Xyce_config.h>
49 #include <N_IO_PkgOptionsMgr.h>
50 #include <N_IO_CmdParse.h>
57 #include <N_TOP_Topology.h>
58 #include <N_UTL_Diagnostic.h>
59 #include <N_UTL_ExtendedString.h>
60 #include <N_UTL_FeatureTest.h>
61 #include <N_UTL_OptionBlock.h>
62 #include <N_ERH_Message.h>
64 #include <Teuchos_RCP.hpp>
72 Topo::Topology & topology,
76 loader_(analysis_manager.getLoader()),
79 outputManagerAdapter_(analysis_manager.getOutputManagerAdapter()),
81 hbAnalysis_(hb_analysis),
82 sensFlag_(analysis_manager.getSensFlag()),
83 dcLoopInitialized_(false),
100 const Util::OptionBlock & option_block)
102 for (Util::ParamList::const_iterator it = option_block.begin(), end = option_block.end(); it != end; ++it)
104 const Util::Param ¶m = (*it);
106 if (param.uTag() ==
"DAESTATEDERIV")
108 else if (param.uTag() ==
"DEBUGLEVEL")
116 else if (param.uTag() ==
"METHOD")
119 Report::UserError() << param.uTag() <<
" is not a recognized time integration option";
153 os <<
"\tFailed DC sweep steps:\t\t" << std::endl;
157 os <<
"\t\tDC Step # " << *iter << std::endl;
189 bool bsuccess =
true;
193 Stats::StatTop _sensitivityStat(
"Sensitivity");
204 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
206 Xyce::dout() << std::endl << std::endl
207 << Xyce::subsection_divider << std::endl
208 <<
"DCSweep::run()" << std::endl;
276 while (currentStep < finalStep)
293 if (currentStep != 0 && reset)
339 Stats::StatTop _processSuccessfulStepStat(
"Successful Step");
340 Stats::TimeBlock _processSuccessfulStepTimer(_processSuccessfulStepStat);
365 if (DEBUG_ANALYSIS & DEBUG_TIME && isActive(Diag::TIME_DUMP_SOLUTION_ARRAYS))
387 Stats::StatTop _processFailedStat(
"Failed Steps");
388 Stats::TimeBlock _processFailedTimer(_processFailedStat);
410 bool bsuccess =
true;
413 Xyce::dout() <<
"Calling DCSweep::doFinish() outputs!" << std::endl;
456 Stats::StatTop _predictorStat(
"Predictor");
457 Stats::TimeBlock _predictorTimer(_predictorStat);
463 Stats::StatTop _updateDeviceSourceStat(
"Update Device Sources");
464 Stats::TimeBlock _updateDeviceSourceTimer(_updateDeviceSourceStat);
470 Stats::StatTop _nonlinearSolveStat(
"Solve");
471 Stats::TimeBlock _nonlinearSolveTimer(_nonlinearSolveStat);
477 Stats::StatTop _errorStat(
"Error Estimation");
478 Stats::TimeBlock _errorTimer(_errorStat);
525 std::vector<double> timePoints, freqPoints;
526 Teuchos::RCP<Linear::BlockVector> timeDomainSolnVec;
527 Teuchos::RCP<Linear::BlockVector> freqDomainSolnVecReal;
528 Teuchos::RCP<Linear::BlockVector> freqDomainSolnVecImaginary;
529 Teuchos::RCP<Linear::BlockVector> timeDomainStoreVec;
530 Teuchos::RCP<Linear::BlockVector> freqDomainStoreVecReal;
531 Teuchos::RCP<Linear::BlockVector> freqDomainStoreVecImaginary;
532 Teuchos::RCP<Linear::BlockVector> timeDomainLeadCurrentVec;
533 Teuchos::RCP<Linear::BlockVector> freqDomainLeadCurrentVecReal;
534 Teuchos::RCP<Linear::BlockVector> freqDomainLeadCurrentVecImaginary;
535 Teuchos::RCP<Linear::BlockVector> timeDomainJunctionVoltageVec;
536 Teuchos::RCP<Linear::BlockVector> freqDomainJunctionVoltageVecReal;
537 Teuchos::RCP<Linear::BlockVector> freqDomainJunctionVoltageVecImaginary;
548 freqDomainSolnVecReal,
549 freqDomainSolnVecImaginary,
551 freqDomainStoreVecReal,
552 freqDomainStoreVecImaginary,
553 timeDomainLeadCurrentVec,
554 freqDomainLeadCurrentVecReal,
555 freqDomainLeadCurrentVecImaginary,
556 timeDomainJunctionVoltageVec,
557 freqDomainJunctionVoltageVecReal,
558 freqDomainJunctionVoltageVecImaginary);
564 *freqDomainSolnVecReal,
565 *freqDomainSolnVecImaginary,
567 *freqDomainStoreVecReal,
568 *freqDomainStoreVecImaginary,
569 *timeDomainLeadCurrentVec,
570 *freqDomainLeadCurrentVecReal,
571 *freqDomainLeadCurrentVecImaginary,
572 *timeDomainJunctionVoltageVec,
573 *freqDomainJunctionVoltageVecReal,
574 *freqDomainJunctionVoltageVecImaginary);
608 dout() << std::endl << std::endl
611 << std::endl << std::endl;
624 if (start == 0 && finish == 0)
644 class DCSweepFactory :
public Factory<DCSweep>
671 Linear::System & linear_system,
673 Topo::Topology & topology)
681 virtual ~DCSweepFactory()
698 DCSweep *create()
const
703 dc_sweep->setAnalysisParams(*it);
724 void setDCSweepAnalysisOptionBlock(
const Util::OptionBlock &option_block)
728 if ((*it).compareParamLists(option_block))
730 (*it) = option_block;
754 void setTimeIntegratorOptionBlock(
const Util::OptionBlock &option_block)
772 struct TimeIntegratorOptionsReg :
public IO::PkgOptionsReg
774 TimeIntegratorOptionsReg(
775 DCSweepFactory & factory)
779 bool operator()(
const Util::OptionBlock &option_block)
781 factory_.setTimeIntegratorOptionBlock(option_block);
790 struct DCSweepAnalysisReg :
public IO::PkgOptionsReg
793 DCSweepFactory & factory)
797 bool operator()(
const Util::OptionBlock &option_block)
799 factory_.setDCSweepAnalysisOptionBlock(option_block);
813 const std::string & netlist_filename,
814 IO::PkgOptionsMgr & options_manager,
816 Linear::System & linear_system,
818 Topo::Topology & topology)
820 DCSweepFactory *factory =
new DCSweepFactory(analysis_manager, linear_system, nonlinear_manager, topology);
824 options_manager.submitRegistration(
"DC", netlist_filename,
new DCSweepAnalysisReg(*factory));
825 options_manager.submitRegistration(
"TIMEINT", netlist_filename,
new TimeIntegratorOptionsReg(*factory));
bool enableSensitivity(TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, Topo::Topology &topology)
void setDAEStateDerivFlag(bool state)
unsigned int successStepsThisParameter_
unsigned int successfulStepsTaken_
Number of consecutive successful time-integration steps.
void setDCAnalysisMaxSteps(int num)
int newtonConvergenceStatus
virtual bool setInitialGuess(Linear::Vector *solVectorPtr)
TwoLevelMode getTwoLevelMode() const
void setDCAnalysisStepNumber(int num)
bool setTimeIntegratorOption(const Util::Param ¶m)
bool printLoopInfo(int start, int finish)
bool calcSensitivity(std::vector< double > &objectiveVec, std::vector< double > &dOdpVec, std::vector< double > &dOdpAdjVec, std::vector< double > &scaled_dOdpVec, std::vector< double > &scaled_dOdpAdjVec)
SweepVector dcSweepVector_
AnalysisManager & analysisManager_
std::vector< double > objectiveVec_
Pure virtual class to augment a linear system.
bool updateSweepParams(Loader::Loader &loader, int step_count, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end, bool overrideOriginal=false)
int doubleDCOPStep_
current step in the DCOP loop.
virtual void stepFailure(Analysis::TwoLevelMode analysis)
void dcOutput(int dcStepNumber, Linear::Vector &currSolutionPtr, Linear::Vector &stateVecPtr, Linear::Vector &storeVecPtr, Linear::Vector &lead_current_vector, Linear::Vector &junction_voltage_vector, std::vector< double > &objectiveVec_, std::vector< double > &dOdpVec_, std::vector< double > &dOdpAdjVec_, std::vector< double > &scaled_dOdpVec_, std::vector< double > &scaled_dOdpAdjVec_)
bool doProcessFailedStep()
std::vector< double > dOdpVec_
unsigned int stepNumber
Time-integration step number counter.
void outputSolDataArrays(std::ostream &os)
Linear::Vector * currStorePtr
void gatherStepStatistics(StatCounts &stats, Nonlinear::NonLinearSolver &nonlinear_solver, int newton_convergence_status)
OutputMgrAdapter & outputManagerAdapter_
void createTimeIntegratorMethod(const TimeIntg::TIAParams &tia_params, const unsigned int integration_method)
bool setupInitialConditions(Linear::Vector &solnVec, Linear::Vector &flagVec)
Linear::Vector * currStatePtr
unsigned int failedStepsAttempted_
Total number of failed time-integration steps.
void obtainCorrectorDeriv()
Parallel::Manager * getPDSManager() const
Topo::Topology & topology_
bool setDCOPOption(const Util::Param ¶m)
TimeIntg::StepErrorControl & getStepErrorControl()
void updateSolDataArrays()
const std::string & getNetlistFilename() const
std::vector< int > dcSweepFailures_
void computeDividedDifferences()
bool outputFailureStats(std::ostream &os)
NonLinearSolver & getNonlinearSolver()
void prepareHBOutput(Linear::Vector &solnVecPtr, std::vector< double > &timePoints, std::vector< double > &freqPoints, Teuchos::RCP< Linear::BlockVector > &timeDomainSolnVec, Teuchos::RCP< Linear::BlockVector > &freqDomainSolnVecReal, Teuchos::RCP< Linear::BlockVector > &freqDomainSolnVecImaginary, Teuchos::RCP< Linear::BlockVector > &timeDomainStoreVec, Teuchos::RCP< Linear::BlockVector > &freqDomainStoreVecReal, Teuchos::RCP< Linear::BlockVector > &freqDomainStoreVecImaginary, Teuchos::RCP< Linear::BlockVector > &timeDomainLeadCurrentVec, Teuchos::RCP< Linear::BlockVector > &freqDomainLeadCurrentVecReal, Teuchos::RCP< Linear::BlockVector > &freqDomainLeadCurrentVecImaginary, Teuchos::RCP< Linear::BlockVector > &timeDomainJunctionVoltageVec, Teuchos::RCP< Linear::BlockVector > &freqDomainJunctionVoltageVecReal, Teuchos::RCP< Linear::BlockVector > &freqDomainJunctionVoltageVecImaginary) const
std::vector< double > dOdpAdjVec_
void setConstantHistory()
std::vector< double > scaled_dOdpAdjVec_
bool setTimeIntegratorOptions(const Util::OptionBlock &option_block)
virtual bool startTimeStep()
Nonlinear::Manager & nonlinearManager_
void setErrorWtVector(const TIAParams &tia_params)
Nonlinear::Manager & nonlinearManager_
DCSweep(AnalysisManager &analysis_manager, Nonlinear::Manager &nonlinear_manager, Topo::Topology &topology, HB *hb_analysis=0)
Util::OptionBlock timeIntegratorOptionBlock_
bool processSuccessfulStep()
void setDCSweepVector(const Analysis::SweepVector &sweep_vector)
DCSweepFactory & factory_
virtual bool updateSources()
void setSweepSourceResetFlag(bool ssrf)
void printStepHeader(std::ostream &os)
void outputTimeInfo(std::ostream &os)
virtual bool printLoopInfo(int start, int finish)
SweepParam parseSweepParams(Util::ParamList::const_iterator first, Util::ParamList::const_iterator last)
Populate the sweep params from the parameter list.
Linear::Vector * currLeadDeltaVPtr
int numberSuccessiveFailures
std::vector< double > scaled_dOdpVec_
void addAnalysisFactory(Factory< void > *factory)
AnalysisManager & analysisManager_
Linear::Vector * nextSolutionPtr
virtual bool getDoubleDCOPFlag() const
bool registerDCSweepFactory(const std::string &netlist_filename, IO::PkgOptionsMgr &options_manager, AnalysisManager &analysis_manager, Linear::System &linear_system, Nonlinear::Manager &nonlinear_manager, Topo::Topology &topology)
TimeIntg::TIAParams tiaParams_
The analysis factory template defines an interface for analysis type testing and analysis creation...
bool doProcessSuccessfulStep()
Linear::Vector * currLeadCurrentPtr
void setInputOPFlag(bool initial_conditions_loaded)
TimeIntg::WorkingIntegrationMethod & getWorkingIntegrationMethod()
bool firstDoubleDCOPStep()
const IO::CmdParse & getCommandLine() const
void obtainPredictorDeriv()
void initializeSolution_()
Linear::Vector * currSolutionPtr
TimeIntg::DataStore * getDataStore()
void evaluateStepError(const TIAParams &tia_params)
bool doubleDCOPFlag_
true if doing a double-DCOP is possible.
unsigned int baseIntegrationMethod_
Current time-integration method flag.
Linear::System & linearSystem_
virtual void stepSuccess(Analysis::TwoLevelMode analysis)
void outputDCOP(const Linear::Vector &solution)
void outputHB(const std::vector< double > &timePoints, const std::vector< double > &freqPoints, const Linear::BlockVector &timeDomainSolnVec, const Linear::BlockVector &freqDomainSolnVecReal, const Linear::BlockVector &freqDomainSolnVecImaginary, const Linear::BlockVector &timeDomainStoreVec, const Linear::BlockVector &freqDomainStoreVecReal, const Linear::BlockVector &freqDomainStoreVecImaginary, const Linear::BlockVector &timeDomainLeadCurrentVec, const Linear::BlockVector &freqDomainLeadCurrentVecReal, const Linear::BlockVector &freqDomainLeadCurrentVecImaginary, const Linear::BlockVector &timeDomainJunctionVoltageVec, const Linear::BlockVector &freqDomainJunctionVoltageVecReal, const Linear::BlockVector &freqDomainJunctionVoltageVecImaginary)
std::vector< Util::OptionBlock > dcSweepAnalysisOptionBlock_
int setupSweepLoop(Loader::Loader &loader, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end)
Linear::Vector * flagSolutionPtr
bool setAnalysisParams(const Util::OptionBlock ¶msBlock)
bool setReturnCodeOption(const Util::Param ¶m)
virtual bool output() const
Topo::Topology & topology_