1 2 #include <petsc/private/matimpl.h> 3 4 /* Get new PetscMatStashSpace into the existing space */ 5 PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace *space) 6 { 7 PetscMatStashSpace a; 8 PetscErrorCode ierr; 9 10 PetscFunctionBegin; 11 if (!n) PetscFunctionReturn(0); 12 13 ierr = PetscMalloc(sizeof(struct _MatStashSpace),&a);CHKERRQ(ierr); 14 ierr = PetscMalloc3(n*bs2,&(a->space_head),n,&a->idx,n,&a->idy);CHKERRQ(ierr); 15 16 a->val = a->space_head; 17 a->local_remaining = n; 18 a->local_used = 0; 19 a->total_space_size = 0; 20 a->next = NULL; 21 22 if (*space) { 23 (*space)->next = a; 24 a->total_space_size = (*space)->total_space_size; 25 } 26 a->total_space_size += n; 27 *space = a; 28 PetscFunctionReturn(0); 29 } 30 31 /* Copy the values in space into arrays val, idx and idy. Then destroy space */ 32 PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy) 33 { 34 PetscMatStashSpace a; 35 PetscErrorCode ierr; 36 37 PetscFunctionBegin; 38 while ((*space)) { 39 a = (*space)->next; 40 ierr = PetscMemcpy(val,(*space)->val,((*space)->local_used*bs2)*sizeof(PetscScalar));CHKERRQ(ierr); 41 val += bs2*(*space)->local_used; 42 ierr = PetscMemcpy(idx,(*space)->idx,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 43 idx += (*space)->local_used; 44 ierr = PetscMemcpy(idy,(*space)->idy,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 45 idy += (*space)->local_used; 46 47 ierr = PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);CHKERRQ(ierr); 48 ierr = PetscFree(*space);CHKERRQ(ierr); 49 *space = a; 50 } 51 PetscFunctionReturn(0); 52 } 53 54 PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space) 55 { 56 PetscMatStashSpace a; 57 PetscErrorCode ierr; 58 59 PetscFunctionBegin; 60 while (*space) { 61 a = (*space)->next; 62 ierr = PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);CHKERRQ(ierr); 63 ierr = PetscFree((*space));CHKERRQ(ierr); 64 *space = a; 65 } 66 *space = NULL; 67 PetscFunctionReturn(0); 68 } 69