[petsc-users] IS from DA by coordinates

Barry Smith bsmith at mcs.anl.gov
Wed Dec 15 13:26:18 CST 2010


  Ethan,

  I don't think there is any reason to create a new DA or call DAGetGlobalIndices().. Just call DAGetLocalToGlobalMappingBlock() on the original DA  Then 

for i in range(xs, xs+xl):
 for j in range(ys, ys+yl):
   for k in range(zs, zs+zl):
     if vecc_a[k,j,i,:] == whatever_coordinate:
      local_indices.append( convert i,j,k, to local numbering with something like (k-zs)*mx*my + (j-ys)*mx + ..
...

Now apply ISLocalToGlobalMappingApply to local_indices and you have a list of global indices depending on what you want you do with this beast you may need to scale by bs or 1/bs

   Barry


On Dec 15, 2010, at 1:09 PM, Ethan Coon wrote:

> Hi all,
> 
> Is there a cleaner way to create an IS to a global vector on a DA for a
> subset of nodes using a coordinate value than the following?  (Pardon my
> pseudo-code combo of python and c and imprecise arguments)  
> 
> // get the coordinates of the nodes
> DAGetCoordinateDA(da, dac)
> DAGetCoordinates(da, vecc)
> DAVecGetArray(dac, vecc, vecc_a)
> 
> // generate a one-dof da with no ghosts and the same parallel 
> // structure as the da
> DAGetOwnershipRanges(da, lx[], ly[], lz[])
> DACreate3D(comm, M,N,P,len(lx),len(ly),len(lz),1,0, lx[], ly[], \
>  lz[], da_one)
> 
> // get the global indices of the one-dof da, noting that because
> // we set the stencil size to zero, the local array of global 
> // indices is the same size as the local portion of the global array 
> // of coordinates
> DAGetCorners(xs, ys, zs, xl, yl, zl)
> DAGetGlobalIndices(da_one, xl*yl*zl, indices[])
> 
> // loop over the local array returned by 
> // DAGetGlobalIndices and the coordinates, 
> // comparing to the test
> global_block_indices = []
> for i in range(xs, xs+xl):
>  for j in range(ys, ys+yl):
>    for k in range(zs, zs+zl):
>      if vecc_a[k,j,i,:] == whatever_coordinate:
>        global_block_indices.append(indices[k,j,i])
> 
> 
> // make the IS
> ISCreateBlock(comm, ndofs, global_block_indices, coord_is)
> 
> // restore and destroy etc.
> 
> This just seems quite complicated with the construction of the one-dof
> da to get global indices of the block.  There might be a better way with
> ISLocalToGlobalMapping, but I wasn't sure how.  Any suggestions?
> 
> Thanks,
> 
> Ethan
> 
> 
> 
> 
> -- 
> -------------------------------------
> Ethan Coon
> Post-Doctoral Researcher
> Mathematical Modeling and Analysis
> Los Alamos National Laboratory
> 505-665-8289
> 
> http://www.ldeo.columbia.edu/~ecoon/
> -------------------------------------
> 



More information about the petsc-users mailing list