[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