getfem-users
[Top][All Lists]

## Re: [Getfem-users] Interpolate RT0 elements with P0

 From: Gerry Rizzo Subject: Re: [Getfem-users] Interpolate RT0 elements with P0 Date: Thu, 12 Dec 2013 11:18:56 +0100

Dear Yves,

I've tested the fixed code and now it works like a charm!
I have one more question concerning RT0 interpolation, I couldn't find a method to compute the velocity in one point given an RT0 vector; I thought in building a new fem with only one point, then use the interpolation function.

Gerry

2013/12/9 Yves Renard

Dear Gerry,

It seems to come from an error on line 320 of getfem_interpolation.h
coeff[qq].resize(nb_s*qdim);
have to be replaced by
coeff[qq].resize(cvnbdof);
the loop which is just after is from 0 to cvnbdof. I don't understand why this error has not been detected yet !

I commited the changes.

Yves.

Le 09/12/2013 17:07, Gerry Rizzo a écrit :
Hi,
here I've attached the example, please let me know if you receive it correctly.

Thank you again,
Gerry

2013/12/9 Yves Renard

Dear Gerry,

Sorry, but it seems that your attached file has not been transmitted to the list. Could you send me it directly ?

Yves.

Le 05/12/2013 12:46, Gerry Rizzo a écrit :
Hi,
I've written a very simple test case for the RT0 interpolation, you can find it attached to this email.
It loads a vector (example.txt) containing the velocity of the solution of Darcy equations over a 10x10x10 mesh with constant permeability; the velocity is a positive constant along x-axis and zero along y and z axes.

I still have the same error I've showed you in the previous email.
I've tested this code with getfem 4.2, ubuntu 12.10 32bit and gcc version 4.7.2.

Thank you,
Calogero B. Rizzo

2013/12/3 Gerry Rizzo
I've tried to use the interpolator function without success; here what I've done:

getfem::mesh_fem mf_p0_3;
getfem::pfem pf_p0;
pf_p0 = getfem::fem_descriptor("FEM_PK(3,0)");
mf_p0_3.init_with_mesh(mesh);
mf_p0_3.set_qdim(N);
mf_p0_3.set_finite_element(mesh.convex_index(), pf_p0);
std::vector<scalar_type> U_v_int;
U_v_int.resize(mf_p0_3.nb_basic_dof());
getfem::interpolation(mf_v,mf_p0_3,U_v,U_v_int);

mf_v is the RT0 fem and the computed velocity in RT0 is stored in U_v. I have the following error:

terminate called after throwing an instance of 'gmm::gmm_error'
what():  Error in /usr/local/include/getfem/getfem_fem.h, line 728 :
Wrong size for coeff vector

Thank you for the availability,
Calogero B. Rizzo

2013/12/2 Gerry Rizzo
Hi,

I'm trying to make a function to interpolate three dimensional RT0 elements with P0 in order to export the function in vtk; the usual base functions are:

phy_i(x) = (x - a_i) / (d * |K|)

where a_i is a vertex of the tetrahedron, d is the dimension of the space (e.g. 3) and |K| is the volume of  the tetrahedron.
Then I can find the velocity in one point inside the thedraedron:

v(x) = sum ( v_i*phy_i(x) )

This is the function declaration (below there is the full function):

template<typename VEC,typename MAT>
void InterpolatorRT0( const getfem::mesh &mesh,                //mesh
const getfem::mesh_fem &mf_v,         //RT0 fem
const getfem::mesh_fem &mf_p,         //P0 fem
scalar_type &Vx,                                // variable for the computed Vx
scalar_type &Vy,                                // variable for the computed Vy
scalar_type &Vz,                                // variable for the computed Vz
const scalar_type &x,                          // x, y, z are the point's coordinates where I want to compute the velocity
const scalar_type &y,
const scalar_type &z,
const VEC &gdl,                                // gdl is the velocity vector with RT0 elements
const size_type &elem,                       // elem is the thetraedron where the point lies
const MAT &A,                                  // A is the mass matrix
const size_type &shift = 0);

This function interpolate the RT0 velocity in one point given by x, y, z.
In order to guess the sign I'm using the mass matrix computed with:

getfem::asm_mass_matrix(A, im_v, mf_v, mf_p);

Unluckly this function doesn't work, I've tested it on a 3D box with constant velocity, I can't figure out the problem;
The problem may be the sign, is there a better/easier way to compute it?

Thank you,
Calogero B. Rizzo

Code snippet:

template<typename VEC,typename MAT>
void InterpolatorRT0( const getfem::mesh &mesh,
const getfem::mesh_fem &mf_v,
const getfem::mesh_fem &mf_p,
scalar_type &Vx,
scalar_type &Vy,
scalar_type &Vz,
const scalar_type &x,
const scalar_type &y,
const scalar_type &z,
const VEC &gdl,
const size_type &elem,
const MAT &A,
const size_type &shift = 0) {
Vx = 0.;
Vy = 0.;
Vz = 0.;
scalar_type volume = mesh.convex_area_estimate(elem);
int N = mesh.dim();
std::vector<base_node> vertex;
for(int i=0; i<N+1; i++) {
vertex.push_back(mesh.points_of_convex(elem)[i]);
}
// loop over the four faces
for(int i=0; i<mf_v.nb_basic_dof_of_element(elem); i++) {
size_type idof = mf_v.ind_basic_dof_of_face_of_element(elem,i);
scalar_type sign = A(idof,mf_p.ind_basic_dof_of_element(elem)+shift);
sign /= (gmm::abs(sign)>0) ? gmm::abs(sign) : 1;
scalar_type area;
if(N==2) {
base_node x1 = mesh.points_of_face_of_convex(elem,i);
base_node x2 = mesh.points_of_face_of_convex(elem,i);
area = pow(pow(x2-x1,2)+pow(x2-x1,2),0.5);
} else {
assert(N==3);
base_node x1 = mesh.points_of_face_of_convex(elem,i);
base_node x2 = mesh.points_of_face_of_convex(elem,i);
base_node x3 = mesh.points_of_face_of_convex(elem,i);
Geometry::Point3D xx1(x1,x1,x1);
Geometry::Point3D xx2(x2,x2,x2);
Geometry::Point3D xx3(x3,x3,x3);
area = (Geometry::Triangle(xx1,xx2,xx3)).area();
}
// for a tetrahedron the vertex i is in front of the face i
Vx += gdl[idof]*(x-vertex[i])/(3*volume)*sign*area;
Vy += gdl[idof]*(y-vertex[i])/(3*volume)*sign*area;
Vz += gdl[idof]*(z-vertex[i])/(3*volume)*sign*area;
}
}

```_______________________________________________
Getfem-users mailing list
https://mail.gna.org/listinfo/getfem-users
```

```--

Yves Renard (address@hidden)       tel : (33) 04.72.43.87.08
Pole de Mathematiques, INSA-Lyon             fax : (33) 04.72.43.85.29
20, rue Albert Einstein
69621 Villeurbanne Cedex, FRANCE
http://math.univ-lyon1.fr/~renard

---------
```

```--

Yves Renard (address@hidden)       tel : (33) 04.72.43.87.08
Pole de Mathematiques, INSA-Lyon             fax : (33) 04.72.43.85.29
20, rue Albert Einstein
69621 Villeurbanne Cedex, FRANCE
http://math.univ-lyon1.fr/~renard

---------
```

reply via email to