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