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

walter at geodynamics.org walter at geodynamics.org
Wed Feb 25 06:06:01 PST 2009


Author: walter
Date: 2009-02-25 06:06:01 -0800 (Wed, 25 Feb 2009)
New Revision: 14145

Modified:
   long/3D/Gale/trunk/
   long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/Context.h
   long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c
Log:
 r2502 at dante:  boo | 2009-02-25 06:04:24 -0800
 Add FloatLeftTop and FloatRightTop to EulerDeform



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

Modified: long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/Context.h
===================================================================
--- long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/Context.h	2009-02-25 14:05:57 UTC (rev 14144)
+++ long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/Context.h	2009-02-25 14:06:01 UTC (rev 14145)
@@ -74,6 +74,9 @@
 		Bool		staticTopBack;
 		Bool		staticBottomBack;
 
+		Bool		floatLeftTop;
+		Bool		floatRightTop;
+
 		Bool		staticSides;
 		double**	sideCoords;
                 double          x_right_coord;

Modified: long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c	2009-02-25 14:05:57 UTC (rev 14144)
+++ long/3D/Gale/trunk/src/Underworld/plugins/EulerDeform/EulerDeform.c	2009-02-25 14:06:01 UTC (rev 14145)
@@ -180,6 +180,9 @@
 			sys->staticTopBack = Dictionary_GetBool_WithDefault( sysDict, "staticTopBack", sys->staticTop && sys->staticBack );
 			sys->staticBottomBack = Dictionary_GetBool_WithDefault( sysDict, "staticBottomBack", sys->staticBottom && sys->staticBack );
 
+			sys->floatLeftTop = Dictionary_GetBool_WithDefault( sysDict, "floatLeftTop", False );
+			sys->floatRightTop = Dictionary_GetBool_WithDefault( sysDict, "floatRightTop", False );
+
 			sys->staticSides = 
                           sys->staticLeft
                           || sys->staticRight
@@ -676,6 +679,89 @@
 			     double* val);
 Bool _EulerDeform_QuadYInterp(double** crds,const double* pnt,double* val);
 
+/* Make the top left or right corners float up to the height of the
+   point just inside. */
+
+void EulerDeform_FloatRightTop(EulerDeform_System* sys, Grid *grid,
+                               double** crds)
+{
+  int i, max_z;
+  IJK ijk, inside_ijk;
+  unsigned ind, nLocalNodes, inside;
+
+  nLocalNodes = Mesh_GetLocalSize( sys->mesh, MT_VERTEX );
+  ijk[0]=grid->sizes[0]-1;
+  ijk[1]=grid->sizes[1]-1;
+
+  if(Mesh_GetDimSize(sys->mesh)==2)
+    {
+      max_z=1;
+    }
+  else
+    {
+      max_z=grid->sizes[2];
+    }
+
+  for(i=0;i<max_z;++i)
+    {
+      ijk[2]=i;
+      ind=Grid_Project(grid,ijk);
+      if( !(!Mesh_GlobalToDomain( sys->mesh, MT_VERTEX, ind, &ind )
+            || ind >= nLocalNodes ))
+        {
+          inside_ijk[0]=ijk[0]-1;
+          inside_ijk[1]=ijk[1];
+          inside_ijk[2]=ijk[2];
+          inside=Grid_Project(grid,inside_ijk);
+          if(!(!Mesh_GlobalToDomain( sys->mesh, MT_VERTEX, inside, &inside )
+               || inside >= nLocalNodes ))
+            {
+              printf("float %d %d %g %g %g %g\n",ind,inside,crds[ind][0],
+                     crds[ind][1],crds[inside][0],crds[inside][1]);
+              crds[ind][1]=crds[inside][1];
+            }
+        }
+    }
+}
+
+void EulerDeform_FloatLeftTop(EulerDeform_System* sys, Grid *grid,
+                              double** crds)
+{
+  int i, max_z;
+  IJK ijk, inside_ijk;
+  unsigned ind, nLocalNodes, inside;
+
+  nLocalNodes = Mesh_GetLocalSize( sys->mesh, MT_VERTEX );
+  ijk[0]=0;
+  ijk[1]=grid->sizes[1]-1;
+
+  if(Mesh_GetDimSize(sys->mesh)==2)
+    {
+      max_z=1;
+    }
+  else
+    {
+      max_z=grid->sizes[2];
+    }
+
+  for(i=0;i<max_z;++i)
+    {
+      ijk[2]=i;
+      ind=Grid_Project(grid,ijk);
+      if( !(!Mesh_GlobalToDomain( sys->mesh, MT_VERTEX, ind, &ind )
+            || ind >= nLocalNodes ))
+        {
+          inside_ijk[0]=ijk[0]+1;
+          inside_ijk[1]=ijk[1];
+          inside_ijk[2]=ijk[2];
+          inside=Grid_Project(grid,inside_ijk);
+          if(!(!Mesh_GlobalToDomain( sys->mesh, MT_VERTEX, inside, &inside )
+               || inside >= nLocalNodes ))
+            crds[ind][1]=crds[inside][1];
+        }
+    }
+}
+
 /* Remesh the left or right top corners in 2D or 3D */
 
 void EulerDeform_Remesh_Corner(Mesh *mesh, int corner, int inside,
@@ -787,6 +873,11 @@
     unsigned		nDims;
     unsigned		var_i, n_i;
     
+    Grid *grid;
+    grid =
+      *(Grid**)ExtensionManager_Get(sys->mesh->info, sys->mesh, 
+                                    ExtensionManager_GetHandle( sys->mesh->info,
+                                                                "vertexGrid" ));
     nDims = Mesh_GetDimSize( sys->mesh );
     
     /* Update all local coordinates. */
@@ -812,17 +903,12 @@
       
       if(sys->wrapTop)
         {
-          if(sys->staticLeft && !sys->staticLeftTop)
+          if(sys->staticLeft && !sys->staticLeftTop && !sys->floatLeftTop)
             {
               EulerDeform_Remesh_Corner(sys->mesh,0,1,sys->x_left_coord);
             }
-          if(sys->staticRight && !sys->staticRightTop)
+          if(sys->staticRight && !sys->staticRightTop && !sys->floatRightTop)
             {
-              Grid *grid;
-              grid =
-                *(Grid**)ExtensionManager_Get( sys->mesh->info, sys->mesh, 
-                                               ExtensionManager_GetHandle( sys->mesh->info,
-                                                                           "vertexGrid" ) );
               EulerDeform_Remesh_Corner(sys->mesh,grid->sizes[0]-1,
                                         grid->sizes[0]-2,
                                         sys->x_right_coord);
@@ -862,6 +948,14 @@
     for( var_i = 0; var_i < sys->nFields; var_i++ )
       EulerDeform_InterpVar( sys->fields[var_i], sys->vars[var_i], sys->remesher->mesh, newCrds );
 
+    /* Float the top left and right corners if needed.  We do this
+       after interpolating, because these points almost certainly are
+       outside of the domain, and so can not be interpolated to. */
+    if(sys->floatLeftTop)
+      EulerDeform_FloatLeftTop(sys,grid,newCrds);
+    if(sys->floatRightTop)
+      EulerDeform_FloatRightTop(sys,grid,newCrds);
+
     /* Swap back coordinates and free memory. */
     sys->remesher->mesh->verts = newCrds;
     FreeArray( oldCrds );



More information about the CIG-COMMITS mailing list