330 {
332
335 &
m(r + 0,
c + 0), &
m(r + 0,
c + 1), &
m(r + 0,
c + 2),
336 &
m(r + 1,
c + 0), &
m(r + 1,
c + 1), &
m(r + 1,
c + 2),
337 &
m(r + 2,
c + 0), &
m(r + 2,
c + 1), &
m(r + 2,
c + 2));
338 };
339
340 const int row_nb_dofs = row_data.getIndices().size();
341 if (!row_nb_dofs)
343 const int col_nb_dofs = col_data.getIndices().size();
344 if (!col_nb_dofs)
346 if (
dAta.
tEts.find(getNumeredEntFiniteElementPtr()->getEnt()) ==
349 }
351
352 const bool diagonal_block =
353 (row_type == col_type) && (row_side == col_side);
354
355
356 locK.resize(row_nb_dofs, col_nb_dofs,
false);
358
359 const int row_nb_gauss_pts = row_data.getN().size1();
360 const int row_nb_base_functions = row_data.getN().size2();
361
362 auto row_diff_base_functions = row_data.getFTensor1DiffN<3>();
363
368
369
370 for (int gg = 0; gg != row_nb_gauss_pts; gg++) {
371
372
373 double w = getVolume() * getGaussPts()(3, gg);
374
375 int row_bb = 0;
376 for (; row_bb != row_nb_dofs / 3; row_bb++) {
377
378 auto col_diff_base_functions = col_data.getFTensor1DiffN<3>(gg, 0);
379 const int final_bb = diagonal_block ? row_bb + 1 : col_nb_dofs / 3;
380 int col_bb = 0;
381 for (; col_bb != final_bb; col_bb++) {
382
383 auto t_assemble = get_tensor2(
locK, 3 * row_bb, 3 * col_bb);
384
386 w * row_diff_base_functions(
j) * col_diff_base_functions(
l);
387
389
390 ++col_diff_base_functions;
391 }
392
393 ++row_diff_base_functions;
394 }
395 for (; row_bb != row_nb_base_functions; row_bb++) {
396 ++row_diff_base_functions;
397 }
398 }
399
400 if (diagonal_block) {
401 for (int row_bb = 0; row_bb != row_nb_dofs / 3; row_bb++) {
402 int col_bb = 0;
403 for (; col_bb != row_bb + 1; col_bb++) {
404 auto t_assemble = get_tensor2(
locK, 3 * row_bb, 3 * col_bb);
405 auto t_off_side = get_tensor2(
locK, 3 * col_bb, 3 * row_bb);
406 t_off_side(
i,
k) = t_assemble(
k,
i);
407 }
408 }
409 }
410
411 const int *row_ind = &*row_data.getIndices().begin();
412 const int *col_ind = &*col_data.getIndices().begin();
413 Mat
B = getFEMethod()->ksp_B != PETSC_NULL ? getFEMethod()->ksp_B
414 : getFEMethod()->ksp_B;
416 &
locK(0, 0), ADD_VALUES);
417
418 if (row_type != col_type || row_side != col_side) {
419 translocK.resize(col_nb_dofs, row_nb_dofs,
false);
423 }
424
426 }
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
UBlasMatrix< double > MatrixDouble
FTensor::Tensor2< double, 3, 3 > diffDiff