1
// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
3
// See the LICENSE.txt file for license information. Please report all
4
// bugs and problems to <gmsh@geuz.org>.
6
#ifndef _FUNCTION_SPACE_H_
7
#define _FUNCTION_SPACE_H_
11
#include "GmshMatrix.h"
13
struct gmshFunctionSpace
15
gmshMatrix<double> points;
16
gmshMatrix<double> monomials;
17
gmshMatrix<double> coefficients;
18
inline void evaluateMonomials(double u, double v, double w, double p[]) const
20
for (int j = 0; j < monomials.size1(); j++) {
21
p[j] = pow(u, (int)monomials(j, 0));
22
if (monomials.size2() > 1) p[j] *= pow(v, (int)monomials(j, 1));
23
if (monomials.size2() > 2) p[j] *= pow(w, (int)monomials(j, 2));
26
inline void f(double u, double v, double w, double *sf) const
29
evaluateMonomials(u, v, w, p);
30
for (int i = 0; i < coefficients.size1(); i++) {
32
for (int j = 0; j < coefficients.size2(); j++) {
33
sf[i] += coefficients(i, j) * p[j];
37
inline void df(double u, double v, double w, double grads[][3]) const
39
switch (monomials.size2()) {
41
for (int i = 0; i < coefficients.size1(); i++){
45
for(int j = 0; j < coefficients.size2(); j++){
46
if ((monomials)(j, 0) > 0)
47
grads[i][0] += (coefficients)(i, j) *
48
pow(u, (monomials)(j, 0) - 1) * (monomials)(j, 0);
53
for (int i = 0; i < coefficients.size1(); i++){
57
for(int j = 0; j < coefficients.size2(); j++){
58
if ((monomials)(j, 0) > 0)
59
grads[i][0] += (coefficients)(i, j) *
60
pow(u, (monomials)(j, 0) - 1) * (monomials)(j, 0) *
61
pow(v, (monomials)(j, 1));
62
if ((monomials)(j, 1) > 0)
63
grads[i][1] += (coefficients)(i, j) *
64
pow(u, (monomials)(j, 0)) *
65
pow(v, (monomials)(j, 1) - 1) * (monomials)(j, 1);
70
for (int i = 0; i < coefficients.size1(); i++){
74
for(int j = 0; j < coefficients.size2(); j++){
75
if ((monomials)(j, 0) > 0)
76
grads[i][0] += (coefficients)(i, j) *
77
pow(u, (monomials)(j, 0) - 1) * (monomials)(j, 0) *
78
pow(v, (monomials)(j, 1)) *
79
pow(w, (monomials)(j, 2));
80
if ((monomials)(j, 1) > 0)
81
grads[i][1] += (coefficients)(i, j) *
82
pow(u, (monomials)(j, 0)) *
83
pow(v, (monomials)(j, 1) - 1) * (monomials)(j, 1) *
84
pow(w, (monomials)(j, 2));
85
if ((monomials)(j, 2) > 0)
86
grads[i][2] += (coefficients)(i, j) *
87
pow(u, (monomials)(j, 0)) *
88
pow(v, (monomials)(j, 1)) *
89
pow(w, (monomials)(j, 2) - 1) * (monomials)(j, 2);
97
class gmshFunctionSpaces
100
static std::map<int, gmshFunctionSpace> fs;
101
static std::map<std::pair<int, int>, gmshMatrix<double> > injector;
103
static const gmshFunctionSpace &find(int);
104
static const gmshMatrix<double> &findInjector(int, int);