[cig-commits] r5859 - in long/3D/Gale/trunk: .
src/PICellerator/Utils/src
walter at geodynamics.org
walter at geodynamics.org
Mon Jan 22 15:35:32 PST 2007
Author: walter
Date: 2007-01-22 15:35:32 -0800 (Mon, 22 Jan 2007)
New Revision: 5859
Modified:
long/3D/Gale/trunk/
long/3D/Gale/trunk/src/PICellerator/Utils/src/StressBC.c
Log:
r1467 at earth: boo | 2007-01-22 15:30:53 -0800
Make stress boundaries work in 3D
Property changes on: long/3D/Gale/trunk
___________________________________________________________________
Name: svk:merge
- 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:1465
+ 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:1467
Modified: long/3D/Gale/trunk/src/PICellerator/Utils/src/StressBC.c
===================================================================
--- long/3D/Gale/trunk/src/PICellerator/Utils/src/StressBC.c 2007-01-22 22:51:36 UTC (rev 5858)
+++ long/3D/Gale/trunk/src/PICellerator/Utils/src/StressBC.c 2007-01-22 23:35:32 UTC (rev 5859)
@@ -322,6 +322,25 @@
_ForceTerm_Destroy( forceTerm, data );
}
+double cross(double *coord1, double *coord2, int normal)
+{
+ switch(normal)
+ {
+ case 0:
+ return coord1[1]*coord2[2]-coord1[2]*coord2[1];
+ break;
+ case 1:
+ return coord1[0]*coord2[2]-coord1[2]*coord2[0];
+ break;
+ case 2:
+ return coord1[0]*coord2[1]-coord1[1]*coord2[0];
+ break;
+ default:
+ printf("Bad call of cross() in StressBC\n");
+ abort();
+ }
+ return 0;
+}
void _StressBC_AssembleElement( void* forceTerm, ForceVector* forceVector, Element_LocalIndex lElement_I, double* elForceVec ) {
StressBC* self = (StressBC*) forceTerm;
@@ -382,51 +401,79 @@
else
{
double *coord1, *coord2, *coord3, *coord4;
- int lower,upper,direction;
+ int first, second, third, fourth, normal;
+
+
+ Mesh_GetIncidence(mesh, Mesh_GetDimSize(mesh), lElement_I,
+ MT_VERTEX,&elementNodeCount, &elementNodes);
+
+ /* StGermain uses the ordering
+ 0: x,y,z
+ 1: x+,y,z
+ 2: x,y+,z
+ 3: x+,y+,z
+ 4: x,y,z+
+ 5: x+,y,z+
+ 6: x,y+,z+
+ 7: x+,y+,z+
+ */
+
switch(self->_wall)
{
case StressBC_Wall_Left:
- lower=0;
- upper=3;
- direction=1;
+ first=0;
+ second=2;
+ third=6;
+ fourth=4;
+ normal=0;
break;
case StressBC_Wall_Right:
- lower=1;
- upper=2;
- direction=1;
+ first=1;
+ second=3;
+ third=7;
+ fourth=5;
+ normal=0;
break;
case StressBC_Wall_Bottom:
- lower=0;
- upper=1;
- direction=0;
+ first=0;
+ second=1;
+ third=5;
+ fourth=4;
+ normal=1;
break;
case StressBC_Wall_Top:
- lower=3;
- upper=2;
- direction=0;
+ first=2;
+ second=3;
+ third=7;
+ fourth=6;
+ normal=1;
break;
case StressBC_Wall_Front:
- lower=0;
- upper=3;
- direction=1;
+ first=0;
+ second=1;
+ third=4;
+ fourth=3;
+ normal=2;
break;
case StressBC_Wall_Back:
- lower=0;
- upper=3;
- direction=1;
+ first=4;
+ second=5;
+ third=7;
+ fourth=6;
+ normal=2;
break;
}
Mesh_GetIncidence(mesh, Mesh_GetDimSize(mesh), lElement_I,
MT_VERTEX,&elementNodeCount, &elementNodes);
- coord1=Mesh_GetVertex(mesh,elementNodes[lower]);
- coord2=Mesh_GetVertex(mesh,elementNodes[upper]);
- area=coord2[direction]-coord1[direction];
-
-
- printf("Need to implement area in StressBC.c for dim==3\n");
- assert(0);
+ coord1=Mesh_GetVertex(mesh,elementNodes[first]);
+ coord2=Mesh_GetVertex(mesh,elementNodes[second]);
+ coord3=Mesh_GetVertex(mesh,elementNodes[third]);
+ coord4=Mesh_GetVertex(mesh,elementNodes[fourth]);
+ area=fabs(cross(coord1,coord2,normal) + cross(coord2,coord3,normal)
+ + cross(coord3,coord4,normal)
+ + cross(coord4,coord1,normal))/2;
}
/* Apply the stress */
More information about the cig-commits
mailing list