[petsc-users] Preallocation woes again
Tabrez Ali
stali at geology.wisc.edu
Fri Jan 27 10:32:20 CST 2012
PETSc Gurus
First I want to thank you for patiently answering questions that I have
asked in past regarding preallocation. Unfortunately I am still having
problems.
I have a small unstructured FE (elasticity) code that uses PETSc.
Unfortunately I am not yet able to find an _efficient_ way of
calculating the non-zero structure so I simply overestimate the o_nz and
d_nz values (= dimension x max_number_of nodes _a_node_contributes_to)
which means that my stiffness matrix consumes at least 2X more memory.
For example, for a perfectly structured mesh of linear hexes this number
is 3*27=81=o_nz=d_nz. In complicated 3D linear tet/hex meshes that I
have generated I rarely need to set a value greater than 150. In general
I have found that as long as I keep DOF/core between 100-200K (assuming
1GB/per core) there is enough local RAM left even when memory for
stiffness matrix is overestimated by 2X-6X.
In any case now I do want to preallocate exactly for better memory
performance and the ambiguity involved in choosing a reasonable
o_nz/d_nz. The way I am trying to do it involves loops like ...
do i=1, num_local_elements
do j=1, num_total_nodes
...
end do
end do
or using lists that involve searches.
This unfortunately takes much time (much more than assembly and solve)
due to the second loop. I am aware of many posts/slides by PETSc authors
that mention that the non-zero structure can be found simply by looping
once through elements but what to do next is not quite clear.
I am also aware of this post by Barry [
http://lists.mcs.anl.gov/pipermail/petsc-users/2008-May/003020.html ]
but I cannot get it to work for a simple 4 element problem. Can some one
please expand on the strategy being suggested by Barry specially where
the loops are discussed (I understand the arrays and the vecscatter
part). I am also not sure how does using a t of 0.5 and 1 prevents
double counting. Shouldn't it be 0 and 1?
I am also aware of some capabilities in DMMESH but right now I dont
understand it well enough to utilize it.
Alternatively does PETSc support MATMPIAIJ of size=integer(1)/logical
instead of real(8) which I can use to put zeros/ones (when I loop over
elements the first time) to get the non-zero structure?
Thanks in advance.
Tabrez
More information about the petsc-users
mailing list