Actual source code: matstashspace.c


  2: #include <petsc/private/matimpl.h>

  4: /* Get new PetscMatStashSpace into the existing space */
  5: PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace *space)
  6: {
  7:   PetscMatStashSpace a;

  9:   if (!n) return 0;

 11:   PetscMalloc(sizeof(struct _MatStashSpace),&a);
 12:   PetscMalloc3(n*bs2,&(a->space_head),n,&a->idx,n,&a->idy);

 14:   a->val              = a->space_head;
 15:   a->local_remaining  = n;
 16:   a->local_used       = 0;
 17:   a->total_space_size = 0;
 18:   a->next             = NULL;

 20:   if (*space) {
 21:     (*space)->next      = a;
 22:     a->total_space_size = (*space)->total_space_size;
 23:   }
 24:   a->total_space_size += n;
 25:   *space               = a;
 26:   return 0;
 27: }

 29: /* Copy the values in space into arrays val, idx and idy. Then destroy space */
 30: PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy)
 31: {
 32:   PetscMatStashSpace a;

 34:   while ((*space)) {
 35:     a    = (*space)->next;
 36:     PetscArraycpy(val,(*space)->val,(*space)->local_used*bs2);
 37:     val += bs2*(*space)->local_used;
 38:     PetscArraycpy(idx,(*space)->idx,(*space)->local_used);
 39:     idx += (*space)->local_used;
 40:     PetscArraycpy(idy,(*space)->idy,(*space)->local_used);
 41:     idy += (*space)->local_used;

 43:     PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);
 44:     PetscFree(*space);
 45:     *space = a;
 46:   }
 47:   return 0;
 48: }

 50: PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space)
 51: {
 52:   PetscMatStashSpace a;

 54:   while (*space) {
 55:     a      = (*space)->next;
 56:     PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);
 57:     PetscFree((*space));
 58:     *space = a;
 59:   }
 60:   *space = NULL;
 61:   return 0;
 62: }