On Sat, 2 Mar 2019, Xiang LI wrote:
> I would like to create a mesh in parallel. I configured libMesh with
> --enable-parmesh and did some experiments. For example, I run an example
> introduction_ex4.C which solves the Poisson's equation in parallel with 48
> processors. I create a 80*80*80 grid and what I got is as follows:
>
> Mesh Information:
> elem_dimensions()={3}
> spatial_dimension()=3
> n_nodes()=4173281
> n_local_nodes()=91821
Not bad; you only have 5% over optimum load imbalance (assuming proc 0
is the worst, which is likely with our default settings). If that
gets worse with future problems, the git head has some better node
partitioning options you can try.
> n_elem()=512000
> n_local_elem()=10631
> n_active_elem()=512000
> n_subdomains()=1
> n_partitions()=48
> n_processors()=48
> n_threads()=1
> processor_id()=0
All looks good.
> I observed that the code is successfully parallelized, but in
> each processor the mesh use more than 1G memory.
That definitely shouldn't be. I forget exactly what we're using per
node now, but 1e5 nodes with one variable and a narrow stencil should
surely be less than 1e7 bytes, not more than 1e9.
> Seems that each processor stored a copy of the whole mesh
> (the memory usage of mesh is unchanged if I use 96 processors
> instead).
We should probably print out Replicated vs Distributed vs
Distributed-but-not-currently-distributed status from print_info(),
but it certainly sounds like you accidentally got a replicated mesh
somehow.
> My questions are as follows:
> 1. Why the mesh is not stored in parallel? Is it because that
> my configuration is not successful, or I should modify the
> code? If I should modify the code, I was wondering how to do
> it. Do I need to initialize ParallelMesh or DistributedMesh
> instead of simply use Mesh mesh(init.comm()) at first?
In theory you shouldn't have to modify the code; anything (like nearly
all our examples) that creates a Mesh will get a replicated or a
distributed mesh under the hood depending on configuration. You can
also manually specify ReplicatedMesh vs DistributedMesh in the code
itself, but in your case that shouldn't have been necessary.
> 2. Is there a primer or an example on how to use ParallelMesh
> or DistributedMesh?
I'm afraid not.
> Is it OK to use a ParallelMesh in the same way as a normal
> Mesh?
Usually. Out of 64 examples you'll only find 9 that are having to
manually create a ReplicatedMesh.
But the more sophisticated your code is, the harder it is to make it
work on a distributed mesh. If you're solving Poisson there's
probably no changes to make. If you're doing ray tracing or
integrating boundary layer quantities for a turbulent transition model
or something else that has one processor needing information about a
distant processor's elements then it's harder when that information
can't be acquired without manual communication code.
> 3.For some reason I am still using libMesh 0.9.5. Is it
> crucial to update libMesh if I have to use ParallelMesh?
YES.
That release is so old I honestly don't even remember how much of
what-was-then-ParallelMesh was working and how much wasn't.
---
Roy
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users