From 1f0eda53988a61d7cfaa35e05e6ec10fd22e279c Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Wed, 4 May 2011 12:49:54 +0000
Subject: [PATCH] Fixed problem in FETI-DP code for PDEs with multiple
 components.

---
 AMDiS/src/parallel/PetscSolverFeti.cc | 14 +++++++-------
 AMDiS/src/parallel/PetscSolverFeti.h  |  4 +++-
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc
index 8aaf8d05..39a36c12 100644
--- a/AMDiS/src/parallel/PetscSolverFeti.cc
+++ b/AMDiS/src/parallel/PetscSolverFeti.cc
@@ -578,8 +578,8 @@ namespace AMDiS {
 
 
     MatCreateShell(PETSC_COMM_WORLD,
-		   nRankLagrange, nRankLagrange,
-		   nOverallLagrange, nOverallLagrange,
+		   nRankLagrange * nComponents, nRankLagrange * nComponents,
+		   nOverallLagrange * nComponents, nOverallLagrange * nComponents,
 		   &petscFetiData, &mat_feti);
     MatShellSetOperation(mat_feti, MATOP_MULT, (void(*)(void))petscMultMatFeti);
 
@@ -607,7 +607,8 @@ namespace AMDiS {
     petscFetiPreconData.mat_interior_bound = &mat_interior_bound;
     petscFetiPreconData.mat_bound_interior = &mat_bound_interior;
     petscFetiPreconData.ksp_interior = &ksp_interior;
-    petscFetiPreconData.nInterior = nRankB - duals.size();
+    petscFetiPreconData.nLocalInterior = nLocalInterior;
+    petscFetiPreconData.nLocalBound = nLocalBound;
 
     VecDuplicate(f_b, &(petscFetiPreconData.tmp_vec_b));
 
@@ -615,7 +616,6 @@ namespace AMDiS {
     MatGetVecs(mat_bound_bound, PETSC_NULL, &(petscFetiPreconData.tmp_vec_bound1));
     MatGetVecs(mat_interior_interior, PETSC_NULL, &(petscFetiPreconData.tmp_vec_interior));
 
-
     KSPGetPC(ksp_feti, &precon_feti);
     PCSetType(precon_feti, PCSHELL);
     PCShellSetContext(precon_feti, static_cast<void*>(&petscFetiPreconData));
@@ -1116,9 +1116,9 @@ namespace AMDiS {
   
 
 
-    int nRankNest = (nRankB + nRankPrimals) * nComponents + nRankLagrange;    
-    int nOverallNest = (nOverallB + nOverallPrimals) * nComponents + nOverallLagrange;
-    int rStartNest = (rStartB + rStartPrimals) * nComponents + rStartLagrange;
+    int nRankNest = (nRankB + nRankPrimals + nRankLagrange) * nComponents;
+    int nOverallNest = (nOverallB + nOverallPrimals + nOverallLagrange) * nComponents;
+    int rStartNest = (rStartB + rStartPrimals + rStartLagrange) * nComponents;
 
     {
       // === Test some matrix sizes. ===
diff --git a/AMDiS/src/parallel/PetscSolverFeti.h b/AMDiS/src/parallel/PetscSolverFeti.h
index d63f0031..0a29a941 100644
--- a/AMDiS/src/parallel/PetscSolverFeti.h
+++ b/AMDiS/src/parallel/PetscSolverFeti.h
@@ -104,7 +104,9 @@ namespace AMDiS {
     Vec tmp_vec_interior;
     
 
-    int nInterior;
+    int nLocalInterior;
+
+    int nLocalBound;
   };
 
 
-- 
GitLab