Yves
Using that piece of code with the mesh correspondences you gave me, I
played with the program and found out the error: I was supposing that
the numeration of the getfem::mesh points and getfem::mesh_fem dofs were
the same. Once I figured this out, it was simple to write a class that
would map these correspondences, thus allowing the program to work as it
should. That's why nodes far away were moving when they should not.
Thank you very much!
Best,
Giovani
Renard Yves escreveu:
Selon Giovani <[EMAIL PROTECTED]>:
Yves:
Thank you very much for the quick reply!
I've prepared a simplified version of the program, which I've posted here:
http://www.ifi.unicamp.br/~gfaccin/download/interpolation.tar.gz
Using a sparse matrix, the following piece of code allows to see the
correspondance between nodes of the small mesh and node of the large mesh:
gmm::row_matrix< gmm::rsvector<double> >
N( S_meshfem.nb_dof(), L_meshfem.nb_dof() );
getfem::interpolation( L_meshfem, S_meshfem, N);
for (unsigned i = 0; i < S_meshfem.nb_dof(); ++i) {
gmm::linalg_traits<gmm::rsvector<double> >::const_iterator
it = gmm::vect_const_begin(N[i]),
ite = gmm::vect_const_end(N[i]);
for (; it != ite; ++it) {
cout << "S dof " << i << " localized at " << S_meshfem.point_of_dof(i)
<< " influenced by L dof " << it.index() << " localized at "
<< L_meshfem.point_of_dof(it.index()) << endl;
}
}
I tried and the result is normal. I did not detect some correspondance between
nodes that are far away from each other.
This version will load 2 meshes from the disk (which are also provided
in the file) and solve their movement equations with a central
difference scheme. The calculation's output is sent to the disk in
opendx format, and can be viewed using an opendx program that's also
provided in the file.
I've also added the resulting movies for the default situation (happens
if you simply compile the program and run, without changing anything),
in avi format.
One curiosity: you said that "gmm::mult( gmm::transposed(N), S_ax ,
L_ax); is not strictly speaking an interpolation of the solution on the
fine mesh onto the coarse mesh". If I were to build an interpolation
matrix, which I call here "N" that strictly speaking does the
interpolation, how should I proceed in order to do it?
the function getfem::interpolation( L_meshfem, S_meshfem, N) gives you the
matrix with allows to compute the interpolation of a solution on the large mesh
on the small mesh. i.e. gmm::mult( N, L_az , S_az) really does this
interpolation. The meaning of gmm::mult( gmm::transposed(N), S_az , L_az) is
not strictly speaking speaking an interpolation. If fact, in your case, this
operation will sum the contribution of a lot of point of the small mesh without
making a mean of this contributions. I think you would better use
getfem::interpolation( S_meshfem, L_meshfem, N). (even if there is some
warnings ... ! you can suppress the warning by invoking
dal::set_warning_level(0))
Best,
Yves.
-------------------------------------------------------------------------
Yves Renard ([EMAIL PROTECTED]) tel : (33) 04.72.43.80.11
Pole de Mathematiques, INSA de Lyon fax : (33) 04.72.43.85.29
Institut Camille Jordan - CNRS UMR 5208
20, rue Albert Einstein
69621 Villeurbanne Cedex, FRANCE
http://math.univ-lyon1.fr/~renard
-------------------------------------------------------------------------
_______________________________________________
Getfem-users mailing list
[email protected]
https://mail.gna.org/listinfo/getfem-users
_______________________________________________
Getfem-users mailing list
[email protected]
https://mail.gna.org/listinfo/getfem-users