/[escript]/trunk/weipa/src/FinleyElements.cpp
ViewVC logotype

Diff of /trunk/weipa/src/FinleyElements.cpp

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

revision 3258 by caltinay, Fri Sep 3 00:31:55 2010 UTC revision 3259 by jfenwick, Mon Oct 11 01:48:14 2010 UTC
# Line 15  Line 15 
15  #include <weipa/NodeData.h>  #include <weipa/NodeData.h>
16    
17  #ifndef VISIT_PLUGIN  #ifndef VISIT_PLUGIN
18    #include <dudley/CppAdapter/MeshAdapter.h>
19  #include <finley/CppAdapter/MeshAdapter.h>  #include <finley/CppAdapter/MeshAdapter.h>
20    #else
21    #define ABS(X) ((X)>0?(X):-(X))
22  #endif  #endif
23    
24  #include <iostream>  #include <iostream>
# Line 28  Line 31 
31  #include <silo.h>  #include <silo.h>
32  #endif  #endif
33    
34    
35  using namespace std;  using namespace std;
36    
37  // The following arrays contain indices to convert unsupported element  // The following arrays contain indices to convert unsupported element
# Line 100  namespace weipa { Line 104  namespace weipa {
104  FinleyElements::FinleyElements(const string& elementName, FinleyNodes_ptr nodeData)  FinleyElements::FinleyElements(const string& elementName, FinleyNodes_ptr nodeData)
105      : originalMesh(nodeData), name(elementName), numElements(0),      : originalMesh(nodeData), name(elementName), numElements(0),
106        numGhostElements(0), nodesPerElement(0),        numGhostElements(0), nodesPerElement(0),
107        type(ZONETYPE_UNKNOWN), finleyTypeId(NoRef), elementFactor(1)        type(ZONETYPE_UNKNOWN), finleyTypeId(Finley_NoRef), elementFactor(1)
108  {  {
109      nodeMesh.reset(new FinleyNodes(name));      nodeMesh.reset(new FinleyNodes(name));
110  }  }
# Line 137  FinleyElements::FinleyElements(const Fin Line 141  FinleyElements::FinleyElements(const Fin
141  //  //
142  //  //
143  //  //
144    bool FinleyElements::initFromDudley(const Dudley_ElementFile* dudleyFile)
145    {
146    #ifndef VISIT_PLUGIN
147        numElements = dudleyFile->numElements;
148    
149        if (numElements > 0) {
150            nodesPerElement = dudleyFile->numNodes;
151    
152            int* iPtr;
153      
154            iPtr = dudleyFile->Nodes;
155            nodes.clear();
156            nodes.insert(nodes.end(), numElements*nodesPerElement, 0);
157            copy(iPtr, iPtr+numElements*nodesPerElement, nodes.begin());
158    
159            iPtr = dudleyFile->Color;
160            color.clear();
161            color.insert(color.end(), numElements, 0);
162            copy(iPtr, iPtr+numElements, color.begin());
163    
164            iPtr = dudleyFile->Id;
165            ID.clear();
166            ID.insert(ID.end(), numElements, 0);
167            copy(iPtr, iPtr+numElements, ID.begin());
168    
169            iPtr = dudleyFile->Owner;
170            owner.clear();
171            owner.insert(owner.end(), numElements, 0);
172            copy(iPtr, iPtr+numElements, owner.begin());
173    
174            iPtr = dudleyFile->Tag;
175            tag.clear();
176            tag.insert(tag.end(), numElements, 0);
177            copy(iPtr, iPtr+numElements, tag.begin());
178    
179            FinleyElementInfo f = getDudleyTypeInfo(dudleyFile->etype);
180            type = f.elementType;
181            elementFactor = f.elementFactor;
182            if (elementFactor > 1 || f.reducedElementSize != nodesPerElement)
183                buildReducedElements(f);
184    
185            buildMeshes();
186        }
187        return true;
188    
189    #else // VISIT_PLUGIN
190        return false;
191    #endif
192    }
193    
194    //
195    //
196    //
197  bool FinleyElements::initFromFinley(const Finley_ElementFile* finleyFile)  bool FinleyElements::initFromFinley(const Finley_ElementFile* finleyFile)
198  {  {
199  #ifndef VISIT_PLUGIN  #ifndef VISIT_PLUGIN
# Line 266  bool FinleyElements::readFromNc(NcFile* Line 323  bool FinleyElements::readFromNc(NcFile*
323          var->get(&tag[0], numElements);          var->get(&tag[0], numElements);
324    
325          att = ncfile->get_att((name + string("_TypeId")).c_str());          att = ncfile->get_att((name + string("_TypeId")).c_str());
326          finleyTypeId = (ElementTypeId)att->as_int(0);          finleyTypeId = (Finley_ElementTypeId)att->as_int(0);
327          FinleyElementInfo f = getFinleyTypeInfo(finleyTypeId);          FinleyElementInfo f = getFinleyTypeInfo(finleyTypeId);
328          type = f.elementType;          type = f.elementType;
329          elementFactor = f.elementFactor;          elementFactor = f.elementFactor;
# Line 724  bool FinleyElements::writeToSilo(DBfile* Line 781  bool FinleyElements::writeToSilo(DBfile*
781  //  //
782  //  //
783  //  //
784  FinleyElementInfo FinleyElements::getFinleyTypeInfo(ElementTypeId typeId)  FinleyElementInfo FinleyElements::getDudleyTypeInfo(Dudley_ElementTypeId typeId)
785    {
786        FinleyElementInfo ret;
787        ret.multiCellIndices = NULL;
788        ret.elementFactor = 1;
789        ret.useQuadNodes = false;
790        ret.quadDim = 0;
791    
792        switch (typeId) {
793            case Dudley_Line2Face://untested
794            case Dudley_Point1://untested
795                cerr << "WARNING: Dudley type " <<typeId<< " is untested!" << endl;
796                ret.elementSize = 1;
797                ret.elementType = ZONETYPE_POLYGON;
798                break;
799    
800            case Dudley_Tri3Face://untested
801                cerr << "WARNING: Dudley type " <<typeId<< " is untested!" << endl;
802            case Dudley_Line2:
803                ret.elementSize = ret.reducedElementSize = 2;
804                ret.elementType = ret.reducedElementType = ZONETYPE_BEAM;
805                break;
806    
807            case Dudley_Tet4Face://untested
808                cerr << "WARNING: Dudley type " <<typeId<< " is untested!" << endl;
809            case Dudley_Tri3:
810                ret.elementSize = ret.reducedElementSize = 3;
811                ret.elementType = ret.reducedElementType = ZONETYPE_TRIANGLE;
812                break;
813    
814            case Dudley_Tet4:
815                ret.elementSize = ret.reducedElementSize = 4;
816                ret.elementType = ret.reducedElementType = ZONETYPE_TET;
817                break;
818    
819            default:
820                cerr << "WARNING: Unknown Dudley Type " << typeId << endl;
821                break;
822        }
823        return ret;
824    }
825    
826    //
827    //
828    //
829    FinleyElementInfo FinleyElements::getFinleyTypeInfo(Finley_ElementTypeId typeId)
830  {  {
831      FinleyElementInfo ret;      FinleyElementInfo ret;
832      ret.multiCellIndices = NULL;      ret.multiCellIndices = NULL;
# Line 733  FinleyElementInfo FinleyElements::getFin Line 835  FinleyElementInfo FinleyElements::getFin
835      ret.quadDim = 0;      ret.quadDim = 0;
836    
837      switch (typeId) {      switch (typeId) {
838          case Point1_Contact://untested          case Finley_Point1_Contact://untested
839          case Line2Face_Contact://untested          case Finley_Line2Face_Contact://untested
840          case Line3Face_Contact://untested          case Finley_Line3Face_Contact://untested
841          case Line2Face://untested          case Finley_Line2Face://untested
842          case Line3Face://untested          case Finley_Line3Face://untested
843          case Point1://untested          case Finley_Point1://untested
844              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;
845              ret.elementSize = 1;              ret.elementSize = 1;
846              ret.elementType = ZONETYPE_POLYGON;              ret.elementType = ZONETYPE_POLYGON;
847              break;              break;
848    
849          case Tri3Face_Contact://untested          case Finley_Tri3Face_Contact://untested
850          case Tri3Face://untested          case Finley_Tri3Face://untested
851              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;
852          case Line2_Contact:          case Finley_Line2_Contact:
853          case Rec4Face_Contact:          case Finley_Rec4Face_Contact:
854          case Rec4Face:          case Finley_Rec4Face:
855          case Line2:          case Finley_Line2:
856              ret.elementSize = ret.reducedElementSize = 2;              ret.elementSize = ret.reducedElementSize = 2;
857              ret.elementType = ret.reducedElementType = ZONETYPE_BEAM;              ret.elementType = ret.reducedElementType = ZONETYPE_BEAM;
858              break;              break;
859    
860          case Line3:          case Finley_Line3:
861          case Line3Macro:          case Finley_Line3Macro:
862              ret.multiCellIndices = line3indices;              ret.multiCellIndices = line3indices;
863              ret.elementFactor = 2;              ret.elementFactor = 2;
864              // fall through              // fall through
865          case Line3_Contact:          case Finley_Line3_Contact:
866          case Tri6Face_Contact://untested          case Finley_Tri6Face_Contact://untested
867          case Rec8Face_Contact:          case Finley_Rec8Face_Contact:
868          case Tri6Face://untested          case Finley_Tri6Face://untested
869          case Rec8Face:          case Finley_Rec8Face:
870              //VTK_QUADRATIC_EDGE              //VTK_QUADRATIC_EDGE
871              ret.elementSize = ret.reducedElementSize = 2;              ret.elementSize = ret.reducedElementSize = 2;
872              ret.elementType = ret.reducedElementType = ZONETYPE_BEAM;              ret.elementType = ret.reducedElementType = ZONETYPE_BEAM;
873              break;              break;
874    
875          case Tet4Face_Contact://untested          case Finley_Tet4Face_Contact://untested
876          case Tet4Face://untested          case Finley_Tet4Face://untested
877              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;              cerr << "WARNING: Finley type " <<typeId<< " is untested!" << endl;
878          case Tri3_Contact:          case Finley_Tri3_Contact:
879          case Tri3:          case Finley_Tri3:
880              ret.elementSize = ret.reducedElementSize = 3;              ret.elementSize = ret.reducedElementSize = 3;
881              ret.elementType = ret.reducedElementType = ZONETYPE_TRIANGLE;              ret.elementType = ret.reducedElementType = ZONETYPE_TRIANGLE;
882              break;              break;
883    
884          case Rec4_Contact:          case Finley_Rec4_Contact:
885          case Hex8Face_Contact:          case Finley_Hex8Face_Contact:
886          case Hex8Face:          case Finley_Hex8Face:
887          case Rec4:          case Finley_Rec4:
888              ret.elementSize = ret.reducedElementSize = 4;              ret.elementSize = ret.reducedElementSize = 4;
889              ret.elementType = ret.reducedElementType = ZONETYPE_QUAD;              ret.elementType = ret.reducedElementType = ZONETYPE_QUAD;
890              break;              break;
891    
892          case Rec9:          case Finley_Rec9:
893          case Rec9Macro:          case Finley_Rec9Macro:
894              ret.useQuadNodes = true;              ret.useQuadNodes = true;
895              ret.quadDim = 2;              ret.quadDim = 2;
896              ret.multiCellIndices = rec9indices;              ret.multiCellIndices = rec9indices;
897              ret.elementFactor = 4;              ret.elementFactor = 4;
898              // fall through              // fall through
899          case Rec9_Contact:          case Finley_Rec9_Contact:
900              ret.elementSize = ret.reducedElementSize = 4;              ret.elementSize = ret.reducedElementSize = 4;
901              ret.elementType = ret.reducedElementType = ZONETYPE_QUAD;              ret.elementType = ret.reducedElementType = ZONETYPE_QUAD;
902              break;              break;
903    
904          case Tet4:          case Finley_Tet4:
905              ret.elementSize = ret.reducedElementSize = 4;              ret.elementSize = ret.reducedElementSize = 4;
906              ret.elementType = ret.reducedElementType = ZONETYPE_TET;              ret.elementType = ret.reducedElementType = ZONETYPE_TET;
907              break;              break;
908    
909          case Tri6:          case Finley_Tri6:
910          case Tri6Macro:          case Finley_Tri6Macro:
911              ret.useQuadNodes = true;              ret.useQuadNodes = true;
912              ret.quadDim = 2;              ret.quadDim = 2;
913              ret.multiCellIndices = tri6indices;              ret.multiCellIndices = tri6indices;
914              ret.elementFactor = 4;              ret.elementFactor = 4;
915              // fall through              // fall through
916          case Tri6_Contact:          case Finley_Tri6_Contact:
917          case Tet10Face_Contact://untested          case Finley_Tet10Face_Contact://untested
918          case Tet10Face://untested          case Finley_Tet10Face://untested
919              //VTK_QUADRATIC_TRIANGLE              //VTK_QUADRATIC_TRIANGLE
920              ret.elementSize = ret.reducedElementSize = 3;              ret.elementSize = ret.reducedElementSize = 3;
921              ret.elementType = ret.reducedElementType = ZONETYPE_TRIANGLE;              ret.elementType = ret.reducedElementType = ZONETYPE_TRIANGLE;
922              break;              break;
923    
924          case Rec8:          case Finley_Rec8:
925              ret.multiCellIndices = rec8indices;              ret.multiCellIndices = rec8indices;
926              ret.elementFactor = 6;              ret.elementFactor = 6;
927              // fall through              // fall through
928          case Hex20Face:          case Finley_Hex20Face:
929          case Rec8_Contact:          case Finley_Rec8_Contact:
930          case Hex20Face_Contact:          case Finley_Hex20Face_Contact:
931              //VTK_QUADRATIC_QUAD              //VTK_QUADRATIC_QUAD
932              ret.elementSize = 3;              ret.elementSize = 3;
933              ret.elementType = ZONETYPE_TRIANGLE;              ret.elementType = ZONETYPE_TRIANGLE;
# Line 833  FinleyElementInfo FinleyElements::getFin Line 935  FinleyElementInfo FinleyElements::getFin
935              ret.reducedElementType = ZONETYPE_QUAD;              ret.reducedElementType = ZONETYPE_QUAD;
936              break;              break;
937    
938          case Tet10:          case Finley_Tet10:
939          case Tet10Macro:          case Finley_Tet10Macro:
940              //VTK_QUADRATIC_TETRA              //VTK_QUADRATIC_TETRA
941              ret.useQuadNodes = true;              ret.useQuadNodes = true;
942              ret.quadDim = 3;              ret.quadDim = 3;
# Line 844  FinleyElementInfo FinleyElements::getFin Line 946  FinleyElementInfo FinleyElements::getFin
946              ret.elementType = ret.reducedElementType = ZONETYPE_TET;              ret.elementType = ret.reducedElementType = ZONETYPE_TET;
947              break;              break;
948    
949          case Hex20:          case Finley_Hex20:
950              //VTK_QUADRATIC_HEXAHEDRON              //VTK_QUADRATIC_HEXAHEDRON
951              ret.multiCellIndices = hex20indices;              ret.multiCellIndices = hex20indices;
952              ret.elementFactor = 36;              ret.elementFactor = 36;
# Line 854  FinleyElementInfo FinleyElements::getFin Line 956  FinleyElementInfo FinleyElements::getFin
956              ret.reducedElementType = ZONETYPE_HEX;              ret.reducedElementType = ZONETYPE_HEX;
957              break;              break;
958    
959          case Hex27:          case Finley_Hex27:
960          case Hex27Macro:          case Finley_Hex27Macro:
961              ret.useQuadNodes = true;              ret.useQuadNodes = true;
962              ret.quadDim = 3;              ret.quadDim = 3;
963              ret.multiCellIndices = hex27indices;              ret.multiCellIndices = hex27indices;
964              ret.elementFactor = 8;              ret.elementFactor = 8;
965              // fall through              // fall through
966          case Hex8:          case Finley_Hex8:
967              ret.elementSize = ret.reducedElementSize = 8;              ret.elementSize = ret.reducedElementSize = 8;
968              ret.elementType = ret.reducedElementType = ZONETYPE_HEX;              ret.elementType = ret.reducedElementType = ZONETYPE_HEX;
969              break;              break;
# Line 990  QuadMaskInfo FinleyElements::buildQuadMa Line 1092  QuadMaskInfo FinleyElements::buildQuadMa
1092      if (numQNodes == 0)      if (numQNodes == 0)
1093          return qmi;          return qmi;
1094    
1095      if (finleyTypeId == Line3Macro) {      if (finleyTypeId == Finley_Line3Macro) {
1096          for (int i=0; i<elementFactor; i++) {          for (int i=0; i<elementFactor; i++) {
1097              const float bounds[] = { 0.25, 0.75 };              const float bounds[] = { 0.25, 0.75 };
1098              IntVec m(numQNodes, 0);              IntVec m(numQNodes, 0);
# Line 1007  QuadMaskInfo FinleyElements::buildQuadMa Line 1109  QuadMaskInfo FinleyElements::buildQuadMa
1109              else              else
1110                  qmi.factor.push_back(hits);                  qmi.factor.push_back(hits);
1111          }          }
1112      } else if ((finleyTypeId == Tri6) || (finleyTypeId == Tri6Macro)) {      } else if ((finleyTypeId == Finley_Tri6) || (finleyTypeId == Finley_Tri6Macro)) {
1113          for (int i=0; i<elementFactor; i++) {          for (int i=0; i<elementFactor; i++) {
1114              const float bounds[][2] = { { 0., 0. }, { 1., 0. },              const float bounds[][2] = { { 0., 0. }, { 1., 0. },
1115                                          { 0., 1. }, { .5, 0. },                                          { 0., 1. }, { .5, 0. },
# Line 1035  QuadMaskInfo FinleyElements::buildQuadMa Line 1137  QuadMaskInfo FinleyElements::buildQuadMa
1137              }              }
1138              qmi.mask.push_back(m);              qmi.mask.push_back(m);
1139          }          }
1140      } else if ((finleyTypeId == Tet10) || (finleyTypeId == Tet10Macro)) {      } else if ((finleyTypeId == Finley_Tet10) || (finleyTypeId == Finley_Tet10Macro)) {
1141          for (int i=0; i<elementFactor; i++) {          for (int i=0; i<elementFactor; i++) {
1142              const float bounds[][3] = {              const float bounds[][3] = {
1143                  { 0., 0., 0. },                  { 0., 0., 0. },
# Line 1073  QuadMaskInfo FinleyElements::buildQuadMa Line 1175  QuadMaskInfo FinleyElements::buildQuadMa
1175              }              }
1176              qmi.mask.push_back(m);              qmi.mask.push_back(m);
1177          }          }
1178      } else if ((finleyTypeId == Rec9) || (finleyTypeId == Rec9Macro)) {      } else if ((finleyTypeId == Finley_Rec9) || (finleyTypeId == Finley_Rec9Macro)) {
1179          for (int i=0; i<elementFactor; i++) {          for (int i=0; i<elementFactor; i++) {
1180              const float bounds[][2] = { { 0.25, 0.25 }, { 0.75, 0.25 },              const float bounds[][2] = { { 0.25, 0.25 }, { 0.75, 0.25 },
1181                                          { 0.25, 0.75 }, { 0.75, 0.75 } };                                          { 0.25, 0.75 }, { 0.75, 0.75 } };
# Line 1092  QuadMaskInfo FinleyElements::buildQuadMa Line 1194  QuadMaskInfo FinleyElements::buildQuadMa
1194              else              else
1195                  qmi.factor.push_back(hits);                  qmi.factor.push_back(hits);
1196          }          }
1197      } else if ((finleyTypeId == Hex27) || (finleyTypeId == Hex27Macro) ){      } else if ((finleyTypeId == Finley_Hex27) || (finleyTypeId == Finley_Hex27Macro) ){
1198          for (int i=0; i<elementFactor; i++) {          for (int i=0; i<elementFactor; i++) {
1199              const float bounds[][3] = {              const float bounds[][3] = {
1200                  { 0.25, 0.25, 0.25 }, { 0.75, 0.25, 0.25 },                  { 0.25, 0.25, 0.25 }, { 0.75, 0.25, 0.25 },

Legend:
Removed from v.3258  
changed lines
  Added in v.3259

  ViewVC Help
Powered by ViewVC 1.1.26