46 #include <Xyce_config.h>
58 #include <N_ERH_ErrorMgr.h>
59 #include <N_LAS_Builder.h>
60 #include <N_LAS_Matrix.h>
61 #include <N_LAS_Problem.h>
62 #include <N_LAS_Solver.h>
63 #include <N_LAS_System.h>
64 #include <N_LAS_Vector.h>
68 #include <N_PDS_Comm.h>
69 #include <N_PDS_MPI.h>
70 #include <N_PDS_Manager.h>
71 #include <N_PDS_Serial.h>
73 #include <N_TOP_Topology.h>
74 #include <N_UTL_Algorithm.h>
75 #include <N_UTL_Diagnostic.h>
76 #include <N_UTL_Expression.h>
77 #include <N_UTL_ExtendedString.h>
78 #include <N_UTL_FeatureTest.h>
79 #include <N_UTL_OptionBlock.h>
96 Topo::Topology & topTmp,
97 const IO::CmdParse & cp)
101 solveDirectFlag_(false),
102 solveAdjointFlag_(true),
103 outputScaledFlag_(false),
104 outputUnscaledFlag_(true),
105 maxParamStringSize_(0),
106 stdOutputFlag_(true),
107 fileOutputFlag_(false),
108 dakotaFileOutputFlag_(false),
112 objFuncGiven_(false),
113 objFuncGIDsetup_(false),
121 sqrtEtaGiven_(false),
125 savedRHSVectorPtr_(0),
126 savedNewtonVectorPtr_(0),
244 std::string idString,
245 std::vector<double> & paramVals,
246 std::vector<double> & sensitivities,
247 std::vector<double> & scaled_sensitivities)
250 #ifdef Xyce_PARALLEL_MPI
251 N_PDS_Comm *pdsCommPtr =
pdsMgrPtr_->getPDSComm();
252 int myPID = pdsCommPtr->procID();
256 Xyce::dout() <<
"\n"<<idString <<
" Sensitivities of objective function:"
260 Xyce::dout() <<
"\t"<<std::setw(13)<<
"Value";
261 Xyce::dout() <<
"\t"<<std::setw(13)<<
"Sensitivity";
262 Xyce::dout() <<
"\t"<<std::setw(13)<<
"Normalized"<<std::endl;
268 Xyce::dout() <<
"\t" << std::setw(13)<< std::scientific<< std::setprecision(4)
269 << paramVals[iparam];
271 Xyce::dout() <<
"\t" << std::setw(13)<< std::scientific<< std::setprecision(4)
272 << sensitivities[iparam];
274 Xyce::dout() <<
"\t" << std::setw(13)<< std::scientific<< std::setprecision(4)
275 << scaled_sensitivities[iparam] << std::endl;
278 #ifdef Xyce_PARALLEL_MPI
279 pdsCommPtr->barrier();
292 std::string idString,
293 std::vector<double> & paramVals,
294 std::vector<double> & sensitivities,
295 std::vector<double> & scaled_sensitivities)
298 #ifdef Xyce_PARALLEL_MPI
299 N_PDS_Comm *pdsCommPtr =
pdsMgrPtr_->getPDSComm();
300 int myPID = pdsCommPtr->procID();
304 std::ostringstream numSolvesOStr;
306 std::string dodpFileName =
netlistFilename_ + numSolvesOStr.str() +
"_dodp" + idString +
".txt";
307 FILE *fp = fopen(dodpFileName.c_str(),
"w");
310 fprintf(fp,
"\t%16.8e\n", sensitivities[iparam]);
314 #ifdef Xyce_PARALLEL_MPI
315 pdsCommPtr->barrier();
328 std::string idString,
329 std::vector<double> & paramVals,
330 std::vector<double> & sensitivities,
331 std::vector<double> & scaled_sensitivities)
333 #ifdef Xyce_PARALLEL_MPI
334 N_PDS_Comm *pdsCommPtr =
pdsMgrPtr_->getPDSComm();
335 int myPID = pdsCommPtr->procID();
342 std::string dakotaFileName =
netlistFilename_ +
"_dodp" + idString +
"_all.txt";
343 FILE *fp2 = fopen(dakotaFileName.c_str(),
"w");
345 fprintf(fp2,
"%s",
"\n[\n");
348 fprintf(fp2,
"\t%16.8e\n", sensitivities[iparam]);
350 fprintf(fp2,
"%s",
"]\n");
353 #ifdef Xyce_PARALLEL_MPI
354 pdsCommPtr->barrier();
369 std::vector<double> & objectiveVec,
370 std::vector<double> & dOdpVec,
371 std::vector<double> & dOdpAdjVec,
372 std::vector<double> & scaled_dOdpVec,
373 std::vector<double> & scaled_dOdpAdjVec)
391 objectiveVec.clear();
449 std::vector<double> & objectiveVec,
450 std::vector<double> & dOdpVec,
451 std::vector<double> & dOdpAdjVec,
452 std::vector<double> & scaled_dOdpVec,
453 std::vector<double> & scaled_dOdpAdjVec)
455 Stats::StatTop _solveStat(
"Sensistivity Solve");
456 Stats::TimeBlock _solveTimer(_solveStat);
479 objectiveVec.clear();
581 Stats::StatTop _solveDirectStat(
"Solve Direct");
582 Stats::TimeBlock _solveDirectTimer(_solveDirectStat);
584 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
585 Xyce::dout() << std::endl
586 <<
"In Sensitivity::solveDirect" << std::endl;
604 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
615 rhsVectorPtr_->update(1.0, *(sensRHSPtrVector[iparam]), 0.0);
623 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
625 Xyce::dout() <<
"iparam="<<iparam <<
"\t" <<
paramNameVec_[iparam] <<std::endl;
628 Xyce::dout() <<
"dXdp[" << std::setw(3) << k <<
"] = "<< std::setw(15)<< std::scientific
629 << std::setprecision(8)<< (*(dXdpPtrVector_[iparam]))[k]
633 std::ostringstream filename;
635 filename << std::setw(3) << std::setfill(
'0') << iparam;
637 dXdpPtrVector_[iparam]->writeToFile(const_cast<char *>(filename.str().c_str()));
642 bool Transpose =
false;
643 (DQdxDXdpPtrVector_[iparam])->putScalar(0.0);
644 dQdx.matvec( Transpose , *(dXdpPtrVector_[iparam]), *(DQdxDXdpPtrVector_[iparam]) );
658 double tmp =
dOdXVectorPtr_->dotProduct( (*(dXdpPtrVector_[iparam])) );
711 bool bsuccess =
true;
720 bool foundLocal(
false);
721 bool foundLocal2(
false);
723 N_PDS_Comm & comm = *(
pdsMgrPtr_->getPDSComm());
724 int myPID = comm.procID();
734 std::vector<int> svGIDList1, dummyList;
736 foundLocal =
top_.getNodeSVarGIDs(NodeID(
expVarNames_[i], Xyce::_VNODE), svGIDList1, dummyList, type1);
737 found =
static_cast<int>(foundLocal);
738 Xyce::Parallel::AllReduce(comm.comm(), MPI_LOR, &found, 1);
743 foundLocal2 =
top_.getNodeSVarGIDs(NodeID(
expVarNames_[i], Xyce::_DNODE), svGIDList1, dummyList, type1);
745 found2 =
static_cast<int>(foundLocal2);
746 Xyce::Parallel::AllReduce(comm.comm(), MPI_LOR, &found2, 1);
748 if (!found && !found2)
750 static std::string tmp =
"objective function variable not found!\n";
751 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::USR_FATAL, tmp);
757 if(svGIDList1.size()==1)
759 tmpGID = svGIDList1.front();
779 tmpVal = (*nextSolVectorPtrPtr_)->getElementByGlobalIndex(tmpGID, 0);
782 Xyce::Parallel::AllReduce(comm.comm(), MPI_MAX, &root, 1);
784 comm.bcast( &tmpVal, 1, root );
799 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
801 Xyce::dout() <<
"i="<<i<<
" gid = " << tmpGID <<
" dodx = "<< tmpDODX << std::endl;
815 Report::UserWarning0() <<
"Objective function was not specified";
820 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
823 dOdXVectorPtr_->writeToFile(const_cast<char *>(filename.c_str()));
840 Stats::StatTop _solveAdjointStat(
"Solve Adjoint");
841 Stats::TimeBlock _solveAdjointTimer(_solveAdjointStat);
843 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
845 Xyce::dout() << std::endl;
846 Xyce::dout() <<
"In Sensitivity::solveAdjoint" << std::endl;
860 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
872 std::string msg(
"Sensitivity::solveAdjoint. Solver failed\n");
873 N_ERH_ErrorMgr::report (N_ERH_ErrorMgr::DEV_FATAL, msg);
880 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
893 Linear::Vector & RHSVec = *(sensRHSPtrVector[iparam]);
894 Linear::Vector & dfdpVec = *(dfdpPtrVector_[iparam]);
895 Linear::Vector & dbdpVec = *(dbdpPtrVector_[iparam]);
896 RHSVec.linearCombo(0.0,RHSVec,+1.0,dfdpVec);
897 RHSVec.linearCombo(1.0,RHSVec,-1.0,dbdpVec);
961 Linear::System & lasSys_ = (*lasSysPtr_);
979 std::vector<std::string>::iterator firstParam =
paramNameVec_.begin ();
980 std::vector<std::string>::iterator lastParam =
paramNameVec_.end ();
981 std::vector<std::string>::iterator iterParam;
982 for ( iterParam=firstParam, iparam=0;
983 iterParam!=lastParam; ++iterParam, ++iparam )
985 std::string paramName(*iterParam);
989 double paramOrig = 0.0;
993 std::string msg(
"Sensitivity::loadSensitivityResiduals: cannot find parameter ");
995 N_ERH_ErrorMgr::report (N_ERH_ErrorMgr::DEV_FATAL, msg);
1000 bool analyticAvailable =
false;
1005 if (analyticAvailable)
1007 std::vector<double> dfdpVec;
1008 std::vector<double> dqdpVec;
1009 std::vector<double> dbdpVec;
1011 std::vector<int> FindicesVec;
1012 std::vector<int> QindicesVec;
1013 std::vector<int> BindicesVec;
1016 dfdpVec,dqdpVec,dbdpVec,
1017 FindicesVec, QindicesVec, BindicesVec);
1019 dfdpPtrVector_[iparam]->putScalar(0.0);
1020 dqdpPtrVector_[iparam]->putScalar(0.0);
1021 dbdpPtrVector_[iparam]->putScalar(0.0);
1023 int Fsize=FindicesVec.size();
1024 for (
int i=0;i<Fsize;++i)
1026 Linear::Vector & dfdpRef = *(dfdpPtrVector_[iparam]);
1027 dfdpRef[FindicesVec[i]] += dfdpVec[i];
1030 int Qsize=QindicesVec.size();
1031 for (
int i=0;i<Qsize;++i)
1033 Linear::Vector & dqdpRef = *(dqdpPtrVector_[iparam]);
1034 dqdpRef[QindicesVec[i]] += dqdpVec[i];
1037 int Bsize=BindicesVec.size();
1038 for (
int i=0;i<Bsize;++i)
1040 Linear::Vector & dbdpRef = *(dbdpPtrVector_[iparam]);
1041 dbdpRef[BindicesVec[i]] += dbdpVec[i];
1044 dfdpPtrVector_[iparam]->fillComplete();
1045 dqdpPtrVector_[iparam]->fillComplete();
1046 dbdpPtrVector_[iparam]->fillComplete();
1048 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
1050 Xyce::dout() << *iterParam <<
": ";
1051 Xyce::dout().setf(std::ios::scientific);
1052 Xyce::dout() << std::endl;
1057 <<
"dfdp["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dfdpPtrVector_[iparam]))[k1]
1058 <<
" dqdp["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dqdpPtrVector_[iparam]))[k1]
1059 <<
" dbdp["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dbdpPtrVector_[iparam]))[k1]
1066 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
1068 Xyce::dout() << std::endl <<
" Calculating numerical df/dp, dq/dp and db/dp for: ";
1069 Xyce::dout() << *iterParam << std::endl;
1078 double dp =
sqrtEta_ * (1.0 + fabs(paramOrig));
1079 double paramPerturbed = paramOrig;
1083 paramPerturbed += dp;
1087 paramPerturbed -= dp;
1091 static std::string tmp =
"difference=central not supported.\n";
1092 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::USR_FATAL_0, tmp);
1096 static std::string tmp =
"difference not recognized!\n";
1097 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::USR_FATAL_0, tmp);
1100 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
1103 <<
" dp = " << std::setw(11)<< std::scientific<< std::setprecision(4) << dp
1104 <<
" original value = " << std::setw(16)<< std::scientific<< std::setprecision(9) << paramOrig
1105 <<
" modified value = " << std::setw(16)<< std::scientific<< std::setprecision(9) << paramPerturbed
1124 dfdpPtrVector_[iparam]->putScalar(0.0);
1127 dfdpPtrVector_[iparam]->scale(rdp);
1130 dqdpPtrVector_[iparam]->putScalar(0.0);
1133 dqdpPtrVector_[iparam]->scale(rdp);
1136 dbdpPtrVector_[iparam]->putScalar(0.0);
1139 dbdpPtrVector_[iparam]->scale(rdp);
1141 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
1143 Xyce::dout() << *iterParam <<
": ";
1144 Xyce::dout().width(15); Xyce::dout().precision(7); Xyce::dout().setf(std::ios::scientific);
1145 Xyce::dout() <<
"deviceSens_dp = " << dp << std::endl;
1151 <<
"fpert["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
pertFVectorPtr_))[k1]
1152 <<
" forig["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
origFVectorPtr_))[k1]
1153 <<
" dfdp ["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dfdpPtrVector_[iparam]))[k1]
1157 Xyce::dout() << std::endl;
1161 <<
"qpert["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
pertQVectorPtr_))[k1]
1162 <<
" qorig["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
origQVectorPtr_))[k1]
1163 <<
" dqdp ["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dqdpPtrVector_[iparam]))[k1]
1167 Xyce::dout() << std::endl ;
1171 <<
"bpert["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
pertBVectorPtr_))[k1]
1172 <<
" borig["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(
origBVectorPtr_))[k1]
1173 <<
" dbdp ["<<std::setw(3)<<k1<<
"]= "<<std::setw(15)<<std::scientific<<std::setprecision(8)<<(*(dbdpPtrVector_[iparam]))[k1]
1178 std::ostringstream filename;
1180 filename << std::setw(3) << std::setfill(
'0') << iparam;
1182 dfdpPtrVector_[iparam]->writeToFile(const_cast<char *>(filename.str().c_str()));
1185 filename << netlistFilename_ <<
"_fpert";
1186 filename << std::setw(3) << std::setfill(
'0') << iparam;
1188 pertFVectorPtr_->writeToFile(const_cast<char *>(filename.str().c_str()));
1191 filename << netlistFilename_ <<
"_dqdp";
1192 filename << std::setw(3) << std::setfill(
'0') << iparam;
1194 dqdpPtrVector_[iparam]->writeToFile(const_cast<char *>(filename.str().c_str()));
1197 filename << netlistFilename_ <<
"_qpert";
1198 filename << std::setw(3) << std::setfill(
'0') << iparam;
1200 pertQVectorPtr_->writeToFile(const_cast<char *>(filename.str().c_str()));
1203 filename << netlistFilename_ <<
"_dbdp";
1204 filename << std::setw(3) << std::setfill(
'0') << iparam;
1206 dbdpPtrVector_[iparam]->writeToFile(const_cast<char *>(filename.str().c_str()));
1209 filename << netlistFilename_ <<
"_bpert";
1210 filename << std::setw(3) << std::setfill(
'0') << iparam;
1212 pertBVectorPtr_->writeToFile(const_cast<char *>(filename.str().c_str()));
1239 bool bsuccess =
true;
1240 Util::ParamList::const_iterator iter = OB.begin();
1241 Util::ParamList::const_iterator end = OB.end();
1244 for ( ; iter != end; ++ iter)
1246 if (iter->uTag() ==
"OBJFUNC")
1249 expPtr_ =
new Util::Expression(iter->stringValue());
1252 else if ( std::string( iter->uTag() ,0,5) ==
"PARAM")
1254 ExtendedString tag = iter->stringValue();
1259 int sz = tag.size();
1267 Xyce::Report::UserWarning() << iter->uTag()
1268 <<
" is not a recognized sensitivity solver option.\n" << std::endl;
1279 std::vector<std::string> nodes;
1280 expPtr_->get_names(XEXP_NODE, nodes);
1281 std::vector<std::string> instances;
1282 expPtr_->get_names(XEXP_INSTANCE, instances);
1286 std::vector<std::string>::iterator iter;
1287 for (iter=instances.begin();iter!=instances.end();++iter)
1289 ExtendedString tmpString = *iter;
1290 tmpString.toUpper ();
1307 if (DEBUG_NONLINEAR && isActive(Diag::SENS_NONLINEAR_SOLVER))
1309 std::vector<std::string>::iterator iter;
1310 std::vector<std::string>::iterator begin =
paramNameVec_.begin();
1311 std::vector<std::string>::iterator end =
paramNameVec_.end ();
1313 for (iter=begin;iter!=end;++iter)
1315 Xyce::dout() << *iter<<std::endl;
1334 bool bsuccess =
true;
1335 Util::ParamList::const_iterator it = OB.begin();
1336 Util::ParamList::const_iterator end = OB.end();
1337 for ( ; it != end; ++ it)
1339 if ((*it).uTag() ==
"ADJOINT")
1342 static_cast<bool>((*it).getImmutableValue<
bool>());
1344 else if ((*it).uTag() ==
"DIRECT")
1347 static_cast<bool>((*it).getImmutableValue<
bool>());
1349 else if ((*it).uTag() ==
"OUTPUTSCALED")
1352 static_cast<bool>((*it).getImmutableValue<
bool>());
1354 else if ((*it).uTag() ==
"OUTPUTUNSCALED")
1357 static_cast<bool>((*it).getImmutableValue<
bool>());
1359 else if ((*it).uTag() ==
"STDOUTPUT")
1362 static_cast<bool>((*it).getImmutableValue<
bool>());
1364 else if ((*it).uTag() ==
"DAKOTAFILE")
1367 static_cast<bool>((*it).getImmutableValue<
bool>());
1369 else if ((*it).uTag() ==
"DIAGNOSTICFILE")
1372 static_cast<bool>((*it).getImmutableValue<
bool>());
1374 else if ((*it).uTag() ==
"FORCEFD")
1377 static_cast<bool>((*it).getImmutableValue<
bool>());
1379 else if ((*it).uTag() ==
"DIFFERENCE")
1381 ExtendedString sval=(*it).stringValue();
1387 else if(sval==
"REVERSE")
1391 else if(sval==
"CENTRAL")
1394 static std::string tmp =
"difference=central not supported.\n";
1395 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::USR_FATAL_0, tmp);
1399 static std::string tmp =
"difference not recognized!\n";
1400 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::USR_FATAL_0, tmp);
1403 else if ((*it).uTag() ==
"SQRTETA")
1405 sqrtEta_ = (*it).getImmutableValue<
double>();
1408 else if ((*it).uTag() ==
"REUSEFACTORS")
1412 else if (DEBUG_NONLINEAR && (*it).uTag() ==
"DEBUGLEVEL")
1415 Xyce::setNonlinearSensitivityDebugLevel(
debugLevel_);
1419 Xyce::Report::UserWarning() << (*it).uTag()
1420 <<
" is not a recognized sensitivity solver option.\n" << std::endl;
1441 bool bsuccess =
true;
1455 bool bsuccess =
true;
std::vector< double > paramOrigVals_
std::string objFuncString_
virtual int getMaxNormFindex() const =0
Linear::Vector * origFVectorPtr_
Linear::Vector * pertBVectorPtr_
Linear::Vector * lambdaVectorPtr_
bool getParamAndReduce(const std::string &name, double &val) const
virtual bool enableSensitivity()
std::vector< Linear::Vector * > nextDqdpPtrVector
void dakOutput(std::string idString, std::vector< double > ¶mVals, std::vector< double > &sensitivities, std::vector< double > &scaled_sensitivities)
Pure virtual class to augment a linear system.
bool analyticSensitivitiesAvailable(std::string &name)
std::vector< double > dOdpVec_
std::vector< double > scaled_dOdpVec_
void allocateSensitivityArrays(Linear::Builder &builder, int numParams)
bool dakotaFileOutputFlag_
std::vector< Linear::Vector * > nextDXdpPtrVector
std::string netlistFilename_
std::vector< double > scaled_dOdpAdjVec_
int solve(NonLinearSolver *nlsTmpPtr=NULL)
std::vector< Linear::Vector * > nextDbdpPtrVector
Linear::Vector * dOdXVectorPtr_
Linear::Vector * pertFVectorPtr_
Linear::Vector * origQVectorPtr_
std::vector< Linear::Vector * > nextDfdpPtrVector
Linear::Vector * rhsVectorPtr_
TimeIntg::DataStore * dsPtr_
Linear::Vector * gradVectorPtr_
Linear::Vector * savedNewtonVectorPtr_
std::vector< double > objectiveVec_
std::vector< Linear::Vector * > currDXdpPtrVector
void stdOutput(std::string idString, std::vector< double > ¶mVals, std::vector< double > &sensitivities, std::vector< double > &scaled_sensitivities)
bool loadSensitivityResiduals()
Linear::Matrix * jacobianMatrixPtr_
bool setParam(std::string &name, double val, bool overrideOriginal=false)
Linear::Vector * daeQVectorPtr
N_PDS_Manager * pdsMgrPtr_
std::vector< double > expVarVals_
const Analysis::AnalysisManager & getAnalysisManager() const
void fileOutput(std::string idString, std::vector< double > ¶mVals, std::vector< double > &sensitivities, std::vector< double > &scaled_sensitivities)
Sensitivity(NonLinearSolver &nls_, Topo::Topology &top_, const IO::CmdParse &cp)
Linear::System * lasSysPtr_
Linear::Vector ** nextSolVectorPtrPtr_
Linear::Solver * lasSolverPtr_
Linear::Vector * daeFVectorPtr
bool setTranOptions(const Util::OptionBlock &OB)
bool loadFinalSensitivityDerivatives()
bool icSensitivity(std::vector< double > &objectiveVec, std::vector< double > &dOdpVec, std::vector< double > &dOdpAdjVec, std::vector< double > &scaled_dOdpVec, std::vector< double > &scaled_dOdpAdjVec)
void getAnalyticSensitivities(std::string &name, std::vector< double > &dfdpVec, std::vector< double > &dqdpVec, std::vector< double > &dbdpVec, std::vector< int > &FindicesVec, std::vector< int > &QindicesVec, std::vector< int > &BindicesVec) const
bool setOptions(const Util::OptionBlock &OB)
bool loadSensitivityResiduals()
Util::Expression * expPtr_
std::vector< std::string > expVarNames_
bool setHBOptions(const Util::OptionBlock &OB)
bool setSensitivityOptions(const Util::OptionBlock &OB)
Linear::Vector * savedRHSVectorPtr_
Linear::Vector * solWtVectorPtr_
Linear::Vector * NewtonVectorPtr_
Linear::Vector * origBVectorPtr_
int getMaxNormFindex() const
std::vector< double > dOdpAdjVec_
bool registerAnalysisManager(Analysis::AnalysisManager *tmp_anaIntPtr)
Linear::Vector * pertQVectorPtr_
Linear::Vector ** currSolVectorPtrPtr_
std::vector< double > expVarDerivs_
Loader::NonlinearEquationLoader * loaderPtr_
std::vector< Linear::Vector * > sensRHSPtrVector
Linear::Matrix * dQdxMatrixPtr
std::vector< int > expVarGIDs_
Util::OptionBlock * petraOptionBlockPtr_
Linear::Vector * daeBVectorPtr
std::vector< Linear::Vector * > nextDQdxDXdpPtrVector
virtual double getMaxNormF() const =0
double getMaxNormF() const
std::vector< std::string > paramNameVec_