int main(int argc,char **args) { Mat A,B,Y; /*input : the three imput matrix */ Mat P; /* P=QR factorization*/ PetscViewer fd1,fd2; char file[4][PETSC_MAX_PATH_LEN]; //Mat C; /*C=B*Y*/ PetscInt m,n; /*size of matrix C;*/ Mat E,X; /*lhs and rhs of the linear equations;*/ Vec b,x; /*column vector of rhs;*/ KSP ksp; /* linear solver context */ PetscErrorCode ierr; PetscInt i,its; /*iteration numbers of KSP*/ PetscBool flg; m=10; n=4; PetscInitialize(&argc,&args,(char*)0,help); ierr = PetscOptionsGetString(NULL,"-fa",file[0],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix A!\n");} ierr = PetscOptionsGetString(NULL,"-fb",file[1],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix B!\n");} ierr = PetscOptionsGetString(NULL,"-fy",file[2],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix Y!\n");} ierr = PetscOptionsGetString(NULL,"-fp",file[3],PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if(!flg){SETERRQ(PETSC_COMM_WORLD,1,"Please provide matrix P!\n");} /*Load the matrices*/ ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&fd1); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&fd2); ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); ierr = MatSetFromOptions(B);CHKERRQ(ierr); ierr = MatLoad(A,fd1);CHKERRQ(ierr); ierr = MatLoad(B,fd2);CHKERRQ(ierr); readmm(file[2], &Y); readmm(file[3], &P); ierr = PetscPrintf(PETSC_COMM_SELF,"Read file completes.\n");CHKERRQ(ierr); #if(cxDEBUG==1) ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = MatView(B,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); #endif Mat Q1; ierr = MatCreate(PETSC_COMM_WORLD, &Q1); CHKERRQ(ierr); ierr = MatSetFromOptions(Q1); CHKERRQ(ierr); ierr = MatMatMult(B,Y,MAT_INITIAL_MATRIX,PETSC_DEFAULT, &Q1);CHKERRQ(ierr); #if(cxDEBUG==1) ierr = PetscPrintf(PETSC_COMM_SELF,"Cao this is BY.\n");CHKERRQ(ierr); ierr = MatView(Q1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); #endif getQ1(&Q1); #if(cxDEBUG==1) ierr = PetscPrintf(PETSC_COMM_SELF,"\nTHIS IS Q1.\n");CHKERRQ(ierr); ierr = MatView(Q1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); #endif Mat SBP; ierr = MatMatTransposeMult(Q1,Q1,MAT_INITIAL_MATRIX, PETSC_DEFAULT ,&SBP); ierr = MatAssemblyBegin(SBP,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(SBP,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatShift(SBP,-1); ierr = MatScale(SBP,-1); #if(cxDEBUG==1) ierr = PetscPrintf(PETSC_COMM_SELF,"\nTHIS IS SBP = Q1*Q1'.\n");CHKERRQ(ierr); ierr = MatView(SBP,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"\nBelows is act_P.\n");CHKERRQ(ierr); ierr = MatView(P ,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); #endif ierr = MatMatMult(A,Y,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&E);CHKERRQ(ierr); ierr = MatMatMult(SBP,E,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&E);CHKERRQ(ierr); #if(cxDEBUG==1) ierr = PetscPrintf(PETSC_COMM_SELF,"\nBelows is PAY.\n");CHKERRQ(ierr); ierr = MatView(E,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); #endif ierr = MatAssemblyBegin(E,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(E,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); //ierr = MatGetSize(E,&m,&n);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&X);CHKERRQ(ierr); ierr = MatSetSizes(X,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr); ierr = MatSetFromOptions(X);CHKERRQ(ierr); ierr = MatSetUp(X); CHKERRQ(ierr); ierr = MatZeroEntries(X);CHKERRQ(ierr); ierr = MatAssemblyBegin(X,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(X,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); // PetscInt ix[m]; // for(i=0;i<m;i++){ // ix[i] = i; // } VecCreate(PETSC_COMM_WORLD,&b); VecSetSizes(b,PETSC_DECIDE,m); VecSetFromOptions(b); VecCreate(PETSC_COMM_WORLD,&x); VecSetSizes(x,PETSC_DECIDE,m); VecSetFromOptions(x); //#if(cxDEBUG==1) ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check A\n");CHKERRQ(ierr); ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check SBP\n");CHKERRQ(ierr); ierr = MatView(SBP,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"\nBEFORE CG Check E\n");CHKERRQ(ierr); ierr = MatView(E,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); //#endif for(i=0;i<n;i++){ MatGetColumnVector(E,b,i); PetscPrintf(PETSC_COMM_WORLD,"the rhs\n"); VecView(b,PETSC_VIEWER_STDOUT_WORLD); KSPCreate(PETSC_COMM_WORLD,&ksp); KSPSetOperators(ksp,A,SBP); KSPSetNormType(ksp,KSP_NORM_UNPRECONDITIONED); KSPSetCheckNormIteration(ksp,-1); KSPSetTolerances(ksp,1.0e-06,PETSC_DEFAULT,PETSC_DEFAULT,400); KSPSetInitialGuessNonzero(ksp,PETSC_FALSE); KSPSetFromOptions(ksp); KSPSolve(ksp,b,x); KSPGetIterationNumber(ksp,&its); PetscPrintf(PETSC_COMM_WORLD,"%d-th equation,iteration=%D\n",i,its); VecView(x,PETSC_VIEWER_STDOUT_WORLD); } return 0; }
PETSC_EXTERN void PETSC_STDCALL kspsetchecknormiteration_(KSP ksp,PetscInt *it, int *__ierr ){ *__ierr = KSPSetCheckNormIteration( (KSP)PetscToPointer((ksp) ),*it); }