8#include <kernel/lafem/tuple_vector.hpp> 
   30    template<
typename First_, 
typename... Rest_>
 
   34      template<
typename,
typename...>
 
   49      static_assert(std::is_same<DataType, typename RestClass::DataType>::value,
 
   50                    "sub-matrices have different data-types");
 
   51      static_assert(std::is_same<IndexType, typename RestClass::IndexType>::value,
 
   52                    "sub-matrices have different index-types");
 
   55      template <
typename DT2_ = DataType, 
typename IT2_ = IndexType>
 
   61      template <
typename DataType2_, 
typename IndexType2_>
 
   89        _first(std::forward<First_>(the_first)),
 
   96        _first(std::forward<First_>(the_first)),
 
   97        _rest(std::forward<Rest_>(the_rest)...)
 
  113          _first = std::forward<First_>(other._first);
 
  114          _rest = std::forward<RestClass>(other._rest);
 
  143        _first.clone(other._first, clone_mode);
 
  154        _first.clone(other._first);
 
  164      const First_& first()
 const 
  169      TupleMatrixRow<Rest_...>& rest()
 
  174      const TupleMatrixRow<Rest_...>& 
rest()
 const 
  192        static_assert((0 <= i_) && (i_ < 
num_blocks), 
"invalid sub-matrix index");
 
  200        static_assert((0 <= i_) && (i_ < 
num_blocks), 
"invalid sub-matrix index");
 
  210      template <Perspective perspective_ = Perspective::native>
 
  213        const Index rows_f = 
_first.template rows<perspective_>();
 
  214        const Index rows_r = 
_rest.template rows<perspective_>();
 
  215        XASSERTM(rows_f == rows_r, 
"row count mismatch");
 
  225      template <Perspective perspective_ = Perspective::native>
 
  228        return _first.template columns<perspective_>() + 
_rest.template columns<perspective_>();
 
  237      template <Perspective perspective_ = Perspective::native>
 
  240        return _first.template used_elements<perspective_>() + 
_rest.template used_elements<perspective_>();
 
  267        first().format(
value);
 
  268        rest().format(
value);
 
  280        first().format(rng, min, max);
 
  281        rest().format(rng, min, max);
 
  294        return first().create_vector_l();
 
  305        first().apply(r, x.first());
 
  306        rest().apply(r, x.rest(), r, 
DataType(1));
 
  311        first().apply_transposed(r.first(), x);
 
  312        rest().apply_transposed(r.rest(), x);
 
  317        first().apply(r, x.first(), y, alpha);
 
  318        rest().apply(r, x.rest(), r, alpha);
 
  323        first().apply_transposed(r.first(), x, y.first(), alpha);
 
  324        rest().apply_transposed(r.rest(), x, y.rest(), alpha);
 
  327      Index get_length_of_line(
const Index row)
 const 
  329        return first().get_length_of_line(row) + 
rest().get_length_of_line(row);
 
  334        const Index first_length(first().get_length_of_line(row));
 
  336        first().set_line(row, pval_set, pcol_set, col_start, stride);
 
  337        rest().set_line(row, pval_set + stride * first_length, pcol_set + stride * first_length, col_start + first().
template columns<Perspective::pod>(), stride);
 
  340      void set_line_reverse(
const Index row, 
DataType * 
const pval_set, 
const Index stride = 1)
 
  342        const Index first_length(first().get_length_of_line(row));
 
  344        first().set_line_reverse(row, pval_set, stride);
 
  345        rest().set_line_reverse(row, pval_set + stride * first_length, stride);
 
  357        std::uint64_t isize = *(std::uint64_t*) data.data(); 
 
  358        std::vector<char>::iterator start = std::begin(data) + 
sizeof(std::uint64_t);
 
  359        std::vector<char>::iterator last_of_first = std::begin(data) + 
sizeof(std::uint64_t) + (
int) isize;
 
  360        std::vector<char> buffer_first(start, last_of_first);
 
  361        _first.restore_from_checkpoint_data(buffer_first);
 
  363        data.erase(std::begin(data), last_of_first);
 
  370        std::size_t old_size = data.size();
 
  371        data.insert(std::end(data), 
sizeof(std::uint64_t), 0); 
 
  372        std::uint64_t ireal_size = 
_first.set_checkpoint_data(data, config); 
 
  373        char* csize = 
reinterpret_cast<char*
>(&ireal_size);
 
  374        for(std::size_t i(0) ; i < 
sizeof(std::uint64_t) ; ++i)  
 
  376          data[old_size + i] = csize[i];
 
  382      template<
typename OtherFirst_, 
typename... OtherRest_>
 
  385        first().convert(other.first());
 
  386        rest().convert(other.rest());
 
  389      template<
typename OtherFirst_, 
typename... OtherRest_>
 
  390      void convert_reverse(TupleMatrixRow<OtherFirst_, OtherRest_...>& other)
 const 
  392        first().convert_reverse(other.first());
 
  393        rest().convert_reverse(other.rest());
 
  399    template<
typename First_>
 
  400    class TupleMatrixRow<First_>
 
  403      template<
typename,
typename...>
 
  404      friend class TupleMatrixRow;
 
  411      typedef typename First_::DataType 
DataType;
 
  413      typedef typename First_::IndexType 
IndexType;
 
  415      template <
typename DT2_ = DataType, 
typename IT2_ = IndexType>
 
  416      using ContainerType = TupleMatrixRow<typename First_::template ContainerType<DT2_, IT2_> >;
 
  419      template <
typename DataType2_, 
typename IndexType2_>
 
  425      typedef TupleVector<typename First_::VectorTypeR> 
VectorTypeR;
 
  434        return First_::name();
 
  444      explicit TupleMatrixRow(First_&& the_first) :
 
  445        _first(std::forward<First_>(the_first))
 
  450      TupleMatrixRow(TupleMatrixRow&& other) :
 
  456      TupleMatrixRow& 
operator=(TupleMatrixRow&& other)
 
  466      TupleMatrixRow(
const TupleMatrixRow&) = 
delete;
 
  468      TupleMatrixRow& 
operator=(
const TupleMatrixRow&) = 
delete;
 
  472        return TupleMatrixRow(
_first.clone(mode));
 
  480      void clone(
const TupleMatrixRow& other)
 
  491      const First_& first()
 const 
  500        static_assert(i_ == 0, 
"invalid sub-matrix index");
 
  506      const First_& 
at()
 const 
  508        static_assert(i_ == 0, 
"invalid sub-matrix index");
 
  512      template <Perspective perspective_ = Perspective::native>
 
  515        return _first.template rows<perspective_>();
 
  518      template <Perspective perspective_ = Perspective::native>
 
  521        return _first.template columns<perspective_>();
 
  524      template <Perspective perspective_ = Perspective::native>
 
  527        return _first.template used_elements<perspective_>();
 
  530      std::size_t 
bytes()
 const 
  542        first().format(
value);
 
  547        first().format(rng, min, max);
 
  557        return first().create_vector_l();
 
  567        first().apply(r, x.first());
 
  572        first().apply(r, x.first(), y, alpha);
 
  577        first().apply_transposed(r.first(), x);
 
  582        first().apply_transposed(r.first(), x, y.first(), alpha);
 
  585      Index get_length_of_line(
const Index row)
 const 
  587        return first().get_length_of_line(row);
 
  592        first().set_line(row, pval_set, pcol_set, col_start, stride);
 
  595      void set_line_reverse(
const Index row, 
DataType * 
const pval_set, 
const Index stride = 1)
 
  597        first().set_line_reverse(row, pval_set, stride);
 
  603        return _first.get_checkpoint_size(config);
 
  609        _first.restore_from_checkpoint_data(data);
 
  615        return _first.set_checkpoint_data(data, config);
 
  618      template<
typename OtherFirst_>
 
  619      void convert(
const TupleMatrixRow<OtherFirst_>& other)
 
  621        first().convert(
other.first());
 
  624      template<
typename OtherFirst_>
 
  625      void convert_reverse(TupleMatrixRow<OtherFirst_>& other)
 const 
  627        first().convert_reverse(
other.first());
 
  636      template<
typename T_>
 
  639        static constexpr bool value = 
false;
 
  642      template<
typename... T_>
 
  643      struct IsTMR_<TupleMatrixRow<T_...>>
 
  645        static constexpr bool value = 
true;
 
  658    template<
int i_, 
int j_, 
typename FirstRow_, 
typename... RestRows_>
 
  662      static_assert(i_ > 0, 
"invalid row index"); 
 
  663      static_assert(j_ >= 0, 
"invalid column index");
 
  667      template<
typename Meta_>
 
  668      static Type& get(Meta_& meta)
 
  673      template<
typename Meta_>
 
  674      static const Type& get(
const Meta_& meta)
 
  684    template<
int j_, 
typename First_, 
typename... Rest_, 
typename... RestRows_>
 
  688      static_assert(j_ >= 0, 
"invalid column index");
 
  690      typedef typename TupleElement<j_, First_, Rest_...>::Type Type;
 
  692      template<
typename Meta_>
 
  693      static Type& get(Meta_& meta)
 
  698      template<
typename Meta_>
 
  699      static const Type& get(
const Meta_& meta)
 
  701        return TupleElement<j_, First_, Rest_...>::get(meta.first());
 
  718    template<
typename FirstRow_, 
typename... RestRows_>
 
  722      template<
typename,
typename...>
 
  729      static_assert(Intern::IsTMR_<FirstRow_>::value,
 
  730        "template parameter of TupleMatrix must be TupleMatrixRow<...>");
 
  747      static_assert(std::is_same<DataType, typename RestClass::DataType>::value,
 
  748                    "sub-matrices have different data-types");
 
  749      static_assert(std::is_same<IndexType, typename RestClass::IndexType>::value,
 
  750                    "sub-matrices have different index-types");
 
  753      template <
typename DT2_ = DataType, 
typename IT2_ = IndexType>
 
  759      template <
typename DataType2_, 
typename IndexType2_>
 
  768      static_assert(std::is_same<VectorTypeR, typename RestClass::VectorTypeR>::value, 
"vector type mismatch");
 
  790        _first(std::forward<FirstRow_>(the_first)),
 
  796      explicit TupleMatrix(FirstRow_&& the_first, RestRows_&&... the_rest) :
 
  797        _first(std::forward<FirstRow_>(the_first)),
 
  798        _rest(std::forward<RestRows_>(the_rest)...)
 
  814          _first = std::forward<FirstRow_>(other._first);
 
  815          _rest = std::forward<RestClass>(other._rest);
 
  844        _first.clone(other._first, clone_mode);
 
  855        _first.clone(other._first);
 
  865      const FirstRow_& first()
 const 
  870      TupleMatrix<RestRows_...>& rest()
 
  875      const TupleMatrix<RestRows_...>& 
rest()
 const 
  890      template<
int i_, 
int j_>
 
  893        static_assert((0 <= i_) && (i_ < 
num_row_blocks), 
"invalid sub-matrix row index");
 
  894        static_assert((0 <= j_) && (j_ < 
num_col_blocks), 
"invalid sub-matrix column index");
 
  899      template<
int i_, 
int j_>
 
  902        static_assert((0 <= i_) && (i_ < 
num_row_blocks), 
"invalid sub-matrix row index");
 
  903        static_assert((0 <= j_) && (j_ < 
num_col_blocks), 
"invalid sub-matrix column index");
 
  913      template <Perspective perspective_ = Perspective::native>
 
  916        return _first.template rows<perspective_>() + 
_rest.template rows<perspective_>();
 
  925      template <Perspective perspective_ = Perspective::native>
 
  928        const Index cols_f = 
_first.template columns<perspective_>();
 
  929        const Index cols_r = 
_rest.template columns<perspective_>();
 
  930        XASSERTM(cols_f == cols_r, 
"column count mismatch");
 
  940      template <Perspective perspective_ = Perspective::native>
 
  943        return _first.template used_elements<perspective_>() + 
_rest.template used_elements<perspective_>();
 
  970        first().format(
value);
 
  971        rest().format(
value);
 
  983        first().format(rng, min, max);
 
  984        rest().format(rng, min, max);
 
 1003        return first().create_vector_r();
 
 1014        first().apply(r.first(), x);
 
 1015        rest().apply(r.rest(), x);
 
 1026        first().apply_transposed(r, x.first());
 
 1027        rest().apply_transposed(r, x.rest(), r, 
DataType(1));
 
 1040        first().apply(r.first(), x, y.first(), alpha);
 
 1041        rest().apply(r.rest(), x, y.rest(), alpha);
 
 1054        first().apply_transposed(r, x.first(), y, alpha);
 
 1055        rest().apply_transposed(r, x.rest(), r, alpha);
 
 1058      Index get_length_of_line(
const Index row)
 const 
 1060        const Index first_rows = first().template rows<Perspective::pod>();
 
 1061        if(row < first_rows)
 
 1062          return first().get_length_of_line(row);
 
 1064          return rest().get_length_of_line(row - first_rows);
 
 1069        const Index first_rows = first().template rows<Perspective::pod>();
 
 1070        if(row < first_rows)
 
 1071          first().set_line(row, pval_set, pcol_set, col_start, stride);
 
 1073          rest().set_line(row - first_rows, pval_set, pcol_set, col_start, stride);
 
 1076      void set_line_reverse(
const Index row, 
DataType * 
const pval_set, 
const Index stride = 1)
 
 1078        const Index first_rows = first().template rows<Perspective::pod>();
 
 1079        if(row < first_rows)
 
 1080          first().set_line_reverse(row, pval_set, stride);
 
 1082          rest().set_line_reverse(row - first_rows, pval_set, stride);
 
 1094        std::uint64_t isize = *(std::uint64_t*) data.data(); 
 
 1095        std::vector<char>::iterator start = std::begin(data) + 
sizeof(std::uint64_t);
 
 1096        std::vector<char>::iterator last_of_first = std::begin(data) + 
sizeof(std::uint64_t) + (
int) isize;
 
 1097        std::vector<char> buffer_first(start, last_of_first);
 
 1098        _first.restore_from_checkpoint_data(buffer_first);
 
 1100        data.erase(std::begin(data), last_of_first);
 
 1107        std::size_t old_size = data.size();
 
 1108        data.insert(std::end(data), 
sizeof(std::uint64_t), 0); 
 
 1109        std::uint64_t ireal_size = 
_first.set_checkpoint_data(data, config); 
 
 1110        char* csize = 
reinterpret_cast<char*
>(&ireal_size);
 
 1111        for(std::size_t i(0) ; i < 
sizeof(std::uint64_t) ; ++i)  
 
 1113          data[old_size +i] = csize[i];
 
 1118      template<
typename OtherFirstRow_, 
typename... OtherRestRows_>
 
 1121        first().convert(other.first());
 
 1122        rest().convert(other.rest());
 
 1125      template<
typename OtherFirstRow_, 
typename... OtherRestRows_>
 
 1126      void convert_reverse(TupleMatrix<OtherFirstRow_, OtherRestRows_...>& other)
 const 
 1128        first().convert_reverse(other.first());
 
 1129        rest().convert_reverse(other.rest());
 
 1135    template<
typename FirstRow_>
 
 1136    class TupleMatrix<FirstRow_>
 
 1139      template<
typename,
typename...>
 
 1140      friend class TupleMatrix;
 
 1143      static_assert(Intern::IsTMR_<FirstRow_>::value,
 
 1144        "template parameter of TupleMatrix must be TupleMatrixRow<...>");
 
 1148      static constexpr int num_blocks = 1;
 
 1157      typedef typename FirstRow_::DataType 
DataType;
 
 1159      typedef typename FirstRow_::IndexType 
IndexType;
 
 1161      template < 
typename DT2_ = DataType, 
typename IT2_ = IndexType>
 
 1162      using ContainerType = TupleMatrix<typename FirstRow_::template ContainerType<DT2_, IT2_> >;
 
 1164      template <
typename DataType2_, 
typename IndexType2_>
 
 1168      typedef TupleVector<typename FirstRow_::VectorTypeL> 
VectorTypeL;
 
 1170      typedef typename FirstRow_::VectorTypeR 
VectorTypeR;
 
 1179        return FirstRow_::name();
 
 1189      explicit TupleMatrix(FirstRow_&& the_first) :
 
 1190        _first(std::forward<FirstRow_>(the_first))
 
 1195      TupleMatrix(TupleMatrix&& other) :
 
 1201      TupleMatrix& 
operator=(TupleMatrix&& other)
 
 1211      TupleMatrix(
const TupleMatrix&) = 
delete;
 
 1213      TupleMatrix& 
operator=(
const TupleMatrix&) = 
delete;
 
 1217        return TupleMatrix(
_first.clone(mode));
 
 1225      void clone(
const TupleMatrix& other)
 
 1235      const FirstRow_& first()
 const 
 1240      template<
int i_, 
int j_>
 
 1241      typename TupleMatrixElement<i_, j_, FirstRow_>::Type& 
at()
 
 1243        static_assert(0 == i_, 
"invalid sub-matrix row index");
 
 1244        static_assert((0 <= j_) && (j_ < 
num_col_blocks), 
"invalid sub-matrix column index");
 
 1245        return TupleMatrixElement<i_, j_, FirstRow_>::get(*
this);
 
 1248      template<
int i_, 
int j_>
 
 1249      const typename TupleMatrixElement<i_, j_, FirstRow_>::Type& 
at()
 const 
 1251        static_assert(0 == i_, 
"invalid sub-matrix row index");
 
 1252        static_assert((0 <= j_) && (j_ < 
num_col_blocks), 
"invalid sub-matrix column index");
 
 1253        return TupleMatrixElement<i_, j_, FirstRow_>::get(*
this);
 
 1256      template <Perspective perspective_ = Perspective::native>
 
 1259        return _first.template rows<perspective_>();
 
 1262      template <Perspective perspective_ = Perspective::native>
 
 1265        return _first.template columns<perspective_>();
 
 1268      template <Perspective perspective_ = Perspective::native>
 
 1271        return _first.template used_elements<perspective_>();
 
 1274      std::size_t 
bytes()
 const 
 1279      static String 
name()
 
 1286        first().format(
value);
 
 1291        first().format(rng, min, max);
 
 1308        return first().create_vector_r();
 
 1313        first().apply(r.first(), x);
 
 1318        first().apply(r.first(), x, y.first(), alpha);
 
 1323        first().apply_transposed(r, x.first());
 
 1328        first().apply(r, x.first(), y, alpha);
 
 1331      Index get_length_of_line(
const Index row)
 const 
 1333        return first().get_length_of_line(row);
 
 1338        first().set_line(row, pval_set, pcol_set, col_start, stride);
 
 1341      void set_line_reverse(
const Index row, 
DataType * 
const pval_set, 
const Index stride = 1)
 
 1343        first().set_line_reverse(row, pval_set, stride);
 
 1349        return _first.get_checkpoint_size(config);
 
 1355        _first.restore_from_checkpoint_data(data);
 
 1361        return _first.set_checkpoint_data(data, config);
 
 1364      template<
typename OtherFirstRow_>
 
 1365      void convert(
const TupleMatrix<OtherFirstRow_>& other)
 
 1367        first().convert(
other.first());
 
 1370      template<
typename OtherFirstRow_>
 
 1371      void convert_reverse(TupleMatrix<OtherFirstRow_>& other)
 const 
 1373        first().convert_reverse(
other.first());
 
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Config class for serialize parameter.
TupleMatrix element helper class template.
Variadic TupleMatrix class template.
TupleMatrix & operator=(TupleMatrix &&other)
move-assign operator
static constexpr int num_col_blocks
number of column blocks (horizontal size)
FirstRow_::IndexType IndexType
sub-matrix index-type
TupleMatrixElement< i_, j_, FirstRow_, RestRows_... >::Type & at()
Returns a sub-matrix block.
void format(Random &rng, DataType min, DataType max)
Reset all elements of the container to random values.
VectorTypeL create_vector_l() const
Returns a new compatible L-Vector.
VectorTypeR create_vector_r() const
Returns a new compatible R-Vector.
TupleMatrix clone(LAFEM::CloneMode mode=LAFEM::CloneMode::Weak) const
Creates and returns a copy of this matrix.
void clone(const TupleMatrix &other)
Turns this matrix into a clone of other.
static constexpr int num_row_blocks
number of row blocks (vertical size)
std::size_t bytes() const
Returns the total amount of bytes allocated.
void clear()
Free all allocated arrays.
std::uint64_t get_checkpoint_size(SerialConfig &config)
Calculate size.
FirstRow_ _first
sanity check: vector types must match for all rows
TupleMatrix(FirstRow_ &&the_first, RestRows_ &&... the_rest)
Sub-Matrix emplacement constructor.
void format(DataType value=DataType(0))
Reset all elements of the container to a given value or zero if missing.
Index columns() const
Returns the total number of columns in this matrix.
void apply(VectorTypeL &r, const VectorTypeR &x) const
Calculate .
ContainerType< DataType2_, IndexType2_ > ContainerTypeByDI
this typedef lets you create a vector container with new Datatype and Index types
Index rows() const
Returns the total number of rows in this matrix.
void restore_from_checkpoint_data(std::vector< char > &data)
Extract object from checkpoint.
FirstRow_::DataType DataType
sub-matrix data-type
RestClass _rest
all remaining sub-matrix rows
TupleMatrix & operator=(const TupleMatrix &)=delete
deleted copy-assign operator
Index used_elements() const
Returns the total number of non-zeros in this matrix.
void apply_transposed(VectorTypeR &r, const VectorTypeL &x) const
Calculate .
static String sub_name_list()
Returns a list of all sub-matrix type names.
TupleMatrix< typename FirstRow_::template ContainerType< DT2_, IT2_ >, typename RestRows_::template ContainerType< DT2_, IT2_ >... > ContainerType
Our 'base' class type.
void apply_transposed(VectorTypeR &r, const VectorTypeL &x, const VectorTypeR &y, DataType alpha=DataType(1)) const
Calculate .
TupleMatrix()
default CTOR
TupleMatrix(FirstRow_ &&the_first, RestClass &&the_rest)
rest-class emplacement ctor; for internal use only
TupleVector< typename FirstRow_::VectorTypeL, typename RestRows_::VectorTypeL... > VectorTypeL
Compatible L-vector type.
TupleMatrix(const TupleMatrix &)=delete
deleted copy-ctor
const TupleMatrixElement< i_, j_, FirstRow_, RestRows_... >::Type & at() const
Returns a sub-matrix block.
void clone(const TupleMatrix &other, CloneMode clone_mode)
Turns this matrix into a clone of other.
std::uint64_t set_checkpoint_data(std::vector< char > &data, SerialConfig &config)
TupleMatrix(TupleMatrix &&other)
move ctor
static String name()
Returns a descriptive string for this container.
void apply(VectorTypeL &r, const VectorTypeR &x, const VectorTypeL &y, DataType alpha=DataType(1)) const
Calculate .
FirstRow_::VectorTypeR VectorTypeR
Compatible R-vector type.
TupleMatrix row helper class template.
void restore_from_checkpoint_data(std::vector< char > &data)
Extract object from checkpoint.
static String name()
Returns a descriptive string for this container.
VectorTypeL create_vector_l() const
Returns a new compatible L-Vector.
void clone(const TupleMatrixRow &other, CloneMode clone_mode)
Turns this matrix into a clone of other.
Index columns() const
Returns the total number of columns in this matrix.
static constexpr int num_blocks
number of matrix columns
static String sub_name_list()
Returns a list of all sub-matrix type names.
TupleVector< typename First_::VectorTypeR, typename Rest_::VectorTypeR... > VectorTypeR
Compatible R-vector type.
TupleElement< i_, First_, Rest_... >::Type const & at() const
Returns a sub-matrix block.
TupleMatrixRow< typename First_::template ContainerType< DT2_, IT2_ >, typename Rest_::template ContainerType< DT2_, IT2_ >... > ContainerType
Our 'base' class type.
std::uint64_t get_checkpoint_size(SerialConfig &config)
Calculate size.
VectorTypeR create_vector_r() const
Returns a new compatible R-Vector.
TupleMatrixRow & operator=(TupleMatrixRow &&other)
move-assign operator
RestClass _rest
all remaining sub-matrices
TupleMatrixRow(TupleMatrixRow &&other)
move ctor
Index used_elements() const
Returns the total number of non-zeros in this matrix.
TupleMatrixRow(First_ &&the_first, RestClass &&the_rest)
rest-class emplacement ctor; for internal use only
ContainerType< DataType2_, IndexType2_ > ContainerTypeByDI
this typedef lets you create a vector container with new Datatype and Index types
void format(Random &rng, DataType min, DataType max)
Reset all elements of the container to random values.
TupleMatrixRow(First_ &&the_first, Rest_ &&... the_rest)
Sub-Matrix emplacement constructor.
void format(DataType value=DataType(0))
Reset all elements of the container to a given value or zero if missing.
First_::IndexType IndexType
sub-matrix index-type
std::size_t bytes() const
Returns the total amount of bytes allocated.
TupleMatrixRow()
default CTOR
First_::DataType DataType
sub-matrix data-type
TupleMatrixRow clone(LAFEM::CloneMode mode=LAFEM::CloneMode::Weak) const
Creates and returns a copy of this matrix.
void clone(const TupleMatrixRow &other)
Turns this matrix into a clone of other.
TupleMatrixRow(const TupleMatrixRow &)=delete
deleted copy-ctor
TupleElement< i_, First_, Rest_... >::Type & at()
Returns a sub-matrix block.
First_::VectorTypeL VectorTypeL
Compatible L-vector type.
Index rows() const
Returns the total number of rows in this matrix.
First_ _first
the first sub-matrix
TupleMatrixRow & operator=(const TupleMatrixRow &)=delete
deleted copy-assign operator
void clear()
Free all allocated arrays.
std::uint64_t set_checkpoint_data(std::vector< char > &data, SerialConfig &config)
Variadic TupleVector class template.
Pseudo-Random Number Generator.
String class implementation.
@ other
generic/other permutation strategy
@ rest
restriction (multigrid)
@ value
specifies whether the space should supply basis function values
std::uint64_t Index
Index data type.
Tuple container element helper class template.