46 #include <Xyce_config.h>
50 #include <N_UTL_Math.h>
61 #include <N_ERH_ErrorMgr.h>
63 #include <N_LAS_Vector.h>
64 #include <N_LAS_Matrix.h>
65 #include <N_LAS_Util.h>
67 #include <N_UTL_Expression.h>
68 #include <N_UTL_FeatureTest.h>
69 #include <N_IO_mmio.h>
71 #include <Teuchos_BLAS.hpp>
72 #include <Teuchos_Utils.hpp>
73 #include <Teuchos_LAPACK.hpp>
79 #undef HAVE_INTTYPES_H
82 #include <Trilinos_Util.h>
142 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
157 lastTimeStepNumber(0)
169 if (
given(
"BASE_FILENAME"))
171 FILE *c_file, *g_file, *b_file, *l_file;
172 Xyce::IO::MMIO::MM_typecode mat_code;
178 c_file = fopen(cfile.c_str(),
"r");
179 g_file = fopen(gfile.c_str(),
"r");
180 b_file = fopen(bfile.c_str(),
"r");
181 l_file = fopen(lfile.c_str(),
"r");
182 if (c_file == NULL || g_file == NULL || b_file == NULL || l_file == NULL)
184 UserFatal0(*
this) <<
"Cannot open one of the ROM files: " << cfile <<
"," << gfile <<
"," << bfile <<
"," << lfile;
188 Xyce::IO::MMIO::mm_read_banner( b_file, &mat_code );
189 Xyce::IO::MMIO::mm_read_mtx_array_size( b_file, &M, &N );
215 Xyce::IO::MMIO::mm_read_banner( l_file, &mat_code );
216 Xyce::IO::MMIO::mm_read_mtx_array_size( l_file, &tmpM, &tmpN );
219 for (
int i=0; i<M*N; i++)
221 fscanf(b_file,
"%lg\n", &
Bhat[i]);
222 fscanf(l_file,
"%lg\n", &
Lhat[i]);
227 Xyce::IO::MMIO::mm_read_banner( c_file, &mat_code );
234 Xyce::IO::MMIO::mm_read_mtx_array_size( c_file, &tmpM, &tmpN );
238 if (mm_is_general(mat_code))
241 for (
int i=0; i<M*
M; i++)
243 fscanf(c_file,
"%lg\n", &
Chat[i]);
246 else if (mm_is_symmetric(mat_code) || mm_is_skew(mat_code))
248 int arraySize = M*(M+1)/2;
249 std::vector<double> Chat_tmp( arraySize );
251 for (
int i=0; i<arraySize; i++)
253 fscanf(c_file,
"%lg\n", &Chat_tmp[i]);
256 for (
int j=0; j<
M; j++)
258 for (
int i=j; i<
M; i++)
260 double val = Chat_tmp[j*M - j*(j-1)/2 + i - j];
264 if (mm_is_symmetric(mat_code))
274 UserFatal0(*
this) <<
"Do not recognize the Matrix Market format for Chat (matrix is not general or symmetric)";
280 Xyce::IO::MMIO::mm_read_mtx_crd_size( c_file, &tmpM, &tmpN, &nnz );
283 UserFatal0(*
this) <<
"Chat has zero entries according to the Matrix Market file " << cfile;
287 std::vector<double> Chat_tmp( nnz );
288 std::vector<int> rowIdx( nnz ), colIdx( nnz );
291 Xyce::IO::MMIO::mm_read_mtx_crd_data( c_file, tmpM, tmpN, nnz, &rowIdx[0], &colIdx[0], &Chat_tmp[0], mat_code );
294 for (
int i=0; i<nnz; ++i)
300 if (mm_is_symmetric(mat_code) || mm_is_skew(mat_code))
302 if (rowIdx[i]!=colIdx[i])
304 if (mm_is_symmetric(mat_code))
306 rowIdx.push_back(colIdx[i]);
307 colIdx.push_back(rowIdx[i]);
308 Chat_tmp.push_back(Chat_tmp[i]);
312 rowIdx.push_back(colIdx[i]);
313 colIdx.push_back(rowIdx[i]);
314 Chat_tmp.push_back(-Chat_tmp[i]);
321 int nnz2 = rowIdx.size();
335 Xyce::IO::MMIO::mm_read_banner( g_file, &mat_code );
342 Xyce::IO::MMIO::mm_read_mtx_array_size( g_file, &tmpM, &tmpN );
346 if (mm_is_general(mat_code))
349 for (
int i=0; i<M*
M; i++)
351 fscanf(g_file,
"%lg\n", &
Ghat[i]);
354 else if (mm_is_symmetric(mat_code) || mm_is_skew(mat_code))
356 int arraySize = M*(M+1)/2;
357 std::vector<double> Ghat_tmp( arraySize );
359 for (
int i=0; i<arraySize; i++)
361 fscanf(g_file,
"%lg\n", &Ghat_tmp[i]);
364 for (
int j=0; j<
M; j++)
366 for (
int i=j; i<
M; i++)
368 double val = Ghat_tmp[j*M - j*(j-1)/2 + i - j];
372 if (mm_is_symmetric(mat_code))
382 UserFatal0(*
this) <<
"Do not recognize the Matrix Market format for Ghat (matrix is not general or symmetric)";
388 Xyce::IO::MMIO::mm_read_mtx_crd_size( g_file, &tmpM, &tmpN, &nnz );
391 UserFatal0(*
this) <<
"Ghat has zero entries according to the Matrix Market file " << gfile;
395 std::vector<double> Ghat_tmp( nnz );
396 std::vector<int> rowIdx( nnz ), colIdx( nnz );
399 Xyce::IO::MMIO::mm_read_mtx_crd_data( g_file, tmpM, tmpN, nnz, &rowIdx[0], &colIdx[0], &Ghat_tmp[0], mat_code );
402 for (
int i=0; i<nnz; ++i)
408 if (mm_is_symmetric(mat_code) || mm_is_skew(mat_code))
410 if (rowIdx[i]!=colIdx[i])
412 if (mm_is_symmetric(mat_code))
414 rowIdx.push_back(colIdx[i]);
415 colIdx.push_back(rowIdx[i]);
416 Ghat_tmp.push_back(Ghat_tmp[i]);
420 rowIdx.push_back(colIdx[i]);
421 colIdx.push_back(rowIdx[i]);
422 Ghat_tmp.push_back(-Ghat_tmp[i]);
429 int nnz2 = rowIdx.size();
447 std::vector<int>::iterator it;
448 std::vector<int>::iterator itCG =
CG_colIdx.begin();
449 std::vector<int>::iterator itChat =
Chat_colIdx.begin();
450 std::vector<int>::iterator itGhat =
Ghat_colIdx.begin();
452 for (
int i=0; i<
M; ++i)
458 it = set_union( itChat, itChat + numEntriesChat, itGhat, itGhat + numEntriesGhat, itCG );
464 itChat += numEntriesChat;
465 itGhat += numEntriesGhat;
478 G2.resize((M+N)*(M+N));
479 C2.resize((M+N)*(M+N));
480 A2.resize((M+N)*(M+N));
481 A2last.resize((M+N)*(M+N));
484 A2sol.resize((M+N)*N);
500 for(
int iy=0; iy<
M; iy++)
502 for(
int ix=0; ix<
M; ix++)
503 G2[((N+M+1)*N)+ix+(M+N)*iy] =
Ghat[ix+iy*M];
508 for (
int ix=0; ix<
M; ix++)
515 for(
int ix=0; ix<N; ix++)
517 for(
int ix=0; ix<
M; ix++)
519 for(
int iy=0; iy<N; iy++)
520 G2[((M+N)*N)+iy+(M+N)*ix] = -
Lhat[ix+iy*
M];
525 for(
int iy=0; iy<
M; iy++)
527 for(
int ix=0; ix<
M; ix++)
528 C2[((N+M+1)*N)+ix+(M+N)*iy] =
Chat[ix+iy*
M];
533 for (
int ix=0; ix<
M; ix++)
541 for(
int iy=0; iy<N; iy++)
543 for(
int ix=0; ix<
M; ix++)
544 G2p[N+ix+(M+N)*iy] = -
Bhat[ix+iy*
M];
548 for(
int iy=0; iy<N; iy++)
611 for (
int j=numExtVars; j<numEntries; j++)
616 for (
int j=numExtVars; j<numEntries; j++)
656 const std::vector<int> & extLIDVecRef)
676 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
678 Xyce::dout() << section_divider << std::endl;
680 Xyce::dout() <<
"::registerLIDs:\n";
681 Xyce::dout() <<
" name = " <<
getName() << std::endl;
683 Xyce::dout() <<
"\nsolution indices:\n";
685 Xyce::dout() <<
" li_up[" << i <<
"] = " <<
extLIDVec[i] << std::endl;
689 Xyce::dout() <<
" li_ip[" << i <<
"] = " << intLIDVec[i] << std::endl;
692 Xyce::dout() <<
" li_ROM[" << i <<
"] = " <<
li_ROM[i] << std::endl;
694 Xyce::dout() << section_divider << std::endl;
810 for (
int j=0, Cidx=0; j<nnz && Cidx<Cnnz; j++)
831 for (
int j=0, Gidx=0; j<nnz && Gidx<Gnnz; j++)
853 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
855 Xyce::dout() << Xyce::section_divider << std::endl;
856 Xyce::dout() <<
"Instance::registerJacLIDs\n";
859 Xyce::dout() <<
" AEqu_up_NodeOffset: ";
862 Xyce::dout() << std::endl;
863 Xyce::dout() <<
" AEqu_ip_NodeOffset: ";
866 Xyce::dout() << std::endl;
867 Xyce::dout() <<
" AROMEqu_Lt_NodeOffset: ";
870 Xyce::dout() << std::endl;
871 Xyce::dout() <<
" AROMEqu_B_NodeOffset: " << std::endl;
876 Xyce::dout() << std::endl;
878 Xyce::dout() <<
" AROMEqu_GpC_NodeOffset: ";
881 Xyce::dout() << std::endl;
883 Xyce::dout() << Xyce::section_divider << std::endl;
899 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
995 i_ip[i] = solVec[intLIDVec[i]];
997 double * xhat = &solVec[
li_ROM[0]];
999 Teuchos::BLAS<int, double> blas;
1002 blas.GEMV( Teuchos::TRANS,
numROMVars, numExtVars, -1.0, &
Lhat[0],
numROMVars, xhat, 1, 1.0, &
Fhat[0], 1 );
1008 blas.GEMV( Teuchos::NO_TRANS,
numROMVars,
numROMVars, 1.0, &
Ghat[0],
numROMVars, xhat, 1, 0.0, &
Fhat[numExtVars], 1 );
1009 blas.GEMV( Teuchos::NO_TRANS,
numROMVars, numExtVars, -1.0, &
Bhat[0],
numROMVars, &v_up[0], 1, 1.0, &
Fhat[numExtVars], 1 );
1015 blas.GEMV( Teuchos::NO_TRANS,
numROMVars,
numROMVars, 1.0, &
Chat[0],
numROMVars, xhat, 1, 0.0, &
Qhat[0], 1 );
1017 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1019 Xyce::dout() <<
" ----------------------------------" << std::endl;
1020 Xyce::dout() <<
"Instance::updatePrimaryState:" << std::endl;
1047 (*maskVectorPtr)[
li_ROM[i]] = 0.0;
1267 std::vector<Instance*>::iterator iter;
1271 for (iter=first; iter!=last; ++iter)
1273 (*iter)->processParams();
1292 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
1319 std::vector<Instance*>::iterator iter;
1323 for (iter=first; iter!=last; ++iter)
1341 std::vector<Instance*>::const_iterator iter;
1349 os <<
"Number of ROM instances: " << isize << std::endl;
1350 os <<
" name\t\tmodelName\tParameters" << std::endl;
1352 for (i = 0, iter = first; iter != last; ++iter, ++i)
1354 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1380 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1397 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1399 Xyce::dout() <<
" ----------------------------------" << std::endl;
1400 Xyce::dout() <<
" Master::updateState: " << std::endl;
1407 Teuchos::BLAS<int, double> blas;
1410 const char test =
'N';
1438 Xyce::dout() <<
"Bad 'USE_PORT_DESCRIPTION' flag" << std::endl;
1451 std::vector<double> lastStaVec, currStaVec, nextStaVec;
1452 lastStaVec.resize(M+N,0);
1453 currStaVec.resize(M+N,0);
1454 nextStaVec.resize(M+N,0);
1457 std::vector<double> lastPortVec, currPortVec, nextPortVec;
1458 lastPortVec.resize(N,0);
1459 currPortVec.resize(N,0);
1460 nextPortVec.resize(N,0);
1461 for(
int ix=0; ix<N; ++ix)
1465 nextPortVec[ix] = solVec[ci.
extLIDVec[ix]];
1475 Teuchos::LAPACK<int,double> lapack;
1476 std::vector<int> ipiv_A2last (M+N, 0);
1477 int info_A2, info_A2last, info2_A2, info2_A2last;
1484 int updateCurrStaVec=0;
1486 if (sameTimeStep==0) {updateCurrStaVec=1; }
1487 if (updateCurrStaVec==1) {
1488 blas.GEMV( Teuchos::NO_TRANS,N+M,N+M,-(1-ci.
coefLast),&ci.
G2[0],M+N,&lastStaVec[0],1,0.0,&currStaVec[0],1 );
1489 blas.GEMV( Teuchos::NO_TRANS,N+M,N+M,ci.
alph_last,&ci.
C2[0],M+N,&lastStaVec[0],1,1.0,&currStaVec[0],1 );
1490 blas.GEMV( Teuchos::NO_TRANS,N+M,N,-ci.
coefLast,&ci.
G2p[0],N+M,&currPortVec[0],1, 1.0,&currStaVec[0],1 );
1491 blas.GEMV( Teuchos::NO_TRANS,N+M,N,-(1-ci.
coefLast),&ci.
G2p[0],N+M,&lastPortVec[0],1,1.0,&currStaVec[0],1 );
1496 lapack.GETRS(test, M+N, 1, &ci.
A2[0], M+N, &ci.
ipiv_A2[0], &currStaVec[0], M+N, &info2_A2);
1499 lapack.GETRF( M+N, M+N, &ci.
A2last[0], M+N, &ipiv_A2last[0], &info_A2last);
1500 lapack.GETRS(test, M+N, 1, &ci.
A2last[0], M+N, &ipiv_A2last[0], &currStaVec[0], M+N, &info2_A2last);
1519 for(
int ix=0; ix<(M+N)*(M+N); ix++) { ci.
A2[ix]= (ci.
alph*ci.
C2[ix]) + (ci.
coef*ci.
G2[ix]); }
1520 lapack.GETRF( M+N, M+N, &ci.
A2[0], M+N, &ci.
ipiv_A2[0], &info_A2);
1521 for(
int ix=0; ix<(M+N)*N; ix++) { ci.
A2sol[ix] = ci.
coef * ci.
G2p[ix]; }
1522 lapack.GETRS(test, M+N, N, &ci.
A2[0], M+N, &ci.
ipiv_A2[0], &ci.
A2sol[0], M+N, &info2_A2);
1523 blas.GEMM(Teuchos::NO_TRANS, Teuchos::NO_TRANS, N, N, M+N, -1.0,&ci.
Gp2[0],N,&ci.
A2sol[0],M+N,0.0,&ci.
Jstamp[0], N);
1531 blas.GEMV( Teuchos::NO_TRANS,N+M,N+M,-(1-ci.
coef),&ci.
G2[0],M+N,&currStaVec[0],1,0.0,&nextStaVec[0],1 );
1532 blas.GEMV( Teuchos::NO_TRANS,N+M,N+M,ci.
alph,&ci.
C2[0],M+N,&currStaVec[0],1,1.0,&nextStaVec[0],1 );
1533 blas.GEMV( Teuchos::NO_TRANS,N+M,N,-ci.
coef,&ci.
G2p[0],N+M,&nextPortVec[0],1, 1.0,&nextStaVec[0],1 );
1534 blas.GEMV( Teuchos::NO_TRANS,N+M,N,-(1-ci.
coef),&ci.
G2p[0],N+M,&currPortVec[0],1,1.0,&nextStaVec[0],1 );
1535 lapack.GETRS(test, M+N, 1, &ci.
A2[0], M+N, &ci.
ipiv_A2[0], &nextStaVec[0], M+N, &info2_A2);
1544 blas.GEMV( Teuchos::NO_TRANS,N,N+M,1.0,&ci.
Gp2[0],N,&nextStaVec[0],1,0.0,&ci.
Fstamp[0],1 );
1556 std::vector<double> v_up(N);
1557 for (
int i=0; i<N; ++i)
1563 double * xhat = &solVec[ci.
li_ROM[0]];
1566 blas.GEMV( Teuchos::TRANS, ci.
numROMVars, ci.
numExtVars, -1.0, &ci.
Lhat[0], ci.
numROMVars, xhat, 1, 1.0, &ci.
Fhat[0], 1 );
1576 blas.GEMV( Teuchos::NO_TRANS, ci.
numROMVars, ci.
numROMVars, 1.0, &ci.
Ghat[0], ci.
numROMVars, xhat, 1, 0.0, &ci.
Fhat[ci.
numExtVars], 1 );
1577 blas.GEMV( Teuchos::NO_TRANS, ci.
numROMVars, ci.
numExtVars, -1.0, &ci.
Bhat[0], ci.
numROMVars, &v_up[0], 1, 1.0, &ci.
Fhat[ci.
numExtVars], 1 );
1587 blas.GEMV( Teuchos::NO_TRANS, ci.
numROMVars, ci.
numROMVars, 1.0, &ci.
Chat[0], ci.
numROMVars, xhat, 1, 0.0, &ci.
Qhat[0], 1 );
1610 Xyce::dout() << std::endl << vname <<
": " << std::endl;
1611 for(
int ix=0; ix < Nrows; ix++)
1613 for(
int iy=0; iy < Ncols; iy++)
1615 Xyce::dout() << Matrix[iy*Nrows+ix] <<
" ";
1617 Xyce::dout() << std::endl;
1629 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
1631 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1633 Xyce::dout() <<
" ----------------------------------" << std::endl;
1634 Xyce::dout() <<
" Master::loadDAEVectors: " << std::endl;
1683 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1685 Xyce::dout() <<
" ----------------------------------" << std::endl;
1686 Xyce::dout() <<
" Master::loadDAEMatrices: " << std::endl;
1698 Xyce::dout() <<
" loads for ROM " << ci.
getName() << std::endl;
1701 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1736 for (
int i=0; i<nnz; ++i)
1757 for(
int i=0; i<nnz; i++)
1869 .registerDevice(
"rom", 1)
1870 .registerModelType(
"rom", 1);
const InstanceName & getName() const
bool processInstanceParams()
processInstanceParams
const std::vector< std::vector< int > > & jacobianStamp() const
std::vector< int > li_state
Linear::Vector * lastStaVectorPtr
bool updateDependentParameters()
std::vector< int > CG_rowPtr
std::vector< double > Ghat
const DeviceOptions & deviceOptions_
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
std::vector< std::vector< int > > AEqu_NodeOffset
double * daeQVectorRawPtr
std::vector< double > Qhat
std::vector< double > Fhat
std::vector< double > Gp2
std::vector< double * > fEqu_ip_NodePtr
std::vector< double > G2p
std::vector< Instance * > instanceContainer
Linear::Vector * currSolVectorPtr
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
bool given(const std::string ¶meter_name) const
std::vector< double > A2last
Pure virtual class to augment a linear system.
std::vector< double > Fstamp
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
void loadErrorWeightMask()
std::vector< double > Chat
std::vector< double * > fROMEqu_Bhat_VarsPtrs
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
std::vector< int > AEqu_up_NodeOffset
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
std::vector< int > Chat_rowPtr
std::vector< int > AEqu_ip_NodeOffset
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
std::vector< double * > fROMEqu_Ghat_VarsPtrs
std::vector< double * > qROMEqu_Chat_VarsPtrs
std::vector< int > Ghat_rowPtr
std::vector< int > CG_colIdx
std::vector< int > ROMEqu_C_NodeOffset
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
std::vector< Param > params
Parameters from the line.
void varTypes(std::vector< char > &varTypeVec)
Linear::Vector * lastSolVectorPtr
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
double * daeFVectorRawPtr
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
std::vector< double * > fEqu_up_NodePtr
std::vector< double > Lhat
std::vector< std::vector< int > > jacStamp
std::vector< int > Ghat_colIdx
std::vector< int > ipiv_A2
bool updateTemperature(const double &temp_tmp)
Linear::Vector * deviceErrorWeightMask_
Linear::Vector * nextStaVectorPtr
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
std::vector< double * > fROMEqu_Lhat_VarsPtrs
Linear::Matrix * dFdxMatrixPtr
std::vector< int > ROMEqu_GpC_NodeOffset
The Device class is an interface for device implementations.
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
std::vector< int > ROMEqu_Lt_NodeOffset
static void loadModelParameters(ParametricData< Model > &model_parameters)
virtual std::ostream & printOutInstances(std::ostream &os) const
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
const SolverState & solverState_
Class Configuration contains device configuration data.
bool processParams()
processParams
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
const SolverState & getSolverState() const
std::vector< double > Jstamp
std::vector< double > A2sol
Linear::Vector * currStaVectorPtr
std::vector< int > Chat_colIdx
double * nextStaVectorRawPtr
bool updatePrimaryState()
std::vector< double > i_ip
void printMatrix(std::string vname, double *Matrix, int Nrows, int Ncols)
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
virtual bool loadDAEVectors(double *solVec, double *fVec, double *qVec, double *bVec, double *storeLeadF, double *storeLeadQ, double *leadF, double *leadQ, double *junctionV)
Populates the device's ExternData object with these pointers.
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
std::vector< int > ROMEqu_B_NodeOffset
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Citer, const FactoryBlock &factory_block)
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
const SolverState & getSolverState() const
Returns the solver state given during device construction.
void setModParams(const std::vector< Param > ¶ms)
std::vector< int > li_ROM
double * nextSolVectorRawPtr
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
std::vector< int > ROMEqu_G_NodeOffset
std::vector< double > Bhat