From 1b002f74d61523751b2bc2b9cf93905a0b05d602 Mon Sep 17 00:00:00 2001
From: Emilie Marchandise <emilie.marchandise@uclouvain.be>
Date: Fri, 19 Feb 2010 10:06:24 +0000
Subject: [PATCH]

---
 Geo/GFaceCompound.cpp  | 15 ++++++++++-----
 Solver/diagBCTerm.h    |  7 +++----
 Solver/dofManager.h    |  2 --
 Solver/eigenSolver.cpp | 24 ++++++++++++++++++++++--
 4 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index 4707da4103..a1470c97c7 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -1124,6 +1124,7 @@ bool GFaceCompound::parametrize_conformal_spectral() const
     MVertex *v = *itv;
     myAssembler.numberVertex(v, 0, 1);
     myAssembler.numberVertex(v, 0, 2);
+
   }
 
   simpleFunction<double> ONE(1.0);
@@ -1151,18 +1152,22 @@ bool GFaceCompound::parametrize_conformal_spectral() const
      myAssembler.numberVertex(v, 0, 1);
      myAssembler.numberVertex(v, 0, 2);
    }
-   diagBCTerm diag(0, 1, &ONE);
+   
+   diagBCTerm diag1(0, 1, &ONE);
+   diagBCTerm diag2(0, 2, &ONE);
    it = _compound.begin(); 
    for( ; it != _compound.end() ; ++it){
      for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){
        SElement se((*it)->triangles[i]);
-       diag.addToMatrix(myAssembler, &se);
+       diag1.addToMatrix(myAssembler, &se);
+       diag2.addToMatrix(myAssembler, &se);
      }
    }
-   myAssembler.setCurrentMatrix("A");
-  //-------------------------------
+
+   //-------------------------------
    eigenSolver eig(&myAssembler, "A" ); //, "B");
-   eig.solve(2, "smallest");
+   //eig.solve(1, "largest");
+   eig.solve(1, "smallestReal");
    //printf("num eigenvalues =%d \n", eig.getNumEigenValues());
    
    int k = 0;
diff --git a/Solver/diagBCTerm.h b/Solver/diagBCTerm.h
index ce59034a8b..6e13dfd2f3 100644
--- a/Solver/diagBCTerm.h
+++ b/Solver/diagBCTerm.h
@@ -48,10 +48,9 @@ class diagBCTerm : public femTerm<double> {
 	m(j,k) = 0.0;
 	m(k,j) = 0.0;
       }
-      m(j,j)  = 1.0;
-/*       MVertex *v = e->getVertex(j); */
-/*       if( v->onWhat()->dim() < 2 )  m(j,j) = (nbNodes - 1) ; */
-/*       else m(j,j) = 0.0; */
+      MVertex *v = e->getVertex(j);
+      if( v->onWhat()->dim() < 2 ) m(j,j) = 1.0; 
+      else m(j,j) = 0.0;
     }
   } 
   
diff --git a/Solver/dofManager.h b/Solver/dofManager.h
index 5e0f060572..41f39ef104 100644
--- a/Solver/dofManager.h
+++ b/Solver/dofManager.h
@@ -105,8 +105,6 @@ class dofManager{
  dofManager(linearSystem<dataMat> *l1, linearSystem<dataMat> *l2) : _current(l1) { 
     _linearSystems.insert(std::make_pair("A", l1));
     _linearSystems.insert(std::make_pair("B", l2));
-    //_linearSystems.["A"] = l1; 
-    //_linearSystems["B"] = l2;
   }
   inline void fixDof(Dof key, const dataVec &value)
   {
diff --git a/Solver/eigenSolver.cpp b/Solver/eigenSolver.cpp
index f162a08f5c..d87b8d9762 100644
--- a/Solver/eigenSolver.cpp
+++ b/Solver/eigenSolver.cpp
@@ -32,7 +32,14 @@ void eigenSolver::solve(int numEigenValues, std::string which)
   _try(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
   PetscInt N, M;
   _try(MatGetSize(A, &N, &M));
- 
+
+  PetscInt N2, M2;
+  if (_B) {
+    _try(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
+    _try(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
+    _try(MatGetSize(B, &N2, &M2));
+  } 
+
   // generalized eigenvalue problem A x - \lambda B x = 0
   EPS eps;
   _try(EPSCreate(PETSC_COMM_WORLD, &eps));
@@ -43,6 +50,18 @@ void eigenSolver::solve(int numEigenValues, std::string which)
   else
     _try(EPSSetProblemType(eps, _B ? EPS_GNHEP : EPS_NHEP));
 
+//   EPSSetProblemType(eps, EPS_GNHEP);
+//   ST st;
+//   EPSGetST(eps,&st);
+//   KSP ksp;
+//   PC pc;
+//   STGetKSP(st,&ksp); 
+//   KSPGetPC(ksp, &pc);
+//   PCSetType(pc, PCJACOBI);
+//   PCFactorSetMatOrderingType(pc, MATORDERING_RCM);
+//   STSetType(st,STSINV);
+//   STSetShift(st,0.0);
+
   // set some default options
   _try(EPSSetDimensions(eps, 5, PETSC_DECIDE, PETSC_DECIDE));
 
@@ -54,10 +73,11 @@ void eigenSolver::solve(int numEigenValues, std::string which)
     _try(EPSSetDimensions(eps, numEigenValues, PETSC_DECIDE, PETSC_DECIDE));
   if(which == "smallest")
     _try(EPSSetWhichEigenpairs(eps, EPS_SMALLEST_MAGNITUDE));
+  else if(which == "smallestReal")
+    _try(EPSSetWhichEigenpairs(eps, EPS_SMALLEST_REAL));
   else if(which == "largest")
     _try(EPSSetWhichEigenpairs(eps, EPS_LARGEST_MAGNITUDE));
 
-
   // print info
   const EPSType type;
   _try(EPSGetType(eps, &type));
-- 
GitLab