[cig-commits] commit:

Mercurial hg at geodynamics.org
Mon Nov 24 11:59:33 PST 2008


changeset:   152:e03ad1906fc2
user:        LukeHodkinson
date:        Sun Aug 31 07:16:11 2008 +0000
files:       Utils/src/RegularRemesher.c
description:
Was accidentally using inconsistent step sizes
for approximate partial derivatives in the
surface diffusion code.  Should probably convert
this to an implicit system, but I think it
should be okay for now.


diff -r ad4842c3da58 -r e03ad1906fc2 Utils/src/RegularRemesher.c
--- a/Utils/src/RegularRemesher.c	Sun Aug 31 07:05:39 2008 +0000
+++ b/Utils/src/RegularRemesher.c	Sun Aug 31 07:16:11 2008 +0000
@@ -124,73 +124,6 @@ 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++ ) {
@@ -366,6 +299,73 @@ void _RegularRemesher_Remesh( void* _sel
       }
    }
 
+   /* 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 );
+   }
+
    Class_Free( self, inds );
    Mesh_Sync( mesh );
    Mesh_DeformationUpdate( mesh );



More information about the CIG-COMMITS mailing list