28 #include <type_traits>
32 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
42 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
43 template<
class Form2,
class Cmpt2>
53 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
56 template<
class, Foam::direction, Foam::direction>
class Block2,
62 const Block2<Form, BRowStart, BColStart>&
block
69 operator()(i, j) =
block(i, j);
75 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
82 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
83 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
93 "Rows in block > rows in matrix"
98 "Columns in block > columns in matrix"
103 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
104 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
114 "Rows in block > rows in matrix"
119 "Columns in block > columns in matrix"
126 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
127 template<Foam::direction Row, Foam::direction Col>
130 static_assert(Row < Mrows && Col < Ncols,
"Address outside matrix");
131 return this->
v_[Row*Ncols + Col];
135 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
136 template<Foam::direction Row, Foam::direction Col>
139 static_assert(Row < Mrows && Col < Ncols,
"Address outside matrix");
140 return this->
v_[Row*Ncols + Col];
144 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
151 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
158 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
165 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
172 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
179 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
186 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
193 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
200 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
207 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
214 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
221 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
228 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
235 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
242 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
249 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
256 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
262 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
268 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
272 static_assert(Mrows == Ncols,
"Matrix is not square");
284 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
302 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
310 ConstBlock<SubTensor, BRowStart, BColStart>
317 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
326 Block<SubTensor, BRowStart, BColStart>
335 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
343 if (i >= Mrows || j >= Ncols)
346 <<
"indices out of range"
351 return this->
v_[i*Ncols + j];
355 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
363 if (i >= Mrows || j >= Ncols)
366 <<
"indices out of range"
371 return this->
v_[i*Ncols + j];
375 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
376 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
386 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
387 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
393 return matrix_(BRowStart + i, BColStart + j);
397 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
398 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
406 for (
direction i=0; i<SubTensor::mRows; ++i)
408 for (
direction j=0; j<SubTensor::nCols; ++j)
410 st[i*SubTensor::nCols + j] =
operator()(i, j);
418 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
419 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
425 return matrix_(BRowStart + i, BColStart + j);
429 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
430 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
436 return matrix_(BRowStart + i, BColStart + j);
440 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
450 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
451 template<
class Form2>
457 *
this = *
this & matrix;
461 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
464 template<
class, Foam::direction, Foam::direction>
class Block2,
470 const Block2<Form, BRowStart, BColStart>&
block
483 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
484 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
485 template<
class Form2>
488 Block<SubTensor, BRowStart, BColStart>
::
504 template<
class Form,
class Cmpt, Foam::direction Mrows, Foam::direction Ncols>
505 template<
class SubTensor, Foam::direction BRowStart, Foam::direction BColStart>
506 template<
class VSForm>
515 static_assert(
nCols == 1,
"Matrix must have a single column");
517 for (
direction i=0; i<SubTensor::mRows; ++i)
531 template<
class Form,
class Cmpt, direction Mrows, direction Ncols>
541 template<
class Form,
class Cmpt, direction Ncmpts>
579 "Number of columns in matrix 1 != number of rows in matrix 2"
590 result(i, j) += matrix1(i,
k)*matrix2(
k, j);
599 template<
class Form,
class VSForm,
class Cmpt, direction Mrows, direction Ncols>
612 result[i] += matrix(i, j)*v[j];
640 result(i, j) = v1[i]*v2[j];