<p>  Many thanks for all your explanation, its really help me!</p><p>  Now my program run smoothly, and the result is satisfactory! </p><p>  For 3d results, I now make drawings by many slices in matlab. </p><p>  And I find it not visualized, so could do you please tell me how can I draw these 3d space fileds finely?<br><br><br>> -----原始邮件-----<br>> 发件人: "Jed Brown" <jed@jedbrown.org><br>> 发送时间: 2014年3月12日 星期三<br>> 收件人: "Barry Smith" <bsmith@mcs.anl.gov>, "Matthew Knepley" <knepley@gmail.com><br>> 抄送: "吕超" <luchao@mail.iggcas.ac.cn>, petsc-users <petsc-users@mcs.anl.gov><br>> 主题: Re: [petsc-users] petsc malloc multidimensional array<br>> <br>> Barry Smith <bsmith@mcs.anl.gov> writes:<br>> <br>> > On Mar 11, 2014, at 9:22 AM, Matthew Knepley <knepley@gmail.com> wrote:<br>> ><br>> >> On Tue, Mar 11, 2014 at 9:05 AM, 吕超 <luchao@mail.iggcas.ac.cn> wrote:<br>> >> Hi, Matthew:<br>> >> <br>> >>      Thank you for your reply so fast! but I also have some questions:<br>> >> <br>> >>     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.<br>> ><br>> >    If the 512 is a fixed number, not different for different elements you can in C 89 standard use <br>> ><br>> >     mysubroutine(….)<br>> >     double element[512][512];<br>> <br>> This is fairly "big" -- 2 MiB of what is typically an 8 MiB stack size,<br>> so if you allocate several of these, you may get a stack overflow.  You<br>> can increase the stack size on most systems, but that makes it more<br>> complicated to run your program.  I would allocate dynamically if you<br>> are worried about this.<br>> <br>> If you want to avoid PETSc array functions, you can allocate dynamically<br>> and access via a pointer:<br>> <br>>   double *mem = malloc(M*N*sizeof(double));<br>>   double (*p)[N] = (double (*)[N])mem;<br>>   // access p[i][j]<br>>   free(mem);<br></p><br><br><br>