[cig-commits] r7062 - in short/3D/PyLith/trunk: . libsrc/bc unittests/libtests/bc unittests/libtests/bc/data

brad at geodynamics.org brad at geodynamics.org
Mon Jun 4 16:12:56 PDT 2007


Author: brad
Date: 2007-06-04 16:12:56 -0700 (Mon, 04 Jun 2007)
New Revision: 7062

Modified:
   short/3D/PyLith/trunk/TODO
   short/3D/PyLith/trunk/libsrc/bc/Dirichlet.cc
   short/3D/PyLith/trunk/libsrc/bc/Dirichlet.hh
   short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichlet.cc
   short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichletMulti.cc
   short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.cc
   short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.hh
   short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3.mesh
   short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3_b.spatialdb
Log:
Updated Dirichlet boundary conditions to allow multiple (non-conflicting) constraints (i.e., overlap of boundary conditions). Updated unit tests accordingly.

Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/TODO	2007-06-04 23:12:56 UTC (rev 7062)
@@ -2,9 +2,6 @@
 MAIN PRIORITIES (Brad)
 ======================================================================
 
-Update Dirichlet BC to allow mixing different Dirichlet BC for the
-same points.
-
 1. Simple tests with analytical solutions
 
    b. 2-D

Modified: short/3D/PyLith/trunk/libsrc/bc/Dirichlet.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/bc/Dirichlet.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/libsrc/bc/Dirichlet.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -120,8 +120,11 @@
     return;
 
   const int numPoints = _points.size();
-  for (int iPoint=0; iPoint < numPoints; ++iPoint)
-    field->setConstraintDimension(_points[iPoint], numFixedDOF);
+  _offsetLocal.resize(numPoints);
+  for (int iPoint=0; iPoint < numPoints; ++iPoint) {
+    _offsetLocal[iPoint] = field->getConstraintDimension(_points[iPoint]);
+    field->addConstraintDimension(_points[iPoint], numFixedDOF);
+  } // for
 } // setConstraintSizes
 
 // ----------------------------------------------------------------------
@@ -138,8 +141,15 @@
     return;
 
   const int numPoints = _points.size();
-  for (int iPoint=0; iPoint < numPoints; ++iPoint)
-    field->setConstraintDof(_points[iPoint], &_fixedDOF[0]);
+  for (int iPoint=0; iPoint < numPoints; ++iPoint) {
+    const Mesh::point_type point = _points[iPoint];
+    const int* curFixedDOF = field->getConstraintDof(point);
+    const int numTotalConstrained = field->getConstraintDimension(point);
+    int_array allFixedDOF(curFixedDOF, numTotalConstrained);
+    for (int iDOF=0; iDOF < numFixedDOF; ++iDOF)
+      allFixedDOF[_offsetLocal[iPoint]+iDOF] = _fixedDOF[iDOF];
+    field->setConstraintDof(point, &allFixedDOF[0]);
+  } // for
 } // setConstraints
 
 // ----------------------------------------------------------------------
@@ -157,8 +167,15 @@
     return;
 
   const int numPoints = _points.size();
-  for (int iPoint=0, i=0; iPoint < numPoints; ++iPoint, i+=numFixedDOF)
-    field->updatePointBC(_points[iPoint], &_values[i]);
+  for (int iPoint=0, i=0; iPoint < numPoints; ++iPoint) {
+    const Mesh::point_type point = _points[iPoint];
+    const int fiberDimension = field->getFiberDimension(point);
+    double_array allValues(fiberDimension);
+    mesh->restrict(field, point, &allValues[0], fiberDimension);
+    for (int iDOF=0; iDOF < numFixedDOF; ++iDOF)
+      allValues[_fixedDOF[iDOF]] = _values[i++];
+    field->updatePointAll(_points[iPoint], &allValues[0]);
+  } // for
 } // setField
 
 

Modified: short/3D/PyLith/trunk/libsrc/bc/Dirichlet.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/bc/Dirichlet.hh	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/libsrc/bc/Dirichlet.hh	2007-06-04 23:12:56 UTC (rev 7062)
@@ -109,6 +109,10 @@
   double_array _values; ///< Values at degrees of freedom
   int_array _fixedDOF; ///< Indices of fixed degrees of freedom
 
+  /// Offset in list of fixed DOF at point to get to fixed DOF
+  /// associated with this Dirichlet boundary condition.
+  int_array _offsetLocal;
+
 }; // class Dirichlet
 
 #include "Dirichlet.icc" // inline methods

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichlet.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichlet.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichlet.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -192,6 +192,19 @@
   const double t = 1.0;
   bc.setField(t, field, mesh);
 
+  // Create list of unconstrained DOF at constrained DOF
+  const int numFreeDOF = _data->numDOF - _data->numFixedDOF;
+  int_array freeDOF(numFreeDOF);
+  int index = 0;
+  for (int iDOF=0; iDOF < _data->numDOF; ++iDOF) {
+    bool free = true;
+    for (int iFixed=0; iFixed < _data->numFixedDOF; ++iFixed)
+      if (iDOF == _data->fixedDOF[iFixed])
+	free = false;
+    if (free)
+      freeDOF[index] = iDOF;
+  } // for
+
   const int numCells = mesh->heightStratum(0)->size();
   const int offset = numCells;
   const int numFixedDOF = _data->numFixedDOF;
@@ -202,21 +215,24 @@
     const int fiberDim = field->getFiberDimension(*v_iter);
     const real_section_type::value_type* values = 
       mesh->restrict(field, *v_iter);
+
     if (*v_iter != _data->constrainedPoints[iConstraint] + offset) {
+      // unconstrained point
       for (int i=0; i < fiberDim; ++i)
 	CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, values[i], tolerance);
     } else {
-      int iiConstraint = 0;
-      for (int i=0; i < fiberDim; ++i) {
-	if (i == _data->fixedDOF[iiConstraint]) {
-	  const int index = iConstraint * numFixedDOF + iiConstraint;
-	  CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->values[index],
-				       values[i],
-				       tolerance);
-	  ++iiConstraint;
-	} else {
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, values[i], tolerance);
-	} // if/else
+      // constrained point
+
+      // check unconstrained DOF
+      for (int iDOF=0; iDOF < numFreeDOF; ++iDOF)
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, values[freeDOF[iDOF]], tolerance);
+
+      // check constrained DOF
+      for (int iDOF=0; iDOF < numFixedDOF; ++iDOF) {
+	const int index = iConstraint * numFixedDOF + iDOF;
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->values[index],
+				     values[_data->fixedDOF[iDOF]],
+				     tolerance);
       } // for
       ++iConstraint;
     } // if/else

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichletMulti.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichletMulti.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/TestDirichletMulti.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -49,16 +49,8 @@
        ++v_iter) {
     CPPUNIT_ASSERT_EQUAL(_data->numDOF, field->getFiberDimension(*v_iter));
     
-    const int flag = _data->bcFlags[*v_iter-offset];
-    if (-1 == flag)
-      // no constraints
-      CPPUNIT_ASSERT_EQUAL(0, field->getConstraintDimension(*v_iter));
-    else if (0 == flag) 
-      CPPUNIT_ASSERT_EQUAL(_data->numFixedDOFA, 
-			   field->getConstraintDimension(*v_iter));
-    else if (1 == flag)
-      CPPUNIT_ASSERT_EQUAL(_data->numFixedDOFB,
-			   field->getConstraintDimension(*v_iter));
+    CPPUNIT_ASSERT_EQUAL(_data->constraintSizes[*v_iter-offset],
+			 field->getConstraintDimension(*v_iter));
   } // for
 } // testSetConstraintSizes
 
@@ -85,29 +77,16 @@
 
   const int numCells = mesh->heightStratum(0)->size();
   const int offset = numCells;
+  int index = 0;
   for (Mesh::label_sequence::iterator v_iter = vertices->begin();
        v_iter != vertices->end();
        ++v_iter) {
-    const int* fixedDOF = field->getConstraintDof(*v_iter);
-    
-    const int flag = _data->bcFlags[*v_iter-offset];
-    if (-1 == flag) {
-      // no constraints
-      CPPUNIT_ASSERT_EQUAL(0, field->getConstraintDimension(*v_iter));
-      //CPPUNIT_ASSERT(0 == fixedDOF);
-    } else if (0 == flag) {
-      CPPUNIT_ASSERT(0 != fixedDOF);
-      CPPUNIT_ASSERT_EQUAL(_data->numFixedDOFA, 
-			   field->getConstraintDimension(*v_iter));
-      for (int iDOF=0; iDOF < _data->numFixedDOFA; ++iDOF)
-	CPPUNIT_ASSERT_EQUAL(_data->fixedDOFA[iDOF], fixedDOF[iDOF]);
-    } else if (1 == flag) {
-      CPPUNIT_ASSERT(0 != fixedDOF);
-      CPPUNIT_ASSERT_EQUAL(_data->numFixedDOFB, 
-			   field->getConstraintDimension(*v_iter));
-      for (int iDOF=0; iDOF < _data->numFixedDOFB; ++iDOF)
-	CPPUNIT_ASSERT_EQUAL(_data->fixedDOFB[iDOF], fixedDOF[iDOF]);
-    } // if/else
+    const int numConstrainedDOF = _data->constraintSizes[*v_iter-offset];
+    if (numConstrainedDOF > 0) {
+      const int* fixedDOF = field->getConstraintDof(*v_iter);
+      for (int iDOF=0; iDOF < numConstrainedDOF; ++iDOF)
+	CPPUNIT_ASSERT_EQUAL(_data->constrainedDOF[index++], fixedDOF[iDOF]);
+    } // if
   } // for
 } // testSetConstraints
 

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -33,7 +33,8 @@
   valuesB(0),
   dbFilenameB(0),
   field(0),
-  bcFlags(0),
+  constraintSizes(0),
+  constrainedDOF(0),
   meshFilename(0)
 { // constructor
 } // constructor

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.hh	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMulti.hh	2007-06-04 23:12:56 UTC (rev 7062)
@@ -59,7 +59,8 @@
   //@}
 
   double* field; ///< Values in field
-  int* bcFlags; ///< Flags indicating if point is associated with BC
+  int* constraintSizes; ///< Number of constrained DOF at each vertex
+  int* constrainedDOF; ///< Indices of constrained DOF at each constrained vertex
 
   char* meshFilename; ///< Filename for input mesh.
 };

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -20,12 +20,13 @@
  *   1: 0.3
  *   3: 0.7
  *
- * Dirichlet BC B at vertex 0
+ * Dirichlet BC B at vertex 0 and 3.
  *
  * Fixed DOF: { 0 }
  *
  * Values
  *   0: 0.9
+ *   3: 0.5
  */
 
 #include "DirichletDataMultiTri3.hh"
@@ -47,22 +48,31 @@
 const int pylith::bc::DirichletDataMultiTri3::_numFixedDOFB = 1;
 const int pylith::bc::DirichletDataMultiTri3::_fixedDOFB[] = { 0 };
 const int pylith::bc::DirichletDataMultiTri3::_numConstrainedPtsB = 1;
-const int pylith::bc::DirichletDataMultiTri3::_constrainedPointsB[] = { 0 };
-const double pylith::bc::DirichletDataMultiTri3::_valuesB[] = { 0.9 };
+const int pylith::bc::DirichletDataMultiTri3::_constrainedPointsB[] = { 0, 3 };
+const double pylith::bc::DirichletDataMultiTri3::_valuesB[] = { 0.9, 0.5 };
 const char* pylith::bc::DirichletDataMultiTri3::_dbFilenameB =
   "data/tri3_b.spatialdb";
 
+const int pylith::bc::DirichletDataMultiTri3::_constraintSizes[] = {
+  1,
+  1,
+  0,
+  2
+};
+
+const int pylith::bc::DirichletDataMultiTri3::_constrainedDOF[] = {
+  0, 
+  1,
+  1, 0
+};
+
 const double pylith::bc::DirichletDataMultiTri3::_field[] = {
   0.9, 0.0,
   0.0, 0.3,
   0.0, 0.0,
-  0.0, 0.7
+  0.5, 0.7
 };
 
-const int pylith::bc::DirichletDataMultiTri3::_bcFlags[] = {
-  1, 0, -1, 0
-};
-
 const char* pylith::bc::DirichletDataMultiTri3::_meshFilename = 
   "data/tri3.mesh";
 
@@ -89,7 +99,8 @@
   dbFilenameB = const_cast<char*>(_dbFilenameB);
 
   field = const_cast<double*>(_field);
-  bcFlags = const_cast<int*>(_bcFlags);
+  constraintSizes = const_cast<int*>(_constraintSizes);
+  constrainedDOF = const_cast<int*>(_constrainedDOF);
 
   meshFilename = const_cast<char*>(_meshFilename);
 } // constructor

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.hh	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataMultiTri3.hh	2007-06-04 23:12:56 UTC (rev 7062)
@@ -57,7 +57,9 @@
   static const char* _dbFilenameB; ///< Filename of simple spatial database.
 
   static const double _field[]; ///< Values in field
-  static const int _bcFlags[]; ///< Flags indicating if point is associated with BC
+  static const int _constraintSizes[]; ///< Number of constrained DOF at each vertex
+  static const int _constrainedDOF[]; ///< Indices of constrained DOF at each constrained vertex
+
   static const char* _meshFilename; ///< Filename of input mesh.
 };
 

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataQuad4.cc	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/DirichletDataQuad4.cc	2007-06-04 23:12:56 UTC (rev 7062)
@@ -30,12 +30,12 @@
 
 const int pylith::bc::DirichletDataQuad4::_numDOF = 2;
 const int pylith::bc::DirichletDataQuad4::_numFixedDOF = 2;
-const int pylith::bc::DirichletDataQuad4::_fixedDOF[] = { 0, 1 };
+const int pylith::bc::DirichletDataQuad4::_fixedDOF[] = { 1, 0 };
 
 const int pylith::bc::DirichletDataQuad4::_numConstrainedPts = 3;
 const int pylith::bc::DirichletDataQuad4::_constrainedPoints[] = { 0, 1, 4 };
 const double pylith::bc::DirichletDataQuad4::_values[] =
-  { 0.1, 0.6, 0.5, 0.3, 0.4, 0.2 };
+  { 0.6, 0.1, 0.3, 0.5, 0.2, 0.4 };
 
 const char* pylith::bc::DirichletDataQuad4::_meshFilename = 
   "data/quad4.mesh";

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3.mesh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3.mesh	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3.mesh	2007-06-04 23:12:56 UTC (rev 7062)
@@ -34,9 +34,9 @@
   group = {
     name = bc2
     type = vertices
-    count = 1
+    count = 2
     indices = {
-      0
+      0  3
     }
   }
 }

Modified: short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3_b.spatialdb
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3_b.spatialdb	2007-06-04 20:57:09 UTC (rev 7061)
+++ short/3D/PyLith/trunk/unittests/libtests/bc/data/tri3_b.spatialdb	2007-06-04 23:12:56 UTC (rev 7062)
@@ -3,12 +3,13 @@
   num-values = 1
   value-names =  dof-0
   value-units =  m
-  num-locs = 1
-  data-dim = 0
+  num-locs = 2
+  data-dim = 1
   space-dim = 2
   cs-data = cartesian {
     to-meters = 1.0
     space-dim = 2
   }
 }
- 0.0  0.0  0.9
+-1.0  0.0  0.9
+ 1.0  0.0  0.5



More information about the cig-commits mailing list