[cig-commits] commit: Add HRS_Erosion
Mercurial
hg at geodynamics.org
Fri Mar 12 13:52:23 PST 2010
changeset: 827:77dc026ad2a1
tag: tip
user: Walter Landry <wlandry at caltech.edu>
date: Fri Mar 12 13:50:04 2010 -0800
files: SConscript plugins/HRS_Erosion/Context.h plugins/HRS_Erosion/HRS_Erosion.c plugins/HRS_Erosion/HRS_Erosion.h plugins/HRS_Erosion/types.h
description:
Add HRS_Erosion
diff -r 6af1bcb087d2 -r 77dc026ad2a1 SConscript
--- a/SConscript Fri Mar 12 13:49:00 2010 -0800
+++ b/SConscript Fri Mar 12 13:50:04 2010 -0800
@@ -88,6 +88,7 @@ dirs = ['libUnderworld/Toolbox',
'plugins/MaterialThermalDiffusivity',
'plugins/MeshAdvectionCorrection',
'plugins/SurfaceProcess',
+ 'plugins/HRS_Erosion',
'plugins/VariableConditions/ShapeFemIC',
'plugins/Output/Vrms',
'plugins/Output/Mobility',
diff -r 6af1bcb087d2 -r 77dc026ad2a1 plugins/HRS_Erosion/Context.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/HRS_Erosion/Context.h Fri Mar 12 13:50:04 2010 -0800
@@ -0,0 +1,40 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Victorian Partnership for Advanced Computing (VPAC) Ltd, Australia
+** (C) 2003-2005 All Rights Reserved
+**
+** Authors:
+** Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+** Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+** David May, PhD Student Monash University, VPAC. (david.may at sci.maths.monash.edu.au)
+** Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+** Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+** Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**
+** Role:
+** Defines any header info, such as new structures, needed by this plugin
+**
+** Assumptions:
+**
+** Comments:
+**
+** $Id $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#ifndef __Underworld_plugins_HRS_Erosion_Context_h__
+#define __Underworld_plugins_HRS_Erosion_Context_h__
+
+ struct Underworld_HRS_Erosion_Context {
+ Mesh* mesh;
+ double K;
+ double DT;
+ double first_t_erosion;
+ double vT;
+ FeVariable* v;
+ AbstractContext* ctx;
+ TimeIntegrator* timeIntegrator;
+ };
+
+#endif
diff -r 6af1bcb087d2 -r 77dc026ad2a1 plugins/HRS_Erosion/HRS_Erosion.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/HRS_Erosion/HRS_Erosion.c Fri Mar 12 13:50:04 2010 -0800
@@ -0,0 +1,393 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+** An implementation of the erosion rule in
+**
+** Hilley, G. E., M. R. Strecker, and V. A. Ramos (2004), Growth and
+** erosion of fold-and- thrust belts with an application to the
+** Aconcagua fold-and-thrust belt, Argentina, J. Geophys. Res., 109,
+** B01410, doi:10.1029/2002JB002282.
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+** Copyright (C) 2008, 2010 California Institute of Technology
+**
+** Authors:
+** Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+** Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+** David May, PhD Student Monash University, VPAC. (david.may at sci.maths.monash.edu.au)
+** Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+** Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+** Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+** Walter Landry, CIG
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License as published by the Free Software Foundation; either
+** version 2.1 of the License, or (at your option) any later version.
+**
+** This library is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public
+** License along with this library; if not, write to the Free Software
+** Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+**
+** $Id: LevelSetPlg.c 200 2005-07-08 08:24:41Z LukeHodkinson $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include <mpi.h>
+#include <StGermain/StGermain.h>
+#include <StgDomain/StgDomain.h>
+#include <StgFEM/StgFEM.h>
+#include <PICellerator/PICellerator.h>
+#include <Underworld/Underworld.h>
+#include <math.h>
+#include <float.h>
+
+#include "types.h"
+#include "Context.h"
+#include "HRS_Erosion.h"
+
+
+const Type Underworld_HRS_Erosion_Type = "HRS_Erosion";
+ExtensionInfo_Index Underworld_HRS_Erosion_ContextHandle;
+
+static double a_mean_old=0;
+static double next_t_erosion=0;
+static double t_erosion=0;
+static int first_erosion_flag = 1;
+
+void Underworld_HRS_Erosion_Execute( TimeIntegrand* crdAdvector,
+ Underworld_HRS_Erosion_Context* spCtx)
+{
+ double dt;
+ FeVariable *velocity;
+ double K = spCtx->K;
+ Grid* grid;
+ Mesh* mesh;
+ unsigned nDims;
+ Node_LocalIndex n_i, n_left;
+ unsigned nNodes;
+ MPI_Comm comm;
+ double DT = spCtx->DT;
+ double first_t_erosion = spCtx->first_t_erosion;
+ double vT = spCtx->vT;
+ IJK ijk_right;
+ IJK ijk_left;
+ Bool on_top, on_right, found;
+ double x_right, y_right, x_left, y_left, temp, base_height, threshold;
+
+ assert( spCtx );
+
+ dt = spCtx->ctx->dt;
+ mesh=spCtx->mesh;
+ velocity=spCtx->v;
+ t_erosion = t_erosion + dt;
+ comm = Comm_GetMPIComm( Mesh_GetCommTopology( mesh, MT_VERTEX ) );
+
+ if(next_t_erosion < first_t_erosion) {
+ next_t_erosion = first_t_erosion;
+ }
+
+ if(t_erosion < next_t_erosion)
+ return;
+
+ next_t_erosion = next_t_erosion + DT;
+
+ if(first_erosion_flag) {
+ DT = t_erosion;
+ first_erosion_flag = 0;
+ }
+
+ nDims = Mesh_GetDimSize( mesh );
+ grid =
+ *(Grid**)ExtensionManager_Get( mesh->info, mesh,
+ ExtensionManager_GetHandle( mesh->info,
+ "vertexGrid" ) );
+
+ if( nDims != 2 )
+ abort();
+
+ nNodes = FeMesh_GetNodeLocalSize( mesh);
+
+ /* Get the coordinates for the top right corner */
+
+ RegularMeshUtils_Node_1DTo3D
+ ( mesh, Mesh_DomainToGlobal( mesh, MT_VERTEX, nNodes-1 ), ijk_right );
+ on_top=(ijk_right[1]==grid->sizes[1]-1);
+ on_right=(ijk_right[0]==grid->sizes[0]-1);
+ if(on_top && on_right)
+ {
+ x_right=mesh->verts[nNodes-1][0];
+ y_right=mesh->verts[nNodes-1][1];
+ }
+ else
+ {
+ x_right=DBL_MAX;
+ y_right=DBL_MAX;
+ }
+ MPI_Allreduce( &x_right, &temp, 1, MPI_DOUBLE, MPI_MIN, comm );
+ x_right=temp;
+ MPI_Allreduce( &y_right, &temp, 1, MPI_DOUBLE, MPI_MIN, comm );
+ y_right=temp;
+
+ /* Get the coordinates for where the left side rises above the base
+ height */
+ base_height=DBL_MAX;
+
+ if(on_top)
+ {
+ int i_right, i_left, i, j;
+ i_right=ijk_right[0];
+ j=ijk_right[1];
+
+ RegularMeshUtils_Node_1DTo3D
+ ( mesh, Mesh_DomainToGlobal( mesh, MT_VERTEX, 0 ), ijk_left );
+
+ i_left=ijk_left[0];
+ ijk_left[1]=j;
+
+ if(!Mesh_GlobalToDomain
+ (mesh,MT_VERTEX,
+ RegularMeshUtils_Node_3DTo1D(mesh,ijk_left),&n_left))
+ {
+ printf("Can not map to local domain %d %d\n",
+ ijk_left[0],ijk_left[1]);
+ abort();
+ }
+ base_height=mesh->verts[n_left][1];
+ found=False;
+ for(i=i_left+1; i<=i_right; ++i)
+ {
+ ijk_left[0]=i;
+ if(!Mesh_GlobalToDomain
+ (mesh,MT_VERTEX,
+ RegularMeshUtils_Node_3DTo1D(mesh,ijk_left),&n_left))
+ {
+ printf("Can not map to local domain %d %d\n",
+ ijk_left[0],ijk_left[1]);
+ abort();
+ }
+ if(mesh->verts[n_left][1]>base_height+threshold)
+ {
+ found=True;
+ x_left=mesh->verts[n_left][0];
+ y_left=mesh->verts[n_left][1];
+ break;
+ }
+ }
+ if(!found)
+ {
+ y_left=DBL_MAX;
+ x_left=DBL_MAX;
+ }
+ }
+ MPI_Allreduce( &x_left, &temp, 1, MPI_DOUBLE, MPI_MIN, comm );
+ x_left=temp;
+ MPI_Allreduce( &y_left, &temp, 1, MPI_DOUBLE, MPI_MIN, comm );
+ y_left=temp;
+
+ /* Leave if no one found the rise */
+
+ if(x_left==DBL_MAX)
+ {
+ printf("Could not locate the edge of the wedge. Not eroding.\n");
+ return;
+ }
+
+ /* Start the erosion calculation */
+
+ double W = x_right-x_left;
+ double a_mean = atan((y_right-base_height)/W);
+
+ /* Insert equation here and calculate new slope: */
+
+ const double m=0.4;
+ const double n=1;
+ const double ka=4;
+ const double h=1.4;
+ double S=tan(a_mean_old);
+
+ /* alpha_calculated=(alpha1+atan((2.*vT./W1.^2 - 2*K*ka*W1^(h*m-1)*S^n/(h*m+1))*dt)) */
+ double alpha_calculated=
+ (a_mean_old+atan((2*vT/pow(W,2)
+ - (2*K*ka*pow(W,(h*m-1))*pow(S,n))/(h*m+1))*DT));
+
+ /* At the end of this calculation, we need a variable called alpha_calculated (in radians): */
+
+ double slope_calculated = tan(alpha_calculated);
+ double ypred;
+
+ printf("a_mean_old | a_mean | alpha_calculated | width | DT\n%11.9g %11.9g %11.9g %11.9g %11.9g\n",a_mean_old,a_mean,alpha_calculated, W, DT);
+
+ if (a_mean>alpha_calculated)
+ {
+ a_mean_old=alpha_calculated;
+
+ for( n_i = 0; n_i < nNodes; n_i++ )
+ {
+ IJK ijk;
+ RegularMeshUtils_Node_1DTo3D
+ ( mesh, Mesh_DomainToGlobal( mesh, MT_VERTEX, n_i ), ijk );
+
+ if(ijk[1]==grid->sizes[1]-1
+ && ijk[0]!=0 && ijk[0]!=grid->sizes[0]-1)
+ {
+ double y_old,delta_v, v[3];
+ double x;
+
+ x=mesh->verts[n_i][0];
+ ypred = slope_calculated * (x-x_left) + y_left;
+ y_old = mesh->verts[n_i][1];
+ if(ypred < y_old && x>x_left)
+ {
+ delta_v = (ypred-y_old)/dt;
+ }
+ else
+ {
+ delta_v = 0;
+ }
+
+ FeVariable_GetValueAtNode(velocity,n_i,v);
+
+ v[1]+=delta_v;
+ FeVariable_SetValueAtNode(velocity,n_i,v);
+ }
+ }
+ }
+ else
+ {
+ a_mean_old=a_mean;
+ }
+ FeVariable_SyncShadowValues(velocity);
+}
+
+Index Underworld_HRS_Erosion_Register( PluginsManager* pluginsMgr ) {
+ return PluginsManager_Submit( pluginsMgr,
+ Underworld_HRS_Erosion_Type,
+ "0",
+ _Underworld_HRS_Erosion_DefaultNew );
+}
+
+void* _Underworld_HRS_Erosion_DefaultNew( Name name ) {
+
+ /* Variables set in this function */
+ SizeT _sizeOfSelf = sizeof(Codelet);
+ Type type = Underworld_HRS_Erosion_Type;
+ Stg_Class_DeleteFunction* _delete = _Codelet_Delete;
+ Stg_Class_PrintFunction* _print = _Codelet_Print;
+ Stg_Class_CopyFunction* _copy = _Codelet_Copy;
+ Stg_Component_DefaultConstructorFunction* _defaultConstructor = _Underworld_HRS_Erosion_DefaultNew;
+ Stg_Component_ConstructFunction* _construct = _Underworld_HRS_Erosion_AssignFromXML;
+ Stg_Component_BuildFunction* _build = _Underworld_HRS_Erosion_Build;
+ Stg_Component_InitialiseFunction* _initialise = _Codelet_Initialise;
+ Stg_Component_ExecuteFunction* _execute = _Codelet_Execute;
+ Stg_Component_DestroyFunction* _destroy = _Underworld_HRS_Erosion_Destroy;
+
+ /* Variables that are set to ZERO are variables that will be
+ set either by the current _New function or another parent
+ _New function further up the hierachy */
+ AllocationType nameAllocationType = NON_GLOBAL /* default value NON_GLOBAL */;
+
+ return _Codelet_New( CODELET_PASSARGS );
+}
+
+void _Underworld_HRS_Erosion_AssignFromXML( void* component,
+ Stg_ComponentFactory* cf,
+ void* data ) {
+ Codelet* sp = (Codelet*)component;
+ UnderworldContext* uwCtx;
+ Underworld_HRS_Erosion_Context* spCtx;
+ Dictionary* spDict;
+ char* meshName;
+ char* velocityName;
+
+ assert( component );
+ assert( cf );
+
+ Journal_DPrintf( Underworld_Debug, "In: %s( void* )\n", __func__ );
+
+ /* Retrieve context. */
+ uwCtx =
+ (UnderworldContext*)Stg_ComponentFactory_ConstructByName(cf,"context",
+ UnderworldContext,
+ True, data );
+ sp->context=(AbstractContext* )uwCtx;
+ /* Create new context. */
+ Underworld_HRS_Erosion_ContextHandle =
+ ExtensionManager_Add( uwCtx->extensionMgr,
+ Underworld_HRS_Erosion_Type,
+ sizeof(Underworld_HRS_Erosion_Context) );
+
+ spCtx = ExtensionManager_Get( uwCtx->extensionMgr, uwCtx,
+ Underworld_HRS_Erosion_ContextHandle );
+ memset( spCtx, 0, sizeof(Underworld_HRS_Erosion_Context) );
+ spCtx->ctx = (AbstractContext*)uwCtx;
+
+ /* Get the time integrator. */
+ spCtx->timeIntegrator =
+ Stg_ComponentFactory_ConstructByName( cf, (Name)"timeIntegrator",
+ TimeIntegrator, True, data );
+
+ /* Get the dictionary. */
+ spDict = Dictionary_GetDictionary( uwCtx->dictionary, "HRS_Erosion" );
+ if( !spDict )
+ return;
+
+ /* Read in the variables. */
+ meshName = Dictionary_GetString( spDict, "mesh" );
+ assert( meshName && strcmp( meshName, "" ) );
+ spCtx->mesh = Stg_ComponentFactory_ConstructByName( cf, meshName, Mesh, True,
+ NULL );
+ velocityName = Dictionary_GetString( spDict, "VelocityField" );
+ assert( velocityName && strcmp( velocityName, "" ) );
+ spCtx->v = Stg_ComponentFactory_ConstructByName( cf, velocityName, FeVariable,
+ True, NULL );
+ assert( spCtx->v);
+ spCtx->K = Dictionary_GetDouble( spDict, "K" );
+
+ spCtx->DT = Dictionary_GetDouble(spDict, "dt_erosion");
+ spCtx->first_t_erosion = Dictionary_GetDouble(spDict, "first_t_erosion");
+ spCtx->vT = Dictionary_GetDouble(spDict, "vT");
+}
+
+void _Underworld_HRS_Erosion_Build( void* codelet, void* data ) {
+ Codelet* sp= (Codelet*)codelet;
+ UnderworldContext* UnderworldCtx = (UnderworldContext*)sp->context;
+ Underworld_HRS_Erosion_Context* spCtx;
+
+ assert( codelet );
+ assert( UnderworldCtx );
+
+ /* Get the context. */
+ spCtx = ExtensionManager_Get( UnderworldCtx->extensionMgr, UnderworldCtx, Underworld_HRS_Erosion_ContextHandle );
+
+ if( !spCtx->mesh )
+ return;
+
+ /* Append to the list of time integratee finish routines. It
+ should come last, because EulerDeform will reset the
+ values. */
+ TimeIntegrator_AppendSetupEP( spCtx->timeIntegrator,
+ "Underworld_HRS_Erosion_Execute",
+ Underworld_HRS_Erosion_Execute,
+ "HRS_Erosion",
+ spCtx );
+}
+
+void _Underworld_HRS_Erosion_Destroy( void* codelet, void* data ) {
+ UnderworldContext* UnderworldCtx = (UnderworldContext*)data;
+
+ assert( codelet );
+ assert( UnderworldCtx );
+
+ /* Clear the lot. */
+ /* TODO */
+}
+
diff -r 6af1bcb087d2 -r 77dc026ad2a1 plugins/HRS_Erosion/HRS_Erosion.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/HRS_Erosion/HRS_Erosion.h Fri Mar 12 13:50:04 2010 -0800
@@ -0,0 +1,39 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Victorian Partnership for Advanced Computing (VPAC) Ltd, Australia
+** (C) 2003-2005 All Rights Reserved
+**
+** Authors:
+** Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+** Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+** David May, PhD Student Monash University, VPAC. (david.may at sci.maths.monash.edu.au)
+** Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+** Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+** Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**
+** Role:
+** Defines any header info, such as new structures, needed by this plugin
+**
+** Assumptions:
+**
+** Comments:
+**
+** $Id $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#ifndef __Underworld_plugins_HRS_Erosion_HRS_Erosion_h__
+#define __Underworld_plugins_HRS_Erosion_HRS_Erosion_h__
+
+ Index Underworld_HRS_Erosion_Register( PluginsManager* pluginsMgr );
+
+ void* _Underworld_HRS_Erosion_DefaultNew( Name name );
+
+ void _Underworld_HRS_Erosion_AssignFromXML( void* codelet, Stg_ComponentFactory* cf, void* data );
+
+ void _Underworld_HRS_Erosion_Build( void* codelet, void* data );
+
+ void _Underworld_HRS_Erosion_Destroy( void* codelet, void* data );
+
+#endif /* __Underworld_plugins_HRS_Erosion_HRS_Erosion_h__ */
diff -r 6af1bcb087d2 -r 77dc026ad2a1 plugins/HRS_Erosion/types.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/HRS_Erosion/types.h Fri Mar 12 13:50:04 2010 -0800
@@ -0,0 +1,48 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+**
+** Authors:
+** Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+** Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+** Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+** Siew-Ching Tan, Software Engineer, VPAC. (siew at vpac.org)
+** Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+** Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License as published by the Free Software Foundation; either
+** version 2.1 of the License, or (at your option) any later version.
+**
+** This library is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public
+** License along with this library; if not, write to the Free Software
+** Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+**
+*/
+/** \file
+** Role:
+** Basic framework types.
+**
+** Assumptions:
+** None as yet.
+**
+** Comments:
+** None as yet.
+**
+** $Id: types.h 3376 2005-12-16 05:49:46Z RobertTurnbull $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#ifndef __Underworld_plugins_HRS_Erosion_types_h__
+#define __Underworld_plugins_HRS_Erosion_types_h__
+
+ /* Structures. */
+ typedef struct Underworld_HRS_Erosion_Context Underworld_HRS_Erosion_Context;
+
+#endif
More information about the CIG-COMMITS
mailing list