File: | mat/impls/kaij/kaij.c |
Warning: | line 512, column 7 Value stored to 'ierr' is never read |
[?] Use j/k keys for keyboard navigation
1 | |
2 | /* |
3 | Defines the basic matrix operations for the KAIJ matrix storage format. |
4 | This format is used to evaluate matrices of the form: |
5 | |
6 | [I \otimes S + A \otimes T] |
7 | |
8 | where |
9 | S is a dense (p \times q) matrix |
10 | T is a dense (p \times q) matrix |
11 | A is an AIJ (n \times n) matrix |
12 | I is the identity matrix |
13 | |
14 | The resulting matrix is (np \times nq) |
15 | |
16 | We provide: |
17 | MatMult() |
18 | MatMultAdd() |
19 | MatInvertBlockDiagonal() |
20 | and |
21 | MatCreateKAIJ(Mat,PetscInt,PetscInt,const PetscScalar[],const PetscScalar[],Mat*) |
22 | |
23 | This single directory handles both the sequential and parallel codes |
24 | */ |
25 | |
26 | #include <../src/mat/impls/kaij/kaij.h> /*I "petscmat.h" I*/ |
27 | #include <../src/mat/utils/freespace.h> |
28 | #include <petsc/private/vecimpl.h> |
29 | |
30 | /*@C |
31 | MatKAIJGetAIJ - Get the AIJ matrix describing the blockwise action of the KAIJ matrix |
32 | |
33 | Not Collective, but if the KAIJ matrix is parallel, the AIJ matrix is also parallel |
34 | |
35 | Input Parameter: |
36 | . A - the KAIJ matrix |
37 | |
38 | Output Parameter: |
39 | . B - the AIJ matrix |
40 | |
41 | Level: advanced |
42 | |
43 | Notes: The reference count on the AIJ matrix is not increased so you should not destroy it. |
44 | |
45 | .seealso: MatCreateKAIJ() |
46 | @*/ |
47 | PetscErrorCode MatKAIJGetAIJ(Mat A,Mat *B) |
48 | { |
49 | PetscErrorCode ierr; |
50 | PetscBool ismpikaij,isseqkaij; |
51 | |
52 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 52; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
53 | ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIKAIJ"mpikaij",&ismpikaij);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),53,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
54 | ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQKAIJ"seqkaij",&isseqkaij);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),54,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
55 | if (ismpikaij) { |
56 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*)A->data; |
57 | |
58 | *B = b->A; |
59 | } else if (isseqkaij) { |
60 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
61 | |
62 | *B = b->AIJ; |
63 | } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix passed in is not of type KAIJ")return PetscError(PetscObjectComm((PetscObject)A),63,__func__ ,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c",62,PETSC_ERROR_INITIAL ,"Matrix passed in is not of type KAIJ"); |
64 | 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); |
65 | } |
66 | |
67 | /*@C |
68 | MatKAIJGetS - Get the S matrix describing the shift action of the KAIJ matrix |
69 | |
70 | Not Collective; the entire S is stored and returned independently on all processes. |
71 | |
72 | Input Parameter: |
73 | . A - the KAIJ matrix |
74 | |
75 | Output Parameters: |
76 | + m - the number of rows in S |
77 | . n - the number of columns in S |
78 | - S - the S matrix, in form of a scalar array in column-major format |
79 | |
80 | Note: All output parameters are optional (pass NULL or PETSC_IGNORE if not desired) |
81 | |
82 | Level: advanced |
83 | |
84 | .seealso: MatCreateKAIJ(), MatGetBlockSizes() |
85 | @*/ |
86 | PetscErrorCode MatKAIJGetS(Mat A,PetscInt *m,PetscInt *n,PetscScalar **S) |
87 | { |
88 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
89 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 89; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
90 | if (m) *m = b->p; |
91 | if (n) *n = b->q; |
92 | if (S) *S = b->S; |
93 | 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); |
94 | } |
95 | |
96 | /*@C |
97 | MatKAIJGetSRead - Get a read-only pointer to the S matrix describing the shift action of the KAIJ matrix |
98 | |
99 | Not Collective; the entire S is stored and returned independently on all processes. |
100 | |
101 | Input Parameter: |
102 | . A - the KAIJ matrix |
103 | |
104 | Output Parameters: |
105 | + m - the number of rows in S |
106 | . n - the number of columns in S |
107 | - S - the S matrix, in form of a scalar array in column-major format |
108 | |
109 | Note: All output parameters are optional (pass NULL or PETSC_IGNORE if not desired) |
110 | |
111 | Level: advanced |
112 | |
113 | .seealso: MatCreateKAIJ(), MatGetBlockSizes() |
114 | @*/ |
115 | PetscErrorCode MatKAIJGetSRead(Mat A,PetscInt *m,PetscInt *n,const PetscScalar **S) |
116 | { |
117 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
118 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 118; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
119 | if (m) *m = b->p; |
120 | if (n) *n = b->q; |
121 | if (S) *S = b->S; |
122 | 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); |
123 | } |
124 | |
125 | /*@C |
126 | MatKAIJRestoreS - Restore array obtained with MatKAIJGetS() |
127 | |
128 | Not collective |
129 | |
130 | Input Parameter: |
131 | . A - the KAIJ matrix |
132 | |
133 | Output Parameter: |
134 | . S - location of pointer to array obtained with MatKAIJGetS() |
135 | |
136 | Note: This routine zeros the array pointer to prevent accidental reuse after it has been restored. |
137 | If NULL is passed, it will not attempt to zero the array pointer. |
138 | |
139 | Level: advanced |
140 | .seealso: MatKAIJGetS(), MatKAIJGetSRead(), MatKAIJRestoreSRead() |
141 | @*/ |
142 | PetscErrorCode MatKAIJRestoreS(Mat A,PetscScalar **S) |
143 | { |
144 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 144; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
145 | if (S) *S = NULL((void*)0); |
146 | PetscObjectStateIncrease((PetscObject)A)(((PetscObject)A)->state++,0); |
147 | 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); |
148 | } |
149 | |
150 | /*@C |
151 | MatKAIJRestoreSRead - Restore array obtained with MatKAIJGetSRead() |
152 | |
153 | Not collective |
154 | |
155 | Input Parameter: |
156 | . A - the KAIJ matrix |
157 | |
158 | Output Parameter: |
159 | . S - location of pointer to array obtained with MatKAIJGetS() |
160 | |
161 | Note: This routine zeros the array pointer to prevent accidental reuse after it has been restored. |
162 | If NULL is passed, it will not attempt to zero the array pointer. |
163 | |
164 | Level: advanced |
165 | .seealso: MatKAIJGetS(), MatKAIJGetSRead(), MatKAIJRestoreSRead() |
166 | @*/ |
167 | PetscErrorCode MatKAIJRestoreSRead(Mat A,const PetscScalar **S) |
168 | { |
169 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 169; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
170 | if (S) *S = NULL((void*)0); |
171 | 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); |
172 | } |
173 | |
174 | /*@C |
175 | MatKAIJGetT - Get the transformation matrix T associated with the KAIJ matrix |
176 | |
177 | Not Collective; the entire T is stored and returned independently on all processes |
178 | |
179 | Input Parameter: |
180 | . A - the KAIJ matrix |
181 | |
182 | Output Parameter: |
183 | + m - the number of rows in T |
184 | . n - the number of columns in T |
185 | - T - the T matrix, in form of a scalar array in column-major format |
186 | |
187 | Note: All output parameters are optional (pass NULL or PETSC_IGNORE if not desired) |
188 | |
189 | Level: advanced |
190 | |
191 | .seealso: MatCreateKAIJ(), MatGetBlockSizes() |
192 | @*/ |
193 | PetscErrorCode MatKAIJGetT(Mat A,PetscInt *m,PetscInt *n,PetscScalar **T) |
194 | { |
195 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
196 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 196; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
197 | if (m) *m = b->p; |
198 | if (n) *n = b->q; |
199 | if (T) *T = b->T; |
200 | 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); |
201 | } |
202 | |
203 | /*@C |
204 | MatKAIJGetTRead - Get a read-only pointer to the transformation matrix T associated with the KAIJ matrix |
205 | |
206 | Not Collective; the entire T is stored and returned independently on all processes |
207 | |
208 | Input Parameter: |
209 | . A - the KAIJ matrix |
210 | |
211 | Output Parameter: |
212 | + m - the number of rows in T |
213 | . n - the number of columns in T |
214 | - T - the T matrix, in form of a scalar array in column-major format |
215 | |
216 | Note: All output parameters are optional (pass NULL or PETSC_IGNORE if not desired) |
217 | |
218 | Level: advanced |
219 | |
220 | .seealso: MatCreateKAIJ(), MatGetBlockSizes() |
221 | @*/ |
222 | PetscErrorCode MatKAIJGetTRead(Mat A,PetscInt *m,PetscInt *n,const PetscScalar **T) |
223 | { |
224 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
225 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 225; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
226 | if (m) *m = b->p; |
227 | if (n) *n = b->q; |
228 | if (T) *T = b->T; |
229 | 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); |
230 | } |
231 | |
232 | /*@C |
233 | MatKAIJRestoreT - Restore array obtained with MatKAIJGetT() |
234 | |
235 | Not collective |
236 | |
237 | Input Parameter: |
238 | . A - the KAIJ matrix |
239 | |
240 | Output Parameter: |
241 | . T - location of pointer to array obtained with MatKAIJGetS() |
242 | |
243 | Note: This routine zeros the array pointer to prevent accidental reuse after it has been restored. |
244 | If NULL is passed, it will not attempt to zero the array pointer. |
245 | |
246 | Level: advanced |
247 | .seealso: MatKAIJGetT(), MatKAIJGetTRead(), MatKAIJRestoreTRead() |
248 | @*/ |
249 | PetscErrorCode MatKAIJRestoreT(Mat A,PetscScalar **T) |
250 | { |
251 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 251; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
252 | if (T) *T = NULL((void*)0); |
253 | PetscObjectStateIncrease((PetscObject)A)(((PetscObject)A)->state++,0); |
254 | 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); |
255 | } |
256 | |
257 | /*@C |
258 | MatKAIJRestoreTRead - Restore array obtained with MatKAIJGetTRead() |
259 | |
260 | Not collective |
261 | |
262 | Input Parameter: |
263 | . A - the KAIJ matrix |
264 | |
265 | Output Parameter: |
266 | . T - location of pointer to array obtained with MatKAIJGetS() |
267 | |
268 | Note: This routine zeros the array pointer to prevent accidental reuse after it has been restored. |
269 | If NULL is passed, it will not attempt to zero the array pointer. |
270 | |
271 | Level: advanced |
272 | .seealso: MatKAIJGetT(), MatKAIJGetTRead(), MatKAIJRestoreTRead() |
273 | @*/ |
274 | PetscErrorCode MatKAIJRestoreTRead(Mat A,const PetscScalar **T) |
275 | { |
276 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 276; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
277 | if (T) *T = NULL((void*)0); |
278 | 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); |
279 | } |
280 | |
281 | /*@ |
282 | MatKAIJSetAIJ - Set the AIJ matrix describing the blockwise action of the KAIJ matrix |
283 | |
284 | Logically Collective; if the AIJ matrix is parallel, the KAIJ matrix is also parallel |
285 | |
286 | Input Parameters: |
287 | + A - the KAIJ matrix |
288 | - B - the AIJ matrix |
289 | |
290 | Notes: |
291 | This function increases the reference count on the AIJ matrix, so the user is free to destroy the matrix if it is not needed. |
292 | Changes to the entries of the AIJ matrix will immediately affect the KAIJ matrix. |
293 | |
294 | Level: advanced |
295 | |
296 | .seealso: MatKAIJGetAIJ(), MatKAIJSetS(), MatKAIJSetT() |
297 | @*/ |
298 | PetscErrorCode MatKAIJSetAIJ(Mat A,Mat B) |
299 | { |
300 | PetscErrorCode ierr; |
301 | PetscMPIInt size; |
302 | |
303 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 303; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
304 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),304,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
305 | if (size == 1) { |
306 | Mat_SeqKAIJ *a = (Mat_SeqKAIJ*)A->data; |
307 | a->AIJ = B; |
308 | } else { |
309 | Mat_MPIKAIJ *a = (Mat_MPIKAIJ*)A->data; |
310 | a->A = B; |
311 | } |
312 | ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),312,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
313 | 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); |
314 | } |
315 | |
316 | /*@C |
317 | MatKAIJSetS - Set the S matrix describing the shift action of the KAIJ matrix |
318 | |
319 | Logically Collective; the entire S is stored independently on all processes. |
320 | |
321 | Input Parameters: |
322 | + A - the KAIJ matrix |
323 | . p - the number of rows in S |
324 | . q - the number of columns in S |
325 | - S - the S matrix, in form of a scalar array in column-major format |
326 | |
327 | Notes: The dimensions p and q must match those of the transformation matrix T associated with the KAIJ matrix. |
328 | The S matrix is copied, so the user can destroy this array. |
329 | |
330 | Level: Advanced |
331 | |
332 | .seealso: MatKAIJGetS(), MatKAIJSetT(), MatKAIJSetAIJ() |
333 | @*/ |
334 | PetscErrorCode MatKAIJSetS(Mat A,PetscInt p,PetscInt q,const PetscScalar S[]) |
335 | { |
336 | PetscErrorCode ierr; |
337 | Mat_SeqKAIJ *a = (Mat_SeqKAIJ*)A->data; |
338 | |
339 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 339; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
340 | ierr = PetscFree(a->S)((*PetscTrFree)((void*)(a->S),340,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((a->S) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),340,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
341 | if (S) { |
342 | ierr = PetscMalloc1(p*q*sizeof(PetscScalar),&a->S)PetscMallocA(1,PETSC_FALSE,342,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(p*q*sizeof(PetscScalar))*sizeof(**(&a->S)),( &a->S));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),342,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
343 | ierr = PetscMemcpy(a->S,S,p*q*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),343,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
344 | } else a->S = NULL((void*)0); |
345 | |
346 | a->p = p; |
347 | a->q = q; |
348 | 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); |
349 | } |
350 | |
351 | /*@C |
352 | MatKAIJSetT - Set the transformation matrix T associated with the KAIJ matrix |
353 | |
354 | Logically Collective; the entire T is stored independently on all processes. |
355 | |
356 | Input Parameters: |
357 | + A - the KAIJ matrix |
358 | . p - the number of rows in S |
359 | . q - the number of columns in S |
360 | - T - the T matrix, in form of a scalar array in column-major format |
361 | |
362 | Notes: The dimensions p and q must match those of the shift matrix S associated with the KAIJ matrix. |
363 | The T matrix is copied, so the user can destroy this array. |
364 | |
365 | Level: Advanced |
366 | |
367 | .seealso: MatKAIJGetT(), MatKAIJSetS(), MatKAIJSetAIJ() |
368 | @*/ |
369 | PetscErrorCode MatKAIJSetT(Mat A,PetscInt p,PetscInt q,const PetscScalar T[]) |
370 | { |
371 | PetscErrorCode ierr; |
372 | PetscInt i,j; |
373 | Mat_SeqKAIJ *a = (Mat_SeqKAIJ*)A->data; |
374 | PetscBool isTI = PETSC_FALSE; |
375 | |
376 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 376; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
377 | /* check if T is an identity matrix */ |
378 | if (T && (p == q)) { |
379 | isTI = PETSC_TRUE; |
380 | for (i=0; i<p; i++) { |
381 | for (j=0; j<q; j++) { |
382 | if (i == j) { |
383 | /* diagonal term must be 1 */ |
384 | if (T[i+j*p] != 1.0) isTI = PETSC_FALSE; |
385 | } else { |
386 | /* off-diagonal term must be 0 */ |
387 | if (T[i+j*p] != 0.0) isTI = PETSC_FALSE; |
388 | } |
389 | } |
390 | } |
391 | } |
392 | a->isTI = isTI; |
393 | |
394 | ierr = PetscFree(a->T)((*PetscTrFree)((void*)(a->T),394,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((a->T) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),394,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
395 | if (T && (!isTI)) { |
396 | ierr = PetscMalloc1(p*q*sizeof(PetscScalar),&a->T)PetscMallocA(1,PETSC_FALSE,396,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(p*q*sizeof(PetscScalar))*sizeof(**(&a->T)),( &a->T));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),396,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
397 | ierr = PetscMemcpy(a->T,T,p*q*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),397,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
398 | } else a->T = NULL((void*)0); |
399 | |
400 | a->p = p; |
401 | a->q = q; |
402 | 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); |
403 | } |
404 | |
405 | PetscErrorCode MatDestroy_SeqKAIJ(Mat A) |
406 | { |
407 | PetscErrorCode ierr; |
408 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
409 | |
410 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 410; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
411 | ierr = MatDestroy(&b->AIJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),411,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
412 | ierr = PetscFree(b->S)((*PetscTrFree)((void*)(b->S),412,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->S) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),412,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
413 | ierr = PetscFree(b->T)((*PetscTrFree)((void*)(b->T),413,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->T) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),413,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
414 | ierr = PetscFree(b->ibdiag)((*PetscTrFree)((void*)(b->ibdiag),414,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->ibdiag) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),414,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
415 | ierr = PetscFree5(b->sor.w,b->sor.y,b->sor.work,b->sor.t,b->sor.arr)PetscFreeA(5,415,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,&(b->sor.w),&(b->sor.y),&(b->sor.work), &(b->sor.t),&(b->sor.arr));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),415,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
416 | ierr = PetscFree(A->data)((*PetscTrFree)((void*)(A->data),416,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((A->data) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),416,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
417 | 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); |
418 | } |
419 | |
420 | PetscErrorCode MatSetUp_KAIJ(Mat A) |
421 | { |
422 | PetscErrorCode ierr; |
423 | PetscInt n; |
424 | PetscMPIInt size; |
425 | Mat_SeqKAIJ *seqkaij = (Mat_SeqKAIJ*)A->data; |
426 | |
427 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 427; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
428 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),428,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
429 | if (size == 1) { |
430 | ierr = MatSetSizes(A,seqkaij->p*seqkaij->AIJ->rmap->n,seqkaij->q*seqkaij->AIJ->cmap->n,seqkaij->p*seqkaij->AIJ->rmap->N,seqkaij->q*seqkaij->AIJ->cmap->N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),430,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
431 | ierr = PetscLayoutSetBlockSize(A->rmap,seqkaij->p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),431,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
432 | ierr = PetscLayoutSetBlockSize(A->cmap,seqkaij->q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),432,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
433 | ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),433,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
434 | ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),434,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
435 | } else { |
436 | Mat_MPIKAIJ *a; |
437 | Mat_MPIAIJ *mpiaij; |
438 | IS from,to; |
439 | Vec gvec; |
440 | PetscScalar *T; |
441 | PetscInt i,j; |
442 | |
443 | a = (Mat_MPIKAIJ*)A->data; |
444 | mpiaij = (Mat_MPIAIJ*)a->A->data; |
445 | ierr = MatSetSizes(A,a->p*a->A->rmap->n,a->q*a->A->cmap->n,a->p*a->A->rmap->N,a->q*a->A->cmap->N);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),445,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
446 | ierr = PetscLayoutSetBlockSize(A->rmap,seqkaij->p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),446,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
447 | ierr = PetscLayoutSetBlockSize(A->cmap,seqkaij->q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),447,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
448 | ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),448,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
449 | ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),449,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
450 | |
451 | if (a->isTI) { |
452 | /* If the transformation matrix associated with the parallel matrix A is the identity matrix, then a->T will be NULL. |
453 | * In this case, if we pass a->T directly to the MatCreateKAIJ() calls to create the sequential submatrices, the routine will |
454 | * not be able to tell that transformation matrix should be set to the identity; thus we create a temporary identity matrix |
455 | * to pass in. */ |
456 | ierr = PetscMalloc1(a->p*a->q*sizeof(PetscScalar),&T)PetscMallocA(1,PETSC_FALSE,456,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(a->p*a->q*sizeof(PetscScalar))*sizeof(**(& T)),(&T));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),456,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
457 | for (i=0; i<a->p; i++) { |
458 | for (j=0; j<a->q; j++) { |
459 | if (i==j) T[i+j*a->p] = 1.0; |
460 | else T[i+j*a->p] = 0.0; |
461 | } |
462 | } |
463 | } else T = a->T; |
464 | ierr = MatCreateKAIJ(mpiaij->A,a->p,a->q,a->S,T,&a->AIJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),464,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
465 | ierr = MatCreateKAIJ(mpiaij->B,a->p,a->q,NULL((void*)0),T,&a->OAIJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),465,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
466 | if (a->isTI) { |
467 | ierr = PetscFree(T)((*PetscTrFree)((void*)(T),467,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((T) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),467,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
468 | } |
469 | |
470 | ierr = VecGetSize(mpiaij->lvec,&n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),470,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
471 | ierr = VecCreate(PETSC_COMM_SELF((MPI_Comm)0x44000001),&a->w);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),471,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
472 | ierr = VecSetSizes(a->w,n*a->q,n*a->q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),472,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
473 | ierr = VecSetBlockSize(a->w,a->q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),473,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
474 | ierr = VecSetType(a->w,VECSEQ"seq");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),474,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
475 | |
476 | /* create two temporary Index sets for build scatter gather */ |
477 | ierr = ISCreateBlock(PetscObjectComm((PetscObject)a->A),a->q,n,mpiaij->garray,PETSC_COPY_VALUES,&from);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),477,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
478 | ierr = ISCreateStride(PETSC_COMM_SELF((MPI_Comm)0x44000001),n*a->q,0,1,&to);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),478,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
479 | |
480 | /* create temporary global vector to generate scatter context */ |
481 | ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)a->A),a->q,a->q*a->A->cmap->n,a->q*a->A->cmap->N,NULL((void*)0),&gvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),481,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
482 | |
483 | /* generate the scatter context */ |
484 | ierr = VecScatterCreate(gvec,from,a->w,to,&a->ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),484,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
485 | |
486 | ierr = ISDestroy(&from);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),486,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
487 | ierr = ISDestroy(&to);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),487,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
488 | ierr = VecDestroy(&gvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),488,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
489 | } |
490 | |
491 | A->assembled = PETSC_TRUE; |
492 | 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); |
493 | } |
494 | |
495 | PetscErrorCode MatView_KAIJ(Mat A,PetscViewer viewer) |
496 | { |
497 | PetscViewerFormat format; |
498 | Mat_SeqKAIJ *a = (Mat_SeqKAIJ*)A->data; |
499 | Mat B; |
500 | PetscInt i; |
501 | PetscErrorCode ierr; |
502 | PetscBool ismpikaij; |
503 | |
504 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 504; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
505 | ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIKAIJ"mpikaij",&ismpikaij);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),505,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
506 | ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),506,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
507 | if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_IMPL) { |
508 | ierr = PetscViewerASCIIPrintf(viewer,"S and T have %D rows and %D columns\n",a->p,a->q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),508,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
509 | |
510 | /* Print appropriate details for S. */ |
511 | if (!a->S) { |
512 | ierr = PetscViewerASCIIPrintf(viewer,"S is NULL\n"); |
Value stored to 'ierr' is never read | |
513 | } else if (format == PETSC_VIEWER_ASCII_IMPL) { |
514 | ierr = PetscViewerASCIIPrintf(viewer,"Entries of S are ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),514,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
515 | for (i=0; i<(a->p * a->q); i++) { |
516 | #if defined(PETSC_USE_COMPLEX) |
517 | ierr = PetscViewerASCIIPrintf(viewer,"%18.16e %18.16e ",(double)PetscRealPart(a->S[i])(a->S[i]),(double)PetscImaginaryPart(a->S[i])((PetscReal)0.));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),517,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
518 | #else |
519 | ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(a->S[i])(a->S[i]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),519,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
520 | #endif |
521 | } |
522 | ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),522,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
523 | } |
524 | |
525 | /* Print appropriate details for T. */ |
526 | if (a->isTI) { |
527 | ierr = PetscViewerASCIIPrintf(viewer,"T is the identity matrix\n"); |
528 | } else if (!a->T) { |
529 | ierr = PetscViewerASCIIPrintf(viewer,"T is NULL\n"); |
530 | } else if (format == PETSC_VIEWER_ASCII_IMPL) { |
531 | ierr = PetscViewerASCIIPrintf(viewer,"Entries of T are ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),531,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
532 | for (i=0; i<(a->p * a->q); i++) { |
533 | #if defined(PETSC_USE_COMPLEX) |
534 | ierr = PetscViewerASCIIPrintf(viewer,"%18.16e %18.16e ",(double)PetscRealPart(a->T[i])(a->T[i]),(double)PetscImaginaryPart(a->T[i])((PetscReal)0.));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),534,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
535 | #else |
536 | ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(a->T[i])(a->T[i]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),536,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
537 | #endif |
538 | } |
539 | ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),539,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
540 | } |
541 | |
542 | /* Now print details for the AIJ matrix, using the AIJ viewer. */ |
543 | ierr = PetscViewerASCIIPrintf(viewer,"Now viewing the associated AIJ matrix:\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),543,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
544 | if (ismpikaij) { |
545 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*)A->data; |
546 | ierr = MatView(b->A,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),546,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
547 | } else { |
548 | ierr = MatView(a->AIJ,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),548,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
549 | } |
550 | |
551 | } else { |
552 | /* For all other matrix viewer output formats, simply convert to an AIJ matrix and call MatView() on that. */ |
553 | if (ismpikaij) { |
554 | ierr = MatConvert(A,MATMPIAIJ"mpiaij",MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),554,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
555 | } else { |
556 | ierr = MatConvert(A,MATSEQAIJ"seqaij",MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),556,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
557 | } |
558 | ierr = MatView(B,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),558,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
559 | ierr = MatDestroy(&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),559,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
560 | } |
561 | 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); |
562 | } |
563 | |
564 | PetscErrorCode MatDestroy_MPIKAIJ(Mat A) |
565 | { |
566 | PetscErrorCode ierr; |
567 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*)A->data; |
568 | |
569 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 569; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
570 | ierr = MatDestroy(&b->AIJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),570,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
571 | ierr = MatDestroy(&b->OAIJ);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),571,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
572 | ierr = MatDestroy(&b->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),572,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
573 | ierr = VecScatterDestroy(&b->ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),573,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
574 | ierr = VecDestroy(&b->w);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),574,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
575 | ierr = PetscFree(b->S)((*PetscTrFree)((void*)(b->S),575,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->S) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),575,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
576 | ierr = PetscFree(b->T)((*PetscTrFree)((void*)(b->T),576,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->T) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),576,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
577 | ierr = PetscFree(b->ibdiag)((*PetscTrFree)((void*)(b->ibdiag),577,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((b->ibdiag) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),577,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
578 | ierr = PetscFree(A->data)((*PetscTrFree)((void*)(A->data),578,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ) || ((A->data) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),578,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
579 | 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); |
580 | } |
581 | |
582 | /* --------------------------------------------------------------------------------------*/ |
583 | |
584 | /* zz = yy + Axx */ |
585 | PetscErrorCode MatMultAdd_SeqKAIJ(Mat A,Vec xx,Vec yy,Vec zz) |
586 | { |
587 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
588 | Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data; |
589 | const PetscScalar *s = b->S, *t = b->T; |
590 | const PetscScalar *x,*v,*bx; |
591 | PetscScalar *y,*sums; |
592 | PetscErrorCode ierr; |
593 | const PetscInt m = b->AIJ->rmap->n,*idx,*ii; |
594 | PetscInt n,i,jrow,j,l,p=b->p,q=b->q,k; |
595 | |
596 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 596; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
597 | if (!yy) { |
598 | ierr = VecSet(zz,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),598,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
599 | } else { |
600 | ierr = VecCopy(yy,zz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),600,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
601 | } |
602 | if ((!s) && (!t) && (!b->isTI)) 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); |
603 | |
604 | ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),604,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
605 | ierr = VecGetArray(zz,&y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),605,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
606 | idx = a->j; |
607 | v = a->a; |
608 | ii = a->i; |
609 | |
610 | if (b->isTI) { |
611 | for (i=0; i<m; i++) { |
612 | jrow = ii[i]; |
613 | n = ii[i+1] - jrow; |
614 | sums = y + p*i; |
615 | for (j=0; j<n; j++) { |
616 | for (k=0; k<p; k++) { |
617 | sums[k] += v[jrow+j]*x[q*idx[jrow+j]+k]; |
618 | } |
619 | } |
620 | } |
621 | ierr = PetscLogFlops((a->nz)*3*p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),621,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
622 | } else if (t) { |
623 | for (i=0; i<m; i++) { |
624 | jrow = ii[i]; |
625 | n = ii[i+1] - jrow; |
626 | sums = y + p*i; |
627 | bx = x + q*i; |
628 | for (j=0; j<n; j++) { |
629 | for (k=0; k<p; k++) { |
630 | for (l=0; l<q; l++) { |
631 | sums[k] += v[jrow+j]*t[k+l*p]*x[q*idx[jrow+j]+l]; |
632 | } |
633 | } |
634 | } |
635 | } |
636 | /* The flop count below assumes that v[jrow+j] is hoisted out (which an optimizing compiler is likely to do), |
637 | * and also that T part is hoisted outside this loop (in exchange for temporary storage) as (A \otimes I) (I \otimes T), |
638 | * so that this multiply doesn't have to be redone for each matrix entry, but just once per column. The latter |
639 | * transformation is much less likely to be applied, but we nonetheless count the minimum flops required. */ |
640 | ierr = PetscLogFlops((2.0*p*q-p)*m+2*p*a->nz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),640,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
641 | } |
642 | if (s) { |
643 | for (i=0; i<m; i++) { |
644 | sums = y + p*i; |
645 | bx = x + q*i; |
646 | if (i < b->AIJ->cmap->n) { |
647 | for (j=0; j<q; j++) { |
648 | for (k=0; k<p; k++) { |
649 | sums[k] += s[k+j*p]*bx[j]; |
650 | } |
651 | } |
652 | } |
653 | } |
654 | ierr = PetscLogFlops(m*2*p*q);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),654,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
655 | } |
656 | |
657 | ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),657,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
658 | ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),658,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
659 | 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); |
660 | } |
661 | |
662 | PetscErrorCode MatMult_SeqKAIJ(Mat A,Vec xx,Vec yy) |
663 | { |
664 | PetscErrorCode ierr; |
665 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 665; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
666 | ierr = MatMultAdd_SeqKAIJ(A,xx,PETSC_NULL((void*)0),yy);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),666,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
667 | 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); |
668 | } |
669 | |
670 | #include <petsc/private/kernels/blockinvert.h> |
671 | |
672 | PetscErrorCode MatInvertBlockDiagonal_SeqKAIJ(Mat A,const PetscScalar **values) |
673 | { |
674 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*)A->data; |
675 | Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data; |
676 | const PetscScalar *S = b->S; |
677 | const PetscScalar *T = b->T; |
678 | const PetscScalar *v = a->a; |
679 | const PetscInt p = b->p, q = b->q, m = b->AIJ->rmap->n, *idx = a->j, *ii = a->i; |
680 | PetscErrorCode ierr; |
681 | PetscInt i,j,*v_pivots,dof,dof2; |
682 | PetscScalar *diag,aval,*v_work; |
683 | |
684 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 684; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
685 | if (p != q) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MATKAIJ: Block size must be square to calculate inverse.")return PetscError(PetscObjectComm((PetscObject)A),685,__func__ ,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c",56,PETSC_ERROR_INITIAL ,"MATKAIJ: Block size must be square to calculate inverse."); |
686 | if ((!S) && (!T) && (!b->isTI)) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"MATKAIJ: Cannot invert a zero matrix.")return PetscError(PetscObjectComm((PetscObject)A),686,__func__ ,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c",56,PETSC_ERROR_INITIAL ,"MATKAIJ: Cannot invert a zero matrix."); |
687 | |
688 | dof = p; |
689 | dof2 = dof*dof; |
690 | |
691 | if (b->ibdiagvalid) { |
692 | if (values) *values = b->ibdiag; |
693 | 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); |
694 | } |
695 | if (!b->ibdiag) { |
696 | ierr = PetscMalloc1(dof2*m*sizeof(PetscScalar),&b->ibdiag)PetscMallocA(1,PETSC_FALSE,696,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(dof2*m*sizeof(PetscScalar))*sizeof(**(&b->ibdiag )),(&b->ibdiag));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),696,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
697 | ierr = PetscLogObjectMemory((PetscObject)A,dof2*m*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),697,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
698 | } |
699 | if (values) *values = b->ibdiag; |
700 | diag = b->ibdiag; |
701 | |
702 | ierr = PetscMalloc2(dof,&v_work,dof,&v_pivots)PetscMallocA(2,PETSC_FALSE,702,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(dof)*sizeof(**(&v_work)),(&v_work),(size_t) (dof)*sizeof(**(&v_pivots)),(&v_pivots));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),702,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
703 | for (i=0; i<m; i++) { |
704 | if (S) { |
705 | ierr = PetscMemcpy(diag,S,dof2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),705,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
706 | } else { |
707 | ierr = PetscMemzero(diag,dof2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),707,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
708 | } |
709 | if (b->isTI) { |
710 | aval = 0; |
711 | for (j=ii[i]; j<ii[i+1]; j++) if (idx[j] == i) aval = v[j]; |
712 | for (j=0; j<dof; j++) diag[j+dof*j] += aval; |
713 | } else if (T) { |
714 | aval = 0; |
715 | for (j=ii[i]; j<ii[i+1]; j++) if (idx[j] == i) aval = v[j]; |
716 | for (j=0; j<dof2; j++) diag[j] += aval*T[j]; |
717 | } |
718 | ierr = PetscKernel_A_gets_inverse_A(dof,diag,v_pivots,v_work,PETSC_FALSE,NULL)(PetscLINPACKgefa((diag),(dof),(v_pivots),(PETSC_FALSE),(((void *)0))) || PetscLINPACKgedi((diag),(dof),(v_pivots),(v_work)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),718,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
719 | diag += dof2; |
720 | } |
721 | ierr = PetscFree2(v_work,v_pivots)PetscFreeA(2,721,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,&(v_work),&(v_pivots));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),721,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
722 | |
723 | b->ibdiagvalid = PETSC_TRUE; |
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 MatGetDiagonalBlock_MPIKAIJ(Mat A,Mat *B) |
728 | { |
729 | Mat_MPIKAIJ *kaij = (Mat_MPIKAIJ*) A->data; |
730 | |
731 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 731; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
732 | *B = kaij->AIJ; |
733 | 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); |
734 | } |
735 | |
736 | PetscErrorCode MatSOR_SeqKAIJ(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal fshift,PetscInt its,PetscInt lits,Vec xx) |
737 | { |
738 | PetscErrorCode ierr; |
739 | Mat_SeqKAIJ *kaij = (Mat_SeqKAIJ*) A->data; |
740 | Mat_SeqAIJ *a = (Mat_SeqAIJ*)kaij->AIJ->data; |
741 | const PetscScalar *aa = a->a, *T = kaij->T, *v; |
742 | const PetscInt m = kaij->AIJ->rmap->n, *ai=a->i, *aj=a->j, p = kaij->p, q = kaij->q, *diag, *vi; |
743 | const PetscScalar *b, *xb, *idiag; |
744 | PetscScalar *x, *work, *workt, *w, *y, *arr, *t, *arrt; |
745 | PetscInt i, j, k, i2, bs, bs2, nz; |
746 | |
747 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 747; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); |
748 | its = its*lits; |
749 | if (flag & SOR_EISENSTAT) SETERRQ (PETSC_COMM_SELF,PETSC_ERR_SUP,"No support yet for Eisenstat")return PetscError(((MPI_Comm)0x44000001),749,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,56,PETSC_ERROR_INITIAL,"No support yet for Eisenstat"); |
750 | if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits)return PetscError(((MPI_Comm)0x44000001),750,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,62,PETSC_ERROR_INITIAL,"Relaxation requires global its %D and local its %D both positive" ,its,lits); |
751 | if (fshift) SETERRQ (PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for diagonal shift")return PetscError(((MPI_Comm)0x44000001),751,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,56,PETSC_ERROR_INITIAL,"No support for diagonal shift"); |
752 | if ((flag & SOR_APPLY_UPPER) || (flag & SOR_APPLY_LOWER)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for applying upper or lower triangular parts")return PetscError(((MPI_Comm)0x44000001),752,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,56,PETSC_ERROR_INITIAL,"No support for applying upper or lower triangular parts" ); |
753 | if (p != q) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatSOR for KAIJ: No support for non-square dense blocks")return PetscError(((MPI_Comm)0x44000001),753,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,56,PETSC_ERROR_INITIAL,"MatSOR for KAIJ: No support for non-square dense blocks" ); |
754 | else {bs = p; bs2 = bs*bs; } |
755 | |
756 | if (!m) 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); |
757 | |
758 | if (!kaij->ibdiagvalid) { ierr = MatInvertBlockDiagonal_SeqKAIJ(A,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),758,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); } |
759 | idiag = kaij->ibdiag; |
760 | diag = a->diag; |
761 | |
762 | if (!kaij->sor.setup) { |
763 | ierr = PetscMalloc5(bs,&kaij->sor.w,bs,&kaij->sor.y,m*bs,&kaij->sor.work,m*bs,&kaij->sor.t,m*bs2,&kaij->sor.arr)PetscMallocA(5,PETSC_FALSE,763,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(bs)*sizeof(**(&kaij->sor.w)),(&kaij-> sor.w),(size_t)(bs)*sizeof(**(&kaij->sor.y)),(&kaij ->sor.y),(size_t)(m*bs)*sizeof(**(&kaij->sor.work)) ,(&kaij->sor.work),(size_t)(m*bs)*sizeof(**(&kaij-> sor.t)),(&kaij->sor.t),(size_t)(m*bs2)*sizeof(**(& kaij->sor.arr)),(&kaij->sor.arr));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),763,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
764 | kaij->sor.setup = PETSC_TRUE; |
765 | } |
766 | y = kaij->sor.y; |
767 | w = kaij->sor.w; |
768 | work = kaij->sor.work; |
769 | t = kaij->sor.t; |
770 | arr = kaij->sor.arr; |
771 | |
772 | ierr = VecGetArray(xx,&x); CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),772,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
773 | ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),773,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
774 | |
775 | if (flag & SOR_ZERO_INITIAL_GUESS) { |
776 | if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { |
777 | PetscKernel_w_gets_Ar_times_v(bs,bs,b,idiag,x){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),777,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),777,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 777; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),b,&_ione,&_zero,x,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(777,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),777,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; /* x[0:bs] <- D^{-1} b[0:bs] */ |
778 | ierr = PetscMemcpy(t,b,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),778,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
779 | i2 = bs; |
780 | idiag += bs2; |
781 | for (i=1; i<m; i++) { |
782 | v = aa + ai[i]; |
783 | vi = aj + ai[i]; |
784 | nz = diag[i] - ai[i]; |
785 | |
786 | if (T) { /* b - T (Arow * x) */ |
787 | ierr = PetscMemzero(w,bs*sizeof(PetscScalar)); |
788 | for (j=0; j<nz; j++) { |
789 | for (k=0; k<bs; k++) w[k] -= v[j] * x[vi[j]*bs+k]; |
790 | } |
791 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs,w,T,&t[i2]){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),791,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),791,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 791; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,T,&(_bbs ),&t[i2],&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(791,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),791,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
792 | for (k=0; k<bs; k++) t[i2+k] += b[i2+k]; |
793 | } else if (kaij->isTI) { |
794 | ierr = PetscMemcpy(t+i2,b+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),794,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
795 | for (j=0; j<nz; j++) { |
796 | for (k=0; k<bs; k++) t[i2+k] -= v[j] * x[vi[j]*bs+k]; |
797 | } |
798 | } else { |
799 | ierr = PetscMemcpy(t+i2,b+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),799,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
800 | } |
801 | |
802 | PetscKernel_w_gets_Ar_times_v(bs,bs,t+i2,idiag,y){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),802,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),802,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 802; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),t+i2,&_ione,&_zero,y,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(802,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),802,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
803 | for (j=0; j<bs; j++) x[i2+j] = omega * y[j]; |
804 | |
805 | idiag += bs2; |
806 | i2 += bs; |
807 | } |
808 | /* for logging purposes assume number of nonzero in lower half is 1/2 of total */ |
809 | ierr = PetscLogFlops(1.0*bs2*a->nz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),809,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
810 | xb = t; |
811 | } else xb = b; |
812 | if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { |
813 | idiag = kaij->ibdiag+bs2*(m-1); |
814 | i2 = bs * (m-1); |
815 | ierr = PetscMemcpy(w,xb+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),815,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
816 | PetscKernel_w_gets_Ar_times_v(bs,bs,w,idiag,x+i2){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 816; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),w,&_ione,&_zero,x+i2,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(816,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),816,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
817 | i2 -= bs; |
818 | idiag -= bs2; |
819 | for (i=m-2; i>=0; i--) { |
820 | v = aa + diag[i] + 1 ; |
821 | vi = aj + diag[i] + 1; |
822 | nz = ai[i+1] - diag[i] - 1; |
823 | |
824 | if (T) { /* FIXME: This branch untested */ |
825 | ierr = PetscMemcpy(w,xb+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),825,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
826 | /* copy all rows of x that are needed into contiguous space */ |
827 | workt = work; |
828 | for (j=0; j<nz; j++) { |
829 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),829,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
830 | workt += bs; |
831 | } |
832 | arrt = arr; |
833 | for (j=0; j<nz; j++) { |
834 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),834,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
835 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
836 | arrt += bs2; |
837 | } |
838 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),838,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),838,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 838; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(838,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),838,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
839 | } else if (kaij->isTI) { |
840 | ierr = PetscMemcpy(w,t+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),840,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
841 | for (j=0; j<nz; j++) { |
842 | for (k=0; k<bs; k++) w[k] -= v[j] * x[vi[j]*bs+k]; |
843 | } |
844 | } |
845 | |
846 | PetscKernel_w_gets_Ar_times_v(bs,bs,w,idiag,y){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),846,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),846,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 846; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),w,&_ione,&_zero,y,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(846,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),846,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; /* RHS incorrect for omega != 1.0 */ |
847 | for (j=0; j<bs; j++) x[i2+j] = (1.0-omega) * x[i2+j] + omega * y[j]; |
848 | |
849 | idiag -= bs2; |
850 | i2 -= bs; |
851 | } |
852 | ierr = PetscLogFlops(1.0*bs2*(a->nz));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),852,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
853 | } |
854 | its--; |
855 | } |
856 | while (its--) { /* FIXME: This branch not updated */ |
857 | if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { |
858 | i2 = 0; |
859 | idiag = kaij->ibdiag; |
860 | for (i=0; i<m; i++) { |
861 | ierr = PetscMemcpy(w,b+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),861,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
862 | |
863 | v = aa + ai[i]; |
864 | vi = aj + ai[i]; |
865 | nz = diag[i] - ai[i]; |
866 | workt = work; |
867 | for (j=0; j<nz; j++) { |
868 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),868,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
869 | workt += bs; |
870 | } |
871 | arrt = arr; |
872 | if (T) { |
873 | for (j=0; j<nz; j++) { |
874 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),874,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
875 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
876 | arrt += bs2; |
877 | } |
878 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),878,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),878,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 878; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(878,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),878,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
879 | } else if (kaij->isTI) { |
880 | for (j=0; j<nz; j++) { |
881 | ierr = PetscMemzero(arrt,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),881,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
882 | for (k=0; k<bs; k++) arrt[k+bs*k] = v[j]; |
883 | arrt += bs2; |
884 | } |
885 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),885,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),885,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 885; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(885,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),885,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
886 | } |
887 | ierr = PetscMemcpy(t+i2,w,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),887,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
888 | |
889 | v = aa + diag[i] + 1; |
890 | vi = aj + diag[i] + 1; |
891 | nz = ai[i+1] - diag[i] - 1; |
892 | workt = work; |
893 | for (j=0; j<nz; j++) { |
894 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),894,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
895 | workt += bs; |
896 | } |
897 | arrt = arr; |
898 | if (T) { |
899 | for (j=0; j<nz; j++) { |
900 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),900,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
901 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
902 | arrt += bs2; |
903 | } |
904 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),904,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),904,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 904; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(904,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),904,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
905 | } else if (kaij->isTI) { |
906 | for (j=0; j<nz; j++) { |
907 | ierr = PetscMemzero(arrt,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),907,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
908 | for (k=0; k<bs; k++) arrt[k+bs*k] = v[j]; |
909 | arrt += bs2; |
910 | } |
911 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),911,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),911,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 911; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(911,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),911,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
912 | } |
913 | |
914 | PetscKernel_w_gets_Ar_times_v(bs,bs,w,idiag,y){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),914,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),914,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 914; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),w,&_ione,&_zero,y,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(914,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),914,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
915 | for (j=0; j<bs; j++) *(x+i2+j) = (1.0-omega) * *(x+i2+j) + omega * *(y+j); |
916 | |
917 | idiag += bs2; |
918 | i2 += bs; |
919 | } |
920 | xb = t; |
921 | } |
922 | else xb = b; |
923 | if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { |
924 | idiag = kaij->ibdiag+bs2*(m-1); |
925 | i2 = bs * (m-1); |
926 | if (xb == b) { |
927 | for (i=m-1; i>=0; i--) { |
928 | ierr = PetscMemcpy(w,b+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),928,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
929 | |
930 | v = aa + ai[i]; |
931 | vi = aj + ai[i]; |
932 | nz = diag[i] - ai[i]; |
933 | workt = work; |
934 | for (j=0; j<nz; j++) { |
935 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),935,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
936 | workt += bs; |
937 | } |
938 | arrt = arr; |
939 | if (T) { |
940 | for (j=0; j<nz; j++) { |
941 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),941,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
942 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
943 | arrt += bs2; |
944 | } |
945 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),945,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),945,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 945; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(945,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),945,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
946 | } else if (kaij->isTI) { |
947 | for (j=0; j<nz; j++) { |
948 | ierr = PetscMemzero(arrt,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),948,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
949 | for (k=0; k<bs; k++) arrt[k+bs*k] = v[j]; |
950 | arrt += bs2; |
951 | } |
952 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),952,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),952,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 952; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(952,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),952,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
953 | } |
954 | |
955 | v = aa + diag[i] + 1; |
956 | vi = aj + diag[i] + 1; |
957 | nz = ai[i+1] - diag[i] - 1; |
958 | workt = work; |
959 | for (j=0; j<nz; j++) { |
960 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),960,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
961 | workt += bs; |
962 | } |
963 | arrt = arr; |
964 | if (T) { |
965 | for (j=0; j<nz; j++) { |
966 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),966,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
967 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
968 | arrt += bs2; |
969 | } |
970 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),970,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),970,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 970; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(970,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),970,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
971 | } else if (kaij->isTI) { |
972 | for (j=0; j<nz; j++) { |
973 | ierr = PetscMemzero(arrt,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),973,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
974 | for (k=0; k<bs; k++) arrt[k+bs*k] = v[j]; |
975 | arrt += bs2; |
976 | } |
977 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),977,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),977,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 977; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(977,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),977,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
978 | } |
979 | |
980 | PetscKernel_w_gets_Ar_times_v(bs,bs,w,idiag,y){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),980,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),980,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 980; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),w,&_ione,&_zero,y,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(980,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),980,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
981 | for (j=0; j<bs; j++) *(x+i2+j) = (1.0-omega) * *(x+i2+j) + omega * *(y+j); |
982 | } |
983 | } else { |
984 | for (i=m-1; i>=0; i--) { |
985 | ierr = PetscMemcpy(w,xb+i2,bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),985,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
986 | v = aa + diag[i] + 1; |
987 | vi = aj + diag[i] + 1; |
988 | nz = ai[i+1] - diag[i] - 1; |
989 | workt = work; |
990 | for (j=0; j<nz; j++) { |
991 | ierr = PetscMemcpy(workt,x + bs*(*vi++),bs*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),991,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
992 | workt += bs; |
993 | } |
994 | arrt = arr; |
995 | if (T) { |
996 | for (j=0; j<nz; j++) { |
997 | ierr = PetscMemcpy(arrt,T,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),997,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
998 | for (k=0; k<bs2; k++) arrt[k] *= v[j]; |
999 | arrt += bs2; |
1000 | } |
1001 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1001,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),1001,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 1001; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(1001,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),1001,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
1002 | } else if (kaij->isTI) { |
1003 | for (j=0; j<nz; j++) { |
1004 | ierr = PetscMemzero(arrt,bs2*sizeof(PetscScalar));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1004,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1005 | for (k=0; k<bs; k++) arrt[k+bs*k] = v[j]; |
1006 | arrt += bs2; |
1007 | } |
1008 | PetscKernel_w_gets_w_minus_Ar_times_v(bs,bs*nz,w,arr,work){ PetscScalar _one = 1.0,_mone = -1.0; PetscBLASInt _ione = 1 ,_bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast (bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1008,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs*nz,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),1008,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 1008; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&(_bncols),&_mone,arr,&(_bbs ),work,&_ione,&_one,w,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(1008,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),1008,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
1009 | } |
1010 | PetscKernel_w_gets_Ar_times_v(bs,bs,w,idiag,y){ PetscScalar _one = 1.0,_zero = 0.0; PetscBLASInt _ione = 1, _bbs,_bncols; PetscErrorCode _ierr; _ierr = PetscBLASIntCast( bs,&_bbs);do {if (__builtin_expect(!!(_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1010,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); _ierr = PetscBLASIntCast (bs,&_bncols);do {if (__builtin_expect(!!(_ierr),0)) return PetscError(((MPI_Comm)0x44000001),1010,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_ierr,PETSC_ERROR_REPEAT," ");} while (0); do { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack ->function[petscstack->currentsize] = "BLASgemv"; petscstack ->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ; petscstack->line[petscstack->currentsize] = 1010; petscstack ->petscroutine[petscstack->currentsize] = PETSC_FALSE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_TRUE || petscstack->hotdepth); } ; } while (0); dgemv_("N",&(_bbs),&_bncols,&_one,idiag,&(_bbs ),w,&_ione,&_zero,y,&_ione); do { do {PetscErrorCode _7_ierr = PetscMallocValidate(1010,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" );do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),1010,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0);} while(0); 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); } while (0); } while(0); }; |
1011 | for (j=0; j<bs; j++) *(x+i2+j) = (1.0-omega) * *(x+i2+j) + omega * *(y+j); |
1012 | } |
1013 | idiag -= bs2; |
1014 | i2 -= bs; |
1015 | } |
1016 | ierr = PetscLogFlops(1.0*bs2*(a->nz));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1016,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1017 | } |
1018 | } |
1019 | |
1020 | ierr = VecRestoreArray(xx,&x); CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1020,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1021 | ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1021,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.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 | /*===================================================================================*/ |
1026 | |
1027 | PetscErrorCode MatMultAdd_MPIKAIJ(Mat A,Vec xx,Vec yy,Vec zz) |
1028 | { |
1029 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*)A->data; |
1030 | PetscErrorCode ierr; |
1031 | |
1032 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1032; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1033 | if (!yy) { |
1034 | ierr = VecSet(zz,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1034,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1035 | } else { |
1036 | ierr = VecCopy(yy,zz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1036,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1037 | } |
1038 | /* start the scatter */ |
1039 | ierr = VecScatterBegin(b->ctx,xx,b->w,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1039,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1040 | ierr = (*b->AIJ->ops->multadd)(b->AIJ,xx,zz,zz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1040,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1041 | ierr = VecScatterEnd(b->ctx,xx,b->w,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1041,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1042 | ierr = (*b->OAIJ->ops->multadd)(b->OAIJ,b->w,zz,zz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1042,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1043 | 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); |
1044 | } |
1045 | |
1046 | PetscErrorCode MatMult_MPIKAIJ(Mat A,Vec xx,Vec yy) |
1047 | { |
1048 | PetscErrorCode ierr; |
1049 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1049; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1050 | ierr = MatMultAdd_MPIKAIJ(A,xx,PETSC_NULL((void*)0),yy);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1050,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1051 | 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); |
1052 | } |
1053 | |
1054 | PetscErrorCode MatInvertBlockDiagonal_MPIKAIJ(Mat A,const PetscScalar **values) |
1055 | { |
1056 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*)A->data; |
1057 | PetscErrorCode ierr; |
1058 | |
1059 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1059; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1060 | ierr = (*b->AIJ->ops->invertblockdiagonal)(b->AIJ,values);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1060,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1061 | 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); |
1062 | } |
1063 | |
1064 | /* ----------------------------------------------------------------*/ |
1065 | |
1066 | PetscErrorCode MatGetRow_SeqKAIJ(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **values) |
1067 | { |
1068 | Mat_SeqKAIJ *b = (Mat_SeqKAIJ*) A->data; |
1069 | PetscErrorCode diag = PETSC_FALSE; |
1070 | PetscErrorCode ierr; |
1071 | PetscInt nzaij,nz,*colsaij,*idx,i,j,p=b->p,q=b->q,r=row/p,s=row%p,c; |
1072 | PetscScalar *vaij,*v,*S=b->S,*T=b->T; |
1073 | |
1074 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1074; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1075 | if (b->getrowactive) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Already active")return PetscError(((MPI_Comm)0x44000001),1075,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,73,PETSC_ERROR_INITIAL,"Already active"); |
1076 | b->getrowactive = PETSC_TRUE; |
1077 | if (row < 0 || row >= A->rmap->n) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D out of range",row)return PetscError(((MPI_Comm)0x44000001),1077,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,63,PETSC_ERROR_INITIAL,"Row %D out of range",row); |
1078 | |
1079 | if ((!S) && (!T) && (!b->isTI)) { |
1080 | if (ncols) *ncols = 0; |
1081 | if (cols) *cols = NULL((void*)0); |
1082 | if (values) *values = NULL((void*)0); |
1083 | 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); |
1084 | } |
1085 | |
1086 | if (T || b->isTI) { |
1087 | ierr = MatGetRow_SeqAIJ(b->AIJ,r,&nzaij,&colsaij,&vaij);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1087,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1088 | c = nzaij; |
1089 | for (i=0; i<nzaij; i++) { |
1090 | /* check if this row contains a diagonal entry */ |
1091 | if (colsaij[i] == r) { |
1092 | diag = PETSC_TRUE; |
1093 | c = i; |
1094 | } |
1095 | } |
1096 | } else nzaij = c = 0; |
1097 | |
1098 | /* calculate size of row */ |
1099 | nz = 0; |
1100 | if (S) nz += q; |
1101 | if (T || b->isTI) nz += (diag && S ? (nzaij-1)*q : nzaij*q); |
1102 | |
1103 | if (cols || values) { |
1104 | ierr = PetscMalloc2(nz,&idx,nz,&v)PetscMallocA(2,PETSC_FALSE,1104,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(nz)*sizeof(**(&idx)),(&idx),(size_t)(nz)*sizeof (**(&v)),(&v));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1104,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1105 | for (i=0; i<q; i++) { |
1106 | /* We need to initialize the v[i] to zero to handle the case in which T is NULL (not the identity matrix). */ |
1107 | v[i] = 0.0; |
1108 | } |
1109 | if (b->isTI) { |
1110 | for (i=0; i<nzaij; i++) { |
1111 | for (j=0; j<q; j++) { |
1112 | idx[i*q+j] = colsaij[i]*q+j; |
1113 | v[i*q+j] = (j==s ? vaij[i] : 0); |
1114 | } |
1115 | } |
1116 | } else if (T) { |
1117 | for (i=0; i<nzaij; i++) { |
1118 | for (j=0; j<q; j++) { |
1119 | idx[i*q+j] = colsaij[i]*q+j; |
1120 | v[i*q+j] = vaij[i]*T[s+j*p]; |
1121 | } |
1122 | } |
1123 | } |
1124 | if (S) { |
1125 | for (j=0; j<q; j++) { |
1126 | idx[c*q+j] = r*q+j; |
1127 | v[c*q+j] += S[s+j*p]; |
1128 | } |
1129 | } |
1130 | } |
1131 | |
1132 | if (ncols) *ncols = nz; |
1133 | if (cols) *cols = idx; |
1134 | if (values) *values = v; |
1135 | 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); |
1136 | } |
1137 | |
1138 | PetscErrorCode MatRestoreRow_SeqKAIJ(Mat A,PetscInt row,PetscInt *nz,PetscInt **idx,PetscScalar **v) |
1139 | { |
1140 | PetscErrorCode ierr; |
1141 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1141; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1142 | ierr = PetscFree2(*idx,*v)PetscFreeA(2,1142,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,&(*idx),&(*v));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1142,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1143 | ((Mat_SeqKAIJ*)A->data)->getrowactive = PETSC_FALSE; |
1144 | 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); |
1145 | } |
1146 | |
1147 | PetscErrorCode MatGetRow_MPIKAIJ(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **values) |
1148 | { |
1149 | Mat_MPIKAIJ *b = (Mat_MPIKAIJ*) A->data; |
1150 | Mat MatAIJ = ((Mat_SeqKAIJ*)b->AIJ->data)->AIJ; |
1151 | Mat MatOAIJ = ((Mat_SeqKAIJ*)b->OAIJ->data)->AIJ; |
1152 | Mat AIJ = b->A; |
1153 | PetscBool diag = PETSC_FALSE; |
1154 | PetscErrorCode ierr; |
1155 | const PetscInt rstart=A->rmap->rstart,rend=A->rmap->rend,p=b->p,q=b->q,*garray; |
1156 | PetscInt nz,*idx,ncolsaij,ncolsoaij,*colsaij,*colsoaij,r,s,c,i,j,lrow; |
1157 | PetscScalar *v,*vals,*ovals,*S=b->S,*T=b->T; |
1158 | |
1159 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.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 (b->getrowactive) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Already active")return PetscError(((MPI_Comm)0x44000001),1160,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,73,PETSC_ERROR_INITIAL,"Already active"); |
1161 | b->getrowactive = PETSC_TRUE; |
1162 | if (row < rstart || row >= rend) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Only local rows")return PetscError(((MPI_Comm)0x44000001),1162,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,63,PETSC_ERROR_INITIAL,"Only local rows"); |
1163 | lrow = row - rstart; |
1164 | |
1165 | if ((!S) && (!T) && (!b->isTI)) { |
1166 | if (ncols) *ncols = 0; |
1167 | if (cols) *cols = NULL((void*)0); |
1168 | if (values) *values = NULL((void*)0); |
1169 | 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); |
1170 | } |
1171 | |
1172 | r = lrow/p; |
1173 | s = lrow%p; |
1174 | |
1175 | if (T || b->isTI) { |
1176 | ierr = MatMPIAIJGetSeqAIJ(AIJ,NULL((void*)0),NULL((void*)0),&garray); |
1177 | ierr = MatGetRow_SeqAIJ(MatAIJ,lrow/p,&ncolsaij,&colsaij,&vals);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1177,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1178 | ierr = MatGetRow_SeqAIJ(MatOAIJ,lrow/p,&ncolsoaij,&colsoaij,&ovals);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1178,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1179 | |
1180 | c = ncolsaij + ncolsoaij; |
1181 | for (i=0; i<ncolsaij; i++) { |
1182 | /* check if this row contains a diagonal entry */ |
1183 | if (colsaij[i] == r) { |
1184 | diag = PETSC_TRUE; |
1185 | c = i; |
1186 | } |
1187 | } |
1188 | } else c = 0; |
1189 | |
1190 | /* calculate size of row */ |
1191 | nz = 0; |
1192 | if (S) nz += q; |
1193 | if (T || b->isTI) nz += (diag && S ? (ncolsaij+ncolsoaij-1)*q : (ncolsaij+ncolsoaij)*q); |
1194 | |
1195 | if (cols || values) { |
1196 | ierr = PetscMalloc2(nz,&idx,nz,&v)PetscMallocA(2,PETSC_FALSE,1196,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(nz)*sizeof(**(&idx)),(&idx),(size_t)(nz)*sizeof (**(&v)),(&v));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1196,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1197 | for (i=0; i<q; i++) { |
1198 | /* We need to initialize the v[i] to zero to handle the case in which T is NULL (not the identity matrix). */ |
1199 | v[i] = 0.0; |
1200 | } |
1201 | if (b->isTI) { |
1202 | for (i=0; i<ncolsaij; i++) { |
1203 | for (j=0; j<q; j++) { |
1204 | idx[i*q+j] = (colsaij[i]+rstart/p)*q+j; |
1205 | v[i*q+j] = (j==s ? vals[i] : 0.0); |
1206 | } |
1207 | } |
1208 | for (i=0; i<ncolsoaij; i++) { |
1209 | for (j=0; j<q; j++) { |
1210 | idx[(i+ncolsaij)*q+j] = garray[colsoaij[i]]*q+j; |
1211 | v[(i+ncolsaij)*q+j] = (j==s ? ovals[i]: 0.0); |
1212 | } |
1213 | } |
1214 | } else if (T) { |
1215 | for (i=0; i<ncolsaij; i++) { |
1216 | for (j=0; j<q; j++) { |
1217 | idx[i*q+j] = (colsaij[i]+rstart/p)*q+j; |
1218 | v[i*q+j] = vals[i]*T[s+j*p]; |
1219 | } |
1220 | } |
1221 | for (i=0; i<ncolsoaij; i++) { |
1222 | for (j=0; j<q; j++) { |
1223 | idx[(i+ncolsaij)*q+j] = garray[colsoaij[i]]*q+j; |
1224 | v[(i+ncolsaij)*q+j] = ovals[i]*T[s+j*p]; |
1225 | } |
1226 | } |
1227 | } |
1228 | if (S) { |
1229 | for (j=0; j<q; j++) { |
1230 | idx[c*q+j] = (r+rstart/p)*q+j; |
1231 | v[c*q+j] += S[s+j*p]; |
1232 | } |
1233 | } |
1234 | } |
1235 | |
1236 | if (ncols) *ncols = nz; |
1237 | if (cols) *cols = idx; |
1238 | if (values) *values = v; |
1239 | 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); |
1240 | } |
1241 | |
1242 | PetscErrorCode MatRestoreRow_MPIKAIJ(Mat A,PetscInt row,PetscInt *nz,PetscInt **idx,PetscScalar **v) |
1243 | { |
1244 | PetscErrorCode ierr; |
1245 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1245; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1246 | ierr = PetscFree2(*idx,*v)PetscFreeA(2,1246,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,&(*idx),&(*v));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1246,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1247 | ((Mat_SeqKAIJ*)A->data)->getrowactive = PETSC_FALSE; |
1248 | 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); |
1249 | } |
1250 | |
1251 | PetscErrorCode MatCreateSubMatrix_KAIJ(Mat mat,IS isrow,IS iscol,MatReuse cll,Mat *newmat) |
1252 | { |
1253 | PetscErrorCode ierr; |
1254 | Mat A; |
1255 | |
1256 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1256; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1257 | ierr = MatConvert(mat,MATAIJ"aij",MAT_INITIAL_MATRIX,&A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1257,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1258 | ierr = MatCreateSubMatrix(A,isrow,iscol,cll,newmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1258,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1259 | ierr = MatDestroy(&A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1259,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1260 | 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); |
1261 | } |
1262 | |
1263 | /* ---------------------------------------------------------------------------------- */ |
1264 | /*@C |
1265 | MatCreateKAIJ - Creates a matrix type to be used for matrices of the following form: |
1266 | |
1267 | [I \otimes S + A \otimes T] |
1268 | |
1269 | where |
1270 | S is a dense (p \times q) matrix |
1271 | T is a dense (p \times q) matrix |
1272 | A is an AIJ (n \times n) matrix |
1273 | I is the identity matrix |
1274 | The resulting matrix is (np \times nq) |
1275 | |
1276 | S and T are always stored independently on all processes as PetscScalar arrays in column-major format. |
1277 | |
1278 | Collective |
1279 | |
1280 | Input Parameters: |
1281 | + A - the AIJ matrix |
1282 | . p - number of rows in S and T |
1283 | . q - number of columns in S and T |
1284 | . S - the S matrix (can be PETSC_NULL), stored as a PetscScalar array (column-major) |
1285 | - T - the T matrix (can be PETSC_NULL), stored as a PetscScalar array (column-major) |
1286 | |
1287 | Output Parameter: |
1288 | . kaij - the new KAIJ matrix |
1289 | |
1290 | Notes: |
1291 | This function increases the reference count on the AIJ matrix, so the user is free to destroy the matrix if it is not needed. |
1292 | Changes to the entries of the AIJ matrix will immediately affect the KAIJ matrix. |
1293 | |
1294 | Level: advanced |
1295 | |
1296 | .seealso: MatKAIJSetAIJ(), MatKAIJSetS(), MatKAIJSetT(), MatKAIJGetAIJ(), MatKAIJGetS(), MatKAIJGetT(), MATKAIJ |
1297 | @*/ |
1298 | PetscErrorCode MatCreateKAIJ(Mat A,PetscInt p,PetscInt q,const PetscScalar S[],const PetscScalar T[],Mat *kaij) |
1299 | { |
1300 | PetscErrorCode ierr; |
1301 | PetscMPIInt size; |
1302 | |
1303 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1303; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1304 | ierr = MatCreate(PetscObjectComm((PetscObject)A),kaij);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1304,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1305 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1305,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1306 | if (size == 1) { |
1307 | ierr = MatSetType(*kaij,MATSEQKAIJ"seqkaij");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1307,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1308 | } else { |
1309 | ierr = MatSetType(*kaij,MATMPIKAIJ"mpikaij");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1309,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1310 | } |
1311 | ierr = MatKAIJSetAIJ(*kaij,A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1311,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1312 | ierr = MatKAIJSetS(*kaij,p,q,S);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1312,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1313 | ierr = MatKAIJSetT(*kaij,p,q,T);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1313,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1314 | ierr = MatSetUp(*kaij); |
1315 | 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); |
1316 | } |
1317 | |
1318 | /*MC |
1319 | MATKAIJ - MATKAIJ = "kaij" - A matrix type to be used to evaluate matrices of the following form: |
1320 | |
1321 | [I \otimes S + A \otimes T] |
1322 | |
1323 | where |
1324 | S is a dense (p \times q) matrix |
1325 | T is a dense (p \times q) matrix |
1326 | A is an AIJ (n \times n) matrix |
1327 | I is the identity matrix |
1328 | The resulting matrix is (np \times nq) |
1329 | |
1330 | S and T are always stored independently on all processes as PetscScalar arrays in column-major format. |
1331 | |
1332 | Level: advanced |
1333 | |
1334 | .seealso: MatKAIJSetAIJ(), MatKAIJSetS(), MatKAIJSetT(), MatKAIJGetAIJ(), MatKAIJGetS(), MatKAIJGetT(), MatCreateKAIJ() |
1335 | M*/ |
1336 | |
1337 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode MatCreate_KAIJ(Mat A) |
1338 | { |
1339 | PetscErrorCode ierr; |
1340 | Mat_MPIKAIJ *b; |
1341 | PetscMPIInt size; |
1342 | |
1343 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c"; petscstack ->line[petscstack->currentsize] = 1343; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); |
1344 | ierr = PetscNewLog(A,&b)(PetscMallocA(1,PETSC_TRUE,1344,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,(size_t)(1)*sizeof(**(((&b)))),(((&b)))) || PetscLogObjectMemory ((PetscObject)A,sizeof(**(&b))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1344,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1345 | A->data = (void*)b; |
1346 | |
1347 | ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1347,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1348 | |
1349 | A->ops->setup = MatSetUp_KAIJ; |
1350 | |
1351 | b->w = 0; |
1352 | ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1352,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1353 | if (size == 1) { |
1354 | ierr = PetscObjectChangeTypeName((PetscObject)A,MATSEQKAIJ"seqkaij");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1354,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1355 | A->ops->setup = MatSetUp_KAIJ; |
1356 | A->ops->destroy = MatDestroy_SeqKAIJ; |
1357 | A->ops->view = MatView_KAIJ; |
1358 | A->ops->mult = MatMult_SeqKAIJ; |
1359 | A->ops->multadd = MatMultAdd_SeqKAIJ; |
1360 | A->ops->invertblockdiagonal = MatInvertBlockDiagonal_SeqKAIJ; |
1361 | A->ops->getrow = MatGetRow_SeqKAIJ; |
1362 | A->ops->restorerow = MatRestoreRow_SeqKAIJ; |
1363 | A->ops->sor = MatSOR_SeqKAIJ; |
1364 | } else { |
1365 | ierr = PetscObjectChangeTypeName((PetscObject)A,MATMPIKAIJ"mpikaij");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1365,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1366 | A->ops->setup = MatSetUp_KAIJ; |
1367 | A->ops->destroy = MatDestroy_MPIKAIJ; |
1368 | A->ops->view = MatView_KAIJ; |
1369 | A->ops->mult = MatMult_MPIKAIJ; |
1370 | A->ops->multadd = MatMultAdd_MPIKAIJ; |
1371 | A->ops->invertblockdiagonal = MatInvertBlockDiagonal_MPIKAIJ; |
1372 | A->ops->getrow = MatGetRow_MPIKAIJ; |
1373 | A->ops->restorerow = MatRestoreRow_MPIKAIJ; |
1374 | ierr = PetscObjectComposeFunction((PetscObject)A,"MatGetDiagonalBlock_C",MatGetDiagonalBlock_MPIKAIJ)PetscObjectComposeFunction_Private((PetscObject)A,"MatGetDiagonalBlock_C" ,(PetscVoidFunction)(MatGetDiagonalBlock_MPIKAIJ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1374,__func__,"/sandbox/petsc/petsc.next/src/mat/impls/kaij/kaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); |
1375 | } |
1376 | A->ops->createsubmatrix = MatCreateSubMatrix_KAIJ; |
1377 | 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); |
1378 | } |