Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

208 lines
6.7 KiB

/*
* @HEADER
*
* ***********************************************************************
*
* Zoltan Toolkit for Load-balancing, Partitioning, Ordering and Coloring
* Copyright 2012 Sandia Corporation
*
* Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
* the U.S. Government retains certain rights in this software.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the Corporation nor the names of the
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Questions? Contact Karen Devine kddevin@sandia.gov
* Erik Boman egboman@sandia.gov
*
* ***********************************************************************
*
* @HEADER
*/
// Program to generate uniform-grid input files for Zoltan's zdrive program.
// Compile:
// c++ generate_miniFElike_grids.cpp
// Run:
// a.out x y z filename
// where x,y,z are the number of grid points in the x, y, and z directions,
// respectively, and filename is the base filename to be used for the output.
//
// Output files are in Chaco and Matrix-Market format.
// Output files include filename.coords, filename.graph and filename.mtx.
//
// Note that x, y, and z are the number of GRID POINTS, not elements. So
// to get input equivalent to miniFE nx=100 ny=100 nz=100, you must specify
// x = y = z = 101 for this generator.
//
// The graph is node connectivity within elements: assume a finite
// element interpretation, with linear elements; then grid point j is connected
// to each grid point in all cells containing j.
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
void compute_neighbors(
ofstream &gfp,
ofstream &mfp,
int64_t cnt,
int i, int j, int k,
int nx, int ny, int nz
)
{
#define TEST_CONVERT_PRINT(i,j,k) \
if ((i) >= 0 && (i) < nx && (j) >= 0 && (j) < ny && (k) >= 0 && (k) < nz) { \
int64_t tmp = 1 + (k)*face + (j)*nx + (i); \
gfp << tmp << " "; \
mfp << setw(10) << cnt << setw(10) << tmp << setw(10) << "1." << endl; \
ecnt++; \
}
static int64_t ecnt = 0;
int64_t face = nx * ny;
// Self
TEST_CONVERT_PRINT(i, j, k)
TEST_CONVERT_PRINT(i-1, j, k)
TEST_CONVERT_PRINT(i+1, j, k)
TEST_CONVERT_PRINT(i, j-1, k)
TEST_CONVERT_PRINT(i-1, j-1, k)
TEST_CONVERT_PRINT(i+1, j-1, k)
TEST_CONVERT_PRINT(i, j+1, k)
TEST_CONVERT_PRINT(i-1, j+1, k)
TEST_CONVERT_PRINT(i+1, j+1, k)
TEST_CONVERT_PRINT(i, j, k-1)
TEST_CONVERT_PRINT(i-1, j, k-1)
TEST_CONVERT_PRINT(i+1, j, k-1)
TEST_CONVERT_PRINT(i, j-1, k-1)
TEST_CONVERT_PRINT(i-1, j-1, k-1)
TEST_CONVERT_PRINT(i+1, j-1, k-1)
TEST_CONVERT_PRINT(i, j+1, k-1)
TEST_CONVERT_PRINT(i-1, j+1, k-1)
TEST_CONVERT_PRINT(i+1, j+1, k-1)
TEST_CONVERT_PRINT(i, j, k+1)
TEST_CONVERT_PRINT(i-1, j, k+1)
TEST_CONVERT_PRINT(i+1, j, k+1)
TEST_CONVERT_PRINT(i, j-1, k+1)
TEST_CONVERT_PRINT(i-1, j-1, k+1)
TEST_CONVERT_PRINT(i+1, j-1, k+1)
TEST_CONVERT_PRINT(i, j+1, k+1)
TEST_CONVERT_PRINT(i-1, j+1, k+1)
TEST_CONVERT_PRINT(i+1, j+1, k+1)
gfp << endl;
#undef TEST_CONVERT_PRINT
}
int main(int narg, char *arg[])
{
if (narg != 5) {
cout << "Usage: a.out x y z filename" << endl;
exit(-1);
}
int nx = atoi(arg[1]);
int ny = atoi(arg[2]);
int nz = atoi(arg[3]);
int64_t nvtx = nx * ny * nz;
int nx_gt_one = (nx > 1);
int ny_gt_one = (ny > 1);
int nz_gt_one = (nz > 1);
int nx_m_two = nx - 2;
int ny_m_two = ny - 2;
int nz_m_two = nz - 2;
int64_t nedge =
// interior vertices
27 * nx_gt_one * ny_gt_one * nz_gt_one * nx_m_two * ny_m_two * nz_m_two
// face vertices
+ 9 * (1 + 3 * nz_gt_one) * nx_gt_one * ny_gt_one * nx_m_two * ny_m_two
+ 9 * (1 + 3 * ny_gt_one) * nx_gt_one * nz_gt_one * nx_m_two * nz_m_two
+ 9 * (1 + 3 * nx_gt_one) * ny_gt_one * nz_gt_one * ny_m_two * nz_m_two
// edge vertices
+ 12 * (ny_gt_one+nz_gt_one) * (ny_gt_one+nz_gt_one) * nx_gt_one * nx_m_two
+ 12 * (nx_gt_one+nz_gt_one) * (nx_gt_one+nz_gt_one) * ny_gt_one * ny_m_two
+ 12 * (nx_gt_one+ny_gt_one) * (nx_gt_one+ny_gt_one) * nz_gt_one * nz_m_two
// corner vertices
+ (1+nx_gt_one) * (1+nx_gt_one) * (1+ny_gt_one) * (1+ny_gt_one)
* (1+nz_gt_one) * (1+nz_gt_one);
char *basename = arg[4];
// Open output files
char fname[127];
ofstream cfp; // coordinates file
sprintf(fname, "%s.coords", basename);
cfp.open(fname);
ofstream gfp; // graph file
sprintf(fname, "%s.graph", basename);
gfp.open(fname);
gfp << nvtx << " " << nedge << endl;
ofstream mfp; // matrix-market file
sprintf(fname, "%s.mtx", basename);
mfp.open(fname);
mfp << "%%MatrixMarket matrix coordinate real general\n%%\n";
mfp << nvtx << " " << nvtx << " " << nedge << endl;
// subdivide the unit cube into cells
//double dx = (nx > 1 ? 1. / (nx - 1) : 0.);
//double dy = (ny > 1 ? 1. / (ny - 1) : 0.);
//double dz = (nz > 1 ? 1. / (nz - 1) : 0.);
// miniFE has dx = 1, dy = 1, dx = -1
double dx = 1.;
double dy = 1.;
double dz = -1.;
int64_t cnt = 0;
double x = 0., y = 0., z = 0.;
for (int k = 0; k < nz; k++) {
y = 0.;
for (int j = 0; j < ny; j++) {
x = 0.;
for (int i = 0; i < nx; i++) {
cnt++;
// print neighbors
compute_neighbors(gfp, mfp, cnt, i, j, k, nx, ny, nz);
// print coordinates
cfp << setw(15) << x << setw(15) << y << setw(15) << z << endl;
x += dx;
}
y += dy;
}
z += dz;
}
cfp.close();
mfp.close();
}