/[escript]/branches/intelc_win32/bruce/src/Bruce.cpp
ViewVC logotype

Diff of /branches/intelc_win32/bruce/src/Bruce.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/bruce/src/Bruce.cpp revision 734 by robwdcock, Mon Mar 27 02:43:09 2006 UTC branches/intelc_win32/bruce/src/Bruce.cpp revision 742 by woo409, Sat Jun 24 11:27:16 2006 UTC
# Line 20  Line 20 
20  #include "escript/FunctionSpaceFactory.h"  #include "escript/FunctionSpaceFactory.h"
21    
22  #include <boost/python/extract.hpp>  #include <boost/python/extract.hpp>
23    #include <vector>
24    #include <string>
25  #include "vtkCellType.h"  #include "vtkCellType.h"
26    
27  using namespace std;  using namespace std;
# Line 28  using namespace escript; Line 29  using namespace escript;
29    
30  namespace bruce {  namespace bruce {
31    
32    BRUCE_DLL_API
33  const int Bruce::ContinuousFunction=0;  const int Bruce::ContinuousFunction=0;
34    BRUCE_DLL_API
35  const int Bruce::Function=1;  const int Bruce::Function=1;
36    
37  Bruce::FunctionSpaceNamesMapType Bruce::m_functionSpaceTypeNames;  Bruce::FunctionSpaceNamesMapType Bruce::m_functionSpaceTypeNames;
# Line 886  Bruce::saveVTK(const std::string& filena Line 889  Bruce::saveVTK(const std::string& filena
889                 const boost::python::dict& dataDict) const                 const boost::python::dict& dataDict) const
890  {  {
891    
892      const int num_data=boost::python::extract<int>(dataDict.attr("__len__")());
893      boost::python::list keys=dataDict.keys();
894    
895    //    //
896    // extract Data objects and associated names from dictionary object    // extract Data objects and associated names from dictionary object
897    const int num_data=boost::python::extract<int>(dataDict.attr("__len__")());    const int MAX_namelength=256;
898    
899    int MAX_namelength=256;  /* FIXME: win32 refactor - Not required any more
900    char names[num_data][MAX_namelength];    char names[num_data][MAX_namelength];
901    char* c_names[num_data];    char* c_names[num_data];
902    
903    escriptDataC data[num_data];    escriptDataC data[num_data];
904    escriptDataC* ptr_data[num_data];    escriptDataC* ptr_data[num_data];
905    
   boost::python::list keys=dataDict.keys();  
906    for (int i=0; i<num_data; i++) {    for (int i=0; i<num_data; i++) {
907      Data& d=boost::python::extract<Data&>(dataDict[keys[i]]);      Data& d=boost::python::extract<Data&>(dataDict[keys[i]]);
908      if (dynamic_cast<const Bruce&>(d.getFunctionSpace().getDomain()) != *this) {      if (dynamic_cast<const Bruce&>(d.getFunctionSpace().getDomain()) != *this) {
# Line 914  Bruce::saveVTK(const std::string& filena Line 919  Bruce::saveVTK(const std::string& filena
919        strcpy(c_names[i],n.c_str());        strcpy(c_names[i],n.c_str());
920      }      }
921    }    }
922    */
923    //    //
924    // open archive file    // open archive file
925    ofstream archiveFile;    ofstream archiveFile;
# Line 922  Bruce::saveVTK(const std::string& filena Line 927  Bruce::saveVTK(const std::string& filena
927    if (!archiveFile.good()) {    if (!archiveFile.good()) {
928        throw BruceException("Error in Bruce::saveVTK: File could not be opened for writing");        throw BruceException("Error in Bruce::saveVTK: File could not be opened for writing");
929    }    }
   
930    //    //
931    // determine mesh type to be written    // determine mesh type to be written
932    bool isCellCentered[num_data], write_celldata=false, write_pointdata=false;    bool write_celldata=false, write_pointdata=false;
933    for (int i_data=0; i_data<num_data; i_data++) {    for (int i_data=0; i_data<num_data; i_data++) {
934      if (!isEmpty(ptr_data[i_data])) {      Data& d=boost::python::extract<Data&>(dataDict[keys[i_data]]);
935        switch(getFunctionSpaceType(ptr_data[i_data])) {      if (!d.isEmpty()) {
936          switch(d.getFunctionSpace().getTypeCode()) {
937          case ContinuousFunction:          case ContinuousFunction:
938            isCellCentered[i_data]=false;            write_pointdata=true;
939            break;            break;
940          case Function:          case Function:
941            isCellCentered[i_data]=true;            write_celldata=true;
942            break;            break;
943        }        }
       if (isCellCentered[i_data]) {  
         write_celldata=true;  
       } else {  
         write_pointdata=true;  
       }  
944      }      }
945    }    }
946    
# Line 952  Bruce::saveVTK(const std::string& filena Line 952  Bruce::saveVTK(const std::string& filena
952    //    //
953    // determine VTK element type    // determine VTK element type
954    int cellType;    int cellType;
955    char elemTypeStr[32];    std::string elemTypeStr;
956    int numVTKNodesPerElement;    int numVTKNodesPerElement;
957    
958    int nDim = getDim();    int nDim = getDim();
# Line 961  Bruce::saveVTK(const std::string& filena Line 961  Bruce::saveVTK(const std::string& filena
961      case 0:      case 0:
962        cellType = VTK_VERTEX;        cellType = VTK_VERTEX;
963        numVTKNodesPerElement = 1;        numVTKNodesPerElement = 1;
964        strcpy(elemTypeStr, "VTK_VERTEX");        elemTypeStr = "VTK_VERTEX";
965        break;        break;
966    
967      case 1:      case 1:
968        cellType = VTK_LINE;        cellType = VTK_LINE;
969        numVTKNodesPerElement = 2;        numVTKNodesPerElement = 2;
970        strcpy(elemTypeStr, "VTK_LINE");        elemTypeStr = "VTK_LINE";
971        break;        break;
972    
973      case 2:      case 2:
974        cellType = VTK_QUAD;        cellType = VTK_QUAD;
975        numVTKNodesPerElement = 4;        numVTKNodesPerElement = 4;
976        strcpy(elemTypeStr, "VTK_QUAD");        elemTypeStr = "VTK_QUAD";
977        break;        break;
978    
979      case 3:      case 3:
980        cellType = VTK_HEXAHEDRON;        cellType = VTK_HEXAHEDRON;
981        numVTKNodesPerElement = 8;        numVTKNodesPerElement = 8;
982        strcpy(elemTypeStr, "VTK_HEXAHEDRON");        elemTypeStr = "VTK_HEXAHEDRON";
983        break;        break;
984    
985    }    }
# Line 1029  Bruce::saveVTK(const std::string& filena Line 1029  Bruce::saveVTK(const std::string& filena
1029    //    //
1030    // cell data    // cell data
1031    if (write_celldata) {    if (write_celldata) {
   
1032      //      //
1033      // mark the active cell-data data arrays      // mark the active cell-data data arrays
1034      bool set_scalar=false, set_vector=false, set_tensor=false;      bool set_scalar=false, set_vector=false, set_tensor=false;
1035      archiveFile << "\t\t\t\t<CellData";      archiveFile << "\t\t\t\t<CellData";
1036      for (int i_data=0; i_data<num_data; i_data++) {      for (int i_data=0; i_data<num_data; i_data++) {
1037        if (!isEmpty(ptr_data[i_data]) && isCellCentered[i_data]) {        Data& d = boost::python::extract<Data&>(dataDict[keys[i_data]]);
1038          std::string name(boost::python::extract<std::string>(keys[i_data]),0 , MAX_namelength);
1039          switch(getDataPointRank(ptr_data[i_data])) {        
1040          if (!d.isEmpty() && d.getFunctionSpace().getTypeCode()==Function) {
1041            
1042            switch(d.getDataPointRank()) {
1043    
1044            case 0:            case 0:
1045              if (!set_scalar) {              if (!set_scalar) {
1046                archiveFile << " Scalars=" << names[i_data];                archiveFile << " Scalars=" << name;
1047                set_scalar=true;                set_scalar=true;
1048              }              }
1049              break;              break;
1050    
1051            case 1:            case 1:
1052              if (!set_vector) {              if (!set_vector) {
1053                archiveFile << " Vectors=" << names[i_data];                archiveFile << " Vectors=" << name;
1054                set_vector=true;                set_vector=true;
1055              }              }
1056              break;              break;
1057    
1058            case 2:            case 2:
1059              if (!set_tensor) {              if (!set_tensor) {
1060                archiveFile << " Tensors=" << names[i_data];                archiveFile << " Tensors=" << name;
1061                set_tensor=true;                set_tensor=true;
1062              }              }
1063              break;              break;
# Line 1068  Bruce::saveVTK(const std::string& filena Line 1070  Bruce::saveVTK(const std::string& filena
1070        }        }
1071      }      }
1072      archiveFile << ">" << endl;      archiveFile << ">" << endl;
   
1073      //      //
1074      // write the cell-data data arrays      // write the cell-data data arrays
1075      for (int i_data=0; i_data<num_data; i_data++) {      for (int i_data=0; i_data<num_data; i_data++) {
1076        if (!isEmpty(ptr_data[i_data]) && isCellCentered[i_data]) {        Data& d = boost::python::extract<Data&>(dataDict[keys[i_data]]);
1077          std::string name(boost::python::extract<std::string>(keys[i_data]),0 , MAX_namelength);
1078          
1079          if (!d.isEmpty() && d.getFunctionSpace().getTypeCode()==Function) {
1080          int numPointsPerSample=1;          int numPointsPerSample=1;
1081          int rank=getDataPointRank(ptr_data[i_data]);          int rank = d.getDataPointRank();
1082          int nComp=getDataPointSize(ptr_data[i_data]);          int nComp = d.getDataPointSize();
1083          int nCompReqd; // the number of components required by vtk          int nCompReqd; // the number of components required by vtk
1084          int shape=0;          int shape=0;
1085    
# Line 1087  Bruce::saveVTK(const std::string& filena Line 1090  Bruce::saveVTK(const std::string& filena
1090              break;              break;
1091    
1092            case 1:            case 1:
1093              shape=getDataPointShape(ptr_data[i_data], 0);              shape = d.getDataPointShape()[0];
1094              if (shape>3) {              if (shape>3) {
1095                archiveFile.close();                archiveFile.close();
1096                throw BruceException("saveVTK: rank 1 object must have less than 4 components");                throw BruceException("saveVTK: rank 1 object must have less than 4 components");
# Line 1096  Bruce::saveVTK(const std::string& filena Line 1099  Bruce::saveVTK(const std::string& filena
1099              break;              break;
1100    
1101            case 2:            case 2:
1102              shape=getDataPointShape(ptr_data[i_data], 0);              shape=d.getDataPointShape()[0];
1103              if (shape>3 || shape!=getDataPointShape(ptr_data[i_data], 1)) {              if (shape>3 || shape!=d.getDataPointShape()[1]) {
1104                archiveFile.close();                archiveFile.close();
1105                throw BruceException("saveVTK: rank 2 object must have less than 4x4 components and must have a square shape");                throw BruceException("saveVTK: rank 2 object must have less than 4x4 components and must have a square shape");
1106              }              }
# Line 1106  Bruce::saveVTK(const std::string& filena Line 1109  Bruce::saveVTK(const std::string& filena
1109    
1110          }          }
1111    
1112          archiveFile << "\t\t\t\t\t<DataArray Name=" << names[i_data] << " type=\"Float32\" NumberOfComponents=" << nCompReqd << " format=\"ascii\">" << endl;          archiveFile << "\t\t\t\t\t<DataArray Name=" << name << " type=\"Float32\" NumberOfComponents=" << nCompReqd << " format=\"ascii\">" << endl;
   
1113  /*  /*
1114          //          //
1115          // write out the cell data          // write out the cell data
# Line 1168  Bruce::saveVTK(const std::string& filena Line 1170  Bruce::saveVTK(const std::string& filena
1170    
1171      archiveFile << "\t\t\t\t</CellData>" << endl;      archiveFile << "\t\t\t\t</CellData>" << endl;
1172    }    }
   
1173    //    //
1174    // point data    // point data
1175    if (write_pointdata) {    if (write_pointdata) {
   
1176      //      //
1177      // mark the active point-data data arrays      // mark the active point-data data arrays
1178      bool set_scalar=false, set_vector=false, set_tensor=false;      bool set_scalar=false, set_vector=false, set_tensor=false;
1179      archiveFile << "\t\t\t\t<PointData";      archiveFile << "\t\t\t\t<PointData";
1180      for (int i_data=0; i_data<num_data; i_data++) {      for (int i_data=0; i_data<num_data; i_data++) {
1181        if (!isEmpty(ptr_data[i_data]) && !isCellCentered[i_data]) {        Data& d = boost::python::extract<Data&>(dataDict[keys[i_data]]);
1182          std::string name(boost::python::extract<std::string>(keys[i_data]),0 , MAX_namelength);
1183    
1184          if (!d.isEmpty() && d.getFunctionSpace().getTypeCode()==ContinuousFunction) {
1185    
1186          switch(getDataPointRank(ptr_data[i_data])) {          switch(d.getDataPointRank()) {
1187    
1188            case 0:            case 0:
1189              if (!set_scalar) {              if (!set_scalar) {
1190                archiveFile << " Scalars=" << names[i_data];                archiveFile << " Scalars=" << name;
1191                set_scalar=true;                set_scalar=true;
1192              }              }
1193              break;              break;
1194    
1195            case 1:            case 1:
1196              if (!set_vector) {              if (!set_vector) {
1197                archiveFile << " Vectors=" << names[i_data];                archiveFile << " Vectors=" << name;
1198                set_vector=true;                set_vector=true;
1199              }              }
1200              break;              break;
1201    
1202            case 2:            case 2:
1203              if (!set_tensor) {              if (!set_tensor) {
1204                archiveFile << " Tensors=" << names[i_data];                archiveFile << " Tensors=" << name;
1205                set_tensor=true;                set_tensor=true;
1206              }              }
1207              break;              break;
# Line 1211  Bruce::saveVTK(const std::string& filena Line 1214  Bruce::saveVTK(const std::string& filena
1214        }        }
1215      }      }
1216      archiveFile << ">" << endl;      archiveFile << ">" << endl;
   
1217      //      //
1218      // write the point-data data arrays      // write the point-data data arrays
1219      for (int i_data=0; i_data<num_data; i_data++) {      for (int i_data=0; i_data<num_data; i_data++) {
1220        if (!isEmpty(ptr_data[i_data]) && !isCellCentered[i_data]) {        Data& d = boost::python::extract<Data&>(dataDict[keys[i_data]]);
1221          std::string name(boost::python::extract<std::string>(keys[i_data]),0 , MAX_namelength);
1222          if (!d.isEmpty() && d.getFunctionSpace().getTypeCode()==ContinuousFunction) {
1223    
1224          int numPointsPerSample=1;          int numPointsPerSample=1;
1225          int rank=getDataPointRank(ptr_data[i_data]);          int rank = d.getDataPointRank();
1226          int nComp=getDataPointSize(ptr_data[i_data]);          int nComp = d.getDataPointSize();
1227          int nCompReqd; // the number of components required by vtk          int nCompReqd; // the number of components required by vtk
1228          int shape=0;          int shape=0;
1229    
# Line 1227  Bruce::saveVTK(const std::string& filena Line 1231  Bruce::saveVTK(const std::string& filena
1231    
1232          case 0:          case 0:
1233            nCompReqd=1;            nCompReqd=1;
1234              break;
1235          case 1:          case 1:
1236            shape=getDataPointShape(ptr_data[i_data], 0);            shape=d.getDataPointShape()[0];
1237            if (shape>3) {            if (shape>3) {
1238              archiveFile.close();              archiveFile.close();
1239              throw BruceException("saveVTK: rank 1 object must have less than 4 components");              throw BruceException("saveVTK: rank 1 object must have less than 4 components");
1240            }            }
1241            nCompReqd=3;            nCompReqd=3;
1242              break;
1243          case 2:          case 2:
1244            shape=getDataPointShape(ptr_data[i_data], 0);            shape=d.getDataPointShape()[0];
1245            if (shape>3 || shape!=getDataPointShape(ptr_data[i_data], 1)) {            if (shape>3 || shape!=d.getDataPointShape()[1]) {
1246              archiveFile.close();              archiveFile.close();
1247              throw BruceException("saveVTK: rank 2 object must have less than 4x4 components and must have a square shape");              throw BruceException("saveVTK: rank 2 object must have less than 4x4 components and must have a square shape");
1248            }            }
1249            nCompReqd=9;            nCompReqd=9;
1250              break;
1251          }          }
1252    
1253          archiveFile << "\t\t\t\t\t<DataArray Name=" << names[i_data] << " type=\"Float32\" NumberOfComponents=" << nCompReqd << " format=\"ascii\">" << endl;          archiveFile << "\t\t\t\t\t<DataArray Name=" << name << " type=\"Float32\" NumberOfComponents=" << nCompReqd << " format=\"ascii\">" << endl;
   
1254  /*  /*
1255          //          //
1256          // write out the point data          // write out the point data
# Line 1296  Bruce::saveVTK(const std::string& filena Line 1299  Bruce::saveVTK(const std::string& filena
1299            archiveFile << endl;            archiveFile << endl;
1300          }          }
1301  */  */
   
1302          archiveFile << "\t\t\t\t\t</DataArray>" << endl;          archiveFile << "\t\t\t\t\t</DataArray>" << endl;
1303        }        }
1304      }      }
   
1305      archiveFile << "\t\t\t\t</PointData>" << endl;      archiveFile << "\t\t\t\t</PointData>" << endl;
1306    }    }
   
1307    //    //
1308    // finish off the grid definition    // finish off the grid definition
1309    archiveFile << "\t\t\t</Piece>" << endl;    archiveFile << "\t\t\t</Piece>" << endl;

Legend:
Removed from v.734  
changed lines
  Added in v.742

  ViewVC Help
Powered by ViewVC 1.1.26