Actual source code: ex71.c
1: static char help[] = "This example illustrates the use of PCBDDC/FETI-DP with 2D/3D DMDA.\n\
2: It solves the constant coefficient Poisson problem or the Elasticity problem \n\
3: on a uniform grid of [0,cells_x] x [0,cells_y] x [0,cells_z]\n\n";
5: /* Contributed by Wim Vanroose <wim@vanroo.se> */
7: #include <petscksp.h>
8: #include <petscpc.h>
9: #include <petscdm.h>
10: #include <petscdmda.h>
11: #include <petscdmplex.h>
13: static PetscScalar poiss_1D_emat[] = {1.0000000000000000e+00, -1.0000000000000000e+00, -1.0000000000000000e+00, 1.0000000000000000e+00};
14: static PetscScalar poiss_2D_emat[] = {6.6666666666666674e-01, -1.6666666666666666e-01, -1.6666666666666666e-01, -3.3333333333333337e-01, -1.6666666666666666e-01, 6.6666666666666674e-01, -3.3333333333333337e-01, -1.6666666666666666e-01,
15: -1.6666666666666666e-01, -3.3333333333333337e-01, 6.6666666666666674e-01, -1.6666666666666666e-01, -3.3333333333333337e-01, -1.6666666666666666e-01, -1.6666666666666666e-01, 6.6666666666666674e-01};
16: static PetscScalar poiss_3D_emat[] = {3.3333333333333348e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333343e-02, -8.3333333333333343e-02, -8.3333333333333356e-02,
17: 0.0000000000000000e+00, 3.3333333333333337e-01, -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333356e-02, -8.3333333333333343e-02,
18: 0.0000000000000000e+00, -8.3333333333333343e-02, 3.3333333333333337e-01, 0.0000000000000000e+00, -8.3333333333333343e-02, -8.3333333333333356e-02, 0.0000000000000000e+00, -8.3333333333333343e-02,
19: -8.3333333333333343e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 3.3333333333333348e-01, -8.3333333333333356e-02, -8.3333333333333343e-02, -8.3333333333333343e-02, 0.0000000000000000e+00,
20: 0.0000000000000000e+00, -8.3333333333333343e-02, -8.3333333333333343e-02, -8.3333333333333356e-02, 3.3333333333333337e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -8.3333333333333343e-02,
21: -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333356e-02, -8.3333333333333343e-02, 0.0000000000000000e+00, 3.3333333333333337e-01, -8.3333333333333343e-02, 0.0000000000000000e+00,
22: -8.3333333333333343e-02, -8.3333333333333356e-02, 0.0000000000000000e+00, -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333343e-02, 3.3333333333333337e-01, 0.0000000000000000e+00,
23: -8.3333333333333356e-02, -8.3333333333333343e-02, -8.3333333333333343e-02, 0.0000000000000000e+00, -8.3333333333333343e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 3.3333333333333337e-01};
24: static PetscScalar elast_1D_emat[] = {3.0000000000000000e+00, -3.0000000000000000e+00, -3.0000000000000000e+00, 3.0000000000000000e+00};
25: static PetscScalar elast_2D_emat[] = {1.3333333333333335e+00, 5.0000000000000000e-01, -8.3333333333333337e-01, 0.0000000000000000e+00, 1.6666666666666671e-01, 0.0000000000000000e+00, -6.6666666666666674e-01, -5.0000000000000000e-01,
26: 5.0000000000000000e-01, 1.3333333333333335e+00, 0.0000000000000000e+00, 1.6666666666666671e-01, 0.0000000000000000e+00, -8.3333333333333337e-01, -5.0000000000000000e-01, -6.6666666666666674e-01,
27: -8.3333333333333337e-01, 0.0000000000000000e+00, 1.3333333333333335e+00, -5.0000000000000000e-01, -6.6666666666666674e-01, 5.0000000000000000e-01, 1.6666666666666674e-01, 0.0000000000000000e+00,
28: 0.0000000000000000e+00, 1.6666666666666671e-01, -5.0000000000000000e-01, 1.3333333333333335e+00, 5.0000000000000000e-01, -6.6666666666666674e-01, 0.0000000000000000e+00, -8.3333333333333337e-01,
29: 1.6666666666666671e-01, 0.0000000000000000e+00, -6.6666666666666674e-01, 5.0000000000000000e-01, 1.3333333333333335e+00, -5.0000000000000000e-01, -8.3333333333333337e-01, 0.0000000000000000e+00,
30: 0.0000000000000000e+00, -8.3333333333333337e-01, 5.0000000000000000e-01, -6.6666666666666674e-01, -5.0000000000000000e-01, 1.3333333333333335e+00, 0.0000000000000000e+00, 1.6666666666666674e-01,
31: -6.6666666666666674e-01, -5.0000000000000000e-01, 1.6666666666666674e-01, 0.0000000000000000e+00, -8.3333333333333337e-01, 0.0000000000000000e+00, 1.3333333333333335e+00, 5.0000000000000000e-01,
32: -5.0000000000000000e-01, -6.6666666666666674e-01, 0.0000000000000000e+00, -8.3333333333333337e-01, 0.0000000000000000e+00, 1.6666666666666674e-01, 5.0000000000000000e-01, 1.3333333333333335e+00};
33: static PetscScalar elast_3D_emat[] =
34: {5.5555555555555558e-01, 1.6666666666666666e-01, 1.6666666666666666e-01, -2.2222222222222232e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.1111111111111113e-01, 0.0000000000000000e+00, 8.3333333333333356e-02,
35: -1.9444444444444442e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111112e-01, 8.3333333333333356e-02, 0.0000000000000000e+00, -1.9444444444444445e-01, 0.0000000000000000e+00, -1.6666666666666669e-01,
36: -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.3888888888888887e-01, -8.3333333333333356e-02, -8.3333333333333356e-02, 1.6666666666666666e-01, 5.5555555555555558e-01, 1.6666666666666666e-01,
37: 0.0000000000000000e+00, 1.1111111111111113e-01, 8.3333333333333356e-02, 0.0000000000000000e+00, -2.2222222222222232e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, -1.9444444444444442e-01, 0.0000000000000000e+00,
38: 8.3333333333333356e-02, 1.1111111111111112e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.9444444444444445e-01, -1.6666666666666669e-01,
39: -8.3333333333333356e-02, -1.3888888888888887e-01, -8.3333333333333356e-02, 1.6666666666666666e-01, 1.6666666666666666e-01, 5.5555555555555558e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, 1.1111111111111112e-01,
40: 8.3333333333333356e-02, 0.0000000000000000e+00, 1.1111111111111112e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222229e-01,
41: -1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444445e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, -1.9444444444444445e-01, -8.3333333333333356e-02, -8.3333333333333356e-02, -1.3888888888888887e-01,
42: -2.2222222222222232e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 5.5555555555555558e-01, -1.6666666666666666e-01, -1.6666666666666666e-01, -1.9444444444444442e-01, 1.6666666666666669e-01, 0.0000000000000000e+00,
43: 1.1111111111111113e-01, 0.0000000000000000e+00, -8.3333333333333356e-02, -1.9444444444444445e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, 1.1111111111111113e-01, -8.3333333333333356e-02, 0.0000000000000000e+00,
44: -1.3888888888888887e-01, 8.3333333333333356e-02, 8.3333333333333356e-02, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.1111111111111113e-01, 8.3333333333333356e-02,
45: -1.6666666666666666e-01, 5.5555555555555558e-01, 1.6666666666666669e-01, 1.6666666666666669e-01, -1.9444444444444442e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222229e-01, 0.0000000000000000e+00,
46: 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, -8.3333333333333356e-02, 1.1111111111111112e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, -1.3888888888888887e-01, -8.3333333333333356e-02,
47: 0.0000000000000000e+00, -1.9444444444444448e-01, -1.6666666666666666e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, 1.1111111111111112e-01, -1.6666666666666666e-01, 1.6666666666666669e-01, 5.5555555555555558e-01,
48: 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, -8.3333333333333356e-02, 0.0000000000000000e+00, 1.1111111111111112e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444445e-01,
49: 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, 8.3333333333333356e-02, -8.3333333333333356e-02, -1.3888888888888887e-01, 0.0000000000000000e+00, -1.6666666666666666e-01, -1.9444444444444448e-01,
50: 1.1111111111111113e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, -1.9444444444444442e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, 5.5555555555555569e-01, -1.6666666666666666e-01, 1.6666666666666669e-01,
51: -2.2222222222222229e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.3888888888888887e-01, 8.3333333333333356e-02, -8.3333333333333356e-02,
52: 1.1111111111111112e-01, -8.3333333333333343e-02, 0.0000000000000000e+00, -1.9444444444444448e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, 0.0000000000000000e+00, -2.2222222222222232e-01, 0.0000000000000000e+00,
53: 1.6666666666666669e-01, -1.9444444444444442e-01, 0.0000000000000000e+00, -1.6666666666666666e-01, 5.5555555555555558e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111113e-01, -8.3333333333333343e-02,
54: 0.0000000000000000e+00, -1.9444444444444445e-01, 1.6666666666666669e-01, 8.3333333333333356e-02, -1.3888888888888887e-01, 8.3333333333333356e-02, -8.3333333333333343e-02, 1.1111111111111113e-01, 0.0000000000000000e+00,
55: 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 8.3333333333333356e-02, 0.0000000000000000e+00, 1.1111111111111112e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02,
56: 1.6666666666666669e-01, -1.6666666666666669e-01, 5.5555555555555558e-01, 0.0000000000000000e+00, -8.3333333333333343e-02, 1.1111111111111112e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, -1.9444444444444445e-01,
57: -8.3333333333333356e-02, 8.3333333333333356e-02, -1.3888888888888887e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444448e-01,
58: -1.9444444444444442e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111113e-01, 0.0000000000000000e+00, -8.3333333333333356e-02, -2.2222222222222229e-01, 0.0000000000000000e+00, 0.0000000000000000e+00,
59: 5.5555555555555558e-01, 1.6666666666666669e-01, -1.6666666666666666e-01, -1.3888888888888887e-01, -8.3333333333333356e-02, 8.3333333333333356e-02, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00,
60: -1.9444444444444448e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, 1.1111111111111112e-01, 8.3333333333333343e-02, 0.0000000000000000e+00, -1.6666666666666669e-01, -1.9444444444444442e-01, 0.0000000000000000e+00,
61: 0.0000000000000000e+00, -2.2222222222222229e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.1111111111111113e-01, -8.3333333333333343e-02, 1.6666666666666669e-01, 5.5555555555555558e-01, -1.6666666666666669e-01,
62: -8.3333333333333356e-02, -1.3888888888888887e-01, 8.3333333333333356e-02, 0.0000000000000000e+00, -1.9444444444444448e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00,
63: 8.3333333333333343e-02, 1.1111111111111112e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, -8.3333333333333356e-02, 0.0000000000000000e+00, 1.1111111111111112e-01,
64: 0.0000000000000000e+00, -8.3333333333333343e-02, 1.1111111111111112e-01, -1.6666666666666666e-01, -1.6666666666666669e-01, 5.5555555555555558e-01, 8.3333333333333356e-02, 8.3333333333333356e-02, -1.3888888888888887e-01,
65: 0.0000000000000000e+00, 1.6666666666666669e-01, -1.9444444444444448e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444448e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01,
66: 1.1111111111111112e-01, 8.3333333333333356e-02, 0.0000000000000000e+00, -1.9444444444444445e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00,
67: -1.3888888888888887e-01, -8.3333333333333356e-02, 8.3333333333333356e-02, 5.5555555555555569e-01, 1.6666666666666669e-01, -1.6666666666666669e-01, -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00,
68: 1.1111111111111112e-01, 0.0000000000000000e+00, -8.3333333333333343e-02, -1.9444444444444448e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, 1.1111111111111112e-01, 0.0000000000000000e+00,
69: 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.9444444444444445e-01, 1.6666666666666669e-01, -8.3333333333333356e-02, -1.3888888888888887e-01, 8.3333333333333356e-02,
70: 1.6666666666666669e-01, 5.5555555555555558e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111112e-01, -8.3333333333333343e-02, 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00,
71: -1.6666666666666669e-01, -1.9444444444444448e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222229e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444445e-01,
72: 0.0000000000000000e+00, 1.6666666666666669e-01, -1.9444444444444445e-01, 8.3333333333333356e-02, 8.3333333333333356e-02, -1.3888888888888887e-01, -1.6666666666666669e-01, -1.6666666666666669e-01, 5.5555555555555558e-01,
73: 0.0000000000000000e+00, -8.3333333333333343e-02, 1.1111111111111113e-01, -8.3333333333333343e-02, 0.0000000000000000e+00, 1.1111111111111113e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02,
74: -1.9444444444444445e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, 1.1111111111111113e-01, -8.3333333333333356e-02, 0.0000000000000000e+00, -1.3888888888888887e-01, 8.3333333333333356e-02, -8.3333333333333356e-02,
75: -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 5.5555555555555558e-01, -1.6666666666666669e-01, 1.6666666666666669e-01,
76: -1.9444444444444448e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111112e-01, 0.0000000000000000e+00, 8.3333333333333343e-02, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00,
77: -8.3333333333333356e-02, 1.1111111111111112e-01, 0.0000000000000000e+00, 8.3333333333333356e-02, -1.3888888888888887e-01, 8.3333333333333356e-02, 0.0000000000000000e+00, -1.9444444444444448e-01, 1.6666666666666669e-01,
78: 0.0000000000000000e+00, 1.1111111111111112e-01, -8.3333333333333343e-02, -1.6666666666666669e-01, 5.5555555555555558e-01, -1.6666666666666666e-01, 1.6666666666666669e-01, -1.9444444444444448e-01, 0.0000000000000000e+00,
79: 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444445e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01,
80: -8.3333333333333356e-02, 8.3333333333333356e-02, -1.3888888888888887e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, -1.9444444444444448e-01, 0.0000000000000000e+00, -8.3333333333333343e-02, 1.1111111111111113e-01,
81: 1.6666666666666669e-01, -1.6666666666666666e-01, 5.5555555555555558e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, 8.3333333333333343e-02, 0.0000000000000000e+00, 1.1111111111111113e-01,
82: -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.3888888888888887e-01, 8.3333333333333356e-02, 8.3333333333333356e-02, 1.1111111111111112e-01, -8.3333333333333343e-02, 0.0000000000000000e+00,
83: -1.9444444444444448e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, 1.1111111111111112e-01, 0.0000000000000000e+00, -8.3333333333333343e-02, -1.9444444444444448e-01, 1.6666666666666669e-01, 0.0000000000000000e+00,
84: 5.5555555555555558e-01, -1.6666666666666669e-01, -1.6666666666666669e-01, -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.9444444444444445e-01, -1.6666666666666669e-01,
85: 8.3333333333333356e-02, -1.3888888888888887e-01, -8.3333333333333356e-02, -8.3333333333333343e-02, 1.1111111111111113e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00,
86: 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00, 1.6666666666666669e-01, -1.9444444444444448e-01, 0.0000000000000000e+00, -1.6666666666666669e-01, 5.5555555555555558e-01, 1.6666666666666669e-01,
87: 0.0000000000000000e+00, 1.1111111111111112e-01, 8.3333333333333343e-02, 0.0000000000000000e+00, -1.6666666666666669e-01, -1.9444444444444445e-01, 8.3333333333333356e-02, -8.3333333333333356e-02, -1.3888888888888887e-01,
88: 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, 1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444448e-01, -8.3333333333333343e-02, 0.0000000000000000e+00, 1.1111111111111113e-01,
89: 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02, -1.6666666666666669e-01, 1.6666666666666669e-01, 5.5555555555555558e-01, 0.0000000000000000e+00, 8.3333333333333343e-02, 1.1111111111111113e-01,
90: -1.3888888888888887e-01, -8.3333333333333356e-02, -8.3333333333333356e-02, -2.7777777777777769e-02, 0.0000000000000000e+00, 0.0000000000000000e+00, -1.9444444444444448e-01, 0.0000000000000000e+00, -1.6666666666666669e-01,
91: 1.1111111111111112e-01, 8.3333333333333343e-02, 0.0000000000000000e+00, -1.9444444444444448e-01, -1.6666666666666669e-01, 0.0000000000000000e+00, 1.1111111111111112e-01, 0.0000000000000000e+00, 8.3333333333333343e-02,
92: -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 5.5555555555555558e-01, 1.6666666666666669e-01, 1.6666666666666669e-01, -8.3333333333333356e-02, -1.3888888888888887e-01, -8.3333333333333356e-02,
93: 0.0000000000000000e+00, -1.9444444444444448e-01, -1.6666666666666666e-01, 0.0000000000000000e+00, -2.7777777777777769e-02, 0.0000000000000000e+00, 8.3333333333333343e-02, 1.1111111111111112e-01, 0.0000000000000000e+00,
94: -1.6666666666666669e-01, -1.9444444444444448e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.1111111111111112e-01, 8.3333333333333343e-02,
95: 1.6666666666666669e-01, 5.5555555555555558e-01, 1.6666666666666669e-01, -8.3333333333333356e-02, -8.3333333333333356e-02, -1.3888888888888887e-01, 0.0000000000000000e+00, -1.6666666666666666e-01, -1.9444444444444448e-01,
96: -1.6666666666666669e-01, 0.0000000000000000e+00, -1.9444444444444448e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.2222222222222227e-01, 0.0000000000000000e+00, 0.0000000000000000e+00, -2.7777777777777769e-02,
97: 8.3333333333333343e-02, 0.0000000000000000e+00, 1.1111111111111113e-01, 0.0000000000000000e+00, 8.3333333333333343e-02, 1.1111111111111113e-01, 1.6666666666666669e-01, 1.6666666666666669e-01, 5.5555555555555558e-01};
99: typedef enum {
100: PDE_POISSON,
101: PDE_ELASTICITY
102: } PDEType;
104: typedef struct {
105: PDEType pde;
106: PetscInt dim;
107: PetscInt dof;
108: PetscInt cells[3];
109: PetscBool useglobal;
110: PetscBool dirbc;
111: PetscBool per[3];
112: PetscBool test;
113: PetscScalar *elemMat;
114: PetscBool use_composite_pc;
115: PetscBool random_initial_guess;
116: PetscBool random_real;
117: } AppCtx;
119: static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
120: {
121: const char *pdeTypes[2] = {"Poisson", "Elasticity"};
122: PetscInt n, pde;
125: options->pde = PDE_POISSON;
126: options->elemMat = NULL;
127: options->dim = 1;
128: options->cells[0] = 8;
129: options->cells[1] = 6;
130: options->cells[2] = 4;
131: options->useglobal = PETSC_FALSE;
132: options->dirbc = PETSC_TRUE;
133: options->test = PETSC_FALSE;
134: options->per[0] = PETSC_FALSE;
135: options->per[1] = PETSC_FALSE;
136: options->per[2] = PETSC_FALSE;
137: options->use_composite_pc = PETSC_FALSE;
138: options->random_initial_guess = PETSC_FALSE;
139: options->random_real = PETSC_FALSE;
141: PetscOptionsBegin(comm, NULL, "Problem Options", NULL);
142: pde = options->pde;
143: PetscOptionsEList("-pde_type", "The PDE type", __FILE__, pdeTypes, 2, pdeTypes[options->pde], &pde, NULL);
144: options->pde = (PDEType)pde;
145: PetscOptionsInt("-dim", "The topological mesh dimension", __FILE__, options->dim, &options->dim, NULL);
146: PetscOptionsIntArray("-cells", "The mesh division", __FILE__, options->cells, (n = 3, &n), NULL);
147: PetscOptionsBoolArray("-periodicity", "The mesh periodicity", __FILE__, options->per, (n = 3, &n), NULL);
148: PetscOptionsBool("-use_global", "Test MatSetValues", __FILE__, options->useglobal, &options->useglobal, NULL);
149: PetscOptionsBool("-dirichlet", "Use dirichlet BC", __FILE__, options->dirbc, &options->dirbc, NULL);
150: PetscOptionsBool("-test_assembly", "Test MATIS assembly", __FILE__, options->test, &options->test, NULL);
151: PetscOptionsBool("-use_composite_pc", "Multiplicative composite with BDDC + Richardson/Jacobi", __FILE__, options->use_composite_pc, &options->use_composite_pc, NULL);
152: PetscOptionsBool("-random_initial_guess", "Solve A x = 0 with random initial guess, instead of A x = b with random b", __FILE__, options->random_initial_guess, &options->random_initial_guess, NULL);
153: PetscOptionsBool("-random_real", "Use real-valued b (or x, if -random_initial_guess) instead of default scalar type", __FILE__, options->random_real, &options->random_real, NULL);
154: PetscOptionsEnd();
156: for (n = options->dim; n < 3; n++) options->cells[n] = 0;
157: if (options->per[0]) options->dirbc = PETSC_FALSE;
159: /* element matrices */
160: switch (options->pde) {
161: case PDE_ELASTICITY:
162: options->dof = options->dim;
163: switch (options->dim) {
164: case 1:
165: options->elemMat = elast_1D_emat;
166: break;
167: case 2:
168: options->elemMat = elast_2D_emat;
169: break;
170: case 3:
171: options->elemMat = elast_3D_emat;
172: break;
173: default:
174: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Unsupported dimension %" PetscInt_FMT, options->dim);
175: }
176: break;
177: case PDE_POISSON:
178: options->dof = 1;
179: switch (options->dim) {
180: case 1:
181: options->elemMat = poiss_1D_emat;
182: break;
183: case 2:
184: options->elemMat = poiss_2D_emat;
185: break;
186: case 3:
187: options->elemMat = poiss_3D_emat;
188: break;
189: default:
190: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Unsupported dimension %" PetscInt_FMT, options->dim);
191: }
192: break;
193: default:
194: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Unsupported PDE %d", options->pde);
195: }
196: return 0;
197: }
199: int main(int argc, char **args)
200: {
201: AppCtx user;
202: KSP ksp;
203: PC pc;
204: Mat A;
205: DM da;
206: Vec x, b, xcoor, xcoorl;
207: IS zero;
208: ISLocalToGlobalMapping map;
209: MatNullSpace nullsp = NULL;
210: PetscInt i;
211: PetscInt nel, nen; /* Number of elements & element nodes */
212: const PetscInt *e_loc; /* Local indices of element nodes (in local element order) */
213: PetscInt *e_glo = NULL; /* Global indices of element nodes (in local element order) */
214: PetscInt nodes[3];
215: PetscBool ismatis;
216: #if defined(PETSC_USE_LOG)
217: PetscLogStage stages[2];
218: #endif
221: PetscInitialize(&argc, &args, (char *)0, help);
222: ProcessOptions(PETSC_COMM_WORLD, &user);
223: for (i = 0; i < 3; i++) nodes[i] = user.cells[i] + !user.per[i];
224: switch (user.dim) {
225: case 3:
226: PetscCall(DMDACreate3d(PETSC_COMM_WORLD, user.per[0] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, user.per[1] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, user.per[2] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, nodes[0], nodes[1], nodes[2], PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE,
227: user.dof, 1, PETSC_NULL, PETSC_NULL, PETSC_NULL, &da));
228: break;
229: case 2:
230: DMDACreate2d(PETSC_COMM_WORLD, user.per[0] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, user.per[1] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, nodes[0], nodes[1], PETSC_DECIDE, PETSC_DECIDE, user.dof, 1, PETSC_NULL, PETSC_NULL, &da);
231: break;
232: case 1:
233: DMDACreate1d(PETSC_COMM_WORLD, user.per[0] ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE, nodes[0], user.dof, 1, PETSC_NULL, &da);
234: break;
235: default:
236: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Unsupported dimension %" PetscInt_FMT, user.dim);
237: }
239: PetscLogStageRegister("KSPSetUp", &stages[0]);
240: PetscLogStageRegister("KSPSolve", &stages[1]);
242: DMSetMatType(da, MATIS);
243: DMSetFromOptions(da);
244: DMDASetElementType(da, DMDA_ELEMENT_Q1);
245: DMSetUp(da);
246: {
247: PetscInt M, N, P;
248: DMDAGetInfo(da, 0, &M, &N, &P, 0, 0, 0, 0, 0, 0, 0, 0, 0);
249: switch (user.dim) {
250: case 3:
251: user.cells[2] = P - !user.per[2];
252: case 2:
253: user.cells[1] = N - !user.per[1];
254: case 1:
255: user.cells[0] = M - !user.per[0];
256: break;
257: default:
258: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Unsupported dimension %" PetscInt_FMT, user.dim);
259: }
260: }
261: DMDASetUniformCoordinates(da, 0.0, 1.0 * user.cells[0], 0.0, 1.0 * user.cells[1], 0.0, 1.0 * user.cells[2]);
262: DMGetCoordinates(da, &xcoor);
264: DMCreateMatrix(da, &A);
265: MatSetFromOptions(A);
266: DMGetLocalToGlobalMapping(da, &map);
267: DMDAGetElements(da, &nel, &nen, &e_loc);
268: if (user.useglobal) {
269: PetscMalloc1(nel * nen, &e_glo);
270: ISLocalToGlobalMappingApplyBlock(map, nen * nel, e_loc, e_glo);
271: }
273: /* we reorder the indices since the element matrices are given in lexicographic order,
274: whereas the elements indices returned by DMDAGetElements follow the usual FEM ordering
275: i.e., element matrices DMDA ordering
276: 2---3 3---2
277: / / / /
278: 0---1 0---1
279: */
280: for (i = 0; i < nel; ++i) {
281: PetscInt ord[8] = {0, 1, 3, 2, 4, 5, 7, 6};
282: PetscInt j, idxs[8];
285: if (!e_glo) {
286: for (j = 0; j < nen; j++) idxs[j] = e_loc[i * nen + ord[j]];
287: MatSetValuesBlockedLocal(A, nen, idxs, nen, idxs, user.elemMat, ADD_VALUES);
288: } else {
289: for (j = 0; j < nen; j++) idxs[j] = e_glo[i * nen + ord[j]];
290: MatSetValuesBlocked(A, nen, idxs, nen, idxs, user.elemMat, ADD_VALUES);
291: }
292: }
293: DMDARestoreElements(da, &nel, &nen, &e_loc);
294: MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
295: MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
296: MatSetOption(A, MAT_SPD, PETSC_TRUE);
297: MatSetOption(A, MAT_SPD_ETERNAL, PETSC_TRUE);
299: /* Boundary conditions */
300: zero = NULL;
301: if (user.dirbc) { /* fix one side of DMDA */
302: Vec nat, glob;
303: PetscScalar *vals;
304: PetscInt n, *idx, j, st;
306: n = PetscGlobalRank ? 0 : (user.cells[1] + 1) * (user.cells[2] + 1);
307: ISCreateStride(PETSC_COMM_WORLD, n, 0, user.cells[0] + 1, &zero);
308: if (user.dof > 1) { /* zero all components */
309: const PetscInt *idx;
310: IS bzero;
312: ISGetIndices(zero, (const PetscInt **)&idx);
313: ISCreateBlock(PETSC_COMM_WORLD, user.dof, n, idx, PETSC_COPY_VALUES, &bzero);
314: ISRestoreIndices(zero, (const PetscInt **)&idx);
315: ISDestroy(&zero);
316: zero = bzero;
317: }
318: /* map indices from natural to global */
319: DMDACreateNaturalVector(da, &nat);
320: ISGetLocalSize(zero, &n);
321: PetscMalloc1(n, &vals);
322: for (i = 0; i < n; i++) vals[i] = 1.0;
323: ISGetIndices(zero, (const PetscInt **)&idx);
324: VecSetValues(nat, n, idx, vals, INSERT_VALUES);
325: ISRestoreIndices(zero, (const PetscInt **)&idx);
326: PetscFree(vals);
327: VecAssemblyBegin(nat);
328: VecAssemblyEnd(nat);
329: DMCreateGlobalVector(da, &glob);
330: DMDANaturalToGlobalBegin(da, nat, INSERT_VALUES, glob);
331: DMDANaturalToGlobalEnd(da, nat, INSERT_VALUES, glob);
332: VecDestroy(&nat);
333: ISDestroy(&zero);
334: VecGetLocalSize(glob, &n);
335: PetscMalloc1(n, &idx);
336: VecGetOwnershipRange(glob, &st, NULL);
337: VecGetArray(glob, &vals);
338: for (i = 0, j = 0; i < n; i++)
339: if (PetscRealPart(vals[i]) == 1.0) idx[j++] = i + st;
340: VecRestoreArray(glob, &vals);
341: VecDestroy(&glob);
342: ISCreateGeneral(PETSC_COMM_WORLD, j, idx, PETSC_OWN_POINTER, &zero);
343: MatZeroRowsColumnsIS(A, zero, 1.0, NULL, NULL);
344: } else {
345: switch (user.pde) {
346: case PDE_POISSON:
347: MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, NULL, &nullsp);
348: break;
349: case PDE_ELASTICITY:
350: MatNullSpaceCreateRigidBody(xcoor, &nullsp);
351: break;
352: }
353: /* with periodic BC and Elasticity, just the displacements are in the nullspace
354: this is no harm since we eliminate all the components of the rhs */
355: MatSetNullSpace(A, nullsp);
356: }
358: if (user.test) {
359: Mat AA;
361: MatConvert(A, MATAIJ, MAT_INITIAL_MATRIX, &AA);
362: MatViewFromOptions(AA, NULL, "-assembled_view");
363: MatDestroy(&AA);
364: }
366: /* Attach near null space for elasticity */
367: if (user.pde == PDE_ELASTICITY) {
368: MatNullSpace nearnullsp;
370: MatNullSpaceCreateRigidBody(xcoor, &nearnullsp);
371: MatSetNearNullSpace(A, nearnullsp);
372: MatNullSpaceDestroy(&nearnullsp);
373: }
375: /* we may want to use MG for the local solvers: attach local nearnullspace to the local matrices */
376: DMGetCoordinatesLocal(da, &xcoorl);
377: PetscObjectTypeCompare((PetscObject)A, MATIS, &ismatis);
378: if (ismatis) {
379: MatNullSpace lnullsp = NULL;
380: Mat lA;
382: MatISGetLocalMat(A, &lA);
383: if (user.pde == PDE_ELASTICITY) {
384: Vec lc;
385: ISLocalToGlobalMapping l2l;
386: IS is;
387: const PetscScalar *a;
388: const PetscInt *idxs;
389: PetscInt n, bs;
391: /* when using a DMDA, the local matrices have an additional local-to-local map
392: that maps from the DA local ordering to the ordering induced by the elements */
393: MatCreateVecs(lA, &lc, NULL);
394: MatGetLocalToGlobalMapping(lA, &l2l, NULL);
395: VecSetLocalToGlobalMapping(lc, l2l);
396: VecSetOption(lc, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE);
397: VecGetLocalSize(xcoorl, &n);
398: VecGetBlockSize(xcoorl, &bs);
399: ISCreateStride(PETSC_COMM_SELF, n / bs, 0, 1, &is);
400: ISGetIndices(is, &idxs);
401: VecGetArrayRead(xcoorl, &a);
402: VecSetValuesBlockedLocal(lc, n / bs, idxs, a, INSERT_VALUES);
403: VecAssemblyBegin(lc);
404: VecAssemblyEnd(lc);
405: VecRestoreArrayRead(xcoorl, &a);
406: ISRestoreIndices(is, &idxs);
407: ISDestroy(&is);
408: MatNullSpaceCreateRigidBody(lc, &lnullsp);
409: VecDestroy(&lc);
410: } else if (user.pde == PDE_POISSON) {
411: MatNullSpaceCreate(PETSC_COMM_SELF, PETSC_TRUE, 0, NULL, &lnullsp);
412: }
413: MatSetNearNullSpace(lA, lnullsp);
414: MatNullSpaceDestroy(&lnullsp);
415: MatISRestoreLocalMat(A, &lA);
416: }
418: KSPCreate(PETSC_COMM_WORLD, &ksp);
419: KSPSetOperators(ksp, A, A);
420: KSPSetType(ksp, KSPCG);
421: KSPGetPC(ksp, &pc);
422: if (user.use_composite_pc) {
423: PC pcksp, pcjacobi;
424: KSP ksprich;
425: PCSetType(pc, PCCOMPOSITE);
426: PCCompositeSetType(pc, PC_COMPOSITE_MULTIPLICATIVE);
427: PCCompositeAddPCType(pc, PCBDDC);
428: PCCompositeAddPCType(pc, PCKSP);
429: PCCompositeGetPC(pc, 1, &pcksp);
430: PCKSPGetKSP(pcksp, &ksprich);
431: KSPSetType(ksprich, KSPRICHARDSON);
432: KSPSetTolerances(ksprich, PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT, 1);
433: KSPSetNormType(ksprich, KSP_NORM_NONE);
434: KSPSetConvergenceTest(ksprich, KSPConvergedSkip, NULL, NULL);
435: KSPGetPC(ksprich, &pcjacobi);
436: PCSetType(pcjacobi, PCJACOBI);
437: } else {
438: PCSetType(pc, PCBDDC);
439: }
440: /* PCBDDCSetDirichletBoundaries(pc,zero); */
441: KSPSetFromOptions(ksp);
442: PetscLogStagePush(stages[0]);
443: KSPSetUp(ksp);
444: PetscLogStagePop();
446: MatCreateVecs(A, &x, &b);
447: if (user.random_initial_guess) {
448: /* Solving A x = 0 with random initial guess allows Arnoldi to run for more iterations, thereby yielding a more
449: * complete Hessenberg matrix and more accurate eigenvalues. */
450: VecZeroEntries(b);
451: VecSetRandom(x, NULL);
452: if (user.random_real) VecRealPart(x);
453: if (nullsp) MatNullSpaceRemove(nullsp, x);
454: KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
455: KSPSetComputeEigenvalues(ksp, PETSC_TRUE);
456: KSPGMRESSetRestart(ksp, 100);
457: } else {
458: VecSetRandom(b, NULL);
459: if (user.random_real) VecRealPart(x);
460: if (nullsp) MatNullSpaceRemove(nullsp, b);
461: }
462: PetscLogStagePush(stages[1]);
463: KSPSolve(ksp, b, x);
464: PetscLogStagePop();
466: /* cleanup */
467: VecDestroy(&x);
468: VecDestroy(&b);
469: ISDestroy(&zero);
470: PetscFree(e_glo);
471: MatNullSpaceDestroy(&nullsp);
472: KSPDestroy(&ksp);
473: MatDestroy(&A);
474: DMDestroy(&da);
475: PetscFinalize();
476: return 0;
477: }
479: /*TEST
481: test:
482: nsize: 8
483: filter: grep -v "variant HERMITIAN"
484: suffix: bddc_1
485: args: -pde_type Poisson -dim 3 -dirichlet 0 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged
486: test:
487: nsize: 8
488: filter: grep -v "variant HERMITIAN"
489: suffix: bddc_2
490: args: -pde_type Poisson -dim 3 -dirichlet 0 -ksp_view -use_global -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged
491: test:
492: nsize: 8
493: filter: grep -v "variant HERMITIAN"
494: suffix: bddc_elast
495: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic
496: test:
497: nsize: 8
498: filter: grep -v "variant HERMITIAN"
499: suffix: bddc_elast_3lev
500: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_levels 1 -pc_bddc_coarsening_ratio 1 -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_use_faces -pc_bddc_coarse_pc_bddc_corner_selection
501: testset:
502: nsize: 8
503: requires: hpddm slepc defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
504: # on some architectures, this test will converge in 19 or 21 iterations
505: filter: grep -v "variant HERMITIAN" | grep -v " tolerance" | sed -e "s/CONVERGED_RTOL iterations [1-2][91]\{0,1\}$/CONVERGED_RTOL iterations 20/g"
506: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_levels 1 -pc_bddc_coarsening_ratio 1 -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_use_faces -pc_bddc_coarse_pc_type hpddm -prefix_push pc_bddc_coarse_ -pc_hpddm_levels_1_sub_pc_type cholesky -pc_hpddm_levels_1_eps_nev 6 -pc_hpddm_levels_1_st_pc_factor_shift_type INBLOCKS -prefix_pop -ksp_type fgmres -ksp_max_it 50 -ksp_converged_reason
507: test:
508: args: -pc_bddc_coarse_pc_hpddm_coarse_mat_type baij -options_left no
509: suffix: bddc_elast_3lev_hpddm_baij
510: test:
511: requires: !complex
512: suffix: bddc_elast_3lev_hpddm
513: test:
514: nsize: 8
515: requires: !single
516: filter: grep -v "variant HERMITIAN"
517: suffix: bddc_elast_4lev
518: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_levels 2 -pc_bddc_coarsening_ratio 2 -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_use_faces -pc_bddc_coarse_pc_bddc_corner_selection -pc_bddc_coarse_l1_pc_bddc_corner_selection -mat_partitioning_type average -options_left 0
519: test:
520: nsize: 8
521: filter: grep -v "variant HERMITIAN"
522: suffix: bddc_elast_deluxe_layers
523: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_use_deluxe_scaling -pc_bddc_schur_layers 1
524: test:
525: nsize: 8
526: filter: grep -v "variant HERMITIAN" | sed -e "s/iterations 1[0-9]/iterations 10/g"
527: suffix: bddc_elast_dir_approx
528: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_dirichlet_pc_type gamg -pc_bddc_dirichlet_pc_gamg_esteig_ksp_max_it 10 -ksp_converged_reason -pc_bddc_dirichlet_approximate
529: test:
530: nsize: 8
531: filter: grep -v "variant HERMITIAN" | sed -e "s/iterations 1[0-9]/iterations 10/g"
532: suffix: bddc_elast_neu_approx
533: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_neumann_pc_type gamg -pc_bddc_neumann_pc_gamg_esteig_ksp_max_it 10 -ksp_converged_reason -pc_bddc_neumann_approximate
534: test:
535: nsize: 8
536: filter: grep -v "variant HERMITIAN" | sed -e "s/iterations 1[0-9]/iterations 10/g"
537: suffix: bddc_elast_both_approx
538: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -pc_bddc_dirichlet_pc_type gamg -pc_bddc_dirichlet_pc_gamg_esteig_ksp_max_it 10 -pc_bddc_neumann_pc_type gamg -pc_bddc_neumann_pc_gamg_esteig_ksp_max_it 10 -ksp_converged_reason -pc_bddc_neumann_approximate -pc_bddc_dirichlet_approximate
539: test:
540: nsize: 8
541: filter: grep -v "variant HERMITIAN"
542: suffix: fetidp_1
543: args: -pde_type Poisson -dim 3 -dirichlet 0 -ksp_view -ksp_type fetidp -fetidp_ksp_type cg -fetidp_bddc_pc_bddc_coarse_redundant_pc_type svd -ksp_fetidp_fullyredundant -ksp_error_if_not_converged
544: test:
545: nsize: 8
546: filter: grep -v "variant HERMITIAN"
547: suffix: fetidp_2
548: args: -pde_type Poisson -dim 3 -dirichlet 0 -ksp_view -use_global -ksp_type fetidp -fetidp_ksp_type cg -fetidp_bddc_pc_bddc_coarse_redundant_pc_type svd -ksp_fetidp_fullyredundant -ksp_error_if_not_converged
549: test:
550: nsize: 8
551: filter: grep -v "variant HERMITIAN"
552: suffix: fetidp_elast
553: args: -pde_type Elasticity -cells 9,7,8 -dim 3 -ksp_view -ksp_type fetidp -fetidp_ksp_type cg -fetidp_bddc_pc_bddc_coarse_redundant_pc_type svd -ksp_fetidp_fullyredundant -ksp_error_if_not_converged -fetidp_bddc_pc_bddc_monolithic
554: testset:
555: nsize: 8
556: requires: hpddm slepc defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
557: args: -pde_type Elasticity -cells 12,12 -dim 2 -ksp_converged_reason -pc_type hpddm -pc_hpddm_coarse_correction balanced -pc_hpddm_levels_1_pc_type asm -pc_hpddm_levels_1_pc_asm_overlap 1 -pc_hpddm_levels_1_pc_asm_type basic -pc_hpddm_levels_1_sub_pc_type cholesky -pc_hpddm_levels_1_eps_nev 10 -pc_hpddm_levels_1_st_pc_factor_shift_type INBLOCKS
558: test:
559: args: -matis_localmat_type {{aij baij sbaij}shared output} -pc_hpddm_coarse_mat_type {{baij sbaij}shared output}
560: suffix: hpddm
561: output_file: output/ex71_hpddm.out
562: test:
563: args: -matis_localmat_type sbaij -pc_hpddm_coarse_mat_type sbaij -pc_hpddm_levels_1_st_share_sub_ksp -pc_hpddm_levels_1_eps_type lapack -pc_hpddm_levels_1_eps_smallest_magnitude -pc_hpddm_levels_1_st_type shift
564: suffix: hpddm_lapack
565: output_file: output/ex71_hpddm.out
566: testset:
567: nsize: 9
568: args: -test_assembly -assembled_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged
569: test:
570: args: -dim 1 -cells 12 -pde_type Poisson
571: suffix: dmda_matis_poiss_1d_loc
572: output_file: output/ex71_dmda_matis_poiss_1d.out
573: test:
574: args: -dim 1 -cells 12 -pde_type Poisson -use_global
575: suffix: dmda_matis_poiss_1d_glob
576: output_file: output/ex71_dmda_matis_poiss_1d.out
577: test:
578: args: -dim 1 -cells 12 -pde_type Elasticity
579: suffix: dmda_matis_elast_1d_loc
580: output_file: output/ex71_dmda_matis_elast_1d.out
581: test:
582: args: -dim 1 -cells 12 -pde_type Elasticity -use_global
583: suffix: dmda_matis_elast_1d_glob
584: output_file: output/ex71_dmda_matis_elast_1d.out
585: test:
586: args: -dim 2 -cells 5,7 -pde_type Poisson
587: suffix: dmda_matis_poiss_2d_loc
588: output_file: output/ex71_dmda_matis_poiss_2d.out
589: test:
590: args: -dim 2 -cells 5,7 -pde_type Poisson -use_global
591: suffix: dmda_matis_poiss_2d_glob
592: output_file: output/ex71_dmda_matis_poiss_2d.out
593: test:
594: args: -dim 2 -cells 5,7 -pde_type Elasticity
595: suffix: dmda_matis_elast_2d_loc
596: output_file: output/ex71_dmda_matis_elast_2d.out
597: test:
598: args: -dim 2 -cells 5,7 -pde_type Elasticity -use_global
599: suffix: dmda_matis_elast_2d_glob
600: output_file: output/ex71_dmda_matis_elast_2d.out
601: test:
602: args: -dim 3 -cells 3,3,3 -pde_type Poisson
603: suffix: dmda_matis_poiss_3d_loc
604: output_file: output/ex71_dmda_matis_poiss_3d.out
605: test:
606: args: -dim 3 -cells 3,3,3 -pde_type Poisson -use_global
607: suffix: dmda_matis_poiss_3d_glob
608: output_file: output/ex71_dmda_matis_poiss_3d.out
609: test:
610: args: -dim 3 -cells 3,3,3 -pde_type Elasticity
611: suffix: dmda_matis_elast_3d_loc
612: output_file: output/ex71_dmda_matis_elast_3d.out
613: test:
614: args: -dim 3 -cells 3,3,3 -pde_type Elasticity -use_global
615: suffix: dmda_matis_elast_3d_glob
616: output_file: output/ex71_dmda_matis_elast_3d.out
617: test:
618: nsize: 8
619: filter: grep -v "variant HERMITIAN"
620: suffix: bddc_elast_deluxe_layers_adapt
621: requires: mumps !complex
622: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_converged_reason -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -sub_schurs_mat_solver_type mumps -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2.0 -pc_bddc_schur_layers {{1 10}separate_output} -pc_bddc_adaptive_userdefined {{0 1}separate output} -sub_schurs_schur_mat_type seqdense
623: # gitlab runners have a quite old MKL (2016) which interacts badly with AMD machines (not Intel-based ones!)
624: # this is the reason behind the filtering rule
625: test:
626: nsize: 8
627: suffix: bddc_elast_deluxe_layers_adapt_mkl_pardiso
628: filter: sed -e "s/CONVERGED_RTOL iterations [1-2][0-9]/CONVERGED_RTOL iterations 13/g" | sed -e "s/CONVERGED_RTOL iterations 6/CONVERGED_RTOL iterations 5/g"
629: requires: mkl_pardiso !complex
630: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_converged_reason -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -sub_schurs_mat_solver_type mkl_pardiso -sub_schurs_mat_mkl_pardiso_65 1 -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2.0 -pc_bddc_schur_layers {{1 10}separate_output} -pc_bddc_adaptive_userdefined {{0 1}separate output} -sub_schurs_schur_mat_type seqdense
631: test:
632: nsize: 8
633: filter: grep -v "variant HERMITIAN"
634: suffix: bddc_cusparse
635: # no kokkos since it seems kokkos's resource demand is too much with 8 ranks and the test will fail on cuda related initialization.
636: requires: cuda !kokkos
637: args: -pde_type Poisson -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_dirichlet_pc_type cholesky -pc_bddc_dirichlet_pc_factor_mat_solver_type cusparse -pc_bddc_dirichlet_pc_factor_mat_ordering_type nd -pc_bddc_neumann_pc_type cholesky -pc_bddc_neumann_pc_factor_mat_solver_type cusparse -pc_bddc_neumann_pc_factor_mat_ordering_type nd -matis_localmat_type aijcusparse
638: test:
639: nsize: 8
640: filter: grep -v "variant HERMITIAN"
641: suffix: bddc_elast_deluxe_layers_adapt_cuda
642: requires: !complex mumps cuda defined(PETSC_HAVE_CUSOLVERDNDPOTRI)
643: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_converged_reason -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -sub_schurs_mat_solver_type mumps -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2.0 -pc_bddc_schur_layers {{1 10}separate_output} -pc_bddc_adaptive_userdefined {{0 1}separate output} -matis_localmat_type seqaijcusparse -sub_schurs_schur_mat_type {{seqdensecuda seqdense}}
644: test:
645: nsize: 8
646: filter: grep -v "variant HERMITIAN" | grep -v "I-node routines" | sed -e "s/seqaijcusparse/seqaij/g"
647: suffix: bddc_elast_deluxe_layers_adapt_cuda_approx
648: requires: !complex mumps cuda defined(PETSC_HAVE_CUSOLVERDNDPOTRI)
649: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_view -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -sub_schurs_mat_solver_type mumps -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2.0 -pc_bddc_schur_layers 1 -matis_localmat_type {{seqaij seqaijcusparse}separate output} -sub_schurs_schur_mat_type {{seqdensecuda seqdense}} -pc_bddc_dirichlet_pc_type gamg -pc_bddc_dirichlet_approximate -pc_bddc_neumann_pc_type gamg -pc_bddc_neumann_approximate -pc_bddc_dirichlet_pc_gamg_esteig_ksp_max_it 10 -pc_bddc_neumann_pc_gamg_esteig_ksp_max_it 10
650: test:
651: nsize: 8
652: suffix: bddc_elast_deluxe_layers_adapt_mkl_pardiso_cuda
653: requires: !complex mkl_pardiso cuda defined(PETSC_HAVE_CUSOLVERDNDPOTRI)
654: filter: sed -e "s/CONVERGED_RTOL iterations 6/CONVERGED_RTOL iterations 5/g"
655: args: -pde_type Elasticity -cells 7,9,8 -dim 3 -ksp_converged_reason -pc_bddc_coarse_redundant_pc_type svd -ksp_error_if_not_converged -pc_bddc_monolithic -sub_schurs_mat_solver_type mkl_pardiso -sub_schurs_mat_mkl_pardiso_65 1 -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2.0 -pc_bddc_schur_layers {{1 10}separate_output} -pc_bddc_adaptive_userdefined {{0 1}separate output} -matis_localmat_type seqaijcusparse -sub_schurs_schur_mat_type {{seqdensecuda seqdense}}
657: testset:
658: nsize: 2
659: output_file: output/ex71_aij_dmda_preall.out
660: filter: sed -e "s/CONVERGED_RTOL iterations 7/CONVERGED_RTOL iterations 6/g"
661: args: -pde_type Poisson -dim 1 -cells 6 -pc_type none -ksp_converged_reason
662: test:
663: suffix: aijviennacl_dmda_preall
664: requires: viennacl
665: args: -dm_mat_type aijviennacl -dm_preallocate_only {{0 1}} -dirichlet {{0 1}}
666: # -dm_preallocate_only 0 is broken
667: test:
668: suffix: aijcusparse_dmda_preall
669: requires: cuda
670: args: -dm_mat_type aijcusparse -dm_preallocate_only -dirichlet {{0 1}}
671: test:
672: suffix: aij_dmda_preall
673: args: -dm_mat_type aij -dm_preallocate_only {{0 1}} -dirichlet {{0 1}}
674: testset:
675: nsize: 4
676: args: -dim 2 -cells 16,16 -periodicity 1,1 -random_initial_guess -random_real -sub_0_pc_bddc_switch_static -use_composite_pc -ksp_monitor -ksp_converged_reason -ksp_type gmres -ksp_view_singularvalues -ksp_view_eigenvalues -sub_0_pc_bddc_use_edges 0 -sub_0_pc_bddc_coarse_pc_type svd -sub_1_ksp_ksp_max_it 1 -sub_1_ksp_ksp_richardson_scale 2.3
677: test:
678: args: -sub_0_pc_bddc_interface_ext_type lump
679: suffix: composite_bddc_lumped
680: test:
681: requires: !single
682: args: -sub_0_pc_bddc_interface_ext_type dirichlet
683: suffix: composite_bddc_dirichlet
685: testset:
686: nsize: 8
687: filter: grep -v "variant HERMITIAN"
688: args: -cells 7,9,8 -dim 3 -ksp_view -ksp_error_if_not_converged -pc_type mg -pc_mg_levels 2 -pc_mg_galerkin -pc_mg_adapt_interp_coarse_space gdsw -mg_levels_pc_type asm -mg_levels_sub_pc_type icc -mg_coarse_redundant_pc_type cholesky
689: test:
690: suffix: gdsw_poisson
691: args: -pde_type Poisson
692: test:
693: requires: mumps !complex
694: suffix: gdsw_poisson_adaptive
695: args: -pde_type Poisson -mg_levels_gdsw_tolerance 0.01 -ksp_monitor_singular_value -mg_levels_gdsw_userdefined {{0 1}separate output} -mg_levels_gdsw_pseudo_pc_type qr
696: test:
697: suffix: gdsw_elast
698: args: -pde_type Elasticity
699: test:
700: requires: hpddm
701: suffix: gdsw_elast_hpddm
702: args: -pde_type Elasticity -mg_levels_gdsw_ksp_type hpddm -mg_levels_gdsw_ksp_hpddm_type cg
703: test:
704: requires: mumps !complex
705: suffix: gdsw_elast_adaptive
706: args: -pde_type Elasticity -mg_levels_gdsw_tolerance 0.01 -ksp_monitor_singular_value -mg_levels_gdsw_userdefined {{0 1}separate output}
708: TEST*/