Commit afe9de8f authored by vijaysm's avatar vijaysm
Browse files

Merged in vijaysm/mbcoupler-updates (pull request #93)

Updates to Coupler 
parents cf66911f 8cfbd13b
......@@ -16,22 +16,20 @@ AC_DEFUN([FATHOM_CONFIG_MPI_EXEC],[
AC_ARG_VAR(MPIEXEC,[Program to use to run parallel tests (default: mpiexec or mpirun)])
AC_ARG_VAR(MPIEXEC_NP,[Command line flag to specify number of processors to use (default: -np)])
AC_ARG_VAR(NP,[Number of processors to on which to run parallel tests (default: 2)])
if test "x$enablempi" != "xno"; then
if test "x$MPIEXEC" = "x"; then
if test "x$enablempi" != "xyes"; then
AC_CHECK_PROGS([MPIEXEC],[mpiexec mpirun],[true],[${WITH_MPI}:${WITH_MPI}/bin])
else
AC_CHECK_PROGS([MPIEXEC],[mpiexec mpirun],[true])
fi
fi
if test "x$MPIEXEC_NP" = "x"; then
MPIEXEC_NP="-np"
fi
if test "x$NP" = "x"; then
NP=2
if test "x$MPIEXEC" = "x"; then
if test "x$enablempi" != "xyes"; then
AC_CHECK_PROGS([MPIEXEC],[mpiexec mpirun],[NOTFOUND],[${WITH_MPI}:${WITH_MPI}/bin])
else
AC_CHECK_PROGS([MPIEXEC],[mpiexec mpirun],[NOTFOUND])
fi
fi
AM_CONDITIONAL(USE_MPIEXEC, [test "xtrue" != "x$MPIEXEC"])
if test "x$MPIEXEC_NP" = "x"; then
MPIEXEC_NP="-np"
fi
if test "x$NP" = "x"; then
NP=2
fi
AM_CONDITIONAL(USE_MPIEXEC, [test "xNOTFOUND" != "x$MPIEXEC"])
])
# Check for OpenMPI: #ifdef OPEN_MPI
......
......@@ -9,7 +9,7 @@ AC_CONFIG_MACRO_DIR([config])
AC_CONFIG_AUX_DIR([config])
AC_CANONICAL_TARGET
m4_ifdef([AM_SILENT_RULES],
[AM_INIT_AUTOMAKE([color-tests parallel-tests])],
[AM_INIT_AUTOMAKE([color-tests subdir-objects parallel-tests])],
[AM_INIT_AUTOMAKE])
AC_CHECK_PROG( [SED], [sed], [sed], [true] )
......
......@@ -16,11 +16,7 @@ AM_CPPFLAGS += -DIS_BUILDING_MB \
-I$(top_srcdir)/src/io/mhdf/include
if ENABLE_mbcoupler
AM_CPPFLAGS += -I$(top_srcdir)/tools/mbcoupler \
-I$(top_srcdir)/itaps \
-I$(top_srcdir)/itaps/imesh \
-I$(top_builddir)/itaps \
-I$(top_builddir)/itaps/imesh
AM_CPPFLAGS += -I$(top_srcdir)/tools/mbcoupler
endif
if ENABLE_mbcslam
......@@ -39,7 +35,6 @@ TESTS = pcomm_unit \
par_spatial_locator_test \
$(NETCDF_TESTS) \
$(HDF5_TESTS) \
$(COUPLER_TESTS) \
$(MBCSLAM_TESTS) $(IMESH_TESTS)
if PARALLEL_HDF5
......@@ -65,16 +60,6 @@ endif
endif
if ENABLE_mbcoupler
if PARALLEL_HDF5
COUPLER_TESTS = par_coupler_test
else
COUPLER_TESTS =
endif
else
COUPLER_TESTS =
endif
if ENABLE_mbcslam
if PARALLEL_HDF5
MBCSLAM_TESTS = par_intx_sph
......@@ -137,12 +122,6 @@ endif
endif
if ENABLE_mbcoupler
par_coupler_test_SOURCES = par_coupler_test.cpp
par_coupler_test_LDADD = $(LDADD) $(top_builddir)/tools/mbcoupler/libmbcoupler.la \
$(top_builddir)/itaps/imesh/libiMesh.la
endif
if ENABLE_mbcslam
par_intx_sph_SOURCES = par_intx_sph.cpp
par_intx_sph_LDADD = $(LDADD) ../../tools/mbcslam/libmbcslam.la
......
This diff is collapsed.
This diff is collapsed.
......@@ -24,7 +24,6 @@
#ifndef COUPLER_HPP
#define COUPLER_HPP
#include "iBase.h"
#include "moab/Range.hpp"
#include "moab/Interface.hpp"
#include "moab/CartVect.hpp"
......@@ -81,7 +80,7 @@ public:
* consisting of (p, i), p = proc, i = index on that proc
* \param store_local If true, stores the tuple list in targetPts
*/
ErrorCode locate_points(double *xyz, int num_points,
ErrorCode locate_points(double *xyz, unsigned int num_points,
double rel_eps = 0.0,
double abs_eps = 0.0,
TupleList *tl = NULL,
......@@ -222,10 +221,10 @@ public:
* \param integ_type Type of integration to perform
* \param num_integ_pts The number of Gaussian integration points to use in each dimension
*/
int normalize_mesh(iBase_EntitySetHandle &root_set,
const char *norm_tag,
Coupler::IntegType integ_type,
int num_integ_pts);
ErrorCode normalize_mesh( EntityHandle root_set,
const char *norm_tag,
Coupler::IntegType integ_type,
int num_integ_pts);
/* \brief Normalize a field over subsets of entities
* A field existing on the vertices of elements of a mesh is integrated
......@@ -243,13 +242,13 @@ public:
* \param integ_type Type of integration to perform
* \param num_integ_pts The number of Gaussian integration points to use in each dimension
*/
int normalize_subset(iBase_EntitySetHandle &root_set,
const char *norm_tag,
const char **tag_names,
int num_tags,
const char **tag_values,
Coupler::IntegType integ_type,
int num_integ_pts);
ErrorCode normalize_subset( EntityHandle root_set,
const char *norm_tag,
const char **tag_names,
int num_tags,
const char **tag_values,
Coupler::IntegType integ_type,
int num_integ_pts);
/* \brief Normalize a field over subsets of entities
* A field existing on the vertices of elements of a mesh is integrated
......@@ -267,13 +266,13 @@ public:
* \param integ_type Type of integration to perform
* \param num_integ_pts The number of Gaussian integration points to use in each dimension
*/
int normalize_subset(iBase_EntitySetHandle &root_set,
const char *norm_tag,
iBase_TagHandle *tag_handles,
int num_tags,
const char **tag_values,
Coupler::IntegType integ_type,
int num_integ_pts);
ErrorCode normalize_subset( EntityHandle root_set,
const char *norm_tag,
Tag *tag_handles,
int num_tags,
const char **tag_values,
Coupler::IntegType integ_type,
int num_integ_pts);
/* \brief Retrieve groups of entities matching tags and values(if present)
* Retrieve a vector of vectors of entity handles matching the
......@@ -285,11 +284,11 @@ public:
* \param integ_type Type of integration to perform
* \param num_integ_pts The number of Gaussian integration points to use in each dimension
*/
int do_normalization(const char *norm_tag,
std::vector< std::vector<iBase_EntitySetHandle> > &entity_sets,
std::vector< std::vector<iBase_EntityHandle> > &entity_groups,
Coupler::IntegType integ_type,
int num_integ_pts);
ErrorCode do_normalization( const char *norm_tag,
std::vector< std::vector<EntityHandle> > &entity_sets,
std::vector< std::vector<EntityHandle> > &entity_groups,
Coupler::IntegType integ_type,
int num_integ_pts);
/* \brief Retrieve groups of entities matching tags and values(if present)
* Retrieve a vector of vectors of entity handles matching the
......@@ -302,12 +301,12 @@ public:
* \param entity_sets Pointer to vector of vectors of entity set handles found in the search
* \param entity_groups Pointer to vector of vectors of entity handles from each entity set
*/
int get_matching_entities(iBase_EntitySetHandle root_set,
const char **tag_names,
const char **tag_values,
int num_tags,
std::vector< std::vector<iBase_EntitySetHandle> > *entity_sets,
std::vector< std::vector<iBase_EntityHandle> > *entity_groups);
ErrorCode get_matching_entities( EntityHandle root_set,
const char **tag_names,
const char **tag_values,
int num_tags,
std::vector< std::vector<EntityHandle> > *entity_sets,
std::vector< std::vector<EntityHandle> > *entity_groups);
/* \brief Retrieve groups of entities matching tags and values(if present)
* Retrieve a vector of vectors of entity handles matching the
......@@ -320,12 +319,12 @@ public:
* \param entity_sets Pointer to vector of vectors of entity set handles found in the search
* \param entity_groups Pointer to vector of vectors of entity handles from each entity set
*/
int get_matching_entities(iBase_EntitySetHandle root_set,
iBase_TagHandle *tag_handles,
const char **tag_values,
int num_tags,
std::vector< std::vector<iBase_EntitySetHandle> > *entity_sets,
std::vector< std::vector<iBase_EntityHandle> > *entity_groups);
ErrorCode get_matching_entities( EntityHandle root_set,
Tag *tag_handles,
const char **tag_values,
int num_tags,
std::vector< std::vector<EntityHandle> > *entity_sets,
std::vector< std::vector<EntityHandle> > *entity_groups);
/* \brief Return an array of tuples of tag values for each Entity Set
* A list of n-tuples will be constructed with 1 n-tuple for each Entity Set.
......@@ -338,11 +337,10 @@ public:
* \param num_tags Number of tag names
* \param tuples The returned tuple_list structure
*/
int create_tuples(iBase_EntitySetHandle *ent_sets,
int num_sets,
const char **tag_names,
int num_tags,
TupleList **tuples);
ErrorCode create_tuples( Range &ent_sets,
const char **tag_names,
unsigned int num_tags,
TupleList **tuples);
/* \brief Return an array of tuples of tag values for each Entity Set
* A list of n-tuples will be constructed with 1 n-tuple for each Entity Set.
......@@ -355,11 +353,10 @@ public:
* \param num_tags Number of tag handles
* \param tuples The returned tuple_list structure
*/
int create_tuples(iBase_EntitySetHandle *ent_sets,
int num_sets,
iBase_TagHandle *tag_handles,
int num_tags,
TupleList **tuples);
ErrorCode create_tuples( Range &ent_sets,
Tag *tag_handles,
unsigned int num_tags,
TupleList **tuples);
/* \brief Consolidate an array of n-tuples lists into one n-tuple list with no duplicates
* An array of list of n-tuples are consolidated into a single list of n-tuples
......@@ -370,9 +367,9 @@ public:
* \param num_tuples Number of tuple_lists
* \param unique_tuples The consolidated tuple_list with no duplicates
*/
int consolidate_tuples(TupleList **all_tuples,
int num_tuples,
TupleList **unique_tuples);
ErrorCode consolidate_tuples( TupleList **all_tuples,
unsigned int num_tuples,
TupleList **unique_tuples);
/* \brief Calculate integrated field values for groups of entities
* An integrated field value, as defined by the field function,
......@@ -384,11 +381,11 @@ public:
* \param num_integ_pts The number of Gaussian integration points to use in each dimension
* \param integ_type Type of integration to perform
*/
int get_group_integ_vals(std::vector< std::vector<iBase_EntityHandle> > &groups,
std::vector<double> &integ_vals,
const char *norm_tag,
int num_integ_pts,
Coupler::IntegType integ_type);
ErrorCode get_group_integ_vals( std::vector<std::vector<EntityHandle> > &groups,
std::vector<double> &integ_vals,
const char *norm_tag,
int num_integ_pts,
Coupler::IntegType integ_type);
/* \brief Apply a normalization factor to group of entities
* Multiply a normalization factor with the value of norm_tag for each vertex
......@@ -399,10 +396,10 @@ public:
* \param norm_tag The tag to be normalized on each group
* \param integ_type Type of integration to perform
*/
int apply_group_norm_factor(std::vector< std::vector<iBase_EntitySetHandle> > &entity_sets,
std::vector<double> &norm_factors,
const char *norm_tag,
Coupler::IntegType integ_type);
ErrorCode apply_group_norm_factor( std::vector<std::vector<EntityHandle> > &entity_sets,
std::vector<double> &norm_factors,
const char *norm_tag,
Coupler::IntegType integ_type);
/*
* this method will look at source (and target sets?) sets, and look for the SEM_DIMS tag
......
......@@ -555,7 +555,14 @@ namespace Element {
Hence, the inner dimension is 2, the outer dimension is gauss_count.
We use a one-point Gaussian quadrature, since it integrates linear functions exactly.
*/
const double LinearHex::gauss[1][2] = { { 2.0, 0.0 } };
//const double LinearHex::gauss[1][2] = { { 2.0, 0.0 } };
const double LinearHex::gauss[2][2] = { { 1.0, -0.5773502691 },
{ 1.0 , 0.5773502691 } };
//const double LinearHex::gauss[4][2] = { { 0.3478548451, -0.8611363116 },
// { 0.6521451549, -0.3399810436 },
// { 0.6521451549, 0.3399810436 },
// { 0.3478548451, 0.8611363116 } };
CartVect LinearHex::evaluate( const CartVect& xi ) const {
CartVect x(0.0);
......
......@@ -148,9 +148,9 @@ namespace ElemUtil {
protected:
/* Preimages of the vertices -- "canonical vertices" -- are known as "corners". */
static const double corner[8][3];
static const double gauss[1][2];
static const double gauss[2][2];
static const unsigned int corner_count = 8;
static const unsigned int gauss_count = 1;
static const unsigned int gauss_count = 2;
};// class LinearHex
......@@ -174,7 +174,7 @@ namespace ElemUtil {
static const int corner[27][3];
static const double gauss[8][2];// TODO fix me
static const unsigned int corner_count = 27;
static const unsigned int gauss_count = 8; // TODO fix me
static const unsigned int gauss_count = 2; // TODO fix me
};// class QuadraticHex
/**\brief Shape function space for a linear tetrahedron, obtained by a pushforward of the canonical affine shape functions. */
......
......@@ -11,16 +11,12 @@ AM_CPPFLAGS += -DSRCDIR=$(srcdir) \
-I$(top_srcdir)/src/parallel \
-I$(top_srcdir)/src/LocalDiscretization \
-I$(top_srcdir)/src/moab/point_locater/lotte \
-I$(top_srcdir)/test \
-I$(top_srcdir)/itaps \
-I$(top_srcdir)/itaps/imesh \
-I$(top_builddir)/itaps \
-I$(top_builddir)/itaps/imesh
-I$(top_srcdir)/test
lib_LTLIBRARIES = libmbcoupler.la
libmbcoupler_la_LIBADD = $(top_builddir)/src/libMOAB.la $(top_builddir)/itaps/imesh/libiMesh.la
libmbcoupler_la_LIBADD = $(top_builddir)/src/libMOAB.la
LDADD = libmbcoupler.la $(top_builddir)/src/libMOAB.la $(top_builddir)/itaps/imesh/libiMesh.la
LDADD = libmbcoupler.la $(top_builddir)/src/libMOAB.la
libmbcoupler_la_SOURCES = \
Coupler.cpp \
......@@ -42,19 +38,24 @@ cfgdir = $(libdir)
TESTS = elem_util_test element_test datacoupler_test
datacoupler_test_SOURCES = datacoupler_test.cpp
check_PROGRAMS = $(TESTS)
elem_util_test_SOURCES = ElemUtilTest.cpp
element_test_SOURCES = ElementTest.cpp
addfield_SOURCES = addfield.cpp
check_PROGRAMS = $(TESTS)
noinst_PROGRAMS = addfield
if PARALLEL
TESTS += mbcoupler_test
check_PROGRAMS += mbcoupler_test
noinst_PROGRAMS += ssn_test
noinst_PROGRAMS += ssn_test parcoupler_test
mbcoupler_test_SOURCES = mbcoupler_test.cpp
parcoupler_test_SOURCES = mbcoupler_test.cpp
PARALLEL_TESTS = parcoupler_test
ssn_test_SOURCES = ssn_test.cpp
AM_CPPFLAGS += -I$(srcdir)/parallel
TESTS += $(PARALLEL_TESTS)
endif
# Run parallel tests with mpiexec
LOG_COMPILER = `if echo "$(PARALLEL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo "${MPIEXEC} ${MPIEXEC_NP} ${NP}"; else echo ""; fi`
MOSTLYCLEANFILES = dum.h5m
......@@ -2,8 +2,6 @@
#include "moab/CpuTimer.hpp"
#include "DataCoupler.hpp"
#include "ElemUtil.hpp"
#include "iMesh.h"
#include "MBiMesh.hpp"
#include <iostream>
#include <iomanip>
......@@ -35,16 +33,6 @@ std::string TestDir(STRINGIFY(MESHDIR));
return result; \
}
#define PRINT_LAST_ERR \
if (iBase_SUCCESS != err) { \
std::string tmp_str; \
std::cout << "Failure; message:" << std::endl; \
mbImpl->get_last_error(tmp_str); \
std::cout << tmp_str << std::endl; \
MPI_Abort(MPI_COMM_WORLD, result); \
return result; \
}
// Print usage
void print_usage(char **argv)
{
......@@ -110,7 +98,6 @@ ErrorCode test_interpolation(Interface *mbImpl,
std::string &ssNormTag,
std::vector<const char*> &ssTagNames,
std::vector<const char*> &ssTagValues,
iBase_EntitySetHandle *roots,
std::vector<ParallelComm*> &pcs,
double &instant_time,
double &pointloc_time,
......@@ -181,13 +168,10 @@ int main(int argc, char **argv)
if (NULL == mbImpl)
return 1;
iMesh_Instance iMeshInst = reinterpret_cast<iMesh_Instance>(new MBiMesh(mbImpl));
// Read in mesh(es)
// Create root sets for each mesh using the iMesh API. Then pass these
// to the load_file functions to be populated.
iBase_EntitySetHandle *roots = (iBase_EntitySetHandle*)malloc(sizeof(iBase_EntitySetHandle) * meshFiles.size());
// Create root sets for each mesh using moab
std::vector<EntityHandle> roots( meshFiles.size());
for (unsigned int i = 0; i < meshFiles.size(); i++) {
std::string newReadopts;
......@@ -199,8 +183,9 @@ int main(int argc, char **argv)
newReadopts = readOpts+extraOpt.str();
#endif
iMesh_createEntSet(iMeshInst, 0, &(roots[i]), &err);
result = mbImpl->load_file(meshFiles[i].c_str(), (EntityHandle*)&roots[i], newReadopts.c_str());
result = mbImpl->create_meshset(MESHSET_SET, roots[i]);
PRINT_LAST_ERROR;
result = mbImpl->load_file(meshFiles[i].c_str(), &roots[i], newReadopts.c_str());
PRINT_LAST_ERROR;
}
......@@ -213,7 +198,7 @@ int main(int argc, char **argv)
// Test interpolation and global normalization and subset normalization
result = test_interpolation(mbImpl, method, interpTag, gNormTag, ssNormTag,
ssTagNames, ssTagValues, roots, pcs,
ssTagNames, ssTagValues, pcs,
instant_time, pointloc_time, interp_time,
gnorm_time, ssnorm_time, toler);
PRINT_LAST_ERROR;
......@@ -549,7 +534,6 @@ ErrorCode test_interpolation(Interface *mbImpl,
std::string &/* ssNormTag */,
std::vector<const char*> &/* ssTagNames */,
std::vector<const char*> &/* ssTagValues */,
iBase_EntitySetHandle */* roots */,
std::vector<ParallelComm*> &pcs,
double &instant_time,
double &pointloc_time,
......@@ -583,8 +567,6 @@ ErrorCode test_interpolation(Interface *mbImpl,
int numPointsOfInterest = 0;
#ifdef USE_MPI
result = pcs[1]->get_part_entities(targ_elems, 3);
#else
result = mbImpl->get_entities_by_dimension((EntityHandle)roots[1], 3);
#endif
PRINT_LAST_ERROR;
......@@ -627,48 +609,6 @@ ErrorCode test_interpolation(Interface *mbImpl,
interp_time = timer.time_elapsed();
/*
// Do global normalization if specified
if (!gNormTag.empty()) {
int err;
// Normalize the source mesh
err = dc.normalize_mesh(roots[0], gNormTag.c_str(), DataCoupler::VOLUME, 4);
PRINT_LAST_ERR;
// Normalize the target mesh
err = dc.normalize_mesh(roots[1], gNormTag.c_str(), DataCoupler::VOLUME, 4);
PRINT_LAST_ERR;
}
gnorm_time = timer.time_elapsed();
// Do subset normalization if specified
if (!ssNormTag.empty()) {
int err;
err = dc.normalize_subset(roots[0],
ssNormTag.c_str(),
&ssTagNames[0],
ssTagNames.size(),
&ssTagValues[0],
DataCoupler::VOLUME,
4);
PRINT_LAST_ERR;
err = dc.normalize_subset(roots[1],
ssNormTag.c_str(),
&ssTagNames[0],
ssTagNames.size(),
&ssTagValues[0],
DataCoupler::VOLUME,
4);
PRINT_LAST_ERR;
}
ssnorm_time = timer.time_elapsed();
*/
// Set field values as tag on target vertices
// Use original tag
Tag tag;
......
// MOAB includes
#include "moab/ParallelComm.hpp"
#include "MBParallelConventions.h"
#include "moab/Core.hpp"
#include "Coupler.hpp"
#include "iMesh_extensions.h"
#include "moab_mpi.h"
#include "ElemUtil.hpp"
#include "MBiMesh.hpp"
// C++ includes
#include <iostream>
#include <iomanip>
#include <sstream>
......@@ -22,25 +22,14 @@ std::string TestDir(STRINGIFY(MESHDIR));
std::string TestDir(".");
#endif
#define PRINT_LAST_ERROR \
if (MB_SUCCESS != result) { \
std::string tmp_str; \
std::cout << "Failure; message:" << std::endl; \
mbImpl->get_last_error(tmp_str); \
std::cout << tmp_str << std::endl; \
MPI_Abort(MPI_COMM_WORLD, result); \
return result; \
}
#define PRINT_LAST_ERR \
if (iBase_SUCCESS != err) { \
std::string tmp_str; \
std::cout << "Failure; message:" << std::endl; \
mbImpl->get_last_error(tmp_str); \
std::cout << tmp_str << std::endl; \
MPI_Abort(MPI_COMM_WORLD, result); \
return result; \
}
/*
Sample usages:
1) P_0 interpolation: ./mbcoupler_test -meshes <src_mesh> <target_mesh> -itag <interp_tag> -meth 0 -outfile <output>
2) P_1 interpolation: ./mbcoupler_test -meshes <src_mesh> <target_mesh> -itag <interp_tag> -meth 1 -outfile <output>
3) P_1 interpolation with epsilon control: ./mbcoupler_test -meshes <src_mesh> <target_mesh> -itag <interp_tag> -meth 1 -eps <tolerance for locating points; say 0.01> -outfile <output>
3) P_0 interpolation with global normalization: ./mbcoupler_test -meshes <src_mesh> <target_mesh> -itag <interp_tag> -meth 0 -gnorm <gnorm_tag_name> -outfile <output>
4) P_1 interpolation with subset normalization: ./mbcoupler_test -meshes <src_mesh> <target_mesh> -itag <interp_tag> -meth 1 -ssnorm <snorm_tag_name> <snorm_criteria: MATERIAL_SET> -outfile <output>
*/
// Print usage
void print_usage()
......@@ -73,7 +62,7 @@ void print_usage()
#ifdef HDF5_FILE
ErrorCode get_file_options(int argc, char **argv,
ErrorCode get_file_options(int argc, char **argv, int rank,
std::vector<std::string> &meshFiles,
Coupler::Method &method,
std::string &interpTag,
......@@ -88,12 +77,6 @@ ErrorCode get_file_options(int argc, char **argv,
bool &help,
double &epsilon);
// ErrorCode get_file_options(int argc, char **argv,
// std::vector<const char*> &filenames,
// std::string &tag_name,
// std::string &out_fname,
// std::string &opts);
ErrorCode report_iface_ents(Interface *mbImpl,
std::vector<ParallelComm*> &pcs,
bool print_results);
......@@ -105,7 +88,7 @@ ErrorCode test_interpolation(Interface *mbImpl,
std::string &ssNormTag,
std::vector<const char*> &ssTagNames,
std::vector<const char*> &ssTagValues,
iBase_EntitySetHandle *roots,
EntityHandle *roots,
std::vector<ParallelComm*> &pcs,
double &instant_time,
double &pointloc_time,
......@@ -127,30 +110,30 @@ void reduceMax(double &v)
int main(int argc, char **argv)
{
// Need to init MPI first, to tell how many procs and rank
int err = MPI_Init(&argc, &argv);
int ierr = MPI_Init(&argc, &argv);
std::vector<const char*> ssTagNames, ssTagValues;
std::vector<std::string> meshFiles;
std::string interpTag, gNormTag, ssNormTag, readOpts, outFile, writeOpts, dbgFile;
Coupler::Method method = Coupler::CONSTANT;
ErrorCode result = MB_SUCCESS;
ErrorCode result;
bool help = false;
double toler = 5.e-10;
result = get_file_options(argc, argv, meshFiles, method, interpTag,
int nprocs, rank;
ierr = MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
result = get_file_options(argc, argv, rank, meshFiles, method, interpTag,
gNormTag, ssNormTag, ssTagNames, ssTagValues,