[petsc-users] DMComposite and Matrix construction

Gautam Bisht gbisht at lbl.gov
Fri Jul 31 11:34:29 CDT 2015


I have a followup question on this topic regarding memory usage.

For the Jacobian matrix in src/snes/examples/tutorials/ex28.c of
problem_type 2,  MAT_NEW_NONZERO_LOCATION_ERR and
MAT_NEW_NONZERO_ALLOCATION_ERR are set PETSC_FALSE. If the problem_type 2
is solved multiple times (see the git difference below), would the memory
usage keep on increasing? Or, since the non-zero pattern isn't changing
over time, there would only be an increase in memory on the first SNESSolve?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>git diff ex28.c
diff --git a/src/snes/examples/tutorials/ex28.c
b/src/snes/examples/tutorials/ex28.c
index 98dd6b9..40f94d1 100644
--- a/src/snes/examples/tutorials/ex28.c
+++ b/src/snes/examples/tutorials/ex28.c
@@ -342,6 +342,7 @@ int main(int argc, char *argv[])
   Mat            B;
   IS             *isg;
   PetscBool      view_draw,pass_dm;
+  PetscInt iter;

   PetscInitialize(&argc,&argv,0,help);
   ierr =
DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,-10,1,1,NULL,&dau);CHKERRQ(ierr);
@@ -434,7 +435,10 @@ int main(int argc, char *argv[])
        * of splits, but it requires using a DM (perhaps your own
implementation). */
       ierr = SNESSetDM(snes,pack);CHKERRQ(ierr);
     }
+    for (iter=1; iter<10000; iter++)  {
     ierr = SNESSolve(snes,NULL,X);CHKERRQ(ierr);
+    ierr = FormInitial_Coupled(user,X);CHKERRQ(ierr);
+    }
     break;
   }
   if (view_draw) {ierr = VecView(X,PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr);}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


-Gautam.

On Wed, Jul 29, 2015 at 11:25 AM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
> > On Jul 29, 2015, at 12:58 PM, Gideon Simpson <gideon.simpson at gmail.com>
> wrote:
> >
> > That fixed it, thanks.  Given that I the nonzero pattern will not change
> throughout the solve, would it still be unreasonable to use this for larger
> problems?
>
>    Eventually it will kill you in the first time you assemble the matrix.
>
>   Barry
>
> >
> > -gideon
> >
> >> On Jul 29, 2015, at 1:52 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
> >>
> >>
> >>   To start, immediately after you have created the matrix do what it
> says call
> >>
> >>> MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE)
> >>
> >>  this will allow you to build your matrix and work fine for modest size
> problems. For larger problems (only when you have your code running and
> solving the problem you want) you need to add in more preallocation
> information. But to do it now would be premature optimization.
> >>
> >>   Barry
> >>
> >>
> >>
> >>> On Jul 29, 2015, at 11:51 AM, Gideon Simpson <gideon.simpson at gmail.com>
> wrote:
> >>>
> >>> That’s generating malloc errors:
> >>>
> >>> [0]PETSC ERROR: --------------------- Error Message
> --------------------------------------------------------------
> >>> [0]PETSC ERROR: Argument out of range
> >>> [0]PETSC ERROR: New nonzero at (10,0) caused a malloc
> >>> Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to
> turn off this check
> >>>
> >>> I suspect this is because DMCreateMatrix is picking a sparsity pattern
> which is not consistent with what I need.
> >>>
> >>> -gideon
> >>>
> >>>> On Jul 28, 2015, at 10:10 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
> >>>>
> >>>>
> >>>> DMCreateMatrix() ?
> >>>>
> >>>>
> >>>>> On Jul 28, 2015, at 9:02 PM, Gideon Simpson <
> gideon.simpson at gmail.com> wrote:
> >>>>>
> >>>>> I’m working with a DMComposite where I have a DMRedundant with 2
> parameters, and then a standard DMDACreate with some number of entires that
> I would like to have distributed.  For concreteness, suppose it is
> >>>>>
> >>>>> DMCompositeCreate(PETSC_COMM_WORLD, &packer);
> >>>>> DMRedundantCreate(PETSC_COMM_WORLD, 0, 2, &p_dm);
> >>>>> DMCompositeAddDM(packer,p_dm);
> >>>>> DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE, nx, 1, 1,
> NULL,&u_dm);
> >>>>> DMCompositeAddDM(packer,u_dm);
> >>>>> DMCreateGlobalVector(packer,&U);
> >>>>>
> >>>>> Now, I would like to construct a matrix for this problem that can be
> used for computing Jacobians in a nonlinear solve.  Is there a way to get
> the matrix size to layout in a “useful” way, in the sense that the first
> process, which owns the two degrees of freedom of p_dm and the first N0
> number of the rows of u_dm, controls the corresponding N0+2 rows of the
> matrix, and analgously for the second process has the next N1 rows of the
> u_dm vector, and has the next N1 rows of the matrix?
> >>>>>
> >>>>> -gideon
> >>>>>
> >>>>
> >>>
> >>
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150731/8bc59044/attachment-0001.html>


More information about the petsc-users mailing list