diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index fc1de8d89aabb432564e40d3420e04b57d80afcb..1423195786b8bb2ca4dd72bb98ff926ac1649870 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -762,17 +762,15 @@ namespace AMDiS { { FUNCNAME("PetscSolverFeti::createFetiKsp()"); - MSG("START A\n"); - // === Create FETI-DP solver object. === - FetiData &data = (!enableStokesMode ? fetiData : fetiDataInterface); - data.mat_lagrange = &mat_lagrange; - data.subSolver = subdomain; - data.ksp_schur_primal = &ksp_schur_primal; - localDofMap.createVec(data.tmp_vec_b, nGlobalOverallInterior); - lagrangeMap.createVec(data.tmp_vec_lagrange); - primalDofMap.createVec(data.tmp_vec_primal); + fetiData.mat_lagrange = &mat_lagrange; + fetiData.subSolver = subdomain; + fetiData.ksp_schur_primal = &ksp_schur_primal; + + localDofMap.createVec(fetiData.tmp_vec_b, nGlobalOverallInterior); + lagrangeMap.createVec(fetiData.tmp_vec_lagrange); + primalDofMap.createVec(fetiData.tmp_vec_primal); if (enableStokesMode == false) { MatCreateShell(mpiCommGlobal, @@ -783,34 +781,15 @@ namespace AMDiS { &fetiData, &mat_feti); MatShellSetOperation(mat_feti, MATOP_MULT, (void(*)(void))petscMultMatFeti); - } else { - MSG("TEST A0\n"); - - fetiDataInterface.mat_interior_interface = - getMatInteriorCoarseByComponent(2); - - MSG("TEST A1\n"); - - fetiDataInterface.mat_interface_interior = - getMatCoarseInteriorByComponent(2); - - MSG("TEST A2\n"); - - fetiDataInterface.mat_primal_interface = getMatCoarse(0, 1); - fetiDataInterface.mat_interface_primal = getMatCoarse(1, 0); - - MSG("TEST A3\n"); - + } else { MatCreateShell(mpiCommGlobal, interfaceDofMap.getRankDofs() + lagrangeMap.getRankDofs(), interfaceDofMap.getRankDofs() + lagrangeMap.getRankDofs(), interfaceDofMap.getOverallDofs() + lagrangeMap.getOverallDofs(), interfaceDofMap.getOverallDofs() + lagrangeMap.getOverallDofs(), - &fetiDataInterface, &mat_feti); + &fetiData, &mat_feti); MatShellSetOperation(mat_feti, MATOP_MULT, (void(*)(void))petscMultMatFetiInterface); - - MSG("TEST A2\n"); } KSPCreate(mpiCommGlobal, &ksp_feti); @@ -921,8 +900,6 @@ namespace AMDiS { default: break; } - - MSG("END A\n"); } @@ -1476,8 +1453,8 @@ namespace AMDiS { MatGetVecs(mat_lagrange, PETSC_NULL, &vecRhsLagrange); MatGetVecs(mat_lagrange, PETSC_NULL, &vecSolLagrange); - vecRhsInterface = getVecRhsCoarseByComponent(2); - vecSolInterface = getVecSolCoarseByComponent(2); + interfaceDofMap.createVec(vecRhsInterface); + interfaceDofMap.createVec(vecSolInterface); Vec vecRhsArray[2] = {vecRhsInterface, vecRhsLagrange}; VecCreateNest(mpiCommGlobal, 2, PETSC_NULL, vecRhsArray, &vecRhs); diff --git a/AMDiS/src/parallel/PetscSolverFeti.h b/AMDiS/src/parallel/PetscSolverFeti.h index b6c4988c3925047ec1130c4e09b7a17eda19c0e2..a8958f78f58eb63a5aeab0e9ab95b2c3f758b8ef 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.h +++ b/AMDiS/src/parallel/PetscSolverFeti.h @@ -262,9 +262,6 @@ namespace AMDiS { /// Data for MatMult operation in matrix \ref mat_feti FetiData fetiData; - /// Data for MatMult operation in matrix \ref mat_feti when using Stokes mode - FetiDataInterface fetiDataInterface; - /// Defines which preconditioner should be used to solve the reduced /// FETI-DP system. FetiPreconditioner fetiPreconditioner; diff --git a/AMDiS/src/parallel/PetscSolverFetiOperators.cc b/AMDiS/src/parallel/PetscSolverFetiOperators.cc index b629d2bee45195ff76a2601372a80df47206f054..83ec0837198c472953d945576f691e36d8e745b7 100644 --- a/AMDiS/src/parallel/PetscSolverFetiOperators.cc +++ b/AMDiS/src/parallel/PetscSolverFetiOperators.cc @@ -87,11 +87,17 @@ namespace AMDiS { double wtime = MPI::Wtime(); + Vec x_interface, x_lagrange, y_interface, y_lagrange; + VecNestGetSubVec(x, 0, &x_interface); + VecNestGetSubVec(x, 1, &x_lagrange); + VecNestGetSubVec(y, 0, &y_interface); + VecNestGetSubVec(y, 1, &y_lagrange); + void *ctx; MatShellGetContext(mat, &ctx); - FetiDataInterface* data = static_cast<FetiDataInterface*>(ctx); + FetiData* data = static_cast<FetiData*>(ctx); - MatMultTranspose(*(data->mat_lagrange), x, data->tmp_vec_b); + MatMultTranspose(*(data->mat_lagrange), x_lagrange, data->tmp_vec_b); double wtime01 = MPI::Wtime(); data->subSolver->solveGlobal(data->tmp_vec_b, data->tmp_vec_b); @@ -114,9 +120,9 @@ namespace AMDiS { data->subSolver->solveGlobal(data->tmp_vec_b, data->tmp_vec_b); FetiTimings::fetiSolve01 += (MPI::Wtime() - wtime01); - MatMult(*(data->mat_lagrange), data->tmp_vec_b, y); + MatMult(*(data->mat_lagrange), data->tmp_vec_b, y_lagrange); - VecAXPBY(y, 1.0, 1.0, data->tmp_vec_lagrange); + VecAXPBY(y_lagrange, 1.0, 1.0, data->tmp_vec_lagrange); FetiTimings::fetiSolve += (MPI::Wtime() - wtime); diff --git a/AMDiS/src/parallel/PetscSolverFetiStructs.h b/AMDiS/src/parallel/PetscSolverFetiStructs.h index 086b3c795932ae1c5bcab22966c1e3b5191a67d7..340f7c13a0e33d86c3fa9e16c98e9c48611ab803 100644 --- a/AMDiS/src/parallel/PetscSolverFetiStructs.h +++ b/AMDiS/src/parallel/PetscSolverFetiStructs.h @@ -72,15 +72,6 @@ namespace AMDiS { }; - /// Extends the FETI-DP data set with interface variables (thus is used when - /// Stokes mode is enabled). - struct FetiDataInterface : FetiData { - Mat mat_interior_interface, mat_interface_interior; - - Mat mat_primal_interface, mat_interface_primal; - }; - - struct FetiDirichletPreconData { /// Matrix of scaled Lagrange variables. Mat *mat_lagrange_scaled;