Date: 2026-05-01T06:11:44+00:00

Actual source code: pcbddcstructsimpl.h

      1: #pragma once

      3: #include <petscksp.h>
      4: #include <petscbt.h>

      6: /* special marks for interface graph: they cannot be enums
      7:    since PCBDDCGRAPH_SPECIAL_MARK ranges from -4 to -max_int */
      8: #define PCBDDCGRAPH_NEUMANN_MARK        -1
      9: #define PCBDDCGRAPH_DIRICHLET_MARK      -2
     10: #define PCBDDCGRAPH_LOCAL_PERIODIC_MARK -3
     11: #define PCBDDCGRAPH_SPECIAL_MARK        -4

     13: /* Metadata information on node */
     14: typedef struct {
     15:   PetscBool touched;
     16:   PetscInt  subset;
     17:   PetscInt  which_dof;
     18:   PetscInt  special_dof;
     19:   PetscInt  local_sub;
     20:   PetscInt  count;
     21:   PetscInt *neighbours_set;
     22:   PetscBool shared;
     23:   PetscInt  local_groups_count;
     24:   PetscInt *local_groups;
     25: } PCBDDCGraphNode;

     27: /* Data structure for local graph partitioning */
     28: struct _PCBDDCGraph {
     29:   PetscBool setupcalled;
     30:   /* graph information */
     31:   ISLocalToGlobalMapping l2gmap;
     32:   PetscInt               nvtxs;
     33:   PetscInt               nvtxs_global;
     34:   PCBDDCGraphNode       *nodes;
     35:   PetscInt               custom_minimal_size;
     36:   PetscBool              twodim;
     37:   PetscBool              twodimset;
     38:   PetscBool              has_dirichlet;
     39:   PetscBool              multi_element;
     40:   IS                     dirdofs;
     41:   IS                     dirdofsB;
     42:   PetscBool              seq_graph;
     43:   PetscInt               maxcount;
     44:   /* data for connected components */
     45:   PetscInt  ncc;
     46:   PetscInt *cptr;
     47:   PetscInt *queue;
     48:   PetscBool queue_sorted;
     49:   /* data for interface subsets */
     50:   PetscInt   n_subsets;
     51:   PetscInt  *subset_size;
     52:   PetscInt **subset_idxs;
     53:   PetscInt  *subset_ncc;
     54:   PetscInt  *subset_ref_node;
     55:   PetscInt  *gsubset_size;
     56:   PetscInt  *interface_ref_rsize;
     57:   PetscSF    interface_ref_sf;
     58:   PetscSF    interface_subset_sf;
     59:   /* placeholders for connectivity relation between dofs */
     60:   PetscInt  nvtxs_csr;
     61:   PetscInt *xadj;
     62:   PetscInt *adjncy;
     63:   PetscBool freecsr;
     64:   /* data for local subdomains (if any have been detected)
     65:      these are not intended to be exposed */
     66:   PetscInt  n_local_subs;
     67:   PetscInt *local_subs;
     68:   /* coordinates (for corner detection) */
     69:   PetscBool  active_coords;
     70:   PetscBool  cloc;
     71:   PetscInt   cdim, cnloc;
     72:   PetscReal *coords;
     73: };
     74: typedef struct _PCBDDCGraph *PCBDDCGraph;

     76: struct _PCBDDCGraphCandidates {
     77:   PetscInt nfc, nec;
     78:   IS      *Faces, *Edges, Vertices;
     79: };
     80: typedef struct _PCBDDCGraphCandidates *PCBDDCGraphCandidates;

     82: /* Wrap to MatFactor solver in Schur complement mode. Provides
     83:    - standalone solver for interior variables
     84:    - forward and backward substitutions for correction solver
     85: */
     86: /* It assumes that interior variables are a contiguous set starting from 0 */
     87: struct _PCBDDCReuseSolvers {
     88:   /* the factored matrix obtained from MatGetFactor(...,solver_package,...) */
     89:   Mat F;
     90:   /* placeholders for the solution and rhs on the whole set of dofs of A (size local_dofs - local_vertices)*/
     91:   Vec sol;
     92:   Vec rhs;
     93:   /* */
     94:   PetscBool has_vertices;
     95:   /* shell PCs to handle interior/correction solvers */
     96:   PC interior_solver;
     97:   PC correction_solver;
     98:   IS is_R;
     99:   /* objects to handle Schur complement solution */
    100:   Vec        rhs_B;
    101:   Vec        sol_B;
    102:   IS         is_B;
    103:   VecScatter correction_scatter_B;
    104:   /* handle benign trick without change of basis on pressures */
    105:   PetscInt     benign_n;
    106:   IS          *benign_zerodiag_subs;
    107:   PetscScalar *benign_save_vals;
    108:   Mat          benign_csAIB;
    109:   Mat          benign_AIIm1ones;
    110:   Vec          benign_corr_work;
    111:   Vec          benign_dummy_schur_vec;
    112: };
    113: typedef struct _PCBDDCReuseSolvers *PCBDDCReuseSolvers;

    115: /* structure to handle Schur complements on subsets */
    116: struct _PCBDDCSubSchurs {
    117:   /* local Neumann matrix */
    118:   Mat A;
    119:   /* local Schur complement */
    120:   Mat S;
    121:   /* index sets */
    122:   IS is_I;
    123:   IS is_B;
    124:   /* whether Schur complements are explicitly computed with or not */
    125:   PetscBool schur_explicit;
    126:   /* BDDC or GDSW */
    127:   PetscBool gdsw;
    128:   /* matrices contained explicit schur complements cat together */
    129:   /* note that AIJ format is used but the values are inserted as in column major ordering */
    130:   Mat S_Ej_all;
    131:   Mat sum_S_Ej_all;
    132:   Mat sum_S_Ej_inv_all;
    133:   Mat sum_S_Ej_tilda_all;
    134:   IS  is_Ej_all;
    135:   IS  is_vertices;
    136:   IS  is_dir;
    137:   /* l2g maps */
    138:   ISLocalToGlobalMapping l2gmap;
    139:   ISLocalToGlobalMapping BtoNmap;
    140:   /* number of local subproblems */
    141:   PetscInt n_subs;
    142:   /* connected components */
    143:   IS     *is_subs;
    144:   PetscBT is_edge;
    145:   /* mat factor */
    146:   char          mat_solver_type[64];
    147:   MatFactorType mat_factor_type;
    148:   PetscBool     is_symmetric;
    149:   PetscBool     is_hermitian;
    150:   PetscBool     is_posdef;
    151:   /* data structure to reuse MatFactor with Schur solver */
    152:   PCBDDCReuseSolvers reuse_solver;
    153:   /* change of variables */
    154:   KSP      *change;
    155:   IS       *change_primal_sub;
    156:   PetscBool change_with_qr;
    157:   /* prefix */
    158:   char *prefix;
    159:   /* */
    160:   PetscBool restrict_comm;
    161:   /* debug */
    162:   PetscBool debug;
    163:   /* hook to PCBDDCGraph */
    164:   PCBDDCGraph graph;
    165: };
    166: typedef struct _PCBDDCSubSchurs *PCBDDCSubSchurs;

    168: /* Structure for deluxe scaling */
    169: struct _PCBDDCDeluxeScaling {
    170:   /* simple scaling on selected dofs (i.e. primal vertices and nodes on interface dirichlet boundaries) */
    171:   PetscInt  n_simple;
    172:   PetscInt *idx_simple_B;
    173:   /* handle deluxe problems  */
    174:   PetscInt     seq_n;
    175:   PetscScalar *workspace;
    176:   VecScatter  *seq_scctx;
    177:   Vec         *seq_work1;
    178:   Vec         *seq_work2;
    179:   Mat         *seq_mat;
    180:   Mat         *seq_mat_inv_sum;
    181:   KSP         *change;
    182:   PetscBool    change_with_qr;
    183: };
    184: typedef struct _PCBDDCDeluxeScaling *PCBDDCDeluxeScaling;

    186: /* inexact solvers with nullspace correction */
    187: struct _NullSpaceCorrection_ctx {
    188:   Mat           basis_mat;
    189:   Mat           inv_smat;
    190:   PC            local_pc;
    191:   Vec          *fw;
    192:   Vec          *sw;
    193:   PetscScalar   scale;
    194:   PetscLogEvent evapply;
    195:   PetscBool     symm;
    196: };
    197: typedef struct _NullSpaceCorrection_ctx *NullSpaceCorrection_ctx;

    199: /* MatShell context for benign mat mults */
    200: struct _PCBDDCBenignMatMult_ctx {
    201:   Mat          A;
    202:   PetscInt     benign_n;
    203:   IS          *benign_zerodiag_subs;
    204:   PetscScalar *work;
    205:   PetscBool    apply_left;
    206:   PetscBool    apply_right;
    207:   PetscBool    apply_p0;
    208:   PetscBool    free;
    209: };
    210: typedef struct _PCBDDCBenignMatMult_ctx *PCBDDCBenignMatMult_ctx;

    212: /* feti-dp mat */
    213: struct _FETIDPMat_ctx {
    214:   PetscInt   n;        /* local number of rows */
    215:   PetscInt   N;        /* global number of rows */
    216:   PetscInt   n_lambda; /* global number of multipliers */
    217:   Vec        lambda_local;
    218:   Vec        temp_solution_B;
    219:   Vec        temp_solution_D;
    220:   Mat        B_delta;
    221:   Mat        B_Ddelta;
    222:   PetscBool  deluxe_nonred;
    223:   VecScatter l2g_lambda;
    224:   PC         pc;
    225:   PetscBool  fully_redundant;
    226:   /* saddle point */
    227:   VecScatter l2g_lambda_only;
    228:   Mat        B_BB;
    229:   Mat        B_BI;
    230:   Mat        Bt_BB;
    231:   Mat        Bt_BI;
    232:   Mat        C;
    233:   VecScatter l2g_p;
    234:   VecScatter g2g_p;
    235:   Vec        vP;
    236:   Vec        xPg;
    237:   Vec        yPg;
    238:   Vec        rhs_flip;
    239:   IS         lP_I;
    240:   IS         lP_B;
    241:   IS         pressure;
    242:   IS         lagrange;
    243: };
    244: typedef struct _FETIDPMat_ctx *FETIDPMat_ctx;

    246: /* feti-dp preconditioner */
    247: struct _FETIDPPC_ctx {
    248:   Mat        S_j;
    249:   Vec        lambda_local;
    250:   Mat        B_Ddelta;
    251:   VecScatter l2g_lambda;
    252:   PC         pc;
    253:   /* saddle point */
    254:   Vec xPg;
    255:   Vec yPg;
    256: };
    257: typedef struct _FETIDPPC_ctx *FETIDPPC_ctx;

    259: struct _BDdelta_DN {
    260:   Mat BD;
    261:   KSP kBD;
    262:   Vec work;
    263: };
    264: typedef struct _BDdelta_DN *BDdelta_DN;

    266: /* Schur interface preconditioner */
    267: struct _BDDCIPC_ctx {
    268:   VecScatter g2l;
    269:   PC         bddc;
    270: };
    271: typedef struct _BDDCIPC_ctx *BDDCIPC_ctx;