48 #include <Xyce_config.h>
52 #include <N_ERH_ErrorMgr.h>
53 #include <N_IO_CmdParse.h>
54 #include <N_IO_OutputMgr.h>
55 #include <N_IO_PkgOptionsMgr.h>
64 #include <N_UTL_Expression.h>
65 #include <N_UTL_FeatureTest.h>
75 struct Manager_OptionsReg :
public IO::PkgOptionsReg
77 Manager_OptionsReg( Manager & manager )
81 bool operator()(
const Util::OptionBlock & options )
82 {
return manager_.setOptions( options ); }
87 struct Manager_TranOptionsReg :
public IO::PkgOptionsReg
89 Manager_TranOptionsReg( Manager & manager )
93 bool operator()(
const Util::OptionBlock & options )
94 {
return manager_.setTranOptions( options ); }
99 struct Manager_HBOptionsReg :
public IO::PkgOptionsReg
101 Manager_HBOptionsReg( Manager & manager )
105 bool operator()(
const Util::OptionBlock & options )
106 {
return manager_.setHBOptions( options ); }
112 struct Manager_LSOptionsReg :
public IO::PkgOptionsReg
114 Manager_LSOptionsReg( Manager & manager )
118 bool operator()(
const Util::OptionBlock & options )
119 {
return manager_.setLinSolOptions( options ); }
124 struct Manager_LocaOptionsReg :
public IO::PkgOptionsReg
126 Manager_LocaOptionsReg( Manager & manager )
130 bool operator()(
const Util::OptionBlock & options )
131 {
return manager_.setLocaOptions( options ); }
136 struct Manager_SensOptionsReg :
public IO::PkgOptionsReg
138 Manager_SensOptionsReg( Manager & manager )
142 bool operator()(
const Util::OptionBlock & options )
143 {
return manager_.setSensOptions( options ); }
148 struct Manager_SensitivityOptionsReg :
public IO::PkgOptionsReg
150 Manager_SensitivityOptionsReg( Manager & manager )
154 bool operator()(
const Util::OptionBlock & options )
155 {
return manager_.setSensitivityOptions( options ); }
160 struct Manager_TwoLvlOptionsReg :
public IO::PkgOptionsReg
162 Manager_TwoLvlOptionsReg( Manager & manager )
166 bool operator()(
const Util::OptionBlock & options )
167 {
return manager_.setTwoLevelOptions( options ); }
172 struct Manager_TwoLvlTranOptionsReg :
public IO::PkgOptionsReg
174 Manager_TwoLvlTranOptionsReg( Manager & manager )
178 bool operator()(
const Util::OptionBlock & options )
179 {
return manager_.setTwoLevelTranOptions( options ); }
184 struct Manager_DCOPRestartOptionsReg :
public IO::PkgOptionsReg
186 Manager_DCOPRestartOptionsReg( Manager & manager )
190 bool operator()(
const Util::OptionBlock & options )
191 {
return manager_.setDCOPRestartOptions (options); }
197 struct Manager_ICOptionsReg :
public IO::PkgOptionsReg
199 Manager_ICOptionsReg( Manager & manager )
203 bool operator()(
const Util::OptionBlock & options )
204 {
return manager_.setICOptions (options); }
210 struct Manager_NodeSetOptionsReg :
public IO::PkgOptionsReg
212 Manager_NodeSetOptionsReg( Manager & manager )
216 bool operator()(
const Util::OptionBlock & options )
217 {
return manager_.setNodeSetOptions (options); }
234 options_manager.submitRegistration(
235 "NONLIN", netlist_filename,
new Manager_OptionsReg( manager ) );
237 options_manager.submitRegistration(
238 "NONLIN-TRAN", netlist_filename,
new Manager_TranOptionsReg( manager ) );
240 options_manager.submitRegistration(
241 "NONLIN-HB", netlist_filename,
new Manager_HBOptionsReg( manager ) );
243 options_manager.submitRegistration(
244 "LINSOL", netlist_filename,
new Manager_LSOptionsReg( manager ) );
246 options_manager.submitRegistration(
247 "LOCA", netlist_filename,
new Manager_LocaOptionsReg( manager ) );
249 options_manager.submitRegistration(
250 "SENS", netlist_filename,
new Manager_SensOptionsReg( manager ) );
252 options_manager.submitRegistration(
253 "SENSITIVITY", netlist_filename,
new Manager_SensitivityOptionsReg( manager ) );
255 options_manager.submitRegistration(
256 "NONLIN-TWOLEVEL", netlist_filename,
new Manager_TwoLvlOptionsReg( manager ) );
258 options_manager.submitRegistration(
259 "NONLIN-TWOLEVEL-TRAN", netlist_filename,
new Manager_TwoLvlTranOptionsReg( manager ) );
261 options_manager.submitRegistration(
262 "DCOP", netlist_filename,
new Manager_DCOPRestartOptionsReg( manager ) );
264 options_manager.submitRegistration(
265 "IC", netlist_filename,
new Manager_ICOptionsReg( manager ) );
267 options_manager.submitRegistration(
268 "NODESET", netlist_filename,
new Manager_NodeSetOptionsReg( manager ) );
281 const IO::CmdParse & command_line)
282 : commandLine_(command_line),
284 conductanceExtractorPtr_(0),
285 nlsSensitivityPtr_(0),
287 matrixFreeFlag_(false),
289 noxFlagInner_(false),
290 noxFlagTransient_(false),
292 initializeAllFlag_(false),
453 const Util::Param & param)
455 if (param.uTag() ==
"NLNEARCONV" )
462 else if (param.uTag() ==
"NLSMALLUPDATE" )
466 codes.
smallUpdate = param.getImmutableValue<
int>() ? 4 : -4;
492 const Util::OptionBlock &option_blocktran =
optionBlockMap_[
"transient"];
495 for (Util::ParamList::const_iterator it = option_blockdcop.begin(); it != option_blockdcop.end(); ++ it)
497 if ((*it).uTag() ==
"NOX")
499 noxFlag_ = (*it).getImmutableValue<
int>();
505 OptionBlockMap::const_iterator obmIter =
optionBlockMap_.find(
"twolevel") ;
508 const Util::OptionBlock &option_blocktwoLevel = obmIter->second;
509 for (Util::ParamList::const_iterator it = option_blocktwoLevel.begin(); it != option_blocktwoLevel.end(); ++ it)
511 if ((*it).uTag() ==
"NOX")
520 for (Util::ParamList::const_iterator it = option_blocktran.begin(); it != option_blocktran.end(); ++ it)
522 if ((*it).uTag() ==
"NOX")
531 const Util::OptionBlock &option_blockhb = obmIter->second;
532 for (Util::ParamList::const_iterator it = option_blockhb.begin(); it != option_blockhb.end(); ++ it)
534 if ((*it).uTag() ==
"NOX")
536 noxFlag_ = (*it).getImmutableValue<
int>();
552 Xyce::dout() <<
"noxFlag is: " << (
noxFlag_ ?
"true" :
"false") << std::endl
553 <<
"noxFlagTransient is: " << (
noxFlagTransient_ ?
"true" :
"false") << std::endl;
576 Linear::System & linear_system,
578 Parallel::Manager & parallel_manager,
579 IO::InitialConditionsManager & initial_conditions_manager,
580 IO::OutputMgr & output_manager)
582 bool bsuccess =
true;
629 const Util::OptionBlock &option_block = (*it).second;
631 bsuccess = bsuccess && bs1;
637 const Util::OptionBlock &option_block = (*it).second;
639 bsuccess = bsuccess && bs1;
645 const Util::OptionBlock &option_block = (*it).second;
647 bsuccess = bsuccess && bs1;
653 const Util::OptionBlock &option_block = (*it).second;
655 bsuccess = bsuccess && bs1;
661 const Util::OptionBlock &option_block = (*it).second;
663 bsuccess = bsuccess && bs1;
669 const Util::OptionBlock &option_block = (*it).second;
671 bsuccess = bsuccess && bs1;
677 const Util::OptionBlock &option_block = (*it).second;
679 bsuccess = bsuccess && bs1;
685 const Util::OptionBlock &option_block = (*it).second;
687 bsuccess = bsuccess && bs1;
693 const Util::OptionBlock &option_block = (*it).second;
695 bsuccess = bsuccess && bs1;
701 const Util::OptionBlock &option_block = (*it).second;
703 bsuccess = bsuccess && bs1;
709 const Util::OptionBlock &option_block = (*it).second;
711 bsuccess = bsuccess && bs1;
733 Linear::System & linear_system,
735 Parallel::Manager & parallel_manager,
736 IO::InitialConditionsManager & initial_conditions_manager,
737 IO::OutputMgr & output_manager,
738 Topo::Topology & topology)
740 bool bsuccess =
true;
744 bs1 =
allocateSolver(analysis_manager, nonlinear_equation_loader, linear_system, data_store, parallel_manager, initial_conditions_manager, output_manager);
745 bsuccess = bsuccess && bs1;
775 Linear::System & linear_system,
777 Parallel::Manager & parallel_manager,
778 IO::OutputMgr & output_manager,
779 Topo::Topology & topology)
781 bool bsuccess =
true;
810 OptionBlockMap::const_iterator it =
optionBlockMap_.find(
"transient") ;
813 const Util::OptionBlock &option_block = (*it).second;
815 bsuccess = bsuccess && bs1;
867 exprPtr_ =
new Util::Expression(std::string(
"0"));
941 Parallel::Manager & parallel_manager,
942 Topo::Topology & topology)
944 bool bsuccess =
true;
948 Stats::StatTop _sensitivityStat(
"Setup");
951 bsuccess = bsuccess && b1;
965 std::vector<double> & objectiveVec,
966 std::vector<double> & dOdpVec,
967 std::vector<double> & dOdpAdjVec,
968 std::vector<double> & scaled_dOdpVec,
969 std::vector<double> & scaled_dOdpAdjVec)
973 Report::DevelFatal0().in(
"Manager::isSensitivity") <<
"Manager::enableSensitivity must be called first";
993 std::vector<double> & objectiveVec,
994 std::vector<double> & dOdpVec,
995 std::vector<double> & dOdpAdjVec,
996 std::vector<double> & scaled_dOdpVec,
997 std::vector<double> & scaled_dOdpAdjVec)
999 bool bsuccess =
true;
1001 if (!nlsSensitivityPtr_)
1003 Report::DevelFatal0().in(
"Manager::calcSensitivity") <<
"Manager::enableSensitivity must be called first";
1007 bsuccess = nlsSensitivityPtr_->solve(objectiveVec, dOdpVec, dOdpAdjVec, scaled_dOdpVec, scaled_dOdpAdjVec);
1023 Parallel::Manager & parallel_manager,
1024 Topo::Topology & topology)
1028 Report::DevelFatal0().in(
"Manager::setupSensitivity") <<
"Manager::enableSensitivity may only be called once";
1032 bool bsuccess =
true;
1042 const Util::OptionBlock &option_block = it->second;
1044 bsuccess = bsuccess && bs1;
1050 const Util::OptionBlock &option_block = it->second;
1052 bsuccess = bsuccess && bs1;
bool setTranOptions(const Util::OptionBlock &option_block)
bool enableSensitivity(TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, Topo::Topology &topology)
bool noxFlagTransient_
For 2-level newton, option for inner loop to use nox.
virtual bool getLocaFlag()
bool registerLoader(Loader::NonlinearEquationLoader *ptr)
virtual void setMatrixFreeFlag(bool matrixFreeFlag)
NonLinInfo getNonLinInfo() const
bool icSensitivity(std::vector< double > &objectiveVec, std::vector< double > &dOdpVec, std::vector< double > &dOdpAdjVec, std::vector< double > &scaled_dOdpVec, std::vector< double > &scaled_dOdpAdjVec)
virtual bool setTwoLevelLocaOptions(const Util::OptionBlock &OB)
bool setSensOptions(const Util::OptionBlock &option_block)
virtual int solve(NonLinearSolver *nlsTmpPtr=NULL)=0
bool setTwoLevelTranOptions(const Util::OptionBlock &option_block)
virtual bool setTranOptions(const Util::OptionBlock &OB)=0
virtual bool setTwoLevelOptions(const Util::OptionBlock &OB)
virtual bool setNodeSetOptions(const Util::OptionBlock &OB)
bool registerTIADataStore(TimeIntg::DataStore *tiaDSPtr)
bool calcSensitivity(std::vector< double > &objectiveVec, std::vector< double > &dOdpVec, std::vector< double > &dOdpAdjVec, std::vector< double > &scaled_dOdpVec, std::vector< double > &scaled_dOdpAdjVec)
bool registerParallelMgr(N_PDS_Manager *pdsMgrPtr)
Pure virtual class to augment a linear system.
OptionBlockMap optionBlockMap_
Use nox in transient phase of calculation.
virtual int getNumIterations() const =0
virtual void setReturnCodes(const ReturnCodes &retCodesTmp)
virtual bool setICOptions(const Util::OptionBlock &OB)
virtual bool isFirstSolveComplete() const =0
bool setTwoLevelLocaOptions(const Util::OptionBlock &option_block)
virtual bool isFirstContinuationParam() const =0
bool setLocaOptions(const Util::OptionBlock &option_block)
virtual void resetAll(AnalysisMode mode)
void setAnalysisMode(AnalysisMode mode)
bool firstContinuationParam
virtual bool setPetraOptions(const Util::OptionBlock &OB)
ConductanceExtractor * conductanceExtractorPtr_
virtual bool initializeAll()
bool allocateSolver(Analysis::AnalysisManager &analysis_manager, Loader::NonlinearEquationLoader &nonlinear_equation_loader, Linear::System &linear_system, TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, IO::InitialConditionsManager &initial_conditions_manager, IO::OutputMgr &output_manager)
Manager(const IO::CmdParse &command_line)
bool setNodeSetOptions(const Util::OptionBlock &option_block)
bool setLinSolOptions(const Util::OptionBlock &option_block)
void resetAll(AnalysisMode mode)
bool setSensitivityOptions(const Util::OptionBlock &option_block)
const ReturnCodes & getReturnCodes() const
bool registerInitialConditionsManager(IO::InitialConditionsManager *outPtr)
void setReturnCodes(const ReturnCodes &retCodeTmp)
virtual TwoLevelNewtonMode getCouplingMode()
bool registerPrecondFactory(const Linear::PrecondFactory *ptr)
bool icSensitivity(std::vector< double > &objectiveVec, std::vector< double > &dOdpVec, std::vector< double > &dOdpAdjVec, std::vector< double > &scaled_dOdpVec, std::vector< double > &scaled_dOdpAdjVec)
bool noxFlagInner_
Flag to determine if NOX is the solver in use.
bool setOptions(const Util::OptionBlock &OB)
TwoLevelNewtonMode twoLevelNewtonCouplingMode
bool initializeAll(Analysis::AnalysisManager &analysis_manager, Loader::NonlinearEquationLoader &nonlinear_equation_loader, Linear::System &linear_system, TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, IO::InitialConditionsManager &initial_conditions_manager, IO::OutputMgr &output_manager, Topo::Topology &topology)
virtual int getContinuationStep() const =0
bool registerPkgOptionsMgr(Manager &manager, const std::string netlist_filename, IO::PkgOptionsMgr &options_manager)
bool setSensitivityOptions(const Util::OptionBlock &OB)
bool noxFlag_
Flag to determine if we are doing 2-level newton or not.
Util::OptionBlock & getHBOptions()
const IO::CmdParse & commandLine_
bool setICOptions(const Util::OptionBlock &option_block)
bool setHBOptions(const Util::OptionBlock &option_block)
bool setOptions(const Util::OptionBlock &option_block)
bool setupSensitivity(TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, Topo::Topology &topology)
bool registerLinearSystem(Linear::System *ptr)
NonLinearSolver * nonlinearSolver_
bool setTwoLevelOptions(const Util::OptionBlock &option_block)
const Linear::PrecondFactory * lasPrecPtr_
Util::Expression * exprPtr_
Return Codes.
bool registerAnalysisManager(Analysis::AnalysisManager *tmp_anaIntPtr)
void allocateTranSolver(Analysis::AnalysisManager &analysis_manager, Loader::NonlinearEquationLoader &nonlinear_equation_loader, Linear::System &linear_system, TimeIntg::DataStore &data_store, Parallel::Manager ¶llel_manager, IO::OutputMgr &output_manager, Topo::Topology &topology)
virtual void setAnalysisMode(AnalysisMode mode)=0
virtual bool setHBOptions(const Util::OptionBlock &OB)=0
Sensitivity * nlsSensitivityPtr_
bool initializeAllFlag_
netlist option blocks until we know which
bool registerOutputMgr(IO::OutputMgr *outPtr)
virtual bool setDCOPRestartOptions(const Util::OptionBlock &OB)
virtual bool setOptions(const Util::OptionBlock &OB)=0
virtual bool setTwoLevelTranOptions(const Util::OptionBlock &OB)
bool setDCOPRestartOptions(const Util::OptionBlock &option_block)
bool setReturnCodeOption(const Util::Param ¶m)
virtual bool setLocaOptions(const Util::OptionBlock &OB)