From 4d75e0702d05686bd170861a171b92881b84d341 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 1 Sep 2006 01:56:26 +0000
Subject: [PATCH] add CBAR for lines in BDF

---
 Geo/GModelIO.cpp | 29 +++++++++++++++++++----------
 Geo/MElement.cpp |  7 +++++--
 Geo/MElement.h   |  2 +-
 3 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/Geo/GModelIO.cpp b/Geo/GModelIO.cpp
index 3a1ad70efc..95c5454532 100644
--- a/Geo/GModelIO.cpp
+++ b/Geo/GModelIO.cpp
@@ -1,4 +1,4 @@
-// $Id: GModelIO.cpp,v 1.35 2006-09-01 01:34:27 geuzaine Exp $
+// $Id: GModelIO.cpp,v 1.36 2006-09-01 01:56:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -1404,8 +1404,8 @@ static int readElementBDF(FILE *fp, char *buffer, unsigned int numNodes,
     }
   }
   
-  if(vals.size() != numNodes + 2){
-    Msg(GERROR, "Wrong number of nodes %d for element", vals.size() - 2);
+  if(vals.size() < numNodes + 2){
+    Msg(GERROR, "Missing nodes for element (%d < numNodes)", vals.size() - 2);
     return 0;
   }
   
@@ -1430,7 +1430,7 @@ int GModel::readBDF(const std::string &name)
   bool comma = false;
 
   std::map<int, MVertex*> vertices;
-  std::map<int, std::vector<MElement*> > elements[5];
+  std::map<int, std::vector<MElement*> > elements[6];
 
   while(!feof(fp)) {
     if(!fgets(buffer, sizeof(buffer), fp)) break;
@@ -1451,39 +1451,44 @@ int GModel::readBDF(const std::string &name)
 	sscanf(&buffer[5], "%d , %d , %lf, %lf , %lf", &num, &dummy, &x, &y, &z);
 	vertices[num] = new MVertex(x, y, z);
       }
+      else if(!strncmp(buffer, "CBAR", 4)){
+	if(readElementBDF(fp, &buffer[4], 2, &num, &region, n))
+	  elements[0][region].push_back
+	    (new MLine(vertices[n[0]], vertices[n[1]], num));
+      }
       else if(!strncmp(buffer, "CTRIA3", 6)){
 	if(readElementBDF(fp, &buffer[6], 3, &num, &region, n))
-	  elements[0][region].push_back
+	  elements[1][region].push_back
 	    (new MTriangle(vertices[n[0]], vertices[n[1]], vertices[n[2]], num));
       }
       else if(!strncmp(buffer, "CTRIA6", 6)){
 	if(readElementBDF(fp, &buffer[6], 6, &num, &region, n))
-	  elements[0][region].push_back
+	  elements[1][region].push_back
 	    (new MTriangle2(vertices[n[0]], vertices[n[1]], vertices[n[2]], 
 			    vertices[n[3]], vertices[n[4]], vertices[n[5]], num));
       }
       else if(!strncmp(buffer, "CQUAD4", 6)){
 	if(readElementBDF(fp, &buffer[6], 4, &num, &region, n))
-	  elements[1][region].push_back
+	  elements[2][region].push_back
 	    (new MQuadrangle(vertices[n[0]], vertices[n[1]], vertices[n[2]], 
 			     vertices[n[3]], num));
       }
       else if(!strncmp(buffer, "CTETRA", 6)){
 	if(readElementBDF(fp, &buffer[6], 4, &num, &region, n))
-	  elements[2][region].push_back
+	  elements[3][region].push_back
 	    (new MTetrahedron(vertices[n[0]], vertices[n[1]], vertices[n[2]], 
 			      vertices[n[3]], num));
       }
       else if(!strncmp(buffer, "CHEXA", 5)){
 	if(readElementBDF(fp, &buffer[5], 8, &num, &region, n))
-	  elements[3][region].push_back
+	  elements[4][region].push_back
 	    (new MHexahedron(vertices[n[0]], vertices[n[1]], vertices[n[2]], 
 			     vertices[n[3]], vertices[n[4]], vertices[n[5]], 
 			     vertices[n[6]], vertices[n[7]], num));
       }
       else if(!strncmp(buffer, "CPENTA", 6)){
 	if(readElementBDF(fp, &buffer[6], 6, &num, &region, n))
-	  elements[4][region].push_back
+	  elements[5][region].push_back
 	    (new MPrism(vertices[n[0]], vertices[n[1]], vertices[n[2]], 
 			vertices[n[3]], vertices[n[4]], vertices[n[5]], num));
       }
@@ -1524,6 +1529,10 @@ int GModel::writeBDF(const std::string &name, double scalingFactor)
     for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++) 
       (*it)->mesh_vertices[i]->writeBDF(fp, scalingFactor);
   
+  for(eiter it = firstEdge(); it != lastEdge(); ++it){
+    for(unsigned int i = 0; i < (*it)->lines.size(); i++)
+      (*it)->lines[i]->writeBDF(fp, (*it)->tag());
+  }
   for(fiter it = firstFace(); it != lastFace(); ++it){
     for(unsigned int i = 0; i < (*it)->triangles.size(); i++)
       (*it)->triangles[i]->writeBDF(fp, (*it)->tag());
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 74cc6f7206..b3474ed8f5 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -1,4 +1,4 @@
-// $Id: MElement.cpp,v 1.12 2006-08-31 21:29:18 geuzaine Exp $
+// $Id: MElement.cpp,v 1.13 2006-09-01 01:56:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -284,8 +284,11 @@ void MElement::writeBDF(FILE *fp, int elementary)
   char *str = getStringForBDF();
   if(str){
     fprintf(fp, "%s,%d,%d", str, _num, elementary);
-    for(int i = 0; i < getNumVertices(); i++)
+    int n = getNumVertices();
+    for(int i = 0; i < n; i++)
       fprintf(fp, ",%d", getVertex(i)->getNum());
+    if(n == 2) // CBAR
+      fprintf(fp, ",1.,1.,1.");
     fprintf(fp, "\n");
   }
 }
diff --git a/Geo/MElement.h b/Geo/MElement.h
index d42e1a58ed..dd146319d2 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -170,7 +170,7 @@ class MLine : public MElement {
   int getTypeForMSH(){ return LGN1; }
   int getTypeForUNV(){ return 21; } // BEAM
   char *getStringForPOS(){ return "SL"; }
-  char *getStringForBDF(){ return 0; }
+  char *getStringForBDF(){ return "CBAR"; }
 };
 
 class MLine2 : public MLine {
-- 
GitLab