v0.14.0
Functions | Variables
l2.c File Reference
#include <petscsys.h>
#include <cblas.h>
#include <definitions.h>
#include <fem_tools.h>
#include <base_functions.h>
#include <h1_hdiv_hcurl_l2.h>

Go to the source code of this file.

Functions

PetscErrorCode L2_Ainsworth_ShapeFunctions_MBTRI (int p, double *N, double *diffN, double *L2N, double *diff_L2N, int GDIM, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
 Get base functions on triangle for L2 space. More...
 
PetscErrorCode L2_Ainsworth_ShapeFunctions_MBTET (int p, double *N, double *diffN, double *L2N, double *diff_L2N, int GDIM, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
 Get base functions on tetrahedron for L2 space. More...
 

Variables

static PetscErrorCode ierr
 

Detailed Description

Based on Hierarchic Finite Element Bases on Unstructured Tetrahedral Meshes, by Mark Ainsworth and Joe Coyle Shape functions for MBTRI and H1 approximation

Definition in file l2.c.

Function Documentation

◆ L2_Ainsworth_ShapeFunctions_MBTET()

PetscErrorCode L2_Ainsworth_ShapeFunctions_MBTET ( int  p,
double N,
double diffN,
double L2N,
double diff_L2N,
int  GDIM,
PetscErrorCode(*)(int p, double s, double *diff_s, double *L, double *diffL, const int dim)  base_polynomials 
)

Get base functions on tetrahedron for L2 space.

Parameters
ppolynomial order
Nbarycentric coordinates (shape functions) at integration points
diffNderivatives of barycentric coordinates, i.e. derivatives of shape functions
L2Nvalues of L2 base at integration points
diff_L2Ndirvatives of base functions at integration points
GDIMnumber of integration points
base_polynomialspolynomial base used to construct L2 base on element
Returns
PetscErrorCode

Definition at line 74 of file l2.c.

78  {
80 
81  int P = NBVOLUMETET_L2(p);
82  if (P == 0)
84  double diff_ksiL0[3], diff_ksiL1[3], diff_ksiL2[3];
85  int dd = 0;
86  if (diffN != NULL) {
87  for (; dd < 3; dd++) {
88  diff_ksiL0[dd] = (diffN[1 * 3 + dd] - diffN[0 * 3 + dd]);
89  diff_ksiL1[dd] = (diffN[2 * 3 + dd] - diffN[0 * 3 + dd]);
90  diff_ksiL2[dd] = (diffN[3 * 3 + dd] - diffN[0 * 3 + dd]);
91  }
92  }
93  int ii = 0;
94  for (; ii != GDIM; ++ii) {
95  int node_shift = ii * 4;
96  double ksiL0 = N[node_shift + 1] - N[node_shift + 0];
97  double ksiL1 = N[node_shift + 2] - N[node_shift + 0];
98  double ksiL2 = N[node_shift + 3] - N[node_shift + 0];
99  double L0[p + 1], L1[p + 1], L2[p + 1];
100  double diffL0[3 * (p + 1)], diffL1[3 * (p + 1)], diffL2[3 * (p + 1)];
101  if (diffN != NULL) {
102  ierr = base_polynomials(p, ksiL0, diff_ksiL0, L0, diffL0, 3);
103  CHKERRQ(ierr);
104  ierr = base_polynomials(p, ksiL1, diff_ksiL1, L1, diffL1, 3);
105  CHKERRQ(ierr);
106  ierr = base_polynomials(p, ksiL2, diff_ksiL2, L2, diffL2, 3);
107  CHKERRQ(ierr);
108  } else {
109  ierr = base_polynomials(p, ksiL0, NULL, L0, NULL, 3);
110  CHKERRQ(ierr);
111  ierr = base_polynomials(p, ksiL1, NULL, L1, NULL, 3);
112  CHKERRQ(ierr);
113  ierr = base_polynomials(p, ksiL2, NULL, L2, NULL, 3);
114  CHKERRQ(ierr);
115  }
116  int shift = ii * P;
117  int jj = 0;
118  int oo = 0;
119  for (; oo <= p; oo++) {
120  int pp0 = 0;
121  for (; pp0 <= oo; pp0++) {
122  int pp1 = 0;
123  for (; (pp0 + pp1) <= oo; pp1++) {
124  int pp2 = oo - pp0 - pp1;
125  if (pp2 >= 0) {
126  if (L2N != NULL) {
127  L2N[shift + jj] = L0[pp0] * L1[pp1] * L2[pp2];
128  }
129  if (diff_L2N != NULL) {
130  int dd = 0;
131  for (; dd < 3; dd++) {
132  diff_L2N[3 * shift + 3 * jj + dd] =
133  diffL0[dd * (p + 1) + pp0] * L1[pp1] * L2[pp2] +
134  L0[pp0] * diffL1[dd * (p + 1) + pp1] * L2[pp2] +
135  L0[pp0] * L1[pp1] * diffL2[dd * (p + 1) + pp2];
136  }
137  }
138  jj++;
139  }
140  }
141  }
142  }
143  if (jj != P)
144  SETERRQ2(PETSC_COMM_SELF, 1, "wrong order %d != %d", jj, P);
145  }
147 }

◆ L2_Ainsworth_ShapeFunctions_MBTRI()

PetscErrorCode L2_Ainsworth_ShapeFunctions_MBTRI ( int  p,
double N,
double diffN,
double L2N,
double diff_L2N,
int  GDIM,
PetscErrorCode(*)(int p, double s, double *diff_s, double *L, double *diffL, const int dim)  base_polynomials 
)

Get base functions on triangle for L2 space.

Parameters
ppolynomial order
Nbarycentric coordinates (shape functions) at integration points
diffNderivatives of barycentric coordinates, i.e. derivatives of shape functions
L2Nvalues of L2 base at integration points
diff_L2Ndirvatives of base functions at integration points
GDIMnumber of integration points
base_polynomialspolynomial base used to construct L2 base on element
Returns
PetscErrorCode

Definition at line 19 of file l2.c.

23  {
25 
26  int P = NBFACETRI_L2(p);
27  if (P == 0)
29  double diff_ksiL01[2], diff_ksiL20[2];
30  int dd = 0;
31  for (; dd < 2; dd++) {
32  diff_ksiL01[dd] = (diffN[1 * 2 + dd] - diffN[0 * 2 + dd]);
33  diff_ksiL20[dd] = (diffN[2 * 2 + dd] - diffN[0 * 2 + dd]);
34  }
35  int ii = 0;
36  for (; ii != GDIM; ++ii) {
37  int node_shift = ii * 3;
38  double ksiL01 = N[node_shift + 1] - N[node_shift + 0];
39  double ksiL20 = N[node_shift + 2] - N[node_shift + 0];
40  double L01[p + 1], L20[p + 1];
41  double diffL01[2 * (p + 1)], diffL20[2 * (p + 1)];
42  ierr = base_polynomials(p, ksiL01, diff_ksiL01, L01, diffL01, 2);
43  CHKERRQ(ierr);
44  ierr = base_polynomials(p, ksiL20, diff_ksiL20, L20, diffL20, 2);
45  CHKERRQ(ierr);
46  int shift = ii * P;
47  int jj = 0;
48  int oo = 0;
49  for (; oo <= p; oo++) {
50  int pp0 = 0;
51  for (; pp0 <= oo; pp0++) {
52  int pp1 = oo - pp0;
53  if (pp1 >= 0) {
54  if (L2N != NULL) {
55  L2N[shift + jj] = L01[pp0] * L20[pp1];
56  }
57  if (diff_L2N != NULL) {
58  int dd = 0;
59  for (; dd < 2; dd++) {
60  diff_L2N[2 * shift + 2 * jj + dd] =
61  diffL01[dd * (p + 1) + pp0] * L20[pp1] +
62  L01[pp0] * diffL20[dd * (p + 1) + pp1];
63  }
64  }
65  jj++;
66  }
67  }
68  }
69  if (jj != P)
70  SETERRQ1(PETSC_COMM_SELF, 1, "wrong order %d", jj);
71  }
73 }

Variable Documentation

◆ ierr

PetscErrorCode ierr
static

Definition at line 17 of file l2.c.

MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:460
ierr
static PetscErrorCode ierr
Definition: l2.c:17
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
NBVOLUMETET_L2
#define NBVOLUMETET_L2(P)
Number of base functions on tetrahedron for L2 space.
Definition: h1_hdiv_hcurl_l2.h:27
EshelbianPlasticity::P
@ P
Definition: EshelbianContact.cpp:197
N
const int N
Definition: speed_test.cpp:3
FTensor::dd
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
NBFACETRI_L2
#define NBFACETRI_L2(P)
Number of base functions on triangle for L2 space.
Definition: h1_hdiv_hcurl_l2.h:42
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:453