PETSC_EXTERN void PETSC_STDCALL pcbddcmatfetidpgetsolution_(Mat fetidp_mat,Vec fetidp_flux_sol,Vec standard_sol, int *__ierr ){ *__ierr = PCBDDCMatFETIDPGetSolution( (Mat)PetscToPointer((fetidp_mat) ), (Vec)PetscToPointer((fetidp_flux_sol) ), (Vec)PetscToPointer((standard_sol) )); }
int main(int argc,char **args) { PetscErrorCode ierr; DomainData dd; PetscReal norm,maxeig,mineig; PetscScalar scalar_value; PetscInt ndofs,its; Mat A =0,F=0; KSP KSPwithBDDC =0,KSPwithFETIDP=0; Vec fetidp_solution_all=0,bddc_solution=0,bddc_rhs=0; Vec exact_solution =0,fetidp_solution=0,fetidp_rhs=0; /* Init PETSc */ ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; /* Initialize DomainData */ ierr = InitializeDomainData(&dd);CHKERRQ(ierr); /* Decompose domain */ ierr = DomainDecomposition(&dd);CHKERRQ(ierr); #if DEBUG printf("Subdomain data\n"); printf("IPS : %d %d %d\n",dd.ipx,dd.ipy,dd.ipz); printf("NEG : %d %d %d\n",dd.nex,dd.ney,dd.nez); printf("NEL : %d %d %d\n",dd.nex_l,dd.ney_l,dd.nez_l); printf("LDO : %d %d %d\n",dd.xm_l,dd.ym_l,dd.zm_l); printf("SIZES : %d %d %d\n",dd.xm,dd.ym,dd.zm); printf("STARTS: %d %d %d\n",dd.startx,dd.starty,dd.startz); #endif /* assemble global matrix */ ierr = ComputeMatrix(dd,&A);CHKERRQ(ierr); /* get work vectors */ ierr = MatCreateVecs(A,&bddc_solution,NULL);CHKERRQ(ierr); ierr = VecDuplicate(bddc_solution,&bddc_rhs);CHKERRQ(ierr); ierr = VecDuplicate(bddc_solution,&fetidp_solution_all);CHKERRQ(ierr); ierr = VecDuplicate(bddc_solution,&exact_solution);CHKERRQ(ierr); /* create and customize KSP/PC for BDDC */ ierr = ComputeKSPBDDC(dd,A,&KSPwithBDDC);CHKERRQ(ierr); /* create KSP/PC for FETIDP */ ierr = ComputeKSPFETIDP(dd,KSPwithBDDC,&KSPwithFETIDP);CHKERRQ(ierr); /* create random exact solution */ ierr = VecSetRandom(exact_solution,NULL);CHKERRQ(ierr); ierr = VecShift(exact_solution,-0.5);CHKERRQ(ierr); ierr = VecScale(exact_solution,100.0);CHKERRQ(ierr); ierr = VecGetSize(exact_solution,&ndofs);CHKERRQ(ierr); if (dd.pure_neumann) { ierr = VecSum(exact_solution,&scalar_value);CHKERRQ(ierr); scalar_value = -scalar_value/(PetscScalar)ndofs; ierr = VecShift(exact_solution,scalar_value);CHKERRQ(ierr); } /* assemble BDDC rhs */ ierr = MatMult(A,exact_solution,bddc_rhs);CHKERRQ(ierr); /* test ksp with BDDC */ ierr = KSPSolve(KSPwithBDDC,bddc_rhs,bddc_solution);CHKERRQ(ierr); ierr = KSPGetIterationNumber(KSPwithBDDC,&its);CHKERRQ(ierr); ierr = KSPComputeExtremeSingularValues(KSPwithBDDC,&maxeig,&mineig);CHKERRQ(ierr); if (dd.pure_neumann) { ierr = VecSum(bddc_solution,&scalar_value);CHKERRQ(ierr); scalar_value = -scalar_value/(PetscScalar)ndofs; ierr = VecShift(bddc_solution,scalar_value);CHKERRQ(ierr); } /* check exact_solution and BDDC solultion */ ierr = VecAXPY(bddc_solution,-1.0,exact_solution);CHKERRQ(ierr); ierr = VecNorm(bddc_solution,NORM_INFINITY,&norm);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"---------------------BDDC stats-------------------------------\n");CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Number of degrees of freedom : %8D \n",ndofs);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Number of iterations : %8D \n",its);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Eigenvalues preconditioned operator : %1.2e %1.2e\n",(double)mineig,(double)maxeig);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Error betweeen exact and computed solution : %1.2e\n",(double)norm);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"--------------------------------------------------------------\n");CHKERRQ(ierr); /* assemble fetidp rhs on the space of Lagrange multipliers */ ierr = KSPGetOperators(KSPwithFETIDP,&F,NULL);CHKERRQ(ierr); ierr = MatCreateVecs(F,&fetidp_solution,&fetidp_rhs);CHKERRQ(ierr); ierr = PCBDDCMatFETIDPGetRHS(F,bddc_rhs,fetidp_rhs);CHKERRQ(ierr); ierr = VecSet(fetidp_solution,0.0);CHKERRQ(ierr); /* test ksp with FETIDP */ ierr = KSPSolve(KSPwithFETIDP,fetidp_rhs,fetidp_solution);CHKERRQ(ierr); ierr = KSPGetIterationNumber(KSPwithFETIDP,&its);CHKERRQ(ierr); ierr = KSPComputeExtremeSingularValues(KSPwithFETIDP,&maxeig,&mineig);CHKERRQ(ierr); /* assemble fetidp solution on physical domain */ ierr = PCBDDCMatFETIDPGetSolution(F,fetidp_solution,fetidp_solution_all);CHKERRQ(ierr); /* check FETIDP sol */ if (dd.pure_neumann) { ierr = VecSum(fetidp_solution_all,&scalar_value);CHKERRQ(ierr); scalar_value = -scalar_value/(PetscScalar)ndofs; ierr = VecShift(fetidp_solution_all,scalar_value);CHKERRQ(ierr); } ierr = VecAXPY(fetidp_solution_all,-1.0,exact_solution);CHKERRQ(ierr); ierr = VecNorm(fetidp_solution_all,NORM_INFINITY,&norm);CHKERRQ(ierr); ierr = VecGetSize(fetidp_solution,&ndofs);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"------------------FETI-DP stats-------------------------------\n");CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Number of degrees of freedom : %8D \n",ndofs);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Number of iterations : %8D \n",its);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Eigenvalues preconditioned operator : %1.2e %1.2e\n",(double)mineig,(double)maxeig);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"Error betweeen exact and computed solution : %1.2e\n",(double)norm);CHKERRQ(ierr); ierr = PetscPrintf(dd.gcomm,"--------------------------------------------------------------\n");CHKERRQ(ierr); /* Free workspace */ ierr = VecDestroy(&exact_solution);CHKERRQ(ierr); ierr = VecDestroy(&bddc_solution);CHKERRQ(ierr); ierr = VecDestroy(&fetidp_solution);CHKERRQ(ierr); ierr = VecDestroy(&fetidp_solution_all);CHKERRQ(ierr); ierr = VecDestroy(&bddc_rhs);CHKERRQ(ierr); ierr = VecDestroy(&fetidp_rhs);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = KSPDestroy(&KSPwithBDDC);CHKERRQ(ierr); ierr = KSPDestroy(&KSPwithFETIDP);CHKERRQ(ierr); /* Quit PETSc */ ierr = PetscFinalize(); return ierr; }