Skip to content
Snippets Groups Projects
Commit daccff3a authored by Tobias Leibner's avatar Tobias Leibner
Browse files

[discretefunction.local] performance optimization for fv spaces

parent c1026083
No related branches found
No related tags found
No related merge requests found
...@@ -218,29 +218,35 @@ public: ...@@ -218,29 +218,35 @@ public:
return base_->order(); return base_->order();
} }
virtual void evaluate(const DomainType& xx, RangeType& ret) const override void evaluate(const DomainType& xx, RangeType& ret) const override final
{ {
assert(this->is_a_valid_point(xx)); assert(this->is_a_valid_point(xx));
ret *= 0.0; if (!(GDT::is_fv_space<SpaceType>::value || GDT::is_product_fv_space<SpaceType>::value)) {
std::vector<RangeType> tmpBaseValues(base_->size(), RangeType(0)); std::fill(ret.begin(), ret.end(), RangeFieldType(0));
assert(localVector_->size() == tmpBaseValues.size()); std::vector<RangeType> tmpBaseValues(base_->size(), RangeType(0));
base_->evaluate(xx, tmpBaseValues); assert(localVector_->size() == tmpBaseValues.size());
for (size_t ii = 0; ii < localVector_->size(); ++ii) { base_->evaluate(xx, tmpBaseValues);
tmpBaseValues[ii] *= localVector_->get(ii); for (size_t ii = 0; ii < localVector_->size(); ++ii) {
ret += tmpBaseValues[ii]; ret.axpy(localVector_->get(ii), tmpBaseValues[ii]);
}
} else {
for (size_t ii = 0; ii < localVector_->size(); ++ii)
ret[ii] = localVector_->get(ii);
} }
} // ... evaluate(...) } // ... evaluate(...)
virtual void jacobian(const DomainType& xx, JacobianRangeType& ret) const override virtual void jacobian(const DomainType& xx, JacobianRangeType& ret) const override final
{ {
assert(this->is_a_valid_point(xx)); assert(this->is_a_valid_point(xx));
ret *= RangeFieldType(0); if (!(GDT::is_fv_space<SpaceType>::value || GDT::is_product_fv_space<SpaceType>::value)) {
std::vector<JacobianRangeType> tmpBaseJacobianValues(base_->size(), JacobianRangeType(0)); std::fill(ret.begin(), ret.end(), RangeFieldType(0));
assert(localVector_->size() == tmpBaseJacobianValues.size()); std::vector<JacobianRangeType> tmpBaseJacobianValues(base_->size(), JacobianRangeType(0));
base_->jacobian(xx, tmpBaseJacobianValues); assert(localVector_->size() == tmpBaseJacobianValues.size());
for (size_t ii = 0; ii < localVector_->size(); ++ii) { base_->jacobian(xx, tmpBaseJacobianValues);
tmpBaseJacobianValues[ii] *= localVector_->get(ii); for (size_t ii = 0; ii < localVector_->size(); ++ii)
ret += tmpBaseJacobianValues[ii]; ret.axpy(localVector_->get(ii), tmpBaseJacobianValues[ii]);
} else {
ret = JacobianRangeType(0);
} }
} // ... jacobian(...) } // ... jacobian(...)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment