v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
HcurlFaceBase Struct Reference
Collaboration diagram for HcurlFaceBase:
[legend]

Public Member Functions

template<int DIM, typename TPhi , typename TDiffPhi >
MoFEMErrorCode calculateOneFamily (int p, int nb_integration_pts, int n0f0_idx, int n1f0_idx, int n2f0_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi &t_diff_phi)
 
template<int DIM, typename TPhi , typename TDiffPhi >
MoFEMErrorCode calculateTwoFamily (int p, int nb_integration_pts, int n0f0_idx, int n1f0_idx, int n2f0_idx, int n0f1_idx, int n1f1_idx, int n2f1_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi &t_diff_phi)
 

Public Attributes

HcurlEdgeBase hCurlBaseOnEdge
 
VectorDouble f0PhiII
 
VectorDouble diffF0PhiII
 
VectorDouble f1PhiII
 
VectorDouble diffF1PhiII
 
VectorDouble iFiF0
 
VectorDouble diffIFiF0
 
VectorDouble iFiF1
 
VectorDouble diffIFiF1
 
FTensor::Index< 'i', 3 > i
 

Detailed Description

Definition at line 2187 of file Hcurl.cpp.

Member Function Documentation

◆ calculateOneFamily()

template<int DIM, typename TPhi , typename TDiffPhi >
MoFEMErrorCode HcurlFaceBase::calculateOneFamily ( int  p,
int  nb_integration_pts,
int  n0f0_idx,
int  n1f0_idx,
int  n2f0_idx,
double  n[],
FTensor::Tensor1< double, 3 >  t_grad_n[],
TPhi &  t_phi,
TDiffPhi &  t_diff_phi 
)
inline

Definition at line 2197 of file Hcurl.cpp.

2200 {
2201
2202 FTensor::Index<'j', DIM> j;
2203
2205 f0PhiII.resize(3 * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts, false);
2206 diffF0PhiII.resize(3 * DIM * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts,
2207 false);
2208
2209 // edge base for family I
2210 double *f0_phi_ii = &*f0PhiII.data().begin();
2211 double *diff_f0_phi_ii = &*diffF0PhiII.data().begin();
2212 auto t_f0_phi_ii = getFTensor1FromPtr<3>(f0_phi_ii);
2213 auto t_diff_f0_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f0_phi_ii);
2214
2215 CHKERR hCurlBaseOnEdge.calculate<DIM, true>(p - 1, nb_integration_pts,
2216 n0f0_idx, n1f0_idx, n, t_grad_n,
2217 t_f0_phi_ii, &t_diff_f0_phi_ii);
2218
2219 FTensor::Tensor1<double, 3> &t_grad_n0f0 = t_grad_n[n0f0_idx];
2220 FTensor::Tensor1<double, 3> &t_grad_n1f0 = t_grad_n[n1f0_idx];
2221 FTensor::Tensor1<double, 3> &t_grad_n2f0 = t_grad_n[n2f0_idx];
2222 FTensor::Tensor1<double, 3> t_grad_n0f0_p_n1f0;
2223 t_grad_n0f0_p_n1f0(i) = t_grad_n0f0(i) + t_grad_n1f0(i) + t_grad_n2f0(i);
2224
2225 iFiF0.resize(p + 1, false);
2226 diffIFiF0.resize(3 * p + 3, false);
2227 diffIFiF0.clear();
2228
2229 double *ifif0 = &*iFiF0.data().begin();
2230 double *diff_ifif0 = &*diffIFiF0.data().begin();
2231
2232 for (int gg = 0; gg != nb_integration_pts; ++gg) {
2233
2234 const int shift_n = (DIM + 1) * gg;
2235 const double n0f0 = n[shift_n + n0f0_idx];
2236 const double n1f0 = n[shift_n + n1f0_idx];
2237 const double n2f0 = n[shift_n + n2f0_idx];
2238
2239 int phi_shift = 3 * NBEDGE_DEMKOWICZ_HCURL(p - 1) * gg;
2240 int diff_phi_shift = (3 * DIM) * NBEDGE_DEMKOWICZ_HCURL(p - 1) * gg;
2241
2242 for (int oo = 2; oo <= p; ++oo) {
2243
2244 auto t_f0_phi_ii = getFTensor1FromPtr<3>(&f0_phi_ii[phi_shift]);
2245 auto t_diff_f0_phi_ii =
2246 getFTensor2FromPtr<3, DIM>(&diff_f0_phi_ii[diff_phi_shift]);
2247
2248 for (int ii = 0; ii <= oo - 2; ii++) {
2249
2250 int jj = oo - 2 - ii;
2251
2252 // family I
2254 jj + 1, 2 * ii + 1, n2f0, n0f0 + n1f0 + n2f0, &t_grad_n2f0(0),
2255 &t_grad_n0f0_p_n1f0(0), ifif0, diff_ifif0, DIM);
2256 FTensor::Tensor1<double, 3> t_diff_ifif0(
2257 diff_ifif0[0 + jj], diff_ifif0[(jj + 1) + jj],
2258 diff_ifif0[2 * (jj + 1) + jj]);
2259 t_phi(i) = ifif0[jj] * t_f0_phi_ii(i);
2260 t_diff_phi(i, j) = ifif0[jj] * t_diff_f0_phi_ii(i, j) +
2261 t_diff_ifif0(j) * t_f0_phi_ii(i);
2262 ++t_phi;
2263 ++t_diff_phi;
2264 ++t_f0_phi_ii;
2265 ++t_diff_f0_phi_ii;
2266 }
2267 }
2268 }
2269
2271 }
PetscErrorCode IntegratedJacobi_polynomials(int p, double alpha, double x, double t, double *diff_x, double *diff_t, double *L, double *diffL, const int dim)
Calculate integrated Jacobi approximation basis.
#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.
#define NBEDGE_DEMKOWICZ_HCURL(P)
const double n
refractive index of diffusive medium
FTensor::Index< 'j', 3 > j
MoFEMErrorCode calculate(int p, int nb_integration_pts, int n0_idx, int n1_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi *t_diff_phi_ptr)
Definition Hcurl.cpp:1992
VectorDouble iFiF0
Definition Hcurl.cpp:2191
VectorDouble diffF0PhiII
Definition Hcurl.cpp:2189
HcurlEdgeBase hCurlBaseOnEdge
Definition Hcurl.cpp:2188
FTensor::Index< 'i', 3 > i
Definition Hcurl.cpp:2194
VectorDouble diffIFiF0
Definition Hcurl.cpp:2191
VectorDouble f0PhiII
Definition Hcurl.cpp:2189

◆ calculateTwoFamily()

template<int DIM, typename TPhi , typename TDiffPhi >
MoFEMErrorCode HcurlFaceBase::calculateTwoFamily ( int  p,
int  nb_integration_pts,
int  n0f0_idx,
int  n1f0_idx,
int  n2f0_idx,
int  n0f1_idx,
int  n1f1_idx,
int  n2f1_idx,
double  n[],
FTensor::Tensor1< double, 3 >  t_grad_n[],
TPhi &  t_phi,
TDiffPhi &  t_diff_phi 
)
inline

Definition at line 2275 of file Hcurl.cpp.

2278 {
2279
2280 FTensor::Index<'j', DIM> j;
2281
2283
2284 f0PhiII.resize(3 * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts, false);
2285 diffF0PhiII.resize(3 * DIM * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts,
2286 false);
2287 f1PhiII.resize(3 * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts, false);
2288 diffF1PhiII.resize(3 * DIM * NBEDGE_DEMKOWICZ_HCURL(p) * nb_integration_pts,
2289 false);
2290
2291 // edge base for family I
2292 double *f0_phi_ii = &*f0PhiII.data().begin();
2293 double *diff_f0_phi_ii = &*diffF0PhiII.data().begin();
2294 auto t_f0_phi_ii = getFTensor1FromPtr<3>(f0_phi_ii);
2295 auto t_diff_f0_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f0_phi_ii);
2296 CHKERR hCurlBaseOnEdge.calculate<DIM, true>(p - 1, nb_integration_pts,
2297 n0f0_idx, n1f0_idx, n, t_grad_n,
2298 t_f0_phi_ii, &t_diff_f0_phi_ii);
2299
2300 // edge base for family II
2301 double *f1_phi_ii = &*f1PhiII.data().begin();
2302 double *diff_f1_phi_ii = &*diffF1PhiII.data().begin();
2303 auto t_f1_phi_ii = getFTensor1FromPtr<3>(f1_phi_ii);
2304 auto t_diff_f1_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f1_phi_ii);
2305 CHKERR hCurlBaseOnEdge.calculate<DIM, true>(p - 1, nb_integration_pts,
2306 n0f1_idx, n1f1_idx, n, t_grad_n,
2307 t_f1_phi_ii, &t_diff_f1_phi_ii);
2308
2309 FTensor::Tensor1<double, 3> &t_grad_n0f0 = t_grad_n[n0f0_idx];
2310 FTensor::Tensor1<double, 3> &t_grad_n1f0 = t_grad_n[n1f0_idx];
2311 FTensor::Tensor1<double, 3> &t_grad_n2f0 = t_grad_n[n2f0_idx];
2312 FTensor::Tensor1<double, 3> t_grad_n0f0_p_n1f0;
2313 t_grad_n0f0_p_n1f0(i) = t_grad_n0f0(i) + t_grad_n1f0(i);
2314
2315 FTensor::Tensor1<double, 3> &t_grad_n0f1 = t_grad_n[n0f1_idx];
2316 FTensor::Tensor1<double, 3> &t_grad_n1f1 = t_grad_n[n1f1_idx];
2317 FTensor::Tensor1<double, 3> &t_grad_n2f1 = t_grad_n[n2f1_idx];
2318 FTensor::Tensor1<double, 3> t_grad_n0f1_p_n1f1;
2319 t_grad_n0f1_p_n1f1(i) = t_grad_n0f1(i) + t_grad_n1f1(i);
2320
2321 iFiF0.resize(p + 1, false);
2322 diffIFiF0.resize(3 * p + 3, false);
2323 diffIFiF0.clear();
2324 double *ifif0 = &*iFiF0.data().begin();
2325 double *diff_ifif0 = &*diffIFiF0.data().begin();
2326 iFiF1.resize(p + 1, false);
2327 diffIFiF1.resize(3 * p + 3, false);
2328 diffIFiF1.clear();
2329 double *ifif1 = &*iFiF1.data().begin();
2330 double *diff_ifif1 = &*diffIFiF1.data().begin();
2331
2332 for (int gg = 0; gg != nb_integration_pts; ++gg) {
2333
2334 const int shift_n = (DIM + 1) * gg;
2335 const double n0f0 = n[shift_n + n0f0_idx];
2336 const double n1f0 = n[shift_n + n1f0_idx];
2337 const double n2f0 = n[shift_n + n2f0_idx];
2338 const double n0f1 = n[shift_n + n0f1_idx];
2339 const double n1f1 = n[shift_n + n1f1_idx];
2340 const double n2f1 = n[shift_n + n2f1_idx];
2341
2342 int phi_shift = 3 * NBEDGE_DEMKOWICZ_HCURL(p - 1) * gg;
2343 int diff_phi_shift = 3 * DIM * NBEDGE_DEMKOWICZ_HCURL(p - 1) * gg;
2344
2345 int kk = 0;
2346 for (int oo = 2; oo <= p; ++oo) {
2347
2348 auto t_f0_phi_ii = getFTensor1FromPtr<3>(&f0_phi_ii[phi_shift]);
2349 auto t_diff_f0_phi_ii =
2350 getFTensor2FromPtr<3, DIM>(&diff_f0_phi_ii[diff_phi_shift]);
2351 auto t_f1_phi_ii = getFTensor1FromPtr<3>(&f1_phi_ii[phi_shift]);
2352 auto t_diff_f1_phi_ii =
2353 getFTensor2FromPtr<3, DIM>(&diff_f1_phi_ii[diff_phi_shift]);
2354
2355 for (int ii = 0; ii <= oo - 2; ii++) {
2356
2357 int jj = oo - 2 - ii;
2358
2359 // family I
2361 jj + 1, 2 * ii + 1, n2f0, n0f0 + n1f0, &t_grad_n2f0(0),
2362 &t_grad_n0f0_p_n1f0(0), ifif0, diff_ifif0, 3);
2363 FTensor::Tensor1<double, 3> t_diff_ifif0(
2364 diff_ifif0[0 + jj], diff_ifif0[(jj + 1) + jj],
2365 diff_ifif0[2 * (jj + 1) + jj]);
2366
2367 t_phi(i) = ifif0[jj] * t_f0_phi_ii(i);
2368 t_diff_phi(i, j) = ifif0[jj] * t_diff_f0_phi_ii(i, j) +
2369 t_diff_ifif0(j) * t_f0_phi_ii(i);
2370
2371 ++t_phi;
2372 ++t_diff_phi;
2373 ++t_f0_phi_ii;
2374 ++t_diff_f0_phi_ii;
2375 ++kk;
2376
2377 // family II
2379 jj + 1, 2 * ii + 1, n2f1, n0f1 + n1f1, &t_grad_n2f1(0),
2380 &t_grad_n0f1_p_n1f1(0), ifif1, diff_ifif1, 3);
2381 FTensor::Tensor1<double, 3> t_diff_ifif1(
2382 diff_ifif1[0 + jj], diff_ifif1[(jj + 1) + jj],
2383 diff_ifif1[2 * (jj + 1) + jj]);
2384 t_phi(i) = ifif1[jj] * t_f1_phi_ii(i);
2385 t_diff_phi(i, j) = ifif1[jj] * t_diff_f1_phi_ii(i, j) +
2386 t_diff_ifif1(j) * t_f1_phi_ii(i);
2387 ++t_phi;
2388 ++t_diff_phi;
2389 ++t_f1_phi_ii;
2390 ++t_diff_f1_phi_ii;
2391 ++kk;
2392 }
2393 }
2394 if (kk != NBFACETRI_DEMKOWICZ_HCURL(p))
2395 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
2396 "Wrong number of base functions");
2397 }
2399 }
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define NBFACETRI_DEMKOWICZ_HCURL(P)
VectorDouble diffIFiF1
Definition Hcurl.cpp:2192
VectorDouble iFiF1
Definition Hcurl.cpp:2192
VectorDouble f1PhiII
Definition Hcurl.cpp:2190
VectorDouble diffF1PhiII
Definition Hcurl.cpp:2190

Member Data Documentation

◆ diffF0PhiII

VectorDouble HcurlFaceBase::diffF0PhiII

Definition at line 2189 of file Hcurl.cpp.

◆ diffF1PhiII

VectorDouble HcurlFaceBase::diffF1PhiII

Definition at line 2190 of file Hcurl.cpp.

◆ diffIFiF0

VectorDouble HcurlFaceBase::diffIFiF0

Definition at line 2191 of file Hcurl.cpp.

◆ diffIFiF1

VectorDouble HcurlFaceBase::diffIFiF1

Definition at line 2192 of file Hcurl.cpp.

◆ f0PhiII

VectorDouble HcurlFaceBase::f0PhiII

Definition at line 2189 of file Hcurl.cpp.

◆ f1PhiII

VectorDouble HcurlFaceBase::f1PhiII

Definition at line 2190 of file Hcurl.cpp.

◆ hCurlBaseOnEdge

HcurlEdgeBase HcurlFaceBase::hCurlBaseOnEdge

Definition at line 2188 of file Hcurl.cpp.

◆ i

FTensor::Index<'i', 3> HcurlFaceBase::i

Definition at line 2194 of file Hcurl.cpp.

◆ iFiF0

VectorDouble HcurlFaceBase::iFiF0

Definition at line 2191 of file Hcurl.cpp.

◆ iFiF1

VectorDouble HcurlFaceBase::iFiF1

Definition at line 2192 of file Hcurl.cpp.


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