v0.15.0
Loading...
Searching...
No Matches
MoFEM::OpGetCoordsAndNormalsOnPrism Struct Reference

calculate normals at Gauss points of triangle element More...

#include "src/finite_elements/DataOperators.hpp"

Inheritance diagram for MoFEM::OpGetCoordsAndNormalsOnPrism:
[legend]
Collaboration diagram for MoFEM::OpGetCoordsAndNormalsOnPrism:
[legend]

Public Member Functions

 OpGetCoordsAndNormalsOnPrism (MatrixDouble &coords_at_gaussptf3, MatrixDouble &normals_at_gaussptf3, MatrixDouble &tangent1_at_gaussptf3, MatrixDouble &tangent2_at_gaussptf3, MatrixDouble &coords_at_gaussptf4, MatrixDouble &normals_at_gaussptf4, MatrixDouble &tangent1_at_gaussptf4, MatrixDouble &tangent2_at_gaussptf4)
 
MoFEMErrorCode doWork (int side, EntityType type, EntitiesFieldData::EntData &data)
 Operator for linear form, usually to calculate values on right hand side.
 
MoFEMErrorCode calculateNormals ()
 
- Public Member Functions inherited from MoFEM::DataOperator
 DataOperator (const bool symm=true)
 
virtual ~DataOperator ()=default
 
virtual MoFEMErrorCode doWork (int row_side, int col_side, EntityType row_type, EntityType col_type, EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
 Operator for bi-linear form, usually to calculate values on left hand side.
 
virtual MoFEMErrorCode opLhs (EntitiesFieldData &row_data, EntitiesFieldData &col_data)
 
virtual MoFEMErrorCode opRhs (EntitiesFieldData &data, const bool error_if_no_base=false)
 
bool getSymm () const
 Get if operator uses symmetry of DOFs or not.
 
void setSymm ()
 set if operator is executed taking in account symmetry
 
void unSetSymm ()
 unset if operator is executed for non symmetric problem
 

Public Attributes

MatrixDoublecOords_at_GaussPtF3
 
MatrixDoublenOrmals_at_GaussPtF3
 
MatrixDoubletAngent1_at_GaussPtF3
 
MatrixDoubletAngent2_at_GaussPtF3
 
MatrixDoublecOords_at_GaussPtF4
 
MatrixDoublenOrmals_at_GaussPtF4
 
MatrixDoubletAngent1_at_GaussPtF4
 
MatrixDoubletAngent2_at_GaussPtF4
 
MatrixDouble sPin
 
- Public Attributes inherited from MoFEM::DataOperator
DoWorkLhsHookFunType doWorkLhsHook
 
DoWorkRhsHookFunType doWorkRhsHook
 
bool sYmm
 If true assume that matrix is symmetric structure.
 
std::array< bool, MBMAXTYPE > doEntities
 If true operator is executed for entity.
 
booldoVertices
 \deprectaed If false skip vertices
 
booldoEdges
 \deprectaed If false skip edges
 
booldoQuads
 \deprectaed
 
booldoTris
 \deprectaed
 
booldoTets
 \deprectaed
 
booldoPrisms
 \deprectaed
 

Additional Inherited Members

- Public Types inherited from MoFEM::DataOperator
using DoWorkLhsHookFunType
 
using DoWorkRhsHookFunType
 

Detailed Description

calculate normals at Gauss points of triangle element

Definition at line 378 of file DataOperators.hpp.

Constructor & Destructor Documentation

◆ OpGetCoordsAndNormalsOnPrism()

MoFEM::OpGetCoordsAndNormalsOnPrism::OpGetCoordsAndNormalsOnPrism ( MatrixDouble & coords_at_gaussptf3,
MatrixDouble & normals_at_gaussptf3,
MatrixDouble & tangent1_at_gaussptf3,
MatrixDouble & tangent2_at_gaussptf3,
MatrixDouble & coords_at_gaussptf4,
MatrixDouble & normals_at_gaussptf4,
MatrixDouble & tangent1_at_gaussptf4,
MatrixDouble & tangent2_at_gaussptf4 )
inline

Definition at line 389 of file DataOperators.hpp.

394 : cOords_at_GaussPtF3(coords_at_gaussptf3),
395 nOrmals_at_GaussPtF3(normals_at_gaussptf3),
396 tAngent1_at_GaussPtF3(tangent1_at_gaussptf3),
397 tAngent2_at_GaussPtF3(tangent2_at_gaussptf3),
398 cOords_at_GaussPtF4(coords_at_gaussptf4),
399 nOrmals_at_GaussPtF4(normals_at_gaussptf4),
400 tAngent1_at_GaussPtF4(tangent1_at_gaussptf4),
401 tAngent2_at_GaussPtF4(tangent2_at_gaussptf4) {}

Member Function Documentation

◆ calculateNormals()

MoFEMErrorCode MoFEM::OpGetCoordsAndNormalsOnPrism::calculateNormals ( )

Definition at line 472 of file DataOperators.cpp.

472 {
474
475 sPin.resize(3, 3);
476 sPin.clear();
477 nOrmals_at_GaussPtF3.resize(tAngent1_at_GaussPtF3.size1(), 3, false);
478 for (unsigned int gg = 0; gg < tAngent1_at_GaussPtF3.size1(); ++gg) {
479 ierr = Spin(&*sPin.data().begin(), &tAngent1_at_GaussPtF3(gg, 0));
480 CHKERRG(ierr);
481 cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1., &*sPin.data().begin(), 3,
482 &tAngent2_at_GaussPtF3(gg, 0), 1, 0.,
483 &nOrmals_at_GaussPtF3(gg, 0), 1);
484 }
485 sPin.clear();
486 nOrmals_at_GaussPtF4.resize(tAngent1_at_GaussPtF4.size1(), 3, false);
487 for (unsigned int gg = 0; gg < tAngent1_at_GaussPtF4.size1(); ++gg) {
488 ierr = Spin(&*sPin.data().begin(), &tAngent1_at_GaussPtF4(gg, 0));
489 CHKERRG(ierr);
490 cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1., &*sPin.data().begin(), 3,
491 &tAngent2_at_GaussPtF4(gg, 0), 1, 0.,
492 &nOrmals_at_GaussPtF4(gg, 0), 1);
493 }
495}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
PetscErrorCode Spin(double *spinOmega, double *vecOmega)
calculate spin matrix from vector
Definition fem_tools.c:546
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr

◆ doWork()

MoFEMErrorCode MoFEM::OpGetCoordsAndNormalsOnPrism::doWork ( int side,
EntityType type,
EntitiesFieldData::EntData & data )
virtual

Operator for linear form, usually to calculate values on right hand side.

Reimplemented from MoFEM::DataOperator.

Definition at line 388 of file DataOperators.cpp.

389 {
391
392 if (data.getFieldData().size() == 0)
394 const int valid_edges3[] = {1, 1, 1, 0, 0, 0, 0, 0, 0};
395 const int valid_faces3[] = {0, 0, 0, 1, 0, 0, 0, 0, 0};
396 const int valid_edges4[] = {0, 0, 0, 0, 0, 0, 1, 1, 1};
397 const int valid_faces4[] = {0, 0, 0, 0, 1, 0, 0, 0, 0};
398
399 if (type == MBEDGE) {
400 if (!valid_edges3[side] || valid_edges4[side])
402 } else if (type == MBTRI) {
403 if (!valid_faces3[side] || valid_faces4[side])
405 }
406
407 switch (type) {
408 case MBVERTEX: {
409 for (unsigned int gg = 0; gg < data.getN().size1(); ++gg) {
410 for (int dd = 0; dd < 3; dd++) {
411 cOords_at_GaussPtF3(gg, dd) =
412 cblas_ddot(3, &data.getN(gg)[0], 1, &data.getFieldData()[dd], 3);
413 tAngent1_at_GaussPtF3(gg, dd) = cblas_ddot(
414 3, &data.getDiffN()(gg, 0), 2, &data.getFieldData()[dd], 3);
415 tAngent2_at_GaussPtF3(gg, dd) = cblas_ddot(
416 3, &data.getDiffN()(gg, 1), 2, &data.getFieldData()[dd], 3);
417 cOords_at_GaussPtF4(gg, dd) = cblas_ddot(
418 3, &data.getN(gg)[0], 1, &data.getFieldData()[9 + dd], 3);
419 tAngent1_at_GaussPtF4(gg, dd) = cblas_ddot(
420 3, &data.getDiffN()(gg, 6 + 0), 2, &data.getFieldData()[9 + dd], 3);
421 tAngent2_at_GaussPtF4(gg, dd) = cblas_ddot(
422 3, &data.getDiffN()(gg, 6 + 1), 2, &data.getFieldData()[9 + dd], 3);
423 }
424 }
425 } break;
426 case MBEDGE:
427 case MBTRI: {
428 if (2 * data.getN().size2() != data.getDiffN().size2()) {
429 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "data inconsistency");
430 }
431 unsigned int nb_dofs = data.getFieldData().size();
432 if (nb_dofs % 3 != 0) {
433 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "data inconsistency");
434 }
435 if (nb_dofs > 3 * data.getN().size2()) {
436 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
437 "data inconsistency, side %d type %d", side, type);
438 }
439 for (unsigned int gg = 0; gg < data.getN().size1(); ++gg) {
440 for (int dd = 0; dd < 3; dd++) {
441 if ((type == MBTRI && valid_faces3[side]) ||
442 (type == MBEDGE && valid_edges3[side])) {
443 cOords_at_GaussPtF3(gg, dd) += cblas_ddot(
444 nb_dofs / 3, &data.getN(gg)[0], 1, &data.getFieldData()[dd], 3);
445 tAngent1_at_GaussPtF3(gg, dd) +=
446 cblas_ddot(nb_dofs / 3, &data.getDiffN()(gg, 0), 2,
447 &data.getFieldData()[dd], 3);
448 tAngent2_at_GaussPtF3(gg, dd) +=
449 cblas_ddot(nb_dofs / 3, &data.getDiffN()(gg, 1), 2,
450 &data.getFieldData()[dd], 3);
451 } else if ((type == MBTRI && valid_faces4[side]) ||
452 (type == MBEDGE && valid_edges4[side])) {
453 cOords_at_GaussPtF4(gg, dd) += cblas_ddot(
454 nb_dofs / 3, &data.getN(gg)[0], 1, &data.getFieldData()[dd], 3);
455 tAngent1_at_GaussPtF4(gg, dd) +=
456 cblas_ddot(nb_dofs / 3, &data.getDiffN()(gg, 0), 2,
457 &data.getFieldData()[dd], 3);
458 tAngent2_at_GaussPtF4(gg, dd) +=
459 cblas_ddot(nb_dofs / 3, &data.getDiffN()(gg, 1), 2,
460 &data.getFieldData()[dd], 3);
461 }
462 }
463 }
464 } break;
465 default:
466 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
467 }
468
470}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition ddTensor0.hpp:33

Member Data Documentation

◆ cOords_at_GaussPtF3

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::cOords_at_GaussPtF3

Definition at line 380 of file DataOperators.hpp.

◆ cOords_at_GaussPtF4

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::cOords_at_GaussPtF4

Definition at line 384 of file DataOperators.hpp.

◆ nOrmals_at_GaussPtF3

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::nOrmals_at_GaussPtF3

Definition at line 381 of file DataOperators.hpp.

◆ nOrmals_at_GaussPtF4

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::nOrmals_at_GaussPtF4

Definition at line 385 of file DataOperators.hpp.

◆ sPin

MatrixDouble MoFEM::OpGetCoordsAndNormalsOnPrism::sPin

Definition at line 403 of file DataOperators.hpp.

◆ tAngent1_at_GaussPtF3

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::tAngent1_at_GaussPtF3

Definition at line 382 of file DataOperators.hpp.

◆ tAngent1_at_GaussPtF4

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::tAngent1_at_GaussPtF4

Definition at line 386 of file DataOperators.hpp.

◆ tAngent2_at_GaussPtF3

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::tAngent2_at_GaussPtF3

Definition at line 383 of file DataOperators.hpp.

◆ tAngent2_at_GaussPtF4

MatrixDouble& MoFEM::OpGetCoordsAndNormalsOnPrism::tAngent2_at_GaussPtF4

Definition at line 387 of file DataOperators.hpp.


The documentation for this struct was generated from the following files: