28 #include <type_traits>
32 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
37 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
47 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
48 template<
class Form2,
class Cmpt2>
58 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
61 template<
class, Foam::direction, Foam::direction>
class Block2,
67 const Block2<Form, BRowStart, BColStart>&
block
74 operator()(i, j) =
block(i, j);
80 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
87 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
88 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
98 "Rows in block > rows in matrix"
103 "Columns in block > columns in matrix"
108 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
109 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
119 "Rows in block > rows in matrix"
124 "Columns in block > columns in matrix"
131 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
132 template<Foam::direction Row, Foam::direction Col>
135 static_assert(Row < Mrows && Col < Ncols,
"Address outside matrix");
136 return this->
v_[Row*Ncols + Col];
140 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
141 template<Foam::direction Row, Foam::direction Col>
144 static_assert(Row < Mrows && Col < Ncols,
"Address outside matrix");
145 return this->
v_[Row*Ncols + Col];
149 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
156 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
163 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
170 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
177 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
184 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
191 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
198 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
205 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
212 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
219 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
226 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
233 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
240 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
247 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
254 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
261 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
267 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
273 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
277 static_assert(Mrows == Ncols,
"Matrix is not square");
289 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
307 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
315 ConstBlock<SubTensor, BRowStart, BColStart>
322 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
331 Block<SubTensor, BRowStart, BColStart>
340 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
348 if (i >= Mrows || j >= Ncols)
351 <<
"indices out of range"
356 return this->
v_[i*Ncols + j];
360 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
368 if (i >= Mrows || j >= Ncols)
371 <<
"indices out of range"
376 return this->
v_[i*Ncols + j];
380 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
381 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
391 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
392 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
398 return matrix_(BRowStart + i, BColStart + j);
402 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
403 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
411 for (
direction i=0; i<SubTensor::mRows; ++i)
413 for (
direction j=0; j<SubTensor::nCols; ++j)
415 st[i*SubTensor::nCols + j] =
operator()(i, j);
423 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
424 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
430 return matrix_(BRowStart + i, BColStart + j);
434 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
435 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
441 return matrix_(BRowStart + i, BColStart + j);
445 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
455 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
456 template<
class Form2>
462 *
this = *
this & matrix;
466 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
469 template<
class, Foam::direction, Foam::direction>
class Block2,
475 const Block2<Form, BRowStart, BColStart>&
block
488 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
489 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
490 template<
class Form2>
493 Block<SubTensor, BRowStart, BColStart>
::
509 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
510 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
511 template<
class VSForm>
520 static_assert(
nCols == 1,
"Matrix must have a single column");
522 for (
direction i=0; i<SubTensor::mRows; ++i)
536 template<
class Form,
class Cmpt, direction Mrows, direction Ncols>
546 template<
class Form,
class Cmpt, direction Ncmpts>
584 "Number of columns in matrix 1 != number of rows in matrix 2"
595 result(i, j) += matrix1(i,
k)*matrix2(
k, j);
604 template<
class Form,
class VSForm,
class Cmpt, direction Mrows, direction Ncols>
617 result[i] += matrix(i, j)*v[j];
645 result(i, j) = v1[i]*v2[j];