initial values of matrix and vector

Yixun Liu enjoywm at cs.wm.edu
Tue Feb 24 16:24:32 CST 2009


How about Mat or Vec Duplicate?

  VecDuplicate(v1, &v2);

v2  will be set to be zero automatically?






Matthew Knepley wrote:
> On Tue, Feb 24, 2009 at 3:47 PM, Yixun Liu <enjoywm at cs.wm.edu
> <mailto:enjoywm at cs.wm.edu>> wrote
> You mean I have no need to call
>
>     VecSet(v, 0.0); and
>     MatZeroEntries(mat);
>
>     after I set the size for the vector or matrix?
>
>
> Yes, do not call them.
>
>   Matt
>  
>
>     Barry Smith wrote:
>     >
>     > Jed is right. Our intention is to have the vector initialized to
>     zero
>     > at creation time IF we allocate the array space.
>     > Tracking down a not properly initialized vector is the type of bug
>     > that takes forever to find; plus I wanted consistency
>     > between vectors and matrix. Users SHOULD NOT call a MatZeroEntries()
>     > initially on matrices (since it screws up
>     > preallocation) so we should not have them do it on vectors
>     either for
>     > consistency.
>     >
>     > Barry
>     >
>     > On Feb 24, 2009, at 10:57 AM, Jed Brown wrote:
>     >
>     >> On Tue 2009-02-24 06:53, Matthew Knepley wrote:
>     >>> On Mon, Feb 23, 2009 at 8:26 PM, Barry Smith
>     <bsmith at mcs.anl.gov <mailto:bsmith at mcs.anl.gov>>
>     >>> wrote:
>     >>>
>     >>>
>     >>> Vectors have all entries equal to zero. Dense matrices have
>     all entries
>     >>> equal to zero. Sparse matrices have no entries (logically this is
>     >>> the same
>     >>> as entries equal to zero).
>     >>>
>     >>>
>     >>> We do not automatically zero the entires upon allocation. You have
>     >>> to call
>     >>> VecZeroEntries() or VecSet()
>     >>> to initialize the vector.
>     >>
>     >> That's what I would have expected, but Barry is correct, at
>     least for
>     >> the usual types. See, for instance
>     >>
>     >> PetscErrorCode PETSCVEC_DLLEXPORT VecCreate_Seq(Vec V)
>     >> {
>     >> Vec_Seq *s;
>     >> PetscScalar *array;
>     >> PetscErrorCode ierr;
>     >> PetscInt n = PetscMax(V->map->n,V->map->N);
>     >> PetscMPIInt size;
>     >>
>     >> PetscFunctionBegin;
>     >> ierr = MPI_Comm_size(((PetscObject)V)->comm,&size);CHKERRQ(ierr);
>     >> if (size > 1) {
>     >> SETERRQ(PETSC_ERR_ARG_WRONG,"Cannot create VECSEQ on more than one
>     >> process");
>     >> }
>     >> ierr = PetscMalloc(n*sizeof(PetscScalar),&array);CHKERRQ(ierr);
>     >> ierr = PetscLogObjectMemory(V,
>     n*sizeof(PetscScalar));CHKERRQ(ierr);
>     >> ierr = PetscMemzero(array,n*sizeof(PetscScalar));CHKERRQ(ierr);
>     >> ierr = VecCreate_Seq_Private(V,array);CHKERRQ(ierr);
>     >> s = (Vec_Seq*)V->data;
>     >> s->array_allocated = array;
>     >> PetscFunctionReturn(0);
>     >> }
>     >>
>     >>
>     >>
>     >> In well-structured code, the cost of zeroing the vector is tiny
>     and the
>     >> effort to track down uninitialized bugs is significant enough
>     that this
>     >> seems like a sane default.
>     >>
>     >> Jed
>     >
>
>
>
>
> -- 
> 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



More information about the petsc-users mailing list