mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
use correct types of SparseMatrices.
This commit is contained in:
@@ -189,11 +189,11 @@ namespace {
|
|||||||
|
|
||||||
|
|
||||||
template <typename Scalar, class IntVec>
|
template <typename Scalar, class IntVec>
|
||||||
Eigen::SparseMatrix<Scalar>
|
typename AutoDiffBlock<Scalar>::M
|
||||||
constructSupersetSparseMatrix(const int full_size, const IntVec& indices)
|
constructSupersetSparseMatrix(const int full_size, const IntVec& indices)
|
||||||
{
|
{
|
||||||
const int subset_size = indices.size();
|
const int subset_size = indices.size();
|
||||||
Eigen::SparseMatrix<Scalar> mat(full_size, subset_size);
|
typename AutoDiffBlock<Scalar>::M mat(full_size, subset_size);
|
||||||
mat.reserve(Eigen::VectorXi::Constant(subset_size, 1));
|
mat.reserve(Eigen::VectorXi::Constant(subset_size, 1));
|
||||||
for (int i = 0; i < subset_size; ++i) {
|
for (int i = 0; i < subset_size; ++i) {
|
||||||
mat.insert(indices[i], i) = 1;
|
mat.insert(indices[i], i) = 1;
|
||||||
@@ -204,18 +204,6 @@ namespace {
|
|||||||
} // anon namespace
|
} // anon namespace
|
||||||
|
|
||||||
|
|
||||||
/// Returns x(indices).
|
|
||||||
template <typename Scalar, class IntVec>
|
|
||||||
AutoDiffBlock<Scalar>
|
|
||||||
subset(const AutoDiffBlock<Scalar>& x,
|
|
||||||
const IntVec& indices)
|
|
||||||
{
|
|
||||||
Eigen::SparseMatrix<Scalar> sub
|
|
||||||
= constructSupersetSparseMatrix<Scalar>(x.value().size(), indices).transpose();
|
|
||||||
return sub * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns x(indices).
|
/// Returns x(indices).
|
||||||
template <typename Scalar, class IntVec>
|
template <typename Scalar, class IntVec>
|
||||||
@@ -223,9 +211,25 @@ Eigen::Array<Scalar, Eigen::Dynamic, 1>
|
|||||||
subset(const Eigen::Array<Scalar, Eigen::Dynamic, 1>& x,
|
subset(const Eigen::Array<Scalar, Eigen::Dynamic, 1>& x,
|
||||||
const IntVec& indices)
|
const IntVec& indices)
|
||||||
{
|
{
|
||||||
return (constructSupersetSparseMatrix<Scalar>(x.size(), indices).transpose() * x.matrix()).array();
|
typedef typename Eigen::Array<Scalar, Eigen::Dynamic, 1>::Index Index;
|
||||||
|
const Index size = indices.size();
|
||||||
|
Eigen::Array<Scalar, Eigen::Dynamic, 1> ret( size );
|
||||||
|
for( Index i=0; i<size; ++i )
|
||||||
|
ret[ i ] = x[ indices[ i ] ];
|
||||||
|
|
||||||
|
return std::move(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns x(indices).
|
||||||
|
template <typename Scalar, class IntVec>
|
||||||
|
AutoDiffBlock<Scalar>
|
||||||
|
subset(const AutoDiffBlock<Scalar>& x,
|
||||||
|
const IntVec& indices)
|
||||||
|
{
|
||||||
|
const typename AutoDiffBlock<Scalar>::M sub
|
||||||
|
= constructSupersetSparseMatrix<Scalar>(x.value().size(), indices).transpose();
|
||||||
|
return sub * x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns v where v(indices) == x, v(!indices) == 0 and v.size() == n.
|
/// Returns v where v(indices) == x, v(!indices) == 0 and v.size() == n.
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ namespace Opm
|
|||||||
#endif
|
#endif
|
||||||
M id(Jn[n].rows(), Jn[n].cols());
|
M id(Jn[n].rows(), Jn[n].cols());
|
||||||
id.setIdentity();
|
id.setIdentity();
|
||||||
const M Di = solver.solve(id);
|
const Eigen::SparseMatrix<typename M::Scalar, Eigen::ColMajor> Di = solver.solve(id);
|
||||||
|
|
||||||
// compute inv(D)*bn for the update of the right hand side
|
// compute inv(D)*bn for the update of the right hand side
|
||||||
const Eigen::VectorXd& Dibn = solver.solve(eqs[n].value().matrix());
|
const Eigen::VectorXd& Dibn = solver.solve(eqs[n].value().matrix());
|
||||||
|
|||||||
Reference in New Issue
Block a user