static PetscErrorCode MatWrapML_SeqAIJ(ML_Operator *mlmat,MatReuse reuse,Mat *newmat) { struct ML_CSR_MSRdata *matdata = (struct ML_CSR_MSRdata *)mlmat->data; PetscErrorCode ierr; PetscInt m=mlmat->outvec_leng,n=mlmat->invec_leng,*nnz = PETSC_NULL,nz_max; PetscInt *ml_cols=matdata->columns,*ml_rowptr=matdata->rowptr,*aj,i,j,k; PetscScalar *ml_vals=matdata->values,*aa; PetscFunctionBegin; if (!mlmat->getrow) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"mlmat->getrow = NULL"); if (m != n){ /* ML Pmat and Rmat are in CSR format. Pass array pointers into SeqAIJ matrix */ if (reuse){ Mat_SeqAIJ *aij= (Mat_SeqAIJ*)(*newmat)->data; aij->i = ml_rowptr; aij->j = ml_cols; aij->a = ml_vals; } else { /* sort ml_cols and ml_vals */ ierr = PetscMalloc((m+1)*sizeof(PetscInt),&nnz); for (i=0; i<m; i++) { nnz[i] = ml_rowptr[i+1] - ml_rowptr[i]; } aj = ml_cols; aa = ml_vals; for (i=0; i<m; i++){ ierr = PetscSortIntWithScalarArray(nnz[i],aj,aa);CHKERRQ(ierr); aj += nnz[i]; aa += nnz[i]; } ierr = MatCreateSeqAIJWithArrays(PETSC_COMM_SELF,m,n,ml_rowptr,ml_cols,ml_vals,newmat);CHKERRQ(ierr); ierr = PetscFree(nnz);CHKERRQ(ierr); } PetscFunctionReturn(0); } /* ML Amat is in MSR format. Copy its data into SeqAIJ matrix */ if (reuse) { for (nz_max=0,i=0; i<m; i++) nz_max = PetscMax(nz_max,ml_cols[i+1] - ml_cols[i] + 1); } else { ierr = MatCreate(PETSC_COMM_SELF,newmat);CHKERRQ(ierr); ierr = MatSetSizes(*newmat,m,n,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); ierr = MatSetType(*newmat,MATSEQAIJ);CHKERRQ(ierr); ierr = PetscMalloc((m+1)*sizeof(PetscInt),&nnz); nz_max = 1; for (i=0; i<m; i++) { nnz[i] = ml_cols[i+1] - ml_cols[i] + 1; if (nnz[i] > nz_max) nz_max = nnz[i]; } ierr = MatSeqAIJSetPreallocation(*newmat,0,nnz);CHKERRQ(ierr); } ierr = PetscMalloc2(nz_max,PetscScalar,&aa,nz_max,PetscInt,&aj);CHKERRQ(ierr); for (i=0; i<m; i++) { PetscInt ncols; k = 0; /* diagonal entry */ aj[k] = i; aa[k++] = ml_vals[i]; /* off diagonal entries */ for (j=ml_cols[i]; j<ml_cols[i+1]; j++){ aj[k] = ml_cols[j]; aa[k++] = ml_vals[j]; } ncols = ml_cols[i+1] - ml_cols[i] + 1; /* sort aj and aa */ ierr = PetscSortIntWithScalarArray(ncols,aj,aa);CHKERRQ(ierr); ierr = MatSetValues(*newmat,1,&i,ncols,aj,aa,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = PetscFree2(aa,aj);CHKERRQ(ierr); ierr = PetscFree(nnz);CHKERRQ(ierr); PetscFunctionReturn(0); }
void PETSC_STDCALL petscsortintwithscalararray_(PetscInt *n,PetscInt i[],PetscScalar Ii[], int *__ierr ){ *__ierr = PetscSortIntWithScalarArray(*n,i,Ii); }