On Wed, May 21, 2014 at 3:44 PM, Jed Brown <[email protected]> wrote:
> Christophe Ortiz <[email protected]> writes: > > In some sense, yes. I create and destroy inside FormIJacobian() (my > > Jacobian evaluation routine). Therefore it is called at each timestep. I > > guess this takes time. But it is slower than doing the many malloc. > > What communicator (you should use VecCreateSeq)? I used: VecCreateSeq(PETSC_COMM_SELF,dof*dof,&X); inside FormIJacobian() > Be sure to profile a > configure --with-debugging=0. > > How many elements do you have on each process? How big are the > elements? > For the moment, dof is small (dof=4). Still doing some tests with the classes and methods. But should reach 1000-10000 in production. > > > How can I create a global vector that would be passed to FormIJacobian() > ? > > Creating it only once instead of doing it at each timestep would save > time. > > You can/should always put this stuff in the user context (which comes in > via the last argument). > Ahhh...did not think about it ! This would allow to create the vector only once in the main (after dof is determined) and pass it as argument to FormIJacobian(). I will try. Thanks ! > > > I need to use this vector (size dof*dof) with classes and methods inside > > FormIJacobian() to calculate the different blocks that are passed to the > > Jacobian with MatSetValuesBlocked(). However, I cannot pass it as > argument > > of FormIJacobian() since there is no room for it in the arguments. > >
