xref: /petsc/src/dm/impls/plex/tests/ex35.c (revision dfd57a172ac9fa6c7b5fe6de6ab5df85cefc2996)
142565d0bSMatthew G. Knepley static char help[] = "Exhaustive memory tracking for DMPlex.\n\n\n";
242565d0bSMatthew G. Knepley 
342565d0bSMatthew G. Knepley #include <petscdmplex.h>
442565d0bSMatthew G. Knepley 
542565d0bSMatthew G. Knepley static PetscErrorCode EstimateMemory(DM dm, PetscLogDouble *est)
642565d0bSMatthew G. Knepley {
742565d0bSMatthew G. Knepley   DMLabel        marker;
842565d0bSMatthew G. Knepley   PetscInt       cdim, depth, d, pStart, pEnd, p, Nd[4] = {0, 0, 0, 0}, lsize = 0, rmem = 0, imem = 0;
942565d0bSMatthew G. Knepley   PetscInt       coneSecMem = 0, coneMem = 0, supportSecMem = 0, supportMem = 0, labelMem = 0;
1042565d0bSMatthew G. Knepley   PetscErrorCode ierr;
1142565d0bSMatthew G. Knepley 
1242565d0bSMatthew G. Knepley   PetscFunctionBeginUser;
1342565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_SELF, "Memory Estimates\n");CHKERRQ(ierr);
1442565d0bSMatthew G. Knepley   ierr = DMGetCoordinateDim(dm, &cdim);CHKERRQ(ierr);
1542565d0bSMatthew G. Knepley   ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr);
1642565d0bSMatthew G. Knepley   ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr);
1742565d0bSMatthew G. Knepley   for (d = 0; d <= depth; ++d) {
1842565d0bSMatthew G. Knepley     PetscInt start, end;
1942565d0bSMatthew G. Knepley 
2042565d0bSMatthew G. Knepley     ierr = DMPlexGetDepthStratum(dm, d, &start, &end);CHKERRQ(ierr);
2142565d0bSMatthew G. Knepley     Nd[d] = end - start;
2242565d0bSMatthew G. Knepley   }
2342565d0bSMatthew G. Knepley   /* Coordinates: 3 Nv reals + 2*Nv + 2*Nv ints */
2442565d0bSMatthew G. Knepley   rmem += cdim*Nd[0];
2542565d0bSMatthew G. Knepley   imem += 2*Nd[0] + 2*Nd[0];
2642565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_SELF, "  Coordinate mem:  %D %D\n", cdim*Nd[0]*sizeof(PetscReal), 4*Nd[0]*sizeof(PetscInt));CHKERRQ(ierr);
2742565d0bSMatthew G. Knepley   /* Depth:       Nc+Nf+Ne+Nv ints */
2842565d0bSMatthew G. Knepley   for (d = 0; d <= depth; ++d) labelMem += Nd[d];
2942565d0bSMatthew G. Knepley   /* Cell Type:   Nc+Nf+Ne+Nv ints */
3042565d0bSMatthew G. Knepley   for (d = 0; d <= depth; ++d) labelMem += Nd[d];
3142565d0bSMatthew G. Knepley   /* Marker */
3242565d0bSMatthew G. Knepley   ierr = DMGetLabel(dm, "marker", &marker);CHKERRQ(ierr);
3342565d0bSMatthew G. Knepley   if (marker) {ierr = DMLabelGetStratumSize(marker, 1, &lsize);CHKERRQ(ierr);}
3442565d0bSMatthew G. Knepley   labelMem += lsize;
3542565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_SELF, "  Label mem:       %D\n", labelMem*sizeof(PetscInt));CHKERRQ(ierr);
3642565d0bSMatthew G. Knepley   //imem += labelMem;
3742565d0bSMatthew G. Knepley   /* Cones and Orientations:       4 Nc + 3 Nf + 2 Ne ints + (Nc+Nf+Ne) ints no separate orientation section */
3842565d0bSMatthew G. Knepley   for (d = 0; d <= depth; ++d) coneSecMem += 2*Nd[d];
3942565d0bSMatthew G. Knepley   for (p = pStart; p < pEnd; ++p) {
4042565d0bSMatthew G. Knepley     PetscInt csize;
4142565d0bSMatthew G. Knepley 
4242565d0bSMatthew G. Knepley     ierr = DMPlexGetConeSize(dm, p, &csize);CHKERRQ(ierr);
4342565d0bSMatthew G. Knepley     coneMem += csize;
4442565d0bSMatthew G. Knepley   }
4542565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_SELF, "  Cone mem:        %D %D (%D)\n", coneMem*sizeof(PetscInt), coneSecMem*sizeof(PetscInt), coneMem*sizeof(PetscInt));CHKERRQ(ierr);
4642565d0bSMatthew G. Knepley   imem += 2*coneMem + coneSecMem;
4742565d0bSMatthew G. Knepley   /* Supports:       4 Nc + 3 Nf + 2 Ne ints + Nc+Nf+Ne ints */
4842565d0bSMatthew G. Knepley   for (d = 0; d <= depth; ++d) supportSecMem += 2*Nd[d];
4942565d0bSMatthew G. Knepley   for (p = pStart; p < pEnd; ++p) {
5042565d0bSMatthew G. Knepley     PetscInt ssize;
5142565d0bSMatthew G. Knepley 
5242565d0bSMatthew G. Knepley     ierr = DMPlexGetSupportSize(dm, p, &ssize);CHKERRQ(ierr);
5342565d0bSMatthew G. Knepley     supportMem += ssize;
5442565d0bSMatthew G. Knepley   }
5542565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_SELF, "  Support mem:     %D %D\n", supportMem*sizeof(PetscInt), supportSecMem*sizeof(PetscInt));CHKERRQ(ierr);
5642565d0bSMatthew G. Knepley   imem += supportMem + supportSecMem;
5742565d0bSMatthew G. Knepley   *est = ((PetscLogDouble) imem)*sizeof(PetscInt) + ((PetscLogDouble) rmem)*sizeof(PetscReal);
5842565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_WORLD, "  Estimated memory %D\n", (PetscInt) *est);CHKERRQ(ierr);
5942565d0bSMatthew G. Knepley   PetscFunctionReturn(0);
6042565d0bSMatthew G. Knepley }
6142565d0bSMatthew G. Knepley 
6242565d0bSMatthew G. Knepley int main(int argc, char **argv)
6342565d0bSMatthew G. Knepley {
6442565d0bSMatthew G. Knepley   DM             dm;
6542565d0bSMatthew G. Knepley   PetscBool      trace = PETSC_FALSE, checkMemory = PETSC_TRUE, auxMemory = PETSC_FALSE;
6642565d0bSMatthew G. Knepley   PetscLogDouble before, after, est = 0, clean, max;
6742565d0bSMatthew G. Knepley   PetscErrorCode ierr;
6842565d0bSMatthew G. Knepley 
6942565d0bSMatthew G. Knepley   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
7042565d0bSMatthew G. Knepley   ierr = PetscOptionsGetBool(NULL, NULL, "-trace", &trace, NULL);CHKERRQ(ierr);
7142565d0bSMatthew G. Knepley   ierr = PetscOptionsGetBool(NULL, NULL, "-check_memory", &checkMemory, NULL);CHKERRQ(ierr);
7242565d0bSMatthew G. Knepley   ierr = PetscOptionsGetBool(NULL, NULL, "-aux_memory", &auxMemory, NULL);CHKERRQ(ierr);
7342565d0bSMatthew G. Knepley   ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr);
7442565d0bSMatthew G. Knepley   ierr = PetscMallocGetCurrentUsage(&before);CHKERRQ(ierr);
7542565d0bSMatthew G. Knepley   if (trace) {ierr = PetscMallocTraceSet(NULL, PETSC_TRUE, 5000.);CHKERRQ(ierr);}
7630602db0SMatthew G. Knepley   ierr = DMCreate(PETSC_COMM_WORLD, &dm);CHKERRQ(ierr);
7730602db0SMatthew G. Knepley   ierr = DMSetType(dm, DMPLEX);CHKERRQ(ierr);
7830602db0SMatthew G. Knepley   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
7942565d0bSMatthew G. Knepley   if (trace) {ierr = PetscMallocTraceSet(NULL, PETSC_FALSE, 5000);CHKERRQ(ierr);}
8042565d0bSMatthew G. Knepley   ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
8142565d0bSMatthew G. Knepley   ierr = PetscMallocGetCurrentUsage(&after);CHKERRQ(ierr);
8242565d0bSMatthew G. Knepley   ierr = PetscMemoryGetMaximumUsage(&max);CHKERRQ(ierr);
8342565d0bSMatthew G. Knepley   ierr = EstimateMemory(dm, &est);CHKERRQ(ierr);
8442565d0bSMatthew G. Knepley   ierr = DMDestroy(&dm);CHKERRQ(ierr);
8542565d0bSMatthew G. Knepley   ierr = PetscMallocGetCurrentUsage(&clean);CHKERRQ(ierr);
8642565d0bSMatthew G. Knepley   ierr = PetscPrintf(PETSC_COMM_WORLD, "Measured Memory\n");CHKERRQ(ierr);
8742565d0bSMatthew G. Knepley   if (auxMemory) {
8842565d0bSMatthew G. Knepley     ierr = PetscPrintf(PETSC_COMM_WORLD, "  Initial memory         %D\n  Extra memory for build %D\n  Memory after destroy   %D\n",
8942565d0bSMatthew G. Knepley                        (PetscInt) before, (PetscInt) (max-after), (PetscInt) clean);CHKERRQ(ierr);
9042565d0bSMatthew G. Knepley   }
9142565d0bSMatthew G. Knepley   if (checkMemory) {
9242565d0bSMatthew G. Knepley     ierr = PetscPrintf(PETSC_COMM_WORLD, "  Memory for mesh  %D\n", (PetscInt) (after-before));CHKERRQ(ierr);
9342565d0bSMatthew G. Knepley     ierr = PetscPrintf(PETSC_COMM_WORLD, "Discrepancy %D\n", (PetscInt) PetscAbsReal(after-before-est));CHKERRQ(ierr);
9442565d0bSMatthew G. Knepley   }
9542565d0bSMatthew G. Knepley   ierr = PetscFinalize();
9642565d0bSMatthew G. Knepley   return ierr;
9742565d0bSMatthew G. Knepley }
9842565d0bSMatthew G. Knepley 
9942565d0bSMatthew G. Knepley /*TEST
10042565d0bSMatthew G. Knepley   build:
101*dfd57a17SPierre Jolivet     requires: !defined(PETSC_USE_64BIT_INDICES) double !complex !defined(PETSCTEST_VALGRIND)
10242565d0bSMatthew G. Knepley 
10342565d0bSMatthew G. Knepley   # Mempry checks cannot be included in tests because the allocated memory differs among environments
10442565d0bSMatthew G. Knepley   testset:
10542565d0bSMatthew G. Knepley     args: -malloc_requested_size -dm_plex_box_faces 5,5 -check_memory 0
10642565d0bSMatthew G. Knepley     test:
10742565d0bSMatthew G. Knepley       suffix: tri
10842565d0bSMatthew G. Knepley       requires: triangle
10930602db0SMatthew G. Knepley       args: -dm_plex_simplex 1 -dm_plex_interpolate 0
11042565d0bSMatthew G. Knepley 
11142565d0bSMatthew G. Knepley     test:
11242565d0bSMatthew G. Knepley       suffix: tri_interp
11342565d0bSMatthew G. Knepley       requires: triangle
11430602db0SMatthew G. Knepley       args: -dm_plex_simplex 1 -dm_plex_interpolate 1
11542565d0bSMatthew G. Knepley 
11642565d0bSMatthew G. Knepley     test:
11742565d0bSMatthew G. Knepley       suffix: quad
11830602db0SMatthew G. Knepley       args: -dm_plex_simplex 0 -dm_plex_interpolate 0
11942565d0bSMatthew G. Knepley 
12042565d0bSMatthew G. Knepley     test:
12142565d0bSMatthew G. Knepley       suffix: quad_interp
12230602db0SMatthew G. Knepley       args: -dm_plex_simplex 0 -dm_plex_interpolate 1
12342565d0bSMatthew G. Knepley 
12430602db0SMatthew G. Knepley   # Memory checks cannot be included in tests because the allocated memory differs among environments
12542565d0bSMatthew G. Knepley   testset:
12630602db0SMatthew G. Knepley     args: -malloc_requested_size -dm_plex_dim 3 -dm_plex_box_faces 5,5,5 -check_memory 0
12742565d0bSMatthew G. Knepley     test:
12842565d0bSMatthew G. Knepley       suffix: tet
12942565d0bSMatthew G. Knepley       requires: ctetgen
13030602db0SMatthew G. Knepley       args: -dm_plex_simplex 1 -dm_plex_interpolate 0
13142565d0bSMatthew G. Knepley 
13242565d0bSMatthew G. Knepley     test:
13342565d0bSMatthew G. Knepley       suffix: tet_interp
13442565d0bSMatthew G. Knepley       requires: ctetgen
13530602db0SMatthew G. Knepley       args: -dm_plex_simplex 1 -dm_plex_interpolate 1
13642565d0bSMatthew G. Knepley 
13742565d0bSMatthew G. Knepley     test:
13842565d0bSMatthew G. Knepley       suffix: hex
13930602db0SMatthew G. Knepley       args: -dm_plex_simplex 0 -dm_plex_interpolate 0
14042565d0bSMatthew G. Knepley 
14142565d0bSMatthew G. Knepley     test:
14242565d0bSMatthew G. Knepley       suffix: hex_interp
14330602db0SMatthew G. Knepley       args: -dm_plex_simplex 0 -dm_plex_interpolate 1
14442565d0bSMatthew G. Knepley TEST*/
145