Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | /* | ||
11 | This is a nonlinear eigenvalue problem. When p=2, it is reduced to a linear Laplace eigenvalue | ||
12 | problem. | ||
13 | |||
14 | -\nabla\cdot(|\nabla u|^{p-2} \nabla u) = k |u|^{p-2} u in (0,1)x(0,1), | ||
15 | |||
16 | u = 0 on the entire boundary. | ||
17 | |||
18 | The code is implemented based on DMPlex using Q1 FEM on a quadrilateral mesh. In this code, we consider p=3. | ||
19 | |||
20 | Contributed by Fande Kong fdkong.jd@gmail.com | ||
21 | */ | ||
22 | |||
23 | static char help[] = "Nonlinear inverse iteration for A(x)*x=lambda*B(x)*x.\n\n"; | ||
24 | |||
25 | #include <slepceps.h> | ||
26 | #include <petscdmplex.h> | ||
27 | #include <petscds.h> | ||
28 | |||
29 | PetscErrorCode CreateSquareMesh(MPI_Comm,DM*); | ||
30 | PetscErrorCode SetupDiscretization(DM); | ||
31 | PetscErrorCode FormJacobianA(SNES,Vec,Mat,Mat,void*); | ||
32 | PetscErrorCode FormFunctionA(SNES,Vec,Vec,void*); | ||
33 | PetscErrorCode MatMult_A(Mat A,Vec x,Vec y); | ||
34 | PetscErrorCode FormJacobianB(SNES,Vec,Mat,Mat,void*); | ||
35 | PetscErrorCode FormFunctionB(SNES,Vec,Vec,void*); | ||
36 | PetscErrorCode MatMult_B(Mat A,Vec x,Vec y); | ||
37 | PetscErrorCode FormFunctionAB(SNES,Vec,Vec,Vec,void*); | ||
38 | PetscErrorCode BoundaryGlobalIndex(DM,const char*,IS*); | ||
39 | PetscErrorCode FormNorm(SNES,Vec,PetscReal*,void*); | ||
40 | |||
41 | typedef struct { | ||
42 | IS bdis; /* global indices for boundary DoFs */ | ||
43 | SNES snes; | ||
44 | EPS eps; | ||
45 | } AppCtx; | ||
46 | |||
47 | 180 | int main(int argc,char **argv) | |
48 | { | ||
49 | 180 | DM dm; | |
50 | 180 | MPI_Comm comm; | |
51 | 180 | AppCtx user; | |
52 | 180 | EPS eps; /* eigenproblem solver context */ | |
53 | 180 | ST st; | |
54 | 180 | EPSType type; | |
55 | 180 | Mat A,B,P; | |
56 | 180 | Vec v0; | |
57 | 180 | PetscContainer container; | |
58 | 180 | PetscInt nev,nconv,m,n,M,N; | |
59 | 180 | PetscBool nonlin,flg=PETSC_FALSE,update; | |
60 | 180 | SNES snes; | |
61 | 180 | PetscReal tol,relerr; | |
62 | 180 | PetscBool use_shell_matrix=PETSC_FALSE,test_init_sol=PETSC_FALSE,use_custom_norm=PETSC_FALSE,sign_normalization=PETSC_TRUE; | |
63 | |||
64 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBeginUser; |
65 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(SlepcInitialize(&argc,&argv,NULL,help)); |
66 | 180 | comm = PETSC_COMM_WORLD; | |
67 | /* Create a quadrilateral mesh on domain (0,1)x(0,1) */ | ||
68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(CreateSquareMesh(comm,&dm)); |
69 | /* Setup basis function */ | ||
70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(SetupDiscretization(dm)); |
71 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(BoundaryGlobalIndex(dm,"marker",&user.bdis)); |
72 | /* Check if we are going to use shell matrices */ | ||
73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-use_shell_matrix",&use_shell_matrix,NULL)); |
74 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
180 | if (use_shell_matrix) { |
75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(DMCreateMatrix(dm,&P)); |
76 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatGetLocalSize(P,&m,&n)); |
77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatGetSize(P,&M,&N)); |
78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatCreateShell(comm,m,n,M,N,&user,&A)); |
79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatShellSetOperation(A,MATOP_MULT,(PetscErrorCodeFn*)MatMult_A)); |
80 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatCreateShell(comm,m,n,M,N,&user,&B)); |
81 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(MatShellSetOperation(B,MATOP_MULT,(PetscErrorCodeFn*)MatMult_B)); |
82 | } else { | ||
83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
110 | PetscCall(DMCreateMatrix(dm,&A)); |
84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
110 | PetscCall(MatDuplicate(A,MAT_COPY_VALUES,&B)); |
85 | } | ||
86 | /* Check whether we should use a custom normalization */ | ||
87 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-use_custom_norm",&use_custom_norm,NULL)); |
88 | /* Check whether we should normalize Bx by the sign of its first nonzero element */ | ||
89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-sign_normalization",&sign_normalization,NULL)); |
90 | |||
91 | /* | ||
92 | Compose callback functions and context that will be needed by the solver | ||
93 | */ | ||
94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectComposeFunction((PetscObject)A,"formFunction",FormFunctionA)); |
95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-form_function_ab",&flg,NULL)); |
96 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (flg) PetscCall(PetscObjectComposeFunction((PetscObject)A,"formFunctionAB",FormFunctionAB)); |
97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectComposeFunction((PetscObject)A,"formJacobian",FormJacobianA)); |
98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectComposeFunction((PetscObject)B,"formFunction",FormFunctionB)); |
99 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (use_custom_norm) PetscCall(PetscObjectComposeFunction((PetscObject)B,"formNorm",FormNorm)); |
100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscContainerCreate(comm,&container)); |
101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscContainerSetPointer(container,&user)); |
102 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectCompose((PetscObject)A,"formFunctionCtx",(PetscObject)container)); |
103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectCompose((PetscObject)A,"formJacobianCtx",(PetscObject)container)); |
104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectCompose((PetscObject)B,"formFunctionCtx",(PetscObject)container)); |
105 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (use_custom_norm) PetscCall(PetscObjectCompose((PetscObject)B,"formNormCtx",(PetscObject)container)); |
106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscContainerDestroy(&container)); |
107 | |||
108 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
109 | Create the eigensolver and set various options | ||
110 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
111 | |||
112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSCreate(comm,&eps)); |
113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSSetOperators(eps,A,B)); |
114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSSetProblemType(eps,EPS_GNHEP)); |
115 | 180 | user.eps = eps; | |
116 | /* | ||
117 | Use nonlinear inverse iteration | ||
118 | */ | ||
119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSSetType(eps,EPSPOWER)); |
120 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSPowerSetNonlinear(eps,PETSC_TRUE)); |
121 | /* Set the Bx sign normalization (or not) */ | ||
122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSPowerSetSignNormalization(eps,sign_normalization)); |
123 | /* | ||
124 | Attach DM to SNES | ||
125 | */ | ||
126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSPowerGetSNES(eps,&snes)); |
127 | 180 | user.snes = snes; | |
128 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(SNESSetDM(snes,dm)); |
129 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSSetFromOptions(eps)); |
130 | |||
131 | /* Set a preconditioning matrix to ST */ | ||
132 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
180 | if (use_shell_matrix) { |
133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(EPSGetST(eps,&st)); |
134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70 | PetscCall(STSetPreconditionerMat(st,P)); |
135 | } | ||
136 | |||
137 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
138 | Solve the eigensystem | ||
139 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
140 | |||
141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSSolve(eps)); |
142 | |||
143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetConverged(eps,&nconv)); |
144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-test_init_sol",&test_init_sol,NULL)); |
145 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
180 | if (nconv && test_init_sol) { |
146 | 20 | PetscScalar k; | |
147 | 20 | PetscReal norm0; | |
148 | 20 | PetscInt nits; | |
149 | |||
150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(MatCreateVecs(A,&v0,NULL)); |
151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(EPSGetEigenpair(eps,0,&k,NULL,v0,NULL)); |
152 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(EPSSetInitialSpace(eps,1,&v0)); |
153 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(VecDestroy(&v0)); |
154 | /* Norm of the previous residual */ | ||
155 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(SNESGetFunctionNorm(snes,&norm0)); |
156 | /* Make the tolerance smaller than the last residual | ||
157 | SNES will converge right away if the initial is setup correctly */ | ||
158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(SNESSetTolerances(snes,norm0*1.2,PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT)); |
159 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(EPSSolve(eps)); |
160 | /* Number of Newton iterations supposes to be zero */ | ||
161 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(SNESGetIterationNumber(snes,&nits)); |
162 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
20 | if (nits) PetscCall(PetscPrintf(comm," Number of Newton iterations %" PetscInt_FMT " should be zero \n",nits)); |
163 | } | ||
164 | |||
165 | /* | ||
166 | Optional: Get some information from the solver and display it | ||
167 | */ | ||
168 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetType(eps,&type)); |
169 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetTolerances(eps,&tol,NULL)); |
170 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSPowerGetNonlinear(eps,&nonlin)); |
171 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSPowerGetUpdate(eps,&update)); |
172 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
230 | PetscCall(PetscPrintf(comm," Solution method: %s%s\n\n",type,nonlin?(update?" (nonlinear with monolithic update)":" (nonlinear)"):"")); |
173 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetDimensions(eps,&nev,NULL,NULL)); |
174 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscPrintf(comm," Number of requested eigenvalues: %" PetscInt_FMT "\n",nev)); |
175 | |||
176 | /* print eigenvalue and error */ | ||
177 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetConverged(eps,&nconv)); |
178 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
180 | if (nconv>0) { |
179 | 180 | PetscScalar k; | |
180 | 180 | PetscReal na,nb; | |
181 | 180 | Vec a,b,eigen; | |
182 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMCreateGlobalVector(dm,&a)); |
183 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecDuplicate(a,&b)); |
184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecDuplicate(a,&eigen)); |
185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSGetEigenpair(eps,0,&k,NULL,eigen,NULL)); |
186 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(FormFunctionA(snes,eigen,a,&user)); |
187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(FormFunctionB(snes,eigen,b,&user)); |
188 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecAXPY(a,-k,b)); |
189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecNorm(a,NORM_2,&na)); |
190 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (use_custom_norm) PetscCall(FormNorm(snes,b,&nb,&user)); |
191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
125 | else PetscCall(VecNorm(b,NORM_2,&nb)); |
192 | 180 | relerr = na/(nb*PetscAbsScalar(k)); | |
193 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (relerr<10*tol) PetscCall(PetscPrintf(comm,"k: %g, relative error below tol\n",(double)PetscRealPart(k))); |
194 | ✗ | else PetscCall(PetscPrintf(comm,"k: %g, relative error: %g\n",(double)PetscRealPart(k),(double)relerr)); | |
195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecDestroy(&a)); |
196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecDestroy(&b)); |
197 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecDestroy(&eigen)); |
198 | ✗ | } else PetscCall(PetscPrintf(comm,"Solver did not converge\n")); | |
199 | |||
200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatDestroy(&A)); |
201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatDestroy(&B)); |
202 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
180 | if (use_shell_matrix) PetscCall(MatDestroy(&P)); |
203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMDestroy(&dm)); |
204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(EPSDestroy(&eps)); |
205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISDestroy(&user.bdis)); |
206 |
3/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
180 | PetscCall(SlepcFinalize()); |
207 | return 0; | ||
208 | } | ||
209 | |||
210 | /* <|u|u, v> */ | ||
211 | 2033920 | static void f0_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, | |
212 | const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], | ||
213 | const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], | ||
214 | PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) | ||
215 | { | ||
216 | 2033920 | PetscScalar cof = PetscAbsScalar(u[0]); | |
217 | |||
218 | 2033920 | f0[0] = cof*u[0]; | |
219 | 2033920 | } | |
220 | |||
221 | /* <|\nabla u| \nabla u, \nabla v> */ | ||
222 | 34968320 | static void f1_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, | |
223 | const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], | ||
224 | const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], | ||
225 | PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) | ||
226 | { | ||
227 | 34968320 | PetscInt d; | |
228 | 34968320 | PetscScalar cof = 0; | |
229 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
104904960 | for (d = 0; d < dim; ++d) cof += u_x[d]*u_x[d]; |
230 | |||
231 | 34968320 | cof = PetscSqrtScalar(cof); | |
232 | |||
233 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
104904960 | for (d = 0; d < dim; ++d) f1[d] = u_x[d]*cof; |
234 | 34968320 | } | |
235 | |||
236 | /* approximate Jacobian for <|u|u, v> */ | ||
237 | ✗ | static void g0_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, | |
238 | const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], | ||
239 | const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], | ||
240 | PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g0[]) | ||
241 | { | ||
242 | ✗ | g0[0] = 1.0*PetscAbsScalar(u[0]); | |
243 | ✗ | } | |
244 | |||
245 | /* approximate Jacobian for <|\nabla u| \nabla u, \nabla v> */ | ||
246 | 2078720 | static void g3_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, | |
247 | const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], | ||
248 | const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], | ||
249 | PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) | ||
250 | { | ||
251 | 2078720 | PetscInt d; | |
252 | |||
253 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6236160 | for (d = 0; d < dim; ++d) g3[d*dim+d] = 1.0; |
254 | 2078720 | } | |
255 | |||
256 | 180 | PetscErrorCode SetupDiscretization(DM dm) | |
257 | { | ||
258 | 180 | PetscFE fe; | |
259 | 180 | MPI_Comm comm; | |
260 | |||
261 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBeginUser; |
262 | /* Create finite element */ | ||
263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectGetComm((PetscObject)dm,&comm)); |
264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscFECreateDefault(comm,2,1,PETSC_FALSE,NULL,-1,&fe)); |
265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscObjectSetName((PetscObject)fe,"u")); |
266 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMSetField(dm,0,NULL,(PetscObject)fe)); |
267 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMCreateDS(dm)); |
268 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscFEDestroy(&fe)); |
269 |
5/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
36 | PetscFunctionReturn(PETSC_SUCCESS); |
270 | } | ||
271 | |||
272 | 180 | PetscErrorCode CreateSquareMesh(MPI_Comm comm,DM *dm) | |
273 | { | ||
274 | 180 | PetscInt cells[] = {8,8}; | |
275 | 180 | PetscInt dim = 2; | |
276 | 180 | DM pdm; | |
277 | 180 | PetscMPIInt size; | |
278 | |||
279 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBegin; |
280 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMPlexCreateBoxMesh(comm,dim,PETSC_FALSE,cells,NULL,NULL,NULL,PETSC_TRUE,0,PETSC_TRUE,dm)); |
281 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMSetFromOptions(*dm)); |
282 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMSetUp(*dm)); |
283 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
180 | PetscCallMPI(MPI_Comm_size(comm,&size)); |
284 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
180 | if (size > 1) { |
285 | ✗ | PetscCall(DMPlexDistribute(*dm,0,NULL,&pdm)); | |
286 | ✗ | PetscCall(DMDestroy(dm)); | |
287 | ✗ | *dm = pdm; | |
288 | } | ||
289 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
36 | PetscFunctionReturn(PETSC_SUCCESS); |
290 | } | ||
291 | |||
292 | 180 | PetscErrorCode BoundaryGlobalIndex(DM dm,const char labelname[],IS *bdis) | |
293 | { | ||
294 | 180 | IS bdpoints; | |
295 | 180 | PetscInt nindices,*indices,numDof,offset,npoints,i,j; | |
296 | 180 | const PetscInt *bdpoints_indices; | |
297 | 180 | DMLabel bdmarker; | |
298 | 180 | PetscSection gsection; | |
299 | |||
300 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBegin; |
301 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMGetGlobalSection(dm,&gsection)); |
302 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMGetLabel(dm,labelname,&bdmarker)); |
303 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(DMLabelGetStratumIS(bdmarker,1,&bdpoints)); |
304 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISGetLocalSize(bdpoints,&npoints)); |
305 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISGetIndices(bdpoints,&bdpoints_indices)); |
306 | nindices = 0; | ||
307 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11700 | for (i=0;i<npoints;i++) { |
308 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11520 | PetscCall(PetscSectionGetDof(gsection,bdpoints_indices[i],&numDof)); |
309 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11520 | if (numDof<=0) continue; |
310 | 5760 | nindices += numDof; | |
311 | } | ||
312 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscCalloc1(nindices,&indices)); |
313 | nindices = 0; | ||
314 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11700 | for (i=0;i<npoints;i++) { |
315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11520 | PetscCall(PetscSectionGetDof(gsection,bdpoints_indices[i],&numDof)); |
316 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11520 | if (numDof<=0) continue; |
317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5760 | PetscCall(PetscSectionGetOffset(gsection,bdpoints_indices[i],&offset)); |
318 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11520 | for (j=0;j<numDof;j++) indices[nindices++] = offset+j; |
319 | } | ||
320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISRestoreIndices(bdpoints,&bdpoints_indices)); |
321 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISDestroy(&bdpoints)); |
322 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm),nindices,indices,PETSC_OWN_POINTER,bdis)); |
323 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
36 | PetscFunctionReturn(PETSC_SUCCESS); |
324 | } | ||
325 | |||
326 | 8120 | static PetscErrorCode FormJacobian(SNES snes,Vec X,Mat A,Mat B,void *ctx) | |
327 | { | ||
328 | 8120 | DM dm; | |
329 | 8120 | Vec Xloc; | |
330 | |||
331 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8120 | PetscFunctionBegin; |
332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(SNESGetDM(snes,&dm)); |
333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMGetLocalVector(dm,&Xloc)); |
334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(VecZeroEntries(Xloc)); |
335 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMGlobalToLocalBegin(dm,X,INSERT_VALUES,Xloc)); |
336 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMGlobalToLocalEnd(dm,X,INSERT_VALUES,Xloc)); |
337 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
8120 | CHKMEMQ; |
338 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMPlexSNESComputeJacobianFEM(dm,Xloc,A,B,ctx)); |
339 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8120 | if (A!=B) { |
340 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4030 | PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); |
341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4030 | PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); |
342 | } | ||
343 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
8120 | CHKMEMQ; |
344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMRestoreLocalVector(dm,&Xloc)); |
345 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1624 | PetscFunctionReturn(PETSC_SUCCESS); |
346 | } | ||
347 | |||
348 | 8120 | PetscErrorCode FormJacobianA(SNES snes,Vec X,Mat A,Mat B,void *ctx) | |
349 | { | ||
350 | 8120 | DM dm; | |
351 | 8120 | PetscDS prob; | |
352 | 8120 | PetscWeakForm wf; | |
353 | 8120 | AppCtx *userctx = (AppCtx *)ctx; | |
354 | |||
355 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8120 | PetscFunctionBegin; |
356 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(MatSetOption(B,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE)); |
357 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(SNESGetDM(snes,&dm)); |
358 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(DMGetDS(dm,&prob)); |
359 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(PetscDSGetWeakForm(prob, &wf)); |
360 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(PetscWeakFormClearIndex(wf, NULL, 0, 0, 0, PETSC_WF_G3, 0)); |
361 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(PetscWeakFormSetIndexJacobian(wf, NULL, 0, 0, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0, g3_uu)); |
362 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(FormJacobian(snes,X,A,B,ctx)); |
363 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8120 | PetscCall(MatZeroRowsIS(B,userctx->bdis,1.0,NULL,NULL)); |
364 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1624 | PetscFunctionReturn(PETSC_SUCCESS); |
365 | } | ||
366 | |||
367 | ✗ | PetscErrorCode FormJacobianB(SNES snes,Vec X,Mat A,Mat B,void *ctx) | |
368 | { | ||
369 | ✗ | DM dm; | |
370 | ✗ | PetscDS prob; | |
371 | ✗ | PetscWeakForm wf; | |
372 | ✗ | AppCtx *userctx = (AppCtx *)ctx; | |
373 | |||
374 | ✗ | PetscFunctionBegin; | |
375 | ✗ | PetscCall(MatSetOption(B,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE)); | |
376 | ✗ | PetscCall(SNESGetDM(snes,&dm)); | |
377 | ✗ | PetscCall(DMGetDS(dm,&prob)); | |
378 | ✗ | PetscCall(PetscDSGetWeakForm(prob, &wf)); | |
379 | ✗ | PetscCall(PetscWeakFormClearIndex(wf, NULL, 0, 0, 0, PETSC_WF_G3, 0)); | |
380 | ✗ | PetscCall(PetscWeakFormSetIndexJacobian(wf, NULL, 0, 0, 0, 0, 0, g0_uu, 0, NULL, 0, NULL, 0, NULL)); | |
381 | ✗ | PetscCall(FormJacobian(snes,X,A,B,ctx)); | |
382 | ✗ | PetscCall(MatZeroRowsIS(B,userctx->bdis,0.0,NULL,NULL)); | |
383 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
384 | } | ||
385 | |||
386 | 2295 | PetscErrorCode FormFunctionAB(SNES snes,Vec x,Vec Ax,Vec Bx,void *ctx) | |
387 | { | ||
388 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2295 | PetscFunctionBegin; |
389 | /* | ||
390 | * In real applications, users should have a generic formFunctionAB which | ||
391 | * forms Ax and Bx simultaneously for a more efficient calculation. | ||
392 | * In this example, we just call FormFunctionA+FormFunctionB to mimic how | ||
393 | * to use FormFunctionAB | ||
394 | */ | ||
395 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2295 | PetscCall(FormFunctionA(snes,x,Ax,ctx)); |
396 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2295 | PetscCall(FormFunctionB(snes,x,Bx,ctx)); |
397 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
459 | PetscFunctionReturn(PETSC_SUCCESS); |
398 | } | ||
399 | |||
400 | 144540 | static PetscErrorCode FormFunction(SNES snes,Vec X,Vec F,void *ctx) | |
401 | { | ||
402 | 144540 | DM dm; | |
403 | 144540 | Vec Xloc,Floc; | |
404 | |||
405 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
144540 | PetscFunctionBegin; |
406 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(SNESGetDM(snes,&dm)); |
407 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMGetLocalVector(dm,&Xloc)); |
408 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMGetLocalVector(dm,&Floc)); |
409 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(VecZeroEntries(Xloc)); |
410 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(VecZeroEntries(Floc)); |
411 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMGlobalToLocalBegin(dm,X,INSERT_VALUES,Xloc)); |
412 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMGlobalToLocalEnd(dm,X,INSERT_VALUES,Xloc)); |
413 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
144540 | CHKMEMQ; |
414 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMPlexSNESComputeResidualFEM(dm,Xloc,Floc,ctx)); |
415 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
144540 | CHKMEMQ; |
416 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(VecZeroEntries(F)); |
417 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMLocalToGlobalBegin(dm,Floc,ADD_VALUES,F)); |
418 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMLocalToGlobalEnd(dm,Floc,ADD_VALUES,F)); |
419 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMRestoreLocalVector(dm,&Xloc)); |
420 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144540 | PetscCall(DMRestoreLocalVector(dm,&Floc)); |
421 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
28908 | PetscFunctionReturn(PETSC_SUCCESS); |
422 | } | ||
423 | |||
424 | 136595 | PetscErrorCode FormFunctionA(SNES snes,Vec X,Vec F,void *ctx) | |
425 | { | ||
426 | 136595 | DM dm; | |
427 | 136595 | PetscDS prob; | |
428 | 136595 | PetscWeakForm wf; | |
429 | 136595 | PetscInt nindices,iStart,iEnd,i; | |
430 | 136595 | AppCtx *userctx = (AppCtx *)ctx; | |
431 | 136595 | PetscScalar *array,value; | |
432 | 136595 | const PetscInt *indices; | |
433 | 136595 | PetscInt vecstate; | |
434 | |||
435 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
136595 | PetscFunctionBegin; |
436 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(SNESGetDM(snes,&dm)); |
437 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(DMGetDS(dm,&prob)); |
438 | /* hook functions */ | ||
439 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(PetscDSGetWeakForm(prob, &wf)); |
440 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(PetscWeakFormClearIndex(wf, NULL, 0, 0, 0, PETSC_WF_F0, 0)); |
441 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(PetscWeakFormSetIndexResidual(wf, NULL, 0, 0, 0, 0, NULL, 0, f1_u)); |
442 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(FormFunction(snes,X,F,ctx)); |
443 | /* Boundary condition */ | ||
444 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecLockGet(X,&vecstate)); |
445 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
136595 | if (vecstate>0) PetscCall(VecLockReadPop(X)); |
446 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecGetOwnershipRange(X,&iStart,&iEnd)); |
447 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecGetArray(X,&array)); |
448 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(ISGetLocalSize(userctx->bdis,&nindices)); |
449 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(ISGetIndices(userctx->bdis,&indices)); |
450 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4507635 | for (i=0;i<nindices;i++) { |
451 | 4371040 | value = array[indices[i]-iStart] - 0.0; | |
452 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4371040 | PetscCall(VecSetValue(F,indices[i],value,INSERT_VALUES)); |
453 | } | ||
454 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(ISRestoreIndices(userctx->bdis,&indices)); |
455 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecRestoreArray(X,&array)); |
456 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
136595 | if (vecstate>0) PetscCall(VecLockReadPush(X)); |
457 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecAssemblyBegin(F)); |
458 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136595 | PetscCall(VecAssemblyEnd(F)); |
459 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
27319 | PetscFunctionReturn(PETSC_SUCCESS); |
460 | } | ||
461 | |||
462 | 2535 | PetscErrorCode FormNorm(SNES snes,Vec Bx,PetscReal *norm,void *ctx) | |
463 | { | ||
464 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2535 | PetscFunctionBegin; |
465 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2535 | PetscCall(VecNorm(Bx,NORM_2,norm)); |
466 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
507 | PetscFunctionReturn(PETSC_SUCCESS); |
467 | } | ||
468 | |||
469 | ✗ | PetscErrorCode MatMult_A(Mat A,Vec x,Vec y) | |
470 | { | ||
471 | ✗ | AppCtx *userctx; | |
472 | |||
473 | ✗ | PetscFunctionBegin; | |
474 | ✗ | PetscCall(MatShellGetContext(A,&userctx)); | |
475 | ✗ | PetscCall(FormFunctionA(userctx->snes,x,y,userctx)); | |
476 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
477 | } | ||
478 | |||
479 | 7945 | PetscErrorCode FormFunctionB(SNES snes,Vec X,Vec F,void *ctx) | |
480 | { | ||
481 | 7945 | DM dm; | |
482 | 7945 | PetscDS prob; | |
483 | 7945 | PetscWeakForm wf; | |
484 | 7945 | PetscInt nindices,iStart,iEnd,i; | |
485 | 7945 | AppCtx *userctx = (AppCtx *)ctx; | |
486 | 7945 | PetscScalar value; | |
487 | 7945 | const PetscInt *indices; | |
488 | |||
489 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
7945 | PetscFunctionBegin; |
490 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(SNESGetDM(snes,&dm)); |
491 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(DMGetDS(dm,&prob)); |
492 | /* hook functions */ | ||
493 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(PetscDSGetWeakForm(prob, &wf)); |
494 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(PetscWeakFormClearIndex(wf, NULL, 0, 0, 0, PETSC_WF_F1, 0)); |
495 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(PetscWeakFormSetIndexResidual(wf, NULL, 0, 0, 0, 0, f0_u, 0, NULL)); |
496 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(FormFunction(snes,X,F,ctx)); |
497 | /* Boundary condition */ | ||
498 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(VecGetOwnershipRange(F,&iStart,&iEnd)); |
499 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(ISGetLocalSize(userctx->bdis,&nindices)); |
500 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(ISGetIndices(userctx->bdis,&indices)); |
501 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
262185 | for (i=0;i<nindices;i++) { |
502 | 254240 | value = 0.0; | |
503 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
254240 | PetscCall(VecSetValue(F,indices[i],value,INSERT_VALUES)); |
504 | } | ||
505 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(ISRestoreIndices(userctx->bdis,&indices)); |
506 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(VecAssemblyBegin(F)); |
507 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7945 | PetscCall(VecAssemblyEnd(F)); |
508 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1589 | PetscFunctionReturn(PETSC_SUCCESS); |
509 | } | ||
510 | |||
511 | ✗ | PetscErrorCode MatMult_B(Mat B,Vec x,Vec y) | |
512 | { | ||
513 | ✗ | AppCtx *userctx; | |
514 | |||
515 | ✗ | PetscFunctionBegin; | |
516 | ✗ | PetscCall(MatShellGetContext(B,&userctx)); | |
517 | ✗ | PetscCall(FormFunctionB(userctx->snes,x,y,userctx)); | |
518 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
519 | } | ||
520 | |||
521 | /*TEST | ||
522 | |||
523 | testset: | ||
524 | requires: double | ||
525 | args: -petscspace_degree 1 -petscspace_poly_tensor -checkfunctionlist 0 | ||
526 | output_file: output/ex34_1.out | ||
527 | test: | ||
528 | suffix: 1 | ||
529 | test: | ||
530 | suffix: 2 | ||
531 | args: -eps_power_update -form_function_ab {{0 1}} | ||
532 | filter: sed -e "s/ with monolithic update//" | ||
533 | test: | ||
534 | suffix: 3 | ||
535 | args: -use_shell_matrix -eps_power_snes_mf_operator 1 | ||
536 | test: | ||
537 | suffix: 4 | ||
538 | args: -use_shell_matrix -eps_power_update -init_eps_power_snes_mf_operator 1 -eps_power_snes_mf_operator 1 -form_function_ab {{0 1}} | ||
539 | filter: sed -e "s/ with monolithic update//" | ||
540 | test: | ||
541 | suffix: 5 | ||
542 | args: -use_shell_matrix -eps_power_update -init_eps_power_snes_mf_operator 1 -eps_power_snes_mf_operator 1 -form_function_ab {{0 1}} -test_init_sol 1 | ||
543 | filter: sed -e "s/ with monolithic update//" | ||
544 | |||
545 | test: | ||
546 | suffix: 6 | ||
547 | args: -use_shell_matrix -eps_power_update -init_eps_power_snes_mf_operator 1 -eps_power_snes_mf_operator 1 -form_function_ab {{0 1}} -eps_monitor_all | ||
548 | output_file: output/ex34_6.out | ||
549 | filter: sed -e "s/\([+-].*i\)//g" -e "1,3s/[0-9]//g" -e "/[45] EPS/d" | ||
550 | test: | ||
551 | suffix: 7 | ||
552 | args: -use_custom_norm -sign_normalization 1 -eps_power_snes_mf_operator 1 | ||
553 | test: | ||
554 | suffix: 8 | ||
555 | args: -use_custom_norm -sign_normalization 1 -eps_power_update -form_function_ab {{0 1}} -eps_power_snes_mf_operator 1 -init_eps_power_snes_mf_operator 1 | ||
556 | filter: sed -e "s/ with monolithic update//" | ||
557 | test: | ||
558 | suffix: 9 | ||
559 | requires: !complex | ||
560 | args: -use_custom_norm {{0 1}} -sign_normalization 0 -eps_power_snes_mf_operator 1 | ||
561 | test: | ||
562 | suffix: 10 | ||
563 | requires: !complex | ||
564 | args: -use_custom_norm {{0 1}} -sign_normalization 0 -eps_power_update -form_function_ab {{0 1}} -eps_power_snes_mf_operator 1 -init_eps_power_snes_mf_operator 1 | ||
565 | filter: sed -e "s/ with monolithic update//" | ||
566 | test: | ||
567 | suffix: 11 | ||
568 | requires: complex | ||
569 | args: -use_custom_norm {{0 1}} -sign_normalization 0 -eps_power_snes_type nrichardson -eps_power_snes_atol 1e-12 -eps_power_snes_linesearch_atol 1e-22 | ||
570 | test: | ||
571 | suffix: 12 | ||
572 | requires: complex | ||
573 | args: -use_custom_norm {{0 1}} -sign_normalization 0 -eps_power_update -init_eps_power_snes_type nrichardson -init_eps_max_it 2 -eps_power_snes_mf_operator 1 | ||
574 | filter: sed -e "s/ with monolithic update//" | ||
575 | TEST*/ | ||
576 |