On Wed, Feb 5, 2014 at 11:53 AM, David Knezevic
<dkneze...@seas.harvard.edu>wrote:

> I have a case where I need lots of MONOMIAL variables (e.g. > 100) but
> where the variables are mostly decoupled, so I can use _dof_coupling in
> DofMatrix in order to significantly reduce the memory footprint. But I've
> found that this doesn't seem to work properly with MONOMIAL basis functions.
>
> The attached code demonstrates what I mean, and below is a summary of some
> representative results for a case with 150 variables (note that I got the
> "average bandwidth" data from equations_systems.print_info()):
>
> MONOMIAL with diagonal dof_coupling: average bandwidth = 811
> MONOMIAL with all variables coupled: average bandwidth = 960
>
> LAGRANGE with dof_coupling: average bandwidth = 22.3824
> LAGRANGE with all variables coupled: average bandwidth = [Don't know, my
> laptop ran out of memory trying to get this value... but it's certainly
> greater than 1000]
>
> So LAGRANGE behaves the way I would expect, in that the dof_coupling leads
> to a significant reduction in matrix bandwidth (and hence a significant
> reduction in memory footprint). Any ideas why we don't get the same
> behavior with MONOMIAL? Also, suggestions on how to fix this for MONOMIAL
> would be appreciated!
>

Sorry for the slow response.

First, I can confirm that I get about the same numbers as... Lagrange
without CM is 3357!

average/max on-processor bandwidth (n_elem=10, n_vars=150):
>                     without CM    with CM
> LAGRANGE(FIRST)     3357.36/4050  22.3824/27
> MONOMIAL(CONSTANT)  960/1050      811/901




Second, I don't really know what the problem is, but could it have
something to do with this use_coupled_neighbor_dofs() function?  We assume
that MONOMIAL implies DG/FV, and therefore set implicit_neighbor_dofs =
true.  I guess what you are saying is that this is not always the case...
for example in the mass matrix.


bool DofMap::use_coupled_neighbor_dofs(const MeshBase& mesh) const
> {
>   // If we were asked on the command line, then we need to
>   // include sensitivities between neighbor degrees of freedom
>   bool implicit_neighbor_dofs =
>     libMesh::on_command_line ("--implicit_neighbor_dofs");
>   // look at all the variables in this system.  If every one is
>   // discontinuous then the user must be doing DG/FVM, so be nice
>   // and  force implicit_neighbor_dofs=true
>   {
>     bool all_discontinuous_dofs = true;
>     for (unsigned int var=0; var<this->n_variables(); var++)
>       if (FEAbstract::build (mesh.mesh_dimension(),
>      this->variable_type(var))->get_continuity() !=  DISCONTINUOUS)
>  all_discontinuous_dofs = false;
>     if (all_discontinuous_dofs)
>       implicit_neighbor_dofs = true;
>   }
>   return implicit_neighbor_dofs;
> }





-- 
John
------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk
_______________________________________________
Libmesh-devel mailing list
Libmesh-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-devel

Reply via email to