280 {
282
283
285 const auto in_the_loop =
287
288
289 const double s = getMeasure() / (
areaMap[0]);
291
292
293 auto t_normal = getFTensor1Normal();
294 t_normal.normalize();
295
296 auto t_w = getFTensor0IntegrationWeight();
297
299
300 if (!nb_rows)
302
303
304 rhsF.resize(nb_rows,
false);
306
307 const size_t nb_integration_pts = getGaussPts().size2();
309
310
313 auto t_coords = getFTensor1CoordsAtGaussPts();
314
316 const double beta =
static_cast<double>(
nitsche) / (in_the_loop + 1);
317
318 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
319 const double alpha = getMeasure() * t_w;
320
321 const double source_val =
322 -p *
sourceFun(t_coords(0), t_coords(1), t_coords(2));
323
324 auto t_f =
rhsF.data().begin();
325
326 size_t rr = 0;
327 for (; rr != nb_rows; ++rr) {
328
330 t_vn_plus(
i) = beta * (
phi * t_diff_row_base(
i) / p);
332 t_vn(
i) = t_row_base * t_normal(
i) * sense_row - t_vn_plus(
i);
333
334
335 *t_f -= alpha * t_vn(
i) * (source_val * t_normal(
i));
336
337 ++t_row_base;
338 ++t_diff_row_base;
339 ++t_f;
340 }
341
342 for (; rr < nb_row_base_functions; ++rr) {
343 ++t_row_base;
344 ++t_diff_row_base;
345 }
346
347 ++t_w;
348 ++t_coords;
349 }
350
351
354 ADD_VALUES);
355
357 }
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
auto get_ntensor(T &base_mat)
std::array< MatrixDouble, 2 > rowBaseSideMap
FTensor::Index< 'i', SPACE_DIM > i
std::array< double, 2 > areaMap
std::array< VectorInt, 2 > indicesRowSideMap
indices on rows for left hand-side
std::array< int, 2 > senseMap
auto get_diff_ntensor(T &base_mat)
std::array< MatrixDouble, 2 > rowDiffBaseSideMap
VectorDouble rhsF
vector to store local operator right hand side