File: | ksp/pc/impls/bddc/bddc.c |
Warning: | line 2849, column 18 2nd function call argument is an uninitialized value |
[?] Use j/k keys for keyboard navigation
1 | /* TODOLIST | |||
2 | ||||
3 | Solvers | |||
4 | - Add support for cholesky for coarse solver (similar to local solvers) | |||
5 | - Propagate ksp prefixes for solvers to mat objects? | |||
6 | ||||
7 | User interface | |||
8 | - ** DM attached to pc? | |||
9 | ||||
10 | Debugging output | |||
11 | - * Better management of verbosity levels of debugging output | |||
12 | ||||
13 | Extra | |||
14 | - *** Is it possible to work with PCBDDCGraph on boundary indices only (less memory consumed)? | |||
15 | - BDDC with MG framework? | |||
16 | ||||
17 | MATIS related operations contained in BDDC code | |||
18 | - Provide general case for subassembling | |||
19 | ||||
20 | */ | |||
21 | ||||
22 | #include <../src/ksp/pc/impls/bddc/bddc.h> /*I "petscpc.h" I*/ /* includes for fortran wrappers */ | |||
23 | #include <../src/ksp/pc/impls/bddc/bddcprivate.h> | |||
24 | #include <petscblaslapack.h> | |||
25 | ||||
26 | static PetscBool PCBDDCPackageInitialized = PETSC_FALSE; | |||
27 | ||||
28 | static PetscBool cited = PETSC_FALSE; | |||
29 | static const char citation[] = | |||
30 | "@article{ZampiniPCBDDC,\n" | |||
31 | "author = {Stefano Zampini},\n" | |||
32 | "title = {{PCBDDC}: A Class of Robust Dual-Primal Methods in {PETS}c},\n" | |||
33 | "journal = {SIAM Journal on Scientific Computing},\n" | |||
34 | "volume = {38},\n" | |||
35 | "number = {5},\n" | |||
36 | "pages = {S282-S306},\n" | |||
37 | "year = {2016},\n" | |||
38 | "doi = {10.1137/15M1025785},\n" | |||
39 | "URL = {http://dx.doi.org/10.1137/15M1025785},\n" | |||
40 | "eprint = {http://dx.doi.org/10.1137/15M1025785}\n" | |||
41 | "}\n"; | |||
42 | ||||
43 | PetscLogEvent PC_BDDC_Topology[PETSC_PCBDDC_MAXLEVELS8]; | |||
44 | PetscLogEvent PC_BDDC_LocalSolvers[PETSC_PCBDDC_MAXLEVELS8]; | |||
45 | PetscLogEvent PC_BDDC_LocalWork[PETSC_PCBDDC_MAXLEVELS8]; | |||
46 | PetscLogEvent PC_BDDC_CorrectionSetUp[PETSC_PCBDDC_MAXLEVELS8]; | |||
47 | PetscLogEvent PC_BDDC_CoarseSetUp[PETSC_PCBDDC_MAXLEVELS8]; | |||
48 | PetscLogEvent PC_BDDC_CoarseSolver[PETSC_PCBDDC_MAXLEVELS8]; | |||
49 | PetscLogEvent PC_BDDC_AdaptiveSetUp[PETSC_PCBDDC_MAXLEVELS8]; | |||
50 | PetscLogEvent PC_BDDC_Scaling[PETSC_PCBDDC_MAXLEVELS8]; | |||
51 | PetscLogEvent PC_BDDC_Schurs[PETSC_PCBDDC_MAXLEVELS8]; | |||
52 | ||||
53 | PetscErrorCode PCApply_BDDC(PC,Vec,Vec); | |||
54 | ||||
55 | PetscErrorCode PCSetFromOptions_BDDC(PetscOptionItems *PetscOptionsObject,PC pc) | |||
56 | { | |||
57 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
58 | PetscInt nt,i; | |||
59 | PetscErrorCode ierr; | |||
60 | ||||
61 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 61; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
62 | ierr = PetscOptionsHead(PetscOptionsObject,"BDDC options");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),62,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
63 | /* Verbose debugging */ | |||
64 | ierr = PetscOptionsInt("-pc_bddc_check_level","Verbose output for PCBDDC (intended for debug)","none",pcbddc->dbg_flag,&pcbddc->dbg_flag,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_check_level" ,"Verbose output for PCBDDC (intended for debug)","none",pcbddc ->dbg_flag,&pcbddc->dbg_flag,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),64,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
65 | /* Approximate solvers */ | |||
66 | ierr = PetscOptionsBool("-pc_bddc_dirichlet_approximate","Inform PCBDDC that we are using approximate Dirichlet solvers","none",pcbddc->NullSpace_corr[0],&pcbddc->NullSpace_corr[0],NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_dirichlet_approximate" ,"Inform PCBDDC that we are using approximate Dirichlet solvers" ,"none",pcbddc->NullSpace_corr[0],&pcbddc->NullSpace_corr [0],((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),66,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
67 | ierr = PetscOptionsBool("-pc_bddc_dirichlet_approximate_scale","Inform PCBDDC that we need to scale the Dirichlet solve","none",pcbddc->NullSpace_corr[1],&pcbddc->NullSpace_corr[1],NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_dirichlet_approximate_scale" ,"Inform PCBDDC that we need to scale the Dirichlet solve","none" ,pcbddc->NullSpace_corr[1],&pcbddc->NullSpace_corr[ 1],((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),67,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
68 | ierr = PetscOptionsBool("-pc_bddc_neumann_approximate","Inform PCBDDC that we are using approximate Neumann solvers","none",pcbddc->NullSpace_corr[2],&pcbddc->NullSpace_corr[2],NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_neumann_approximate" ,"Inform PCBDDC that we are using approximate Neumann solvers" ,"none",pcbddc->NullSpace_corr[2],&pcbddc->NullSpace_corr [2],((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),68,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
69 | ierr = PetscOptionsBool("-pc_bddc_neumann_approximate_scale","Inform PCBDDC that we need to scale the Neumann solve","none",pcbddc->NullSpace_corr[3],&pcbddc->NullSpace_corr[3],NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_neumann_approximate_scale" ,"Inform PCBDDC that we need to scale the Neumann solve","none" ,pcbddc->NullSpace_corr[3],&pcbddc->NullSpace_corr[ 3],((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),69,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
70 | /* Primal space customization */ | |||
71 | ierr = PetscOptionsBool("-pc_bddc_use_local_mat_graph","Use or not adjacency graph of local mat for interface analysis","none",pcbddc->use_local_adj,&pcbddc->use_local_adj,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_local_mat_graph" ,"Use or not adjacency graph of local mat for interface analysis" ,"none",pcbddc->use_local_adj,&pcbddc->use_local_adj ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),71,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
72 | ierr = PetscOptionsInt("-pc_bddc_graph_maxcount","Maximum number of shared subdomains for a connected component","none",pcbddc->graphmaxcount,&pcbddc->graphmaxcount,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_graph_maxcount" ,"Maximum number of shared subdomains for a connected component" ,"none",pcbddc->graphmaxcount,&pcbddc->graphmaxcount ,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),72,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
73 | ierr = PetscOptionsBool("-pc_bddc_corner_selection","Activates face-based corner selection","none",pcbddc->corner_selection,&pcbddc->corner_selection,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_corner_selection" ,"Activates face-based corner selection","none",pcbddc->corner_selection ,&pcbddc->corner_selection,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),73,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
74 | ierr = PetscOptionsBool("-pc_bddc_use_vertices","Use or not corner dofs in coarse space","none",pcbddc->use_vertices,&pcbddc->use_vertices,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_vertices" ,"Use or not corner dofs in coarse space","none",pcbddc->use_vertices ,&pcbddc->use_vertices,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),74,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
75 | ierr = PetscOptionsBool("-pc_bddc_use_edges","Use or not edge constraints in coarse space","none",pcbddc->use_edges,&pcbddc->use_edges,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_edges" ,"Use or not edge constraints in coarse space","none",pcbddc-> use_edges,&pcbddc->use_edges,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),75,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
76 | ierr = PetscOptionsBool("-pc_bddc_use_faces","Use or not face constraints in coarse space","none",pcbddc->use_faces,&pcbddc->use_faces,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_faces" ,"Use or not face constraints in coarse space","none",pcbddc-> use_faces,&pcbddc->use_faces,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),76,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
77 | ierr = PetscOptionsInt("-pc_bddc_vertex_size","Connected components smaller or equal to vertex size will be considered as primal vertices","none",pcbddc->vertex_size,&pcbddc->vertex_size,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_vertex_size" ,"Connected components smaller or equal to vertex size will be considered as primal vertices" ,"none",pcbddc->vertex_size,&pcbddc->vertex_size,(( void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),77,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
78 | ierr = PetscOptionsBool("-pc_bddc_use_true_nnsp","Use near null space attached to the matrix without modifications","none",pcbddc->use_nnsp_true,&pcbddc->use_nnsp_true,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_true_nnsp" ,"Use near null space attached to the matrix without modifications" ,"none",pcbddc->use_nnsp_true,&pcbddc->use_nnsp_true ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),78,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
79 | ierr = PetscOptionsBool("-pc_bddc_use_qr_single","Use QR factorization for single constraints on cc (QR is always used when multiple constraints are present)","none",pcbddc->use_qr_single,&pcbddc->use_qr_single,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_qr_single" ,"Use QR factorization for single constraints on cc (QR is always used when multiple constraints are present)" ,"none",pcbddc->use_qr_single,&pcbddc->use_qr_single ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),79,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
80 | /* Change of basis */ | |||
81 | ierr = PetscOptionsBool("-pc_bddc_use_change_of_basis","Use or not internal change of basis on local edge nodes","none",pcbddc->use_change_of_basis,&pcbddc->use_change_of_basis,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_change_of_basis" ,"Use or not internal change of basis on local edge nodes","none" ,pcbddc->use_change_of_basis,&pcbddc->use_change_of_basis ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),81,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
82 | ierr = PetscOptionsBool("-pc_bddc_use_change_on_faces","Use or not internal change of basis on local face nodes","none",pcbddc->use_change_on_faces,&pcbddc->use_change_on_faces,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_change_on_faces" ,"Use or not internal change of basis on local face nodes","none" ,pcbddc->use_change_on_faces,&pcbddc->use_change_on_faces ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),82,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
83 | if (!pcbddc->use_change_of_basis) { | |||
84 | pcbddc->use_change_on_faces = PETSC_FALSE; | |||
85 | } | |||
86 | /* Switch between M_2 (default) and M_3 preconditioners (as defined by C. Dohrmann in the ref. article) */ | |||
87 | ierr = PetscOptionsBool("-pc_bddc_switch_static","Switch on static condensation ops around the interface preconditioner","none",pcbddc->switch_static,&pcbddc->switch_static,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_switch_static" ,"Switch on static condensation ops around the interface preconditioner" ,"none",pcbddc->switch_static,&pcbddc->switch_static ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),87,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
88 | ierr = PetscOptionsInt("-pc_bddc_coarse_eqs_per_proc","Target number of equations per process for coarse problem redistribution (significant only at the coarsest level)","none",pcbddc->coarse_eqs_per_proc,&pcbddc->coarse_eqs_per_proc,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_coarse_eqs_per_proc" ,"Target number of equations per process for coarse problem redistribution (significant only at the coarsest level)" ,"none",pcbddc->coarse_eqs_per_proc,&pcbddc->coarse_eqs_per_proc ,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),88,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
89 | i = pcbddc->coarsening_ratio; | |||
90 | ierr = PetscOptionsInt("-pc_bddc_coarsening_ratio","Set coarsening ratio used in multilevel coarsening","PCBDDCSetCoarseningRatio",i,&i,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_coarsening_ratio" ,"Set coarsening ratio used in multilevel coarsening","PCBDDCSetCoarseningRatio" ,i,&i,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),90,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
91 | ierr = PCBDDCSetCoarseningRatio(pc,i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),91,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
92 | i = pcbddc->max_levels; | |||
93 | ierr = PetscOptionsInt("-pc_bddc_levels","Set maximum number of levels for multilevel","PCBDDCSetLevels",i,&i,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_levels", "Set maximum number of levels for multilevel","PCBDDCSetLevels" ,i,&i,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),93,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
94 | ierr = PCBDDCSetLevels(pc,i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),94,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
95 | ierr = PetscOptionsInt("-pc_bddc_coarse_eqs_limit","Set maximum number of equations on coarsest grid to aim for","none",pcbddc->coarse_eqs_limit,&pcbddc->coarse_eqs_limit,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_coarse_eqs_limit" ,"Set maximum number of equations on coarsest grid to aim for" ,"none",pcbddc->coarse_eqs_limit,&pcbddc->coarse_eqs_limit ,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),95,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
96 | ierr = PetscOptionsBool("-pc_bddc_use_coarse_estimates","Use estimated eigenvalues for coarse problem","none",pcbddc->use_coarse_estimates,&pcbddc->use_coarse_estimates,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_coarse_estimates" ,"Use estimated eigenvalues for coarse problem","none",pcbddc ->use_coarse_estimates,&pcbddc->use_coarse_estimates ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),96,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
97 | ierr = PetscOptionsBool("-pc_bddc_use_deluxe_scaling","Use deluxe scaling for BDDC","none",pcbddc->use_deluxe_scaling,&pcbddc->use_deluxe_scaling,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_use_deluxe_scaling" ,"Use deluxe scaling for BDDC","none",pcbddc->use_deluxe_scaling ,&pcbddc->use_deluxe_scaling,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),97,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
98 | ierr = PetscOptionsBool("-pc_bddc_schur_rebuild","Whether or not the interface graph for Schur principal minors has to be rebuilt (i.e. define the interface without any adjacency)","none",pcbddc->sub_schurs_rebuild,&pcbddc->sub_schurs_rebuild,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_schur_rebuild" ,"Whether or not the interface graph for Schur principal minors has to be rebuilt (i.e. define the interface without any adjacency)" ,"none",pcbddc->sub_schurs_rebuild,&pcbddc->sub_schurs_rebuild ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),98,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
99 | ierr = PetscOptionsInt("-pc_bddc_schur_layers","Number of dofs' layers for the computation of principal minors (i.e. -1 uses all dofs)","none",pcbddc->sub_schurs_layers,&pcbddc->sub_schurs_layers,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_schur_layers" ,"Number of dofs' layers for the computation of principal minors (i.e. -1 uses all dofs)" ,"none",pcbddc->sub_schurs_layers,&pcbddc->sub_schurs_layers ,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),99,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
100 | ierr = PetscOptionsBool("-pc_bddc_schur_use_useradj","Whether or not the CSR graph specified by the user should be used for computing successive layers (default is to use adj of local mat)","none",pcbddc->sub_schurs_use_useradj,&pcbddc->sub_schurs_use_useradj,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_schur_use_useradj" ,"Whether or not the CSR graph specified by the user should be used for computing successive layers (default is to use adj of local mat)" ,"none",pcbddc->sub_schurs_use_useradj,&pcbddc->sub_schurs_use_useradj ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),100,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
101 | ierr = PetscOptionsBool("-pc_bddc_schur_exact","Whether or not to use the exact Schur complement instead of the reduced one (which excludes size 1 cc)","none",pcbddc->sub_schurs_exact_schur,&pcbddc->sub_schurs_exact_schur,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_schur_exact" ,"Whether or not to use the exact Schur complement instead of the reduced one (which excludes size 1 cc)" ,"none",pcbddc->sub_schurs_exact_schur,&pcbddc->sub_schurs_exact_schur ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),101,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
102 | ierr = PetscOptionsBool("-pc_bddc_deluxe_zerorows","Zero rows and columns of deluxe operators associated with primal dofs","none",pcbddc->deluxe_zerorows,&pcbddc->deluxe_zerorows,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_deluxe_zerorows" ,"Zero rows and columns of deluxe operators associated with primal dofs" ,"none",pcbddc->deluxe_zerorows,&pcbddc->deluxe_zerorows ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),102,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
103 | ierr = PetscOptionsBool("-pc_bddc_deluxe_singlemat","Collapse deluxe operators","none",pcbddc->deluxe_singlemat,&pcbddc->deluxe_singlemat,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_deluxe_singlemat" ,"Collapse deluxe operators","none",pcbddc->deluxe_singlemat ,&pcbddc->deluxe_singlemat,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),103,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
104 | ierr = PetscOptionsBool("-pc_bddc_adaptive_userdefined","Use user-defined constraints (should be attached via MatSetNearNullSpace to pmat) in addition to those adaptively generated","none",pcbddc->adaptive_userdefined,&pcbddc->adaptive_userdefined,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_adaptive_userdefined" ,"Use user-defined constraints (should be attached via MatSetNearNullSpace to pmat) in addition to those adaptively generated" ,"none",pcbddc->adaptive_userdefined,&pcbddc->adaptive_userdefined ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),104,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
105 | nt = 2; | |||
106 | ierr = PetscOptionsRealArray("-pc_bddc_adaptive_threshold","Thresholds to be used for adaptive selection of constraints","none",pcbddc->adaptive_threshold,&nt,NULL)PetscOptionsRealArray_Private(PetscOptionsObject,"-pc_bddc_adaptive_threshold" ,"Thresholds to be used for adaptive selection of constraints" ,"none",pcbddc->adaptive_threshold,&nt,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),106,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
107 | if (nt == 1) pcbddc->adaptive_threshold[1] = pcbddc->adaptive_threshold[0]; | |||
108 | ierr = PetscOptionsInt("-pc_bddc_adaptive_nmin","Minimum number of constraints per connected components","none",pcbddc->adaptive_nmin,&pcbddc->adaptive_nmin,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_adaptive_nmin" ,"Minimum number of constraints per connected components","none" ,pcbddc->adaptive_nmin,&pcbddc->adaptive_nmin,((void *)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),108,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
109 | ierr = PetscOptionsInt("-pc_bddc_adaptive_nmax","Maximum number of constraints per connected components","none",pcbddc->adaptive_nmax,&pcbddc->adaptive_nmax,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_adaptive_nmax" ,"Maximum number of constraints per connected components","none" ,pcbddc->adaptive_nmax,&pcbddc->adaptive_nmax,((void *)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),109,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
110 | ierr = PetscOptionsBool("-pc_bddc_symmetric","Symmetric computation of primal basis functions","none",pcbddc->symmetric_primal,&pcbddc->symmetric_primal,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_symmetric" ,"Symmetric computation of primal basis functions","none",pcbddc ->symmetric_primal,&pcbddc->symmetric_primal,((void *)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),110,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
111 | ierr = PetscOptionsInt("-pc_bddc_coarse_adj","Number of processors where to map the coarse adjacency list","none",pcbddc->coarse_adj_red,&pcbddc->coarse_adj_red,NULL)PetscOptionsInt_Private(PetscOptionsObject,"-pc_bddc_coarse_adj" ,"Number of processors where to map the coarse adjacency list" ,"none",pcbddc->coarse_adj_red,&pcbddc->coarse_adj_red ,((void*)0),(-2147483647 - 1),2147483647);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),111,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
112 | ierr = PetscOptionsBool("-pc_bddc_benign_trick","Apply the benign subspace trick to saddle point problems with discontinuous pressures","none",pcbddc->benign_saddle_point,&pcbddc->benign_saddle_point,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_benign_trick" ,"Apply the benign subspace trick to saddle point problems with discontinuous pressures" ,"none",pcbddc->benign_saddle_point,&pcbddc->benign_saddle_point ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),112,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
113 | ierr = PetscOptionsBool("-pc_bddc_benign_change","Compute the pressure change of basis explicitly","none",pcbddc->benign_change_explicit,&pcbddc->benign_change_explicit,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_benign_change" ,"Compute the pressure change of basis explicitly","none",pcbddc ->benign_change_explicit,&pcbddc->benign_change_explicit ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),113,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
114 | ierr = PetscOptionsBool("-pc_bddc_benign_compute_correction","Compute the benign correction during PreSolve","none",pcbddc->benign_compute_correction,&pcbddc->benign_compute_correction,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_benign_compute_correction" ,"Compute the benign correction during PreSolve","none",pcbddc ->benign_compute_correction,&pcbddc->benign_compute_correction ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),114,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
115 | ierr = PetscOptionsBool("-pc_bddc_nonetflux","Automatic computation of no-net-flux quadrature weights","none",pcbddc->compute_nonetflux,&pcbddc->compute_nonetflux,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_nonetflux" ,"Automatic computation of no-net-flux quadrature weights","none" ,pcbddc->compute_nonetflux,&pcbddc->compute_nonetflux ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),115,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
116 | ierr = PetscOptionsBool("-pc_bddc_detect_disconnected","Detects disconnected subdomains","none",pcbddc->detect_disconnected,&pcbddc->detect_disconnected,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_detect_disconnected" ,"Detects disconnected subdomains","none",pcbddc->detect_disconnected ,&pcbddc->detect_disconnected,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),116,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
117 | ierr = PetscOptionsBool("-pc_bddc_detect_disconnected_filter","Filters out small entries in the local matrix when detecting disconnected subdomains","none",pcbddc->detect_disconnected_filter,&pcbddc->detect_disconnected_filter,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_detect_disconnected_filter" ,"Filters out small entries in the local matrix when detecting disconnected subdomains" ,"none",pcbddc->detect_disconnected_filter,&pcbddc-> detect_disconnected_filter,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),117,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
118 | ierr = PetscOptionsBool("-pc_bddc_eliminate_dirichlet","Whether or not we want to eliminate dirichlet dofs during presolve","none",pcbddc->eliminate_dirdofs,&pcbddc->eliminate_dirdofs,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_bddc_eliminate_dirichlet" ,"Whether or not we want to eliminate dirichlet dofs during presolve" ,"none",pcbddc->eliminate_dirdofs,&pcbddc->eliminate_dirdofs ,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),118,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
119 | ierr = PetscOptionsTail()0; do {if (PetscOptionsObject->count != 1) do { do { ; if ( petscstack && petscstack->currentsize > 0) { petscstack ->currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0);} while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),119,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
120 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
121 | } | |||
122 | ||||
123 | static PetscErrorCode PCView_BDDC(PC pc,PetscViewer viewer) | |||
124 | { | |||
125 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
126 | PC_IS *pcis = (PC_IS*)pc->data; | |||
127 | PetscErrorCode ierr; | |||
128 | PetscBool isascii; | |||
129 | PetscSubcomm subcomm; | |||
130 | PetscViewer subviewer; | |||
131 | ||||
132 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 132; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
133 | ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII"ascii",&isascii);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),133,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
134 | /* ASCII viewer */ | |||
135 | if (isascii) { | |||
136 | PetscMPIInt color,rank,size; | |||
137 | PetscInt64 loc[7],gsum[6],gmax[6],gmin[6],totbenign; | |||
138 | PetscScalar interface_size; | |||
139 | PetscReal ratio1=0.,ratio2=0.; | |||
140 | Vec counter; | |||
141 | ||||
142 | if (!pc->setupcalled) { | |||
143 | ierr = PetscViewerASCIIPrintf(viewer," Partial information available: preconditioner has not been setup yet\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),143,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
144 | } | |||
145 | ierr = PetscViewerASCIIPrintf(viewer," Use verbose output: %D\n",pcbddc->dbg_flag);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),145,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
146 | ierr = PetscViewerASCIIPrintf(viewer," Use user-defined CSR: %d\n",!!pcbddc->mat_graph->nvtxs_csr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),146,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
147 | ierr = PetscViewerASCIIPrintf(viewer," Use local mat graph: %d\n",pcbddc->use_local_adj && !pcbddc->mat_graph->nvtxs_csr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),147,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
148 | if (pcbddc->mat_graph->twodim) { | |||
149 | ierr = PetscViewerASCIIPrintf(viewer," Connectivity graph topological dimension: 2\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),149,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
150 | } else { | |||
151 | ierr = PetscViewerASCIIPrintf(viewer," Connectivity graph topological dimension: 3\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),151,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
152 | } | |||
153 | if (pcbddc->graphmaxcount != PETSC_MAX_INT2147483647) { | |||
154 | ierr = PetscViewerASCIIPrintf(viewer," Graph max count: %D\n",pcbddc->graphmaxcount);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),154,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
155 | } | |||
156 | ierr = PetscViewerASCIIPrintf(viewer," Use vertices: %d (vertex size %D)\n",pcbddc->use_vertices,pcbddc->vertex_size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),156,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
157 | ierr = PetscViewerASCIIPrintf(viewer," Use edges: %d\n",pcbddc->use_edges);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),157,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
158 | ierr = PetscViewerASCIIPrintf(viewer," Use faces: %d\n",pcbddc->use_faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),158,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
159 | ierr = PetscViewerASCIIPrintf(viewer," Use true near null space: %d\n",pcbddc->use_nnsp_true);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),159,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
160 | ierr = PetscViewerASCIIPrintf(viewer," Use QR for single constraints on cc: %d\n",pcbddc->use_qr_single);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),160,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
161 | ierr = PetscViewerASCIIPrintf(viewer," Use change of basis on local edge nodes: %d\n",pcbddc->use_change_of_basis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),161,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
162 | ierr = PetscViewerASCIIPrintf(viewer," Use change of basis on local face nodes: %d\n",pcbddc->use_change_on_faces);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),162,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
163 | ierr = PetscViewerASCIIPrintf(viewer," User defined change of basis matrix: %d\n",!!pcbddc->user_ChangeOfBasisMatrix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),163,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
164 | ierr = PetscViewerASCIIPrintf(viewer," Has change of basis matrix: %d\n",!!pcbddc->ChangeOfBasisMatrix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),164,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
165 | ierr = PetscViewerASCIIPrintf(viewer," Eliminate dirichlet boundary dofs: %d\n",pcbddc->eliminate_dirdofs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),165,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
166 | ierr = PetscViewerASCIIPrintf(viewer," Switch on static condensation ops around the interface preconditioner: %d\n",pcbddc->switch_static);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),166,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
167 | ierr = PetscViewerASCIIPrintf(viewer," Use exact dirichlet trick: %d\n",pcbddc->use_exact_dirichlet_trick);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),167,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
168 | ierr = PetscViewerASCIIPrintf(viewer," Multilevel max levels: %D\n",pcbddc->max_levels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),168,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
169 | ierr = PetscViewerASCIIPrintf(viewer," Multilevel coarsening ratio: %D\n",pcbddc->coarsening_ratio);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),169,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
170 | ierr = PetscViewerASCIIPrintf(viewer," Use estimated eigs for coarse problem: %d\n",pcbddc->use_coarse_estimates);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),170,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
171 | ierr = PetscViewerASCIIPrintf(viewer," Use deluxe scaling: %d\n",pcbddc->use_deluxe_scaling);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),171,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
172 | ierr = PetscViewerASCIIPrintf(viewer," Use deluxe zerorows: %d\n",pcbddc->deluxe_zerorows);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),172,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
173 | ierr = PetscViewerASCIIPrintf(viewer," Use deluxe singlemat: %d\n",pcbddc->deluxe_singlemat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),173,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
174 | ierr = PetscViewerASCIIPrintf(viewer," Rebuild interface graph for Schur principal minors: %d\n",pcbddc->sub_schurs_rebuild);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),174,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
175 | ierr = PetscViewerASCIIPrintf(viewer," Number of dofs' layers for the computation of principal minors: %D\n",pcbddc->sub_schurs_layers);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),175,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
176 | ierr = PetscViewerASCIIPrintf(viewer," Use user CSR graph to compute successive layers: %d\n",pcbddc->sub_schurs_use_useradj);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),176,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
177 | if (pcbddc->adaptive_threshold[1] != pcbddc->adaptive_threshold[0]) { | |||
178 | ierr = PetscViewerASCIIPrintf(viewer," Adaptive constraint selection thresholds (active %d, userdefined %d): %g,%g\n",pcbddc->adaptive_selection,pcbddc->adaptive_userdefined,pcbddc->adaptive_threshold[0],pcbddc->adaptive_threshold[1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),178,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
179 | } else { | |||
180 | ierr = PetscViewerASCIIPrintf(viewer," Adaptive constraint selection threshold (active %d, userdefined %d): %g\n",pcbddc->adaptive_selection,pcbddc->adaptive_userdefined,pcbddc->adaptive_threshold[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),180,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
181 | } | |||
182 | ierr = PetscViewerASCIIPrintf(viewer," Min constraints / connected component: %D\n",pcbddc->adaptive_nmin);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),182,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
183 | ierr = PetscViewerASCIIPrintf(viewer," Max constraints / connected component: %D\n",pcbddc->adaptive_nmax);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),183,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
184 | ierr = PetscViewerASCIIPrintf(viewer," Invert exact Schur complement for adaptive selection: %d\n",pcbddc->sub_schurs_exact_schur);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),184,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
185 | ierr = PetscViewerASCIIPrintf(viewer," Symmetric computation of primal basis functions: %d\n",pcbddc->symmetric_primal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),185,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
186 | ierr = PetscViewerASCIIPrintf(viewer," Num. Procs. to map coarse adjacency list: %D\n",pcbddc->coarse_adj_red);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),186,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
187 | ierr = PetscViewerASCIIPrintf(viewer," Coarse eqs per proc (significant at the coarsest level): %D\n",pcbddc->coarse_eqs_per_proc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),187,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
188 | ierr = PetscViewerASCIIPrintf(viewer," Detect disconnected: %d (filter %d)\n",pcbddc->detect_disconnected,pcbddc->detect_disconnected_filter);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),188,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
189 | ierr = PetscViewerASCIIPrintf(viewer," Benign subspace trick: %d (change explicit %d)\n",pcbddc->benign_saddle_point,pcbddc->benign_change_explicit);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),189,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
190 | ierr = PetscViewerASCIIPrintf(viewer," Benign subspace trick is active: %d\n",pcbddc->benign_have_null);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),190,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
191 | ierr = PetscViewerASCIIPrintf(viewer," Algebraic computation of no-net-flux: %d\n",pcbddc->compute_nonetflux);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),191,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
192 | if (!pc->setupcalled) PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
193 | ||||
194 | /* compute interface size */ | |||
195 | ierr = VecSet(pcis->vec1_B,1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),195,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
196 | ierr = MatCreateVecs(pc->pmat,&counter,0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),196,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
197 | ierr = VecSet(counter,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),197,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
198 | ierr = VecScatterBegin(pcis->global_to_B,pcis->vec1_B,counter,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),198,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
199 | ierr = VecScatterEnd(pcis->global_to_B,pcis->vec1_B,counter,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),199,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
200 | ierr = VecSum(counter,&interface_size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),200,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
201 | ierr = VecDestroy(&counter);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),201,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
202 | ||||
203 | /* compute some statistics on the domain decomposition */ | |||
204 | gsum[0] = 1; | |||
205 | gsum[1] = gsum[2] = gsum[3] = gsum[4] = gsum[5] = 0; | |||
206 | loc[0] = !!pcis->n; | |||
207 | loc[1] = pcis->n - pcis->n_B; | |||
208 | loc[2] = pcis->n_B; | |||
209 | loc[3] = pcbddc->local_primal_size; | |||
210 | loc[4] = pcis->n; | |||
211 | loc[5] = pcbddc->n_local_subs > 0 ? pcbddc->n_local_subs : (pcis->n ? 1 : 0); | |||
212 | loc[6] = pcbddc->benign_n; | |||
213 | ierr = MPI_Reduce(loc,gsum,6,MPIU_INT64((MPI_Datatype)0x4c00083a),MPI_SUM(MPI_Op)(0x58000003),0,PetscObjectComm((PetscObject)pc));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),213,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
214 | if (!loc[0]) loc[1] = loc[2] = loc[3] = loc[4] = loc[5] = -1; | |||
215 | ierr = MPI_Reduce(loc,gmax,6,MPIU_INT64((MPI_Datatype)0x4c00083a),MPI_MAX(MPI_Op)(0x58000001),0,PetscObjectComm((PetscObject)pc));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),215,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
216 | if (!loc[0]) loc[1] = loc[2] = loc[3] = loc[4] = loc[5] = PETSC_MAX_INT2147483647; | |||
217 | ierr = MPI_Reduce(loc,gmin,6,MPIU_INT64((MPI_Datatype)0x4c00083a),MPI_MIN(MPI_Op)(0x58000002),0,PetscObjectComm((PetscObject)pc));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),217,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
218 | ierr = MPI_Reduce(&loc[6],&totbenign,1,MPIU_INT64((MPI_Datatype)0x4c00083a),MPI_SUM(MPI_Op)(0x58000003),0,PetscObjectComm((PetscObject)pc));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),218,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
219 | if (pcbddc->coarse_size) { | |||
220 | ratio1 = pc->pmat->rmap->N/(1.*pcbddc->coarse_size); | |||
221 | ratio2 = PetscRealPart(interface_size)(interface_size)/pcbddc->coarse_size; | |||
222 | } | |||
223 | ierr = PetscViewerASCIIPrintf(viewer,"********************************** STATISTICS AT LEVEL %d **********************************\n",pcbddc->current_level);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),223,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
224 | ierr = PetscViewerASCIIPrintf(viewer," Global dofs sizes: all %D interface %D coarse %D\n",pc->pmat->rmap->N,(PetscInt)PetscRealPart(interface_size)(interface_size),pcbddc->coarse_size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),224,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
225 | ierr = PetscViewerASCIIPrintf(viewer," Coarsening ratios: all/coarse %D interface/coarse %D\n",(PetscInt)ratio1,(PetscInt)ratio2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),225,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
226 | ierr = PetscViewerASCIIPrintf(viewer," Active processes : %D\n",(PetscInt)gsum[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),226,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
227 | ierr = PetscViewerASCIIPrintf(viewer," Total subdomains : %D\n",(PetscInt)gsum[5]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),227,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
228 | if (pcbddc->benign_have_null) { | |||
229 | ierr = PetscViewerASCIIPrintf(viewer," Benign subs : %D\n",(PetscInt)totbenign);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),229,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
230 | } | |||
231 | ierr = PetscViewerASCIIPrintf(viewer," Dofs type :\tMIN\tMAX\tMEAN\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),231,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
232 | ierr = PetscViewerASCIIPrintf(viewer," Interior dofs :\t%D\t%D\t%D\n",(PetscInt)gmin[1],(PetscInt)gmax[1],(PetscInt)(gsum[1]/gsum[0]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),232,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
233 | ierr = PetscViewerASCIIPrintf(viewer," Interface dofs :\t%D\t%D\t%D\n",(PetscInt)gmin[2],(PetscInt)gmax[2],(PetscInt)(gsum[2]/gsum[0]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),233,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
234 | ierr = PetscViewerASCIIPrintf(viewer," Primal dofs :\t%D\t%D\t%D\n",(PetscInt)gmin[3],(PetscInt)gmax[3],(PetscInt)(gsum[3]/gsum[0]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),234,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
235 | ierr = PetscViewerASCIIPrintf(viewer," Local dofs :\t%D\t%D\t%D\n",(PetscInt)gmin[4],(PetscInt)gmax[4],(PetscInt)(gsum[4]/gsum[0]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),235,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
236 | ierr = PetscViewerASCIIPrintf(viewer," Local subs :\t%D\t%D\n" ,(PetscInt)gmin[5],(PetscInt)gmax[5]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),236,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
237 | ierr = PetscViewerFlush(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),237,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
238 | ||||
239 | ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)pc),&rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),239,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
240 | ||||
241 | /* local solvers */ | |||
242 | ierr = PetscViewerGetSubViewer(viewer,PetscObjectComm((PetscObject)pcbddc->ksp_D),&subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),242,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
243 | if (!rank) { | |||
244 | ierr = PetscViewerASCIIPrintf(subviewer,"--- Interior solver (rank 0)\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),244,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
245 | ierr = PetscViewerASCIIPushTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),245,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
246 | ierr = KSPView(pcbddc->ksp_D,subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),246,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
247 | ierr = PetscViewerASCIIPopTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),247,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
248 | ierr = PetscViewerASCIIPrintf(subviewer,"--- Correction solver (rank 0)\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),248,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
249 | ierr = PetscViewerASCIIPushTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),249,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
250 | ierr = KSPView(pcbddc->ksp_R,subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),250,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
251 | ierr = PetscViewerASCIIPopTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
252 | ierr = PetscViewerFlush(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),252,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
253 | } | |||
254 | ierr = PetscViewerRestoreSubViewer(viewer,PetscObjectComm((PetscObject)pcbddc->ksp_D),&subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),254,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
255 | ierr = PetscViewerFlush(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),255,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
256 | ||||
257 | /* the coarse problem can be handled by a different communicator */ | |||
258 | if (pcbddc->coarse_ksp) color = 1; | |||
259 | else color = 0; | |||
260 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),260,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
261 | ierr = PetscSubcommCreate(PetscObjectComm((PetscObject)pc),&subcomm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),261,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
262 | ierr = PetscSubcommSetNumber(subcomm,PetscMin(size,2)(((size)<(2)) ? (size) : (2)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),262,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
263 | ierr = PetscSubcommSetTypeGeneral(subcomm,color,rank);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),263,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
264 | ierr = PetscViewerGetSubViewer(viewer,PetscSubcommChild(subcomm),&subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),264,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
265 | if (color == 1) { | |||
266 | ierr = PetscViewerASCIIPrintf(subviewer,"--- Coarse solver\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),266,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
267 | ierr = PetscViewerASCIIPushTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),267,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
268 | ierr = KSPView(pcbddc->coarse_ksp,subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),268,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
269 | ierr = PetscViewerASCIIPopTab(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),269,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
270 | ierr = PetscViewerFlush(subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),270,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
271 | } | |||
272 | ierr = PetscViewerRestoreSubViewer(viewer,PetscSubcommChild(subcomm),&subviewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),272,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
273 | ierr = PetscSubcommDestroy(&subcomm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),273,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
274 | ierr = PetscViewerFlush(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),274,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
275 | } | |||
276 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
277 | } | |||
278 | ||||
279 | static PetscErrorCode PCBDDCSetDiscreteGradient_BDDC(PC pc, Mat G, PetscInt order, PetscInt field, PetscBool global, PetscBool conforming) | |||
280 | { | |||
281 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
282 | PetscErrorCode ierr; | |||
283 | ||||
284 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 284; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
285 | ierr = PetscObjectReference((PetscObject)G);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),285,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
286 | ierr = MatDestroy(&pcbddc->discretegradient);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),286,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
287 | pcbddc->discretegradient = G; | |||
288 | pcbddc->nedorder = order > 0 ? order : -order; | |||
289 | pcbddc->nedfield = field; | |||
290 | pcbddc->nedglobal = global; | |||
291 | pcbddc->conforming = conforming; | |||
292 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
293 | } | |||
294 | ||||
295 | /*@ | |||
296 | PCBDDCSetDiscreteGradient - Sets the discrete gradient | |||
297 | ||||
298 | Collective on PC | |||
299 | ||||
300 | Input Parameters: | |||
301 | + pc - the preconditioning context | |||
302 | . G - the discrete gradient matrix (should be in AIJ format) | |||
303 | . order - the order of the Nedelec space (1 for the lowest order) | |||
304 | . field - the field id of the Nedelec dofs (not used if the fields have not been specified) | |||
305 | . global - the type of global ordering for the rows of G | |||
306 | - conforming - whether the mesh is conforming or not | |||
307 | ||||
308 | Level: advanced | |||
309 | ||||
310 | Notes: | |||
311 | The discrete gradient matrix G is used to analyze the subdomain edges, and it should not contain any zero entry. | |||
312 | For variable order spaces, the order should be set to zero. | |||
313 | If global is true, the rows of G should be given in global ordering for the whole dofs; | |||
314 | if false, the ordering should be global for the Nedelec field. | |||
315 | In the latter case, it should hold gid[i] < gid[j] iff geid[i] < geid[j], with gid the global orderding for all the dofs | |||
316 | and geid the one for the Nedelec field. | |||
317 | ||||
318 | .seealso: PCBDDC,PCBDDCSetDofsSplitting(),PCBDDCSetDofsSplittingLocal() | |||
319 | @*/ | |||
320 | PetscErrorCode PCBDDCSetDiscreteGradient(PC pc, Mat G, PetscInt order, PetscInt field, PetscBool global, PetscBool conforming) | |||
321 | { | |||
322 | PetscErrorCode ierr; | |||
323 | ||||
324 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 324; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
325 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),325,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),325 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),325,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),325,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
326 | PetscValidHeaderSpecific(G,MAT_CLASSID,2)do { if (!G) return PetscError(((MPI_Comm)0x44000001),326,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if (!PetscCheckPointer (G,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),326 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(G))->classid != MAT_CLASSID) { if ( ((PetscObject)(G))->classid == -1) return PetscError(((MPI_Comm )0x44000001),326,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),326,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
327 | PetscValidLogicalCollectiveInt(pc,order,3)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -order ; b1[1] = order; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,327,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),327,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),327,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,3); } while (0); | |||
328 | PetscValidLogicalCollectiveInt(pc,field,4)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -field ; b1[1] = field; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,328,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),328,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),328,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,4); } while (0); | |||
329 | PetscValidLogicalCollectiveBool(pc,global,5)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)global; b1[1] = (PetscMPIInt)global; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject)pc) ,2,329,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),329,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),329,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Bool value must be same on all processes, argument # %d" ,5); } while (0); | |||
330 | PetscValidLogicalCollectiveBool(pc,conforming,6)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)conforming; b1[1] = (PetscMPIInt)conforming; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject)pc ),2,330,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),330,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),330,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Bool value must be same on all processes, argument # %d" ,6); } while (0); | |||
331 | PetscCheckSameComm(pc,1,G,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )G),&__flag);do {if (__builtin_expect(!!(_6_ierr),0)) return PetscError(((MPI_Comm)0x44000001),331,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_6_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001 ),331,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,80,PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
332 | ierr = PetscTryMethod(pc,"PCBDDCSetDiscreteGradient_C",(PC,Mat,PetscInt,PetscInt,PetscBool,PetscBool),(pc,G,order,field,global,conforming))0; do { PetscErrorCode (*f)(PC,Mat,PetscInt,PetscInt,PetscBool ,PetscBool), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetDiscreteGradient_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),332,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,G,order,field,global,conforming);do {if (__builtin_expect (!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),332, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),332,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
333 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
334 | } | |||
335 | ||||
336 | static PetscErrorCode PCBDDCSetDivergenceMat_BDDC(PC pc, Mat divudotp, PetscBool trans, IS vl2l) | |||
337 | { | |||
338 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
339 | PetscErrorCode ierr; | |||
340 | ||||
341 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 341; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
342 | ierr = PetscObjectReference((PetscObject)divudotp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),342,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
343 | ierr = MatDestroy(&pcbddc->divudotp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),343,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
344 | pcbddc->divudotp = divudotp; | |||
345 | pcbddc->divudotp_trans = trans; | |||
346 | pcbddc->compute_nonetflux = PETSC_TRUE; | |||
347 | if (vl2l) { | |||
348 | ierr = PetscObjectReference((PetscObject)vl2l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),348,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
349 | ierr = ISDestroy(&pcbddc->divudotp_vl2l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),349,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
350 | pcbddc->divudotp_vl2l = vl2l; | |||
351 | } | |||
352 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
353 | } | |||
354 | ||||
355 | /*@ | |||
356 | PCBDDCSetDivergenceMat - Sets the linear operator representing \int_\Omega \div {\bf u} \cdot p dx | |||
357 | ||||
358 | Collective on PC | |||
359 | ||||
360 | Input Parameters: | |||
361 | + pc - the preconditioning context | |||
362 | . divudotp - the matrix (must be of type MATIS) | |||
363 | . trans - if trans if false (resp. true), then pressures are in the test (trial) space and velocities are in the trial (test) space. | |||
364 | - vl2l - optional index set describing the local (wrt the local matrix in divudotp) to local (wrt the local matrix in the preconditioning matrix) map for the velocities | |||
365 | ||||
366 | Level: advanced | |||
367 | ||||
368 | Notes: | |||
369 | This auxiliary matrix is used to compute quadrature weights representing the net-flux across subdomain boundaries | |||
370 | If vl2l is NULL, the local ordering for velocities in divudotp should match that of the preconditioning matrix | |||
371 | ||||
372 | .seealso: PCBDDC | |||
373 | @*/ | |||
374 | PetscErrorCode PCBDDCSetDivergenceMat(PC pc, Mat divudotp, PetscBool trans, IS vl2l) | |||
375 | { | |||
376 | PetscBool ismatis; | |||
377 | PetscErrorCode ierr; | |||
378 | ||||
379 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 379; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
380 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),380,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),380 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),380,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),380,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
381 | PetscValidHeaderSpecific(divudotp,MAT_CLASSID,2)do { if (!divudotp) return PetscError(((MPI_Comm)0x44000001), 381,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(divudotp,PETSC_OBJECT)) return PetscError( ((MPI_Comm)0x44000001),381,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(divudotp))->classid != MAT_CLASSID ) { if (((PetscObject)(divudotp))->classid == -1) return PetscError (((MPI_Comm)0x44000001),381,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),381,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
382 | PetscCheckSameComm(pc,1,divudotp,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )divudotp),&__flag);do {if (__builtin_expect(!!(_6_ierr), 0)) return PetscError(((MPI_Comm)0x44000001),382,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_6_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001 ),382,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,80,PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
383 | PetscValidLogicalCollectiveBool(pc,trans,3)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)trans; b1[1] = (PetscMPIInt)trans; _7_ierr = ( PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject)pc),2 ,383,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),383,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),383,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Bool value must be same on all processes, argument # %d" ,3); } while (0); | |||
384 | if (vl2l) PetscValidHeaderSpecific(vl2l,IS_CLASSID,4)do { if (!vl2l) return PetscError(((MPI_Comm)0x44000001),384, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",4); if ( !PetscCheckPointer(vl2l,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),384,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,4); if (((PetscObject)(vl2l))->classid != IS_CLASSID) { if (((PetscObject)(vl2l))->classid == -1) return PetscError( ((MPI_Comm)0x44000001),384,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,4); else return PetscError(((MPI_Comm)0x44000001),384,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",4) ; } } while (0); | |||
385 | ierr = PetscObjectTypeCompare((PetscObject)divudotp,MATIS"is",&ismatis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),385,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
386 | if (!ismatis) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Divergence matrix needs to be of type MATIS")return PetscError(PetscObjectComm((PetscObject)pc),386,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Divergence matrix needs to be of type MATIS" ); | |||
387 | ierr = PetscTryMethod(pc,"PCBDDCSetDivergenceMat_C",(PC,Mat,PetscBool,IS),(pc,divudotp,trans,vl2l))0; do { PetscErrorCode (*f)(PC,Mat,PetscBool,IS), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCBDDCSetDivergenceMat_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),387,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,divudotp,trans,vl2l);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),387,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),387,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
388 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
389 | } | |||
390 | ||||
391 | static PetscErrorCode PCBDDCSetChangeOfBasisMat_BDDC(PC pc, Mat change, PetscBool interior) | |||
392 | { | |||
393 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
394 | PetscErrorCode ierr; | |||
395 | ||||
396 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 396; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
397 | ierr = PetscObjectReference((PetscObject)change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),397,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
398 | ierr = MatDestroy(&pcbddc->user_ChangeOfBasisMatrix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),398,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
399 | pcbddc->user_ChangeOfBasisMatrix = change; | |||
400 | pcbddc->change_interior = interior; | |||
401 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
402 | } | |||
403 | /*@ | |||
404 | PCBDDCSetChangeOfBasisMat - Set user defined change of basis for dofs | |||
405 | ||||
406 | Collective on PC | |||
407 | ||||
408 | Input Parameters: | |||
409 | + pc - the preconditioning context | |||
410 | . change - the change of basis matrix | |||
411 | - interior - whether or not the change of basis modifies interior dofs | |||
412 | ||||
413 | Level: intermediate | |||
414 | ||||
415 | Notes: | |||
416 | ||||
417 | .seealso: PCBDDC | |||
418 | @*/ | |||
419 | PetscErrorCode PCBDDCSetChangeOfBasisMat(PC pc, Mat change, PetscBool interior) | |||
420 | { | |||
421 | PetscErrorCode ierr; | |||
422 | ||||
423 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 423; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
424 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),424,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),424 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),424,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),424,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
425 | PetscValidHeaderSpecific(change,MAT_CLASSID,2)do { if (!change) return PetscError(((MPI_Comm)0x44000001),425 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(change,PETSC_OBJECT)) return PetscError((( MPI_Comm)0x44000001),425,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(change))->classid != MAT_CLASSID) { if (((PetscObject)(change))->classid == -1) return PetscError (((MPI_Comm)0x44000001),425,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),425,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
426 | PetscCheckSameComm(pc,1,change,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )change),&__flag);do {if (__builtin_expect(!!(_6_ierr),0) ) return PetscError(((MPI_Comm)0x44000001),426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_6_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001 ),426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,80,PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
427 | if (pc->mat) { | |||
428 | PetscInt rows_c,cols_c,rows,cols; | |||
429 | ierr = MatGetSize(pc->mat,&rows,&cols);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),429,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
430 | ierr = MatGetSize(change,&rows_c,&cols_c);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),430,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
431 | if (rows_c != rows) SETERRQ2(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Invalid number of rows for change of basis matrix! %D != %D",rows_c,rows)return PetscError(PetscObjectComm((PetscObject)pc),431,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Invalid number of rows for change of basis matrix! %D != %D" ,rows_c,rows); | |||
432 | if (cols_c != cols) SETERRQ2(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Invalid number of columns for change of basis matrix! %D != %D",cols_c,cols)return PetscError(PetscObjectComm((PetscObject)pc),432,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Invalid number of columns for change of basis matrix! %D != %D" ,cols_c,cols); | |||
433 | ierr = MatGetLocalSize(pc->mat,&rows,&cols);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),433,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
434 | ierr = MatGetLocalSize(change,&rows_c,&cols_c);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),434,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
435 | if (rows_c != rows) SETERRQ2(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Invalid number of local rows for change of basis matrix! %D != %D",rows_c,rows)return PetscError(PetscObjectComm((PetscObject)pc),435,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Invalid number of local rows for change of basis matrix! %D != %D" ,rows_c,rows); | |||
436 | if (cols_c != cols) SETERRQ2(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Invalid number of local columns for change of basis matrix! %D != %D",cols_c,cols)return PetscError(PetscObjectComm((PetscObject)pc),436,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Invalid number of local columns for change of basis matrix! %D != %D" ,cols_c,cols); | |||
437 | } | |||
438 | ierr = PetscTryMethod(pc,"PCBDDCSetChangeOfBasisMat_C",(PC,Mat,PetscBool),(pc,change,interior))0; do { PetscErrorCode (*f)(PC,Mat,PetscBool), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCBDDCSetChangeOfBasisMat_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),438,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,change,interior);do {if (__builtin_expect(!!(__ierr) ,0)) return PetscError(((MPI_Comm)0x44000001),438,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),438,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
439 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
440 | } | |||
441 | ||||
442 | static PetscErrorCode PCBDDCSetPrimalVerticesIS_BDDC(PC pc, IS PrimalVertices) | |||
443 | { | |||
444 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
445 | PetscBool isequal = PETSC_FALSE; | |||
446 | PetscErrorCode ierr; | |||
447 | ||||
448 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 448; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
449 | ierr = PetscObjectReference((PetscObject)PrimalVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),449,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
450 | if (pcbddc->user_primal_vertices) { | |||
451 | ierr = ISEqual(PrimalVertices,pcbddc->user_primal_vertices,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),451,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
452 | } | |||
453 | ierr = ISDestroy(&pcbddc->user_primal_vertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),453,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
454 | ierr = ISDestroy(&pcbddc->user_primal_vertices_local);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),454,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
455 | pcbddc->user_primal_vertices = PrimalVertices; | |||
456 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
457 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
458 | } | |||
459 | ||||
460 | /*@ | |||
461 | PCBDDCSetPrimalVerticesIS - Set additional user defined primal vertices in PCBDDC | |||
462 | ||||
463 | Collective | |||
464 | ||||
465 | Input Parameters: | |||
466 | + pc - the preconditioning context | |||
467 | - PrimalVertices - index set of primal vertices in global numbering (can be empty) | |||
468 | ||||
469 | Level: intermediate | |||
470 | ||||
471 | Notes: | |||
472 | Any process can list any global node | |||
473 | ||||
474 | .seealso: PCBDDC, PCBDDCGetPrimalVerticesIS(), PCBDDCSetPrimalVerticesLocalIS(), PCBDDCGetPrimalVerticesLocalIS() | |||
475 | @*/ | |||
476 | PetscErrorCode PCBDDCSetPrimalVerticesIS(PC pc, IS PrimalVertices) | |||
477 | { | |||
478 | PetscErrorCode ierr; | |||
479 | ||||
480 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 480; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
481 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),481,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),481 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),481,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),481,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
482 | PetscValidHeaderSpecific(PrimalVertices,IS_CLASSID,2)do { if (!PrimalVertices) return PetscError(((MPI_Comm)0x44000001 ),482,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(PrimalVertices,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),482,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(PrimalVertices))->classid != IS_CLASSID ) { if (((PetscObject)(PrimalVertices))->classid == -1) return PetscError(((MPI_Comm)0x44000001),482,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),482,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
483 | PetscCheckSameComm(pc,1,PrimalVertices,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )PrimalVertices),&__flag);do {if (__builtin_expect(!!(_6_ierr ),0)) return PetscError(((MPI_Comm)0x44000001),483,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_6_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001 ),483,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,80,PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
484 | ierr = PetscTryMethod(pc,"PCBDDCSetPrimalVerticesIS_C",(PC,IS),(pc,PrimalVertices))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetPrimalVerticesIS_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),484,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,PrimalVertices);do {if (__builtin_expect(!!(__ierr), 0)) return PetscError(((MPI_Comm)0x44000001),484,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),484,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
485 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
486 | } | |||
487 | ||||
488 | static PetscErrorCode PCBDDCGetPrimalVerticesIS_BDDC(PC pc, IS *is) | |||
489 | { | |||
490 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
491 | ||||
492 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 492; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
493 | *is = pcbddc->user_primal_vertices; | |||
494 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
495 | } | |||
496 | ||||
497 | /*@ | |||
498 | PCBDDCGetPrimalVerticesIS - Get user defined primal vertices set with PCBDDCSetPrimalVerticesIS() | |||
499 | ||||
500 | Collective | |||
501 | ||||
502 | Input Parameters: | |||
503 | . pc - the preconditioning context | |||
504 | ||||
505 | Output Parameters: | |||
506 | . is - index set of primal vertices in global numbering (NULL if not set) | |||
507 | ||||
508 | Level: intermediate | |||
509 | ||||
510 | Notes: | |||
511 | ||||
512 | .seealso: PCBDDC, PCBDDCSetPrimalVerticesIS(), PCBDDCSetPrimalVerticesLocalIS(), PCBDDCGetPrimalVerticesLocalIS() | |||
513 | @*/ | |||
514 | PetscErrorCode PCBDDCGetPrimalVerticesIS(PC pc, IS *is) | |||
515 | { | |||
516 | PetscErrorCode ierr; | |||
517 | ||||
518 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 518; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
519 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),519,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),519 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),519,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),519,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
520 | PetscValidPointer(is,2)do { if (!is) return PetscError(((MPI_Comm)0x44000001),520,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer (is,PETSC_CHAR)) return PetscError(((MPI_Comm)0x44000001),520 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
521 | ierr = PetscUseMethod(pc,"PCBDDCGetPrimalVerticesIS_C",(PC,IS*),(pc,is))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetPrimalVerticesIS_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),521,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,is);do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),521,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),521,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetPrimalVerticesIS_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),521,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
522 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
523 | } | |||
524 | ||||
525 | static PetscErrorCode PCBDDCSetPrimalVerticesLocalIS_BDDC(PC pc, IS PrimalVertices) | |||
526 | { | |||
527 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
528 | PetscBool isequal = PETSC_FALSE; | |||
529 | PetscErrorCode ierr; | |||
530 | ||||
531 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 531; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
532 | ierr = PetscObjectReference((PetscObject)PrimalVertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),532,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
533 | if (pcbddc->user_primal_vertices_local) { | |||
534 | ierr = ISEqual(PrimalVertices,pcbddc->user_primal_vertices_local,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),534,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
535 | } | |||
536 | ierr = ISDestroy(&pcbddc->user_primal_vertices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),536,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
537 | ierr = ISDestroy(&pcbddc->user_primal_vertices_local);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),537,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
538 | pcbddc->user_primal_vertices_local = PrimalVertices; | |||
539 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
540 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
541 | } | |||
542 | ||||
543 | /*@ | |||
544 | PCBDDCSetPrimalVerticesLocalIS - Set additional user defined primal vertices in PCBDDC | |||
545 | ||||
546 | Collective | |||
547 | ||||
548 | Input Parameters: | |||
549 | + pc - the preconditioning context | |||
550 | - PrimalVertices - index set of primal vertices in local numbering (can be empty) | |||
551 | ||||
552 | Level: intermediate | |||
553 | ||||
554 | Notes: | |||
555 | ||||
556 | .seealso: PCBDDC, PCBDDCSetPrimalVerticesIS(), PCBDDCGetPrimalVerticesIS(), PCBDDCGetPrimalVerticesLocalIS() | |||
557 | @*/ | |||
558 | PetscErrorCode PCBDDCSetPrimalVerticesLocalIS(PC pc, IS PrimalVertices) | |||
559 | { | |||
560 | PetscErrorCode ierr; | |||
561 | ||||
562 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 562; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
563 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),563,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),563 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),563,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),563,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
564 | PetscValidHeaderSpecific(PrimalVertices,IS_CLASSID,2)do { if (!PrimalVertices) return PetscError(((MPI_Comm)0x44000001 ),564,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(PrimalVertices,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),564,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(PrimalVertices))->classid != IS_CLASSID ) { if (((PetscObject)(PrimalVertices))->classid == -1) return PetscError(((MPI_Comm)0x44000001),564,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),564,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
565 | PetscCheckSameComm(pc,1,PrimalVertices,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )PrimalVertices),&__flag);do {if (__builtin_expect(!!(_6_ierr ),0)) return PetscError(((MPI_Comm)0x44000001),565,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_6_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001 ),565,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,80,PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
566 | ierr = PetscTryMethod(pc,"PCBDDCSetPrimalVerticesLocalIS_C",(PC,IS),(pc,PrimalVertices))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetPrimalVerticesLocalIS_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),566,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,PrimalVertices);do {if (__builtin_expect(!!(__ierr), 0)) return PetscError(((MPI_Comm)0x44000001),566,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),566,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
567 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
568 | } | |||
569 | ||||
570 | static PetscErrorCode PCBDDCGetPrimalVerticesLocalIS_BDDC(PC pc, IS *is) | |||
571 | { | |||
572 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
573 | ||||
574 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 574; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
575 | *is = pcbddc->user_primal_vertices_local; | |||
576 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
577 | } | |||
578 | ||||
579 | /*@ | |||
580 | PCBDDCGetPrimalVerticesLocalIS - Get user defined primal vertices set with PCBDDCSetPrimalVerticesLocalIS() | |||
581 | ||||
582 | Collective | |||
583 | ||||
584 | Input Parameters: | |||
585 | . pc - the preconditioning context | |||
586 | ||||
587 | Output Parameters: | |||
588 | . is - index set of primal vertices in local numbering (NULL if not set) | |||
589 | ||||
590 | Level: intermediate | |||
591 | ||||
592 | Notes: | |||
593 | ||||
594 | .seealso: PCBDDC, PCBDDCSetPrimalVerticesIS(), PCBDDCGetPrimalVerticesIS(), PCBDDCSetPrimalVerticesLocalIS() | |||
595 | @*/ | |||
596 | PetscErrorCode PCBDDCGetPrimalVerticesLocalIS(PC pc, IS *is) | |||
597 | { | |||
598 | PetscErrorCode ierr; | |||
599 | ||||
600 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 600; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
601 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),601,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),601 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),601,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),601,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
602 | PetscValidPointer(is,2)do { if (!is) return PetscError(((MPI_Comm)0x44000001),602,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer (is,PETSC_CHAR)) return PetscError(((MPI_Comm)0x44000001),602 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
603 | ierr = PetscUseMethod(pc,"PCBDDCGetPrimalVerticesLocalIS_C",(PC,IS*),(pc,is))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetPrimalVerticesLocalIS_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),603,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,is);do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),603,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),603,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetPrimalVerticesLocalIS_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),603,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
604 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
605 | } | |||
606 | ||||
607 | static PetscErrorCode PCBDDCSetCoarseningRatio_BDDC(PC pc,PetscInt k) | |||
608 | { | |||
609 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
610 | ||||
611 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 611; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
612 | pcbddc->coarsening_ratio = k; | |||
613 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
614 | } | |||
615 | ||||
616 | /*@ | |||
617 | PCBDDCSetCoarseningRatio - Set coarsening ratio used in multilevel | |||
618 | ||||
619 | Logically collective on PC | |||
620 | ||||
621 | Input Parameters: | |||
622 | + pc - the preconditioning context | |||
623 | - k - coarsening ratio (H/h at the coarser level) | |||
624 | ||||
625 | Options Database Keys: | |||
626 | . -pc_bddc_coarsening_ratio | |||
627 | ||||
628 | Level: intermediate | |||
629 | ||||
630 | Notes: | |||
631 | Approximatively k subdomains at the finer level will be aggregated into a single subdomain at the coarser level | |||
632 | ||||
633 | .seealso: PCBDDC, PCBDDCSetLevels() | |||
634 | @*/ | |||
635 | PetscErrorCode PCBDDCSetCoarseningRatio(PC pc,PetscInt k) | |||
636 | { | |||
637 | PetscErrorCode ierr; | |||
638 | ||||
639 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 639; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
640 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),640,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),640 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),640,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),640,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
641 | PetscValidLogicalCollectiveInt(pc,k,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -k ; b1[1] = k; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,641,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),641,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),641,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
642 | ierr = PetscTryMethod(pc,"PCBDDCSetCoarseningRatio_C",(PC,PetscInt),(pc,k))0; do { PetscErrorCode (*f)(PC,PetscInt), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetCoarseningRatio_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),642,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,k);do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),642,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),642,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
643 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
644 | } | |||
645 | ||||
646 | /* The following functions (PCBDDCSetUseExactDirichlet PCBDDCSetLevel) are not public */ | |||
647 | static PetscErrorCode PCBDDCSetUseExactDirichlet_BDDC(PC pc,PetscBool flg) | |||
648 | { | |||
649 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
650 | ||||
651 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 651; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
652 | pcbddc->use_exact_dirichlet_trick = flg; | |||
653 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
654 | } | |||
655 | ||||
656 | PetscErrorCode PCBDDCSetUseExactDirichlet(PC pc,PetscBool flg) | |||
657 | { | |||
658 | PetscErrorCode ierr; | |||
659 | ||||
660 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 660; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
661 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),661,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),661 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),661,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),661,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
662 | PetscValidLogicalCollectiveBool(pc,flg,2)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)flg; b1[1] = (PetscMPIInt)flg; _7_ierr = (PetscAllreduceBarrierCheck (PetscObjectComm((PetscObject)pc),2,662,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),662,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),662,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Bool value must be same on all processes, argument # %d" ,2); } while (0); | |||
663 | ierr = PetscTryMethod(pc,"PCBDDCSetUseExactDirichlet_C",(PC,PetscBool),(pc,flg))0; do { PetscErrorCode (*f)(PC,PetscBool), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetUseExactDirichlet_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),663,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,flg);do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),663,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),663,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
664 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
665 | } | |||
666 | ||||
667 | static PetscErrorCode PCBDDCSetLevel_BDDC(PC pc,PetscInt level) | |||
668 | { | |||
669 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
670 | ||||
671 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 671; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
672 | pcbddc->current_level = level; | |||
673 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
674 | } | |||
675 | ||||
676 | PetscErrorCode PCBDDCSetLevel(PC pc,PetscInt level) | |||
677 | { | |||
678 | PetscErrorCode ierr; | |||
679 | ||||
680 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 680; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
681 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),681,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),681 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),681,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),681,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
682 | PetscValidLogicalCollectiveInt(pc,level,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -level ; b1[1] = level; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,682,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),682,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),682,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
683 | ierr = PetscTryMethod(pc,"PCBDDCSetLevel_C",(PC,PetscInt),(pc,level))0; do { PetscErrorCode (*f)(PC,PetscInt), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetLevel_C"),(PetscVoidFunction*)( &f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),683,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,level);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),683,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),683,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
684 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
685 | } | |||
686 | ||||
687 | static PetscErrorCode PCBDDCSetLevels_BDDC(PC pc,PetscInt levels) | |||
688 | { | |||
689 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
690 | ||||
691 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 691; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
692 | if (levels > PETSC_PCBDDC_MAXLEVELS8-1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Maximum number of additional levels for BDDC is %d",PETSC_PCBDDC_MAXLEVELS-1)return PetscError(PetscObjectComm((PetscObject)pc),692,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Maximum number of additional levels for BDDC is %d" ,8 -1); | |||
693 | pcbddc->max_levels = levels; | |||
694 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
695 | } | |||
696 | ||||
697 | /*@ | |||
698 | PCBDDCSetLevels - Sets the maximum number of additional levels allowed for multilevel BDDC | |||
699 | ||||
700 | Logically collective on PC | |||
701 | ||||
702 | Input Parameters: | |||
703 | + pc - the preconditioning context | |||
704 | - levels - the maximum number of levels | |||
705 | ||||
706 | Options Database Keys: | |||
707 | . -pc_bddc_levels | |||
708 | ||||
709 | Level: intermediate | |||
710 | ||||
711 | Notes: | |||
712 | The default value is 0, that gives the classical two-levels BDDC | |||
713 | ||||
714 | .seealso: PCBDDC, PCBDDCSetCoarseningRatio() | |||
715 | @*/ | |||
716 | PetscErrorCode PCBDDCSetLevels(PC pc,PetscInt levels) | |||
717 | { | |||
718 | PetscErrorCode ierr; | |||
719 | ||||
720 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 720; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
721 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),721,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),721 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),721,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),721,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
722 | PetscValidLogicalCollectiveInt(pc,levels,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -levels ; b1[1] = levels; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,722,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),722,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),722,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
723 | ierr = PetscTryMethod(pc,"PCBDDCSetLevels_C",(PC,PetscInt),(pc,levels))0; do { PetscErrorCode (*f)(PC,PetscInt), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetLevels_C"),(PetscVoidFunction*) (&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),723,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,levels);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),723,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),723,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
724 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
725 | } | |||
726 | ||||
727 | static PetscErrorCode PCBDDCSetDirichletBoundaries_BDDC(PC pc,IS DirichletBoundaries) | |||
728 | { | |||
729 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
730 | PetscBool isequal = PETSC_FALSE; | |||
731 | PetscErrorCode ierr; | |||
732 | ||||
733 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 733; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
734 | ierr = PetscObjectReference((PetscObject)DirichletBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),734,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
735 | if (pcbddc->DirichletBoundaries) { | |||
736 | ierr = ISEqual(DirichletBoundaries,pcbddc->DirichletBoundaries,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),736,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
737 | } | |||
738 | /* last user setting takes precendence -> destroy any other customization */ | |||
739 | ierr = ISDestroy(&pcbddc->DirichletBoundariesLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),739,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
740 | ierr = ISDestroy(&pcbddc->DirichletBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),740,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
741 | pcbddc->DirichletBoundaries = DirichletBoundaries; | |||
742 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
743 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
744 | } | |||
745 | ||||
746 | /*@ | |||
747 | PCBDDCSetDirichletBoundaries - Set IS defining Dirichlet boundaries for the global problem. | |||
748 | ||||
749 | Collective | |||
750 | ||||
751 | Input Parameters: | |||
752 | + pc - the preconditioning context | |||
753 | - DirichletBoundaries - parallel IS defining the Dirichlet boundaries | |||
754 | ||||
755 | Level: intermediate | |||
756 | ||||
757 | Notes: | |||
758 | Provide the information if you used MatZeroRows/Columns routines. Any process can list any global node | |||
759 | ||||
760 | .seealso: PCBDDC, PCBDDCSetDirichletBoundariesLocal(), MatZeroRows(), MatZeroRowsColumns() | |||
761 | @*/ | |||
762 | PetscErrorCode PCBDDCSetDirichletBoundaries(PC pc,IS DirichletBoundaries) | |||
763 | { | |||
764 | PetscErrorCode ierr; | |||
765 | ||||
766 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 766; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
767 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),767,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),767 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),767,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),767,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
768 | PetscValidHeaderSpecific(DirichletBoundaries,IS_CLASSID,2)do { if (!DirichletBoundaries) return PetscError(((MPI_Comm)0x44000001 ),768,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(DirichletBoundaries,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),768,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(DirichletBoundaries))->classid != IS_CLASSID ) { if (((PetscObject)(DirichletBoundaries))->classid == - 1) return PetscError(((MPI_Comm)0x44000001),768,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),768,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
769 | PetscCheckSameComm(pc,1,DirichletBoundaries,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )DirichletBoundaries),&__flag);do {if (__builtin_expect(! !(_6_ierr),0)) return PetscError(((MPI_Comm)0x44000001),769,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),769,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
770 | ierr = PetscTryMethod(pc,"PCBDDCSetDirichletBoundaries_C",(PC,IS),(pc,DirichletBoundaries))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetDirichletBoundaries_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),770,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,DirichletBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),770,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),770,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
771 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
772 | } | |||
773 | ||||
774 | static PetscErrorCode PCBDDCSetDirichletBoundariesLocal_BDDC(PC pc,IS DirichletBoundaries) | |||
775 | { | |||
776 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
777 | PetscBool isequal = PETSC_FALSE; | |||
778 | PetscErrorCode ierr; | |||
779 | ||||
780 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 780; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
781 | ierr = PetscObjectReference((PetscObject)DirichletBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),781,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
782 | if (pcbddc->DirichletBoundariesLocal) { | |||
783 | ierr = ISEqual(DirichletBoundaries,pcbddc->DirichletBoundariesLocal,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),783,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
784 | } | |||
785 | /* last user setting takes precendence -> destroy any other customization */ | |||
786 | ierr = ISDestroy(&pcbddc->DirichletBoundariesLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),786,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
787 | ierr = ISDestroy(&pcbddc->DirichletBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),787,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
788 | pcbddc->DirichletBoundariesLocal = DirichletBoundaries; | |||
789 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
790 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
791 | } | |||
792 | ||||
793 | /*@ | |||
794 | PCBDDCSetDirichletBoundariesLocal - Set IS defining Dirichlet boundaries for the global problem in local ordering. | |||
795 | ||||
796 | Collective | |||
797 | ||||
798 | Input Parameters: | |||
799 | + pc - the preconditioning context | |||
800 | - DirichletBoundaries - parallel IS defining the Dirichlet boundaries (in local ordering) | |||
801 | ||||
802 | Level: intermediate | |||
803 | ||||
804 | Notes: | |||
805 | ||||
806 | .seealso: PCBDDC, PCBDDCSetDirichletBoundaries(), MatZeroRows(), MatZeroRowsColumns() | |||
807 | @*/ | |||
808 | PetscErrorCode PCBDDCSetDirichletBoundariesLocal(PC pc,IS DirichletBoundaries) | |||
809 | { | |||
810 | PetscErrorCode ierr; | |||
811 | ||||
812 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 812; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
813 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),813,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),813 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),813,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),813,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
814 | PetscValidHeaderSpecific(DirichletBoundaries,IS_CLASSID,2)do { if (!DirichletBoundaries) return PetscError(((MPI_Comm)0x44000001 ),814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(DirichletBoundaries,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(DirichletBoundaries))->classid != IS_CLASSID ) { if (((PetscObject)(DirichletBoundaries))->classid == - 1) return PetscError(((MPI_Comm)0x44000001),814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),814,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
815 | PetscCheckSameComm(pc,1,DirichletBoundaries,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )DirichletBoundaries),&__flag);do {if (__builtin_expect(! !(_6_ierr),0)) return PetscError(((MPI_Comm)0x44000001),815,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),815,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
816 | ierr = PetscTryMethod(pc,"PCBDDCSetDirichletBoundariesLocal_C",(PC,IS),(pc,DirichletBoundaries))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetDirichletBoundariesLocal_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,DirichletBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
817 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
818 | } | |||
819 | ||||
820 | static PetscErrorCode PCBDDCSetNeumannBoundaries_BDDC(PC pc,IS NeumannBoundaries) | |||
821 | { | |||
822 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
823 | PetscBool isequal = PETSC_FALSE; | |||
824 | PetscErrorCode ierr; | |||
825 | ||||
826 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 826; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
827 | ierr = PetscObjectReference((PetscObject)NeumannBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),827,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
828 | if (pcbddc->NeumannBoundaries) { | |||
829 | ierr = ISEqual(NeumannBoundaries,pcbddc->NeumannBoundaries,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),829,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
830 | } | |||
831 | /* last user setting takes precendence -> destroy any other customization */ | |||
832 | ierr = ISDestroy(&pcbddc->NeumannBoundariesLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),832,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
833 | ierr = ISDestroy(&pcbddc->NeumannBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),833,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
834 | pcbddc->NeumannBoundaries = NeumannBoundaries; | |||
835 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
836 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
837 | } | |||
838 | ||||
839 | /*@ | |||
840 | PCBDDCSetNeumannBoundaries - Set IS defining Neumann boundaries for the global problem. | |||
841 | ||||
842 | Collective | |||
843 | ||||
844 | Input Parameters: | |||
845 | + pc - the preconditioning context | |||
846 | - NeumannBoundaries - parallel IS defining the Neumann boundaries | |||
847 | ||||
848 | Level: intermediate | |||
849 | ||||
850 | Notes: | |||
851 | Any process can list any global node | |||
852 | ||||
853 | .seealso: PCBDDC, PCBDDCSetNeumannBoundariesLocal() | |||
854 | @*/ | |||
855 | PetscErrorCode PCBDDCSetNeumannBoundaries(PC pc,IS NeumannBoundaries) | |||
856 | { | |||
857 | PetscErrorCode ierr; | |||
858 | ||||
859 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 859; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
860 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),860,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),860 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),860,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),860,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
861 | PetscValidHeaderSpecific(NeumannBoundaries,IS_CLASSID,2)do { if (!NeumannBoundaries) return PetscError(((MPI_Comm)0x44000001 ),861,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(NeumannBoundaries,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),861,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(NeumannBoundaries))->classid != IS_CLASSID ) { if (((PetscObject)(NeumannBoundaries))->classid == -1) return PetscError(((MPI_Comm)0x44000001),861,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),861,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
862 | PetscCheckSameComm(pc,1,NeumannBoundaries,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )NeumannBoundaries),&__flag);do {if (__builtin_expect(!!( _6_ierr),0)) return PetscError(((MPI_Comm)0x44000001),862,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),862,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
863 | ierr = PetscTryMethod(pc,"PCBDDCSetNeumannBoundaries_C",(PC,IS),(pc,NeumannBoundaries))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetNeumannBoundaries_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),863,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,NeumannBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),863,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),863,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
864 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
865 | } | |||
866 | ||||
867 | static PetscErrorCode PCBDDCSetNeumannBoundariesLocal_BDDC(PC pc,IS NeumannBoundaries) | |||
868 | { | |||
869 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
870 | PetscBool isequal = PETSC_FALSE; | |||
871 | PetscErrorCode ierr; | |||
872 | ||||
873 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 873; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
874 | ierr = PetscObjectReference((PetscObject)NeumannBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),874,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
875 | if (pcbddc->NeumannBoundariesLocal) { | |||
876 | ierr = ISEqual(NeumannBoundaries,pcbddc->NeumannBoundariesLocal,&isequal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),876,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
877 | } | |||
878 | /* last user setting takes precendence -> destroy any other customization */ | |||
879 | ierr = ISDestroy(&pcbddc->NeumannBoundariesLocal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),879,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
880 | ierr = ISDestroy(&pcbddc->NeumannBoundaries);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),880,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
881 | pcbddc->NeumannBoundariesLocal = NeumannBoundaries; | |||
882 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
883 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
884 | } | |||
885 | ||||
886 | /*@ | |||
887 | PCBDDCSetNeumannBoundariesLocal - Set IS defining Neumann boundaries for the global problem in local ordering. | |||
888 | ||||
889 | Collective | |||
890 | ||||
891 | Input Parameters: | |||
892 | + pc - the preconditioning context | |||
893 | - NeumannBoundaries - parallel IS defining the subdomain part of Neumann boundaries (in local ordering) | |||
894 | ||||
895 | Level: intermediate | |||
896 | ||||
897 | Notes: | |||
898 | ||||
899 | .seealso: PCBDDC, PCBDDCSetNeumannBoundaries() | |||
900 | @*/ | |||
901 | PetscErrorCode PCBDDCSetNeumannBoundariesLocal(PC pc,IS NeumannBoundaries) | |||
902 | { | |||
903 | PetscErrorCode ierr; | |||
904 | ||||
905 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 905; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
906 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),906,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),906 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),906,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),906,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
907 | PetscValidHeaderSpecific(NeumannBoundaries,IS_CLASSID,2)do { if (!NeumannBoundaries) return PetscError(((MPI_Comm)0x44000001 ),907,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(NeumannBoundaries,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),907,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(NeumannBoundaries))->classid != IS_CLASSID ) { if (((PetscObject)(NeumannBoundaries))->classid == -1) return PetscError(((MPI_Comm)0x44000001),907,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),907,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
908 | PetscCheckSameComm(pc,1,NeumannBoundaries,2)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )NeumannBoundaries),&__flag);do {if (__builtin_expect(!!( _6_ierr),0)) return PetscError(((MPI_Comm)0x44000001),908,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),908,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,2,__flag); } while (0); | |||
909 | ierr = PetscTryMethod(pc,"PCBDDCSetNeumannBoundariesLocal_C",(PC,IS),(pc,NeumannBoundaries))0; do { PetscErrorCode (*f)(PC,IS), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetNeumannBoundariesLocal_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),909,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,NeumannBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),909,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),909,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
910 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
911 | } | |||
912 | ||||
913 | static PetscErrorCode PCBDDCGetDirichletBoundaries_BDDC(PC pc,IS *DirichletBoundaries) | |||
914 | { | |||
915 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
916 | ||||
917 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 917; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
918 | *DirichletBoundaries = pcbddc->DirichletBoundaries; | |||
919 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
920 | } | |||
921 | ||||
922 | /*@ | |||
923 | PCBDDCGetDirichletBoundaries - Get parallel IS for Dirichlet boundaries | |||
924 | ||||
925 | Collective | |||
926 | ||||
927 | Input Parameters: | |||
928 | . pc - the preconditioning context | |||
929 | ||||
930 | Output Parameters: | |||
931 | . DirichletBoundaries - index set defining the Dirichlet boundaries | |||
932 | ||||
933 | Level: intermediate | |||
934 | ||||
935 | Notes: | |||
936 | The IS returned (if any) is the same passed in earlier by the user with PCBDDCSetDirichletBoundaries | |||
937 | ||||
938 | .seealso: PCBDDC | |||
939 | @*/ | |||
940 | PetscErrorCode PCBDDCGetDirichletBoundaries(PC pc,IS *DirichletBoundaries) | |||
941 | { | |||
942 | PetscErrorCode ierr; | |||
943 | ||||
944 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 944; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
945 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),945,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),945 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),945,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),945,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
946 | ierr = PetscUseMethod(pc,"PCBDDCGetDirichletBoundaries_C",(PC,IS*),(pc,DirichletBoundaries))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetDirichletBoundaries_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),946,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,DirichletBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),946,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),946,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetDirichletBoundaries_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),946,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
947 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
948 | } | |||
949 | ||||
950 | static PetscErrorCode PCBDDCGetDirichletBoundariesLocal_BDDC(PC pc,IS *DirichletBoundaries) | |||
951 | { | |||
952 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
953 | ||||
954 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 954; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
955 | *DirichletBoundaries = pcbddc->DirichletBoundariesLocal; | |||
956 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
957 | } | |||
958 | ||||
959 | /*@ | |||
960 | PCBDDCGetDirichletBoundariesLocal - Get parallel IS for Dirichlet boundaries (in local ordering) | |||
961 | ||||
962 | Collective | |||
963 | ||||
964 | Input Parameters: | |||
965 | . pc - the preconditioning context | |||
966 | ||||
967 | Output Parameters: | |||
968 | . DirichletBoundaries - index set defining the subdomain part of Dirichlet boundaries | |||
969 | ||||
970 | Level: intermediate | |||
971 | ||||
972 | Notes: | |||
973 | The IS returned could be the same passed in earlier by the user (if provided with PCBDDCSetDirichletBoundariesLocal) or a global-to-local map of the global IS (if provided with PCBDDCSetDirichletBoundaries). | |||
974 | In the latter case, the IS will be available after PCSetUp. | |||
975 | ||||
976 | .seealso: PCBDDC | |||
977 | @*/ | |||
978 | PetscErrorCode PCBDDCGetDirichletBoundariesLocal(PC pc,IS *DirichletBoundaries) | |||
979 | { | |||
980 | PetscErrorCode ierr; | |||
981 | ||||
982 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 982; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
983 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),983,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),983 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),983,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),983,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
984 | ierr = PetscUseMethod(pc,"PCBDDCGetDirichletBoundariesLocal_C",(PC,IS*),(pc,DirichletBoundaries))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetDirichletBoundariesLocal_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),984,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,DirichletBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),984,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),984,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetDirichletBoundariesLocal_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),984,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
985 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
986 | } | |||
987 | ||||
988 | static PetscErrorCode PCBDDCGetNeumannBoundaries_BDDC(PC pc,IS *NeumannBoundaries) | |||
989 | { | |||
990 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
991 | ||||
992 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 992; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
993 | *NeumannBoundaries = pcbddc->NeumannBoundaries; | |||
994 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
995 | } | |||
996 | ||||
997 | /*@ | |||
998 | PCBDDCGetNeumannBoundaries - Get parallel IS for Neumann boundaries | |||
999 | ||||
1000 | Collective | |||
1001 | ||||
1002 | Input Parameters: | |||
1003 | . pc - the preconditioning context | |||
1004 | ||||
1005 | Output Parameters: | |||
1006 | . NeumannBoundaries - index set defining the Neumann boundaries | |||
1007 | ||||
1008 | Level: intermediate | |||
1009 | ||||
1010 | Notes: | |||
1011 | The IS returned (if any) is the same passed in earlier by the user with PCBDDCSetNeumannBoundaries | |||
1012 | ||||
1013 | .seealso: PCBDDC | |||
1014 | @*/ | |||
1015 | PetscErrorCode PCBDDCGetNeumannBoundaries(PC pc,IS *NeumannBoundaries) | |||
1016 | { | |||
1017 | PetscErrorCode ierr; | |||
1018 | ||||
1019 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1019; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1020 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1020,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1020 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1020,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1020,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
1021 | ierr = PetscUseMethod(pc,"PCBDDCGetNeumannBoundaries_C",(PC,IS*),(pc,NeumannBoundaries))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetNeumannBoundaries_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),1021,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,NeumannBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1021,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),1021,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetNeumannBoundaries_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1021,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1022 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1023 | } | |||
1024 | ||||
1025 | static PetscErrorCode PCBDDCGetNeumannBoundariesLocal_BDDC(PC pc,IS *NeumannBoundaries) | |||
1026 | { | |||
1027 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1028 | ||||
1029 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1029; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1030 | *NeumannBoundaries = pcbddc->NeumannBoundariesLocal; | |||
1031 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1032 | } | |||
1033 | ||||
1034 | /*@ | |||
1035 | PCBDDCGetNeumannBoundariesLocal - Get parallel IS for Neumann boundaries (in local ordering) | |||
1036 | ||||
1037 | Collective | |||
1038 | ||||
1039 | Input Parameters: | |||
1040 | . pc - the preconditioning context | |||
1041 | ||||
1042 | Output Parameters: | |||
1043 | . NeumannBoundaries - index set defining the subdomain part of Neumann boundaries | |||
1044 | ||||
1045 | Level: intermediate | |||
1046 | ||||
1047 | Notes: | |||
1048 | The IS returned could be the same passed in earlier by the user (if provided with PCBDDCSetNeumannBoundariesLocal) or a global-to-local map of the global IS (if provided with PCBDDCSetNeumannBoundaries). | |||
1049 | In the latter case, the IS will be available after PCSetUp. | |||
1050 | ||||
1051 | .seealso: PCBDDC | |||
1052 | @*/ | |||
1053 | PetscErrorCode PCBDDCGetNeumannBoundariesLocal(PC pc,IS *NeumannBoundaries) | |||
1054 | { | |||
1055 | PetscErrorCode ierr; | |||
1056 | ||||
1057 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1057; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1058 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1058,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1058 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1058,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1058,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
1059 | ierr = PetscUseMethod(pc,"PCBDDCGetNeumannBoundariesLocal_C",(PC,IS*),(pc,NeumannBoundaries))0; do { PetscErrorCode (*f)(PC,IS*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCGetNeumannBoundariesLocal_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),1059,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,NeumannBoundaries);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1059,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),1059,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCGetNeumannBoundariesLocal_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1059,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1060 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1061 | } | |||
1062 | ||||
1063 | static PetscErrorCode PCBDDCSetLocalAdjacencyGraph_BDDC(PC pc, PetscInt nvtxs,const PetscInt xadj[],const PetscInt adjncy[], PetscCopyMode copymode) | |||
1064 | { | |||
1065 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1066 | PCBDDCGraph mat_graph = pcbddc->mat_graph; | |||
1067 | PetscBool same_data = PETSC_FALSE; | |||
1068 | PetscErrorCode ierr; | |||
1069 | ||||
1070 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1070; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1071 | if (!nvtxs) { | |||
1072 | if (copymode == PETSC_OWN_POINTER) { | |||
1073 | ierr = PetscFree(xadj)((*PetscTrFree)((void*)(xadj),1073,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((xadj) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1073,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1074 | ierr = PetscFree(adjncy)((*PetscTrFree)((void*)(adjncy),1074,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((adjncy) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1074,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1075 | } | |||
1076 | ierr = PCBDDCGraphResetCSR(mat_graph);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1076,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1077 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1078 | } | |||
1079 | if (mat_graph->nvtxs == nvtxs && mat_graph->freecsr) { /* we own the data */ | |||
1080 | if (mat_graph->xadj == xadj && mat_graph->adjncy == adjncy) same_data = PETSC_TRUE; | |||
1081 | if (!same_data && mat_graph->xadj[nvtxs] == xadj[nvtxs]) { | |||
1082 | ierr = PetscArraycmp(xadj,mat_graph->xadj,nvtxs+1,&same_data)((sizeof(*(xadj)) != sizeof(*(mat_graph->xadj))) || PetscMemcmp (xadj,mat_graph->xadj,(nvtxs+1)*sizeof(*(xadj)),&same_data ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1082,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1083 | if (same_data) { | |||
1084 | ierr = PetscArraycmp(adjncy,mat_graph->adjncy,xadj[nvtxs],&same_data)((sizeof(*(adjncy)) != sizeof(*(mat_graph->adjncy))) || PetscMemcmp (adjncy,mat_graph->adjncy,(xadj[nvtxs])*sizeof(*(adjncy)), &same_data));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1084,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1085 | } | |||
1086 | } | |||
1087 | } | |||
1088 | if (!same_data) { | |||
1089 | /* free old CSR */ | |||
1090 | ierr = PCBDDCGraphResetCSR(mat_graph);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1090,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1091 | /* get CSR into graph structure */ | |||
1092 | if (copymode == PETSC_COPY_VALUES) { | |||
1093 | ierr = PetscMalloc1(nvtxs+1,&mat_graph->xadj)PetscMallocA(1,PETSC_FALSE,1093,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(nvtxs+1)*sizeof(**(&mat_graph->xadj)),(& mat_graph->xadj));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1093,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1094 | ierr = PetscMalloc1(xadj[nvtxs],&mat_graph->adjncy)PetscMallocA(1,PETSC_FALSE,1094,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(xadj[nvtxs])*sizeof(**(&mat_graph->adjncy)), (&mat_graph->adjncy));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1094,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1095 | ierr = PetscArraycpy(mat_graph->xadj,xadj,nvtxs+1)((sizeof(*(mat_graph->xadj)) != sizeof(*(xadj))) || PetscMemcpy (mat_graph->xadj,xadj,(nvtxs+1)*sizeof(*(mat_graph->xadj ))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1095,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1096 | ierr = PetscArraycpy(mat_graph->adjncy,adjncy,xadj[nvtxs])((sizeof(*(mat_graph->adjncy)) != sizeof(*(adjncy))) || PetscMemcpy (mat_graph->adjncy,adjncy,(xadj[nvtxs])*sizeof(*(mat_graph ->adjncy))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1096,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1097 | mat_graph->freecsr = PETSC_TRUE; | |||
1098 | } else if (copymode == PETSC_OWN_POINTER) { | |||
1099 | mat_graph->xadj = (PetscInt*)xadj; | |||
1100 | mat_graph->adjncy = (PetscInt*)adjncy; | |||
1101 | mat_graph->freecsr = PETSC_TRUE; | |||
1102 | } else if (copymode == PETSC_USE_POINTER) { | |||
1103 | mat_graph->xadj = (PetscInt*)xadj; | |||
1104 | mat_graph->adjncy = (PetscInt*)adjncy; | |||
1105 | mat_graph->freecsr = PETSC_FALSE; | |||
1106 | } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported copy mode %D",copymode)return PetscError(((MPI_Comm)0x44000001),1106,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Unsupported copy mode %D",copymode); | |||
1107 | mat_graph->nvtxs_csr = nvtxs; | |||
1108 | pcbddc->recompute_topography = PETSC_TRUE; | |||
1109 | } | |||
1110 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1111 | } | |||
1112 | ||||
1113 | /*@ | |||
1114 | PCBDDCSetLocalAdjacencyGraph - Set adjacency structure (CSR graph) of the local degrees of freedom. | |||
1115 | ||||
1116 | Not collective | |||
1117 | ||||
1118 | Input Parameters: | |||
1119 | + pc - the preconditioning context. | |||
1120 | . nvtxs - number of local vertices of the graph (i.e., the number of local dofs). | |||
1121 | . xadj, adjncy - the connectivity of the dofs in CSR format. | |||
1122 | - copymode - supported modes are PETSC_COPY_VALUES, PETSC_USE_POINTER or PETSC_OWN_POINTER. | |||
1123 | ||||
1124 | Level: intermediate | |||
1125 | ||||
1126 | Notes: | |||
1127 | A dof is considered connected with all local dofs if xadj[dof+1]-xadj[dof] == 1 and adjncy[xadj[dof]] is negative. | |||
1128 | ||||
1129 | .seealso: PCBDDC,PetscCopyMode | |||
1130 | @*/ | |||
1131 | PetscErrorCode PCBDDCSetLocalAdjacencyGraph(PC pc,PetscInt nvtxs,const PetscInt xadj[],const PetscInt adjncy[], PetscCopyMode copymode) | |||
1132 | { | |||
1133 | void (*f)(void) = 0; | |||
1134 | PetscErrorCode ierr; | |||
1135 | ||||
1136 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1136; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1137 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1137,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1137 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1137,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1137,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
1138 | if (nvtxs) { | |||
1139 | PetscValidIntPointer(xadj,3)do { if (!xadj) return PetscError(((MPI_Comm)0x44000001),1139 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (!PetscCheckPointer(xadj,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),1139,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to Int: Parameter # %d" ,3); } while (0); | |||
1140 | if (xadj[nvtxs]) PetscValidIntPointer(adjncy,4)do { if (!adjncy) return PetscError(((MPI_Comm)0x44000001),1140 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",4); if (!PetscCheckPointer(adjncy,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),1140,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to Int: Parameter # %d" ,4); } while (0); | |||
1141 | } | |||
1142 | ierr = PetscTryMethod(pc,"PCBDDCSetLocalAdjacencyGraph_C",(PC,PetscInt,const PetscInt[],const PetscInt[],PetscCopyMode),(pc,nvtxs,xadj,adjncy,copymode))0; do { PetscErrorCode (*f)(PC,PetscInt,const PetscInt[],const PetscInt[],PetscCopyMode), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCBDDCSetLocalAdjacencyGraph_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),1142,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,nvtxs,xadj,adjncy,copymode);do {if (__builtin_expect (!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),1142 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1142,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1143 | /* free arrays if PCBDDC is not the PC type */ | |||
1144 | ierr = PetscObjectQueryFunction((PetscObject)pc,"PCBDDCSetLocalAdjacencyGraph_C",&f)PetscObjectQueryFunction_Private(((PetscObject)pc),("PCBDDCSetLocalAdjacencyGraph_C" ),(PetscVoidFunction*)(&f));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1144,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1145 | if (!f && copymode == PETSC_OWN_POINTER) { | |||
1146 | ierr = PetscFree(xadj)((*PetscTrFree)((void*)(xadj),1146,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((xadj) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1146,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1147 | ierr = PetscFree(adjncy)((*PetscTrFree)((void*)(adjncy),1147,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((adjncy) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1147,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1148 | } | |||
1149 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1150 | } | |||
1151 | ||||
1152 | static PetscErrorCode PCBDDCSetDofsSplittingLocal_BDDC(PC pc,PetscInt n_is, IS ISForDofs[]) | |||
1153 | { | |||
1154 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1155 | PetscInt i; | |||
1156 | PetscBool isequal = PETSC_FALSE; | |||
1157 | PetscErrorCode ierr; | |||
1158 | ||||
1159 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1159; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1160 | if (pcbddc->n_ISForDofsLocal == n_is) { | |||
1161 | for (i=0;i<n_is;i++) { | |||
1162 | PetscBool isequalt; | |||
1163 | ierr = ISEqual(ISForDofs[i],pcbddc->ISForDofsLocal[i],&isequalt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1163,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1164 | if (!isequalt) break; | |||
1165 | } | |||
1166 | if (i == n_is) isequal = PETSC_TRUE; | |||
1167 | } | |||
1168 | for (i=0;i<n_is;i++) { | |||
1169 | ierr = PetscObjectReference((PetscObject)ISForDofs[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1169,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1170 | } | |||
1171 | /* Destroy ISes if they were already set */ | |||
1172 | for (i=0;i<pcbddc->n_ISForDofsLocal;i++) { | |||
1173 | ierr = ISDestroy(&pcbddc->ISForDofsLocal[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1173,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1174 | } | |||
1175 | ierr = PetscFree(pcbddc->ISForDofsLocal)((*PetscTrFree)((void*)(pcbddc->ISForDofsLocal),1175,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c") || ((pcbddc->ISForDofsLocal) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1175,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1176 | /* last user setting takes precendence -> destroy any other customization */ | |||
1177 | for (i=0;i<pcbddc->n_ISForDofs;i++) { | |||
1178 | ierr = ISDestroy(&pcbddc->ISForDofs[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1178,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1179 | } | |||
1180 | ierr = PetscFree(pcbddc->ISForDofs)((*PetscTrFree)((void*)(pcbddc->ISForDofs),1180,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((pcbddc->ISForDofs) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1180,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1181 | pcbddc->n_ISForDofs = 0; | |||
1182 | /* allocate space then set */ | |||
1183 | if (n_is) { | |||
1184 | ierr = PetscMalloc1(n_is,&pcbddc->ISForDofsLocal)PetscMallocA(1,PETSC_FALSE,1184,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(n_is)*sizeof(**(&pcbddc->ISForDofsLocal)),(& pcbddc->ISForDofsLocal));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1184,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1185 | } | |||
1186 | for (i=0;i<n_is;i++) { | |||
1187 | pcbddc->ISForDofsLocal[i] = ISForDofs[i]; | |||
1188 | } | |||
1189 | pcbddc->n_ISForDofsLocal = n_is; | |||
1190 | if (n_is) pcbddc->user_provided_isfordofs = PETSC_TRUE; | |||
1191 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
1192 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1193 | } | |||
1194 | ||||
1195 | /*@ | |||
1196 | PCBDDCSetDofsSplittingLocal - Set index sets defining fields of the local subdomain matrix | |||
1197 | ||||
1198 | Collective | |||
1199 | ||||
1200 | Input Parameters: | |||
1201 | + pc - the preconditioning context | |||
1202 | . n_is - number of index sets defining the fields | |||
1203 | - ISForDofs - array of IS describing the fields in local ordering | |||
1204 | ||||
1205 | Level: intermediate | |||
1206 | ||||
1207 | Notes: | |||
1208 | n_is should be the same among processes. Not all nodes need to be listed: unlisted nodes will belong to the complement field. | |||
1209 | ||||
1210 | .seealso: PCBDDC | |||
1211 | @*/ | |||
1212 | PetscErrorCode PCBDDCSetDofsSplittingLocal(PC pc,PetscInt n_is, IS ISForDofs[]) | |||
1213 | { | |||
1214 | PetscInt i; | |||
1215 | PetscErrorCode ierr; | |||
1216 | ||||
1217 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1217; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1218 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1218,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1218 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1218,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1218,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
1219 | PetscValidLogicalCollectiveInt(pc,n_is,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -n_is ; b1[1] = n_is; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,1219,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1219,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),1219, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
1220 | for (i=0;i<n_is;i++) { | |||
1221 | PetscCheckSameComm(pc,1,ISForDofs[i],3)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )ISForDofs[i]),&__flag);do {if (__builtin_expect(!!(_6_ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1221,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),1221,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,3,__flag); } while (0); | |||
1222 | PetscValidHeaderSpecific(ISForDofs[i],IS_CLASSID,3)do { if (!ISForDofs[i]) return PetscError(((MPI_Comm)0x44000001 ),1222,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",3); if ( !PetscCheckPointer(ISForDofs[i],PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),1222,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,3); if (((PetscObject)(ISForDofs[i]))->classid != IS_CLASSID ) { if (((PetscObject)(ISForDofs[i]))->classid == -1) return PetscError(((MPI_Comm)0x44000001),1222,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,3); else return PetscError(((MPI_Comm)0x44000001),1222,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",3) ; } } while (0); | |||
1223 | } | |||
1224 | ierr = PetscTryMethod(pc,"PCBDDCSetDofsSplittingLocal_C",(PC,PetscInt,IS[]),(pc,n_is,ISForDofs))0; do { PetscErrorCode (*f)(PC,PetscInt,IS[]), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCBDDCSetDofsSplittingLocal_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1224,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc ,n_is,ISForDofs);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),1224,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1224,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1225 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1226 | } | |||
1227 | ||||
1228 | static PetscErrorCode PCBDDCSetDofsSplitting_BDDC(PC pc,PetscInt n_is, IS ISForDofs[]) | |||
1229 | { | |||
1230 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1231 | PetscInt i; | |||
1232 | PetscBool isequal = PETSC_FALSE; | |||
1233 | PetscErrorCode ierr; | |||
1234 | ||||
1235 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1235; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1236 | if (pcbddc->n_ISForDofs == n_is) { | |||
1237 | for (i=0;i<n_is;i++) { | |||
1238 | PetscBool isequalt; | |||
1239 | ierr = ISEqual(ISForDofs[i],pcbddc->ISForDofs[i],&isequalt);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1239,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1240 | if (!isequalt) break; | |||
1241 | } | |||
1242 | if (i == n_is) isequal = PETSC_TRUE; | |||
1243 | } | |||
1244 | for (i=0;i<n_is;i++) { | |||
1245 | ierr = PetscObjectReference((PetscObject)ISForDofs[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1245,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1246 | } | |||
1247 | /* Destroy ISes if they were already set */ | |||
1248 | for (i=0;i<pcbddc->n_ISForDofs;i++) { | |||
1249 | ierr = ISDestroy(&pcbddc->ISForDofs[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1249,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1250 | } | |||
1251 | ierr = PetscFree(pcbddc->ISForDofs)((*PetscTrFree)((void*)(pcbddc->ISForDofs),1251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((pcbddc->ISForDofs) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1252 | /* last user setting takes precendence -> destroy any other customization */ | |||
1253 | for (i=0;i<pcbddc->n_ISForDofsLocal;i++) { | |||
1254 | ierr = ISDestroy(&pcbddc->ISForDofsLocal[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1254,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1255 | } | |||
1256 | ierr = PetscFree(pcbddc->ISForDofsLocal)((*PetscTrFree)((void*)(pcbddc->ISForDofsLocal),1256,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c") || ((pcbddc->ISForDofsLocal) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1256,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1257 | pcbddc->n_ISForDofsLocal = 0; | |||
1258 | /* allocate space then set */ | |||
1259 | if (n_is) { | |||
1260 | ierr = PetscMalloc1(n_is,&pcbddc->ISForDofs)PetscMallocA(1,PETSC_FALSE,1260,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(n_is)*sizeof(**(&pcbddc->ISForDofs)),(&pcbddc ->ISForDofs));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1260,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1261 | } | |||
1262 | for (i=0;i<n_is;i++) { | |||
1263 | pcbddc->ISForDofs[i] = ISForDofs[i]; | |||
1264 | } | |||
1265 | pcbddc->n_ISForDofs = n_is; | |||
1266 | if (n_is) pcbddc->user_provided_isfordofs = PETSC_TRUE; | |||
1267 | if (!isequal) pcbddc->recompute_topography = PETSC_TRUE; | |||
1268 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1269 | } | |||
1270 | ||||
1271 | /*@ | |||
1272 | PCBDDCSetDofsSplitting - Set index sets defining fields of the global matrix | |||
1273 | ||||
1274 | Collective | |||
1275 | ||||
1276 | Input Parameters: | |||
1277 | + pc - the preconditioning context | |||
1278 | . n_is - number of index sets defining the fields | |||
1279 | - ISForDofs - array of IS describing the fields in global ordering | |||
1280 | ||||
1281 | Level: intermediate | |||
1282 | ||||
1283 | Notes: | |||
1284 | Any process can list any global node. Not all nodes need to be listed: unlisted nodes will belong to the complement field. | |||
1285 | ||||
1286 | .seealso: PCBDDC | |||
1287 | @*/ | |||
1288 | PetscErrorCode PCBDDCSetDofsSplitting(PC pc,PetscInt n_is, IS ISForDofs[]) | |||
1289 | { | |||
1290 | PetscInt i; | |||
1291 | PetscErrorCode ierr; | |||
1292 | ||||
1293 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1293; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1294 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1294,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1294 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1294,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1294,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
1295 | PetscValidLogicalCollectiveInt(pc,n_is,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -n_is ; b1[1] = n_is; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,1295,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1295,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),1295, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
1296 | for (i=0;i<n_is;i++) { | |||
1297 | PetscValidHeaderSpecific(ISForDofs[i],IS_CLASSID,3)do { if (!ISForDofs[i]) return PetscError(((MPI_Comm)0x44000001 ),1297,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",3); if ( !PetscCheckPointer(ISForDofs[i],PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),1297,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,3); if (((PetscObject)(ISForDofs[i]))->classid != IS_CLASSID ) { if (((PetscObject)(ISForDofs[i]))->classid == -1) return PetscError(((MPI_Comm)0x44000001),1297,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,3); else return PetscError(((MPI_Comm)0x44000001),1297,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",3) ; } } while (0); | |||
1298 | PetscCheckSameComm(pc,1,ISForDofs[i],3)do { PetscErrorCode _6_ierr,__flag; _6_ierr = MPI_Comm_compare (PetscObjectComm((PetscObject)pc),PetscObjectComm((PetscObject )ISForDofs[i]),&__flag);do {if (__builtin_expect(!!(_6_ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1298,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",_6_ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (__flag != 1 && __flag != 0) return PetscError(((MPI_Comm)0x44000001),1298,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",80, PETSC_ERROR_INITIAL,"Different communicators in the two objects: Argument # %d and %d flag %d" ,1,3,__flag); } while (0); | |||
1299 | } | |||
1300 | ierr = PetscTryMethod(pc,"PCBDDCSetDofsSplitting_C",(PC,PetscInt,IS[]),(pc,n_is,ISForDofs))0; do { PetscErrorCode (*f)(PC,PetscInt,IS[]), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCBDDCSetDofsSplitting_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1300,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc ,n_is,ISForDofs);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),1300,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1300,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1301 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1302 | } | |||
1303 | ||||
1304 | /* | |||
1305 | PCPreSolve_BDDC - Changes the right hand side and (if necessary) the initial | |||
1306 | guess if a transformation of basis approach has been selected. | |||
1307 | ||||
1308 | Input Parameter: | |||
1309 | + pc - the preconditioner contex | |||
1310 | ||||
1311 | Application Interface Routine: PCPreSolve() | |||
1312 | ||||
1313 | Notes: | |||
1314 | The interface routine PCPreSolve() is not usually called directly by | |||
1315 | the user, but instead is called by KSPSolve(). | |||
1316 | */ | |||
1317 | static PetscErrorCode PCPreSolve_BDDC(PC pc, KSP ksp, Vec rhs, Vec x) | |||
1318 | { | |||
1319 | PetscErrorCode ierr; | |||
1320 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1321 | PC_IS *pcis = (PC_IS*)(pc->data); | |||
1322 | Vec used_vec; | |||
1323 | PetscBool iscg = PETSC_FALSE, save_rhs = PETSC_TRUE, benign_correction_computed; | |||
1324 | ||||
1325 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1325; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1326 | /* if we are working with CG, one dirichlet solve can be avoided during Krylov iterations */ | |||
1327 | if (ksp) { | |||
1328 | PetscBool isgroppcg, ispipecg, ispipelcg, ispipecgrr; | |||
1329 | ||||
1330 | ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPCG"cg",&iscg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1330,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1331 | ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPGROPPCG"groppcg",&isgroppcg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1331,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1332 | ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPPIPECG"pipecg",&ispipecg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1332,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1333 | ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPPIPECG"pipecg",&ispipelcg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1333,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1334 | ierr = PetscObjectTypeCompare((PetscObject)ksp,KSPPIPECGRR"pipecgrr",&ispipecgrr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1334,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1335 | iscg = (PetscBool)(iscg || isgroppcg || ispipecg || ispipelcg || ispipecgrr); | |||
1336 | if (pcbddc->benign_apply_coarse_only || pcbddc->switch_static || !iscg || pc->mat != pc->pmat) { | |||
1337 | ierr = PCBDDCSetUseExactDirichlet(pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1337,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1338 | } | |||
1339 | } | |||
1340 | if (pcbddc->benign_apply_coarse_only || pcbddc->switch_static || pc->mat != pc->pmat) { | |||
1341 | ierr = PCBDDCSetUseExactDirichlet(pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1341,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1342 | } | |||
1343 | ||||
1344 | /* Creates parallel work vectors used in presolve */ | |||
1345 | if (!pcbddc->original_rhs) { | |||
1346 | ierr = VecDuplicate(pcis->vec1_global,&pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1346,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1347 | } | |||
1348 | if (!pcbddc->temp_solution) { | |||
1349 | ierr = VecDuplicate(pcis->vec1_global,&pcbddc->temp_solution);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1349,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1350 | } | |||
1351 | ||||
1352 | pcbddc->temp_solution_used = PETSC_FALSE; | |||
1353 | if (x) { | |||
1354 | ierr = PetscObjectReference((PetscObject)x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1354,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1355 | used_vec = x; | |||
1356 | } else { /* it can only happen when calling PCBDDCMatFETIDPGetRHS */ | |||
1357 | ierr = PetscObjectReference((PetscObject)pcbddc->temp_solution);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1357,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1358 | used_vec = pcbddc->temp_solution; | |||
1359 | ierr = VecSet(used_vec,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1359,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1360 | pcbddc->temp_solution_used = PETSC_TRUE; | |||
1361 | ierr = VecCopy(rhs,pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1361,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1362 | save_rhs = PETSC_FALSE; | |||
1363 | pcbddc->eliminate_dirdofs = PETSC_TRUE; | |||
1364 | } | |||
1365 | ||||
1366 | /* hack into ksp data structure since PCPreSolve comes earlier than setting to zero the guess in src/ksp/ksp/interface/itfunc.c */ | |||
1367 | if (ksp) { | |||
1368 | /* store the flag for the initial guess since it will be restored back during PCPostSolve_BDDC */ | |||
1369 | ierr = KSPGetInitialGuessNonzero(ksp,&pcbddc->ksp_guess_nonzero);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1369,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1370 | if (!pcbddc->ksp_guess_nonzero) { | |||
1371 | ierr = VecSet(used_vec,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1371,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1372 | } | |||
1373 | } | |||
1374 | ||||
1375 | pcbddc->rhs_change = PETSC_FALSE; | |||
1376 | /* Take into account zeroed rows -> change rhs and store solution removed */ | |||
1377 | if (rhs && pcbddc->eliminate_dirdofs) { | |||
1378 | IS dirIS = NULL((void*)0); | |||
1379 | ||||
1380 | /* DirichletBoundariesLocal may not be consistent among neighbours; gets a dirichlet dofs IS from graph (may be cached) */ | |||
1381 | ierr = PCBDDCGraphGetDirichletDofs(pcbddc->mat_graph,&dirIS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1381,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1382 | if (dirIS) { | |||
1383 | Mat_IS *matis = (Mat_IS*)pc->pmat->data; | |||
1384 | PetscInt dirsize,i,*is_indices; | |||
1385 | PetscScalar *array_x; | |||
1386 | const PetscScalar *array_diagonal; | |||
1387 | ||||
1388 | ierr = MatGetDiagonal(pc->pmat,pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1388,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1389 | ierr = VecPointwiseDivide(pcis->vec1_global,rhs,pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1389,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1390 | ierr = VecScatterBegin(matis->rctx,pcis->vec1_global,pcis->vec2_N,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1390,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1391 | ierr = VecScatterEnd(matis->rctx,pcis->vec1_global,pcis->vec2_N,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1391,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1392 | ierr = VecScatterBegin(matis->rctx,used_vec,pcis->vec1_N,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1392,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1393 | ierr = VecScatterEnd(matis->rctx,used_vec,pcis->vec1_N,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1393,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1394 | ierr = ISGetLocalSize(dirIS,&dirsize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1394,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1395 | ierr = VecGetArray(pcis->vec1_N,&array_x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1395,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1396 | ierr = VecGetArrayRead(pcis->vec2_N,&array_diagonal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1396,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1397 | ierr = ISGetIndices(dirIS,(const PetscInt**)&is_indices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1397,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1398 | for (i=0; i<dirsize; i++) array_x[is_indices[i]] = array_diagonal[is_indices[i]]; | |||
1399 | ierr = ISRestoreIndices(dirIS,(const PetscInt**)&is_indices);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1399,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1400 | ierr = VecRestoreArrayRead(pcis->vec2_N,&array_diagonal);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1400,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1401 | ierr = VecRestoreArray(pcis->vec1_N,&array_x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1401,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1402 | ierr = VecScatterBegin(matis->rctx,pcis->vec1_N,used_vec,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1402,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1403 | ierr = VecScatterEnd(matis->rctx,pcis->vec1_N,used_vec,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1403,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1404 | pcbddc->rhs_change = PETSC_TRUE; | |||
1405 | ierr = ISDestroy(&dirIS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1405,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1406 | } | |||
1407 | } | |||
1408 | ||||
1409 | /* remove the computed solution or the initial guess from the rhs */ | |||
1410 | if (pcbddc->rhs_change || (ksp && pcbddc->ksp_guess_nonzero) ) { | |||
1411 | /* save the original rhs */ | |||
1412 | if (save_rhs) { | |||
1413 | ierr = VecSwap(rhs,pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1413,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1414 | save_rhs = PETSC_FALSE; | |||
1415 | } | |||
1416 | pcbddc->rhs_change = PETSC_TRUE; | |||
1417 | ierr = VecScale(used_vec,-1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1417,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1418 | ierr = MatMultAdd(pc->mat,used_vec,pcbddc->original_rhs,rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1418,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1419 | ierr = VecScale(used_vec,-1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1419,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1420 | ierr = VecCopy(used_vec,pcbddc->temp_solution);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1420,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1421 | pcbddc->temp_solution_used = PETSC_TRUE; | |||
1422 | if (ksp) { | |||
1423 | ierr = KSPSetInitialGuessNonzero(ksp,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1423,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1424 | } | |||
1425 | } | |||
1426 | ierr = VecDestroy(&used_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1427 | ||||
1428 | /* compute initial vector in benign space if needed | |||
1429 | and remove non-benign solution from the rhs */ | |||
1430 | benign_correction_computed = PETSC_FALSE; | |||
1431 | if (rhs && pcbddc->benign_compute_correction && (pcbddc->benign_have_null || pcbddc->benign_apply_coarse_only)) { | |||
1432 | /* compute u^*_h using ideas similar to those in Xuemin Tu's PhD thesis (see Section 4.8.1) | |||
1433 | Recursively apply BDDC in the multilevel case */ | |||
1434 | if (!pcbddc->benign_vec) { | |||
1435 | ierr = VecDuplicate(rhs,&pcbddc->benign_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1435,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1436 | } | |||
1437 | /* keep applying coarse solver unless we no longer have benign subdomains */ | |||
1438 | pcbddc->benign_apply_coarse_only = pcbddc->benign_have_null ? PETSC_TRUE : PETSC_FALSE; | |||
1439 | if (!pcbddc->benign_skip_correction) { | |||
1440 | ierr = PCApply_BDDC(pc,rhs,pcbddc->benign_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1440,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1441 | benign_correction_computed = PETSC_TRUE; | |||
1442 | if (pcbddc->temp_solution_used) { | |||
1443 | ierr = VecAXPY(pcbddc->temp_solution,1.0,pcbddc->benign_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1443,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1444 | } | |||
1445 | ierr = VecScale(pcbddc->benign_vec,-1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1445,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1446 | /* store the original rhs if not done earlier */ | |||
1447 | if (save_rhs) { | |||
1448 | ierr = VecSwap(rhs,pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1448,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1449 | } | |||
1450 | if (pcbddc->rhs_change) { | |||
1451 | ierr = MatMultAdd(pc->mat,pcbddc->benign_vec,rhs,rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1451,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1452 | } else { | |||
1453 | ierr = MatMultAdd(pc->mat,pcbddc->benign_vec,pcbddc->original_rhs,rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1453,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1454 | } | |||
1455 | pcbddc->rhs_change = PETSC_TRUE; | |||
1456 | } | |||
1457 | pcbddc->benign_apply_coarse_only = PETSC_FALSE; | |||
1458 | } else { | |||
1459 | ierr = VecDestroy(&pcbddc->benign_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1459,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1460 | } | |||
1461 | ||||
1462 | /* dbg output */ | |||
1463 | if (pcbddc->dbg_flag && benign_correction_computed) { | |||
1464 | Vec v; | |||
1465 | ||||
1466 | ierr = VecDuplicate(pcis->vec1_global,&v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1466,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1467 | if (pcbddc->ChangeOfBasisMatrix) { | |||
1468 | ierr = MatMultTranspose(pcbddc->ChangeOfBasisMatrix,rhs,v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1468,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1469 | } else { | |||
1470 | ierr = VecCopy(rhs,v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1470,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1471 | } | |||
1472 | ierr = PCBDDCBenignGetOrSetP0(pc,v,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1472,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1473 | ierr = PetscViewerASCIIPrintf(pcbddc->dbg_viewer,"LEVEL %D: is the correction benign?\n",pcbddc->current_level);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1473,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1474 | ierr = PetscScalarView(pcbddc->benign_n,pcbddc->benign_p0,pcbddc->dbg_viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1474,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1475 | ierr = PetscViewerFlush(pcbddc->dbg_viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1475,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1476 | ierr = VecDestroy(&v);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1476,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1477 | } | |||
1478 | ||||
1479 | /* set initial guess if using PCG */ | |||
1480 | pcbddc->exact_dirichlet_trick_app = PETSC_FALSE; | |||
1481 | if (x && pcbddc->use_exact_dirichlet_trick) { | |||
1482 | ierr = VecSet(x,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1482,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1483 | if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior) { | |||
1484 | if (benign_correction_computed) { /* we have already saved the changed rhs */ | |||
1485 | ierr = VecLockReadPop(pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1485,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1486 | } else { | |||
1487 | ierr = MatMultTranspose(pcbddc->ChangeOfBasisMatrix,rhs,pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1487,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1488 | } | |||
1489 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec1_global,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1489,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1490 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec1_global,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1490,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1491 | } else { | |||
1492 | ierr = VecScatterBegin(pcis->global_to_D,rhs,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1492,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1493 | ierr = VecScatterEnd(pcis->global_to_D,rhs,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1493,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1494 | } | |||
1495 | ierr = KSPSolve(pcbddc->ksp_D,pcis->vec1_D,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1495,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1496 | ierr = KSPCheckSolve(pcbddc->ksp_D,pc,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1496,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1497 | if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior) { | |||
1498 | ierr = VecSet(pcis->vec1_global,0.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1498,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1499 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec2_D,pcis->vec1_global,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1499,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1500 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec2_D,pcis->vec1_global,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1500,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1501 | ierr = MatMult(pcbddc->ChangeOfBasisMatrix,pcis->vec1_global,x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1501,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1502 | } else { | |||
1503 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec2_D,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1503,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1504 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec2_D,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1504,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1505 | } | |||
1506 | if (ksp) { | |||
1507 | ierr = KSPSetInitialGuessNonzero(ksp,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1507,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1508 | } | |||
1509 | pcbddc->exact_dirichlet_trick_app = PETSC_TRUE; | |||
1510 | } else if (pcbddc->ChangeOfBasisMatrix && pcbddc->change_interior && benign_correction_computed && pcbddc->use_exact_dirichlet_trick) { | |||
1511 | ierr = VecLockReadPop(pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1511,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1512 | } | |||
1513 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1514 | } | |||
1515 | ||||
1516 | /* | |||
1517 | PCPostSolve_BDDC - Changes the computed solution if a transformation of basis | |||
1518 | approach has been selected. Also, restores rhs to its original state. | |||
1519 | ||||
1520 | Input Parameter: | |||
1521 | + pc - the preconditioner contex | |||
1522 | ||||
1523 | Application Interface Routine: PCPostSolve() | |||
1524 | ||||
1525 | Notes: | |||
1526 | The interface routine PCPostSolve() is not usually called directly by | |||
1527 | the user, but instead is called by KSPSolve(). | |||
1528 | */ | |||
1529 | static PetscErrorCode PCPostSolve_BDDC(PC pc, KSP ksp, Vec rhs, Vec x) | |||
1530 | { | |||
1531 | PetscErrorCode ierr; | |||
1532 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
1533 | ||||
1534 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1534; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1535 | /* add solution removed in presolve */ | |||
1536 | if (x && pcbddc->rhs_change) { | |||
1537 | if (pcbddc->temp_solution_used) { | |||
1538 | ierr = VecAXPY(x,1.0,pcbddc->temp_solution);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1538,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1539 | } else if (pcbddc->benign_compute_correction && pcbddc->benign_vec) { | |||
1540 | ierr = VecAXPY(x,-1.0,pcbddc->benign_vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1540,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1541 | } | |||
1542 | /* restore to original state (not for FETI-DP) */ | |||
1543 | if (ksp) pcbddc->temp_solution_used = PETSC_FALSE; | |||
1544 | } | |||
1545 | ||||
1546 | /* restore rhs to its original state (not needed for FETI-DP) */ | |||
1547 | if (rhs && pcbddc->rhs_change) { | |||
1548 | ierr = VecSwap(rhs,pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1548,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1549 | pcbddc->rhs_change = PETSC_FALSE; | |||
1550 | } | |||
1551 | /* restore ksp guess state */ | |||
1552 | if (ksp) { | |||
1553 | ierr = KSPSetInitialGuessNonzero(ksp,pcbddc->ksp_guess_nonzero);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1553,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1554 | /* reset flag for exact dirichlet trick */ | |||
1555 | pcbddc->exact_dirichlet_trick_app = PETSC_FALSE; | |||
1556 | } | |||
1557 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1558 | } | |||
1559 | ||||
1560 | /* | |||
1561 | PCSetUp_BDDC - Prepares for the use of the BDDC preconditioner | |||
1562 | by setting data structures and options. | |||
1563 | ||||
1564 | Input Parameter: | |||
1565 | + pc - the preconditioner context | |||
1566 | ||||
1567 | Application Interface Routine: PCSetUp() | |||
1568 | ||||
1569 | Notes: | |||
1570 | The interface routine PCSetUp() is not usually called directly by | |||
1571 | the user, but instead is called by PCApply() if necessary. | |||
1572 | */ | |||
1573 | PetscErrorCode PCSetUp_BDDC(PC pc) | |||
1574 | { | |||
1575 | PC_BDDC* pcbddc = (PC_BDDC*)pc->data; | |||
1576 | PCBDDCSubSchurs sub_schurs; | |||
1577 | Mat_IS* matis; | |||
1578 | MatNullSpace nearnullspace; | |||
1579 | Mat lA; | |||
1580 | IS lP,zerodiag = NULL((void*)0); | |||
1581 | PetscInt nrows,ncols; | |||
1582 | PetscMPIInt size; | |||
1583 | PetscBool computesubschurs; | |||
1584 | PetscBool computeconstraintsmatrix; | |||
1585 | PetscBool new_nearnullspace_provided,ismatis,rl; | |||
1586 | PetscErrorCode ierr; | |||
1587 | ||||
1588 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1588; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1589 | ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATIS"is",&ismatis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1589,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1590 | if (!ismatis) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"PCBDDC preconditioner requires matrix of type MATIS")return PetscError(PetscObjectComm((PetscObject)pc),1590,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"PCBDDC preconditioner requires matrix of type MATIS" ); | |||
1591 | ierr = MatGetSize(pc->pmat,&nrows,&ncols);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1591,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1592 | if (nrows != ncols) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"PCBDDC preconditioner requires a square preconditioning matrix")return PetscError(PetscObjectComm((PetscObject)pc),1592,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"PCBDDC preconditioner requires a square preconditioning matrix" ); | |||
1593 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1593,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1594 | ||||
1595 | matis = (Mat_IS*)pc->pmat->data; | |||
1596 | /* the following lines of code should be replaced by a better logic between PCIS, PCNN, PCBDDC and other future nonoverlapping preconditioners */ | |||
1597 | /* For BDDC we need to define a local "Neumann" problem different to that defined in PCISSetup | |||
1598 | Also, BDDC builds its own KSP for the Dirichlet problem */ | |||
1599 | rl = pcbddc->recompute_topography; | |||
1600 | if (!pc->setupcalled || pc->flag == DIFFERENT_NONZERO_PATTERN) rl = PETSC_TRUE; | |||
1601 | ierr = MPIU_Allreduce(&rl,&pcbddc->recompute_topography,1,MPIU_BOOL,MPI_LOR,PetscObjectComm((PetscObject)pc))(PetscAllreduceBarrierCheck(PetscObjectComm((PetscObject)pc), 1,1601,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((&rl),(&pcbddc ->recompute_topography),(1),(MPIU_BOOL),((MPI_Op)(0x58000007 )),(PetscObjectComm((PetscObject)pc)))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1601,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1602 | if (pcbddc->recompute_topography) { | |||
1603 | pcbddc->graphanalyzed = PETSC_FALSE; | |||
1604 | computeconstraintsmatrix = PETSC_TRUE; | |||
1605 | } else { | |||
1606 | computeconstraintsmatrix = PETSC_FALSE; | |||
1607 | } | |||
1608 | ||||
1609 | /* check parameters' compatibility */ | |||
1610 | if (!pcbddc->use_deluxe_scaling) pcbddc->deluxe_zerorows = PETSC_FALSE; | |||
1611 | pcbddc->adaptive_selection = (PetscBool)(pcbddc->adaptive_threshold[0] != 0.0 || pcbddc->adaptive_threshold[1] != 0.0); | |||
1612 | pcbddc->use_deluxe_scaling = (PetscBool)(pcbddc->use_deluxe_scaling && size > 1); | |||
1613 | pcbddc->adaptive_selection = (PetscBool)(pcbddc->adaptive_selection && size > 1); | |||
1614 | pcbddc->adaptive_userdefined = (PetscBool)(pcbddc->adaptive_selection && pcbddc->adaptive_userdefined); | |||
1615 | if (pcbddc->adaptive_selection) pcbddc->use_faces = PETSC_TRUE; | |||
1616 | ||||
1617 | computesubschurs = (PetscBool)(pcbddc->adaptive_selection || pcbddc->use_deluxe_scaling); | |||
1618 | ||||
1619 | /* activate all connected components if the netflux has been requested */ | |||
1620 | if (pcbddc->compute_nonetflux) { | |||
1621 | pcbddc->use_vertices = PETSC_TRUE; | |||
1622 | pcbddc->use_edges = PETSC_TRUE; | |||
1623 | pcbddc->use_faces = PETSC_TRUE; | |||
1624 | } | |||
1625 | ||||
1626 | /* Get stdout for dbg */ | |||
1627 | if (pcbddc->dbg_flag) { | |||
1628 | if (!pcbddc->dbg_viewer) { | |||
1629 | pcbddc->dbg_viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)pc)); | |||
1630 | } | |||
1631 | ierr = PetscViewerASCIIPushSynchronized(pcbddc->dbg_viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1631,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1632 | ierr = PetscViewerASCIIAddTab(pcbddc->dbg_viewer,2*pcbddc->current_level);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1632,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1633 | } | |||
1634 | ||||
1635 | /* process topology information */ | |||
1636 | ierr = PetscLogEventBegin(PC_BDDC_Topology[pcbddc->current_level],pc,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [PC_BDDC_Topology[pcbddc->current_level]].active) ? (*PetscLogPLB )((PC_BDDC_Topology[pcbddc->current_level]),0,(PetscObject )(pc),(PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1636,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1637 | if (pcbddc->recompute_topography) { | |||
1638 | ierr = PCBDDCComputeLocalTopologyInfo(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1638,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1639 | if (pcbddc->discretegradient) { | |||
1640 | ierr = PCBDDCNedelecSupport(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1640,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1641 | } | |||
1642 | } | |||
1643 | if (pcbddc->corner_selected) pcbddc->use_vertices = PETSC_TRUE; | |||
1644 | ||||
1645 | /* change basis if requested by the user */ | |||
1646 | if (pcbddc->user_ChangeOfBasisMatrix) { | |||
1647 | /* use_change_of_basis flag is used to automatically compute a change of basis from constraints */ | |||
1648 | pcbddc->use_change_of_basis = PETSC_FALSE; | |||
1649 | ierr = PCBDDCComputeLocalMatrix(pc,pcbddc->user_ChangeOfBasisMatrix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1649,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1650 | } else { | |||
1651 | ierr = MatDestroy(&pcbddc->local_mat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1651,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1652 | ierr = PetscObjectReference((PetscObject)matis->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1652,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1653 | pcbddc->local_mat = matis->A; | |||
1654 | } | |||
1655 | ||||
1656 | /* | |||
1657 | Compute change of basis on local pressures (aka zerodiag dofs) with the benign trick | |||
1658 | This should come earlier then PCISSetUp for extracting the correct subdomain matrices | |||
1659 | */ | |||
1660 | ierr = PCBDDCBenignShellMat(pc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1660,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1661 | if (pcbddc->benign_saddle_point) { | |||
1662 | PC_IS* pcis = (PC_IS*)pc->data; | |||
1663 | ||||
1664 | if (pcbddc->user_ChangeOfBasisMatrix || pcbddc->use_change_of_basis || !computesubschurs) pcbddc->benign_change_explicit = PETSC_TRUE; | |||
1665 | /* detect local saddle point and change the basis in pcbddc->local_mat */ | |||
1666 | ierr = PCBDDCBenignDetectSaddlePoint(pc,(PetscBool)(!pcbddc->recompute_topography),&zerodiag);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1666,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1667 | /* pop B0 mat from local mat */ | |||
1668 | ierr = PCBDDCBenignPopOrPushB0(pc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1668,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1669 | /* give pcis a hint to not reuse submatrices during PCISCreate */ | |||
1670 | if (pc->flag == SAME_NONZERO_PATTERN && pcis->reusesubmatrices == PETSC_TRUE) { | |||
1671 | if (pcbddc->benign_n && (pcbddc->benign_change_explicit || pcbddc->dbg_flag)) { | |||
1672 | pcis->reusesubmatrices = PETSC_FALSE; | |||
1673 | } else { | |||
1674 | pcis->reusesubmatrices = PETSC_TRUE; | |||
1675 | } | |||
1676 | } else { | |||
1677 | pcis->reusesubmatrices = PETSC_FALSE; | |||
1678 | } | |||
1679 | } | |||
1680 | ||||
1681 | /* propagate relevant information */ | |||
1682 | if (matis->A->symmetric_set) { | |||
1683 | ierr = MatSetOption(pcbddc->local_mat,MAT_SYMMETRIC,matis->A->symmetric);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1683,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1684 | } | |||
1685 | if (matis->A->spd_set) { | |||
1686 | ierr = MatSetOption(pcbddc->local_mat,MAT_SPD,matis->A->spd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1686,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1687 | } | |||
1688 | ||||
1689 | /* Set up all the "iterative substructuring" common block without computing solvers */ | |||
1690 | { | |||
1691 | Mat temp_mat; | |||
1692 | ||||
1693 | temp_mat = matis->A; | |||
1694 | matis->A = pcbddc->local_mat; | |||
1695 | ierr = PCISSetUp(pc,PETSC_TRUE,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1695,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1696 | pcbddc->local_mat = matis->A; | |||
1697 | matis->A = temp_mat; | |||
1698 | } | |||
1699 | ||||
1700 | /* Analyze interface */ | |||
1701 | if (!pcbddc->graphanalyzed) { | |||
1702 | ierr = PCBDDCAnalyzeInterface(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1702,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1703 | computeconstraintsmatrix = PETSC_TRUE; | |||
1704 | if (pcbddc->adaptive_selection && !pcbddc->use_deluxe_scaling && !pcbddc->mat_graph->twodim) { | |||
1705 | SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Cannot compute the adaptive primal space for a problem with 3D edges without deluxe scaling")return PetscError(PetscObjectComm((PetscObject)pc),1705,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Cannot compute the adaptive primal space for a problem with 3D edges without deluxe scaling" ); | |||
1706 | } | |||
1707 | if (pcbddc->compute_nonetflux) { | |||
1708 | MatNullSpace nnfnnsp; | |||
1709 | ||||
1710 | if (!pcbddc->divudotp) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Missing divudotp operator")return PetscError(PetscObjectComm((PetscObject)pc),1710,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Missing divudotp operator"); | |||
1711 | ierr = PCBDDCComputeNoNetFlux(pc->pmat,pcbddc->divudotp,pcbddc->divudotp_trans,pcbddc->divudotp_vl2l,pcbddc->mat_graph,&nnfnnsp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1711,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1712 | /* TODO what if a nearnullspace is already attached? */ | |||
1713 | if (nnfnnsp) { | |||
1714 | ierr = MatSetNearNullSpace(pc->pmat,nnfnnsp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1714,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1715 | ierr = MatNullSpaceDestroy(&nnfnnsp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1715,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1716 | } | |||
1717 | } | |||
1718 | } | |||
1719 | ierr = PetscLogEventEnd(PC_BDDC_Topology[pcbddc->current_level],pc,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [PC_BDDC_Topology[pcbddc->current_level]].active) ? (*PetscLogPLE )((PC_BDDC_Topology[pcbddc->current_level]),0,(PetscObject )(pc),(PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1719,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1720 | ||||
1721 | /* check existence of a divergence free extension, i.e. | |||
1722 | b(v_I,p_0) = 0 for all v_I (raise error if not). | |||
1723 | Also, check that PCBDDCBenignGetOrSetP0 works */ | |||
1724 | if (pcbddc->benign_saddle_point && pcbddc->dbg_flag > 1) { | |||
1725 | ierr = PCBDDCBenignCheck(pc,zerodiag);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1725,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1726 | } | |||
1727 | ierr = ISDestroy(&zerodiag);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1727,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1728 | ||||
1729 | /* Setup local dirichlet solver ksp_D and sub_schurs solvers */ | |||
1730 | if (computesubschurs && pcbddc->recompute_topography) { | |||
1731 | ierr = PCBDDCInitSubSchurs(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1731,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1732 | } | |||
1733 | /* SetUp Scaling operator (scaling matrices could be needed in SubSchursSetUp)*/ | |||
1734 | if (!pcbddc->use_deluxe_scaling) { | |||
1735 | ierr = PCBDDCScalingSetUp(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1735,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1736 | } | |||
1737 | ||||
1738 | /* finish setup solvers and do adaptive selection of constraints */ | |||
1739 | sub_schurs = pcbddc->sub_schurs; | |||
1740 | if (sub_schurs && sub_schurs->schur_explicit) { | |||
1741 | if (computesubschurs) { | |||
1742 | ierr = PCBDDCSetUpSubSchurs(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1742,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1743 | } | |||
1744 | ierr = PCBDDCSetUpLocalSolvers(pc,PETSC_TRUE,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1744,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1745 | } else { | |||
1746 | ierr = PCBDDCSetUpLocalSolvers(pc,PETSC_TRUE,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1746,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1747 | if (computesubschurs) { | |||
1748 | ierr = PCBDDCSetUpSubSchurs(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1748,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1749 | } | |||
1750 | } | |||
1751 | if (pcbddc->adaptive_selection) { | |||
1752 | ierr = PCBDDCAdaptiveSelection(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1752,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1753 | computeconstraintsmatrix = PETSC_TRUE; | |||
1754 | } | |||
1755 | ||||
1756 | /* infer if NullSpace object attached to Mat via MatSetNearNullSpace has changed */ | |||
1757 | new_nearnullspace_provided = PETSC_FALSE; | |||
1758 | ierr = MatGetNearNullSpace(pc->pmat,&nearnullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1758,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1759 | if (pcbddc->onearnullspace) { /* already used nearnullspace */ | |||
1760 | if (!nearnullspace) { /* near null space attached to mat has been destroyed */ | |||
1761 | new_nearnullspace_provided = PETSC_TRUE; | |||
1762 | } else { | |||
1763 | /* determine if the two nullspaces are different (should be lightweight) */ | |||
1764 | if (nearnullspace != pcbddc->onearnullspace) { | |||
1765 | new_nearnullspace_provided = PETSC_TRUE; | |||
1766 | } else { /* maybe the user has changed the content of the nearnullspace so check vectors ObjectStateId */ | |||
1767 | PetscInt i; | |||
1768 | const Vec *nearnullvecs; | |||
1769 | PetscObjectState state; | |||
1770 | PetscInt nnsp_size; | |||
1771 | ierr = MatNullSpaceGetVecs(nearnullspace,NULL((void*)0),&nnsp_size,&nearnullvecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1771,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1772 | for (i=0;i<nnsp_size;i++) { | |||
1773 | ierr = PetscObjectStateGet((PetscObject)nearnullvecs[i],&state);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1773,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1774 | if (pcbddc->onearnullvecs_state[i] != state) { | |||
1775 | new_nearnullspace_provided = PETSC_TRUE; | |||
1776 | break; | |||
1777 | } | |||
1778 | } | |||
1779 | } | |||
1780 | } | |||
1781 | } else { | |||
1782 | if (!nearnullspace) { /* both nearnullspaces are null */ | |||
1783 | new_nearnullspace_provided = PETSC_FALSE; | |||
1784 | } else { /* nearnullspace attached later */ | |||
1785 | new_nearnullspace_provided = PETSC_TRUE; | |||
1786 | } | |||
1787 | } | |||
1788 | ||||
1789 | /* Setup constraints and related work vectors */ | |||
1790 | /* reset primal space flags */ | |||
1791 | ierr = PetscLogEventBegin(PC_BDDC_LocalWork[pcbddc->current_level],pc,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [PC_BDDC_LocalWork[pcbddc->current_level]].active) ? (*PetscLogPLB )((PC_BDDC_LocalWork[pcbddc->current_level]),0,(PetscObject )(pc),(PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1791,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1792 | pcbddc->new_primal_space = PETSC_FALSE; | |||
1793 | pcbddc->new_primal_space_local = PETSC_FALSE; | |||
1794 | if (computeconstraintsmatrix || new_nearnullspace_provided) { | |||
1795 | /* It also sets the primal space flags */ | |||
1796 | ierr = PCBDDCConstraintsSetUp(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1796,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1797 | } | |||
1798 | /* Allocate needed local vectors (which depends on quantities defined during ConstraintsSetUp) */ | |||
1799 | ierr = PCBDDCSetUpLocalWorkVectors(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1799,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1800 | ||||
1801 | if (pcbddc->use_change_of_basis) { | |||
1802 | PC_IS *pcis = (PC_IS*)(pc->data); | |||
1803 | ||||
1804 | ierr = PCBDDCComputeLocalMatrix(pc,pcbddc->ChangeOfBasisMatrix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1804,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1805 | if (pcbddc->benign_change) { | |||
1806 | ierr = MatDestroy(&pcbddc->benign_B0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1806,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1807 | /* pop B0 from pcbddc->local_mat */ | |||
1808 | ierr = PCBDDCBenignPopOrPushB0(pc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1808,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1809 | } | |||
1810 | /* get submatrices */ | |||
1811 | ierr = MatDestroy(&pcis->A_IB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1811,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1812 | ierr = MatDestroy(&pcis->A_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1812,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1813 | ierr = MatDestroy(&pcis->A_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1813,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1814 | ierr = MatCreateSubMatrix(pcbddc->local_mat,pcis->is_B_local,pcis->is_B_local,MAT_INITIAL_MATRIX,&pcis->A_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1815 | ierr = MatCreateSubMatrix(pcbddc->local_mat,pcis->is_I_local,pcis->is_B_local,MAT_INITIAL_MATRIX,&pcis->A_IB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1815,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1816 | ierr = MatCreateSubMatrix(pcbddc->local_mat,pcis->is_B_local,pcis->is_I_local,MAT_INITIAL_MATRIX,&pcis->A_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1816,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1817 | /* set flag in pcis to not reuse submatrices during PCISCreate */ | |||
1818 | pcis->reusesubmatrices = PETSC_FALSE; | |||
1819 | } else if (!pcbddc->user_ChangeOfBasisMatrix && !pcbddc->benign_change) { | |||
1820 | ierr = MatDestroy(&pcbddc->local_mat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1820,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1821 | ierr = PetscObjectReference((PetscObject)matis->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1821,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1822 | pcbddc->local_mat = matis->A; | |||
1823 | } | |||
1824 | ||||
1825 | /* interface pressure block row for B_C */ | |||
1826 | ierr = PetscObjectQuery((PetscObject)pc,"__KSPFETIDP_lP" ,(PetscObject*)&lP);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1826,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1827 | ierr = PetscObjectQuery((PetscObject)pc,"__KSPFETIDP_lA" ,(PetscObject*)&lA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1827,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1828 | if (lA && lP) { | |||
1829 | PC_IS* pcis = (PC_IS*)pc->data; | |||
1830 | Mat B_BI,B_BB,Bt_BI,Bt_BB; | |||
1831 | PetscBool issym; | |||
1832 | ierr = MatIsSymmetric(lA,PETSC_SMALL1.e-10,&issym);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1832,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1833 | if (issym) { | |||
1834 | ierr = MatCreateSubMatrix(lA,lP,pcis->is_I_local,MAT_INITIAL_MATRIX,&B_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1834,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1835 | ierr = MatCreateSubMatrix(lA,lP,pcis->is_B_local,MAT_INITIAL_MATRIX,&B_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1835,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1836 | ierr = MatCreateTranspose(B_BI,&Bt_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1836,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1837 | ierr = MatCreateTranspose(B_BB,&Bt_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1837,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1838 | } else { | |||
1839 | ierr = MatCreateSubMatrix(lA,lP,pcis->is_I_local,MAT_INITIAL_MATRIX,&B_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1839,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1840 | ierr = MatCreateSubMatrix(lA,lP,pcis->is_B_local,MAT_INITIAL_MATRIX,&B_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1840,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1841 | ierr = MatCreateSubMatrix(lA,pcis->is_I_local,lP,MAT_INITIAL_MATRIX,&Bt_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1841,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1842 | ierr = MatCreateSubMatrix(lA,pcis->is_B_local,lP,MAT_INITIAL_MATRIX,&Bt_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1842,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1843 | } | |||
1844 | ierr = PetscObjectCompose((PetscObject)pc,"__KSPFETIDP_B_BI",(PetscObject)B_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1844,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1845 | ierr = PetscObjectCompose((PetscObject)pc,"__KSPFETIDP_B_BB",(PetscObject)B_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1845,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1846 | ierr = PetscObjectCompose((PetscObject)pc,"__KSPFETIDP_Bt_BI",(PetscObject)Bt_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1846,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1847 | ierr = PetscObjectCompose((PetscObject)pc,"__KSPFETIDP_Bt_BB",(PetscObject)Bt_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1847,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1848 | ierr = MatDestroy(&B_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1848,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1849 | ierr = MatDestroy(&B_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1849,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1850 | ierr = MatDestroy(&Bt_BI);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1850,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1851 | ierr = MatDestroy(&Bt_BB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1851,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1852 | } | |||
1853 | ierr = PetscLogEventEnd(PC_BDDC_LocalWork[pcbddc->current_level],pc,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [PC_BDDC_LocalWork[pcbddc->current_level]].active) ? (*PetscLogPLE )((PC_BDDC_LocalWork[pcbddc->current_level]),0,(PetscObject )(pc),(PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1853,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1854 | ||||
1855 | /* SetUp coarse and local Neumann solvers */ | |||
1856 | ierr = PCBDDCSetUpSolvers(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1856,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1857 | /* SetUp Scaling operator */ | |||
1858 | if (pcbddc->use_deluxe_scaling) { | |||
1859 | ierr = PCBDDCScalingSetUp(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1859,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1860 | } | |||
1861 | ||||
1862 | /* mark topography as done */ | |||
1863 | pcbddc->recompute_topography = PETSC_FALSE; | |||
1864 | ||||
1865 | /* wrap pcis->A_IB and pcis->A_BI if we did not change explicitly the variables on the pressures */ | |||
1866 | ierr = PCBDDCBenignShellMat(pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1866,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1867 | ||||
1868 | if (pcbddc->dbg_flag) { | |||
1869 | ierr = PetscViewerASCIISubtractTab(pcbddc->dbg_viewer,2*pcbddc->current_level);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1869,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1870 | ierr = PetscViewerASCIIPopSynchronized(pcbddc->dbg_viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1870,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1871 | } | |||
1872 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1873 | } | |||
1874 | ||||
1875 | /* | |||
1876 | PCApply_BDDC - Applies the BDDC operator to a vector. | |||
1877 | ||||
1878 | Input Parameters: | |||
1879 | + pc - the preconditioner context | |||
1880 | - r - input vector (global) | |||
1881 | ||||
1882 | Output Parameter: | |||
1883 | . z - output vector (global) | |||
1884 | ||||
1885 | Application Interface Routine: PCApply() | |||
1886 | */ | |||
1887 | PetscErrorCode PCApply_BDDC(PC pc,Vec r,Vec z) | |||
1888 | { | |||
1889 | PC_IS *pcis = (PC_IS*)(pc->data); | |||
1890 | PC_BDDC *pcbddc = (PC_BDDC*)(pc->data); | |||
1891 | Mat lA = NULL((void*)0); | |||
1892 | PetscInt n_B = pcis->n_B, n_D = pcis->n - n_B; | |||
1893 | PetscErrorCode ierr; | |||
1894 | const PetscScalar one = 1.0; | |||
1895 | const PetscScalar m_one = -1.0; | |||
1896 | const PetscScalar zero = 0.0; | |||
1897 | /* This code is similar to that provided in nn.c for PCNN | |||
1898 | NN interface preconditioner changed to BDDC | |||
1899 | Added support for M_3 preconditioner in the reference article (code is active if pcbddc->switch_static == PETSC_TRUE) */ | |||
1900 | ||||
1901 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 1901; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1902 | ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1902,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1903 | if (pcbddc->switch_static) { | |||
1904 | ierr = MatISGetLocalMat(pc->useAmat ? pc->mat : pc->pmat,&lA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1904,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1905 | } | |||
1906 | ||||
1907 | if (pcbddc->ChangeOfBasisMatrix) { | |||
1908 | Vec swap; | |||
1909 | ||||
1910 | ierr = MatMultTranspose(pcbddc->ChangeOfBasisMatrix,r,pcbddc->work_change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1910,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1911 | swap = pcbddc->work_change; | |||
1912 | pcbddc->work_change = r; | |||
1913 | r = swap; | |||
1914 | /* save rhs so that we don't need to apply the change of basis for the exact dirichlet trick in PreSolve */ | |||
1915 | if (pcbddc->benign_apply_coarse_only && pcbddc->use_exact_dirichlet_trick && pcbddc->change_interior) { | |||
1916 | ierr = VecCopy(r,pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1916,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1917 | ierr = VecLockReadPush(pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1917,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1918 | } | |||
1919 | } | |||
1920 | if (pcbddc->benign_have_null) { /* get p0 from r */ | |||
1921 | ierr = PCBDDCBenignGetOrSetP0(pc,r,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1921,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1922 | } | |||
1923 | if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { | |||
1924 | ierr = VecCopy(r,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1924,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1925 | /* First Dirichlet solve */ | |||
1926 | ierr = VecScatterBegin(pcis->global_to_D,r,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1926,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1927 | ierr = VecScatterEnd(pcis->global_to_D,r,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1927,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1928 | /* | |||
1929 | Assembling right hand side for BDDC operator | |||
1930 | - pcis->vec1_D for the Dirichlet part (if needed, i.e. pcbddc->switch_static == PETSC_TRUE) | |||
1931 | - pcis->vec1_B the interface part of the global vector z | |||
1932 | */ | |||
1933 | if (n_D) { | |||
1934 | ierr = KSPSolve(pcbddc->ksp_D,pcis->vec1_D,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1934,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1935 | ierr = KSPCheckSolve(pcbddc->ksp_D,pc,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1935,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1936 | ierr = VecScale(pcis->vec2_D,m_one);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1936,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1937 | if (pcbddc->switch_static) { | |||
1938 | ierr = VecSet(pcis->vec1_N,0.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1938,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1939 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1939,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1940 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1940,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1941 | if (!pcbddc->switch_static_change) { | |||
1942 | ierr = MatMult(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1942,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1943 | } else { | |||
1944 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1944,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1945 | ierr = MatMult(lA,pcis->vec2_N,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1945,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1946 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1946,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1947 | } | |||
1948 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_N,pcis->vec1_D,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1948,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1949 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_N,pcis->vec1_D,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1949,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1950 | ierr = VecScatterBegin(pcis->N_to_B,pcis->vec2_N,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1950,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1951 | ierr = VecScatterEnd(pcis->N_to_B,pcis->vec2_N,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1951,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1952 | } else { | |||
1953 | ierr = MatMult(pcis->A_BI,pcis->vec2_D,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1953,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1954 | } | |||
1955 | } else { | |||
1956 | ierr = VecSet(pcis->vec1_B,zero);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1956,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1957 | } | |||
1958 | ierr = VecScatterBegin(pcis->global_to_B,pcis->vec1_B,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1958,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1959 | ierr = VecScatterEnd(pcis->global_to_B,pcis->vec1_B,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1959,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1960 | ierr = PCBDDCScalingRestriction(pc,z,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1960,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1961 | } else { | |||
1962 | if (!pcbddc->benign_apply_coarse_only) { | |||
1963 | ierr = PCBDDCScalingRestriction(pc,r,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1963,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1964 | } | |||
1965 | } | |||
1966 | ||||
1967 | /* Apply interface preconditioner | |||
1968 | input/output vecs: pcis->vec1_B and pcis->vec1_D */ | |||
1969 | ierr = PCBDDCApplyInterfacePreconditioner(pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1969,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1970 | ||||
1971 | /* Apply transpose of partition of unity operator */ | |||
1972 | ierr = PCBDDCScalingExtension(pc,pcis->vec1_B,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1972,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1973 | ||||
1974 | /* Second Dirichlet solve and assembling of output */ | |||
1975 | ierr = VecScatterBegin(pcis->global_to_B,z,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1975,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1976 | ierr = VecScatterEnd(pcis->global_to_B,z,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1976,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1977 | if (n_B) { | |||
1978 | if (pcbddc->switch_static) { | |||
1979 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec1_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1979,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1980 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec1_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1980,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1981 | ierr = VecScatterBegin(pcis->N_to_B,pcis->vec1_B,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1981,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1982 | ierr = VecScatterEnd(pcis->N_to_B,pcis->vec1_B,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1982,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1983 | if (!pcbddc->switch_static_change) { | |||
1984 | ierr = MatMult(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1984,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1985 | } else { | |||
1986 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1986,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1987 | ierr = MatMult(lA,pcis->vec2_N,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1987,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1988 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1988,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1989 | } | |||
1990 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_N,pcis->vec3_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1990,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1991 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_N,pcis->vec3_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1991,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1992 | } else { | |||
1993 | ierr = MatMult(pcis->A_IB,pcis->vec1_B,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1993,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1994 | } | |||
1995 | } else if (pcbddc->switch_static) { /* n_B is zero */ | |||
1996 | if (!pcbddc->switch_static_change) { | |||
1997 | ierr = MatMult(lA,pcis->vec1_D,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1997,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1998 | } else { | |||
1999 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_D,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1999,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2000 | ierr = MatMult(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2000,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2001 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec2_N,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2001,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2002 | } | |||
2003 | } | |||
2004 | ierr = KSPSolve(pcbddc->ksp_D,pcis->vec3_D,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2004,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2005 | ierr = KSPCheckSolve(pcbddc->ksp_D,pc,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2005,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2006 | ||||
2007 | if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { | |||
2008 | if (pcbddc->switch_static) { | |||
2009 | ierr = VecAXPBYPCZ(pcis->vec2_D,m_one,one,m_one,pcis->vec4_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2009,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2010 | } else { | |||
2011 | ierr = VecAXPBY(pcis->vec2_D,m_one,m_one,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2011,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2012 | } | |||
2013 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec2_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2013,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2014 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec2_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2014,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2015 | } else { | |||
2016 | if (pcbddc->switch_static) { | |||
2017 | ierr = VecAXPBY(pcis->vec4_D,one,m_one,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2017,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2018 | } else { | |||
2019 | ierr = VecScale(pcis->vec4_D,m_one);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2019,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2020 | } | |||
2021 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec4_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2021,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2022 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec4_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2022,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2023 | } | |||
2024 | if (pcbddc->benign_have_null) { /* set p0 (computed in PCBDDCApplyInterface) */ | |||
2025 | if (pcbddc->benign_apply_coarse_only) { | |||
2026 | ierr = PetscArrayzero(pcbddc->benign_p0,pcbddc->benign_n)PetscMemzero(pcbddc->benign_p0,(pcbddc->benign_n)*sizeof (*(pcbddc->benign_p0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2026,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2027 | } | |||
2028 | ierr = PCBDDCBenignGetOrSetP0(pc,z,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2028,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2029 | } | |||
2030 | ||||
2031 | if (pcbddc->ChangeOfBasisMatrix) { | |||
2032 | pcbddc->work_change = r; | |||
2033 | ierr = VecCopy(z,pcbddc->work_change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2033,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2034 | ierr = MatMult(pcbddc->ChangeOfBasisMatrix,pcbddc->work_change,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2034,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2035 | } | |||
2036 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2037 | } | |||
2038 | ||||
2039 | /* | |||
2040 | PCApplyTranspose_BDDC - Applies the transpose of the BDDC operator to a vector. | |||
2041 | ||||
2042 | Input Parameters: | |||
2043 | + pc - the preconditioner context | |||
2044 | - r - input vector (global) | |||
2045 | ||||
2046 | Output Parameter: | |||
2047 | . z - output vector (global) | |||
2048 | ||||
2049 | Application Interface Routine: PCApplyTranspose() | |||
2050 | */ | |||
2051 | PetscErrorCode PCApplyTranspose_BDDC(PC pc,Vec r,Vec z) | |||
2052 | { | |||
2053 | PC_IS *pcis = (PC_IS*)(pc->data); | |||
2054 | PC_BDDC *pcbddc = (PC_BDDC*)(pc->data); | |||
2055 | Mat lA = NULL((void*)0); | |||
2056 | PetscInt n_B = pcis->n_B, n_D = pcis->n - n_B; | |||
2057 | PetscErrorCode ierr; | |||
2058 | const PetscScalar one = 1.0; | |||
2059 | const PetscScalar m_one = -1.0; | |||
2060 | const PetscScalar zero = 0.0; | |||
2061 | ||||
2062 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2062; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2063 | ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2063,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2064 | if (pcbddc->switch_static) { | |||
2065 | ierr = MatISGetLocalMat(pc->useAmat ? pc->mat : pc->pmat,&lA);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2065,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2066 | } | |||
2067 | if (pcbddc->ChangeOfBasisMatrix) { | |||
2068 | Vec swap; | |||
2069 | ||||
2070 | ierr = MatMultTranspose(pcbddc->ChangeOfBasisMatrix,r,pcbddc->work_change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2070,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2071 | swap = pcbddc->work_change; | |||
2072 | pcbddc->work_change = r; | |||
2073 | r = swap; | |||
2074 | /* save rhs so that we don't need to apply the change of basis for the exact dirichlet trick in PreSolve */ | |||
2075 | if (pcbddc->benign_apply_coarse_only && pcbddc->exact_dirichlet_trick_app && pcbddc->change_interior) { | |||
2076 | ierr = VecCopy(r,pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2076,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2077 | ierr = VecLockReadPush(pcis->vec1_global);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2077,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2078 | } | |||
2079 | } | |||
2080 | if (pcbddc->benign_have_null) { /* get p0 from r */ | |||
2081 | ierr = PCBDDCBenignGetOrSetP0(pc,r,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2081,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2082 | } | |||
2083 | if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { | |||
2084 | ierr = VecCopy(r,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2084,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2085 | /* First Dirichlet solve */ | |||
2086 | ierr = VecScatterBegin(pcis->global_to_D,r,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2086,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2087 | ierr = VecScatterEnd(pcis->global_to_D,r,pcis->vec1_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2087,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2088 | /* | |||
2089 | Assembling right hand side for BDDC operator | |||
2090 | - pcis->vec1_D for the Dirichlet part (if needed, i.e. pcbddc->switch_static == PETSC_TRUE) | |||
2091 | - pcis->vec1_B the interface part of the global vector z | |||
2092 | */ | |||
2093 | if (n_D) { | |||
2094 | ierr = KSPSolveTranspose(pcbddc->ksp_D,pcis->vec1_D,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2094,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2095 | ierr = KSPCheckSolve(pcbddc->ksp_D,pc,pcis->vec2_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2095,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2096 | ierr = VecScale(pcis->vec2_D,m_one);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2096,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2097 | if (pcbddc->switch_static) { | |||
2098 | ierr = VecSet(pcis->vec1_N,0.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2098,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2099 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2099,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2100 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2100,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2101 | if (!pcbddc->switch_static_change) { | |||
2102 | ierr = MatMultTranspose(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2102,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2103 | } else { | |||
2104 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2104,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2105 | ierr = MatMultTranspose(lA,pcis->vec2_N,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2105,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2106 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2106,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2107 | } | |||
2108 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_N,pcis->vec1_D,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2108,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2109 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_N,pcis->vec1_D,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2109,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2110 | ierr = VecScatterBegin(pcis->N_to_B,pcis->vec2_N,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2110,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2111 | ierr = VecScatterEnd(pcis->N_to_B,pcis->vec2_N,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2111,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2112 | } else { | |||
2113 | ierr = MatMultTranspose(pcis->A_IB,pcis->vec2_D,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2113,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2114 | } | |||
2115 | } else { | |||
2116 | ierr = VecSet(pcis->vec1_B,zero);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2116,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2117 | } | |||
2118 | ierr = VecScatterBegin(pcis->global_to_B,pcis->vec1_B,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2118,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2119 | ierr = VecScatterEnd(pcis->global_to_B,pcis->vec1_B,z,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2119,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2120 | ierr = PCBDDCScalingRestriction(pc,z,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2120,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2121 | } else { | |||
2122 | ierr = PCBDDCScalingRestriction(pc,r,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2122,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2123 | } | |||
2124 | ||||
2125 | /* Apply interface preconditioner | |||
2126 | input/output vecs: pcis->vec1_B and pcis->vec1_D */ | |||
2127 | ierr = PCBDDCApplyInterfacePreconditioner(pc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2127,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2128 | ||||
2129 | /* Apply transpose of partition of unity operator */ | |||
2130 | ierr = PCBDDCScalingExtension(pc,pcis->vec1_B,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2130,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2131 | ||||
2132 | /* Second Dirichlet solve and assembling of output */ | |||
2133 | ierr = VecScatterBegin(pcis->global_to_B,z,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2133,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2134 | ierr = VecScatterEnd(pcis->global_to_B,z,pcis->vec1_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2134,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2135 | if (n_B) { | |||
2136 | if (pcbddc->switch_static) { | |||
2137 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec1_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2137,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2138 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec1_D,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2138,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2139 | ierr = VecScatterBegin(pcis->N_to_B,pcis->vec1_B,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2139,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2140 | ierr = VecScatterEnd(pcis->N_to_B,pcis->vec1_B,pcis->vec1_N,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2140,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2141 | if (!pcbddc->switch_static_change) { | |||
2142 | ierr = MatMultTranspose(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2142,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2143 | } else { | |||
2144 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2144,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2145 | ierr = MatMultTranspose(lA,pcis->vec2_N,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2145,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2146 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2146,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2147 | } | |||
2148 | ierr = VecScatterBegin(pcis->N_to_D,pcis->vec2_N,pcis->vec3_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2148,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2149 | ierr = VecScatterEnd(pcis->N_to_D,pcis->vec2_N,pcis->vec3_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2149,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2150 | } else { | |||
2151 | ierr = MatMultTranspose(pcis->A_BI,pcis->vec1_B,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2151,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2152 | } | |||
2153 | } else if (pcbddc->switch_static) { /* n_B is zero */ | |||
2154 | if (!pcbddc->switch_static_change) { | |||
2155 | ierr = MatMultTranspose(lA,pcis->vec1_D,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2155,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2156 | } else { | |||
2157 | ierr = MatMult(pcbddc->switch_static_change,pcis->vec1_D,pcis->vec1_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2157,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2158 | ierr = MatMultTranspose(lA,pcis->vec1_N,pcis->vec2_N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2158,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2159 | ierr = MatMultTranspose(pcbddc->switch_static_change,pcis->vec2_N,pcis->vec3_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2159,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2160 | } | |||
2161 | } | |||
2162 | ierr = KSPSolveTranspose(pcbddc->ksp_D,pcis->vec3_D,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2162,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2163 | ierr = KSPCheckSolve(pcbddc->ksp_D,pc,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2163,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2164 | if (!pcbddc->exact_dirichlet_trick_app && !pcbddc->benign_apply_coarse_only) { | |||
2165 | if (pcbddc->switch_static) { | |||
2166 | ierr = VecAXPBYPCZ(pcis->vec2_D,m_one,one,m_one,pcis->vec4_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2166,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2167 | } else { | |||
2168 | ierr = VecAXPBY(pcis->vec2_D,m_one,m_one,pcis->vec4_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2168,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2169 | } | |||
2170 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec2_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2170,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2171 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec2_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2171,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2172 | } else { | |||
2173 | if (pcbddc->switch_static) { | |||
2174 | ierr = VecAXPBY(pcis->vec4_D,one,m_one,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2174,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2175 | } else { | |||
2176 | ierr = VecScale(pcis->vec4_D,m_one);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2176,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2177 | } | |||
2178 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec4_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2178,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2179 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec4_D,z,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2179,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2180 | } | |||
2181 | if (pcbddc->benign_have_null) { /* set p0 (computed in PCBDDCApplyInterface) */ | |||
2182 | ierr = PCBDDCBenignGetOrSetP0(pc,z,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2182,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2183 | } | |||
2184 | if (pcbddc->ChangeOfBasisMatrix) { | |||
2185 | pcbddc->work_change = r; | |||
2186 | ierr = VecCopy(z,pcbddc->work_change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2186,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2187 | ierr = MatMult(pcbddc->ChangeOfBasisMatrix,pcbddc->work_change,z);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2187,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2188 | } | |||
2189 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2190 | } | |||
2191 | ||||
2192 | PetscErrorCode PCReset_BDDC(PC pc) | |||
2193 | { | |||
2194 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
2195 | PC_IS *pcis = (PC_IS*)pc->data; | |||
2196 | KSP kspD,kspR,kspC; | |||
2197 | PetscErrorCode ierr; | |||
2198 | ||||
2199 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2199; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2200 | /* free BDDC custom data */ | |||
2201 | ierr = PCBDDCResetCustomization(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2201,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2202 | /* destroy objects related to topography */ | |||
2203 | ierr = PCBDDCResetTopography(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2203,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2204 | /* destroy objects for scaling operator */ | |||
2205 | ierr = PCBDDCScalingDestroy(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2205,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2206 | /* free solvers stuff */ | |||
2207 | ierr = PCBDDCResetSolvers(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2207,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2208 | /* free global vectors needed in presolve */ | |||
2209 | ierr = VecDestroy(&pcbddc->temp_solution);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2209,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2210 | ierr = VecDestroy(&pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2210,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2211 | /* free data created by PCIS */ | |||
2212 | ierr = PCISDestroy(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2212,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2213 | ||||
2214 | /* restore defaults */ | |||
2215 | kspD = pcbddc->ksp_D; | |||
2216 | kspR = pcbddc->ksp_R; | |||
2217 | kspC = pcbddc->coarse_ksp; | |||
2218 | ierr = PetscMemzero(pc->data,sizeof(*pcbddc));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2218,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2219 | pcis->n_neigh = -1; | |||
2220 | pcis->scaling_factor = 1.0; | |||
2221 | pcis->reusesubmatrices = PETSC_TRUE; | |||
2222 | pcbddc->use_local_adj = PETSC_TRUE; | |||
2223 | pcbddc->use_vertices = PETSC_TRUE; | |||
2224 | pcbddc->use_edges = PETSC_TRUE; | |||
2225 | pcbddc->symmetric_primal = PETSC_TRUE; | |||
2226 | pcbddc->vertex_size = 1; | |||
2227 | pcbddc->recompute_topography = PETSC_TRUE; | |||
2228 | pcbddc->coarse_size = -1; | |||
2229 | pcbddc->use_exact_dirichlet_trick = PETSC_TRUE; | |||
2230 | pcbddc->coarsening_ratio = 8; | |||
2231 | pcbddc->coarse_eqs_per_proc = 1; | |||
2232 | pcbddc->benign_compute_correction = PETSC_TRUE; | |||
2233 | pcbddc->nedfield = -1; | |||
2234 | pcbddc->nedglobal = PETSC_TRUE; | |||
2235 | pcbddc->graphmaxcount = PETSC_MAX_INT2147483647; | |||
2236 | pcbddc->sub_schurs_layers = -1; | |||
2237 | pcbddc->ksp_D = kspD; | |||
2238 | pcbddc->ksp_R = kspR; | |||
2239 | pcbddc->coarse_ksp = kspC; | |||
2240 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2241 | } | |||
2242 | ||||
2243 | PetscErrorCode PCDestroy_BDDC(PC pc) | |||
2244 | { | |||
2245 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
2246 | PetscErrorCode ierr; | |||
2247 | ||||
2248 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2248; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2249 | ierr = PCReset_BDDC(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2249,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2250 | ierr = KSPDestroy(&pcbddc->ksp_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2250,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2251 | ierr = KSPDestroy(&pcbddc->ksp_R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2252 | ierr = KSPDestroy(&pcbddc->coarse_ksp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2252,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2253 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDiscreteGradient_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDiscreteGradient_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2253,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2254 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDivergenceMat_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDivergenceMat_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2254,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2255 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetChangeOfBasisMat_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetChangeOfBasisMat_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2255,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2256 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetPrimalVerticesLocalIS_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetPrimalVerticesLocalIS_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2256,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2257 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetPrimalVerticesIS_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetPrimalVerticesIS_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2257,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2258 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetCoarseningRatio_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetCoarseningRatio_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2258,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2259 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLevel_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLevel_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2259,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2260 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetUseExactDirichlet_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetUseExactDirichlet_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2260,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2261 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLevels_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLevels_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2261,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2262 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDirichletBoundaries_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDirichletBoundaries_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2262,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2263 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDirichletBoundariesLocal_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDirichletBoundariesLocal_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2263,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2264 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetNeumannBoundaries_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetNeumannBoundaries_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2264,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2265 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetNeumannBoundariesLocal_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetNeumannBoundariesLocal_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2265,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2266 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetDirichletBoundaries_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetDirichletBoundaries_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2266,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2267 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetDirichletBoundariesLocal_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetDirichletBoundariesLocal_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2267,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2268 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetNeumannBoundaries_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetNeumannBoundaries_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2268,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2269 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetNeumannBoundariesLocal_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetNeumannBoundariesLocal_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2269,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2270 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDofsSplitting_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDofsSplitting_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2270,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2271 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDofsSplittingLocal_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDofsSplittingLocal_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2271,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2272 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLocalAdjacencyGraph_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLocalAdjacencyGraph_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2272,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2273 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCCreateFETIDPOperators_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCCreateFETIDPOperators_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2273,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2274 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCMatFETIDPGetRHS_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCMatFETIDPGetRHS_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2274,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2275 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCMatFETIDPGetSolution_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCMatFETIDPGetSolution_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2275,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2276 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCPreSolveChangeRHS_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2276,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2277 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCSetCoordinates_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2277,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2278 | ierr = PetscFree(pc->data)((*PetscTrFree)((void*)(pc->data),2278,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((pc->data) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2278,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2279 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2280 | } | |||
2281 | ||||
2282 | static PetscErrorCode PCSetCoordinates_BDDC(PC pc, PetscInt dim, PetscInt nloc, PetscReal *coords) | |||
2283 | { | |||
2284 | PC_BDDC *pcbddc = (PC_BDDC*)pc->data; | |||
2285 | PCBDDCGraph mat_graph = pcbddc->mat_graph; | |||
2286 | PetscErrorCode ierr; | |||
2287 | ||||
2288 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2288; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2289 | ierr = PetscFree(mat_graph->coords)((*PetscTrFree)((void*)(mat_graph->coords),2289,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((mat_graph->coords) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2289,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2290 | ierr = PetscMalloc1(nloc*dim,&mat_graph->coords)PetscMallocA(1,PETSC_FALSE,2290,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(nloc*dim)*sizeof(**(&mat_graph->coords)),(& mat_graph->coords));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2290,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2291 | ierr = PetscArraycpy(mat_graph->coords,coords,nloc*dim)((sizeof(*(mat_graph->coords)) != sizeof(*(coords))) || PetscMemcpy (mat_graph->coords,coords,(nloc*dim)*sizeof(*(mat_graph-> coords))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2291,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2292 | mat_graph->cnloc = nloc; | |||
2293 | mat_graph->cdim = dim; | |||
2294 | mat_graph->cloc = PETSC_FALSE; | |||
2295 | /* flg setup */ | |||
2296 | pcbddc->recompute_topography = PETSC_TRUE; | |||
2297 | pcbddc->corner_selected = PETSC_FALSE; | |||
2298 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2299 | } | |||
2300 | ||||
2301 | static PetscErrorCode PCPreSolveChangeRHS_BDDC(PC pc, PetscBool* change) | |||
2302 | { | |||
2303 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2303; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2304 | *change = PETSC_TRUE; | |||
2305 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2306 | } | |||
2307 | ||||
2308 | static PetscErrorCode PCBDDCMatFETIDPGetRHS_BDDC(Mat fetidp_mat, Vec standard_rhs, Vec fetidp_flux_rhs) | |||
2309 | { | |||
2310 | FETIDPMat_ctx mat_ctx; | |||
2311 | Vec work; | |||
2312 | PC_IS* pcis; | |||
2313 | PC_BDDC* pcbddc; | |||
2314 | PetscErrorCode ierr; | |||
2315 | ||||
2316 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2316; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2317 | ierr = MatShellGetContext(fetidp_mat,&mat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2317,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2318 | pcis = (PC_IS*)mat_ctx->pc->data; | |||
2319 | pcbddc = (PC_BDDC*)mat_ctx->pc->data; | |||
2320 | ||||
2321 | ierr = VecSet(fetidp_flux_rhs,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2321,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2322 | /* copy rhs since we may change it during PCPreSolve_BDDC */ | |||
2323 | if (!pcbddc->original_rhs) { | |||
2324 | ierr = VecDuplicate(pcis->vec1_global,&pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2324,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2325 | } | |||
2326 | if (mat_ctx->rhs_flip) { | |||
2327 | ierr = VecPointwiseMult(pcbddc->original_rhs,standard_rhs,mat_ctx->rhs_flip);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2327,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2328 | } else { | |||
2329 | ierr = VecCopy(standard_rhs,pcbddc->original_rhs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2329,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2330 | } | |||
2331 | if (mat_ctx->g2g_p) { | |||
2332 | /* interface pressure rhs */ | |||
2333 | ierr = VecScatterBegin(mat_ctx->g2g_p,fetidp_flux_rhs,pcbddc->original_rhs,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2333,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2334 | ierr = VecScatterEnd(mat_ctx->g2g_p,fetidp_flux_rhs,pcbddc->original_rhs,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2334,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2335 | ierr = VecScatterBegin(mat_ctx->g2g_p,standard_rhs,fetidp_flux_rhs,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2335,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2336 | ierr = VecScatterEnd(mat_ctx->g2g_p,standard_rhs,fetidp_flux_rhs,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2336,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2337 | if (!mat_ctx->rhs_flip) { | |||
2338 | ierr = VecScale(fetidp_flux_rhs,-1.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2338,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2339 | } | |||
2340 | } | |||
2341 | /* | |||
2342 | change of basis for physical rhs if needed | |||
2343 | It also changes the rhs in case of dirichlet boundaries | |||
2344 | */ | |||
2345 | ierr = PCPreSolve_BDDC(mat_ctx->pc,NULL((void*)0),pcbddc->original_rhs,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2345,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2346 | if (pcbddc->ChangeOfBasisMatrix) { | |||
2347 | ierr = MatMultTranspose(pcbddc->ChangeOfBasisMatrix,pcbddc->original_rhs,pcbddc->work_change);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2347,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2348 | work = pcbddc->work_change; | |||
2349 | } else { | |||
2350 | work = pcbddc->original_rhs; | |||
2351 | } | |||
2352 | /* store vectors for computation of fetidp final solution */ | |||
2353 | ierr = VecScatterBegin(pcis->global_to_D,work,mat_ctx->temp_solution_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2353,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2354 | ierr = VecScatterEnd(pcis->global_to_D,work,mat_ctx->temp_solution_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2354,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2355 | /* scale rhs since it should be unassembled */ | |||
2356 | /* TODO use counter scaling? (also below) */ | |||
2357 | ierr = VecScatterBegin(pcis->global_to_B,work,mat_ctx->temp_solution_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2357,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2358 | ierr = VecScatterEnd(pcis->global_to_B,work,mat_ctx->temp_solution_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2358,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2359 | /* Apply partition of unity */ | |||
2360 | ierr = VecPointwiseMult(mat_ctx->temp_solution_B,pcis->D,mat_ctx->temp_solution_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2360,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2361 | /* ierr = PCBDDCScalingRestriction(mat_ctx->pc,work,mat_ctx->temp_solution_B);CHKERRQ(ierr); */ | |||
2362 | if (!pcbddc->switch_static) { | |||
2363 | /* compute partially subassembled Schur complement right-hand side */ | |||
2364 | ierr = KSPSolve(pcbddc->ksp_D,mat_ctx->temp_solution_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2364,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2365 | /* Cannot propagate up error in KSPSolve() because there is no access to the PC */ | |||
2366 | ierr = MatMult(pcis->A_BI,pcis->vec1_D,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2366,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2367 | ierr = VecAXPY(mat_ctx->temp_solution_B,-1.0,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2367,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2368 | ierr = VecSet(work,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2368,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2369 | ierr = VecScatterBegin(pcis->global_to_B,mat_ctx->temp_solution_B,work,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2369,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2370 | ierr = VecScatterEnd(pcis->global_to_B,mat_ctx->temp_solution_B,work,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2370,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2371 | /* ierr = PCBDDCScalingRestriction(mat_ctx->pc,work,mat_ctx->temp_solution_B);CHKERRQ(ierr); */ | |||
2372 | ierr = VecScatterBegin(pcis->global_to_B,work,mat_ctx->temp_solution_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2372,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2373 | ierr = VecScatterEnd(pcis->global_to_B,work,mat_ctx->temp_solution_B,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2373,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2374 | ierr = VecPointwiseMult(mat_ctx->temp_solution_B,pcis->D,mat_ctx->temp_solution_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2374,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2375 | } | |||
2376 | /* BDDC rhs */ | |||
2377 | ierr = VecCopy(mat_ctx->temp_solution_B,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2377,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2378 | if (pcbddc->switch_static) { | |||
2379 | ierr = VecCopy(mat_ctx->temp_solution_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2379,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2380 | } | |||
2381 | /* apply BDDC */ | |||
2382 | ierr = PetscArrayzero(pcbddc->benign_p0,pcbddc->benign_n)PetscMemzero(pcbddc->benign_p0,(pcbddc->benign_n)*sizeof (*(pcbddc->benign_p0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2382,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2383 | ierr = PCBDDCApplyInterfacePreconditioner(mat_ctx->pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2383,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2384 | ierr = PetscArrayzero(pcbddc->benign_p0,pcbddc->benign_n)PetscMemzero(pcbddc->benign_p0,(pcbddc->benign_n)*sizeof (*(pcbddc->benign_p0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2384,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2385 | ||||
2386 | /* Application of B_delta and assembling of rhs for fetidp fluxes */ | |||
2387 | ierr = MatMult(mat_ctx->B_delta,pcis->vec1_B,mat_ctx->lambda_local);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2387,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2388 | ierr = VecScatterBegin(mat_ctx->l2g_lambda,mat_ctx->lambda_local,fetidp_flux_rhs,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2388,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2389 | ierr = VecScatterEnd(mat_ctx->l2g_lambda,mat_ctx->lambda_local,fetidp_flux_rhs,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2389,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2390 | /* Add contribution to interface pressures */ | |||
2391 | if (mat_ctx->l2g_p) { | |||
2392 | ierr = MatMult(mat_ctx->B_BB,pcis->vec1_B,mat_ctx->vP);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2392,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2393 | if (pcbddc->switch_static) { | |||
2394 | ierr = MatMultAdd(mat_ctx->B_BI,pcis->vec1_D,mat_ctx->vP,mat_ctx->vP);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2394,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2395 | } | |||
2396 | ierr = VecScatterBegin(mat_ctx->l2g_p,mat_ctx->vP,fetidp_flux_rhs,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2396,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2397 | ierr = VecScatterEnd(mat_ctx->l2g_p,mat_ctx->vP,fetidp_flux_rhs,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2397,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2398 | } | |||
2399 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2400 | } | |||
2401 | ||||
2402 | /*@ | |||
2403 | PCBDDCMatFETIDPGetRHS - Compute the right-hand side for FETI-DP linear system using the physical right-hand side | |||
2404 | ||||
2405 | Collective | |||
2406 | ||||
2407 | Input Parameters: | |||
2408 | + fetidp_mat - the FETI-DP matrix object obtained by a call to PCBDDCCreateFETIDPOperators | |||
2409 | - standard_rhs - the right-hand side of the original linear system | |||
2410 | ||||
2411 | Output Parameters: | |||
2412 | . fetidp_flux_rhs - the right-hand side for the FETI-DP linear system | |||
2413 | ||||
2414 | Level: developer | |||
2415 | ||||
2416 | Notes: | |||
2417 | ||||
2418 | .seealso: PCBDDC, PCBDDCCreateFETIDPOperators, PCBDDCMatFETIDPGetSolution | |||
2419 | @*/ | |||
2420 | PetscErrorCode PCBDDCMatFETIDPGetRHS(Mat fetidp_mat, Vec standard_rhs, Vec fetidp_flux_rhs) | |||
2421 | { | |||
2422 | FETIDPMat_ctx mat_ctx; | |||
2423 | PetscErrorCode ierr; | |||
2424 | ||||
2425 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2425; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2426 | PetscValidHeaderSpecific(fetidp_mat,MAT_CLASSID,1)do { if (!fetidp_mat) return PetscError(((MPI_Comm)0x44000001 ),2426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(fetidp_mat,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(fetidp_mat))->classid != MAT_CLASSID ) { if (((PetscObject)(fetidp_mat))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2426,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2426,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
2427 | PetscValidHeaderSpecific(standard_rhs,VEC_CLASSID,2)do { if (!standard_rhs) return PetscError(((MPI_Comm)0x44000001 ),2427,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(standard_rhs,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2427,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(standard_rhs))->classid != VEC_CLASSID ) { if (((PetscObject)(standard_rhs))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2427,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),2427,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
2428 | PetscValidHeaderSpecific(fetidp_flux_rhs,VEC_CLASSID,3)do { if (!fetidp_flux_rhs) return PetscError(((MPI_Comm)0x44000001 ),2428,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",3); if ( !PetscCheckPointer(fetidp_flux_rhs,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2428,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,3); if (((PetscObject)(fetidp_flux_rhs))->classid != VEC_CLASSID ) { if (((PetscObject)(fetidp_flux_rhs))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2428,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,3); else return PetscError(((MPI_Comm)0x44000001),2428,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",3) ; } } while (0); | |||
2429 | ierr = MatShellGetContext(fetidp_mat,&mat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2429,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2430 | ierr = PetscUseMethod(mat_ctx->pc,"PCBDDCMatFETIDPGetRHS_C",(Mat,Vec,Vec),(fetidp_mat,standard_rhs,fetidp_flux_rhs))0; do { PetscErrorCode (*f)(Mat,Vec,Vec), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)mat_ctx->pc),("PCBDDCMatFETIDPGetRHS_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),2430,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(fetidp_mat,standard_rhs,fetidp_flux_rhs);do {if (__builtin_expect (!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),2430 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)mat_ctx->pc),2430,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCMatFETIDPGetRHS_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2430,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2431 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2432 | } | |||
2433 | ||||
2434 | static PetscErrorCode PCBDDCMatFETIDPGetSolution_BDDC(Mat fetidp_mat, Vec fetidp_flux_sol, Vec standard_sol) | |||
2435 | { | |||
2436 | FETIDPMat_ctx mat_ctx; | |||
2437 | PC_IS* pcis; | |||
2438 | PC_BDDC* pcbddc; | |||
2439 | PetscErrorCode ierr; | |||
2440 | Vec work; | |||
2441 | ||||
2442 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2442; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2443 | ierr = MatShellGetContext(fetidp_mat,&mat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2443,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2444 | pcis = (PC_IS*)mat_ctx->pc->data; | |||
2445 | pcbddc = (PC_BDDC*)mat_ctx->pc->data; | |||
2446 | ||||
2447 | /* apply B_delta^T */ | |||
2448 | ierr = VecSet(pcis->vec1_B,0.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2448,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2449 | ierr = VecScatterBegin(mat_ctx->l2g_lambda,fetidp_flux_sol,mat_ctx->lambda_local,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2449,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2450 | ierr = VecScatterEnd(mat_ctx->l2g_lambda,fetidp_flux_sol,mat_ctx->lambda_local,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2450,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2451 | ierr = MatMultTranspose(mat_ctx->B_delta,mat_ctx->lambda_local,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2451,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2452 | if (mat_ctx->l2g_p) { | |||
2453 | ierr = VecScatterBegin(mat_ctx->l2g_p,fetidp_flux_sol,mat_ctx->vP,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2453,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2454 | ierr = VecScatterEnd(mat_ctx->l2g_p,fetidp_flux_sol,mat_ctx->vP,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2454,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2455 | ierr = MatMultAdd(mat_ctx->Bt_BB,mat_ctx->vP,pcis->vec1_B,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2455,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2456 | } | |||
2457 | ||||
2458 | /* compute rhs for BDDC application */ | |||
2459 | ierr = VecAYPX(pcis->vec1_B,-1.0,mat_ctx->temp_solution_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2459,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2460 | if (pcbddc->switch_static) { | |||
2461 | ierr = VecCopy(mat_ctx->temp_solution_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2461,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2462 | if (mat_ctx->l2g_p) { | |||
2463 | ierr = VecScale(mat_ctx->vP,-1.);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2463,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2464 | ierr = MatMultAdd(mat_ctx->Bt_BI,mat_ctx->vP,pcis->vec1_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2464,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2465 | } | |||
2466 | } | |||
2467 | ||||
2468 | /* apply BDDC */ | |||
2469 | ierr = PetscArrayzero(pcbddc->benign_p0,pcbddc->benign_n)PetscMemzero(pcbddc->benign_p0,(pcbddc->benign_n)*sizeof (*(pcbddc->benign_p0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2469,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2470 | ierr = PCBDDCApplyInterfacePreconditioner(mat_ctx->pc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2470,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2471 | ||||
2472 | /* put values into global vector */ | |||
2473 | if (pcbddc->ChangeOfBasisMatrix) work = pcbddc->work_change; | |||
2474 | else work = standard_sol; | |||
2475 | ierr = VecScatterBegin(pcis->global_to_B,pcis->vec1_B,work,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2475,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2476 | ierr = VecScatterEnd(pcis->global_to_B,pcis->vec1_B,work,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2476,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2477 | if (!pcbddc->switch_static) { | |||
2478 | /* compute values into the interior if solved for the partially subassembled Schur complement */ | |||
2479 | ierr = MatMult(pcis->A_IB,pcis->vec1_B,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2479,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2480 | ierr = VecAYPX(pcis->vec1_D,-1.0,mat_ctx->temp_solution_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2480,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2481 | ierr = KSPSolve(pcbddc->ksp_D,pcis->vec1_D,pcis->vec1_D);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2481,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2482 | /* Cannot propagate up error in KSPSolve() because there is no access to the PC */ | |||
2483 | } | |||
2484 | ||||
2485 | ierr = VecScatterBegin(pcis->global_to_D,pcis->vec1_D,work,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2485,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2486 | ierr = VecScatterEnd(pcis->global_to_D,pcis->vec1_D,work,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2486,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2487 | /* add p0 solution to final solution */ | |||
2488 | ierr = PCBDDCBenignGetOrSetP0(mat_ctx->pc,work,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2488,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2489 | if (pcbddc->ChangeOfBasisMatrix) { | |||
2490 | ierr = MatMult(pcbddc->ChangeOfBasisMatrix,work,standard_sol);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2490,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2491 | } | |||
2492 | ierr = PCPostSolve_BDDC(mat_ctx->pc,NULL((void*)0),NULL((void*)0),standard_sol);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2492,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2493 | if (mat_ctx->g2g_p) { | |||
2494 | ierr = VecScatterBegin(mat_ctx->g2g_p,fetidp_flux_sol,standard_sol,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2494,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2495 | ierr = VecScatterEnd(mat_ctx->g2g_p,fetidp_flux_sol,standard_sol,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2495,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2496 | } | |||
2497 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2498 | } | |||
2499 | ||||
2500 | static PetscErrorCode PCView_BDDCIPC(PC pc, PetscViewer viewer) | |||
2501 | { | |||
2502 | PetscErrorCode ierr; | |||
2503 | BDDCIPC_ctx bddcipc_ctx; | |||
2504 | PetscBool isascii; | |||
2505 | ||||
2506 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2506; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2507 | ierr = PCShellGetContext(pc,(void **)&bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2507,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2508 | ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII"ascii",&isascii);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2508,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2509 | if (isascii) { | |||
2510 | ierr = PetscViewerASCIIPrintf(viewer,"BDDC interface preconditioner\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2510,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2511 | } | |||
2512 | ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2512,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2513 | ierr = PCView(bddcipc_ctx->bddc,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2513,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2514 | ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2514,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2515 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2516 | } | |||
2517 | ||||
2518 | static PetscErrorCode PCSetUp_BDDCIPC(PC pc) | |||
2519 | { | |||
2520 | PetscErrorCode ierr; | |||
2521 | BDDCIPC_ctx bddcipc_ctx; | |||
2522 | PetscBool isbddc; | |||
2523 | Vec vv; | |||
2524 | IS is; | |||
2525 | PC_IS *pcis; | |||
2526 | ||||
2527 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2527; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2528 | ierr = PCShellGetContext(pc,(void **)&bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2528,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2529 | ierr = PetscObjectTypeCompare((PetscObject)bddcipc_ctx->bddc,PCBDDC"bddc",&isbddc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2529,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2530 | if (!isbddc) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Invalid type %s. Must be of type bddc",((PetscObject)bddcipc_ctx->bddc)->type_name)return PetscError(PetscObjectComm((PetscObject)pc),2530,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"Invalid type %s. Must be of type bddc",( (PetscObject)bddcipc_ctx->bddc)->type_name); | |||
2531 | ierr = PCSetUp(bddcipc_ctx->bddc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2531,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2532 | ||||
2533 | /* create interface scatter */ | |||
2534 | pcis = (PC_IS*)(bddcipc_ctx->bddc->data); | |||
2535 | ierr = VecScatterDestroy(&bddcipc_ctx->g2l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2535,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2536 | ierr = MatCreateVecs(pc->pmat,&vv,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2536,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2537 | ierr = ISRenumber(pcis->is_B_global,NULL((void*)0),NULL((void*)0),&is);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2537,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2538 | ierr = VecScatterCreate(vv,is,pcis->vec1_B,NULL((void*)0),&bddcipc_ctx->g2l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2538,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2539 | ierr = ISDestroy(&is);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2539,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2540 | ierr = VecDestroy(&vv);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2540,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2541 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2542 | } | |||
2543 | ||||
2544 | static PetscErrorCode PCApply_BDDCIPC(PC pc, Vec r, Vec x) | |||
2545 | { | |||
2546 | PetscErrorCode ierr; | |||
2547 | BDDCIPC_ctx bddcipc_ctx; | |||
2548 | PC_IS *pcis; | |||
2549 | VecScatter tmps; | |||
2550 | ||||
2551 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2551; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2552 | ierr = PCShellGetContext(pc,(void **)&bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2552,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2553 | pcis = (PC_IS*)(bddcipc_ctx->bddc->data); | |||
2554 | tmps = pcis->global_to_B; | |||
2555 | pcis->global_to_B = bddcipc_ctx->g2l; | |||
2556 | ierr = PCBDDCScalingRestriction(bddcipc_ctx->bddc,r,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2556,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2557 | ierr = PCBDDCApplyInterfacePreconditioner(bddcipc_ctx->bddc,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2557,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2558 | ierr = PCBDDCScalingExtension(bddcipc_ctx->bddc,pcis->vec1_B,x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2558,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2559 | pcis->global_to_B = tmps; | |||
2560 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2561 | } | |||
2562 | ||||
2563 | static PetscErrorCode PCApplyTranspose_BDDCIPC(PC pc, Vec r, Vec x) | |||
2564 | { | |||
2565 | PetscErrorCode ierr; | |||
2566 | BDDCIPC_ctx bddcipc_ctx; | |||
2567 | PC_IS *pcis; | |||
2568 | VecScatter tmps; | |||
2569 | ||||
2570 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2570; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2571 | ierr = PCShellGetContext(pc,(void **)&bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2571,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2572 | pcis = (PC_IS*)(bddcipc_ctx->bddc->data); | |||
2573 | tmps = pcis->global_to_B; | |||
2574 | pcis->global_to_B = bddcipc_ctx->g2l; | |||
2575 | ierr = PCBDDCScalingRestriction(bddcipc_ctx->bddc,r,pcis->vec1_B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2575,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2576 | ierr = PCBDDCApplyInterfacePreconditioner(bddcipc_ctx->bddc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2576,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2577 | ierr = PCBDDCScalingExtension(bddcipc_ctx->bddc,pcis->vec1_B,x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2577,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2578 | pcis->global_to_B = tmps; | |||
2579 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2580 | } | |||
2581 | ||||
2582 | static PetscErrorCode PCDestroy_BDDCIPC(PC pc) | |||
2583 | { | |||
2584 | PetscErrorCode ierr; | |||
2585 | BDDCIPC_ctx bddcipc_ctx; | |||
2586 | ||||
2587 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2587; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2588 | ierr = PCShellGetContext(pc,(void **)&bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2588,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2589 | ierr = PCDestroy(&bddcipc_ctx->bddc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2589,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2590 | ierr = VecScatterDestroy(&bddcipc_ctx->g2l);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2590,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2591 | ierr = PetscFree(bddcipc_ctx)((*PetscTrFree)((void*)(bddcipc_ctx),2591,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((bddcipc_ctx) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2591,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2592 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2593 | } | |||
2594 | ||||
2595 | /*@ | |||
2596 | PCBDDCMatFETIDPGetSolution - Compute the physical solution using the solution of the FETI-DP linear system | |||
2597 | ||||
2598 | Collective | |||
2599 | ||||
2600 | Input Parameters: | |||
2601 | + fetidp_mat - the FETI-DP matrix obtained by a call to PCBDDCCreateFETIDPOperators | |||
2602 | - fetidp_flux_sol - the solution of the FETI-DP linear system | |||
2603 | ||||
2604 | Output Parameters: | |||
2605 | . standard_sol - the solution defined on the physical domain | |||
2606 | ||||
2607 | Level: developer | |||
2608 | ||||
2609 | Notes: | |||
2610 | ||||
2611 | .seealso: PCBDDC, PCBDDCCreateFETIDPOperators, PCBDDCMatFETIDPGetRHS | |||
2612 | @*/ | |||
2613 | PetscErrorCode PCBDDCMatFETIDPGetSolution(Mat fetidp_mat, Vec fetidp_flux_sol, Vec standard_sol) | |||
2614 | { | |||
2615 | FETIDPMat_ctx mat_ctx; | |||
2616 | PetscErrorCode ierr; | |||
2617 | ||||
2618 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2618; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2619 | PetscValidHeaderSpecific(fetidp_mat,MAT_CLASSID,1)do { if (!fetidp_mat) return PetscError(((MPI_Comm)0x44000001 ),2619,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer(fetidp_mat,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2619,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(fetidp_mat))->classid != MAT_CLASSID ) { if (((PetscObject)(fetidp_mat))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2619,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2619,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
2620 | PetscValidHeaderSpecific(fetidp_flux_sol,VEC_CLASSID,2)do { if (!fetidp_flux_sol) return PetscError(((MPI_Comm)0x44000001 ),2620,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(fetidp_flux_sol,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2620,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(fetidp_flux_sol))->classid != VEC_CLASSID ) { if (((PetscObject)(fetidp_flux_sol))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2620,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),2620,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",2) ; } } while (0); | |||
2621 | PetscValidHeaderSpecific(standard_sol,VEC_CLASSID,3)do { if (!standard_sol) return PetscError(((MPI_Comm)0x44000001 ),2621,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",3); if ( !PetscCheckPointer(standard_sol,PETSC_OBJECT)) return PetscError (((MPI_Comm)0x44000001),2621,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,3); if (((PetscObject)(standard_sol))->classid != VEC_CLASSID ) { if (((PetscObject)(standard_sol))->classid == -1) return PetscError(((MPI_Comm)0x44000001),2621,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,3); else return PetscError(((MPI_Comm)0x44000001),2621,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",3) ; } } while (0); | |||
2622 | ierr = MatShellGetContext(fetidp_mat,&mat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2622,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2623 | ierr = PetscUseMethod(mat_ctx->pc,"PCBDDCMatFETIDPGetSolution_C",(Mat,Vec,Vec),(fetidp_mat,fetidp_flux_sol,standard_sol))0; do { PetscErrorCode (*f)(Mat,Vec,Vec), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)mat_ctx->pc),("PCBDDCMatFETIDPGetSolution_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),2623,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(fetidp_mat ,fetidp_flux_sol,standard_sol);do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),2623,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",__ierr ,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)mat_ctx->pc),2623,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCMatFETIDPGetSolution_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2623,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2624 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2625 | } | |||
2626 | ||||
2627 | static PetscErrorCode PCBDDCCreateFETIDPOperators_BDDC(PC pc, PetscBool fully_redundant, const char* prefix, Mat *fetidp_mat, PC *fetidp_pc) | |||
2628 | { | |||
2629 | ||||
2630 | FETIDPMat_ctx fetidpmat_ctx; | |||
2631 | Mat newmat; | |||
2632 | FETIDPPC_ctx fetidppc_ctx; | |||
2633 | PC newpc; | |||
2634 | MPI_Comm comm; | |||
2635 | PetscErrorCode ierr; | |||
2636 | ||||
2637 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2637; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2638 | ierr = PetscObjectGetComm((PetscObject)pc,&comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2638,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2639 | /* FETI-DP matrix */ | |||
2640 | ierr = PCBDDCCreateFETIDPMatContext(pc,&fetidpmat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2640,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2641 | fetidpmat_ctx->fully_redundant = fully_redundant; | |||
2642 | ierr = PCBDDCSetupFETIDPMatContext(fetidpmat_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2642,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2643 | ierr = MatCreateShell(comm,fetidpmat_ctx->n,fetidpmat_ctx->n,fetidpmat_ctx->N,fetidpmat_ctx->N,fetidpmat_ctx,&newmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2643,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2644 | ierr = PetscObjectSetName((PetscObject)newmat,!fetidpmat_ctx->l2g_lambda_only ? "F" : "G");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2644,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
| ||||
2645 | ierr = MatShellSetOperation(newmat,MATOP_MULT,(void (*)(void))FETIDPMatMult);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2645,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2646 | ierr = MatShellSetOperation(newmat,MATOP_MULT_TRANSPOSE,(void (*)(void))FETIDPMatMultTranspose);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2646,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2647 | ierr = MatShellSetOperation(newmat,MATOP_DESTROY,(void (*)(void))PCBDDCDestroyFETIDPMat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2647,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2648 | /* propagate MatOptions */ | |||
2649 | { | |||
2650 | PC_BDDC *pcbddc = (PC_BDDC*)fetidpmat_ctx->pc->data; | |||
2651 | PetscBool issym; | |||
2652 | ||||
2653 | ierr = MatGetOption(pc->mat,MAT_SYMMETRIC,&issym);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2653,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2654 | if (issym || pcbddc->symmetric_primal) { | |||
2655 | ierr = MatSetOption(newmat,MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2655,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2656 | } | |||
2657 | } | |||
2658 | ierr = MatSetOptionsPrefix(newmat,prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2658,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2659 | ierr = MatAppendOptionsPrefix(newmat,"fetidp_");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2659,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2660 | ierr = MatSetUp(newmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2660,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2661 | /* FETI-DP preconditioner */ | |||
2662 | ierr = PCBDDCCreateFETIDPPCContext(pc,&fetidppc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2662,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2663 | ierr = PCBDDCSetupFETIDPPCContext(newmat,fetidppc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2663,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2664 | ierr = PCCreate(comm,&newpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2664,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2665 | ierr = PCSetOperators(newpc,newmat,newmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2665,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2666 | ierr = PCSetOptionsPrefix(newpc,prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2666,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2667 | ierr = PCAppendOptionsPrefix(newpc,"fetidp_");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2667,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2668 | ierr = PCSetErrorIfFailure(newpc,pc->erroriffailure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2668,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2669 | if (!fetidpmat_ctx->l2g_lambda_only) { /* standard FETI-DP */ | |||
2670 | ierr = PCSetType(newpc,PCSHELL"shell");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2670,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2671 | ierr = PCShellSetName(newpc,"FETI-DP multipliers");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2671,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2672 | ierr = PCShellSetContext(newpc,fetidppc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2672,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2673 | ierr = PCShellSetApply(newpc,FETIDPPCApply);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2673,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2674 | ierr = PCShellSetApplyTranspose(newpc,FETIDPPCApplyTranspose);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2674,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2675 | ierr = PCShellSetView(newpc,FETIDPPCView);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2675,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2676 | ierr = PCShellSetDestroy(newpc,PCBDDCDestroyFETIDPPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2676,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2677 | } else { /* saddle-point FETI-DP */ | |||
2678 | Mat M; | |||
2679 | PetscInt psize; | |||
2680 | PetscBool fake = PETSC_FALSE, isfieldsplit; | |||
2681 | ||||
2682 | ierr = ISViewFromOptions(fetidpmat_ctx->lagrange,NULL((void*)0),"-lag_view");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2682,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2683 | ierr = ISViewFromOptions(fetidpmat_ctx->pressure,NULL((void*)0),"-press_view");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2683,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2684 | ierr = PetscObjectQuery((PetscObject)pc,"__KSPFETIDP_PPmat",(PetscObject*)&M);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2684,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2685 | ierr = PCSetType(newpc,PCFIELDSPLIT"fieldsplit");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2685,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2686 | ierr = PCFieldSplitSetIS(newpc,"lag",fetidpmat_ctx->lagrange);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2686,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2687 | ierr = PCFieldSplitSetIS(newpc,"p",fetidpmat_ctx->pressure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2687,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2688 | ierr = PCFieldSplitSetType(newpc,PC_COMPOSITE_SCHUR);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2688,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2689 | ierr = PCFieldSplitSetSchurFactType(newpc,PC_FIELDSPLIT_SCHUR_FACT_DIAG);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2689,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2690 | ierr = ISGetSize(fetidpmat_ctx->pressure,&psize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2690,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2691 | if (psize != M->rmap->N) { | |||
2692 | Mat M2; | |||
2693 | PetscInt lpsize; | |||
2694 | ||||
2695 | fake = PETSC_TRUE; | |||
2696 | ierr = ISGetLocalSize(fetidpmat_ctx->pressure,&lpsize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2696,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2697 | ierr = MatCreate(comm,&M2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2697,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2698 | ierr = MatSetType(M2,MATAIJ"aij");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2698,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2699 | ierr = MatSetSizes(M2,lpsize,lpsize,psize,psize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2699,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2700 | ierr = MatSetUp(M2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2700,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2701 | ierr = MatAssemblyBegin(M2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2701,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2702 | ierr = MatAssemblyEnd(M2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2702,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2703 | ierr = PCFieldSplitSetSchurPre(newpc,PC_FIELDSPLIT_SCHUR_PRE_USER,M2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2703,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2704 | ierr = MatDestroy(&M2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2704,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2705 | } else { | |||
2706 | ierr = PCFieldSplitSetSchurPre(newpc,PC_FIELDSPLIT_SCHUR_PRE_USER,M);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2706,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2707 | } | |||
2708 | ierr = PCFieldSplitSetSchurScale(newpc,1.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2708,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2709 | ||||
2710 | /* we need to setfromoptions and setup here to access the blocks */ | |||
2711 | ierr = PCSetFromOptions(newpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2711,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2712 | ierr = PCSetUp(newpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2712,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2713 | ||||
2714 | /* user may have changed the type (e.g. -fetidp_pc_type none) */ | |||
2715 | ierr = PetscObjectTypeCompare((PetscObject)newpc,PCFIELDSPLIT"fieldsplit",&isfieldsplit);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2715,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2716 | if (isfieldsplit) { | |||
2717 | KSP *ksps; | |||
2718 | PC ppc,lagpc; | |||
2719 | PetscInt nn; | |||
2720 | PetscBool ismatis,matisok = PETSC_FALSE,check = PETSC_FALSE; | |||
2721 | ||||
2722 | /* set the solver for the (0,0) block */ | |||
2723 | ierr = PCFieldSplitSchurGetSubKSP(newpc,&nn,&ksps);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2723,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2724 | if (!nn) { /* not of type PC_COMPOSITE_SCHUR */ | |||
2725 | ierr = PCFieldSplitGetSubKSP(newpc,&nn,&ksps);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2725,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2726 | if (!fake) { /* pass pmat to the pressure solver */ | |||
2727 | Mat F; | |||
2728 | ||||
2729 | ierr = KSPGetOperators(ksps[1],&F,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2729,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2730 | ierr = KSPSetOperators(ksps[1],F,M);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2730,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2731 | } | |||
2732 | } else { | |||
2733 | PetscBool issym; | |||
2734 | Mat S; | |||
2735 | ||||
2736 | ierr = PCFieldSplitSchurGetS(newpc,&S);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2736,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2737 | ||||
2738 | ierr = MatGetOption(newmat,MAT_SYMMETRIC,&issym);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2738,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2739 | if (issym) { | |||
2740 | ierr = MatSetOption(S,MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2740,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2741 | } | |||
2742 | } | |||
2743 | ierr = KSPGetPC(ksps[0],&lagpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2743,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2744 | ierr = PCSetType(lagpc,PCSHELL"shell");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2744,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2745 | ierr = PCShellSetName(lagpc,"FETI-DP multipliers");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2745,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2746 | ierr = PCShellSetContext(lagpc,fetidppc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2746,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2747 | ierr = PCShellSetApply(lagpc,FETIDPPCApply);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2747,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2748 | ierr = PCShellSetApplyTranspose(lagpc,FETIDPPCApplyTranspose);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2748,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2749 | ierr = PCShellSetView(lagpc,FETIDPPCView);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2749,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2750 | ierr = PCShellSetDestroy(lagpc,PCBDDCDestroyFETIDPPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2750,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2751 | ||||
2752 | /* Olof's idea: interface Schur complement preconditioner for the mass matrix */ | |||
2753 | ierr = KSPGetPC(ksps[1],&ppc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2753,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2754 | if (fake) { | |||
2755 | BDDCIPC_ctx bddcipc_ctx; | |||
2756 | PetscContainer c; | |||
2757 | ||||
2758 | matisok = PETSC_TRUE; | |||
2759 | ||||
2760 | /* create inner BDDC solver */ | |||
2761 | ierr = PetscNew(&bddcipc_ctx)PetscMallocA(1,PETSC_TRUE,2761,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(1)*sizeof(**((&bddcipc_ctx))),((&bddcipc_ctx )));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2761,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2762 | ierr = PCCreate(comm,&bddcipc_ctx->bddc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2762,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2763 | ierr = PCSetType(bddcipc_ctx->bddc,PCBDDC"bddc");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2763,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2764 | ierr = PCSetOperators(bddcipc_ctx->bddc,M,M);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2764,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2765 | ierr = PetscObjectQuery((PetscObject)pc,"__KSPFETIDP_pCSR",(PetscObject*)&c);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2765,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2766 | ierr = PetscObjectTypeCompare((PetscObject)M,MATIS"is",&ismatis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2766,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2767 | if (c && ismatis) { | |||
2768 | Mat lM; | |||
2769 | PetscInt *csr,n; | |||
2770 | ||||
2771 | ierr = MatISGetLocalMat(M,&lM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2771,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2772 | ierr = MatGetSize(lM,&n,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2772,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2773 | ierr = PetscContainerGetPointer(c,(void**)&csr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2773,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2774 | ierr = PCBDDCSetLocalAdjacencyGraph(bddcipc_ctx->bddc,n,csr,csr + (n + 1),PETSC_COPY_VALUES);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2774,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2775 | ierr = MatISRestoreLocalMat(M,&lM);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2775,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2776 | } | |||
2777 | ierr = PCSetOptionsPrefix(bddcipc_ctx->bddc,((PetscObject)ksps[1])->prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2777,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2778 | ierr = PCSetErrorIfFailure(bddcipc_ctx->bddc,pc->erroriffailure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2778,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2779 | ierr = PCSetFromOptions(bddcipc_ctx->bddc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2779,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2780 | ||||
2781 | /* wrap the interface application */ | |||
2782 | ierr = PCSetType(ppc,PCSHELL"shell");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2782,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2783 | ierr = PCShellSetName(ppc,"FETI-DP pressure");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2783,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2784 | ierr = PCShellSetContext(ppc,bddcipc_ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2784,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2785 | ierr = PCShellSetSetUp(ppc,PCSetUp_BDDCIPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2785,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2786 | ierr = PCShellSetApply(ppc,PCApply_BDDCIPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2786,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2787 | ierr = PCShellSetApplyTranspose(ppc,PCApplyTranspose_BDDCIPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2787,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2788 | ierr = PCShellSetView(ppc,PCView_BDDCIPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2788,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2789 | ierr = PCShellSetDestroy(ppc,PCDestroy_BDDCIPC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2789,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2790 | } | |||
2791 | ||||
2792 | /* determine if we need to assemble M to construct a preconditioner */ | |||
2793 | if (!matisok) { | |||
2794 | ierr = PetscObjectTypeCompare((PetscObject)M,MATIS"is",&ismatis);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2794,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2795 | ierr = PetscObjectTypeCompareAny((PetscObject)ppc,&matisok,PCBDDC"bddc",PCJACOBI"jacobi",PCNONE"none",PCMG"mg","");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2795,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2796 | if (ismatis && !matisok) { | |||
2797 | ierr = MatConvert(M,MATAIJ"aij",MAT_INPLACE_MATRIX,&M);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2797,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2798 | } | |||
2799 | } | |||
2800 | ||||
2801 | /* run the subproblems to check convergence */ | |||
2802 | ierr = PetscOptionsGetBool(NULL((void*)0),((PetscObject)newmat)->prefix,"-check_saddlepoint",&check,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2802,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2803 | if (check) { | |||
2804 | PetscInt i; | |||
2805 | ||||
2806 | for (i=0;i<nn;i++) { | |||
2807 | KSP kspC; | |||
2808 | PC pc; | |||
2809 | Mat F,pF; | |||
2810 | Vec x,y; | |||
2811 | PetscBool isschur,prec = PETSC_TRUE; | |||
2812 | ||||
2813 | ierr = KSPCreate(PetscObjectComm((PetscObject)ksps[i]),&kspC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2813,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2814 | ierr = KSPSetOptionsPrefix(kspC,((PetscObject)ksps[i])->prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2815 | ierr = KSPAppendOptionsPrefix(kspC,"check_");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2815,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2816 | ierr = KSPGetOperators(ksps[i],&F,&pF);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2816,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2817 | ierr = PetscObjectTypeCompare((PetscObject)F,MATSCHURCOMPLEMENT"schurcomplement",&isschur);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2817,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2818 | if (isschur) { | |||
2819 | KSP kspS,kspS2; | |||
2820 | Mat A00,pA00,A10,A01,A11; | |||
2821 | char prefix[256]; | |||
2822 | ||||
2823 | ierr = MatSchurComplementGetKSP(F,&kspS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2823,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2824 | ierr = MatSchurComplementGetSubMatrices(F,&A00,&pA00,&A01,&A10,&A11);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2824,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2825 | ierr = MatCreateSchurComplement(A00,pA00,A01,A10,A11,&F);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2825,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2826 | ierr = MatSchurComplementGetKSP(F,&kspS2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2826,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2827 | ierr = PetscSNPrintf(prefix,sizeof(prefix),"%sschur_",((PetscObject)kspC)->prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2827,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2828 | ierr = KSPSetOptionsPrefix(kspS2,prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2828,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2829 | ierr = KSPGetPC(kspS2,&pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2829,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2830 | ierr = PCSetType(pc,PCKSP"ksp");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2830,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2831 | ierr = PCKSPSetKSP(pc,kspS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2831,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2832 | ierr = KSPSetFromOptions(kspS2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2832,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2833 | ierr = KSPGetPC(kspS2,&pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2833,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2834 | ierr = PCSetUseAmat(pc,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2834,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2835 | } else { | |||
2836 | ierr = PetscObjectReference((PetscObject)F);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2836,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2837 | } | |||
2838 | ierr = KSPSetFromOptions(kspC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2838,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2839 | ierr = PetscOptionsGetBool(NULL((void*)0),((PetscObject)kspC)->prefix,"-preconditioned",&prec,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2839,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2840 | if (prec) { | |||
2841 | ierr = KSPGetPC(ksps[i],&pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2841,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2842 | ierr = KSPSetPC(kspC,pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2842,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2843 | } | |||
2844 | ierr = KSPSetOperators(kspC,F,pF);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2844,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2845 | ierr = MatCreateVecs(F,&x,&y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2845,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2846 | ierr = VecSetRandom(x,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2846,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2847 | ierr = MatMult(F,x,y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2847,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2848 | ierr = KSPSolve(kspC,y,x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2848,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2849 | ierr = KSPCheckSolve(kspC,pc,x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2849,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
| ||||
2850 | ierr = KSPDestroy(&kspC);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2850,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2851 | ierr = MatDestroy(&F);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2851,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2852 | ierr = VecDestroy(&x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2852,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2853 | ierr = VecDestroy(&y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2853,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2854 | } | |||
2855 | } | |||
2856 | ierr = PetscFree(ksps)((*PetscTrFree)((void*)(ksps),2856,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ) || ((ksps) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2856,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2857 | } | |||
2858 | } | |||
2859 | /* return pointers for objects created */ | |||
2860 | *fetidp_mat = newmat; | |||
2861 | *fetidp_pc = newpc; | |||
2862 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2863 | } | |||
2864 | ||||
2865 | /*@C | |||
2866 | PCBDDCCreateFETIDPOperators - Create FETI-DP operators | |||
2867 | ||||
2868 | Collective | |||
2869 | ||||
2870 | Input Parameters: | |||
2871 | + pc - the BDDC preconditioning context (setup should have been called before) | |||
2872 | . fully_redundant - true for a fully redundant set of Lagrange multipliers | |||
2873 | - prefix - optional options database prefix for the objects to be created (can be NULL) | |||
2874 | ||||
2875 | Output Parameters: | |||
2876 | + fetidp_mat - shell FETI-DP matrix object | |||
2877 | - fetidp_pc - shell Dirichlet preconditioner for FETI-DP matrix | |||
2878 | ||||
2879 | Level: developer | |||
2880 | ||||
2881 | Notes: | |||
2882 | Currently the only operations provided for FETI-DP matrix are MatMult and MatMultTranspose | |||
2883 | ||||
2884 | .seealso: PCBDDC, PCBDDCMatFETIDPGetRHS, PCBDDCMatFETIDPGetSolution | |||
2885 | @*/ | |||
2886 | PetscErrorCode PCBDDCCreateFETIDPOperators(PC pc, PetscBool fully_redundant, const char *prefix, Mat *fetidp_mat, PC *fetidp_pc) | |||
2887 | { | |||
2888 | PetscErrorCode ierr; | |||
2889 | ||||
2890 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2890; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2891 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),2891,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",85, PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if (!PetscCheckPointer (pc,PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),2891 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),2891,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),2891,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",62, PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d",1) ; } } while (0); | |||
2892 | if (pc->setupcalled) { | |||
2893 | ierr = PetscUseMethod(pc,"PCBDDCCreateFETIDPOperators_C",(PC,PetscBool,const char*,Mat*,PC*),(pc,fully_redundant,prefix,fetidp_mat,fetidp_pc))0; do { PetscErrorCode (*f)(PC,PetscBool,const char*,Mat*,PC* ), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject )pc),("PCBDDCCreateFETIDPOperators_C"),(PetscVoidFunction*)(& f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),2893,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,fully_redundant,prefix,fetidp_mat,fetidp_pc);do {if ( __builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm) 0x44000001),2893,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} else return PetscError (PetscObjectComm((PetscObject)pc),2893,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,56,PETSC_ERROR_INITIAL,"Cannot locate function %s in object" ,"PCBDDCCreateFETIDPOperators_C"); } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2893,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2894 | } else SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"You must call PCSetup_BDDC() first")return PetscError(PetscObjectComm((PetscObject)pc),2894,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c",56, PETSC_ERROR_INITIAL,"You must call PCSetup_BDDC() first"); | |||
2895 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
2896 | } | |||
2897 | /* -------------------------------------------------------------------------- */ | |||
2898 | /*MC | |||
2899 | PCBDDC - Balancing Domain Decomposition by Constraints. | |||
2900 | ||||
2901 | An implementation of the BDDC preconditioner based on | |||
2902 | ||||
2903 | .vb | |||
2904 | [1] C. R. Dohrmann. "An approximate BDDC preconditioner", Numerical Linear Algebra with Applications Volume 14, Issue 2, pages 149-168, March 2007 | |||
2905 | [2] A. Klawonn and O. B. Widlund. "Dual-Primal FETI Methods for Linear Elasticity", https://cs.nyu.edu/dynamic/reports/?year=all | |||
2906 | [3] J. Mandel, B. Sousedik, C. R. Dohrmann. "Multispace and Multilevel BDDC", https://arxiv.org/abs/0712.3977 | |||
2907 | [4] C. Pechstein and C. R. Dohrmann. "Modern domain decomposition methods BDDC, deluxe scaling, and an algebraic approach", Seminar talk, Linz, December 2013, http://people.ricam.oeaw.ac.at/c.pechstein/pechstein-bddc2013.pdf | |||
2908 | .ve | |||
2909 | ||||
2910 | The matrix to be preconditioned (Pmat) must be of type MATIS. | |||
2911 | ||||
2912 | Currently works with MATIS matrices with local matrices of type MATSEQAIJ, MATSEQBAIJ or MATSEQSBAIJ, either with real or complex numbers. | |||
2913 | ||||
2914 | It also works with unsymmetric and indefinite problems. | |||
2915 | ||||
2916 | Unlike 'conventional' interface preconditioners, PCBDDC iterates over all degrees of freedom, not just those on the interface. This allows the use of approximate solvers on the subdomains. | |||
2917 | ||||
2918 | Approximate local solvers are automatically adapted (see [1]) if the user has attached a nullspace object to the subdomain matrices, and informed BDDC of using approximate solvers (via the command line). | |||
2919 | ||||
2920 | Boundary nodes are split in vertices, edges and faces classes using information from the local to global mapping of dofs and the local connectivity graph of nodes. The latter can be customized by using PCBDDCSetLocalAdjacencyGraph() | |||
2921 | Additional information on dofs can be provided by using PCBDDCSetDofsSplitting(), PCBDDCSetDirichletBoundaries(), PCBDDCSetNeumannBoundaries(), and PCBDDCSetPrimalVerticesIS() and their local counterparts. | |||
2922 | ||||
2923 | Constraints can be customized by attaching a MatNullSpace object to the MATIS matrix via MatSetNearNullSpace(). Non-singular modes are retained via SVD. | |||
2924 | ||||
2925 | Change of basis is performed similarly to [2] when requested. When more than one constraint is present on a single connected component (i.e. an edge or a face), a robust method based on local QR factorizations is used. | |||
2926 | User defined change of basis can be passed to PCBDDC by using PCBDDCSetChangeOfBasisMat() | |||
2927 | ||||
2928 | The PETSc implementation also supports multilevel BDDC [3]. Coarse grids are partitioned using a MatPartitioning object. | |||
2929 | ||||
2930 | Adaptive selection of primal constraints [4] is supported for SPD systems with high-contrast in the coefficients if MUMPS or MKL_PARDISO are present. Future versions of the code will also consider using PASTIX. | |||
2931 | ||||
2932 | An experimental interface to the FETI-DP method is available. FETI-DP operators could be created using PCBDDCCreateFETIDPOperators(). A stand-alone class for the FETI-DP method will be provided in the next releases. | |||
2933 | Deluxe scaling is not supported yet for FETI-DP. | |||
2934 | ||||
2935 | Options Database Keys (some of them, run with -h for a complete list): | |||
2936 | ||||
2937 | . -pc_bddc_use_vertices <true> - use or not vertices in primal space | |||
2938 | . -pc_bddc_use_edges <true> - use or not edges in primal space | |||
2939 | . -pc_bddc_use_faces <false> - use or not faces in primal space | |||
2940 | . -pc_bddc_symmetric <true> - symmetric computation of primal basis functions. Specify false for unsymmetric problems | |||
2941 | . -pc_bddc_use_change_of_basis <false> - use change of basis approach (on edges only) | |||
2942 | . -pc_bddc_use_change_on_faces <false> - use change of basis approach on faces if change of basis has been requested | |||
2943 | . -pc_bddc_switch_static <false> - switches from M_2 (default) to M_3 operator (see reference article [1]) | |||
2944 | . -pc_bddc_levels <0> - maximum number of levels for multilevel | |||
2945 | . -pc_bddc_coarsening_ratio <8> - number of subdomains which will be aggregated together at the coarser level (e.g. H/h ratio at the coarser level, significative only in the multilevel case) | |||
2946 | . -pc_bddc_coarse_redistribute <0> - size of a subset of processors where the coarse problem will be remapped (the value is ignored if not at the coarsest level) | |||
2947 | . -pc_bddc_use_deluxe_scaling <false> - use deluxe scaling | |||
2948 | . -pc_bddc_schur_layers <-1> - select the economic version of deluxe scaling by specifying the number of layers (-1 corresponds to the original deluxe scaling) | |||
2949 | . -pc_bddc_adaptive_threshold <0.0> - when a value different than zero is specified, adaptive selection of constraints is performed on edges and faces (requires deluxe scaling and MUMPS or MKL_PARDISO installed) | |||
2950 | - -pc_bddc_check_level <0> - set verbosity level of debugging output | |||
2951 | ||||
2952 | Options for Dirichlet, Neumann or coarse solver can be set with | |||
2953 | .vb | |||
2954 | -pc_bddc_dirichlet_ | |||
2955 | -pc_bddc_neumann_ | |||
2956 | -pc_bddc_coarse_ | |||
2957 | .ve | |||
2958 | e.g -pc_bddc_dirichlet_ksp_type richardson -pc_bddc_dirichlet_pc_type gamg. PCBDDC uses by default KPSPREONLY and PCLU. | |||
2959 | ||||
2960 | When using a multilevel approach, solvers' options at the N-th level (N > 1) can be specified as | |||
2961 | .vb | |||
2962 | -pc_bddc_dirichlet_lN_ | |||
2963 | -pc_bddc_neumann_lN_ | |||
2964 | -pc_bddc_coarse_lN_ | |||
2965 | .ve | |||
2966 | Note that level number ranges from the finest (0) to the coarsest (N). | |||
2967 | In order to specify options for the BDDC operators at the coarser levels (and not for the solvers), prepend -pc_bddc_coarse_ or -pc_bddc_coarse_l to the option, e.g. | |||
2968 | .vb | |||
2969 | -pc_bddc_coarse_pc_bddc_adaptive_threshold 5 -pc_bddc_coarse_l1_pc_bddc_redistribute 3 | |||
2970 | .ve | |||
2971 | will use a threshold of 5 for constraints' selection at the first coarse level and will redistribute the coarse problem of the first coarse level on 3 processors | |||
2972 | ||||
2973 | Level: intermediate | |||
2974 | ||||
2975 | Developer Notes: | |||
2976 | ||||
2977 | Contributed by Stefano Zampini | |||
2978 | ||||
2979 | .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, MATIS | |||
2980 | M*/ | |||
2981 | ||||
2982 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PCCreate_BDDC(PC pc) | |||
2983 | { | |||
2984 | PetscErrorCode ierr; | |||
2985 | PC_BDDC *pcbddc; | |||
2986 | ||||
2987 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 2987; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
2988 | ierr = PetscNewLog(pc,&pcbddc)(PetscMallocA(1,PETSC_TRUE,2988,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,(size_t)(1)*sizeof(**(((&pcbddc)))),(((&pcbddc)))) || PetscLogObjectMemory((PetscObject)pc,sizeof(**(&pcbddc)) ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2988,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2989 | pc->data = (void*)pcbddc; | |||
2990 | ||||
2991 | /* create PCIS data structure */ | |||
2992 | ierr = PCISCreate(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2992,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2993 | ||||
2994 | /* create local graph structure */ | |||
2995 | ierr = PCBDDCGraphCreate(&pcbddc->mat_graph);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),2995,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
2996 | ||||
2997 | /* BDDC nonzero defaults */ | |||
2998 | pcbddc->use_local_adj = PETSC_TRUE; | |||
2999 | pcbddc->use_vertices = PETSC_TRUE; | |||
3000 | pcbddc->use_edges = PETSC_TRUE; | |||
3001 | pcbddc->symmetric_primal = PETSC_TRUE; | |||
3002 | pcbddc->vertex_size = 1; | |||
3003 | pcbddc->recompute_topography = PETSC_TRUE; | |||
3004 | pcbddc->coarse_size = -1; | |||
3005 | pcbddc->use_exact_dirichlet_trick = PETSC_TRUE; | |||
3006 | pcbddc->coarsening_ratio = 8; | |||
3007 | pcbddc->coarse_eqs_per_proc = 1; | |||
3008 | pcbddc->benign_compute_correction = PETSC_TRUE; | |||
3009 | pcbddc->nedfield = -1; | |||
3010 | pcbddc->nedglobal = PETSC_TRUE; | |||
3011 | pcbddc->graphmaxcount = PETSC_MAX_INT2147483647; | |||
3012 | pcbddc->sub_schurs_layers = -1; | |||
3013 | pcbddc->adaptive_threshold[0] = 0.0; | |||
3014 | pcbddc->adaptive_threshold[1] = 0.0; | |||
3015 | ||||
3016 | /* function pointers */ | |||
3017 | pc->ops->apply = PCApply_BDDC; | |||
3018 | pc->ops->applytranspose = PCApplyTranspose_BDDC; | |||
3019 | pc->ops->setup = PCSetUp_BDDC; | |||
3020 | pc->ops->destroy = PCDestroy_BDDC; | |||
3021 | pc->ops->setfromoptions = PCSetFromOptions_BDDC; | |||
3022 | pc->ops->view = PCView_BDDC; | |||
3023 | pc->ops->applyrichardson = 0; | |||
3024 | pc->ops->applysymmetricleft = 0; | |||
3025 | pc->ops->applysymmetricright = 0; | |||
3026 | pc->ops->presolve = PCPreSolve_BDDC; | |||
3027 | pc->ops->postsolve = PCPostSolve_BDDC; | |||
3028 | pc->ops->reset = PCReset_BDDC; | |||
3029 | ||||
3030 | /* composing function */ | |||
3031 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDiscreteGradient_C",PCBDDCSetDiscreteGradient_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDiscreteGradient_C" ,(PetscVoidFunction)(PCBDDCSetDiscreteGradient_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3031,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3032 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDivergenceMat_C",PCBDDCSetDivergenceMat_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDivergenceMat_C" ,(PetscVoidFunction)(PCBDDCSetDivergenceMat_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3032,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3033 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetChangeOfBasisMat_C",PCBDDCSetChangeOfBasisMat_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetChangeOfBasisMat_C" ,(PetscVoidFunction)(PCBDDCSetChangeOfBasisMat_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3033,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3034 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetPrimalVerticesLocalIS_C",PCBDDCSetPrimalVerticesLocalIS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetPrimalVerticesLocalIS_C" ,(PetscVoidFunction)(PCBDDCSetPrimalVerticesLocalIS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3034,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3035 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetPrimalVerticesIS_C",PCBDDCSetPrimalVerticesIS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetPrimalVerticesIS_C" ,(PetscVoidFunction)(PCBDDCSetPrimalVerticesIS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3035,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3036 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetPrimalVerticesLocalIS_C",PCBDDCGetPrimalVerticesLocalIS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetPrimalVerticesLocalIS_C" ,(PetscVoidFunction)(PCBDDCGetPrimalVerticesLocalIS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3036,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3037 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetPrimalVerticesIS_C",PCBDDCGetPrimalVerticesIS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetPrimalVerticesIS_C" ,(PetscVoidFunction)(PCBDDCGetPrimalVerticesIS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3037,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3038 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetCoarseningRatio_C",PCBDDCSetCoarseningRatio_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetCoarseningRatio_C" ,(PetscVoidFunction)(PCBDDCSetCoarseningRatio_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3038,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3039 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLevel_C",PCBDDCSetLevel_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLevel_C" ,(PetscVoidFunction)(PCBDDCSetLevel_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3039,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3040 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetUseExactDirichlet_C",PCBDDCSetUseExactDirichlet_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetUseExactDirichlet_C" ,(PetscVoidFunction)(PCBDDCSetUseExactDirichlet_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3040,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3041 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLevels_C",PCBDDCSetLevels_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLevels_C" ,(PetscVoidFunction)(PCBDDCSetLevels_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3041,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3042 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDirichletBoundaries_C",PCBDDCSetDirichletBoundaries_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDirichletBoundaries_C" ,(PetscVoidFunction)(PCBDDCSetDirichletBoundaries_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3042,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3043 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDirichletBoundariesLocal_C",PCBDDCSetDirichletBoundariesLocal_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDirichletBoundariesLocal_C" ,(PetscVoidFunction)(PCBDDCSetDirichletBoundariesLocal_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3043,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3044 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetNeumannBoundaries_C",PCBDDCSetNeumannBoundaries_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetNeumannBoundaries_C" ,(PetscVoidFunction)(PCBDDCSetNeumannBoundaries_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3044,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3045 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetNeumannBoundariesLocal_C",PCBDDCSetNeumannBoundariesLocal_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetNeumannBoundariesLocal_C" ,(PetscVoidFunction)(PCBDDCSetNeumannBoundariesLocal_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3045,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3046 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetDirichletBoundaries_C",PCBDDCGetDirichletBoundaries_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetDirichletBoundaries_C" ,(PetscVoidFunction)(PCBDDCGetDirichletBoundaries_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3046,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3047 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetDirichletBoundariesLocal_C",PCBDDCGetDirichletBoundariesLocal_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetDirichletBoundariesLocal_C" ,(PetscVoidFunction)(PCBDDCGetDirichletBoundariesLocal_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3047,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3048 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetNeumannBoundaries_C",PCBDDCGetNeumannBoundaries_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetNeumannBoundaries_C" ,(PetscVoidFunction)(PCBDDCGetNeumannBoundaries_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3048,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3049 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCGetNeumannBoundariesLocal_C",PCBDDCGetNeumannBoundariesLocal_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCGetNeumannBoundariesLocal_C" ,(PetscVoidFunction)(PCBDDCGetNeumannBoundariesLocal_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3049,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3050 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDofsSplitting_C",PCBDDCSetDofsSplitting_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDofsSplitting_C" ,(PetscVoidFunction)(PCBDDCSetDofsSplitting_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3050,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3051 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetDofsSplittingLocal_C",PCBDDCSetDofsSplittingLocal_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetDofsSplittingLocal_C" ,(PetscVoidFunction)(PCBDDCSetDofsSplittingLocal_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3051,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3052 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCSetLocalAdjacencyGraph_C",PCBDDCSetLocalAdjacencyGraph_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCSetLocalAdjacencyGraph_C" ,(PetscVoidFunction)(PCBDDCSetLocalAdjacencyGraph_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3052,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3053 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCCreateFETIDPOperators_C",PCBDDCCreateFETIDPOperators_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCCreateFETIDPOperators_C" ,(PetscVoidFunction)(PCBDDCCreateFETIDPOperators_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3053,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3054 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCMatFETIDPGetRHS_C",PCBDDCMatFETIDPGetRHS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCMatFETIDPGetRHS_C" ,(PetscVoidFunction)(PCBDDCMatFETIDPGetRHS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3054,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3055 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCBDDCMatFETIDPGetSolution_C",PCBDDCMatFETIDPGetSolution_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCBDDCMatFETIDPGetSolution_C" ,(PetscVoidFunction)(PCBDDCMatFETIDPGetSolution_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3055,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3056 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",PCPreSolveChangeRHS_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCPreSolveChangeRHS_C" ,(PetscVoidFunction)(PCPreSolveChangeRHS_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3056,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3057 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",PCSetCoordinates_BDDC)PetscObjectComposeFunction_Private((PetscObject)pc,"PCSetCoordinates_C" ,(PetscVoidFunction)(PCSetCoordinates_BDDC));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3057,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3058 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3059 | } | |||
3060 | ||||
3061 | /*@C | |||
3062 | PCBDDCInitializePackage - This function initializes everything in the PCBDDC package. It is called | |||
3063 | from PCInitializePackage(). | |||
3064 | ||||
3065 | Level: developer | |||
3066 | ||||
3067 | .seealso: PetscInitialize() | |||
3068 | @*/ | |||
3069 | PetscErrorCode PCBDDCInitializePackage(void) | |||
3070 | { | |||
3071 | PetscErrorCode ierr; | |||
3072 | int i; | |||
3073 | ||||
3074 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 3074; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3075 | if (PCBDDCPackageInitialized) PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3076 | PCBDDCPackageInitialized = PETSC_TRUE; | |||
3077 | ierr = PetscRegisterFinalize(PCBDDCFinalizePackage);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3077,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3078 | ||||
3079 | /* general events */ | |||
3080 | ierr = PetscLogEventRegister("PCBDDCTopo",PC_CLASSID,&PC_BDDC_Topology[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3080,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3081 | ierr = PetscLogEventRegister("PCBDDCLKSP",PC_CLASSID,&PC_BDDC_LocalSolvers[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3081,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3082 | ierr = PetscLogEventRegister("PCBDDCLWor",PC_CLASSID,&PC_BDDC_LocalWork[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3082,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3083 | ierr = PetscLogEventRegister("PCBDDCCorr",PC_CLASSID,&PC_BDDC_CorrectionSetUp[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3083,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3084 | ierr = PetscLogEventRegister("PCBDDCCSet",PC_CLASSID,&PC_BDDC_CoarseSetUp[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3084,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3085 | ierr = PetscLogEventRegister("PCBDDCCKSP",PC_CLASSID,&PC_BDDC_CoarseSolver[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3085,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3086 | ierr = PetscLogEventRegister("PCBDDCAdap",PC_CLASSID,&PC_BDDC_AdaptiveSetUp[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3086,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3087 | ierr = PetscLogEventRegister("PCBDDCScal",PC_CLASSID,&PC_BDDC_Scaling[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3087,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3088 | ierr = PetscLogEventRegister("PCBDDCSchr",PC_CLASSID,&PC_BDDC_Schurs[0]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3088,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3089 | for (i=1;i<PETSC_PCBDDC_MAXLEVELS8;i++) { | |||
3090 | char ename[32]; | |||
3091 | ||||
3092 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCTopo l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3092,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3093 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_Topology[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3093,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3094 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCLKSP l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3094,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3095 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_LocalSolvers[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3095,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3096 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCLWor l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3096,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3097 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_LocalWork[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3097,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3098 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCCorr l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3098,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3099 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_CorrectionSetUp[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3099,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3100 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCCSet l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3100,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3101 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_CoarseSetUp[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3101,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3102 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCCKSP l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3102,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3103 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_CoarseSolver[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3103,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3104 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCAdap l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3104,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3105 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_AdaptiveSetUp[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3105,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3106 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCScal l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3106,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3107 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_Scaling[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3107,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3108 | ierr = PetscSNPrintf(ename,sizeof(ename),"PCBDDCSchr l%02d",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3108,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3109 | ierr = PetscLogEventRegister(ename,PC_CLASSID,&PC_BDDC_Schurs[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),3109,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
3110 | } | |||
3111 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3112 | } | |||
3113 | ||||
3114 | /*@C | |||
3115 | PCBDDCFinalizePackage - This function frees everything from the PCBDDC package. It is | |||
3116 | called from PetscFinalize() automatically. | |||
3117 | ||||
3118 | Level: developer | |||
3119 | ||||
3120 | .seealso: PetscFinalize() | |||
3121 | @*/ | |||
3122 | PetscErrorCode PCBDDCFinalizePackage(void) | |||
3123 | { | |||
3124 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/bddc/bddc.c"; petscstack ->line[petscstack->currentsize] = 3124; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
3125 | PCBDDCPackageInitialized = PETSC_FALSE; | |||
3126 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
3127 | } |