Fixes raisal of assertion in Eigen because of empty vector and matrices.

Apparently Eigen cannot handle empty containers during reserve correctly.
Therfore we check for the size of the vector and if it is zero simply create
empty jacobians.

Closes #290
This commit is contained in:
Markus Blatt 2015-01-29 17:14:09 +01:00
parent e3b0a92176
commit 7c8f992a2d

View File

@ -148,9 +148,21 @@ namespace Opm
}
// ... then set the one corrresponding to this variable to identity.
assert(blocksizes[index] == num_elem);
jac[index].reserve(Eigen::VectorXi::Constant(val.size(), 1));
for (typename M::Index row = 0; row < val.size(); ++row) {
jac[index].insert(row, row) = Scalar(1.0);
if(val.size()>0)
{
// if val is empty the following will run into an assertion
// with Eigen
jac[index].reserve(Eigen::VectorXi::Constant(val.size(), 1));
for (typename M::Index row = 0; row < val.size(); ++row) {
jac[index].insert(row, row) = Scalar(1.0);
}
}
else
{
// Do some check. Empty jacobian only make sense for empty val.
for (int i = 0; i < num_blocks; ++i) {
assert(jac[i].size()==0);
}
}
return AutoDiffBlock(val, jac);
}