getfem-users
[Top][All Lists]

## [Getfem-users] Level Set computational time

 From: Gerry Rizzo Subject: [Getfem-users] Level Set computational time Date: Thu, 14 Nov 2013 14:39:45 +0100

Hi,

I'm using GetFem++ to simulate a flux in a porous media in a small 3 dimensional grid with 3x3x5 cells; I have used a mixed finite element method, with RT0 for velocity and P0 for the pressure field. The grid is obtained splitting each cell in tetrahedra.
After the problem is solved I would like to compute the mean pressure over an internal block that doesn't match the original grid; to do this I've used the Level Set feature, using 6 level set (one for each block's side), below there is a snippet of the code.
The function ls_plane() computes the distance between a point and the plane passing through a block's side, the variable cell represents the block.

The result seems to be good, the computation time for solving the problem is around 0.02 seconds, but to compute the pressure integral over the block I need up to 60.00 seconds (it depends of the block's sides orientation). Most of the computation time is used during the mls_cell.adapt().

Am I doing something wrong? how could I improve the computation time?

Thank you,
Calogero B. Rizzo

INTEGRATION_V="IM_TETRAHEDRON(3)";
INTEGRATION_P="IM_TETRAHEDRON(1)";
SIMPLEX_INTEGRATION="IM_STRUCTURED_COMPOSITE(IM_TETRAHEDRON(3),1)";

void meshCutter(const cell3D &cell) {
mls_cell.clear();
mimls_cell.clear();

getfem::level_set ls_xPos(mesh), ls_xNeg(mesh);
getfem::level_set ls_yPos(mesh), ls_yNeg(mesh);
getfem::level_set ls_zPos(mesh), ls_zNeg(mesh);

getfem::pintegration_method ppi_v = getfem::int_method_descriptor(INTEGRATION_V);
mimls_cell.set_integration_method(mesh.convex_index(), ppi_v);
getfem::pintegration_method simp_ppi = getfem::int_method_descriptor(SIMPLEX_INTEGRATION);
mimls_cell.set_simplex_im(simp_ppi);
ls_xPos.reinit();
for(size_type d = 0; d<ls_xPos.get_mesh_fem().nb_basic_dof(); ++d) {
ls_xPos.values(0)[d] = ls_plane(ls_xPos.get_mesh_fem().point_of_basic_dof(d), cell.xPos());
}
ls_xPos.touch();
ls_yPos.reinit();
for(size_type d = 0; d<ls_yPos.get_mesh_fem().nb_basic_dof(); ++d) {
ls_yPos.values(0)[d] = ls_plane(ls_yPos.get_mesh_fem().point_of_basic_dof(d), cell.yPos());
}
ls_yPos.touch();

ls_zPos.reinit();
for(size_type d = 0; d<ls_zPos.get_mesh_fem().nb_basic_dof(); ++d) {
ls_zPos.values(0)[d] = ls_plane(ls_zPos.get_mesh_fem().point_of_basic_dof(d), cell.zPos());
}
ls_zPos.touch();
ls_xNeg.reinit();
for(size_type d = 0; d<ls_xNeg.get_mesh_fem().nb_basic_dof(); ++d) {
ls_xNeg.values(0)[d] = ls_plane(ls_xNeg.get_mesh_fem().point_of_basic_dof(d), cell.xNeg());
}
ls_xNeg.touch();
ls_yNeg.reinit();
for(size_type d = 0; d<ls_yNeg.get_mesh_fem().nb_basic_dof(); ++d) {
ls_yNeg.values(0)[d] = ls_plane(ls_yNeg.get_mesh_fem().point_of_basic_dof(d), cell.yNeg());
}
ls_yNeg.touch();
ls_zNeg.reinit();
for(size_type d = 0; d<ls_zNeg.get_mesh_fem().nb_basic_dof(); ++d) {
ls_zNeg.values(0)[d] = ls_plane(ls_zNeg.get_mesh_fem().point_of_basic_dof(d), cell.zNeg());
}
ls_zNeg.touch();