On Mar 11, 2014, at 9:22 AM, Matthew Knepley <[email protected]> wrote:
> On Tue, Mar 11, 2014 at 9:05 AM, 吕超 <[email protected]> wrote: > Hi, Matthew: > > Thank you for your reply so fast! but I also have some questions: > > 2d arrays I used is just intermediate variable, not for fields, and the > fields is used Vector. In Finite element method, when I use element stiffness > matrix to assemble global stiffness matrix, I always first compute the 2d > element stiffness matrixs whose size is 512*512(inner points in element),so > big for static arrays. If the 512 is a fixed number, not different for different elements you can in C 89 standard use mysubroutine(….) double element[512][512]; ……. Use element and even pass element to MatSetValues(). In C99 you can even have the element size be a runtime value and do mysubroutine(int N,…..) double element[N][N]; …… Use element and even pass element to MatSetValues(). C will automatically handle the allocation of the needed space and it will be efficient. Note that C will allocate the space as needed inside the routine, it is not kept around outside the routine. No need to use PETSc’s routines to allocate the space. Barry > So i want to use PetscMalloc to bulid 2d arrays to store element stiffness > matrixs' values. And I don't know how to do, could do tell me? > > AGAIN, these are C questions. You could > > a) malloc() each row > > b) malloc() the whole thing, and make pointers to each row > > Notice that this is enormous for an element matrix. This is likely not > optimal for performance. > > Matt > > then use another 1d array to abstract the nonzero values from 2d arrays > above-mentioned. could do you please tell me some other methods much more > convenient and faster? > > > > -----原始邮件----- > 发件人: "Matthew Knepley" <[email protected]> > 发送时间: 2014年3月11日 星期二 > 收件人: "吕超" <[email protected]> > 抄送: petsc-users <[email protected]> > 主题: Re: [petsc-users] petsc malloc multidimensional array > > On Tue, Mar 11, 2014 at 8:37 AM, 吕超 <[email protected]> wrote: > Hi, recently,when I use PETSc to bulid 2d arrays such as PetscScalar > A[512][512],B[512][512],C,D,E,F,..., program always has error of Segmentation > Violation. So I want to use PetscMalloc to bulid 2d array, and I hope that I > can also use these 2d array A[i][j] by subscripts as before. Could do please > tell me how can I do? Thank you. > > 1) This is a C question, not a PETSc question > > 2) If you are using 2D arrays for fields, you should be using the DMDA, which > has a section in the manual > > Thanks, > > Matt > > LV CHAO > > 2014/3/11 > > > > > > > > > > -- > What most experimenters take for granted before they begin their experiments > is infinitely more interesting than any results to which their experiments > lead. > -- Norbert Wiener > > > > > > > > -- > What most experimenters take for granted before they begin their experiments > is infinitely more interesting than any results to which their experiments > lead. > -- Norbert Wiener
