Date: 2025-03-29T05:58:39+00:00

Actual source code: matstashspace.c

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

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

      8:   PetscFunctionBegin;
      9:   if (!n) PetscFunctionReturn(PETSC_SUCCESS);

     11:   PetscCall(PetscMalloc(sizeof(struct _MatStashSpace), &a));
     12:   PetscCall(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:   PetscFunctionReturn(PETSC_SUCCESS);
     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:   PetscFunctionBegin;
     35:   while (*space) {
     36:     a = (*space)->next;
     37:     PetscCall(PetscArraycpy(val, (*space)->val, (*space)->local_used * bs2));
     38:     val += bs2 * (*space)->local_used;
     39:     PetscCall(PetscArraycpy(idx, (*space)->idx, (*space)->local_used));
     40:     idx += (*space)->local_used;
     41:     PetscCall(PetscArraycpy(idy, (*space)->idy, (*space)->local_used));
     42:     idy += (*space)->local_used;

     44:     PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy));
     45:     PetscCall(PetscFree(*space));
     46:     *space = a;
     47:   }
     48:   PetscFunctionReturn(PETSC_SUCCESS);
     49: }

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

     55:   PetscFunctionBegin;
     56:   while (*space) {
     57:     a = (*space)->next;
     58:     PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy));
     59:     PetscCall(PetscFree(*space));
     60:     *space = a;
     61:   }
     62:   *space = NULL;
     63:   PetscFunctionReturn(PETSC_SUCCESS);
     64: }