[cig-commits] r6574 - in short/3D/PyLith/trunk: . libsrc
libsrc/faults unittests/libtests/faults
unittests/libtests/faults/data
brad at geodynamics.org
brad at geodynamics.org
Sun Apr 15 18:08:58 PDT 2007
Author: brad
Date: 2007-04-15 18:08:57 -0700 (Sun, 15 Apr 2007)
New Revision: 6574
Added:
short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/
short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am
short/3D/PyLith/trunk/unittests/libtests/faults/data/meshLine_orig.txt
short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTet4A_orig.txt
short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTri3A_orig.txt
Modified:
short/3D/PyLith/trunk/configure.ac
short/3D/PyLith/trunk/libsrc/Makefile.am
short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.cc
short/3D/PyLith/trunk/libsrc/faults/Makefile.am
short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.hh
Log:
Started work on testing creation of cohesive elements.
Modified: short/3D/PyLith/trunk/configure.ac
===================================================================
--- short/3D/PyLith/trunk/configure.ac 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/configure.ac 2007-04-16 01:08:57 UTC (rev 6574)
@@ -162,6 +162,7 @@
unittests/Makefile
unittests/libtests/Makefile
unittests/libtests/faults/Makefile
+ unittests/libtests/faults/data/Makefile
unittests/libtests/feassemble/Makefile
unittests/libtests/materials/Makefile
unittests/libtests/materials/data/Makefile
Modified: short/3D/PyLith/trunk/libsrc/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/Makefile.am 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/libsrc/Makefile.am 2007-04-16 01:08:57 UTC (rev 6574)
@@ -21,6 +21,7 @@
lib_LTLIBRARIES = libpylith.la
libpylith_la_SOURCES = \
+ faults/CohesiveTopology.cc \
faults/Fault.cc \
faults/FaultCohesive.cc \
faults/FaultCohesiveKin.cc \
Added: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,247 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "CohesiveTopology.hh" // implementation of object methods
+
+#include "pylith/utils/sievetypes.hh" // USES PETSc Mesh
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::CohesiveTopology::create(const ALE::Obj<Mesh>& mesh,
+ const std::set<Mesh::point_type>& faultVertices)
+{ // create
+ typedef std::vector<Mesh::point_type> PointArray;
+
+ const ALE::Obj<sieve_type>& sieve = mesh->getSieve();
+ const ALE::Obj<Mesh> fault = new Mesh(mesh->comm(), mesh->debug());
+ const ALE::Obj<sieve_type> faultSieve = new sieve_type(sieve->comm(),
+ sieve->debug());
+ const std::set<Mesh::point_type>::const_iterator fvBegin =
+ faultVertices.begin();
+ const std::set<Mesh::point_type>::const_iterator fvEnd =
+ faultVertices.end();
+
+ // There should be logic here to determine this
+ int f = 0;
+ int debug = mesh->debug();
+ ALE::Obj<PointArray> face = new PointArray();
+ std::set<Mesh::point_type> faultCells;
+
+ // Create a sieve which captures the fault
+ for(std::set<int>::const_iterator fv_iter = fvBegin;
+ fv_iter != fvEnd;
+ ++fv_iter) {
+ const ALE::Obj<sieve_type::traits::supportSequence>& cells =
+ sieve->support(*fv_iter);
+ const sieve_type::traits::supportSequence::iterator cBegin =
+ cells->begin();
+ const sieve_type::traits::supportSequence::iterator cEnd =
+ cells->end();
+
+ if (debug)
+ std::cout << "Checking fault vertex " << *fv_iter << std::endl;
+ for(sieve_type::traits::supportSequence::iterator c_iter = cBegin;
+ c_iter != cEnd;
+ ++c_iter) {
+ const unsigned int faceSize = 3; //_numFaceVertices(*c_iter, mesh);
+
+ if (debug)
+ std::cout << " Checking cell " << *c_iter << std::endl;
+ if (faultCells.find(*c_iter) != faultCells.end())
+ continue;
+ const ALE::Obj<sieve_type::traits::coneSequence>& cone =
+ sieve->cone(*c_iter);
+ const sieve_type::traits::coneSequence::iterator vBegin = cone->begin();
+ const sieve_type::traits::coneSequence::iterator vEnd = cone->end();
+
+ face->clear();
+ for(sieve_type::traits::coneSequence::iterator v_iter = vBegin;
+ v_iter != vEnd;
+ ++v_iter) {
+ if (faultVertices.find(*v_iter) != fvEnd) {
+ if (debug)
+ std::cout << " contains fault vertex " << *v_iter << std::endl;
+ face->insert(face->end(), *v_iter);
+ } // if
+ } // for
+ if (face->size() > faceSize)
+ throw ALE::Exception("Invalid fault mesh: Too many vertices of an "
+ "element on the fault");
+ if (face->size() == faceSize) {
+ if (debug)
+ std::cout << " Contains a face on the fault" << std::endl;
+ const ALE::Obj<sieve_type::supportSet> preFace =
+ faultSieve->nJoin1(face);
+
+ if (preFace->size() > 1)
+ throw ALE::Exception("Invalid fault sieve: Multiple faces from "
+ "vertex set");
+ else if (preFace->size() == 1)
+ faultSieve->addArrow(*preFace->begin(), *c_iter);
+ else if (preFace->size() == 0) {
+ if (debug)
+ std::cout << " Adding face " << f << std::endl;
+ int color = 0;
+ for(PointArray::const_iterator f_iter = face->begin();
+ f_iter != face->end();
+ ++f_iter) {
+ if (debug)
+ std::cout << " vertex " << *f_iter << std::endl;
+ faultSieve->addArrow(*f_iter, f, color++);
+ } // for
+ faultSieve->addArrow(f, *c_iter);
+ f++;
+ } // if/else
+ faultCells.insert(*c_iter);
+ } // if
+ } // for
+ } // for
+ fault->setSieve(faultSieve);
+ fault->stratify();
+ faultCells.clear();
+ if (debug)
+ fault->view("Fault mesh");
+
+ // Add new shadow vertices
+ const ALE::Obj<Mesh::label_sequence>& fVertices = fault->depthStratum(0);
+ const ALE::Obj<Mesh::label_sequence>& vertices = mesh->depthStratum(0);
+ Mesh::point_type newVertex = *vertices->begin() + vertices->size();
+ std::map<int,int> vertexRenumber;
+
+ for(Mesh::label_sequence::iterator v_iter = fVertices->begin();
+ v_iter != fVertices->end();
+ ++v_iter) {
+ if (debug)
+ std::cout << "Duplicating " << *v_iter << " to "
+ << vertexRenumber[*v_iter] << std::endl;
+ vertexRenumber[*v_iter] = newVertex++;
+ } // for
+
+ // Split the mesh along the fault sieve and create cohesive elements
+ const ALE::Obj<Mesh::label_sequence>& faces = fault->depthStratum(1);
+ PointArray newVertices;
+
+ for(Mesh::label_sequence::iterator f_iter = faces->begin();
+ f_iter != faces->end();
+ ++f_iter) {
+ if (debug)
+ std::cout << "Considering fault face " << *f_iter << std::endl;
+ const ALE::Obj<sieve_type::traits::supportSequence>& cells =
+ faultSieve->support(*f_iter);
+ Mesh::point_type cell = std::max(*cells->begin(), *(++cells->begin()));
+ const ALE::Obj<sieve_type::traits::coneSequence>& cone = sieve->cone(cell);
+
+ if (debug)
+ std::cout << " Replacing cell " << cell << std::endl;
+ newVertices.clear();
+ for(sieve_type::traits::coneSequence::iterator v_iter = cone->begin();
+ v_iter != cone->end();
+ ++v_iter) {
+ if (vertexRenumber.find(*v_iter) != vertexRenumber.end()) {
+ if (debug)
+ std::cout << " vertex " << vertexRenumber[*v_iter] << std::endl;
+ newVertices.insert(newVertices.end(), vertexRenumber[*v_iter]);
+ } else {
+ if (debug)
+ std::cout << " vertex " << *v_iter << std::endl;
+ newVertices.insert(newVertices.end(), *v_iter);
+ } // if/else
+ } // for
+ sieve->clearCone(cell);
+ int color = 0;
+ for(PointArray::const_iterator v_iter = newVertices.begin();
+ v_iter != newVertices.end();
+ ++v_iter) {
+ sieve->addArrow(*v_iter, cell, color++);
+ } // for
+ } // for
+
+ // Fix coordinates
+ const ALE::Obj<real_section_type>& coordinates =
+ mesh->getRealSection("coordinates");
+ const ALE::Obj<Mesh::label_sequence>& fVertices2 = fault->depthStratum(0);
+
+ for(Mesh::label_sequence::iterator v_iter = fVertices2->begin();
+ v_iter != fVertices2->end();
+ ++v_iter) {
+ coordinates->addPoint(vertexRenumber[*v_iter],
+ coordinates->getFiberDimension(*v_iter));
+ } // for
+ mesh->reallocate(coordinates);
+ for(Mesh::label_sequence::iterator v_iter = fVertices2->begin();
+ v_iter != fVertices2->end();
+ ++v_iter)
+ coordinates->updatePoint(vertexRenumber[*v_iter],
+ coordinates->restrictPoint(*v_iter));
+
+} // createCohesiveCells
+
+// ----------------------------------------------------------------------
+unsigned int
+pylith::faults::CohesiveTopology::_numFaceVertices(const Mesh::point_type& cell,
+ const ALE::Obj<Mesh>& mesh)
+{ // _numFaceVertices
+
+ /** :QUESTION:
+ *
+ * If mesh is interpolated is there a simple way to get the number
+ * of vertices on the face (3-D), edge (2-D), end (1-D) of a cell?
+ */
+ const int cellDim = mesh->getDimension();
+
+ const ALE::Obj<sieve_type>& sieve = mesh->getSieve();
+ unsigned int numCorners = sieve->nCone(cell, mesh->depth())->size();
+
+ unsigned int numFaceVertices = 0;
+ switch (cellDim)
+ { // switch
+ case 1 :
+ numFaceVertices = 1;
+ break;
+ case 2:
+ switch (numCorners)
+ { // switch
+ case 3 : // tri3
+ numFaceVertices = 2; // Edge has 2 vertices
+ break;
+ case 4 : // quad4
+ numFaceVertices = 2; // Edge has 2 vertices
+ break;
+ default :
+ std::cerr << "numCorners: " << numCorners << std::endl;
+ assert(0);
+ } // switch
+ break;
+ case 3:
+ switch (numCorners)
+ { // switch
+ case 4 : // tet4
+ numFaceVertices = 3; // Face has 3 vertices
+ break;
+ case 8 : // hex8
+ numFaceVertices = 4; // Face has 4 vertices
+ break;
+ default :
+ std::cerr << "numCorners: " << numCorners << std::endl;
+ assert(0);
+ } // switch
+ break;
+ default:
+ assert(0);
+ } // swtich
+ return numFaceVertices;
+} // _numFaceVertices
+
+
+// End of file
Added: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/faults/CohesiveTopology.hh
+ *
+ * @brief C++ object to manage creation of cohesive cells.
+ */
+
+#if !defined(pylith_faults_cohesivetopology_hh)
+#define pylith_faults_cohesivetopology_hh
+
+#include "pylith/utils/sievetypes.hh" // USES PETSc Mesh
+
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class CohesiveTopology;
+ } // faults
+} // pylith
+
+/// C++ object to manage creation of cohesive cells.
+class pylith::faults::CohesiveTopology
+{ // class Fault
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /** Create cohesive cells.
+ *
+ * @param mesh Finite-element mesh
+ * @param faultVertices Vertices assocated with faces of cells defining
+ * fault surface
+ */
+ static
+ void create(const ALE::Obj<Mesh>& mesh,
+ const std::set<Mesh::point_type>& faultVertices);
+
+ // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+ /** Get number of vertices on face.
+ *
+ * @param cell Finite-element cell
+ * @param mesh Finite-element mesh
+ *
+ * @returns Number of vertices on cell face
+ */
+ static
+ unsigned int _numFaceVertices(const Mesh::point_type& cell,
+ const ALE::Obj<Mesh>& mesh);
+
+}; // class CohesiveTopology
+
+#endif // pylith_faults_cohesivetopology_hh
+
+
+// End of file
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.cc 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.cc 2007-04-16 01:08:57 UTC (rev 6574)
@@ -14,8 +14,9 @@
#include "FaultCohesive.hh" // implementation of object methods
+#include "CohesiveTopology.hh" // USES CohesiveTopology::create()
+
#include "pylith/utils/sievetypes.hh" // USES PETSc Mesh
-#include "src/dm/mesh/meshpylith.h" // USES ALE::PyLith::Builder
#include <assert.h> // USES assert()
#include <sstream> // USES std::ostringstream
@@ -72,7 +73,7 @@
assert(!numbering.isNull());
points.insert(numbering->getIndex(*c_iter)+numCells);
} // for
- ALE::PyLith::Builder::createCohesiveElements(*mesh, points);
+ CohesiveTopology::create(*mesh, points);
} // adjustTopology
Modified: short/3D/PyLith/trunk/libsrc/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/Makefile.am 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/libsrc/faults/Makefile.am 2007-04-16 01:08:57 UTC (rev 6574)
@@ -14,6 +14,7 @@
include $(top_srcdir)/subpackage.am
subpkginclude_HEADERS = \
+ CohesiveTopology.hh \
Fault.hh \
Fault.icc \
FaultCohesive.hh \
Modified: short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am 2007-04-16 01:08:57 UTC (rev 6574)
@@ -13,7 +13,7 @@
subpackage = faults
include $(top_srcdir)/subpackage.am
-#SUBDIRS = data
+SUBDIRS = data
TESTS = testfaults
Modified: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.cc 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.cc 2007-04-16 01:08:57 UTC (rev 6574)
@@ -19,7 +19,10 @@
#include "pylith/faults/FaultCohesiveKin.hh" // USES FaultsCohesiveKin
#include "pylith/utils/sievetypes.hh" // USES PETSc Mesh
+#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
+#include <stdexcept> // TEMPORARY
+
// ----------------------------------------------------------------------
CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesive );
@@ -28,29 +31,30 @@
void
pylith::faults::TestFaultCohesive::testAdjustTopologyLine(void)
{ // testAdjustTopologyLine
- //FaultDataLine data;
- //_testAdjustTopologyLine(data);
+ const char* filename = "data/meshTet4A_orig.txt";
+ _testAdjustTopology(filename);
} // testAdjustTopologyLine
// ----------------------------------------------------------------------
// Test adjustTopology().
void
-pylith::faults::TestFaultCohesive::_testAdjustTopologyLine(
- const FaultData& data)
-{ // _testAdjustTopologyLine
- //ALE::Obj<ALE::Mesh> mesh(new ALE::Mesh);
- //_createMesh(&mesh, data);
+pylith::faults::TestFaultCohesive::_testAdjustTopology(const char* filename)
+{ // _testAdjustTopology
+ ALE::Obj<ALE::Mesh> mesh;
+ meshio::MeshIOAscii iohandler;
+ iohandler.filename(filename);
+ iohandler.debug(true);
+ iohandler.interpolate(true);
+ iohandler.read(&mesh);
FaultCohesiveKin fault;
-} // _testAdjustTopologyLine
+ fault.id(0);
+ fault.label("fault");
+ fault.adjustTopology(&mesh);
-// ----------------------------------------------------------------------
-// Create mesh.
-void
-pylith::faults::TestFaultCohesive::_createMesh(ALE::Obj<ALE::Mesh>* mesh,
- const FaultData& data)
-{ // _createMesh
-} // _createMesh
+ mesh->view("Mesh");
+ throw std::logic_error("Unit test not fully implemented.");
+} // _testAdjustTopology
// End of file
Modified: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.hh 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesive.hh 2007-04-16 01:08:57 UTC (rev 6574)
@@ -53,12 +53,8 @@
public :
/// Test adjustTopology().
- void _testAdjustTopologyLine(const FaultData& data);
+ void _testAdjustTopology(const char* filename);
- /// Create mesh.
- void _createMesh(ALE::Obj<ALE::Mesh>* mesh,
- const FaultData& data);
-
}; // class TestFaultCohesive
#endif // pylith_faults_testfaultcohesive_hh
Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,32 @@
+# -*- Makefile -*-
+#
+# ----------------------------------------------------------------------
+#
+# Brad T. Aagaard
+# U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+noinst_DATA = \
+ meshLine_orig.txt \
+ meshTri3A_orig.txt \
+ meshTet4A_orig.txt
+
+noinst_TMP =
+
+# 'export' the input files by performing a mock install
+export_datadir = $(top_builddir)/unittests/libtests/faults/data
+export-data: $(noinst_DATA)
+ for f in $(noinst_DATA); do $(install_sh_DATA) $(srcdir)/$$f $(export_datadir); done
+
+BUILT_SOURCES = export-data
+
+CLEANFILES = \
+ $(export_datadir)/$(noinst_DATA) \
+ $(export_datadir)/$(noinst_TMP)
+
+
+# End of file
Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/meshLine_orig.txt
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/meshLine_orig.txt 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/meshLine_orig.txt 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,33 @@
+mesh = {
+ dimension = 1
+ use-index-zero = true
+ vertices = {
+ dimension = 1
+ count = 3
+ coordinates = {
+ 0 -1.0
+ 1 0.0
+ 2 1.0
+ }
+ }
+ cells = {
+ count = 2
+ num-corners = 2
+ simplices = {
+ 0 0 1
+ 1 1 2
+ }
+ material-ids = {
+ 0 0
+ 1 0
+ }
+ }
+ group = {
+ name = fault
+ type = vertices
+ count = 1
+ indices = {
+ 1
+ }
+ }
+}
Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTet4A_orig.txt
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTet4A_orig.txt 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTet4A_orig.txt 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,37 @@
+mesh = {
+ dimension = 3
+ use-index-zero = true
+ vertices = {
+ dimension = 3
+ count = 5
+ coordinates = {
+ 0 -1.0 0.0 0.0
+ 1 0.0 -1.0 0.0
+ 2 0.0 0.0 1.0
+ 3 0.0 1.0 0.0
+ 4 1.0 0.0 0.0
+ }
+ }
+ cells = {
+ count = 2
+ num-corners = 4
+ simplices = {
+ 0 1 2 3 0
+ 1 1 3 2 4
+ }
+ material-ids = {
+ 0 0
+ 1 0
+ }
+ }
+ group = {
+ name = fault
+ type = vertices
+ count = 3
+ indices = {
+ 1
+ 2
+ 3
+ }
+ }
+}
Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTri3A_orig.txt
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTri3A_orig.txt 2007-04-15 01:36:53 UTC (rev 6573)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/meshTri3A_orig.txt 2007-04-16 01:08:57 UTC (rev 6574)
@@ -0,0 +1,35 @@
+mesh = {
+ dimension = 2
+ use-index-zero = true
+ vertices = {
+ dimension = 2
+ count = 4
+ coordinates = {
+ 0 -1.0 0.0
+ 1 0.0 1.0
+ 2 0.0 -1.0
+ 2 1.0 0.0
+ }
+ }
+ cells = {
+ count = 2
+ num-corners = 3
+ simplices = {
+ 0 0 2 1
+ 1 1 2 3
+ }
+ material-ids = {
+ 0 0
+ 1 0
+ }
+ }
+ group = {
+ name = fault
+ type = vertices
+ count = 2
+ indices = {
+ 1
+ 2
+ }
+ }
+}
More information about the cig-commits
mailing list