[cig-commits] commit:
Mercurial
hg at geodynamics.org
Mon Nov 24 11:59:33 PST 2008
changeset: 151:ad4842c3da58
user: LukeHodkinson
date: Sun Aug 31 07:05:39 2008 +0000
files: Utils/src/RegularRemesher.c Utils/src/RegularRemesher.def Utils/src/RegularRemesherCmpt.c
description:
Adding some code to perform simple diffusion on
the upper surface of a mesh. This helps when there
are nasty conditions happening in the corners
of compression models.
diff -r 1a93c33c1f42 -r ad4842c3da58 Utils/src/RegularRemesher.c
--- a/Utils/src/RegularRemesher.c Fri Aug 29 16:44:16 2008 +0000
+++ b/Utils/src/RegularRemesher.c Sun Aug 31 07:05:39 2008 +0000
@@ -124,6 +124,73 @@ void _RegularRemesher_Remesh( void* _sel
nVerts = Mesh_GetLocalSize( mesh, 0 );
vGrid = *Mesh_GetExtension( mesh, Grid**, "vertexGrid" );
inds = Class_Array( self, int, nDims );
+
+ /* Meddle with the top right corner. */
+ if( self->diffuseCorners ) {
+ int nodeIndex, innerIndex, inner2Index;
+ double grad, *nodeVert, *innerVert, *inner2Vert;
+
+ inds[0] = vGrid->sizes[0] - 1;
+ inds[1] = vGrid->sizes[1] - 1;
+ nodeIndex = Grid_Project( vGrid, inds );
+ nodeVert = Mesh_GetVertex( mesh, nodeIndex );
+ inds[0]--;
+ innerIndex = Grid_Project( vGrid, inds );
+ innerVert = Mesh_GetVertex( mesh, innerIndex );
+ inds[0]--;
+ inner2Index = Grid_Project( vGrid, inds );
+ inner2Vert = Mesh_GetVertex( mesh, inner2Index );
+
+/*
+ grad = (innerVert[1] - inner2Vert[1]) / (innerVert[0] - inner2Vert[0]);
+ nodeVert[1] = innerVert[1] + grad * (innerVert[1] - nodeVert[1]);
+*/
+ nodeVert[1] = innerVert[1] - (inner2Vert[1] - innerVert[1]);
+ }
+ else if( self->diffuseSurface ) {
+ int nodeIndex, inds[2];
+ double *newHeights, sep, d, dt;
+ int ii;
+
+ newHeights = AllocArray( double, vGrid->sizes[0] );
+ d = self->diffusionCoef;
+ dt = self->ctx->dt;
+
+ inds[1] = vGrid->sizes[1] - 1;
+ inds[0] = 0;
+ nodeIndex = Grid_Project( vGrid, inds );
+ sep = Mesh_GetVertex( mesh, nodeIndex + 1 )[0] - Mesh_GetVertex( mesh, nodeIndex )[0];
+ newHeights[0] = Mesh_GetVertex( mesh, nodeIndex )[1] -
+ 2.0 * Mesh_GetVertex( mesh, nodeIndex + 1 )[1] +
+ Mesh_GetVertex( mesh, nodeIndex + 2 )[1];
+ newHeights[0] /= sep * sep;
+ newHeights[0] *= -d;
+
+ for( inds[0] = 1; inds[0] < vGrid->sizes[0] - 1; inds[0]++ ) {
+ nodeIndex = Grid_Project( vGrid, inds );
+ sep = (Mesh_GetVertex( mesh, nodeIndex + 1 )[0] - Mesh_GetVertex( mesh, nodeIndex - 1)[0]) * 0.5;
+ newHeights[inds[0]] = Mesh_GetVertex( mesh, nodeIndex - 1 )[1] -
+ 2.0 * Mesh_GetVertex( mesh, nodeIndex )[1] +
+ Mesh_GetVertex( mesh, nodeIndex + 1 )[1];
+ newHeights[inds[0]] /= sep * sep;
+ newHeights[inds[0]] *= -d;
+ }
+
+ nodeIndex = Grid_Project( vGrid, inds );
+ sep = -1.0 * (Mesh_GetVertex( mesh, nodeIndex - 1 )[0] - Mesh_GetVertex( mesh, nodeIndex )[0]);
+ newHeights[inds[0]] = Mesh_GetVertex( mesh, nodeIndex - 2 )[1] -
+ 2.0 * Mesh_GetVertex( mesh, nodeIndex - 1 )[1] +
+ Mesh_GetVertex( mesh, nodeIndex )[1];
+ newHeights[inds[0]] /= sep * sep;
+ newHeights[inds[0]] *= -d;
+
+ for( inds[0] = 0; inds[0] < vGrid->sizes[0]; inds[0]++ ) {
+ nodeIndex = Grid_Project( vGrid, inds );
+ mesh->verts[nodeIndex][1] += newHeights[inds[0]] * dt;
+ }
+
+ MemFree( newHeights );
+ }
for( d_i = 0; d_i < nDims; d_i++ ) {
for( w_i = 0; w_i < 2; w_i++ ) {
diff -r 1a93c33c1f42 -r ad4842c3da58 Utils/src/RegularRemesher.def
--- a/Utils/src/RegularRemesher.def Fri Aug 29 16:44:16 2008 +0000
+++ b/Utils/src/RegularRemesher.def Sun Aug 31 07:05:39 2008 +0000
@@ -41,6 +41,10 @@ MEMBER( int***, wallVerts )
MEMBER( int***, wallVerts )
MEMBER( double***, wallCrds )
MEMBER( double*, contactVerts )
+MEMBER( Bool, diffuseCorners )
+MEMBER( Bool, diffuseSurface )
+MEMBER( double, diffusionCoef )
+MEMBER( AbstractContext*, ctx )
/*
diff -r 1a93c33c1f42 -r ad4842c3da58 Utils/src/RegularRemesherCmpt.c
--- a/Utils/src/RegularRemesherCmpt.c Fri Aug 29 16:44:16 2008 +0000
+++ b/Utils/src/RegularRemesherCmpt.c Sun Aug 31 07:05:39 2008 +0000
@@ -172,6 +172,14 @@ void _RegularRemesherCmpt_Construct( voi
self->regRemesh->contactDepth = Stg_ComponentFactory_GetInt( cf, self->name, "contactDepth", 0 );
self->regRemesh->contactSize = Stg_ComponentFactory_GetDouble( cf, self->name, "contactSize", 0.0 );
+ self->regRemesh->diffuseCorners = Stg_ComponentFactory_GetBool(
+ cf, self->name, "diffuseCorners", False );
+ self->regRemesh->diffuseSurface = Stg_ComponentFactory_GetBool(
+ cf, self->name, "diffuseSurface", False );
+ self->regRemesh->diffusionCoef = Stg_ComponentFactory_GetDouble(
+ cf, self->name, "diffusionCoef", 1.0 );
+ self->regRemesh->ctx = Stg_ComponentFactory_ConstructByName(
+ cf, "context", AbstractContext, True, data );
dict = Dictionary_Entry_Value_AsDictionary( Dictionary_Get( cf->componentDict, self->name ) );
list = Dictionary_Get( dict, "remeshDims" );
More information about the CIG-COMMITS
mailing list