ocramz / petsc-hs

Haskell bindings for PETSc and SLEPc
GNU General Public License v3.0
20 stars 4 forks source link

fix vecRestoreArray #4

Closed ocramz closed 8 years ago

ocramz commented 9 years ago

vecGetArray in Raw/PutGet works fine, but its dual vecRestoreArray does not seem to update the C-side Vec.

This behavior can be observed by running t3, t4 or t5 in TestMain2.hs

ocramz commented 8 years ago

FIXED:

vecGetVector :: Vec -> IO (V.Vector PetscScalar_)
vecGetVector v = do
  p <- vecGetArrayPtr v
  pf <- newForeignPtr_ p
  V.freeze (VM.unsafeFromForeignPtr0 pf len)
   where
     len = vecSize v

vecRestoreVector :: Vec -> V.Vector PetscScalar_ -> IO ()
vecRestoreVector v w = do
  p <- vecGetArrayPtr v
  pf <- newForeignPtr_ p
  V.copy (VM.unsafeFromForeignPtr0 pf len) w
  vecRestoreArrayPtr v p
    where
     len = vecSize v

and

withVecGetVectorOverwrite ::
  Vec ->
  (V.Vector PetscScalar_ -> V.Vector PetscScalar_) ->
  IO ()
withVecGetVectorOverwrite v modify = do
  x <- vecGetVector v
  let y = modify x
  vecRestoreVector v y