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) call VecGetArrayF90( varvector , varptr , ierr) CHKERRQ(ierr) 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) 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 ) 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? On a related note, should I be calling VecAssemblyBegin/End (or DMGlobaltoLocal, etc.) when I modify the values in the array using Approach 1? 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
