Lines Matching refs:sub_schurs

381 PetscErrorCode PCBDDCSubSchursSetUp(PCBDDCSubSchurs sub_schurs, Mat Ain, Mat Sin, PetscBool exact_s…  in PCBDDCSubSchursSetUp()  argument
392 PetscInt *local_subs = sub_schurs->graph->local_subs; in PCBDDCSubSchursSetUp()
393 PetscInt i, subset_size, max_subset_size, n_local_subs = sub_schurs->graph->n_local_subs; in PCBDDCSubSchursSetUp()
401 PetscBool flg, multi_element = sub_schurs->graph->multi_element; in PCBDDCSubSchursSetUp()
404 PetscCall(MatDestroy(&sub_schurs->A)); in PCBDDCSubSchursSetUp()
405 PetscCall(MatDestroy(&sub_schurs->S)); in PCBDDCSubSchursSetUp()
408 sub_schurs->A = Ain; in PCBDDCSubSchursSetUp()
412 sub_schurs->S = Sin; in PCBDDCSubSchursSetUp()
413 if (sub_schurs->schur_explicit) sub_schurs->schur_explicit = (PetscBool)(!!sub_schurs->A); in PCBDDCSubSchursSetUp()
416 …PetscCheck(sub_schurs->schur_explicit || !compute_Stilda, PetscObjectComm((PetscObject)sub_schurs-… in PCBDDCSubSchursSetUp()
418 if (benign_trick) sub_schurs->is_posdef = PETSC_FALSE; in PCBDDCSubSchursSetUp()
421 if (sub_schurs->debug) { in PCBDDCSubSchursSetUp()
425 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)sub_schurs->l2gmap), &size)); in PCBDDCSubSchursSetUp()
426 PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)sub_schurs->l2gmap), &rank)); in PCBDDCSubSchursSetUp()
429 …PetscOptionsBegin(PetscObjectComm((PetscObject)sub_schurs->l2gmap), sub_schurs->prefix, "BDDC sub_… in PCBDDCSubSchursSetUp()
452 …PetscCall(PetscOptionsGetBool(NULL, sub_schurs->prefix, "-sub_schurs_multielement_code", &multi_el… in PCBDDCSubSchursSetUp()
456 if (sub_schurs->restrict_comm) { in PCBDDCSubSchursSetUp()
461 …if (!sub_schurs->n_subs) color = 1; /* this can happen if we are in a multilevel case or if the su… in PCBDDCSubSchursSetUp()
462 PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)sub_schurs->l2gmap), &rank)); in PCBDDCSubSchursSetUp()
463 PetscCall(PetscSubcommCreate(PetscObjectComm((PetscObject)sub_schurs->l2gmap), &subcomm)); in PCBDDCSubSchursSetUp()
468 if (!sub_schurs->n_subs) { in PCBDDCSubSchursSetUp()
473 PetscCall(PetscCommDuplicate(PetscObjectComm((PetscObject)sub_schurs->l2gmap), &comm_n, NULL)); in PCBDDCSubSchursSetUp()
477 if (!sub_schurs->schur_explicit) { in PCBDDCSubSchursSetUp()
480 PetscCall(MatSchurComplementGetSubMatrices(sub_schurs->S, &A_II, NULL, &tA_IB, &tA_BI, &tA_BB)); in PCBDDCSubSchursSetUp()
503 PetscCall(ISGetLocalSize(sub_schurs->is_I, &i)); in PCBDDCSubSchursSetUp()
511 PetscCall(ISGetLocalSize(sub_schurs->is_I, &n_I)); in PCBDDCSubSchursSetUp()
512 PetscCall(ISGetLocalSize(sub_schurs->is_B, &n_B)); in PCBDDCSubSchursSetUp()
519 PetscCall(ISGetIndices(sub_schurs->is_B, &idx_B)); in PCBDDCSubSchursSetUp()
522 PetscCall(ISRestoreIndices(sub_schurs->is_B, &idx_B)); in PCBDDCSubSchursSetUp()
539 …PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)sub_schurs->is_I), n_local_dofs - n_B, loca… in PCBDDCSubSchursSetUp()
543 if (!sub_schurs->schur_explicit) { in PCBDDCSubSchursSetUp()
545 PetscCall(ISLocalToGlobalMappingCreateIS(sub_schurs->is_I, &ItoNmap)); in PCBDDCSubSchursSetUp()
556 PetscCall(PetscObjectReference((PetscObject)sub_schurs->is_I)); in PCBDDCSubSchursSetUp()
557 is_I_layer = sub_schurs->is_I; in PCBDDCSubSchursSetUp()
560 if (!sub_schurs->schur_explicit) { in PCBDDCSubSchursSetUp()
561 PetscCall(ISGetSize(sub_schurs->is_I, &n_I)); in PCBDDCSubSchursSetUp()
562 PetscCall(ISCreateStride(PetscObjectComm((PetscObject)sub_schurs->is_I), n_I, 0, 1, &is_I)); in PCBDDCSubSchursSetUp()
573 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
574 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
581 PetscCall(ISGetLocalSize(sub_schurs->is_B, &n_B)); in PCBDDCSubSchursSetUp()
582 if (sub_schurs->schur_explicit && is_I_layer) PetscCall(ISGetLocalSize(is_I_layer, &extra)); in PCBDDCSubSchursSetUp()
593 PetscCall(PetscMalloc1(sub_schurs->n_subs, &auxnum1)); in PCBDDCSubSchursSetUp()
594 PetscCall(PetscMalloc1(sub_schurs->n_subs, &auxnum2)); in PCBDDCSubSchursSetUp()
599 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
602 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
603 PetscCall(ISGetIndices(sub_schurs->is_subs[i], &idxs)); in PCBDDCSubSchursSetUp()
611 PetscCall(ISRestoreIndices(sub_schurs->is_subs[i], &idxs)); in PCBDDCSubSchursSetUp()
618 if (benign_trick || (sub_schurs->is_hermitian && sub_schurs->is_posdef)) { in PCBDDCSubSchursSetUp()
620 } else if (sub_schurs->is_symmetric) { in PCBDDCSubSchursSetUp()
646 …PetscCall(ISCreateGeneral(comm_n, sub_schurs->n_subs, auxnum1, PETSC_OWN_POINTER, &all_subsets_n)); in PCBDDCSubSchursSetUp()
647 PetscCall(ISLocalToGlobalMappingApplyIS(sub_schurs->l2gmap, all_subsets_n, &all_subsets)); in PCBDDCSubSchursSetUp()
649 …PetscCall(ISCreateGeneral(comm_n, sub_schurs->n_subs, auxnum2, PETSC_OWN_POINTER, &all_subsets_mul… in PCBDDCSubSchursSetUp()
661 if (!sub_schurs->is_Ej_all) { in PCBDDCSubSchursSetUp()
665 …PetscCall(ISGlobalToLocalMappingApply(sub_schurs->BtoNmap, IS_GTOLM_DROP, local_size, all_local_id… in PCBDDCSubSchursSetUp()
667 …eGeneral(PETSC_COMM_SELF, local_size, all_local_idx_B, PETSC_OWN_POINTER, &sub_schurs->is_Ej_all)); in PCBDDCSubSchursSetUp()
675 …PetscCheck(!sub_schurs->change_primal_sub, PETSC_COMM_SELF, PETSC_ERR_PLIB, "This should not happe… in PCBDDCSubSchursSetUp()
676 PetscCheck(!sub_schurs->change, PETSC_COMM_SELF, PETSC_ERR_PLIB, "This should not happen"); in PCBDDCSubSchursSetUp()
677 PetscCall(PetscMalloc1(sub_schurs->n_subs, &sub_schurs->change_primal_sub)); in PCBDDCSubSchursSetUp()
678 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
680 PetscCall(ISLocalToGlobalMappingCreateIS(sub_schurs->is_subs[i], &NtoS)); in PCBDDCSubSchursSetUp()
681 …PetscCall(ISGlobalToLocalMappingApplyIS(NtoS, IS_GTOLM_DROP, change_primal, &sub_schurs->change_pr… in PCBDDCSubSchursSetUp()
684 …PetscCall(ISGlobalToLocalMappingApplyIS(sub_schurs->BtoNmap, IS_GTOLM_DROP, change_primal, &change… in PCBDDCSubSchursSetUp()
685 PetscCall(ISLocalToGlobalMappingCreateIS(sub_schurs->is_Ej_all, &BtoS)); in PCBDDCSubSchursSetUp()
689 PetscCall(PetscMalloc1(sub_schurs->n_subs, &sub_schurs->change)); in PCBDDCSubSchursSetUp()
690 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
693 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
694 PetscCall(KSPCreate(PETSC_COMM_SELF, &sub_schurs->change[i])); in PCBDDCSubSchursSetUp()
695 …PetscCall(KSPSetNestLevel(sub_schurs->change[i], 1)); /* do not seem to have direct access to a PC… in PCBDDCSubSchursSetUp()
696 PetscCall(KSPSetType(sub_schurs->change[i], KSPPREONLY)); in PCBDDCSubSchursSetUp()
697 if (!sub_schurs->change_with_qr) { in PCBDDCSubSchursSetUp()
698 …PetscCall(MatCreateSubMatrix(change, sub_schurs->is_subs[i], sub_schurs->is_subs[i], MAT_INITIAL_M… in PCBDDCSubSchursSetUp()
701 …PetscCall(MatCreateSubMatrix(change, sub_schurs->is_subs[i], sub_schurs->is_subs[i], MAT_INITIAL_M… in PCBDDCSubSchursSetUp()
705 PetscCall(KSPSetOperators(sub_schurs->change[i], change_sub, change_sub)); in PCBDDCSubSchursSetUp()
707 PetscCall(KSPSetOptionsPrefix(sub_schurs->change[i], sub_schurs->prefix)); in PCBDDCSubSchursSetUp()
708 PetscCall(KSPAppendOptionsPrefix(sub_schurs->change[i], "sub_schurs_change_")); in PCBDDCSubSchursSetUp()
714 if (!sub_schurs->S_Ej_all) { in PCBDDCSubSchursSetUp()
725 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
726 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
740 PetscCall(MatDuplicate(T, MAT_DO_NOT_COPY_VALUES, &sub_schurs->S_Ej_all)); in PCBDDCSubSchursSetUp()
746 …if (!sub_schurs->sum_S_Ej_tilda_all) PetscCall(MatDuplicate(sub_schurs->S_Ej_all, MAT_DO_NOT_COPY_… in PCBDDCSubSchursSetUp()
747 …if (!sub_schurs->sum_S_Ej_inv_all && deluxe) PetscCall(MatDuplicate(sub_schurs->S_Ej_all, MAT_DO_N… in PCBDDCSubSchursSetUp()
752 if (!sub_schurs->schur_explicit) { in PCBDDCSubSchursSetUp()
762 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
767 …PetscCall(ISGlobalToLocalMappingApplyIS(sub_schurs->BtoNmap, IS_GTOLM_DROP, sub_schurs->is_subs[i]… in PCBDDCSubSchursSetUp()
773 if (sub_schurs->is_symmetric) { in PCBDDCSubSchursSetUp()
775 } else if (sub_schurs->is_hermitian) { in PCBDDCSubSchursSetUp()
787 PetscCall(MatSchurComplementGetKSP(sub_schurs->S, &ksp)); in PCBDDCSubSchursSetUp()
796 PetscCall(MatSchurComplementGetKSP(sub_schurs->S, &origksp)); in PCBDDCSubSchursSetUp()
818 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
820 …PetscCall(PCBDDCComputeExplicitSchur(S_Ej, sub_schurs->is_symmetric, MAT_REUSE_MATRIX, &S_Ej_expl)… in PCBDDCSubSchursSetUp()
824 …PetscCall(MatSetValues(sub_schurs->S_Ej_all, subset_size, dummy_idx, subset_size, dummy_idx, work,… in PCBDDCSubSchursSetUp()
857 PetscCall(ISGetLocalSize(sub_schurs->is_I, &cum)); in PCBDDCSubSchursSetUp()
859 PetscCall(MatGetLocalSize(sub_schurs->A, &n, NULL)); in PCBDDCSubSchursSetUp()
869 PetscCall(ISGetIndices(sub_schurs->is_Ej_all, &idxs)); in PCBDDCSubSchursSetUp()
876 PetscCall(ISRestoreIndices(sub_schurs->is_Ej_all, &idxs)); in PCBDDCSubSchursSetUp()
884 if (sub_schurs->is_dir) { in PCBDDCSubSchursSetUp()
888 PetscCall(ISGetLocalSize(sub_schurs->is_dir, &n_dir)); in PCBDDCSubSchursSetUp()
889 PetscCall(ISGetIndices(sub_schurs->is_dir, &idxs)); in PCBDDCSubSchursSetUp()
893 PetscCall(ISRestoreIndices(sub_schurs->is_dir, &idxs)); in PCBDDCSubSchursSetUp()
895 if (!sub_schurs->gdsw) factor_workaround = PETSC_TRUE; in PCBDDCSubSchursSetUp()
898 if (exact_schur && sub_schurs->is_vertices && (compute_Stilda || benign_n)) { in PCBDDCSubSchursSetUp()
901 PetscCall(ISGetLocalSize(sub_schurs->is_vertices, &n_v)); in PCBDDCSubSchursSetUp()
905 PetscCall(ISGetIndices(sub_schurs->is_vertices, &idxs)); in PCBDDCSubSchursSetUp()
909 PetscCall(ISRestoreIndices(sub_schurs->is_vertices, &idxs)); in PCBDDCSubSchursSetUp()
911 if (!sub_schurs->gdsw) factor_workaround = PETSC_TRUE; in PCBDDCSubSchursSetUp()
918 oldpin = sub_schurs->A->boundtocpu; in PCBDDCSubSchursSetUp()
919 PetscCall(MatBindToCPU(sub_schurs->A, PETSC_TRUE)); in PCBDDCSubSchursSetUp()
923 PetscCall(MatPermute(sub_schurs->A, is_A_all, is_A_all, &A)); in PCBDDCSubSchursSetUp()
925 PetscCall(MatCreateSubMatrix(sub_schurs->A, is_A_all, is_A_all, MAT_INITIAL_MATRIX, &A)); in PCBDDCSubSchursSetUp()
928 PetscCall(MatBindToCPU(sub_schurs->A, oldpin)); in PCBDDCSubSchursSetUp()
930 PetscCall(MatSetOptionsPrefixFactor(A, sub_schurs->prefix)); in PCBDDCSubSchursSetUp()
1014 PetscCall(MatSetOption(A, MAT_SYMMETRIC, sub_schurs->is_symmetric)); in PCBDDCSubSchursSetUp()
1015 PetscCall(MatSetOption(A, MAT_HERMITIAN, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1016 PetscCall(MatSetOption(A, MAT_SPD, sub_schurs->is_posdef)); in PCBDDCSubSchursSetUp()
1019 …use_cholesky = (PetscBool)((use_potr || use_sytr) && sub_schurs->is_hermitian && sub_schurs->is_sy… in PCBDDCSubSchursSetUp()
1025 sub_schurs->is_posdef = PETSC_TRUE; in PCBDDCSubSchursSetUp()
1026 PetscCall(PetscStrcmp(sub_schurs->mat_solver_type, MATSOLVERMKL_PARDISO, &flg)); in PCBDDCSubSchursSetUp()
1029 …if (sub_schurs->mat_factor_type == MAT_FACTOR_NONE) sub_schurs->mat_factor_type = use_cholesky ? M… in PCBDDCSubSchursSetUp()
1035 PetscCall(MatGetFactor(A, sub_schurs->mat_solver_type, sub_schurs->mat_factor_type, &F)); in PCBDDCSubSchursSetUp()
1044 switch (sub_schurs->mat_factor_type) { in PCBDDCSubSchursSetUp()
1059 …Object)F), PETSC_ERR_SUP, "Unsupported factor type %s", MatFactorTypes[sub_schurs->mat_factor_type… in PCBDDCSubSchursSetUp()
1083 for (i = 0, cum = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
1088 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
1093 if (sub_schurs->change) { in PCBDDCSubSchursSetUp()
1097 PetscCall(KSPGetOperators(sub_schurs->change[i], &T, NULL)); in PCBDDCSubSchursSetUp()
1101 PetscCall(PetscObjectSetName((PetscObject)sub_schurs->change_primal_sub[i], name)); in PCBDDCSubSchursSetUp()
1102 PetscCall(ISView(sub_schurs->change_primal_sub[i], matl_dbg_viewer)); in PCBDDCSubSchursSetUp()
1116 …PetscCall(PetscOptionsGetString(NULL, sub_schurs->prefix, "-sub_schurs_schur_mat_type", stype, siz… in PCBDDCSubSchursSetUp()
1118 PetscCall(MatSetOption(S_all, MAT_SPD, sub_schurs->is_posdef)); in PCBDDCSubSchursSetUp()
1119 PetscCall(MatSetOption(S_all, MAT_HERMITIAN, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1123 reuse_solvers = (PetscBool)(reuse_solvers && !economic && !sub_schurs->graph->multi_element); in PCBDDCSubSchursSetUp()
1124 if (!sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1126 …if (!sub_schurs->is_posdef && factor_workaround && compute_Stilda && size_active_schur) reuse_solv… in PCBDDCSubSchursSetUp()
1270 PetscCall(MatSetOption(S_all, MAT_ROW_ORIENTED, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1286 … PetscCall(MatGetFactor(Asub, sub_schurs->mat_solver_type, sub_schurs->mat_factor_type, &F)); in PCBDDCSubSchursSetUp()
1296 switch (sub_schurs->mat_factor_type) { in PCBDDCSubSchursSetUp()
1311 …Object)F), PETSC_ERR_SUP, "Unsupported factor type %s", MatFactorTypes[sub_schurs->mat_factor_type… in PCBDDCSubSchursSetUp()
1326 PetscCall(MatSetOption(S_all, MAT_SPD, sub_schurs->is_posdef)); in PCBDDCSubSchursSetUp()
1327 PetscCall(MatSetOption(S_all, MAT_HERMITIAN, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1346 if (sub_schurs->reuse_solver) { in PCBDDCSubSchursSetUp()
1347 PetscCall(PCBDDCReuseSolversReset(sub_schurs->reuse_solver)); in PCBDDCSubSchursSetUp()
1349 PetscCall(PetscNew(&sub_schurs->reuse_solver)); in PCBDDCSubSchursSetUp()
1351 msolv_ctx = sub_schurs->reuse_solver; in PCBDDCSubSchursSetUp()
1352 PetscCall(MatSchurComplementGetSubMatrices(sub_schurs->S, &A_II, &pA_II, NULL, NULL, NULL)); in PCBDDCSubSchursSetUp()
1377 …if (sub_schurs->gdsw) PetscCall(PCShellSetDestroy(msolv_ctx->interior_solver, PCBDDCReuseSolvers_D… in PCBDDCSubSchursSetUp()
1380 if (!sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1391 PetscCall(MatCreateVecs(sub_schurs->S, &vec1_B, NULL)); in PCBDDCSubSchursSetUp()
1393 …PetscCall(ISGlobalToLocalMappingApplyIS(sub_schurs->BtoNmap, IS_GTOLM_DROP, is_A_all, &msolv_ctx->… in PCBDDCSubSchursSetUp()
1402 PetscCall(ISGetLocalSize(sub_schurs->is_vertices, &n_v)); in PCBDDCSubSchursSetUp()
1407 …PetscCall(ISGlobalToLocalMappingApplyIS(sub_schurs->BtoNmap, IS_GTOLM_DROP, is_B_all, &msolv_ctx->… in PCBDDCSubSchursSetUp()
1438 if (sub_schurs->reuse_solver) PetscCall(PCBDDCReuseSolversReset(sub_schurs->reuse_solver)); in PCBDDCSubSchursSetUp()
1439 PetscCall(PetscFree(sub_schurs->reuse_solver)); in PCBDDCSubSchursSetUp()
1452 PetscCall(MatSeqAIJGetArray(sub_schurs->S_Ej_all, &SEj_arr)); in PCBDDCSubSchursSetUp()
1453 …if (sub_schurs->sum_S_Ej_inv_all) PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_inv_all, &SEjin… in PCBDDCSubSchursSetUp()
1454 …if (sub_schurs->gdsw) PetscCall(MatCreateSubMatrices(sub_schurs->A, sub_schurs->n_subs, sub_schurs in PCBDDCSubSchursSetUp()
1455 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
1457 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
1458 if (sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1469 if (!sub_schurs->is_hermitian) { in PCBDDCSubSchursSetUp()
1492 if (sub_schurs->change) { in PCBDDCSubSchursSetUp()
1496 PetscCall(KSPGetOperators(sub_schurs->change[i], &change_sub, NULL)); in PCBDDCSubSchursSetUp()
1498 if (!sub_schurs->change_with_qr) { /* currently there's no support for PtAP with P SeqAIJ */ in PCBDDCSubSchursSetUp()
1509 PetscCall(MatZeroRowsColumnsIS(SEj, sub_schurs->change_primal_sub[i], 1.0, NULL, NULL)); in PCBDDCSubSchursSetUp()
1520 PetscCall(MatSetOption(M, MAT_SPD, sub_schurs->is_posdef)); in PCBDDCSubSchursSetUp()
1521 PetscCall(MatSetOption(M, MAT_HERMITIAN, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1522 if (!PetscBTLookup(sub_schurs->is_edge, i)) PetscCall(MatSetType(M, Stype)); in PCBDDCSubSchursSetUp()
1525 switch (sub_schurs->mat_factor_type) { in PCBDDCSubSchursSetUp()
1533 …Object)F), PETSC_ERR_SUP, "Unsupported factor type %s", MatFactorTypes[sub_schurs->mat_factor_type… in PCBDDCSubSchursSetUp()
1567 if (sub_schurs->gdsw) PetscCall(MatDestroySubMatrices(sub_schurs->n_subs, &gdswA)); in PCBDDCSubSchursSetUp()
1569 PetscCall(MatSeqAIJRestoreArray(sub_schurs->S_Ej_all, &SEj_arr)); in PCBDDCSubSchursSetUp()
1570 …if (sub_schurs->sum_S_Ej_inv_all) PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_inv_all, &S… in PCBDDCSubSchursSetUp()
1581 …PetscCall(PetscOptionsGetBool(NULL, sub_schurs->prefix, "-sub_schurs_schur_pin_to_cpu", &flg, NULL… in PCBDDCSubSchursSetUp()
1590 …if (sub_schurs->n_subs == 1 && size_schur == size_active_schur && deluxe) { /* we already computed… in PCBDDCSubSchursSetUp()
1591 PetscCall(MatSeqAIJGetArrayWrite(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1593 PetscCall(MatSeqAIJRestoreArrayWrite(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1597 if (solver_S && !sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1607 if (sub_schurs->is_dir) { /* dirichlet dofs could have different scalings */ in PCBDDCSubSchursSetUp()
1608 PetscCall(ISGetLocalSize(sub_schurs->is_dir, &nd)); in PCBDDCSubSchursSetUp()
1617 PetscCall(ISGetLocalSize(sub_schurs->is_vertices, &nv)); in PCBDDCSubSchursSetUp()
1677 …} else if (!sub_schurs->gdsw) { /* we need to invert explicitly since we are not using MatFactor f… in PCBDDCSubSchursSetUp()
1680 PetscCall(MatSetOption(S_all_inv, MAT_ROW_ORIENTED, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1689 PetscCall(MatSetOption(M, MAT_SPD, sub_schurs->is_posdef)); in PCBDDCSubSchursSetUp()
1690 PetscCall(MatSetOption(M, MAT_HERMITIAN, sub_schurs->is_hermitian)); in PCBDDCSubSchursSetUp()
1691 switch (sub_schurs->mat_factor_type) { in PCBDDCSubSchursSetUp()
1699 …Object)F), PETSC_ERR_SUP, "Unsupported factor type %s", MatFactorTypes[sub_schurs->mat_factor_type… in PCBDDCSubSchursSetUp()
1738 } else if (sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1747 PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1748 for (i = 0, cum = 0; i < sub_schurs->n_subs; i++) { /* naive implementation */ in PCBDDCSubSchursSetUp()
1749 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
1765 PetscCall(KSPSetOptionsPrefix(pS_II, sub_schurs->prefix)); in PCBDDCSubSchursSetUp()
1786 PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1792 PetscCall(MatSeqAIJGetArrayWrite(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1793 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
1796 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
1804 if (!sub_schurs->is_hermitian) { in PCBDDCSubSchursSetUp()
1816 if (sub_schurs->change) { in PCBDDCSubSchursSetUp()
1835 if (sub_schurs->change) { in PCBDDCSubSchursSetUp()
1837 PetscScalar val = sub_schurs->gdsw ? PETSC_SMALL : 1. / PETSC_SMALL; in PCBDDCSubSchursSetUp()
1840 PetscCall(KSPGetOperators(sub_schurs->change[i], &change_sub, NULL)); in PCBDDCSubSchursSetUp()
1842 … if (!sub_schurs->change_with_qr) { /* currently there's no support for PtAP with P SeqAIJ */ in PCBDDCSubSchursSetUp()
1853 PetscCall(MatZeroRowsColumnsIS(SEj, sub_schurs->change_primal_sub[i], val, NULL, NULL)); in PCBDDCSubSchursSetUp()
1861 PetscCall(MatSeqAIJRestoreArrayWrite(sub_schurs->sum_S_Ej_tilda_all, &SEjinv_arr)); in PCBDDCSubSchursSetUp()
1876 if (schur_has_vertices && factor_workaround && !sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1896 if (sub_schurs->is_dir) { in PCBDDCSubSchursSetUp()
1897 PetscCall(ISGetLocalSize(sub_schurs->is_dir, &nd)); in PCBDDCSubSchursSetUp()
1906 …} else if (factor_workaround && !sub_schurs->gdsw) { /* we need to eliminate any unneeded coupling… in PCBDDCSubSchursSetUp()
1910 if (sub_schurs->is_dir) { /* dirichlet dofs could have different scalings */ in PCBDDCSubSchursSetUp()
1911 PetscCall(ISGetLocalSize(sub_schurs->is_dir, &nd)); in PCBDDCSubSchursSetUp()
1944 PetscCall(MatAssemblyBegin(sub_schurs->S_Ej_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1945 PetscCall(MatAssemblyEnd(sub_schurs->S_Ej_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1947 PetscCall(MatAssemblyBegin(sub_schurs->sum_S_Ej_tilda_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1948 PetscCall(MatAssemblyEnd(sub_schurs->sum_S_Ej_tilda_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1950 PetscCall(MatAssemblyBegin(sub_schurs->sum_S_Ej_inv_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1951 PetscCall(MatAssemblyEnd(sub_schurs->sum_S_Ej_inv_all, MAT_FINAL_ASSEMBLY)); in PCBDDCSubSchursSetUp()
1956 …if (!sub_schurs->sum_S_Ej_all) PetscCall(MatDuplicate(sub_schurs->S_Ej_all, MAT_DO_NOT_COPY_VALUES… in PCBDDCSubSchursSetUp()
1958 PetscCall(MatSeqAIJGetArray(sub_schurs->S_Ej_all, &stasharray)); in PCBDDCSubSchursSetUp()
1962 PetscCall(MatSeqAIJRestoreArray(sub_schurs->S_Ej_all, &stasharray)); in PCBDDCSubSchursSetUp()
1964 PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_all, &stasharray)); in PCBDDCSubSchursSetUp()
1968 PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_all, &stasharray)); in PCBDDCSubSchursSetUp()
1974 PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_tilda_all, &stasharray)); in PCBDDCSubSchursSetUp()
1980 PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_tilda_all, &stasharray)); in PCBDDCSubSchursSetUp()
1984 PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_inv_all, &stasharray)); in PCBDDCSubSchursSetUp()
1990 PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_inv_all, &stasharray)); in PCBDDCSubSchursSetUp()
1992 } else if (!sub_schurs->gdsw) { in PCBDDCSubSchursSetUp()
1996 PetscCall(MatSeqAIJGetArray(sub_schurs->sum_S_Ej_tilda_all, &array)); in PCBDDCSubSchursSetUp()
1998 for (i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursSetUp()
1999 PetscCall(ISGetLocalSize(sub_schurs->is_subs[i], &subset_size)); in PCBDDCSubSchursSetUp()
2022 PetscCall(MatSeqAIJRestoreArray(sub_schurs->sum_S_Ej_tilda_all, &array)); in PCBDDCSubSchursSetUp()
2023 PetscCall(PetscObjectReference((PetscObject)sub_schurs->sum_S_Ej_all)); in PCBDDCSubSchursSetUp()
2024 PetscCall(MatDestroy(&sub_schurs->sum_S_Ej_inv_all)); in PCBDDCSubSchursSetUp()
2025 sub_schurs->sum_S_Ej_inv_all = sub_schurs->sum_S_Ej_all; in PCBDDCSubSchursSetUp()
2033 if (sub_schurs->S_Ej_all) { in PCBDDCSubSchursSetUp()
2034 PetscCall(PetscObjectSetName((PetscObject)sub_schurs->S_Ej_all, "SE")); in PCBDDCSubSchursSetUp()
2035 PetscCall(MatView(sub_schurs->S_Ej_all, matl_dbg_viewer)); in PCBDDCSubSchursSetUp()
2037 if (sub_schurs->sum_S_Ej_all) { in PCBDDCSubSchursSetUp()
2038 PetscCall(PetscObjectSetName((PetscObject)sub_schurs->sum_S_Ej_all, "SSE")); in PCBDDCSubSchursSetUp()
2039 PetscCall(MatView(sub_schurs->sum_S_Ej_all, matl_dbg_viewer)); in PCBDDCSubSchursSetUp()
2041 if (sub_schurs->sum_S_Ej_inv_all) { in PCBDDCSubSchursSetUp()
2042 PetscCall(PetscObjectSetName((PetscObject)sub_schurs->sum_S_Ej_inv_all, "SSEm")); in PCBDDCSubSchursSetUp()
2043 PetscCall(MatView(sub_schurs->sum_S_Ej_inv_all, matl_dbg_viewer)); in PCBDDCSubSchursSetUp()
2045 if (sub_schurs->sum_S_Ej_tilda_all) { in PCBDDCSubSchursSetUp()
2046 PetscCall(PetscObjectSetName((PetscObject)sub_schurs->sum_S_Ej_tilda_all, "SSEt")); in PCBDDCSubSchursSetUp()
2047 PetscCall(MatView(sub_schurs->sum_S_Ej_tilda_all, matl_dbg_viewer)); in PCBDDCSubSchursSetUp()
2052 …if (sub_schurs->mat_factor_type == MAT_FACTOR_NONE) sub_schurs->mat_factor_type = sub_schurs->is_h… in PCBDDCSubSchursSetUp()
2056 if (sub_schurs->debug) PetscCallMPI(MPI_Barrier(comm_n)); in PCBDDCSubSchursSetUp()
2064 PetscErrorCode PCBDDCSubSchursInit(PCBDDCSubSchurs sub_schurs, const char *prefix, IS is_I, IS is_B… in PCBDDCSubSchursInit() argument
2077 PetscCall(PCBDDCSubSchursReset(sub_schurs)); in PCBDDCSubSchursInit()
2079 sub_schurs->gdsw = gdsw; in PCBDDCSubSchursInit()
2080 sub_schurs->graph = graph; in PCBDDCSubSchursInit()
2085 PetscCall(PetscBTCreate(n_all_cc, &sub_schurs->is_edge)); in PCBDDCSubSchursInit()
2108 PetscCall(PetscBTSet(sub_schurs->is_edge, n_all_cc)); in PCBDDCSubSchursInit()
2112 sub_schurs->is_vertices = vertices; in PCBDDCSubSchursInit()
2114 sub_schurs->is_dir = NULL; in PCBDDCSubSchursInit()
2115 PetscCall(PCBDDCGraphGetDirichletDofsB(graph, &sub_schurs->is_dir)); in PCBDDCSubSchursInit()
2118 PetscCall(PetscStrallocpy(prefix, &sub_schurs->prefix)); in PCBDDCSubSchursInit()
2120 …PetscCall(PetscStrncpy(sub_schurs->mat_solver_type, MATSOLVERMUMPS, sizeof(sub_schurs->mat_solver_… in PCBDDCSubSchursInit()
2122 …PetscCall(PetscStrncpy(sub_schurs->mat_solver_type, MATSOLVERMKL_PARDISO, sizeof(sub_schurs->mat_s… in PCBDDCSubSchursInit()
2124 …PetscCall(PetscStrncpy(sub_schurs->mat_solver_type, MATSOLVERPETSC, sizeof(sub_schurs->mat_solver_… in PCBDDCSubSchursInit()
2126 sub_schurs->mat_factor_type = MAT_FACTOR_NONE; in PCBDDCSubSchursInit()
2127sub_schurs->is_hermitian = PetscDefined(USE_COMPLEX) ? PETSC_FALSE : PETSC_TRUE; /* Hermitian C… in PCBDDCSubSchursInit()
2128 sub_schurs->is_posdef = PETSC_TRUE; in PCBDDCSubSchursInit()
2129 sub_schurs->is_symmetric = PETSC_TRUE; in PCBDDCSubSchursInit()
2130 sub_schurs->debug = PETSC_FALSE; in PCBDDCSubSchursInit()
2131 sub_schurs->restrict_comm = PETSC_FALSE; in PCBDDCSubSchursInit()
2132 …PetscOptionsBegin(PetscObjectComm((PetscObject)graph->l2gmap), sub_schurs->prefix, "BDDC sub_schur… in PCBDDCSubSchursInit()
2133 …"Specific direct solver to use", NULL, sub_schurs->mat_solver_type, sub_schurs->mat_solver_type, s… in PCBDDCSubSchursInit()
2134 …atic selection", NULL, MatFactorTypes, (PetscEnum)sub_schurs->mat_factor_type, (PetscEnum *)&sub_s… in PCBDDCSubSchursInit()
2135 …sBool("-sub_schurs_symmetric", "Symmetric problem", NULL, sub_schurs->is_symmetric, &sub_schurs->i… in PCBDDCSubSchursInit()
2136 …sBool("-sub_schurs_hermitian", "Hermitian problem", NULL, sub_schurs->is_hermitian, &sub_schurs->i… in PCBDDCSubSchursInit()
2137 …l("-sub_schurs_posdef", "Positive definite problem", NULL, sub_schurs->is_posdef, &sub_schurs->is_… in PCBDDCSubSchursInit()
2138 … "Restrict communicator on active processes only", NULL, sub_schurs->restrict_comm, &sub_schurs->r… in PCBDDCSubSchursInit()
2139 …(PetscOptionsBool("-sub_schurs_debug", "Debug output", NULL, sub_schurs->debug, &sub_schurs->debug… in PCBDDCSubSchursInit()
2141 PetscCall(PetscStrcmp(sub_schurs->mat_solver_type, MATSOLVERMUMPS, &ismumps)); in PCBDDCSubSchursInit()
2142 PetscCall(PetscStrcmp(sub_schurs->mat_solver_type, MATSOLVERMKL_PARDISO, &ispardiso)); in PCBDDCSubSchursInit()
2143 sub_schurs->schur_explicit = (PetscBool)(ispardiso || ismumps); in PCBDDCSubSchursInit()
2147 sub_schurs->is_symmetric = (PetscBool)(sub_schurs->is_symmetric && sub_schurs->is_hermitian); in PCBDDCSubSchursInit()
2148 sub_schurs->is_hermitian = sub_schurs->is_symmetric; in PCBDDCSubSchursInit()
2152 sub_schurs->is_I = is_I; in PCBDDCSubSchursInit()
2154 sub_schurs->is_B = is_B; in PCBDDCSubSchursInit()
2156 sub_schurs->l2gmap = graph->l2gmap; in PCBDDCSubSchursInit()
2158 sub_schurs->BtoNmap = BtoNmap; in PCBDDCSubSchursInit()
2159 sub_schurs->n_subs = n_all_cc; in PCBDDCSubSchursInit()
2160 sub_schurs->is_subs = all_cc; in PCBDDCSubSchursInit()
2161 sub_schurs->S_Ej_all = NULL; in PCBDDCSubSchursInit()
2162 sub_schurs->sum_S_Ej_all = NULL; in PCBDDCSubSchursInit()
2163 sub_schurs->sum_S_Ej_inv_all = NULL; in PCBDDCSubSchursInit()
2164 sub_schurs->sum_S_Ej_tilda_all = NULL; in PCBDDCSubSchursInit()
2165 sub_schurs->is_Ej_all = NULL; in PCBDDCSubSchursInit()
2169 PetscErrorCode PCBDDCSubSchursCreate(PCBDDCSubSchurs *sub_schurs) in PCBDDCSubSchursCreate() argument
2176 *sub_schurs = schurs_ctx; in PCBDDCSubSchursCreate()
2180 PetscErrorCode PCBDDCSubSchursReset(PCBDDCSubSchurs sub_schurs) in PCBDDCSubSchursReset() argument
2183 if (!sub_schurs) PetscFunctionReturn(PETSC_SUCCESS); in PCBDDCSubSchursReset()
2184 sub_schurs->graph = NULL; in PCBDDCSubSchursReset()
2185 PetscCall(PetscFree(sub_schurs->prefix)); in PCBDDCSubSchursReset()
2186 PetscCall(MatDestroy(&sub_schurs->A)); in PCBDDCSubSchursReset()
2187 PetscCall(MatDestroy(&sub_schurs->S)); in PCBDDCSubSchursReset()
2188 PetscCall(ISDestroy(&sub_schurs->is_I)); in PCBDDCSubSchursReset()
2189 PetscCall(ISDestroy(&sub_schurs->is_B)); in PCBDDCSubSchursReset()
2190 PetscCall(ISLocalToGlobalMappingDestroy(&sub_schurs->l2gmap)); in PCBDDCSubSchursReset()
2191 PetscCall(ISLocalToGlobalMappingDestroy(&sub_schurs->BtoNmap)); in PCBDDCSubSchursReset()
2192 PetscCall(MatDestroy(&sub_schurs->S_Ej_all)); in PCBDDCSubSchursReset()
2193 PetscCall(MatDestroy(&sub_schurs->sum_S_Ej_all)); in PCBDDCSubSchursReset()
2194 PetscCall(MatDestroy(&sub_schurs->sum_S_Ej_inv_all)); in PCBDDCSubSchursReset()
2195 PetscCall(MatDestroy(&sub_schurs->sum_S_Ej_tilda_all)); in PCBDDCSubSchursReset()
2196 PetscCall(ISDestroy(&sub_schurs->is_Ej_all)); in PCBDDCSubSchursReset()
2197 PetscCall(ISDestroy(&sub_schurs->is_vertices)); in PCBDDCSubSchursReset()
2198 PetscCall(ISDestroy(&sub_schurs->is_dir)); in PCBDDCSubSchursReset()
2199 PetscCall(PetscBTDestroy(&sub_schurs->is_edge)); in PCBDDCSubSchursReset()
2200 for (PetscInt i = 0; i < sub_schurs->n_subs; i++) PetscCall(ISDestroy(&sub_schurs->is_subs[i])); in PCBDDCSubSchursReset()
2201 if (sub_schurs->n_subs) PetscCall(PetscFree(sub_schurs->is_subs)); in PCBDDCSubSchursReset()
2202 if (sub_schurs->reuse_solver) PetscCall(PCBDDCReuseSolversReset(sub_schurs->reuse_solver)); in PCBDDCSubSchursReset()
2203 PetscCall(PetscFree(sub_schurs->reuse_solver)); in PCBDDCSubSchursReset()
2204 if (sub_schurs->change) { in PCBDDCSubSchursReset()
2205 for (PetscInt i = 0; i < sub_schurs->n_subs; i++) { in PCBDDCSubSchursReset()
2206 PetscCall(KSPDestroy(&sub_schurs->change[i])); in PCBDDCSubSchursReset()
2207 PetscCall(ISDestroy(&sub_schurs->change_primal_sub[i])); in PCBDDCSubSchursReset()
2210 PetscCall(PetscFree(sub_schurs->change)); in PCBDDCSubSchursReset()
2211 PetscCall(PetscFree(sub_schurs->change_primal_sub)); in PCBDDCSubSchursReset()
2212 sub_schurs->n_subs = 0; in PCBDDCSubSchursReset()
2216 PetscErrorCode PCBDDCSubSchursDestroy(PCBDDCSubSchurs *sub_schurs) in PCBDDCSubSchursDestroy() argument
2219 PetscCall(PCBDDCSubSchursReset(*sub_schurs)); in PCBDDCSubSchursDestroy()
2220 PetscCall(PetscFree(*sub_schurs)); in PCBDDCSubSchursDestroy()