Skip to content
Snippets Groups Projects
Forked from ogs / ogs
19245 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
MeshElementParameter.h 1.62 KiB
/**
 * \copyright
 * Copyright (c) 2012-2016, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 */

#ifndef PROCESSLIB_MESHELEMENTPARAMETER_H
#define PROCESSLIB_MESHELEMENTPARAMETER_H

#include "Parameter.h"

namespace MeshLib
{
template <typename T>
class PropertyVector;
}  // MeshLib

namespace ProcessLib
{
/// A parameter represented by a mesh property vector.
template <typename T>
struct MeshElementParameter final : public Parameter<T> {
    MeshElementParameter(MeshLib::PropertyVector<T> const& property)
        : _property(property)
        , _cache(_property.getNumberOfComponents())
    {
    }

    bool isTimeDependent() const override { return false; }

    unsigned getNumberOfComponents() const override
    {
        return _property.getNumberOfComponents();
    }

    std::vector<T> const& operator()(double const /*t*/,
                                     SpatialPosition const& pos) const override
    {
        auto const e = pos.getElementID();
        assert(e);
        auto const num_comp = _property.getNumberOfComponents();
        for (std::size_t c=0; c<num_comp; ++c) {
            _cache[c] = _property.getComponent(*e, c);
        }
        return _cache;
    }

private:
    MeshLib::PropertyVector<T> const& _property;
    mutable std::vector<double> _cache;
};

std::unique_ptr<ParameterBase> createMeshElementParameter(
    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh);

}  // ProcessLib

#endif  // PROCESSLIB_MESHELEMENTPARAMETER_H