38 #include <Xyce_config.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>
62 #include <N_TOP_Topology.h>
63 #include <N_UTL_Diagnostic.h>
64 #include <N_UTL_ExtendedString.h>
65 #include <N_UTL_Factory.h>
66 #include <N_UTL_FeatureTest.h>
67 #include <N_UTL_OptionBlock.h>
68 #include <N_ERH_Message.h>
70 #include <Teuchos_RCP.hpp>
87 Topo::Topology & topology,
88 IO::InitialConditionsManager & initial_conditions_manager,
96 outputManagerAdapter_(analysis_manager.getOutputManagerAdapter()),
98 hbAnalysis_(hb_analysis),
99 sensFlag_(analysis_manager.getSensFlag()),
100 dcLoopInitialized_(false),
124 const Util::OptionBlock & option_block)
126 for (Util::ParamList::const_iterator it = option_block.begin(), end = option_block.end(); it != end; ++it)
128 const Util::Param ¶m = (*it);
130 if (param.uTag() ==
"DAESTATEDERIV")
132 else if (param.uTag() ==
"DEBUGLEVEL")
140 else if (param.uTag() ==
"METHOD")
143 Report::UserError() << param.uTag() <<
" is not a recognized time integration option";
177 os <<
"\tFailed DC sweep steps:\t\t" << std::endl;
181 os <<
"\t\tDC Step # " << *iter << std::endl;
213 bool bsuccess =
true;
217 Stats::StatTop _sensitivityStat(
"Sensitivity");
228 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
230 Xyce::dout() << std::endl << std::endl
231 << Xyce::subsection_divider << std::endl
232 <<
"DCSweep::run()" << std::endl;
308 while (currentStep < finalStep)
325 if (currentStep != 0 && reset)
335 Xyce::dout() <<
"Current Solution\n";
337 Xyce::dout() <<
"Next Solution\n";
377 Stats::StatTop _processSuccessfulStepStat(
"Successful Step");
378 Stats::TimeBlock _processSuccessfulStepTimer(_processSuccessfulStepStat);
403 if (DEBUG_ANALYSIS & DEBUG_TIME && isActive(Diag::TIME_DUMP_SOLUTION_ARRAYS))
426 Stats::StatTop _processFailedStat(
"Failed Steps");
427 Stats::TimeBlock _processFailedTimer(_processFailedStat);
449 bool bsuccess =
true;
452 Xyce::dout() <<
"Calling DCSweep::doFinish() outputs!" << std::endl;
500 Stats::StatTop _predictorStat(
"Predictor");
501 Stats::TimeBlock _predictorTimer(_predictorStat);
507 Stats::StatTop _updateDeviceSourceStat(
"Update Device Sources");
508 Stats::TimeBlock _updateDeviceSourceTimer(_updateDeviceSourceStat);
514 Stats::StatTop _nonlinearSolveStat(
"Solve");
515 Stats::TimeBlock _nonlinearSolveTimer(_nonlinearSolveStat);
521 Stats::StatTop _errorStat(
"Error Estimation");
522 Stats::TimeBlock _errorTimer(_errorStat);
569 std::vector<double> timePoints, freqPoints;
570 Teuchos::RCP<Linear::BlockVector> timeDomainSolnVec;
571 Teuchos::RCP<Linear::BlockVector> freqDomainSolnVecReal;
572 Teuchos::RCP<Linear::BlockVector> freqDomainSolnVecImaginary;
573 Teuchos::RCP<Linear::BlockVector> timeDomainStoreVec;
574 Teuchos::RCP<Linear::BlockVector> freqDomainStoreVecReal;
575 Teuchos::RCP<Linear::BlockVector> freqDomainStoreVecImaginary;
576 Teuchos::RCP<Linear::BlockVector> timeDomainLeadCurrentVec;
577 Teuchos::RCP<Linear::BlockVector> freqDomainLeadCurrentVecReal;
578 Teuchos::RCP<Linear::BlockVector> freqDomainLeadCurrentVecImaginary;
579 Teuchos::RCP<Linear::BlockVector> timeDomainJunctionVoltageVec;
580 Teuchos::RCP<Linear::BlockVector> freqDomainJunctionVoltageVecReal;
581 Teuchos::RCP<Linear::BlockVector> freqDomainJunctionVoltageVecImaginary;
592 freqDomainSolnVecReal,
593 freqDomainSolnVecImaginary,
595 freqDomainStoreVecReal,
596 freqDomainStoreVecImaginary,
597 timeDomainLeadCurrentVec,
598 freqDomainLeadCurrentVecReal,
599 freqDomainLeadCurrentVecImaginary,
600 timeDomainJunctionVoltageVec,
601 freqDomainJunctionVoltageVecReal,
602 freqDomainJunctionVoltageVecImaginary);
608 *freqDomainSolnVecReal,
609 *freqDomainSolnVecImaginary,
611 *freqDomainStoreVecReal,
612 *freqDomainStoreVecImaginary,
613 *timeDomainLeadCurrentVec,
614 *freqDomainLeadCurrentVecReal,
615 *freqDomainLeadCurrentVecImaginary,
616 *timeDomainJunctionVoltageVec,
617 *freqDomainJunctionVoltageVecReal,
618 *freqDomainJunctionVoltageVecImaginary);
654 dout() << std::endl << std::endl
657 << std::endl << std::endl;
670 if (start == 0 && finish == 0)
679 typedef Util::Factory<AnalysisBase, DCSweep> DCSweepFactoryBase;
692 class DCSweepFactory :
public DCSweepFactoryBase
719 Linear::System & linear_system,
722 Topo::Topology & topology,
723 IO::InitialConditionsManager & initial_conditions_manager)
724 : DCSweepFactoryBase(),
735 virtual ~DCSweepFactory()
752 DCSweep *create()
const
757 dc_sweep->setAnalysisParams(*it);
778 void setDCSweepAnalysisOptionBlock(
const Util::OptionBlock &option_block)
782 if (Util::compareParamLists(option_block, *it))
784 (*it) = option_block;
808 bool setTimeIntegratorOptionBlock(
const Util::OptionBlock &option_block)
830 struct DCSweepAnalysisReg :
public IO::PkgOptionsReg
833 DCSweepFactory & factory)
837 bool operator()(
const Util::OptionBlock &option_block)
839 factory_.setDCSweepAnalysisOptionBlock(option_block);
857 IO::PkgOptionsMgr & options_manager,
858 IO::CircuitBlock & circuit_block,
859 const std::string & netlist_filename,
860 const IO::TokenVector & parsed_line)
863 int numFields = parsed_line.size();
866 int sourcesFound = 0;
869 int linePosition = 1;
872 while( linePosition < numFields )
874 Util::OptionBlock option_block(
"DC", Util::OptionBlock::ALLOW_EXPRESSIONS, netlist_filename, parsed_line[linePosition].lineNumber_);
876 if (linePosition + 1 == numFields) {
877 Report::UserError0().at(netlist_filename, parsed_line[linePosition].lineNumber_) <<
"Extraneous values on .DC line";
881 std::string stringVal = parsed_line[linePosition + 1].string_;
882 Util::toUpper(stringVal);
884 std::string curr = parsed_line[linePosition].string_;
887 if (
"LIST" == stringVal ||
"LIST" == curr)
890 option_block.addParam(Util::Param(
"TYPE",
"LIST"));
891 option_block.addParam(Util::Param(
"PARAM", curr ==
"LIST" ? stringVal : curr));
895 while (++linePosition < numFields && Util::isValue(parsed_line[linePosition].string_))
896 option_block.addParam(Util::Param(
"VAL", parsed_line[linePosition].string_));
900 std::string sweepStepTag;
903 if (Util::isValue(stringVal))
905 sweepStepTag =
"STEP";
913 stringVal = parsed_line[linePosition++].string_;
914 Util::toUpper(stringVal);
917 sweepStepTag =
"NUMSTEPS";
921 option_block.addParam(Util::Param(
"TYPE", stringVal));
924 if( numFields <= linePosition + 3 )
926 Report::UserError0().at(netlist_filename, parsed_line[0].lineNumber_)
927 <<
".DC line not formatted correctly, found unexpected number of fields";
928 linePosition = numFields;
931 option_block.addParam(Util::Param(
"PARAM", parsed_line[linePosition++].string_));
932 option_block.addParam(Util::Param(
"START", parsed_line[linePosition++].string_));
933 option_block.addParam(Util::Param(
"STOP", parsed_line[linePosition++].string_));
934 option_block.addParam(Util::Param(sweepStepTag, parsed_line[linePosition++].string_));
938 circuit_block.addOptions(option_block);
958 IO::PkgOptionsMgr & options_manager,
959 IO::CircuitBlock & circuit_block,
960 const std::string & netlist_filename,
961 const IO::TokenVector & parsed_line)
963 Util::OptionBlock option_block(
"OP", Util::OptionBlock::NO_EXPRESSIONS, netlist_filename, parsed_line[0].lineNumber_);
965 int numFields = parsed_line.size();
970 Report::UserWarning0().at(netlist_filename, parsed_line[0].lineNumber_) <<
"Ignoring extra fields on .OP line";
973 circuit_block.addOptions(option_block);
991 factory_block.
optionsManager_.addCommandProcessor(
"DC",
new DCSweepAnalysisReg(*factory));
993 factory_block.
optionsManager_.addOptionsProcessor(
"TIMEINT", IO::createRegistrationOptions(*factory, &DCSweepFactory::setTimeIntegratorOptionBlock));
bool enableSensitivity(TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, Topo::Topology &topology)
int setupSweepLoop(Parallel::Machine comm, Loader::Loader &loader, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end)
IO::PkgOptionsMgr & optionsManager_
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_
void evaluateStepError(const Loader::Loader &loader, const TIAParams &tia_params)
std::vector< double > objectiveVec_
Pure virtual class to augment a linear system.
virtual void stepFailure(Analysis::TwoLevelMode analysis)
bool doProcessFailedStep()
virtual bool outputPlotFiles() const
std::vector< double > dOdpVec_
unsigned int stepNumber
Time-integration step number counter.
void outputSolDataArrays(std::ostream &os)
Linear::Vector * currStorePtr
IO::InitialConditionsManager & initialConditionsManager_
DCSweep(AnalysisManager &analysis_manager, Nonlinear::Manager &nonlinear_manager, Loader::Loader &loader, Topo::Topology &topology, IO::InitialConditionsManager &initial_conditions_manager, HB *hb_analysis=0)
bool updateSweepParams(Loader::Loader &loader, int step_count, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end, bool overrideOriginal)
void gatherStepStatistics(StatCounts &stats, Nonlinear::NonLinearSolver &nonlinear_solver, int newton_convergence_status)
OutputMgrAdapter & outputManagerAdapter_
Topo::Topology & topology_
void createTimeIntegratorMethod(const TimeIntg::TIAParams &tia_params, const unsigned int integration_method)
virtual int getDoubleDCOPStep() const
Parallel::Machine getComm() const
void setAnalysisMode(AnalysisMode mode)
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()
bool getBeginningIntegrationFlag() const
const std::string & getNetlistFilename() const
std::vector< int > dcSweepFailures_
void computeDividedDifferences()
bool outputFailureStats(std::ostream &os)
NonLinearSolver & getNonlinearSolver()
std::vector< double > dOdpAdjVec_
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)
void setConstantHistory()
std::vector< double > scaled_dOdpAdjVec_
bool setTimeIntegratorOptions(const Util::OptionBlock &option_block)
Nonlinear::Manager & nonlinearManager_
virtual bool startTimeStep(bool beginIntegrationFlag, double nextTimeStep, double nextTime, int currentOrder)
void setErrorWtVector(const TIAParams &tia_params)
Nonlinear::Manager & nonlinearManager_
virtual bool isPDESystem() const
The FactoryBlock contains parameters needed by the analysis creation functions.
Linear::System & linearSystem_
IO::InitialConditionsManager & initialConditionsManager_
Util::OptionBlock timeIntegratorOptionBlock_
Nonlinear::AnalysisMode nonlinearAnalysisMode(Mode mode)
Returns the nonlinear analysis mode given the analysis mode.
void setDCSweepVector(const Analysis::SweepVector &sweep_vector)
DCSweepFactory & factory_
virtual bool updateSources()
Linear::Vector * currLeadCurrentQDerivPtr
AnalysisManager & analysisManager_
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
void setDoubleDCOPEnabled(bool enable)
int numberSuccessiveFailures
Nonlinear::Manager & nonlinearManager_
std::vector< double > scaled_dOdpVec_
AnalysisManager & analysisManager_
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_)
TimeIntg::TIAParams tiaParams_
void addAnalysisFactory(FactoryBlock &factory_block, Util::Factory< AnalysisBase, void > *factory)
bool doProcessSuccessfulStep()
bool getDoubleDCOPEnabled() const
Linear::Vector * currLeadCurrentPtr
void setInputOPFlag(bool initial_conditions_loaded)
TimeIntg::WorkingIntegrationMethod & getWorkingIntegrationMethod()
void setSweepSourceResetFlag(bool reset)
const IO::CmdParse & getCommandLine() const
void obtainPredictorDeriv()
void initializeSolution_()
Linear::Vector * currSolutionPtr
bool firstDoubleDCOPStep() const
TimeIntg::DataStore * getDataStore()
unsigned int baseIntegrationMethod_
Current time-integration method flag.
Linear::System & linearSystem_
Parallel::Machine getComm()
bool registerDCSweepFactory(FactoryBlock &factory_block)
virtual void stepSuccess(Analysis::TwoLevelMode analysis)
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_
Linear::Vector * flagSolutionPtr
bool setAnalysisParams(const Util::OptionBlock ¶msBlock)
bool setReturnCodeOption(const Util::Param ¶m)
IO::InitialConditionsManager & initialConditionsManager_
Topo::Topology & topology_