Stefano Zampini avatar Stefano Zampini committed b120a5c

PCBDDC: Optimal allocation in PCBDDCGetPrinalVerticesLocalIdx

Comments (0)

Files changed (1)

src/ksp/pc/impls/bddc/bddcprivate.c

   vertices = 0;
   if (pcbddc->ConstraintMatrix) {
     ierr = MatGetSize(pcbddc->ConstraintMatrix,&local_primal_size,&i);CHKERRQ(ierr);
-    ierr = PetscMalloc(local_primal_size*sizeof(PetscInt),&vertices);CHKERRQ(ierr);
+    for (i=0;i<local_primal_size;i++) {
+      ierr = MatGetRow(pcbddc->ConstraintMatrix,i,&size_of_constraint,NULL,NULL);CHKERRQ(ierr);
+      if (size_of_constraint == 1) n++;
+      ierr = MatRestoreRow(pcbddc->ConstraintMatrix,i,&size_of_constraint,NULL,NULL);CHKERRQ(ierr);
+    }
+    ierr = PetscMalloc(n*sizeof(PetscInt),&vertices);CHKERRQ(ierr);
+    n = 0;
     for (i=0;i<local_primal_size;i++) {
       ierr = MatGetRow(pcbddc->ConstraintMatrix,i,&size_of_constraint,(const PetscInt**)&row_cmat_indices,NULL);CHKERRQ(ierr);
       if (size_of_constraint == 1) {
         vertices[n++]=row_cmat_indices[0];
       }
-    ierr = MatRestoreRow(pcbddc->ConstraintMatrix,i,&size_of_constraint,(const PetscInt**)&row_cmat_indices,NULL);CHKERRQ(ierr);
+      ierr = MatRestoreRow(pcbddc->ConstraintMatrix,i,&size_of_constraint,(const PetscInt**)&row_cmat_indices,NULL);CHKERRQ(ierr);
     }
   }
   *n_vertices = n;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.