97
/// Evaluate basis function i at given point x in cell
97
/// Evaluate basis function i at given point x in cell (actual implementation)
98
static void _evaluate_basis(std::size_t i,
101
const double* vertex_coordinates,
102
int cell_orientation)
106
compute_jacobian_triangle_2d(J, vertex_coordinates);
108
// Compute Jacobian inverse and determinant
111
compute_jacobian_inverse_triangle_2d(K, detJ, J);
115
const double C0 = vertex_coordinates[2] + vertex_coordinates[4];
116
const double C1 = vertex_coordinates[3] + vertex_coordinates[5];
118
// Get coordinates and map to the reference (FIAT) element
119
double X = (J[1]*(C1 - 2.0*x[1]) + J[3]*(2.0*x[0] - C0)) / detJ;
120
double Y = (J[0]*(2.0*x[1] - C1) + J[2]*(C0 - 2.0*x[0])) / detJ;
129
// Array of basisvalues
130
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
132
// Declare helper variables
133
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
134
double tmp1 = (1.0 - Y)/2.0;
135
double tmp2 = tmp1*tmp1;
137
// Compute basisvalues
138
basisvalues[0] = 1.0;
139
basisvalues[1] = tmp0;
140
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
141
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
142
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
143
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
144
basisvalues[0] *= std::sqrt(0.5);
145
basisvalues[2] *= std::sqrt(1.0);
146
basisvalues[5] *= std::sqrt(1.5);
147
basisvalues[1] *= std::sqrt(3.0);
148
basisvalues[4] *= std::sqrt(4.5);
149
basisvalues[3] *= std::sqrt(7.5);
151
// Table(s) of coefficients
152
static const double coefficients0[6] = \
153
{0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582063, 0.0544331053951817};
156
for (unsigned int r = 0; r < 6; r++)
158
*values += coefficients0[r]*basisvalues[r];
159
} // end loop over 'r'
165
// Array of basisvalues
166
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
168
// Declare helper variables
169
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
170
double tmp1 = (1.0 - Y)/2.0;
171
double tmp2 = tmp1*tmp1;
173
// Compute basisvalues
174
basisvalues[0] = 1.0;
175
basisvalues[1] = tmp0;
176
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
177
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
178
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
179
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
180
basisvalues[0] *= std::sqrt(0.5);
181
basisvalues[2] *= std::sqrt(1.0);
182
basisvalues[5] *= std::sqrt(1.5);
183
basisvalues[1] *= std::sqrt(3.0);
184
basisvalues[4] *= std::sqrt(4.5);
185
basisvalues[3] *= std::sqrt(7.5);
187
// Table(s) of coefficients
188
static const double coefficients0[6] = \
189
{0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582064, 0.0544331053951818};
192
for (unsigned int r = 0; r < 6; r++)
194
*values += coefficients0[r]*basisvalues[r];
195
} // end loop over 'r'
201
// Array of basisvalues
202
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
204
// Declare helper variables
205
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
206
double tmp1 = (1.0 - Y)/2.0;
207
double tmp2 = tmp1*tmp1;
209
// Compute basisvalues
210
basisvalues[0] = 1.0;
211
basisvalues[1] = tmp0;
212
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
213
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
214
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
215
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
216
basisvalues[0] *= std::sqrt(0.5);
217
basisvalues[2] *= std::sqrt(1.0);
218
basisvalues[5] *= std::sqrt(1.5);
219
basisvalues[1] *= std::sqrt(3.0);
220
basisvalues[4] *= std::sqrt(4.5);
221
basisvalues[3] *= std::sqrt(7.5);
223
// Table(s) of coefficients
224
static const double coefficients0[6] = \
225
{0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545};
228
for (unsigned int r = 0; r < 6; r++)
230
*values += coefficients0[r]*basisvalues[r];
231
} // end loop over 'r'
237
// Array of basisvalues
238
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
240
// Declare helper variables
241
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
242
double tmp1 = (1.0 - Y)/2.0;
243
double tmp2 = tmp1*tmp1;
245
// Compute basisvalues
246
basisvalues[0] = 1.0;
247
basisvalues[1] = tmp0;
248
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
249
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
250
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
251
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
252
basisvalues[0] *= std::sqrt(0.5);
253
basisvalues[2] *= std::sqrt(1.0);
254
basisvalues[5] *= std::sqrt(1.5);
255
basisvalues[1] *= std::sqrt(3.0);
256
basisvalues[4] *= std::sqrt(4.5);
257
basisvalues[3] *= std::sqrt(7.5);
259
// Table(s) of coefficients
260
static const double coefficients0[6] = \
261
{0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545};
264
for (unsigned int r = 0; r < 6; r++)
266
*values += coefficients0[r]*basisvalues[r];
267
} // end loop over 'r'
273
// Array of basisvalues
274
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
276
// Declare helper variables
277
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
278
double tmp1 = (1.0 - Y)/2.0;
279
double tmp2 = tmp1*tmp1;
281
// Compute basisvalues
282
basisvalues[0] = 1.0;
283
basisvalues[1] = tmp0;
284
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
285
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
286
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
287
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
288
basisvalues[0] *= std::sqrt(0.5);
289
basisvalues[2] *= std::sqrt(1.0);
290
basisvalues[5] *= std::sqrt(1.5);
291
basisvalues[1] *= std::sqrt(3.0);
292
basisvalues[4] *= std::sqrt(4.5);
293
basisvalues[3] *= std::sqrt(7.5);
295
// Table(s) of coefficients
296
static const double coefficients0[6] = \
297
{0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545};
300
for (unsigned int r = 0; r < 6; r++)
302
*values += coefficients0[r]*basisvalues[r];
303
} // end loop over 'r'
309
// Array of basisvalues
310
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
312
// Declare helper variables
313
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
314
double tmp1 = (1.0 - Y)/2.0;
315
double tmp2 = tmp1*tmp1;
317
// Compute basisvalues
318
basisvalues[0] = 1.0;
319
basisvalues[1] = tmp0;
320
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
321
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
322
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
323
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
324
basisvalues[0] *= std::sqrt(0.5);
325
basisvalues[2] *= std::sqrt(1.0);
326
basisvalues[5] *= std::sqrt(1.5);
327
basisvalues[1] *= std::sqrt(3.0);
328
basisvalues[4] *= std::sqrt(4.5);
329
basisvalues[3] *= std::sqrt(7.5);
331
// Table(s) of coefficients
332
static const double coefficients0[6] = \
333
{0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817};
336
for (unsigned int r = 0; r < 6; r++)
338
*values += coefficients0[r]*basisvalues[r];
339
} // end loop over 'r'
346
/// Evaluate basis function i at given point x in cell (non-static member function)
98
347
virtual void evaluate_basis(std::size_t i,
101
350
const double* vertex_coordinates,
102
351
int cell_orientation) const
106
compute_jacobian_triangle_2d(J, vertex_coordinates);
108
// Compute Jacobian inverse and determinant
111
compute_jacobian_inverse_triangle_2d(K, detJ, J);
115
const double C0 = vertex_coordinates[2] + vertex_coordinates[4];
116
const double C1 = vertex_coordinates[3] + vertex_coordinates[5];
118
// Get coordinates and map to the reference (FIAT) element
119
double X = (J[1]*(C1 - 2.0*x[1]) + J[3]*(2.0*x[0] - C0)) / detJ;
120
double Y = (J[0]*(2.0*x[1] - C1) + J[2]*(C0 - 2.0*x[0])) / detJ;
129
// Array of basisvalues
130
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
132
// Declare helper variables
133
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
134
double tmp1 = (1.0 - Y)/2.0;
135
double tmp2 = tmp1*tmp1;
137
// Compute basisvalues
138
basisvalues[0] = 1.0;
139
basisvalues[1] = tmp0;
140
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
141
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
142
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
143
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
144
basisvalues[0] *= std::sqrt(0.5);
145
basisvalues[2] *= std::sqrt(1.0);
146
basisvalues[5] *= std::sqrt(1.5);
147
basisvalues[1] *= std::sqrt(3.0);
148
basisvalues[4] *= std::sqrt(4.5);
149
basisvalues[3] *= std::sqrt(7.5);
151
// Table(s) of coefficients
152
static const double coefficients0[6] = \
153
{0.0, -0.173205080756888, -0.1, 0.121716123890037, 0.0942809041582063, 0.0544331053951817};
156
for (unsigned int r = 0; r < 6; r++)
158
*values += coefficients0[r]*basisvalues[r];
159
}// end loop over 'r'
165
// Array of basisvalues
166
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
168
// Declare helper variables
169
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
170
double tmp1 = (1.0 - Y)/2.0;
171
double tmp2 = tmp1*tmp1;
173
// Compute basisvalues
174
basisvalues[0] = 1.0;
175
basisvalues[1] = tmp0;
176
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
177
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
178
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
179
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
180
basisvalues[0] *= std::sqrt(0.5);
181
basisvalues[2] *= std::sqrt(1.0);
182
basisvalues[5] *= std::sqrt(1.5);
183
basisvalues[1] *= std::sqrt(3.0);
184
basisvalues[4] *= std::sqrt(4.5);
185
basisvalues[3] *= std::sqrt(7.5);
187
// Table(s) of coefficients
188
static const double coefficients0[6] = \
189
{0.0, 0.173205080756888, -0.1, 0.121716123890037, -0.0942809041582064, 0.0544331053951818};
192
for (unsigned int r = 0; r < 6; r++)
194
*values += coefficients0[r]*basisvalues[r];
195
}// end loop over 'r'
201
// Array of basisvalues
202
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
204
// Declare helper variables
205
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
206
double tmp1 = (1.0 - Y)/2.0;
207
double tmp2 = tmp1*tmp1;
209
// Compute basisvalues
210
basisvalues[0] = 1.0;
211
basisvalues[1] = tmp0;
212
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
213
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
214
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
215
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
216
basisvalues[0] *= std::sqrt(0.5);
217
basisvalues[2] *= std::sqrt(1.0);
218
basisvalues[5] *= std::sqrt(1.5);
219
basisvalues[1] *= std::sqrt(3.0);
220
basisvalues[4] *= std::sqrt(4.5);
221
basisvalues[3] *= std::sqrt(7.5);
223
// Table(s) of coefficients
224
static const double coefficients0[6] = \
225
{0.0, 0.0, 0.2, 0.0, 0.0, 0.163299316185545};
228
for (unsigned int r = 0; r < 6; r++)
230
*values += coefficients0[r]*basisvalues[r];
231
}// end loop over 'r'
237
// Array of basisvalues
238
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
240
// Declare helper variables
241
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
242
double tmp1 = (1.0 - Y)/2.0;
243
double tmp2 = tmp1*tmp1;
245
// Compute basisvalues
246
basisvalues[0] = 1.0;
247
basisvalues[1] = tmp0;
248
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
249
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
250
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
251
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
252
basisvalues[0] *= std::sqrt(0.5);
253
basisvalues[2] *= std::sqrt(1.0);
254
basisvalues[5] *= std::sqrt(1.5);
255
basisvalues[1] *= std::sqrt(3.0);
256
basisvalues[4] *= std::sqrt(4.5);
257
basisvalues[3] *= std::sqrt(7.5);
259
// Table(s) of coefficients
260
static const double coefficients0[6] = \
261
{0.471404520791032, 0.23094010767585, 0.133333333333333, 0.0, 0.188561808316413, -0.163299316185545};
264
for (unsigned int r = 0; r < 6; r++)
266
*values += coefficients0[r]*basisvalues[r];
267
}// end loop over 'r'
273
// Array of basisvalues
274
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
276
// Declare helper variables
277
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
278
double tmp1 = (1.0 - Y)/2.0;
279
double tmp2 = tmp1*tmp1;
281
// Compute basisvalues
282
basisvalues[0] = 1.0;
283
basisvalues[1] = tmp0;
284
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
285
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
286
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
287
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
288
basisvalues[0] *= std::sqrt(0.5);
289
basisvalues[2] *= std::sqrt(1.0);
290
basisvalues[5] *= std::sqrt(1.5);
291
basisvalues[1] *= std::sqrt(3.0);
292
basisvalues[4] *= std::sqrt(4.5);
293
basisvalues[3] *= std::sqrt(7.5);
295
// Table(s) of coefficients
296
static const double coefficients0[6] = \
297
{0.471404520791032, -0.23094010767585, 0.133333333333333, 0.0, -0.188561808316413, -0.163299316185545};
300
for (unsigned int r = 0; r < 6; r++)
302
*values += coefficients0[r]*basisvalues[r];
303
}// end loop over 'r'
309
// Array of basisvalues
310
double basisvalues[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
312
// Declare helper variables
313
double tmp0 = (1.0 + Y + 2.0*X)/2.0;
314
double tmp1 = (1.0 - Y)/2.0;
315
double tmp2 = tmp1*tmp1;
317
// Compute basisvalues
318
basisvalues[0] = 1.0;
319
basisvalues[1] = tmp0;
320
basisvalues[3] = basisvalues[1]*1.5*tmp0 - basisvalues[0]*0.5*tmp2;
321
basisvalues[2] = basisvalues[0]*(0.5 + 1.5*Y);
322
basisvalues[4] = basisvalues[1]*(1.5 + 2.5*Y);
323
basisvalues[5] = basisvalues[2]*(0.111111111111111 + Y*1.66666666666667) - basisvalues[0]*0.555555555555556;
324
basisvalues[0] *= std::sqrt(0.5);
325
basisvalues[2] *= std::sqrt(1.0);
326
basisvalues[5] *= std::sqrt(1.5);
327
basisvalues[1] *= std::sqrt(3.0);
328
basisvalues[4] *= std::sqrt(4.5);
329
basisvalues[3] *= std::sqrt(7.5);
331
// Table(s) of coefficients
332
static const double coefficients0[6] = \
333
{0.471404520791032, 0.0, -0.266666666666667, -0.243432247780074, 0.0, 0.0544331053951817};
336
for (unsigned int r = 0; r < 6; r++)
338
*values += coefficients0[r]*basisvalues[r];
339
}// end loop over 'r'
353
_evaluate_basis(i, values, x, vertex_coordinates, cell_orientation);
346
/// Evaluate all basis functions at given point x in cell
347
virtual void evaluate_basis_all(double* values,
356
/// Evaluate all basis functions at given point x in cell (actual implementation)
357
static void _evaluate_basis_all(double* values,
349
359
const double* vertex_coordinates,
350
int cell_orientation) const
360
int cell_orientation)
352
362
// Helper variable to hold values of a single dof.
353
363
double dof_values = 0.0;