mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-16 20:24:48 -06:00
Added operator* that allows A*x for sparse A and x an AD object.
This commit is contained in:
parent
92f56f6d92
commit
f85e74bcff
@ -194,6 +194,20 @@ namespace AutoDiff
|
||||
return fw.print(os);
|
||||
}
|
||||
|
||||
/// Multiply with sparse matrix from the left.
|
||||
template <typename Scalar>
|
||||
ForwardBlock<Scalar> operator*(const typename ForwardBlock<Scalar>::M& lhs,
|
||||
const ForwardBlock<Scalar>& rhs)
|
||||
{
|
||||
int num_blocks = rhs.numBlocks();
|
||||
std::vector<typename ForwardBlock<Scalar>::M> jac(num_blocks);
|
||||
assert(lhs.cols() == num_blocks);
|
||||
for (int block = 0; block < num_blocks; ++block) {
|
||||
jac[block] = lhs*rhs.derivative()[block];
|
||||
}
|
||||
typename ForwardBlock<Scalar>::V val = lhs*rhs.value().matrix();
|
||||
return ForwardBlock<Scalar>::function(val, jac);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Autodiff
|
||||
|
@ -30,14 +30,14 @@ int main()
|
||||
ADV::V v2(3);
|
||||
v2 << 1.0, 2.2, 3.4;
|
||||
enum { FirstVar = 0, SecondVar = 1, ThirdVar = 2 };
|
||||
ADV a = ADV::constant(FirstVar, v1, blocksizes);
|
||||
ADV a = ADV::constant(v1, blocksizes);
|
||||
ADV x = ADV::variable(FirstVar, v2, blocksizes);
|
||||
std::vector<ADV::M> jacs(num_blocks);
|
||||
for (int i = 0; i < num_blocks; ++i) {
|
||||
jacs[i] = ADV::M(blocksizes[FirstVar], blocksizes[i]);
|
||||
jacs[i].insert(0,0) = -1.0;
|
||||
}
|
||||
ADV f = ADV::function(FirstVar, v2, jacs);
|
||||
ADV f = ADV::function(v2, jacs);
|
||||
|
||||
ADV xpx = x + x;
|
||||
std::cout << xpx;
|
||||
@ -54,4 +54,10 @@ int main()
|
||||
ADV sqxdx = sqx / x;
|
||||
|
||||
std::cout << sqxdx;
|
||||
|
||||
ADV::M m(2,3);
|
||||
m.insert(0,0) = 4;
|
||||
m.insert(0,1) = 3;
|
||||
m.insert(1,1) = 1;
|
||||
std::cout << m*sqx;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user