File: | mat/impls/baij/mpi/mmbaij.c |
Warning: | line 24, column 14 Division by zero |
[?] Use j/k keys for keyboard navigation
1 | ||||
2 | /* | |||
3 | Support for the parallel BAIJ matrix vector multiply | |||
4 | */ | |||
5 | #include <../src/mat/impls/baij/mpi/mpibaij.h> | |||
6 | #include <petsc/private/isimpl.h> /* needed because accesses data structure of ISLocalToGlobalMapping directly */ | |||
7 | ||||
8 | PetscErrorCode MatSetUpMultiply_MPIBAIJ(Mat mat) | |||
9 | { | |||
10 | Mat_MPIBAIJ *baij = (Mat_MPIBAIJ*)mat->data; | |||
11 | Mat_SeqBAIJ *B = (Mat_SeqBAIJ*)(baij->B->data); | |||
12 | PetscErrorCode ierr; | |||
13 | PetscInt i,j,*aj = B->j,ec = 0,*garray; | |||
14 | PetscInt bs = mat->rmap->bs,*stmp; | |||
15 | IS from,to; | |||
16 | Vec gvec; | |||
17 | #if defined(PETSC_USE_CTABLE1) | |||
18 | PetscTable gid1_lid1; | |||
19 | PetscTablePosition tpos; | |||
20 | PetscInt gid,lid; | |||
21 | #else | |||
22 | PetscInt Nbs = baij->Nbs,*indices; | |||
23 | #endif | |||
24 | ||||
25 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ; petscstack->line[petscstack->currentsize] = 25; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
26 | #if defined(PETSC_USE_CTABLE1) | |||
27 | /* use a table - Mark Adams */ | |||
28 | ierr = PetscTableCreate(B->mbs,baij->Nbs+1,&gid1_lid1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),28,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
29 | for (i=0; i<B->mbs; i++) { | |||
| ||||
30 | for (j=0; j<B->ilen[i]; j++) { | |||
31 | PetscInt data,gid1 = aj[B->i[i]+j] + 1; | |||
32 | ierr = PetscTableFind(gid1_lid1,gid1,&data);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),32,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
33 | if (!data) { | |||
34 | /* one based table */ | |||
35 | ierr = PetscTableAdd(gid1_lid1,gid1,++ec,INSERT_VALUES);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),35,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
36 | } | |||
37 | } | |||
38 | } | |||
39 | /* form array of columns we need */ | |||
40 | ierr = PetscMalloc1(ec+1,&garray)PetscMallocA(1,PETSC_FALSE,40,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(ec+1)*sizeof(**(&garray)),(&garray));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),40,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
41 | ierr = PetscTableGetHeadPosition(gid1_lid1,&tpos);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),41,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
42 | while (tpos) { | |||
43 | ierr = PetscTableGetNext(gid1_lid1,&tpos,&gid,&lid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),43,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
44 | gid--; lid--; | |||
45 | garray[lid] = gid; | |||
46 | } | |||
47 | ierr = PetscSortInt(ec,garray);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),47,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
48 | ierr = PetscTableRemoveAll(gid1_lid1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),48,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
49 | for (i=0; i<ec; i++) { | |||
50 | ierr = PetscTableAdd(gid1_lid1,garray[i]+1,i+1,INSERT_VALUES);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),50,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
51 | } | |||
52 | /* compact out the extra columns in B */ | |||
53 | for (i=0; i<B->mbs; i++) { | |||
54 | for (j=0; j<B->ilen[i]; j++) { | |||
55 | PetscInt gid1 = aj[B->i[i] + j] + 1; | |||
56 | ierr = PetscTableFind(gid1_lid1,gid1,&lid);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),56,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
57 | lid--; | |||
58 | aj[B->i[i]+j] = lid; | |||
59 | } | |||
60 | } | |||
61 | B->nbs = ec; | |||
62 | baij->B->cmap->n = baij->B->cmap->N = ec*mat->rmap->bs; | |||
63 | ||||
64 | ierr = PetscLayoutSetUp((baij->B->cmap));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),64,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
65 | ierr = PetscTableDestroy(&gid1_lid1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),65,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
66 | #else | |||
67 | /* Make an array as long as the number of columns */ | |||
68 | /* mark those columns that are in baij->B */ | |||
69 | ierr = PetscCalloc1(Nbs+1,&indices)PetscMallocA(1,PETSC_TRUE,69,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(Nbs+1)*sizeof(**(&indices)),(&indices));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),69,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
70 | for (i=0; i<B->mbs; i++) { | |||
71 | for (j=0; j<B->ilen[i]; j++) { | |||
72 | if (!indices[aj[B->i[i] + j]]) ec++; | |||
73 | indices[aj[B->i[i] + j]] = 1; | |||
74 | } | |||
75 | } | |||
76 | ||||
77 | /* form array of columns we need */ | |||
78 | ierr = PetscMalloc1(ec+1,&garray)PetscMallocA(1,PETSC_FALSE,78,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(ec+1)*sizeof(**(&garray)),(&garray));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),78,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
79 | ec = 0; | |||
80 | for (i=0; i<Nbs; i++) { | |||
81 | if (indices[i]) { | |||
82 | garray[ec++] = i; | |||
83 | } | |||
84 | } | |||
85 | ||||
86 | /* make indices now point into garray */ | |||
87 | for (i=0; i<ec; i++) { | |||
88 | indices[garray[i]] = i; | |||
89 | } | |||
90 | ||||
91 | /* compact out the extra columns in B */ | |||
92 | for (i=0; i<B->mbs; i++) { | |||
93 | for (j=0; j<B->ilen[i]; j++) { | |||
94 | aj[B->i[i] + j] = indices[aj[B->i[i] + j]]; | |||
95 | } | |||
96 | } | |||
97 | B->nbs = ec; | |||
98 | baij->B->cmap->n = baij->B->cmap->N = ec*mat->rmap->bs; | |||
99 | ||||
100 | ierr = PetscLayoutSetUp((baij->B->cmap));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),100,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
101 | ierr = PetscFree(indices)((*PetscTrFree)((void*)(indices),101,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((indices) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),101,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
102 | #endif | |||
103 | ||||
104 | /* create local vector that is used to scatter into */ | |||
105 | ierr = VecCreateSeq(PETSC_COMM_SELF((MPI_Comm)0x44000001),ec*bs,&baij->lvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),105,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
106 | ||||
107 | /* create two temporary index sets for building scatter-gather */ | |||
108 | ierr = ISCreateBlock(PETSC_COMM_SELF((MPI_Comm)0x44000001),bs,ec,garray,PETSC_COPY_VALUES,&from);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),108,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
109 | ||||
110 | ierr = PetscMalloc1(ec+1,&stmp)PetscMallocA(1,PETSC_FALSE,110,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(ec+1)*sizeof(**(&stmp)),(&stmp));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),110,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
111 | for (i=0; i<ec; i++) stmp[i] = i; | |||
112 | ierr = ISCreateBlock(PETSC_COMM_SELF((MPI_Comm)0x44000001),bs,ec,stmp,PETSC_OWN_POINTER,&to);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),112,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
113 | ||||
114 | /* create temporary global vector to generate scatter context */ | |||
115 | ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)mat),1,mat->cmap->n,mat->cmap->N,NULL((void*)0),&gvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),115,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
116 | ||||
117 | ierr = VecScatterCreate(gvec,from,baij->lvec,to,&baij->Mvctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),117,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
118 | ||||
119 | ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)baij->Mvctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),119,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
120 | ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)baij->lvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),120,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
121 | ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)from);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),121,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
122 | ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)to);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),122,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
123 | ||||
124 | baij->garray = garray; | |||
125 | ||||
126 | ierr = PetscLogObjectMemory((PetscObject)mat,(ec+1)*sizeof(PetscInt));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),126,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
127 | ierr = ISDestroy(&from);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),127,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
128 | ierr = ISDestroy(&to);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),128,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
129 | ierr = VecDestroy(&gvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),129,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
130 | 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); | |||
131 | } | |||
132 | ||||
133 | /* | |||
134 | Takes the local part of an already assembled MPIBAIJ matrix | |||
135 | and disassembles it. This is to allow new nonzeros into the matrix | |||
136 | that require more communication in the matrix vector multiply. | |||
137 | Thus certain data-structures must be rebuilt. | |||
138 | ||||
139 | Kind of slow! But that's what application programmers get when | |||
140 | they are sloppy. | |||
141 | */ | |||
142 | PetscErrorCode MatDisAssemble_MPIBAIJ(Mat A) | |||
143 | { | |||
144 | Mat_MPIBAIJ *baij = (Mat_MPIBAIJ*)A->data; | |||
145 | Mat B = baij->B,Bnew; | |||
146 | Mat_SeqBAIJ *Bbaij = (Mat_SeqBAIJ*)B->data; | |||
147 | PetscErrorCode ierr; | |||
148 | PetscInt i,j,mbs=Bbaij->mbs,n = A->cmap->N,col,*garray=baij->garray; | |||
149 | PetscInt bs2 = baij->bs2,*nz,ec,m = A->rmap->n; | |||
150 | MatScalar *a = Bbaij->a; | |||
151 | MatScalar *atmp; | |||
152 | ||||
153 | ||||
154 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ; petscstack->line[petscstack->currentsize] = 154; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
155 | /* free stuff related to matrix-vec multiply */ | |||
156 | ierr = VecGetSize(baij->lvec,&ec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),156,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* needed for PetscLogObjectMemory below */ | |||
157 | ierr = VecDestroy(&baij->lvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),157,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); baij->lvec = 0; | |||
158 | ierr = VecScatterDestroy(&baij->Mvctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),158,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); baij->Mvctx = 0; | |||
159 | if (baij->colmap) { | |||
160 | #if defined(PETSC_USE_CTABLE1) | |||
161 | ierr = PetscTableDestroy(&baij->colmap);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),161,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
162 | #else | |||
163 | ierr = PetscFree(baij->colmap)((*PetscTrFree)((void*)(baij->colmap),163,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((baij->colmap) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),163,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
164 | ierr = PetscLogObjectMemory((PetscObject)A,-Bbaij->nbs*sizeof(PetscInt));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),164,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
165 | #endif | |||
166 | } | |||
167 | ||||
168 | /* make sure that B is assembled so we can access its values */ | |||
169 | ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),169,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
170 | ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),170,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
171 | ||||
172 | /* invent new B and copy stuff over */ | |||
173 | ierr = PetscMalloc1(mbs,&nz)PetscMallocA(1,PETSC_FALSE,173,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(mbs)*sizeof(**(&nz)),(&nz));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),173,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
174 | for (i=0; i<mbs; i++) { | |||
175 | nz[i] = Bbaij->i[i+1]-Bbaij->i[i]; | |||
176 | } | |||
177 | ierr = MatCreate(PetscObjectComm((PetscObject)B),&Bnew);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),177,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
178 | ierr = MatSetSizes(Bnew,m,n,m,n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),178,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
179 | ierr = MatSetType(Bnew,((PetscObject)B)->type_name);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),179,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
180 | ierr = MatSeqBAIJSetPreallocation(Bnew,B->rmap->bs,0,nz);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),180,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
181 | if (Bbaij->nonew >= 0) { /* Inherit insertion error options (if positive). */ | |||
182 | ((Mat_SeqBAIJ*)Bnew->data)->nonew = Bbaij->nonew; | |||
183 | } | |||
184 | ||||
185 | ierr = MatSetOption(Bnew,MAT_ROW_ORIENTED,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),185,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
186 | /* | |||
187 | Ensure that B's nonzerostate is monotonically increasing. | |||
188 | Or should this follow the MatSetValuesBlocked() loop to preserve B's nonzerstate across a MatDisAssemble() call? | |||
189 | */ | |||
190 | Bnew->nonzerostate = B->nonzerostate; | |||
191 | ||||
192 | for (i=0; i<mbs; i++) { | |||
193 | for (j=Bbaij->i[i]; j<Bbaij->i[i+1]; j++) { | |||
194 | col = garray[Bbaij->j[j]]; | |||
195 | atmp = a + j*bs2; | |||
196 | ierr = MatSetValuesBlocked_SeqBAIJ(Bnew,1,&i,1,&col,atmp,B->insertmode);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),196,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
197 | } | |||
198 | } | |||
199 | ierr = MatSetOption(Bnew,MAT_ROW_ORIENTED,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),199,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
200 | ||||
201 | ierr = PetscFree(nz)((*PetscTrFree)((void*)(nz),201,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((nz) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),201,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
202 | ierr = PetscFree(baij->garray)((*PetscTrFree)((void*)(baij->garray),202,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((baij->garray) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),202,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
203 | ierr = PetscLogObjectMemory((PetscObject)A,-ec*sizeof(PetscInt));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),203,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
204 | ierr = MatDestroy(&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),204,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
205 | ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)Bnew);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),205,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
206 | ||||
207 | baij->B = Bnew; | |||
208 | A->was_assembled = PETSC_FALSE; | |||
209 | A->assembled = PETSC_FALSE; | |||
210 | 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); | |||
211 | } | |||
212 | ||||
213 | /* ugly stuff added for Glenn someday we should fix this up */ | |||
214 | ||||
215 | static PetscInt *uglyrmapd = 0,*uglyrmapo = 0; /* mapping from the local ordering to the "diagonal" and "off-diagonal" parts of the local matrix */ | |||
216 | static Vec uglydd = 0,uglyoo = 0; /* work vectors used to scale the two parts of the local matrix */ | |||
217 | ||||
218 | ||||
219 | PetscErrorCode MatMPIBAIJDiagonalScaleLocalSetUp(Mat inA,Vec scale) | |||
220 | { | |||
221 | Mat_MPIBAIJ *ina = (Mat_MPIBAIJ*) inA->data; /*access private part of matrix */ | |||
222 | Mat_SeqBAIJ *B = (Mat_SeqBAIJ*)ina->B->data; | |||
223 | PetscErrorCode ierr; | |||
224 | PetscInt bs = inA->rmap->bs,i,n,nt,j,cstart,cend,no,*garray = ina->garray,*lindices; | |||
225 | PetscInt *r_rmapd,*r_rmapo; | |||
226 | ||||
227 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ; petscstack->line[petscstack->currentsize] = 227; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
228 | ierr = MatGetOwnershipRange(inA,&cstart,&cend);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),228,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
229 | ierr = MatGetSize(ina->A,NULL((void*)0),&n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),229,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
230 | ierr = PetscCalloc1(inA->rmap->mapping->n+1,&r_rmapd)PetscMallocA(1,PETSC_TRUE,230,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(inA->rmap->mapping->n+1)*sizeof(**(&r_rmapd )),(&r_rmapd));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),230,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
231 | nt = 0; | |||
232 | for (i=0; i<inA->rmap->mapping->n; i++) { | |||
233 | if (inA->rmap->mapping->indices[i]*bs >= cstart && inA->rmap->mapping->indices[i]*bs < cend) { | |||
234 | nt++; | |||
235 | r_rmapd[i] = inA->rmap->mapping->indices[i] + 1; | |||
236 | } | |||
237 | } | |||
238 | if (nt*bs != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Hmm nt*bs %D n %D",nt*bs,n)return PetscError(((MPI_Comm)0x44000001),238,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,77,PETSC_ERROR_INITIAL,"Hmm nt*bs %D n %D",nt*bs,n); | |||
239 | ierr = PetscMalloc1(n+1,&uglyrmapd)PetscMallocA(1,PETSC_FALSE,239,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(n+1)*sizeof(**(&uglyrmapd)),(&uglyrmapd));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),239,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
240 | for (i=0; i<inA->rmap->mapping->n; i++) { | |||
241 | if (r_rmapd[i]) { | |||
242 | for (j=0; j<bs; j++) { | |||
243 | uglyrmapd[(r_rmapd[i]-1)*bs+j-cstart] = i*bs + j; | |||
244 | } | |||
245 | } | |||
246 | } | |||
247 | ierr = PetscFree(r_rmapd)((*PetscTrFree)((void*)(r_rmapd),247,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((r_rmapd) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),247,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
248 | ierr = VecCreateSeq(PETSC_COMM_SELF((MPI_Comm)0x44000001),n,&uglydd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),248,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
249 | ||||
250 | ierr = PetscCalloc1(ina->Nbs+1,&lindices)PetscMallocA(1,PETSC_TRUE,250,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(ina->Nbs+1)*sizeof(**(&lindices)),(&lindices ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),250,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
251 | for (i=0; i<B->nbs; i++) { | |||
252 | lindices[garray[i]] = i+1; | |||
253 | } | |||
254 | no = inA->rmap->mapping->n - nt; | |||
255 | ierr = PetscCalloc1(inA->rmap->mapping->n+1,&r_rmapo)PetscMallocA(1,PETSC_TRUE,255,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(inA->rmap->mapping->n+1)*sizeof(**(&r_rmapo )),(&r_rmapo));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),255,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
256 | nt = 0; | |||
257 | for (i=0; i<inA->rmap->mapping->n; i++) { | |||
258 | if (lindices[inA->rmap->mapping->indices[i]]) { | |||
259 | nt++; | |||
260 | r_rmapo[i] = lindices[inA->rmap->mapping->indices[i]]; | |||
261 | } | |||
262 | } | |||
263 | if (nt > no) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Hmm nt %D no %D",nt,n)return PetscError(((MPI_Comm)0x44000001),263,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,77,PETSC_ERROR_INITIAL,"Hmm nt %D no %D",nt,n); | |||
264 | ierr = PetscFree(lindices)((*PetscTrFree)((void*)(lindices),264,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((lindices) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),264,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
265 | ierr = PetscMalloc1(nt*bs+1,&uglyrmapo)PetscMallocA(1,PETSC_FALSE,265,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,(size_t)(nt*bs+1)*sizeof(**(&uglyrmapo)),(&uglyrmapo ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),265,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
266 | for (i=0; i<inA->rmap->mapping->n; i++) { | |||
267 | if (r_rmapo[i]) { | |||
268 | for (j=0; j<bs; j++) { | |||
269 | uglyrmapo[(r_rmapo[i]-1)*bs+j] = i*bs + j; | |||
270 | } | |||
271 | } | |||
272 | } | |||
273 | ierr = PetscFree(r_rmapo)((*PetscTrFree)((void*)(r_rmapo),273,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ) || ((r_rmapo) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),273,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
274 | ierr = VecCreateSeq(PETSC_COMM_SELF((MPI_Comm)0x44000001),nt*bs,&uglyoo);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),274,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
275 | 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); | |||
276 | } | |||
277 | ||||
278 | PetscErrorCode MatMPIBAIJDiagonalScaleLocal(Mat A,Vec scale) | |||
279 | { | |||
280 | /* This routine should really be abandoned as it duplicates MatDiagonalScaleLocal */ | |||
281 | PetscErrorCode ierr; | |||
282 | ||||
283 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ; petscstack->line[petscstack->currentsize] = 283; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
284 | ierr = PetscTryMethod(A,"MatDiagonalScaleLocal_C",(Mat,Vec),(A,scale))0; do { PetscErrorCode (*f)(Mat,Vec), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)A),("MatDiagonalScaleLocal_C"),(PetscVoidFunction *)(&f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),284,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(A,scale);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),284,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),284,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
285 | 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); | |||
286 | } | |||
287 | ||||
288 | PetscErrorCode MatDiagonalScaleLocal_MPIBAIJ(Mat A,Vec scale) | |||
289 | { | |||
290 | Mat_MPIBAIJ *a = (Mat_MPIBAIJ*) A->data; /*access private part of matrix */ | |||
291 | PetscErrorCode ierr; | |||
292 | PetscInt n,i; | |||
293 | PetscScalar *d,*o; | |||
294 | const PetscScalar *s; | |||
295 | ||||
296 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ; petscstack->line[petscstack->currentsize] = 296; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
297 | if (!uglyrmapd) { | |||
298 | ierr = MatMPIBAIJDiagonalScaleLocalSetUp(A,scale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),298,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
299 | } | |||
300 | ||||
301 | ierr = VecGetArrayRead(scale,&s);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),301,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
302 | ||||
303 | ierr = VecGetLocalSize(uglydd,&n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),303,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
304 | ierr = VecGetArray(uglydd,&d);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),304,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
305 | for (i=0; i<n; i++) { | |||
306 | d[i] = s[uglyrmapd[i]]; /* copy "diagonal" (true local) portion of scale into dd vector */ | |||
307 | } | |||
308 | ierr = VecRestoreArray(uglydd,&d);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),308,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
309 | /* column scale "diagonal" portion of local matrix */ | |||
310 | ierr = MatDiagonalScale(a->A,NULL((void*)0),uglydd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),310,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
311 | ||||
312 | ierr = VecGetLocalSize(uglyoo,&n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),312,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
313 | ierr = VecGetArray(uglyoo,&o);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),313,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
314 | for (i=0; i<n; i++) { | |||
315 | o[i] = s[uglyrmapo[i]]; /* copy "off-diagonal" portion of scale into oo vector */ | |||
316 | } | |||
317 | ierr = VecRestoreArrayRead(scale,&s);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),317,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
318 | ierr = VecRestoreArray(uglyoo,&o);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),318,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
319 | /* column scale "off-diagonal" portion of local matrix */ | |||
320 | ierr = MatDiagonalScale(a->B,NULL((void*)0),uglyoo);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),320,__func__,"/sandbox/petsc/petsc.master/src/mat/impls/baij/mpi/mmbaij.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
321 | 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); | |||
322 | } |
1 | #ifndef __PETSCCTABLE_H | |||
2 | #define __PETSCCTABLE_H | |||
3 | #include <petscsys.h> | |||
4 | ||||
5 | struct _n_PetscTable { | |||
6 | PetscInt *keytable; | |||
7 | PetscInt *table; | |||
8 | PetscInt count; | |||
9 | PetscInt tablesize; | |||
10 | PetscInt head; | |||
11 | PetscInt maxkey; /* largest key allowed */ | |||
12 | }; | |||
13 | ||||
14 | typedef struct _n_PetscTable* PetscTable; | |||
15 | typedef PetscInt* PetscTablePosition; | |||
16 | ||||
17 | PETSC_STATIC_INLINEstatic inline unsigned long PetscHash(PetscTable ta,unsigned long x) | |||
18 | { | |||
19 | return(x%(unsigned long)ta->tablesize); | |||
20 | } | |||
21 | ||||
22 | PETSC_STATIC_INLINEstatic inline unsigned long PetscHashStep(PetscTable ta,unsigned long x) | |||
23 | { | |||
24 | return(1+(x%(unsigned long)(ta->tablesize-1))); | |||
| ||||
25 | } | |||
26 | ||||
27 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableCreate(const PetscInt,PetscInt,PetscTable*); | |||
28 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableCreateCopy(const PetscTable,PetscTable*); | |||
29 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableDestroy(PetscTable*); | |||
30 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableGetCount(const PetscTable,PetscInt*); | |||
31 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableIsEmpty(const PetscTable,PetscInt*); | |||
32 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableAddExpand(PetscTable,PetscInt,PetscInt,InsertMode); | |||
33 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableAddCountExpand(PetscTable,PetscInt); | |||
34 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableGetHeadPosition(PetscTable,PetscTablePosition*); | |||
35 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableGetNext(PetscTable,PetscTablePosition*,PetscInt*,PetscInt*); | |||
36 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PetscTableRemoveAll(PetscTable); | |||
37 | ||||
38 | PETSC_STATIC_INLINEstatic inline PetscErrorCode PetscTableAdd(PetscTable ta,PetscInt key,PetscInt data,InsertMode imode) | |||
39 | { | |||
40 | PetscErrorCode ierr; | |||
41 | PetscInt i,hash = (PetscInt)PetscHash(ta,(unsigned long)key); | |||
42 | PetscInt hashstep = (PetscInt)PetscHashStep(ta,(unsigned long)key); | |||
43 | ||||
44 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/include/petscctable.h"; petscstack ->line[petscstack->currentsize] = 44; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
45 | if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key <= 0")return PetscError(((MPI_Comm)0x44000001),45,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"key <= 0"); | |||
46 | if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey)return PetscError(((MPI_Comm)0x44000001),46,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"key %D is greater than largest key allowed %D" ,key,ta->maxkey); | |||
47 | if (!data) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Null data")return PetscError(((MPI_Comm)0x44000001),47,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"Null data"); | |||
48 | ||||
49 | for (i=0; i<ta->tablesize; i++) { | |||
50 | if (ta->keytable[hash] == key) { | |||
51 | switch (imode) { | |||
52 | case INSERT_VALUES: | |||
53 | ta->table[hash] = data; /* over write */ | |||
54 | break; | |||
55 | case ADD_VALUES: | |||
56 | ta->table[hash] += data; | |||
57 | break; | |||
58 | case MAX_VALUES: | |||
59 | ta->table[hash] = PetscMax(ta->table[hash],data)(((ta->table[hash])<(data)) ? (data) : (ta->table[hash ])); | |||
60 | break; | |||
61 | case NOT_SET_VALUES: | |||
62 | case INSERT_ALL_VALUES: | |||
63 | case ADD_ALL_VALUES: | |||
64 | case INSERT_BC_VALUES: | |||
65 | case ADD_BC_VALUES: | |||
66 | SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported InsertMode")return PetscError(((MPI_Comm)0x44000001),66,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,56,PETSC_ERROR_INITIAL,"Unsupported InsertMode"); | |||
67 | } | |||
68 | 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); | |||
69 | } else if (!ta->keytable[hash]) { | |||
70 | if (ta->count < 5*(ta->tablesize/6) - 1) { | |||
71 | ta->count++; /* add */ | |||
72 | ta->keytable[hash] = key; | |||
73 | ta->table[hash] = data; | |||
74 | } else { | |||
75 | ierr = PetscTableAddExpand(ta,key,data,imode);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),75,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
76 | } | |||
77 | 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); | |||
78 | } | |||
79 | hash = (hash + hashstep)%ta->tablesize; | |||
80 | } | |||
81 | SETERRQ(PETSC_COMM_SELF,PETSC_ERR_COR,"Full table")return PetscError(((MPI_Comm)0x44000001),81,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,74,PETSC_ERROR_INITIAL,"Full table"); | |||
82 | /* PetscFunctionReturn(0); */ | |||
83 | } | |||
84 | ||||
85 | PETSC_STATIC_INLINEstatic inline PetscErrorCode PetscTableAddCount(PetscTable ta,PetscInt key) | |||
86 | { | |||
87 | PetscErrorCode ierr; | |||
88 | PetscInt i,hash = (PetscInt)PetscHash(ta,(unsigned long)key); | |||
89 | PetscInt hashstep = (PetscInt)PetscHashStep(ta,(unsigned long)key); | |||
90 | ||||
91 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/include/petscctable.h"; petscstack ->line[petscstack->currentsize] = 91; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
92 | if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key <= 0")return PetscError(((MPI_Comm)0x44000001),92,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"key <= 0"); | |||
93 | if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey)return PetscError(((MPI_Comm)0x44000001),93,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"key %D is greater than largest key allowed %D" ,key,ta->maxkey); | |||
94 | ||||
95 | for (i=0; i<ta->tablesize; i++) { | |||
96 | if (ta->keytable[hash] == key) { | |||
97 | 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); | |||
98 | } else if (!ta->keytable[hash]) { | |||
99 | if (ta->count < 5*(ta->tablesize/6) - 1) { | |||
100 | ta->count++; /* add */ | |||
101 | ta->keytable[hash] = key; | |||
102 | ta->table[hash] = ta->count; | |||
103 | } else { | |||
104 | ierr = PetscTableAddCountExpand(ta,key);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),104,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
105 | } | |||
106 | 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); | |||
107 | } | |||
108 | hash = (hash + hashstep)%ta->tablesize; | |||
109 | } | |||
110 | SETERRQ(PETSC_COMM_SELF,PETSC_ERR_COR,"Full table")return PetscError(((MPI_Comm)0x44000001),110,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,74,PETSC_ERROR_INITIAL,"Full table"); | |||
111 | /* PetscFunctionReturn(0); */ | |||
112 | } | |||
113 | ||||
114 | /* | |||
115 | PetscTableFind - checks if a key is in the table | |||
116 | ||||
117 | If data==0, then no table entry exists. | |||
118 | ||||
119 | */ | |||
120 | PETSC_STATIC_INLINEstatic inline PetscErrorCode PetscTableFind(PetscTable ta,PetscInt key,PetscInt *data) | |||
121 | { | |||
122 | PetscInt ii = 0; | |||
123 | PetscInt hash = (PetscInt)PetscHash(ta,(unsigned long)key); | |||
124 | PetscInt hashstep = (PetscInt)PetscHashStep(ta,(unsigned long)key); | |||
125 | ||||
126 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.master/include/petscctable.h"; petscstack ->line[petscstack->currentsize] = 126; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
127 | *data = 0; | |||
128 | if (key <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Key <= 0")return PetscError(((MPI_Comm)0x44000001),128,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"Key <= 0"); | |||
129 | if (key > ta->maxkey) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"key %D is greater than largest key allowed %D",key,ta->maxkey)return PetscError(((MPI_Comm)0x44000001),129,__func__,"/sandbox/petsc/petsc.master/include/petscctable.h" ,63,PETSC_ERROR_INITIAL,"key %D is greater than largest key allowed %D" ,key,ta->maxkey); | |||
130 | ||||
131 | while (ii++ < ta->tablesize) { | |||
132 | if (!ta->keytable[hash]) break; | |||
133 | else if (ta->keytable[hash] == key) { | |||
134 | *data = ta->table[hash]; | |||
135 | break; | |||
136 | } | |||
137 | hash = (hash + hashstep)%ta->tablesize; | |||
138 | } | |||
139 | 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); | |||
140 | } | |||
141 | ||||
142 | #endif |