static char help[] = "Tests MatCreateDenseCUDA(), MatDenseCUDAPlaceArray(), MatDenseCUDAReplaceArray(), MatDenseCUDAResetArray()\n"; #include static PetscErrorCode MatMult_S(Mat S,Vec x,Vec y) { Mat A; PetscFunctionBeginUser; PetscCall(MatShellGetContext(S,&A)); PetscCall(MatMult(A,x,y)); PetscFunctionReturn(0); } static PetscBool test_cusparse_transgen = PETSC_FALSE; static PetscErrorCode MatMultTranspose_S(Mat S,Vec x,Vec y) { Mat A; PetscFunctionBeginUser; PetscCall(MatShellGetContext(S,&A)); PetscCall(MatMultTranspose(A,x,y)); /* alternate transgen true and false to test code logic */ PetscCall(MatSetOption(A,MAT_FORM_EXPLICIT_TRANSPOSE,test_cusparse_transgen)); test_cusparse_transgen = (PetscBool)!test_cusparse_transgen; PetscFunctionReturn(0); } int main(int argc,char **argv) { Mat A,B,C,S; Vec t,v; PetscScalar *vv,*aa; PetscInt n=30,k=6,l=0,i,Istart,Iend,nloc,bs,test=1; PetscBool flg,reset,use_shell = PETSC_FALSE; VecType vtype; PetscFunctionBeginUser; PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-k",&k,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-l",&l,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-test",&test,NULL)); PetscCall(PetscOptionsGetBool(NULL,NULL,"-use_shell",&use_shell,NULL)); PetscCheck(k >= 0,PETSC_COMM_WORLD,PETSC_ERR_USER,"k %" PetscInt_FMT " must be positive",k); PetscCheck(l >= 0,PETSC_COMM_WORLD,PETSC_ERR_USER,"l %" PetscInt_FMT " must be positive",l); PetscCheck(l <= k,PETSC_COMM_WORLD,PETSC_ERR_USER,"l %" PetscInt_FMT " must be smaller or equal than k %" PetscInt_FMT,l,k); /* sparse matrix */ PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n)); PetscCall(MatSetType(A,MATAIJCUSPARSE)); PetscCall(MatSetOptionsPrefix(A,"A_")); PetscCall(MatSetFromOptions(A)); PetscCall(MatSetUp(A)); /* test special case for SeqAIJCUSPARSE to generate explicit transpose (not default) */ PetscCall(MatSetOption(A,MAT_FORM_EXPLICIT_TRANSPOSE,PETSC_TRUE)); PetscCall(MatGetOwnershipRange(A,&Istart,&Iend)); for (i=Istart;i0) PetscCall(MatSetValue(A,i,i-1,-1.0,INSERT_VALUES)); if (i