Good day gentlemen,

        I'm having problems with interpolating a finite element method from one 
mesh to the other (getfem::new_interpolated_fem). 
        What I want to do is the following, below there is a code that first 
defines two quad elements (in 2D space) and a line elemnet that crosses it 
arbitrarily in the middle (there is a picture bellow). I want to calculate a 
mass matrix (used for fictitious domain method) which is evaluated on that 
segment  element, but in fact is calculated as a product of shape functions 
from the quads and the segment element (and the integration is over the 
segment):

M=\int_{segment} Base(the setment) X Base(the quads) dx 

I'm getting an error: 

interpolated_fem::update from context : convex_index = [0]
============================================
|      An error has been detected !!!      |
============================================
Error in ./gmm_opt.h, line 76 :
non invertible matrix

I would really appreciate the help. 
Best regards,  
                        Andriy
-- 
//++++++++++++++++++++++THE CODE++++++++++++++++++++++++

#include <getfem_model_solvers.h>
#include <gmm.h>
#include <getfem_interpolated_fem.h>

/* some Getfem++ types that we will be using */

using bgeot::base_small_vector; /* special class for small (dim<16) vectors */
using bgeot::base_node;  /* geometrical nodes(derived from base_small_vector)*/
using bgeot::scalar_type; /* = double */
using bgeot::size_type;   /* = unsigned long */
using bgeot::base_matrix; /* small dense matrix. */

/* definition of some matrix/vector types. 
 * default types of getfem_model_solvers.h
 */
typedef getfem::modeling_standard_sparse_vector sparse_vector;
typedef getfem::modeling_standard_sparse_matrix sparse_matrix;
typedef getfem::modeling_standard_plain_vector  plain_vector;


int main(int argc, char *argv[]) {

  try {
//   Building a mesh of two quads and a segment that crosses them in the middle

//       ___________________________________
//      |                              |                               |
//      |                              |                               |
//      |                              |                               |
//      |              +-----------------------------+               |
//      |                              |                               |
//      |                              |                               |
//      |                              |                                       |
//      |_________________|__________________|
//

     getfem::mesh quad_mesh;
     getfem::mesh line_mesh;
     std::vector<bgeot::size_type> ind1(4);
     std::vector<bgeot::size_type> ind2(4);
     std::vector<bgeot::size_type> ind3(2);
     ind1[0]=quad_mesh.add_point(bgeot::base_node(0.0,0.0));
     ind1[1]=quad_mesh.add_point(bgeot::base_node(0.0,1.0)); 
     ind1[2]=quad_mesh.add_point(bgeot::base_node(1.0,1.0));
     ind1[3]=quad_mesh.add_point(bgeot::base_node(1.0,0.0));
     ind2[0]=ind1[2];
     ind2[1]=ind1[3];
     ind2[2]=quad_mesh.add_point(bgeot::base_node(2.0,0.0)); 
     ind2[3]=quad_mesh.add_point(bgeot::base_node(2.0,1.0));
     ind3[0]=line_mesh.add_point(bgeot::base_node(0.5,0.5));
     ind3[1]=line_mesh.add_point(bgeot::base_node(1.5,0.5));
     quad_mesh.add_parallelepiped(2,ind1.begin());
     quad_mesh.add_parallelepiped(2,ind2.begin());
     line_mesh.add_convex(bgeot::simplex_geotrans(1,1),ind3.begin());  
     
//   mesh_fem for the two quad elements

     getfem::mesh_fem mq(quad_mesh);
mq.set_finite_element(mq.linked_mesh().convex_index(),getfem::fem_descriptor("FEM_QK(2,1)"));
     mq.set_qdim(1);

//   mesh_fem and integration method for the segment element

     getfem::mesh_fem ml(line_mesh);
     ml.set_finite_element(getfem::fem_descriptor("FEM_PK(1,1)"));
     ml.set_qdim(1);
     getfem::mesh_im mim(line_mesh);
     getfem::pintegration_method 
ppi=getfem::int_method_descriptor("IM_GAUSS1D(3)");
     mim.set_integration_method(ml.linked_mesh().convex_index(),ppi);

//   CREATION OF THE INTERPOLATION MEHS_FEM, THAT IS SUPPOSED TO INTERPOLATE
//   THE QUAD'S SHAPE FUNCTIONS ON THE SEGMENT

     getfem::mesh_fem mq_interpolate(mq.linked_mesh());
     getfem::pfem ifem=getfem::new_interpolated_fem(mq,mim);  //THIS DOESN'T 
//                                               WORK, DON'T KNOW WHY !!!!!!
     mq_interpolate.set_finite_element(ifem);

//   mass matrix on the segment created from the shape function of the quads 
and the segment

     sparse_matrix M(6,2);
     getfem::asm_mass_matrix(M,mim,mq_interpolate,ml);
// 
     std::cout<<" M="<<M<<std::endl;
//
  }
  DAL_STANDARD_CATCH_ERROR;
  return 0; 
}
_______________________________________________
Getfem-users mailing list
[email protected]
https://mail.gna.org/listinfo/getfem-users

Reply via email to