From adafaf5a0db4b921f7ce69c6715fa75c256864c8 Mon Sep 17 00:00:00 2001
From: Matti Pellika <matti.pellikka@tut.fi>
Date: Thu, 8 Oct 2009 09:59:37 +0000
Subject: [PATCH] Bugfixes. Changed the notation of generator chains.

---
 Geo/CellComplex.cpp | 15 ++++++++++-----
 Geo/Homology.cpp    | 39 +++++++++++++++++++++------------------
 Geo/Homology.h      | 38 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 68 insertions(+), 24 deletions(-)

diff --git a/Geo/CellComplex.cpp b/Geo/CellComplex.cpp
index 4f990f8af5..9c004e0e0e 100644
--- a/Geo/CellComplex.cpp
+++ b/Geo/CellComplex.cpp
@@ -516,8 +516,7 @@ int CellComplex::reduceComplex(int omit){
   _store.clear();
   if(omit > getDim()) omit = getDim();
   
-  
-  
+    
   CellComplex::removeSubdomain();
   //std::set<Cell*, Less_Cell> generatorCells;
   
@@ -577,7 +576,13 @@ void CellComplex::removeSubdomain(){
         //cit = firstCell(i);
       }
     }
-        
+    for(citer cit = firstCell(i); cit != lastCell(i); cit++){
+      Cell* cell = *cit;
+      if(cell->inSubdomain()) {
+        removeCell(cell);
+        cit = firstCell(i);
+      }
+    }
   }
   return;
 }
@@ -651,7 +656,7 @@ void CellComplex::computeBettiNumbers(){
       coreduction(cell);
     }
   }
-  printf("Cell complex Betti numbers: \n b0 = %d \n b1 = %d \n b2 = %d \n b3 = %d \n",
+  printf("Cell complex Betti numbers: \nH0 = %d \nH1 = %d \nH2 = %d \nH3 = %d \n",
          getBettiNumber(0), getBettiNumber(1), getBettiNumber(2), getBettiNumber(3));
   
   return;
@@ -875,7 +880,7 @@ int CellComplex::writeComplexMSH(const std::string &name){
   
   
   
-  fprintf(fp, "$MeshFormat\n2.0 0 8\n$EndMeshFormat\n");
+  fprintf(fp, "$MeshFormat\n2.1 0 8\n$EndMeshFormat\n");
   
   fprintf(fp, "$Nodes\n");
   
diff --git a/Geo/Homology.cpp b/Geo/Homology.cpp
index 29183db633..a81a6b82ca 100644
--- a/Geo/Homology.cpp
+++ b/Geo/Homology.cpp
@@ -17,6 +17,9 @@ Homology::Homology(GModel* model, std::vector<int> physicalDomain, std::vector<i
   _combine = true;
   _omit = 1;
   
+  _domain = physicalDomain;
+  _subdomain = physicalSubdomain;
+  
   Msg::Info("Creating a Cell Complex...");
   double t1 = Cpu();
   
@@ -121,12 +124,12 @@ void Homology::findGenerators(std::string fileName){
       std::string generator;
       convert(i, generator);
       
-      std::string name = dimension + "D Generator " + generator;
+      std::string name = "H" + dimension + getDomainString()  + generator;
       Chain* chain = new Chain(_cellComplex->getCells(j), chains->getCoeffVector(j,i), _cellComplex, name, chains->getTorsion(j,i));
       chain->writeChainMSH(fileName);
       if(chain->getSize() != 0) {
         HRank[j] = HRank[j] + 1;
-        if(chain->getTorsion() != 1) Msg::Warning("%dD Generator %d has torsion coefficient %d!", j, i, chain->getTorsion());
+        if(chain->getTorsion() != 1) Msg::Warning("H%d %d has torsion coefficient %d!", j, i, chain->getTorsion());
       }
       delete chain;
     }
@@ -134,7 +137,7 @@ void Homology::findGenerators(std::string fileName){
       for(int i = 0; i < _cellComplex->getNumOmitted(); i++){
         std::string generator;
         convert(i+1, generator);
-        std::string name = dimension + "D Generator " + generator;
+        std::string name = "H" + dimension + getDomainString() + generator;
         std::vector<int> coeffs (_cellComplex->getOmitted(i).size(),1);
         Chain* chain = new Chain(_cellComplex->getOmitted(i), coeffs, _cellComplex, name, 1);
         chain->writeChainMSH(fileName);
@@ -228,12 +231,12 @@ void Homology::findDualGenerators(std::string fileName){
       std::string generator;
       convert(i, generator);
       
-      std::string name = dimension + "D Dual generator " + generator;
+      std::string name = "H" + dimension + "*" + getDomainString() + generator;
       Chain* chain = new Chain(_cellComplex->getCells(j), chains->getCoeffVector(j,i), _cellComplex, name, chains->getTorsion(j,i));
       chain->writeChainMSH(fileName);
       if(chain->getSize() != 0){
         HRank[dim-j] = HRank[dim-j] + 1;
-        if(chain->getTorsion() != 1) Msg::Warning("%dD Dual generator %d has torsion coefficient %d!", j, i, chain->getTorsion());
+        if(chain->getTorsion() != 1) Msg::Warning("H%d* %d has torsion coefficient %d!", dim-j, i, chain->getTorsion());
       }
       delete chain;
             
@@ -244,7 +247,7 @@ void Homology::findDualGenerators(std::string fileName){
       for(int i = 0; i < _cellComplex->getNumOmitted(); i++){
         std::string generator;
         convert(i+1, generator);
-        std::string name = dimension + "D Dual generator " + generator;
+        std::string name = "H" + dimension + "*" + getDomainString() + generator;
         std::vector<int> coeffs (_cellComplex->getOmitted(i).size(),1);
         Chain* chain = new Chain(_cellComplex->getOmitted(i), coeffs, _cellComplex, name, 1);
         chain->writeChainMSH(fileName);
@@ -258,10 +261,10 @@ void Homology::findDualGenerators(std::string fileName){
   }
    
   Msg::Info("Ranks of homology groups for dual cell complex:");
-  Msg::Info("H0 = %d", HRank[0]);
-  Msg::Info("H1 = %d", HRank[1]);
-  Msg::Info("H2 = %d", HRank[2]);
-  Msg::Info("H3 = %d", HRank[3]);
+  Msg::Info("H0* = %d", HRank[0]);
+  Msg::Info("H1* = %d", HRank[1]);
+  Msg::Info("H2* = %d", HRank[2]);
+  Msg::Info("H3* = %d", HRank[3]);
   if(omitted != 0) Msg::Info("The computation of %d highest dimension dual generators was omitted.", _omit);
   
   Msg::Info("Wrote results to %s.", fileName.c_str());
@@ -269,10 +272,10 @@ void Homology::findDualGenerators(std::string fileName){
   
   delete chains;
   
-  printf("H0 = %d \n", HRank[0]);
-  printf("H1 = %d \n", HRank[1]);
-  printf("H2 = %d \n", HRank[2]);
-  printf("H3 = %d \n", HRank[3]);
+  printf("H0* = %d \n", HRank[0]);
+  printf("H1* = %d \n", HRank[1]);
+  printf("H2* = %d \n", HRank[2]);
+  printf("H3* = %d \n", HRank[3]);
   
   return;
 }
@@ -285,10 +288,10 @@ void Homology::computeBettiNumbers(){
   double t2 = Cpu();
   Msg::Info("Betti number computation complete (%g s).", t2- t1);
 
-  Msg::Info("b0 = %d \n", _cellComplex->getBettiNumber(0));
-  Msg::Info("b1 = %d \n", _cellComplex->getBettiNumber(1));
-  Msg::Info("b2 = %d \n", _cellComplex->getBettiNumber(2));
-  Msg::Info("b3 = %d \n", _cellComplex->getBettiNumber(3));
+  Msg::Info("H0 = %d \n", _cellComplex->getBettiNumber(0));
+  Msg::Info("H1 = %d \n", _cellComplex->getBettiNumber(1));
+  Msg::Info("H2 = %d \n", _cellComplex->getBettiNumber(2));
+  Msg::Info("H3 = %d \n", _cellComplex->getBettiNumber(3));
   
   return;
 }
diff --git a/Geo/Homology.h b/Geo/Homology.h
index 8be0e76cb5..c1e2e7b077 100644
--- a/Geo/Homology.h
+++ b/Geo/Homology.h
@@ -31,6 +31,9 @@ class Homology
    bool _combine;
    int _omit;
    
+   std::vector<int> _domain;
+   std::vector<int> _subdomain;
+   
   public:
    
    Homology(GModel* model, std::vector<int> physicalDomain, std::vector<int> physicalSubdomain);
@@ -41,6 +44,7 @@ class Homology
    
    void findGenerators(std::string fileName);
    void findDualGenerators(std::string fileName);
+
    void computeBettiNumbers();
    
    void swapSubdomain() { _cellComplex->swapSubdomain(); }
@@ -49,7 +53,7 @@ class Homology
    void setOmit(int omit) {
      if(omit == 0) _omit = 0;
      else _omit = 1;
-      
+        
      /*
      if(omit > _cellComplex->getDim() || omit < 0) {
        Msg::Error("Invalid number of dimensions to omit. Must be between 0 - %d.", _cellComplex->getDim());
@@ -60,6 +64,38 @@ class Homology
      */ 
      
    }
+   
+   std::string getDomainString() {
+     
+     std::string domainString = "({";
+     for(unsigned int i = 0; i < _domain.size(); i++){
+       std::string temp = "";
+       convert(_domain.at(i),temp);
+       domainString += temp;
+       if (_domain.size()-1 > i){ 
+         domainString += ", ";
+       }
+     }
+     domainString += "}";
+     
+     if(!_subdomain.empty()){
+       domainString += ", {";
+       
+       for(unsigned int i = 0; i < _subdomain.size(); i++){
+         std::string temp = "";
+         convert(_subdomain.at(i),temp);
+         domainString += temp;
+         if (_subdomain.size()-1 > i){
+           domainString += ", ";
+         }
+       } 
+       domainString += "}";
+       
+     }
+   domainString += ") ";
+   return domainString;
+   }
+   
 };
 
 #endif
-- 
GitLab