[cig-commits] r7716 - short/3D/PyLith/trunk/libsrc/bc
willic3 at geodynamics.org
willic3 at geodynamics.org
Thu Jul 19 14:26:34 PDT 2007
Author: willic3
Date: 2007-07-19 14:26:33 -0700 (Thu, 19 Jul 2007)
New Revision: 7716
Modified:
short/3D/PyLith/trunk/libsrc/bc/Neumann.cc
Log:
More updates of initialize. The basic stuff is there, but there are
probably a lot of C++ bugs.
Modified: short/3D/PyLith/trunk/libsrc/bc/Neumann.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/bc/Neumann.cc 2007-07-19 18:51:47 UTC (rev 7715)
+++ short/3D/PyLith/trunk/libsrc/bc/Neumann.cc 2007-07-19 21:26:33 UTC (rev 7716)
@@ -67,6 +67,7 @@
// Create section for traction vector in global coordinates
const int spaceDim = cs->spaceDim();
+ const int cellDim = _quadrature->cellDim();
const int numQuadPts = _quadrature->numQuadPts();
const int fiberDim = spaceDim * numQuadPts;
_tractionGlobal = new real_section_type(mesh->comm(), mesh->debug());
@@ -84,7 +85,7 @@
// Set up orientation information
const int orientationSize = spaceDim * spaceDim;
- double orientation[orientationSize];
+ double_array orientation(orientationSize);
const ALE::Obj<real_section_type>& coordinates =
mesh->getRealSection("coordinates");
@@ -92,31 +93,83 @@
// NEED TO SET NAMES BASED ON DIMENSION OF BOUNDARY
// 1-D problem = {'normal-traction'}
// 2-D problem = {'shear-traction', 'normal-traction'}
- // 3-D problem = {'horiz-shear-traction', 'vert-shear-traction', 'normal-traction'}
+ // 3-D problem = {'horiz-shear-traction', 'vert-shear-traction',
+ // 'normal-traction'}
_db->open();
- _db->queryVals((const char**) valueNames, numFixedDOF);
+ switch (spaceDim)
+ { // switch
+ case 1 : {
+ const char* valueNames[] = {"normal-traction"};
+ _db->queryVals(valueNames, 1);
+ break;
+ } // case 1
+ case 2 : {
+ const char* valueNames[] = {"shear-traction", "normal-traction"};
+ _db->queryVals(valueNames, 2);
+ break;
+ } // case 2
+ case 3 : {
+ const char* valueNames[] = {"horiz-shear-traction", "vert-shear-traction",
+ "normal-traction"};
+ _db->queryVals(valueNames, 3);
+ break;
+ } // case 3
+ default :
+ assert(0);
+ } // switch
// Loop over cells in boundary mesh, compute orientations, and then
// compute corresponding traction vector in global coordinates
// (store values in _tractionGlobal).
const Mesh::label_sequence::iterator cellsBegin = cells->begin();
const Mesh::label_sequence::iterator cellsEnd = cells->end();
+ double_array tractionDataLocal(spaceDim);
+ const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
+ const double_array& quadPtsRef = _quadrature->quadPtsRef();
+ double_array rotatedTraction[spaceDim*numQuadPts];
+
for(Mesh::label_sequence::iterator c_iter = cells->begin();
c_iter != cells->end();
++c_iter) {
_quadrature->computeGeometry(mesh, coordinates, *c_iter);
- for(int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+ mesh->restrict(coordinates, *c_iter, &cellVertices[0], cellVertices.size());
+ const double_array& quadPts = _quadrature->quadPts();
+ for(int iQuad = 0, iQ=iQuad*spaceDim; iQuad < numQuadPts; ++iQuad) {
// Get traction vector in local coordinate system at quadrature point
+ int err = _db->query(&tractionDataLocal[0], spaceDim, quadPts[iQ + iQuad],
+ spaceDim, cs);
+ // Compute Jacobian and determinant at quadrature point
+ double_array quadPt(&quadPtsRef[iQuad*cellDim], cellDim);
+ cellGeometry.jacobian(&jacobian, &jacobianDet, cellVertices, quadPt);
+
// Get orientation of boundary at quadrature point
- // Call restrict with cell to get face vertices
- // Compute Jacobian at quadrature point
- // Compute orientation using Jacobian
+ cellGeometry.orientation(&orientation, jacobian, jacobianDet, upDir);
+ // Normalize orientation
+ double sum;
+ double_array quadPtOrient(orientationSize);
+ for(int iDim = 0; iDim < spaceDim; ++iDim) {
+ sum = 0.0;
+ for(int jDim = 0, index=iDim*spaceDim; jDim < spaceDim; ++jDim)
+ sum += pow(orientation[index+jDim], 2);
+ sum =sqrt(sum);
+ assert(sum > 0.0);
+ for (int jDim=0, index=iDim*spaceDim; jDim < spaceDim; ++jDim)
+ quadPtOrient[index+jDim] = orientation[index+jDim] / sum;
+ } // for
+
// Rotate traction vector from local coordinate system to global
// coordinate system
+ for(int iDim = 0; iDim < spaceDim; ++iDim) {
+ sum = 0.0;
+ for(int jDim = 0, index=iDim*spaceDim; jDim < spaceDim; ++jDim)
+ sum += orientation[index+jDim] * tractionDataLocal[jDim];
+ rotatedTraction[iDim+iQ] = sum;
+ } // for
- // Store traction vector in global coordinate system
+ // Update tractionGlobal
+ _tractionGlobal->updateAddPoint(*c_iter, &rotatedTraction[0]);
} // for
} // for
More information about the cig-commits
mailing list