[cig-commits] commit: Proper XMDF support for discontinuous elements for dim=2
Mercurial
hg at geodynamics.org
Mon Oct 3 20:31:24 PDT 2011
changeset: 875:d0dc41394007
user: Walter Landry <wlandry at caltech.edu>
date: Mon Oct 03 19:39:13 2011 -0700
files: Utils/src/XDMFGenerator.cxx
description:
Proper XMDF support for discontinuous elements for dim=2
diff -r f92ce89aaa0e -r d0dc41394007 Utils/src/XDMFGenerator.cxx
--- a/Utils/src/XDMFGenerator.cxx Sun Oct 02 15:19:15 2011 -0700
+++ b/Utils/src/XDMFGenerator.cxx Mon Oct 03 19:39:13 2011 -0700
@@ -110,6 +110,31 @@ void XDMFGenerator_GenerateAll( void* _c
}
+namespace {
+ void print_Pm1_corner(Stream* stream,
+ const int &num_columns,
+ const int &num_rows,
+ const int &e,
+ const std::string &mesh_name,
+ const std::string &x,
+ const std::string &y)
+ {
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u\" Function=\"JOIN(",
+ num_rows*num_columns);
+ for(int i=0;i<num_columns-1;++i)
+ Journal_Printf(stream,"$%u; ",i);
+ Journal_Printf(stream,"$%u)\" Name=\"C%u%s\">\n",
+ num_columns-1,e,(x+y).c_str());
+
+ for(int i=0;i<num_columns;++i)
+ {
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C%u%s%u\"]</DataItem>\n",
+ mesh_name.c_str(),e,x.c_str(),i);
+ }
+ Journal_Printf(stream," </DataItem>\n");
+ }
+}
+
void _XDMFGenerator_WriteFieldSchema( UnderworldContext* context, Stream* stream ) {
FieldVariable* fieldVar = NULL;
FeVariable* feVar = NULL;
@@ -177,7 +202,7 @@ void _XDMFGenerator_WriteFieldSchema( Un
/** now print out topology info **/
/* Quadratic elements */
- if(!strcmp(((FeMesh*)stgComp)->feElFamily,"quadratic"))
+ if(element_family=="quadratic")
{
/* First separate each node of each element into its own
variable C0-C8 or C0-C26 */
@@ -240,15 +265,148 @@ void _XDMFGenerator_WriteFieldSchema( Un
}
/* Discontinuous linear elements */
- else if(!strcmp(((FeMesh*)stgComp)->feElFamily,"linear-inner"))
+ else if(element_family=="linear-inner")
{
if(nDims==2)
{
- Journal_Printf(stream," <Topology Type=\"%s\" NumberOfElements=\"%u\"> \n", topologyType.c_str(), elementGlobalSize );
- Journal_Printf(stream," <DataItem Format=\"HDF\" DataType=\"Int\" Dimensions=\"%u %u\">Mesh.%s.%05d.h5:/connectivity</DataItem>\n",
- elementGlobalSize, maxNodes, feMesh->name,
+ Grid** grid=
+ (Grid** )ExtensionManager_Get
+ (mesh->info, mesh,
+ ExtensionManager_GetHandle(mesh->info, (Name)"elementGrid"));
+
+ unsigned *sizes=Grid_GetSizes(*grid);
+
+ /* Create C0, a set of the points of the first node in
+ each element */
+ Journal_Printf(stream," <DataItem ItemType=\"HyperSlab\" Dimensions=\"%u 1\" Name=\"C0\">\n",
+ elementGlobalSize);
+ Journal_Printf(stream," <DataItem Dimensions=\"3 2\" Format=\"XML\"> 0 0 1 1 %u 1 </DataItem>\n",
+ elementGlobalSize);
+ Journal_Printf(stream," <DataItem Format=\"HDF\" DataType=\"Int\" Dimensions=\"%u 3\">Mesh.%s.%05d.h5:/connectivity</DataItem>\n",
+ elementGlobalSize, feMesh->name, context->timeStep);
+ Journal_Printf(stream," </DataItem>\n");
+
+ /* Create C0x, a set of the points of the first node in each
+ element except for the elements on the right. */
+ /* First create a strips that go from the left to the
+ right, stopping one element short of the edge. */
+ for(uint i=0;i<sizes[1];++i)
+ {
+ Journal_Printf(stream," <DataItem ItemType=\"HyperSlab\" Dimensions=\"%u 1\" Name=\"C0x%u\">\n",
+ sizes[0]-1,i);
+ Journal_Printf(stream," <DataItem Dimensions=\"3 2\" Format=\"XML\"> %u 0 1 1 %u 1 </DataItem>\n",
+ i*sizes[0],sizes[0]-1);
+ Journal_Printf(stream," <DataItem Format=\"HDF\" DataType=\"Int\" Dimensions=\"%u 3\">Mesh.%s.%05d.h5:/connectivity</DataItem>\n",
+ elementGlobalSize, feMesh->name, context->timeStep);
+ Journal_Printf(stream," </DataItem>\n");
+ }
+
+ /* Now join the strips together to create C0x */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u\" Function=\"JOIN(",
+ (sizes[0]-1)*sizes[1]);
+ for(uint i=0;i<sizes[1]-1;++i)
+ Journal_Printf(stream,"$%u; ",i);
+ Journal_Printf(stream,"$%u)\" Name=\"C0x\">\n",
+ sizes[1]-1);
+
+ for(uint i=0;i<sizes[1];++i)
+ {
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0x%u\"]</DataItem>\n",
+ feMesh->name,i);
+ }
+ Journal_Printf(stream," </DataItem>\n");
+
+ /* Create C0y0, a set of points of the first node in
+ the elements in a strip on the left side. */
+ Journal_Printf(stream," <DataItem ItemType=\"HyperSlab\" Dimensions=\"%u 1\" Name=\"C0y0\">\n",
+ sizes[1]);
+ Journal_Printf(stream," <DataItem Dimensions=\"3 2\" Format=\"XML\"> 0 0 %u 1 %u 1 </DataItem>\n",
+ sizes[0],sizes[1]-1);
+ Journal_Printf(stream," <DataItem Format=\"HDF\" DataType=\"Int\" Dimensions=\"%u 3\">Mesh.%s.%05d.h5:/connectivity</DataItem>\n",
+ elementGlobalSize, feMesh->name, context->timeStep);
+ Journal_Printf(stream," </DataItem>\n");
+
+
+ /* Use C0, C0x, and C0y0 to create all of the triangles */
+ int total_triangles=elementGlobalSize + 2*(elementGlobalSize-sizes[1])
+ + 2*(elementGlobalSize-sizes[1]-sizes[0]+1)
+ + elementGlobalSize-sizes[0]
+ + 2*(sizes[1]-1);
+ Journal_Printf(stream," <Topology Type=\"%s\" NumberOfElements=\"%u\"> \n",
+ topologyType.c_str(),
+ total_triangles);
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN($0; $1; $2; $3; $4; $5; $6; $7)\">\n",
+ total_triangles);
+ /* Triangles for the three points in the element */
+ Journal_Printf(stream," <DataItem Format=\"HDF\" DataType=\"Int\" Dimensions=\"%u 3\">Mesh.%s.%05d.h5:/connectivity</DataItem>\n",
+ elementGlobalSize, feMesh->name,
context->timeStep );
- Journal_Printf(stream," </Topology>\n\n" );
+ /* Triangle for nodes 1,2 in the left element and 0 in
+ the right element. The numbering for xdmf is really
+ wacked. In JOIN($0 +1, $0+2), the second value will
+ actually be $0+3, because it will add 1 and use that
+ as the current $0. Very annoying. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(1 + $0, 1 + $0, 1 + $0)\">\n",
+ elementGlobalSize-sizes[1]);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0x\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for nodes 2 in the left element and 0,2 in
+ the right element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(2 + $0, 1 + $0, 2 + $0)\">\n",
+ elementGlobalSize-sizes[1]);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0x\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for nodes 2 in the left element, 2 in the
+ right element, and 1 in the top element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(2 + $0, 3 + $0, %u + $0)\">\n",
+ elementGlobalSize-sizes[1]-sizes[0]+1,3*sizes[0]-4);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0x\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for nodes 2 in the right element, 1 in the
+ top element, and 0 in the top right element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(5 + $0, %u + $0, 2 + $0)\">\n",
+ elementGlobalSize-sizes[1]-sizes[0]+1,3*sizes[0]-5+1);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0x\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for nodes 2 in the left element and nodes
+ 0,1 in the top element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(2 + $0, %u + $0, 1 + $0)\">\n",
+ elementGlobalSize-sizes[0],3*sizes[0]-2);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for the strip on the left side. It is made
+ up of nodes 0,2 in the bottom element and node 0 in
+ the top element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN($0, 2 + $0, %u + $0)\">\n",
+ sizes[1]-1,3*sizes[0]-2);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0y0\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+ /* Triangle for the strip on the right side. It is made
+ up of nodes 1,2 in the bottom element and node 1 in
+ the top element. */
+ Journal_Printf(stream," <DataItem ItemType=\"Function\" Dimensions=\"%u 3\" Function=\"JOIN(%u + $0, 1 + $0, %u + $0)\">\n",
+ sizes[1]-1,3*sizes[0]-2,3*sizes[0]-1);
+ Journal_Printf(stream," <DataItem Reference=\"XML\">/Xdmf/Domain/Grid[@Name=\"FEM_Grid_%s\"]/DataItem[@Name=\"C0y0\"] </DataItem>\n",
+ feMesh->name);
+ Journal_Printf(stream," </DataItem>\n" );
+
+
+
+
+ Journal_Printf(stream," </DataItem>\n" );
+ Journal_Printf(stream," </Topology>\n\n" );
}
else
{
@@ -414,7 +572,6 @@ void _XDMFGenerator_WriteSwarmSchema( Un
Index dofCountIndex;
Index swarmParticleLocalCount;
Index countindex;
- Index ii;
Swarm* currentSwarm;
SwarmVariable* swarmVar;
char* swarmVarName;
@@ -442,7 +599,7 @@ void _XDMFGenerator_WriteSwarmSchema( Un
Journal_Printf( stream, " <Time Value=\"%f\" />\n\n", context->currentTime );
Stg_asprintf( &filename_part, "" );
- for (ii = 0 ; ii < context->nproc ; ++ii) {
+ for (int ii = 0 ; ii < context->nproc ; ++ii) {
/** get the number of particles in each swarm from each process **/
if (ii != MASTER ) MPI_Recv( &swarmParticleLocalCount, 1, MPI_INT, ii, FINISHED_WRITING_TAG, context->communicator, &status );
More information about the CIG-COMMITS
mailing list