Reference documentation for deal.II version GIT d1e6af55b6 20230207 07:50:02+00:00

deal.II can be configured to use 64bit indices for degrees of freedom, rather than the usual unsigned integers that default to 32bit on most current systems. This is necessary since we want to be able to solve problems with more than 4 billion unknowns (the limit of what can be represented with 32bit unsigned integers). At the same time, we do not want to indiscriminately replace all integers in deal.II with 64bit versions, since this would increase memory use in many places where we represent quantities that will most definitely not be larger than 4 billion.
The data type we define for these indices to keep the bulk of the code base free of #ifdef
s is types::global_dof_index. If deal.II is configured as normal, this type is unsigned int
, but can be switched to unsigned long long int
if the right flag is provided (see the ReadMe file). This page is intended to clarify when types::global_dof_index must be used and when one can use a regular unsigned integer:
The number of blocks is an unsigned int because the number is expected to be low, i.e less than four billions. However, the size of the block is a types::global_dof_index because each block can be arbitrary large.
The ID of cell is not unique: Cells with different levels of refinement and/or on different processors can have the same ID. Thus, all the data associated to cells can be unsigned int because on a single processor, one one mesh level, there will definitely not be more than 4 billion cells.
The ID of each degree of freedom is unique in a parallel computation. Therefore, degrees of freedom are types::global_dof_index.
The numbers of row and column are types::global_dof_index even if it is not expected that someone will create a FullMatrix with so many entries. However, some methods of the AffineConstraints class are templated on the matrix type and thus, the size of a FullMatrix has to be of the same type than the size of SparseMatrix.
The size of SparseMatrix can be arbitrary large and it is conceivable that with sufficient memory on a single node, one may generate a matrix with more than 4 billion rows or columns. Therefore, types::global_dof_index is used. However, even for a large complex problem we can solve now, it is not reasonable to expect the number of nonzero entries in a sparse matrix to go over four billion. Thus, we still use unsigned int for, e.g., SparsityPattern::row_lengths and similar functions.