5 boost::shared_ptr<VectorDouble> p_ptr,
6 boost::shared_ptr<VectorDouble> lift_ptr,
7 boost::shared_ptr<Range> ents_ptr)
10 std::fill(&doEntities[MBVERTEX], &doEntities[MBMAXTYPE],
false);
11 doEntities[MBEDGE] =
true;
18 const auto fe_ent = getFEEntityHandle();
21 auto t_w = getFTensor0IntegrationWeight();
23 auto t_normal = getFTensor1Normal();
24 auto t_coords = getFTensor1CoordsAtGaussPts();
25 auto t_lift = getFTensor1FromArray<SPACE_DIM, SPACE_DIM>(*
liftPtr);
27 const auto nb_int_points = getGaussPts().size2();
29 for (
int gg = 0; gg != nb_int_points; gg++) {
31 const double r = t_coords(0);
33 t_lift(
i) -= t_normal(
i) * (t_p * alpha);
45 boost::shared_ptr<VectorDouble>
pPtr;
52 boost::shared_ptr<MatrixDouble> u_ptr)
60 auto t_w = getFTensor0IntegrationWeight();
61 auto t_normal = getFTensor1Normal();
62 auto t_u = getFTensor1FromMat<SPACE_DIM>(*
uPtr);
63 auto t_row_base = row_data.getFTensor0N();
64 auto t_coords = getFTensor1CoordsAtGaussPts();
66 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
68 const double r = t_coords(0);
72 for (; bb != nbRows; ++bb) {
73 locF[bb] += alpha * t_row_base * (t_normal(
i) * t_u(
i));
77 for (; bb < nbRowBaseFunctions; ++bb)
89 boost::shared_ptr<MatrixDouble>
uPtr;
94 boost::shared_ptr<VectorDouble> lambda_ptr)
102 auto t_w = getFTensor0IntegrationWeight();
103 auto t_normal = getFTensor1Normal();
105 auto t_row_base = row_data.getFTensor0N();
106 auto t_coords = getFTensor1CoordsAtGaussPts();
108 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
110 auto t_nf = getFTensor1FromArray<U_FIELD_DIM, U_FIELD_DIM>(locF);
112 const double r = t_coords(0);
118 t_nf(
i) += alpha * t_row_base * t_normal(
i) * t_lambda;
123 for (; bb < nbRowBaseFunctions; ++bb)
140 boost::shared_ptr<MatrixDouble> grad_h_ptr,
141 boost::shared_ptr<Range> ents_ptr =
nullptr,
150 if (
entsPtr->find(AssemblyBoundaryEleOp::getFEEntityHandle()) ==
154 const double area = getMeasure();
155 auto t_w = getFTensor0IntegrationWeight();
156 auto t_row_base = row_data.getFTensor0N();
157 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
158 auto t_coords = getFTensor1CoordsAtGaussPts();
162 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
164 const double r = t_coords(0);
166 const double h_grad_norm = sqrt(t_grad_h(
i) * t_grad_h(
i) +
eps);
167 const double cos_angle = std::cos(M_PI *
wettingAngle / 180);
168 const double rhs_wetting = s *
eta2 * h_grad_norm * cos_angle;
173 for (; bb != nbRows; ++bb) {
174 locF[bb] += alpha * t_row_base * rhs_wetting;
178 for (; bb < nbRowBaseFunctions; ++bb)
198 const std::string field_name_col)
201 assembleTranspose =
true;
209 auto t_w = getFTensor0IntegrationWeight();
210 auto t_normal = getFTensor1Normal();
211 auto t_row_base = row_data.getFTensor0N();
212 auto t_coords = getFTensor1CoordsAtGaussPts();
214 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
216 auto t_mat = getFTensor1FromPtr<U_FIELD_DIM>(&locMat(0, 0));
218 const double r = t_coords(0);
222 for (; rr != nbRows; ++rr) {
224 auto t_col_base = col_data.getFTensor0N(gg, 0);
225 const double a = alpha * t_row_base;
227 for (
int cc = 0; cc != nbCols /
U_FIELD_DIM; ++cc) {
228 t_mat(
i) += (
a * t_col_base) * t_normal(
i);
235 for (; rr < nbRowBaseFunctions; ++rr)
249 const std::string row_field_name,
250 boost::shared_ptr<MatrixDouble> grad_h_ptr,
251 boost::shared_ptr<std::vector<VectorInt>> col_ind_ptr,
252 boost::shared_ptr<std::vector<MatrixDouble>> col_diff_base_ptr,
253 boost::shared_ptr<Range> ents_ptr =
nullptr,
double wetting_angle = 0)
263 if (
entsPtr->find(BoundaryEleOp::getFEEntityHandle()) ==
entsPtr->end())
266 const double area = getMeasure();
268 const auto row_size = data.getIndices().size();
272 auto integrate = [&](
auto col_indicies,
auto &col_diff_base_functions) {
275 const auto col_size = col_indicies.size();
277 locMat.resize(row_size, col_size,
false);
279 int nb_gp = getGaussPts().size2();
280 int nb_rows = data.getIndices().size();
282 auto t_w = getFTensor0IntegrationWeight();
283 auto t_coords = getFTensor1CoordsAtGaussPts();
284 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
285 auto t_row_base = data.getFTensor0N();
286 int nb_row_base_functions = data.getN().size2();
290 for (
int gg = 0; gg != nb_gp; ++gg) {
292 const double r = t_coords(0);
294 const double h_grad_norm = sqrt(t_grad_h(
i) * t_grad_h(
i) +
eps);
295 const double one_over_h_grad_norm = 1. / h_grad_norm;
296 const double beta = s * alpha *
eta2 * one_over_h_grad_norm *
300 for (; rr != nb_rows; ++rr) {
301 const double delta = beta * t_row_base;
303 auto ptr = &col_diff_base_functions(gg, 0);
304 auto t_col_diff_base = getFTensor1FromPtr<SPACE_DIM>(ptr);
306 for (
int cc = 0; cc != col_size; ++cc) {
307 locMat(rr, cc) += t_col_diff_base(
i) * (
delta * t_grad_h(
i));
313 for (; rr < nb_row_base_functions; ++rr) {
327 auto &col_ind = (*colIndicesPtr)[
c];
328 if (col_ind.size()) {
329 auto &diff_base = (*colDiffBaseFunctionsPtr)[
c];
331 CHKERR integrate(col_ind, diff_base);
334 &*data.getIndices().begin(), col_ind.size(),
335 &*col_ind.begin(), &
locMat(0, 0), ADD_VALUES);
359 boost::shared_ptr<MatrixDouble> dot_u_ptr,
360 boost::shared_ptr<MatrixDouble> u_ptr,
361 boost::shared_ptr<MatrixDouble> grad_u_ptr,
362 boost::shared_ptr<VectorDouble> h_ptr,
363 boost::shared_ptr<MatrixDouble> grad_h_ptr,
364 boost::shared_ptr<VectorDouble> g_ptr,
365 boost::shared_ptr<VectorDouble> p_ptr)
373 const double vol = getMeasure();
374 auto t_dot_u = getFTensor1FromMat<U_FIELD_DIM>(*
dotUPtr);
375 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
377 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
379 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
381 auto t_coords = getFTensor1CoordsAtGaussPts();
383 auto t_base = data.getFTensor0N();
384 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
386 auto t_w = getFTensor0IntegrationWeight();
402 const double r = t_coords(0);
410 t_inertia_force(
i) = (
rho * alpha) * (t_dot_u(
i));
413 t_phase_force(
i) = -alpha *
kappa * t_g * t_grad_h(
i);
414 t_convection(
i) = (
rho * alpha) * (t_u(
j) * t_grad_u(
i,
j));
417 alpha * (t_D(
i,
j,
k,
l) * t_grad_u(
k,
l) +
t_kd(
i,
j) * t_p);
419 auto t_nf = getFTensor1FromArray<U_FIELD_DIM, U_FIELD_DIM>(
locF);
421 t_forces(
i) = t_inertia_force(
i) + t_buoyancy(
i) + t_gravity(
i) +
422 t_convection(
i) + t_phase_force(
i);
427 t_nf(
i) += t_base * t_forces(
i);
428 t_nf(
i) += t_diff_base(
j) * t_stress(
i,
j);
431 t_nf(0) += (t_base * (alpha / t_coords(0))) * (2 *
mu * t_u(0) + t_p);
461 boost::shared_ptr<MatrixDouble>
uPtr;
463 boost::shared_ptr<VectorDouble>
hPtr;
465 boost::shared_ptr<VectorDouble>
gPtr;
466 boost::shared_ptr<VectorDouble>
pPtr;
476 boost::shared_ptr<MatrixDouble> grad_u_ptr,
477 boost::shared_ptr<VectorDouble> h_ptr)
489 const double vol = getMeasure();
490 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
491 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
493 auto t_coords = getFTensor1CoordsAtGaussPts();
495 auto t_row_base = row_data.getFTensor0N();
496 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
498 auto t_w = getFTensor0IntegrationWeight();
500 auto get_mat = [&](
const int rr) {
501 return getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
locMat, rr);
504 auto ts_a = getTSa();
509 const double r = t_coords(0);
514 const double beta0 = alpha *
rho;
515 const double beta1 = beta0 * ts_a;
522 auto t_col_base = col_data.getFTensor0N(gg, 0);
523 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
529 t_d_stress(
l,
j,
k) = t_D(
i,
j,
k,
l) * (alpha * t_row_diff_base(
i));
533 const double bb = t_row_base * t_col_base;
535 t_mat(
i,
j) += (beta1 * bb) *
t_kd(
i,
j);
536 t_mat(
i,
j) += (beta0 * bb) * t_grad_u(
i,
j);
538 (beta0 * t_row_base) *
t_kd(
i,
j) * (t_col_diff_base(
k) * t_u(
k));
539 t_mat(
i,
j) += t_d_stress(
i,
j,
k) * t_col_diff_base(
k);
542 t_mat(0, 0) += (bb * (alpha / t_coords(0))) * (2 *
mu);
571 boost::shared_ptr<MatrixDouble>
uPtr;
573 boost::shared_ptr<VectorDouble>
hPtr;
582 boost::shared_ptr<std::vector<VectorInt>> col_indices_ptr,
583 boost::shared_ptr<std::vector<MatrixDouble>> col_diff_basefunctions_ptr)
591 if (
type == MBVERTEX) {
613 OpLhsU_dH(
const std::string field_name_u,
const std::string field_name_h,
614 boost::shared_ptr<MatrixDouble> dot_u_ptr,
615 boost::shared_ptr<MatrixDouble> u_ptr,
616 boost::shared_ptr<MatrixDouble> grad_u_ptr,
617 boost::shared_ptr<VectorDouble> h_ptr,
618 boost::shared_ptr<VectorDouble> g_ptr)
624 assembleTranspose =
false;
631 const double vol = getMeasure();
632 auto t_dot_u = getFTensor1FromMat<U_FIELD_DIM>(*
dotUPtr);
633 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
634 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
637 auto t_coords = getFTensor1CoordsAtGaussPts();
639 auto t_row_base = row_data.getFTensor0N();
640 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
642 auto t_w = getFTensor0IntegrationWeight();
652 t_buoyancy_dh(
i) = 0;
655 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
657 const double r = t_coords(0);
664 auto t_D_dh =
get_D(2 * mu_dh);
666 t_inertia_force_dh(
i) = (alpha * rho_dh) * t_dot_u(
i);
668 t_gravity_dh(
SPACE_DIM - 1) = (alpha * rho_dh *
a0);
669 t_convection_dh(
i) = (rho_dh * alpha) * (t_u(
j) * t_grad_u(
i,
j));
670 const double t_phase_force_g_dh = -alpha *
kappa * t_g;
671 t_forces_dh(
i) = t_inertia_force_dh(
i) + t_buoyancy_dh(
i) +
672 t_gravity_dh(
i) + t_convection_dh(
i);
674 t_stress_dh(
i,
j) = alpha * (t_D_dh(
i,
j,
k,
l) * t_grad_u(
k,
l));
680 getFTensor1FromMat<U_FIELD_DIM, 1>(locMat, rr *
U_FIELD_DIM);
681 auto t_col_base = col_data.getFTensor0N(gg, 0);
682 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
684 for (
int cc = 0; cc != nbCols; ++cc) {
686 const double bb = t_row_base * t_col_base;
687 t_mat(
i) += t_forces_dh(
i) * bb;
688 t_mat(
i) += (t_phase_force_g_dh * t_row_base) * t_col_diff_base(
i);
689 t_mat(
i) += (t_row_diff_base(
j) * t_col_base) * t_stress_dh(
i,
j);
692 t_mat(0) += (bb * (alpha / t_coords(0))) * (2 * mu_dh * t_u(0));
704 for (; rr < nbRowBaseFunctions; ++rr) {
723 boost::shared_ptr<MatrixDouble>
uPtr;
725 boost::shared_ptr<VectorDouble>
hPtr;
726 boost::shared_ptr<VectorDouble>
gPtr;
735 OpLhsU_dG(
const std::string field_name_u,
const std::string field_name_h,
736 boost::shared_ptr<MatrixDouble> grad_h_ptr)
748 const double vol = getMeasure();
749 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
750 auto t_coords = getFTensor1CoordsAtGaussPts();
752 auto t_row_base = row_data.getFTensor0N();
753 auto t_w = getFTensor0IntegrationWeight();
757 const double r = t_coords(0);
761 t_phase_force_dg(
i) = -alpha *
kappa * t_grad_h(
i);
767 auto t_col_base = col_data.getFTensor0N(gg, 0);
769 for (
int cc = 0; cc !=
nbCols; ++cc) {
770 const double bb = t_row_base * t_col_base;
771 t_mat(
i) += t_phase_force_dg(
i) * bb;
799 boost::shared_ptr<VectorDouble> dot_h_ptr,
800 boost::shared_ptr<VectorDouble> h_ptr,
801 boost::shared_ptr<MatrixDouble> grad_h_ptr,
802 boost::shared_ptr<MatrixDouble> grad_g_ptr)
810 const double vol = getMeasure();
811 auto t_w = getFTensor0IntegrationWeight();
812 auto t_coords = getFTensor1CoordsAtGaussPts();
813 auto t_base = data.getFTensor0N();
814 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
817 if (data.getDiffN().size1() != data.getN().size1())
819 if (data.getDiffN().size2() != data.getN().size2() *
SPACE_DIM) {
822 MOFEM_LOG(
"SELF", Sev::error) << data.getN();
823 MOFEM_LOG(
"SELF", Sev::error) << data.getDiffN();
831 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
835 const double r = t_coords(0);
838 const double set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
839 const double m =
get_M(set_h) * alpha;
842 for (; bb !=
nbRows; ++bb) {
843 locF[bb] += (t_base * alpha) * (t_h - set_h);
844 locF[bb] += (t_diff_base(
i) *
m) * t_grad_g(
i);
865 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
866 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
867 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
871 const double r = t_coords(0);
874 const double m =
get_M(t_h) * alpha;
877 for (; bb !=
nbRows; ++bb) {
878 locF[bb] += (t_base * alpha) * (t_dot_h);
879 locF[bb] += (t_base * alpha) * (t_grad_h(
i) * t_u(
i));
880 locF[bb] += (t_diff_base(
i) * t_grad_g(
i)) *
m;
905 boost::shared_ptr<MatrixDouble>
uPtr;
907 boost::shared_ptr<VectorDouble>
hPtr;
917 OpLhsH_dU(
const std::string h_field_name,
const std::string u_field_name,
918 boost::shared_ptr<MatrixDouble> grad_h_ptr)
929 const double vol = getMeasure();
930 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
931 auto t_coords = getFTensor1CoordsAtGaussPts();
933 auto t_row_base = row_data.getFTensor0N();
934 auto t_w = getFTensor0IntegrationWeight();
938 const auto r = t_coords(0);
940 auto t_mat = getFTensor1FromPtr<U_FIELD_DIM>(&
locMat(0, 0));
944 for (; rr !=
nbRows; ++rr) {
945 t_row(
i) = (alpha * t_row_base) * t_grad_h(
i);
946 auto t_col_base = col_data.getFTensor0N(gg, 0);
948 t_mat(
i) += t_row(
i) * t_col_base;
977 boost::shared_ptr<VectorDouble> h_ptr,
978 boost::shared_ptr<MatrixDouble> grad_g_ptr)
989 const double vol = getMeasure();
990 auto t_w = getFTensor0IntegrationWeight();
991 auto t_coords = getFTensor1CoordsAtGaussPts();
992 auto t_row_base = row_data.getFTensor0N();
993 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
996 if (row_data.getDiffN().size1() != row_data.getN().size1())
998 if (row_data.getDiffN().size2() != row_data.getN().size2() *
SPACE_DIM) {
1001 MOFEM_LOG(
"SELF", Sev::error) << row_data.getN();
1002 MOFEM_LOG(
"SELF", Sev::error) << row_data.getDiffN();
1006 if (col_data.getDiffN().size1() != col_data.getN().size1())
1008 if (col_data.getDiffN().size2() != col_data.getN().size2() *
SPACE_DIM) {
1011 MOFEM_LOG(
"SELF", Sev::error) << col_data.getN();
1012 MOFEM_LOG(
"SELF", Sev::error) << col_data.getDiffN();
1020 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
1024 const double r = t_coords(0);
1028 for (; rr !=
nbRows; ++rr) {
1030 auto t_col_base = col_data.getFTensor0N(gg, 0);
1031 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1033 for (
int cc = 0; cc !=
nbCols; ++cc) {
1035 locMat(rr, cc) += (t_row_base * t_col_base * alpha);
1059 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
1060 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
1062 auto ts_a = getTSa();
1066 const double r = t_coords(0);
1071 for (; rr !=
nbRows; ++rr) {
1073 auto t_col_base = col_data.getFTensor0N(gg, 0);
1074 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1076 for (
int cc = 0; cc !=
nbCols; ++cc) {
1078 locMat(rr, cc) += (t_row_base * t_col_base * alpha) * ts_a;
1080 (t_row_base * alpha) * (t_col_diff_base(
i) * t_u(
i));
1082 (t_row_diff_base(
i) * t_grad_g(
i)) * (t_col_base * m_dh);
1109 boost::shared_ptr<MatrixDouble>
uPtr;
1110 boost::shared_ptr<VectorDouble>
hPtr;
1120 OpLhsH_dG(
const std::string field_name_h,
const std::string field_name_g,
1121 boost::shared_ptr<VectorDouble> h_ptr)
1133 const double vol = getMeasure();
1136 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
1137 auto t_w = getFTensor0IntegrationWeight();
1138 auto t_coords = getFTensor1CoordsAtGaussPts();
1142 const double r = t_coords(0);
1147 set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
1151 auto m =
get_M(set_h) * alpha;
1154 for (; rr !=
nbRows; ++rr) {
1155 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1157 for (
int cc = 0; cc !=
nbCols; ++cc) {
1158 locMat(rr, cc) += (t_row_diff_base(
i) * t_col_diff_base(
i)) *
m;
1179 boost::shared_ptr<VectorDouble>
hPtr;
1185 boost::shared_ptr<MatrixDouble> grad_h_ptr,
1186 boost::shared_ptr<VectorDouble> g_ptr)
1193 const double vol = getMeasure();
1195 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
1197 auto t_coords = getFTensor1CoordsAtGaussPts();
1199 auto t_base = data.getFTensor0N();
1200 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
1201 auto t_w = getFTensor0IntegrationWeight();
1205 const double r = t_coords(0);
1210 set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
1214 const double f =
get_f(set_h);
1217 for (; bb !=
nbRows; ++bb) {
1218 locF[bb] += (t_base * alpha) * (t_g -
f);
1219 locF[bb] -= (t_diff_base(
i) * (
eta2 * alpha)) * t_grad_h(
i);
1241 boost::shared_ptr<VectorDouble>
hPtr;
1243 boost::shared_ptr<VectorDouble>
gPtr;
1252 OpLhsG_dH(
const std::string field_name_g,
const std::string field_name_h,
1253 boost::shared_ptr<VectorDouble> h_ptr)
1265 const double vol = getMeasure();
1268 auto t_row_base = row_data.getFTensor0N();
1269 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
1270 auto t_w = getFTensor0IntegrationWeight();
1271 auto t_coords = getFTensor1CoordsAtGaussPts();
1275 const double r = t_coords(0);
1278 const double f_dh =
get_f_dh(t_h) * alpha;
1279 const double beta =
eta2 * alpha;
1282 for (; rr !=
nbRows; ++rr) {
1284 auto t_col_base = col_data.getFTensor0N(gg, 0);
1285 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1287 for (
int cc = 0; cc !=
nbCols; ++cc) {
1289 if constexpr (
I ==
false)
1290 locMat(rr, cc) -= (t_row_base * t_col_base) * f_dh;
1291 locMat(rr, cc) -= (t_row_diff_base(
i) * beta) * t_col_diff_base(
i);
1315 boost::shared_ptr<VectorDouble>
hPtr;
1334 const double vol = getMeasure();
1336 auto t_row_base = row_data.getFTensor0N();
1337 auto t_w = getFTensor0IntegrationWeight();
1338 auto t_coords = getFTensor1CoordsAtGaussPts();
1342 const double r = t_coords(0);
1346 for (; rr !=
nbRows; ++rr) {
1347 auto t_col_base = col_data.getFTensor0N(gg, 0);
1348 const double beta = alpha * t_row_base;
1349 for (
int cc = 0; cc !=
nbCols; ++cc) {
1350 locMat(rr, cc) += (t_col_base * beta);