48class VtkTensorFunction :
public Dune::VTKFunction<GridView>
50 enum { dim = GridView::dimension };
51 using ctype =
typename GridView::ctype;
52 using Element =
typename GridView::template Codim<0>::Entity;
54 using TensorBuffer = BaseOutputWriter::TensorBuffer;
57 VtkTensorFunction(std::string_view name,
58 const GridView& gridView,
60 const TensorBuffer& buf,
62 unsigned matrixColumnIdx)
68 , matrixColumnIdx_(matrixColumnIdx)
69 { assert(
int(buf_.size()) ==
int(mapper_.size())); }
71 std::string name()
const override
74 int ncomps()
const override
75 {
return static_cast<int>(buf_[0].M()); }
77 double evaluate(
int mycomp,
79 const Dune::FieldVector<ctype, dim>& xi)
const override
84 idx =
static_cast<std::size_t
>(mapper_.index(e));
86 else if (codim_ == dim) {
91 Dune::GeometryType gt = e.type();
92 int n =
static_cast<int>(e.subEntities(dim));
93 for (
int i = 0; i < n; ++i) {
94 Dune::FieldVector<ctype, dim> local =
95 Dune::ReferenceElements<ctype, dim>::general(gt).position(i, dim);
98 if (local.infinity_norm() < min) {
99 min = local.infinity_norm();
105 idx =
static_cast<std::size_t
>(mapper_.subIndex(e, imin, codim_));
108 throw std::logic_error(
"Only element and vertex based tensor fields are supported so far.");
111 const unsigned i =
static_cast<unsigned>(mycomp);
112 const unsigned j =
static_cast<unsigned>(matrixColumnIdx_);
114 return static_cast<double>(
static_cast<float>(buf_[idx][i][j]));
118 const std::string name_;
119 const GridView gridView_;
120 const Mapper& mapper_;
121 const TensorBuffer& buf_;
122 const unsigned codim_;
123 const unsigned matrixColumnIdx_;