[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