This makes sense- thanks! On Wed, Sep 26, 2012 at 8:32 AM, Matthew Knepley <knepley at gmail.com> wrote: > On Wed, Sep 26, 2012 at 10:18 AM, Chris Eldred <chris.eldred at gmail.com> > wrote: >> >> I have a vector (created from a PetscSection) that holds a set of >> values distributed over various points in my mesh. It represents >> multiple fields with different dofs. I was wondering which approach >> for modifying (or just getting) the values for a given field from the >> vector was preferred? The vector is created using >> DMCreateLocal/GlobalVector. >> >> Approach 1 (get the underlying array, find the points using >> PetscSection, do whatever, restore the array) > > > Yes, this is the way I work. However, it can be simpler, if you are making > more > structured changes, to use > > call DMComplexVecGet/SetClosure() > >> >> call VecGetArrayF90( varvector , varptr , ierr) >> CHKERRQ(ierr) >> call DMComplexGetDepthStratum(model_mesh, vardepth , pStart, pEnd, ierr) >> CHKERRQ(ierr) > > > Here if you want the entire section its simpler to use > > call PetscSectionGetChart(varsection, pStart, pEnd, ierr) > >> >> do p=pStart,pEnd-1 >> call PetscSectionGetFieldOffset( varsection, p, varnum , poffset, ierr) >> CHKERRQ(ierr) >> call PetscSectionGetFieldDof( varsection, p, varnum , ndof, ierr) >> CHKERRQ(ierr) >> do something with the values (modify them, read them, etc.) >> enddo >> call VecRestoreArrayF90( varvector , varptr , ierr) >> CHKERRQ(ierr) >> >> Approach 2 (find the points using PetscSection, get the values using >> VecGetValues, do whatever, set the values using VecSetValues (if >> needed), call VecAssemblyBegin/End ) > > > Definitely do not do this. Its cumbersome and adds nothing. > >> >> call DMComplexGetDepthStratum(model_mesh, vardepth , pStart, pEnd, ierr) >> CHKERRQ(ierr) >> do p=pStart,pEnd-1 >> call PetscSectionGetFieldOffset( varsection, p, varnum , poffset, ierr) >> CHKERRQ(ierr) >> call PetscSectionGetFieldDof( varsection, p, varnum , ndof, ierr) >> CHKERRQ(ierr) >> add points to a list (points are a contiguos list so its easy)- ie for >> each dof add poffset+dof to the list >> enddo >> call VecGetValues( varvector, npts, ptslist, vals, ierr) >> CHKERRQ(ierr) >> do something with the values (modify them, read them, etc.) >> call VecSetValues( varvector, npts, ptslist, vals, INSERT_MODE, ierr) >> !if need to >> CHKERRQ(ierr) >> call VecAssemblyBegin/End (if i set values) >> CHKERRQ(ierr) >> >> Instead of VecAssemblyBegin/End, should I be using the DMGlobaltoLocal >> / DMLocaltoGlobal routines? > > > With this setup there should never be a need for VecAssembly. Just use > GlobalToLocal or LocalToGlobal for communication. > >> >> On a related note, should I be calling VecAssemblyBegin/End (or >> DMGlobaltoLocal, etc.) when I modify the values in the array using >> Approach 1? > > > No need, since anything you can modify in the array is process local. > >> >> Is there another, third approach I should be using? >> >> -Chris >> -- >> Chris Eldred >> DOE Computational Science Graduate Fellow >> Graduate Student, Atmospheric Science, Colorado State University >> B.S. Applied Computational Physics, Carnegie Mellon University, 2009 >> chris.eldred at gmail.com > > > > > -- > 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
-- Chris Eldred DOE Computational Science Graduate Fellow Graduate Student, Atmospheric Science, Colorado State University B.S. Applied Computational Physics, Carnegie Mellon University, 2009 chris.eldred at gmail.com
