[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