diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index 007056ef4bfa17405a7201d50909dc318b834767..eb1d365a1d5f7a7b741f1df80f98cf3676dfc7eb 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -2036,7 +2036,29 @@ namespace AMDiS { VecAXPY(tmp_primal0, -1.0, tmp_primal1); } - KSPSolve(ksp_schur_primal, tmp_primal0, tmp_primal0); + if (augmentedLagrange == false) { + KSPSolve(ksp_schur_primal, tmp_primal0, tmp_primal0); + } else { + Vec tmp_mu; + MatGetVecs(mat_augmented_lagrange, PETSC_NULL, &tmp_mu); + + MatMult(mat_lagrange, tmp_b1, tmp_lagrange); + MatMult(mat_augmented_lagrange, tmp_lagrange, tmp_mu); + VecScale(tmp_mu, -1.0); + + Vec vec_array[2] = {tmp_primal0, tmp_mu}; + Vec vec_nest; + VecCreateNest(PETSC_COMM_WORLD, 2, PETSC_NULL, vec_array, &vec_nest); + + KSPSolve(ksp_schur_primal, vec_nest, vec_nest); + + MatMultTranspose(mat_augmented_lagrange, tmp_mu, tmp_lagrange); + MatMultTranspose(mat_lagrange, tmp_lagrange, tmp_b1); + VecAXPY(tmp_b0, -1.0, tmp_b1); + + VecDestroy(&tmp_mu); + VecDestroy(&vec_nest); + } // === Solve for u_b. ===