[cig-commits] r13926 - in long/3D/Gale/trunk: . src/Underworld/plugins/EulerDeform

walter at geodynamics.org walter at geodynamics.org
Thu Jan 22 15:28:12 PST 2009


Author: walter
Date: 2009-01-22 15:28:12 -0800 (Thu, 22 Jan 2009)
New Revision: 13926

Modified:
   long/3D/Gale/trunk/
   long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c
Log:
 r2467 at dante:  boo | 2009-01-22 15:26:37 -0800
 Generalize the corner interpolation



Property changes on: long/3D/Gale/trunk
___________________________________________________________________
Name: svk:merge
   - 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:2466
   + 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:2467

Modified: long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c	2009-01-22 23:28:10 UTC (rev 13925)
+++ long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c	2009-01-22 23:28:12 UTC (rev 13926)
@@ -671,12 +671,16 @@
 	return True;
 }
 
+Bool _EulerDeform_LineInterp(const double** crds,const double* pnt,
+                             unsigned fromDim,unsigned toDim, 
+			     double* val);
+Bool _EulerDeform_QuadYInterp(double** crds,const double* pnt,double* val);
+
 /* Remesh the left or right top corners in 2D or 3D */
 
 void EulerDeform_Remesh_Corner(Mesh *mesh, int corner, int inside,
                                double side_coord) {
   IJK		ijk;
-  unsigned n_corner, n_interior, n, n_in, max_z, z;
   Grid *grid;
   grid =
     *(Grid**)ExtensionManager_Get( mesh->info, mesh, 
@@ -684,12 +688,9 @@
                                                                "vertexGrid" ) );
   ijk[0]=corner;
   ijk[1]=grid->sizes[1]-1;
-  max_z=1;
-  if(Mesh_GetDimSize(mesh)==3)
-    max_z=grid->sizes[2];
-  
-  for(ijk[2]=0;ijk[2]<max_z;++ijk[2])
+  if(Mesh_GetDimSize(mesh)==2)
     {
+      unsigned n_corner, n_interior, n, n_in;
       n_corner=RegularMeshUtils_Node_3DTo1D(mesh,ijk);
       ijk[0]=inside;
       n_interior=RegularMeshUtils_Node_3DTo1D(mesh,ijk);
@@ -698,25 +699,72 @@
          && Mesh_GlobalToDomain(mesh,MT_VERTEX,
                                 n_interior,&n_in))
         {
-          double x0,y0,x1,y1;
-          double delta;
-          
-          x0=mesh->verts[n][0];
-          y0=mesh->verts[n][1];
-          x1=mesh->verts[n_in][0];
-          y1=mesh->verts[n_in][1];
-          
-          if((x0-side_coord)*(corner-inside)<0)
+          double *crds[2];
+
+          crds[0]=mesh->verts[n];
+          crds[1]=mesh->verts[n_in];
+          if(!_EulerDeform_LineInterp((const double**)crds,&side_coord,0,1,
+                                       &(mesh->verts[n][1])))
             {
-              printf("The side is moving in the wrong direction: %g %g\n",
-                     x0,side_coord);
+              printf("The side is moving in the wrong direction.\n");
               abort();
             }
           mesh->verts[n][0]=side_coord;
-          delta=(x1-side_coord)/(x1-x0);
-          mesh->verts[n][1]=y0*delta + y1*(1-delta);
         }
     }
+  else /* 3D */
+    {
+      for(ijk[2]=0; ijk[2]<grid->sizes[2]; ++ijk[2])
+        {
+          unsigned n_corner, n_interior, n, n_in;
+          ijk[0]=corner;
+          n_corner=RegularMeshUtils_Node_3DTo1D(mesh,ijk);
+          ijk[0]=inside;
+          n_interior=RegularMeshUtils_Node_3DTo1D(mesh,ijk);
+          if(Mesh_GlobalToDomain(mesh,MT_VERTEX,n_corner,&n)
+             && Mesh_GlobalToDomain(mesh,MT_VERTEX,n_interior,&n_in))
+            {
+              IJK ijk_off;
+              unsigned n_temp_off, n_temp_off_in, n_off, n_off_in;
+              double *crds[4];
+              double temp, pnt[2];
+              int offset=1;
+
+              crds[0]=mesh->verts[n];
+              crds[1]=mesh->verts[n_in];
+
+              ijk_off[0]=ijk[0];
+              ijk_off[1]=ijk[1];
+
+              if(crds[0][2]<crds[1][2])
+                offset=-1;
+
+              ijk_off[2]=ijk[2]+offset;
+              n_temp_off=RegularMeshUtils_Node_3DTo1D(mesh,ijk_off);
+              n_temp_off_in=RegularMeshUtils_Node_3DTo1D(mesh,ijk_off);
+              if(!Mesh_GlobalToDomain(mesh,MT_VERTEX,n_temp_off,&n_off_in)
+                 || !Mesh_GlobalToDomain(mesh,MT_VERTEX,n_temp_off_in,&n_off_in))
+                {
+                  printf("Can not map the neighbor of this coordinate to the local grid.\n %d %d %d %d",
+                         ijk[0],ijk[1],ijk[2], ijk_off[2]);
+                  abort();
+                }
+              crds[2]=mesh->verts[n_off_in];
+              crds[3]=mesh->verts[n_off];
+
+              pnt[0]=side_coord;
+              pnt[2]=crds[0][2];
+              if(!_EulerDeform_QuadYInterp(crds,pnt,&temp))
+                {
+                  printf("Unable to interpolate to this point\n %g %g %d %d %d\n",
+                         pnt[0],pnt[1],ijk[0],ijk[1],ijk[2]);
+                  abort();
+                }
+              mesh->verts[n][0]=side_coord;
+              mesh->verts[n][1]=temp;
+            }
+        }
+    }
 }
 
 void EulerDeform_Remesh( TimeIntegratee* crdAdvector, EulerDeform_Context* edCtx ) {



More information about the CIG-COMMITS mailing list