#include <xdr_mesh.h>
enum XdrIO_TYPE { UNKNOWN = -1, ENCODE = 0, DECODE, W_ASCII, R_ASCII }
XdrMESH ()
void init (XdrIO_TYPE type, const char *fn, int icnt, int dim=3)
~XdrMESH ()
int header (XdrMHEAD *hd)
int Icon (int *array, int numvar, int num)
int coord (Real *array, int dim, int size)
int BC (int *array, int size)
void init (XdrIO_TYPE t, const char *fn, const char *type, int icnt)
void fini ()
int dataBlk (int *array, int numvar, int size)
int dataBlk (Real *array, int numvar, int size)
LegacyXdrIO::FileFormat get_orig_flag () const
void set_orig_flag (LegacyXdrIO::FileFormat in_orig_flag)
void set_num_levels (unsigned int num_levels)
unsigned int get_num_levels ()
unsigned int _num_levels
XdrIO_TYPE m_type
XDR * mp_xdr_handle
LegacyXdrIO::FileFormat orig_flag
std::ifstream mp_in
OFStream mp_out
The XdrMESH class. This class is responsible for reading/writing information about the mesh to xdr style binary files.
Author:
Definition at line 38 of file xdr_mesh.h.
Enumerator:
Definition at line 94 of file xdr_mgf.h.
{UNKNOWN = -1, ENCODE=0, DECODE,
W_ASCII , R_ASCII};
Definition at line 46 of file xdr_mesh.h.
: m_dim(-1) {}
Definition at line 64 of file xdr_mesh.h.
{}
Parameters:
Returns:
Definition at line 102 of file xdr_mesh.h.
References XdrMGF::dataBlk().
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ return dataBlk(array, 3, size);}
Parameters:
Returns:
Definition at line 93 of file xdr_mesh.h.
References XdrMGF::dataBlk().
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ return dataBlk(array, dim, size);}
Parameters:
Definition at line 275 of file xdr_mgf.C.
References XdrMGF::DECODE, XdrMGF::ENCODE, XdrMGF::m_type, XdrMGF::mp_in, XdrMGF::mp_out, XdrMGF::mp_xdr_handle, XdrMGF::R_ASCII, and XdrMGF::W_ASCII.
Referenced by BC(), coord(), Icon(), and XdrSOLN::values().
{
int totalSize = numvar*size;
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::DECODE):
case (XdrMGF::ENCODE):
{
xdr_vector(mp_xdr_handle,
(char *) &array[0],
totalSize,
sizeof(int),
(xdrproc_t) xdr_int);
break;
}
#endif
case (XdrMGF::W_ASCII):
{
for (int i=0; i<size; i++)
{
for (int j=0; j<numvar; j++)
mp_out << array[i*numvar + j] << ' ';
mp_out << ';
}
mp_out.flush();
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
for (int i=0; i<size; i++)
{
for (int j=0; j<numvar; j++)
{
mp_in >> array[i*numvar + j];
}
mp_in.ignore(); // Read newline
}
break;
}
default:
// Unknown access type
libmesh_error();
}
return totalSize;
}
Definition at line 338 of file xdr_mgf.C.
References XdrMGF::DECODE, XdrMGF::ENCODE, XdrMGF::m_type, XdrMGF::mp_in, XdrMGF::mp_out, XdrMGF::mp_xdr_handle, XdrMGF::R_ASCII, and XdrMGF::W_ASCII.
{
int totalSize = numvar*size;
// If this function is called by coord(),
// numvar is the problem dimension, and
// size is the number of nodes in the problem.
//std::cout << 'Total amount of data to be written: ' << totalSize << std::endl;
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::DECODE):
case (XdrMGF::ENCODE):
{
// FIXME - this is probably broken for Real == long double
// RHS
xdr_vector(mp_xdr_handle,
(char *) &array[0],
totalSize,
sizeof(Real),
(xdrproc_t) xdr_REAL);
}
#endif
case (XdrMGF::W_ASCII):
{
for (int i=0; i<size; i++)
{
for (int j=0; j<numvar; j++)
OFSRealscientific(mp_out,17,array[i*numvar + j]) << ' ';
mp_out << ';
}
mp_out.flush();
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
for (int i=0; i<size; i++)
{
libmesh_assert (mp_in.good());
for (int j=0; j<numvar; j++)
mp_in >> array[i*numvar + j];
mp_in.ignore(); // Read newline
}
break;
}
default:
// Unknown access type
libmesh_error();
}
return totalSize;
}
Uses xdr_destroy found in rpc/rpc.h.
Definition at line 33 of file xdr_mgf.C.
References XdrMGF::mp_fp, and XdrMGF::mp_xdr_handle.
Referenced by XdrMGF::init(), and XdrMGF::~XdrMGF().
{
#ifdef LIBMESH_HAVE_XDR
if (mp_xdr_handle)
{
//std::cout << 'Destroying XDR file handle.' << std::endl;
xdr_destroy(mp_xdr_handle);
}
//std::cout << 'Deleting the file handle pointer.' << std::endl;
delete mp_xdr_handle;
mp_xdr_handle = NULL;
#endif
if (mp_fp)
{
//std::cout << 'Closing file.' << std::endl;
std::fflush(mp_fp);
std::fclose(mp_fp);
}
mp_fp = NULL;
}
Definition at line 186 of file xdr_mgf.h.
References XdrMGF::_num_levels.
Referenced by header(), XdrMGF::init(), and LegacyXdrIO::read_mesh().
{ return _num_levels; }
Definition at line 170 of file xdr_mgf.h.
References XdrMGF::orig_flag.
Referenced by XdrMGF::init(), LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ return orig_flag; }
Parameters:
Returns:
Definition at line 27 of file xdr_mesh.C.
References XdrHEAD::cpyString(), XdrMGF::DECODE, XdrMGF::ENCODE, XdrMHEAD::get_block_elt_types(), XdrMHEAD::get_n_blocks(), XdrMHEAD::get_num_elem_each_block(), XdrMGF::get_num_levels(), XdrHEAD::getId(), XdrHEAD::getTitle(), XdrHEAD::m_numBCs, XdrHEAD::m_numel, XdrHEAD::m_numNodes, XdrHEAD::m_strSize, XdrHEAD::m_sumWghts, XdrMGF::m_type, XdrHEAD::mp_id, XdrMGF::mp_in, XdrMGF::mp_out, XdrHEAD::mp_title, XdrMGF::mp_xdr_handle, XdrMGF::orig_flag, XdrMGF::R_ASCII, XdrMHEAD::set_block_elt_types(), XdrMHEAD::set_n_blocks(), XdrMHEAD::set_num_elem_each_block(), XdrHEAD::setId(), XdrHEAD::setTitle(), and XdrMGF::W_ASCII.
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{
// Temporary variables to facilitate stream reading
const int comm_len= 256;
char comment[comm_len];
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::DECODE):
case (XdrMGF::ENCODE):
{
xdr_int(mp_xdr_handle, &(hd->m_numel));
xdr_int(mp_xdr_handle, &(hd->m_numNodes));
xdr_int(mp_xdr_handle, &(hd->m_sumWghts));
xdr_int(mp_xdr_handle, &(hd->m_numBCs));
xdr_int(mp_xdr_handle, &(hd->m_strSize));
break;
}
#endif
case (XdrMGF::W_ASCII):
{
mp_out << hd->m_numel << ' # Num. Elements;
mp_out << hd->m_numNodes << ' # Num. Nodes;
mp_out << hd->m_sumWghts << ' # Sum of Element Weights;
mp_out << hd->m_numBCs << ' # Num. Boundary Conds.;
mp_out << hd->m_strSize << ' # String Size (ignore);
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
mp_in >> hd->m_numel ; mp_in.getline(comment, comm_len);
mp_in >> hd->m_numNodes ; mp_in.getline(comment, comm_len);
mp_in >> hd->m_sumWghts ; mp_in.getline(comment, comm_len);
mp_in >> hd->m_numBCs ; mp_in.getline(comment, comm_len);
mp_in >> hd->m_strSize ; mp_in.getline(comment, comm_len);
libmesh_assert(mp_in.good());
break;
}
default:
// Unknown access type
libmesh_error();
}
// Let's write the augmented header information
// before we write the title and id string
// Both DEAL and LIBM style files have augmented headers.
if ((orig_flag == 0) || (orig_flag == 2))
{
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
case (XdrMGF::DECODE):
{
// this used to be 0. How did that work?
unsigned int temp_n_blocks = hd->get_n_blocks();
xdr_u_int(mp_xdr_handle, &temp_n_blocks);
hd->set_n_blocks(temp_n_blocks);
// The number of blocks (i.e. the number of element types)
// for any mesh must always
// be at least 1.
libmesh_assert(hd->get_n_blocks() != 0);
break;
}
#endif
case (XdrMGF::W_ASCII):
{
mp_out << hd->get_n_blocks() << ' # Num. Element Blocks.;
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
unsigned int temp_n_blocks=0;
mp_in >> temp_n_blocks;
hd->set_n_blocks(temp_n_blocks);
mp_in.getline(comment, comm_len);
break;
}
default:
// Unknown access type
libmesh_error();
}
std::vector<ElemType> et;
hd->get_block_elt_types(et);
// Note: If DECODING or READING, allocate space in the vector
if ((m_type == DECODE) || (m_type == R_ASCII))
et.resize(hd->get_n_blocks());
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
case (XdrMGF::DECODE):
{
xdr_vector(mp_xdr_handle,
(char *) &et[0],
et.size(),
sizeof(unsigned int),
(xdrproc_t) xdr_u_int);
break;
}
#endif
case (XdrMGF::W_ASCII):
{
for (unsigned int i=0; i<hd->get_n_blocks(); i++)
mp_out << et[i] << ' ';
mp_out << ' # Element types in each block.;
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
for (unsigned int i=0; i<hd->get_n_blocks(); i++)
{
// convoluted way of doing it to
// satisfy icc
unsigned int type;
mp_in >> type ;
et[i] = static_cast<ElemType>(type) ;
}
mp_in.getline(comment, comm_len);
break;
}
default:
// Unknown access type
libmesh_error();
}
// Note: If DECODING or READING, you need to set the value
// in the header data structure.
if ((m_type == DECODE) || (m_type == R_ASCII))
hd->set_block_elt_types(et);
std::vector<unsigned int> neeb;
hd->get_num_elem_each_block(neeb);
// If DECODING or READING, allocate space for the vector
if ((m_type == DECODE) || (m_type == R_ASCII))
neeb.resize( hd->get_n_blocks()*(this->get_num_levels()+1) );
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
case (XdrMGF::DECODE):
{
xdr_vector(mp_xdr_handle,
(char *) &neeb[0],
neeb.size(),
sizeof(unsigned int),
(xdrproc_t) xdr_u_int);
}
#endif
case (XdrMGF::W_ASCII):
{
for (unsigned int i=0; i<neeb.size(); i++)
mp_out << neeb[i] << ' ';
mp_out << ' # Num. of elements in each block at each level.;
break;
}
case (XdrMGF::R_ASCII):
{
// We will treat this line as containing
// 1.) The number of elements in each block OR
// 2.) The number of elements at each level in each block
// Therefore, we don't know a-priori how many ints to read.
// Get the full line from the stream up to the newline
mp_in.getline(comment, comm_len);
// Construct a char buffer to hold the tokens as we
// process them, and construct a std::string object and
// a std::stringstream object for tokenizing this line.
char token[comm_len];
std::string s_temp(comment);
std::stringstream ss(s_temp);
// Resize the neeb vector to zero so we can push back
// values onto it. Note that we are using a tokenizer
// scheme again here to read the line, but it's not entirely
// necessary since we know the size neeb should have.
neeb.resize(0);
// Process the tokens one at a time
while (ss >> token)
{
// If you reach the hash, the rest of the line is a comment,
// so quit reading.
if (token[0] == '#')
break;
// If you reach an alphabetic character, this is an error
if (!isdigit(token[0]))
{
std::cerr << 'Error: Unrecognized character detected.'
<< std::endl;
libmesh_error();
}
// Otherwise, add the value to the neeb vector
neeb.push_back( std::atoi(token) );
}
// Be sure you have the right number of entries in neeb
libmesh_assert (neeb.size() == (hd->get_n_blocks() * (this->get_num_levels()+1)));
break;
}
default:
// Unknown access type
libmesh_error();
}
if ((m_type == DECODE) || (m_type == R_ASCII))
hd->set_num_elem_each_block(neeb);
}
else if (orig_flag == 1) // MGF originator
{
}
else // Unknown Originator!
{
libmesh_error();
}
// Write the ID and TITLE strings (can be safely ignored)
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
case (XdrMGF::DECODE):
{
char* temp = hd->cpyString(hd->getId());
xdr_string(mp_xdr_handle,&temp, ((m_type == XdrMGF::ENCODE) ? std::strlen(temp) : hd->m_strSize));
hd->setId(temp);
delete [] temp;
temp = hd->cpyString(hd->getTitle());
xdr_string(mp_xdr_handle,&temp, ((m_type == XdrMGF::ENCODE) ? std::strlen(temp) : hd->m_strSize));
hd->setTitle(temp);
delete [] temp;
break;
}
#endif
case (XdrMGF::W_ASCII):
{
mp_out << hd->mp_id << ';
mp_out << hd->mp_title << ';
break;
}
case (XdrMGF::R_ASCII):
{
libmesh_assert (mp_in.good());
mp_in.getline(comment, comm_len);
hd->setId(comment);
libmesh_assert (mp_in.good());
mp_in.getline(comment, comm_len);
hd->setTitle(comment);
break;
}
default:
// Unknown access type
libmesh_error();
}
return 1;
}
Parameters:
Returns:
Definition at line 84 of file xdr_mesh.h.
References XdrMGF::dataBlk().
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ return dataBlk(array, numvar, num);}
Creates a new xdr file name and opens this file.
Opens the appropriate xdr file handle.
Reads/Writes a signature to the file.
{itemize}
Definition at line 66 of file xdr_mgf.C.
References LegacyXdrIO::DEAL, XdrMGF::DECODE, XdrMGF::ENCODE, XdrMGF::fini(), XdrMGF::get_num_levels(), XdrMGF::get_orig_flag(), LegacyXdrIO::LIBM, XdrMGF::m_type, LegacyXdrIO::MGF, XdrMGF::mp_fp, XdrMGF::mp_in, XdrMGF::mp_out, XdrMGF::mp_xdr_handle, Quality::name(), XdrMGF::orig_flag, XdrMGF::R_ASCII, XdrMGF::tokenize_first_line(), and XdrMGF::W_ASCII.
{
m_type=t;
// Close old file if necessary
if (mp_fp) this->fini();
// Open file
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
case (XdrMGF::DECODE):
{
mp_fp = fopen (fn, (m_type == ENCODE) ? 'w' : 'r');
// Make sure the file is ready for use
if (!mp_fp)
{
std::cerr << 'XDR Error: Accessing file: '
<< fn
<< ' failed.'
<< std::endl;
libmesh_error();
}
// Create the XDR handle
mp_xdr_handle = new XDR;
xdrstdio_create(mp_xdr_handle,
mp_fp,
((m_type == ENCODE) ? XDR_ENCODE : XDR_DECODE));
break;
}
#endif
case (XdrMGF::R_ASCII):
{
mp_in.open(fn, std::ios::in);
// Make sure it opened correctly
if (!mp_in.good())
libmesh_file_error(fn);
break;
}
case (XdrMGF::W_ASCII):
{
mp_out.open(fn, std::ios::out);
// Make sure it opened correctly
if (!mp_out.good())
libmesh_file_error(fn);
break;
}
default:
{
std::cout << 'Unrecognized file access type!' << std::endl;
libmesh_error();
}
}
// Read/Write the file signature
const int bufLen = 12;
char buf[bufLen+1];
switch (m_type)
{
#ifdef LIBMESH_HAVE_XDR
case (XdrMGF::ENCODE):
{
char* p = &buf[0];
const LegacyXdrIO::FileFormat orig = this->get_orig_flag();
std::ostringstream name;
if (orig == LegacyXdrIO::DEAL)
name << 'DEAL 003:003';
else if (orig == LegacyXdrIO::MGF)
name << 'MGF 002:000';
else if (orig == LegacyXdrIO::LIBM)
name << 'LIBM ' << this->get_num_levels();
else
libmesh_error();
// Fill the buffer
std::sprintf(&buf[0], '%s', name.str().c_str());
xdr_string(mp_xdr_handle, &p, bufLen); // Writes binary signature
break;
}
case (XdrMGF::DECODE):
{
char* p = &buf[0];
xdr_string(mp_xdr_handle, &p, bufLen); // Reads binary signature
// Set the number of levels used in the mesh
this->tokenize_first_line(p);
break;
}
#endif
case (XdrMGF::W_ASCII):
{
const LegacyXdrIO::FileFormat orig = this->get_orig_flag();
if (orig == LegacyXdrIO::DEAL)
std::sprintf(&buf[0], '%s %03d:%03d', 'DEAL', 3, 3);
else if (orig == LegacyXdrIO::MGF)
std::sprintf(&buf[0], '%s %03d:%03d', 'MGF ', 2, 0);
else if (orig == LegacyXdrIO::LIBM)
std::sprintf(&buf[0], '%s %d', 'LIBM', this->get_num_levels());
mp_out << buf << ';
break;
}
case (XdrMGF::R_ASCII):
{
#ifdef __HP_aCC
// weirdly, _only_ here aCC
// is not fond of mp_in.getline()
// however, using mp_in.getline()
// further below is ok...
std::string buf_buf;
std::getline (mp_in, buf_buf, ');
libmesh_assert (buf_buf.size() <= bufLen);
buf_buf.copy (buf, std::string::npos);
#else
// Here we first use getline() to grab the very
// first line of the file into a char buffer. Then
// this line is tokenized to look for:
// 1.) The name LIBM, which specifies the new Mesh style.
// 2.) The number of levels in the Mesh which is being read.
// Note that 'buf' will be further processed below, here we
// are just attempting to get the number of levels.
mp_in.getline(buf, bufLen+1);
#endif
// Determine the number of levels in this mesh
this->tokenize_first_line(buf);
break;
}
default:
libmesh_error();
}
// If you are reading or decoding, process the signature
if ((m_type == R_ASCII) || (m_type == DECODE))
{
char name[5];
std::strncpy(name, &buf[0], 4);
name[4] = ' ';
if (std::strcmp (name, 'DEAL') == 0)
{
this->orig_flag = LegacyXdrIO::DEAL; // 0 is the DEAL identifier by definition
}
else if (std::strcmp (name, 'MGF ') == 0)
{
this->orig_flag = LegacyXdrIO::MGF; // 1 is the MGF identifier by definition
}
else if (std::strcmp (name, 'LIBM') == 0)
{
this->orig_flag = LegacyXdrIO::LIBM; // the New and Improved XDA
}
else
{
std::cerr << 'No originating software can be determined. Error.'
<< std::endl;
libmesh_error();
}
}
}
Parameters:
Definition at line 58 of file xdr_mesh.h.
References m_dim.
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ XdrMGF::init(type, fn, 'mesh', icnt); m_dim = dim;}
Definition at line 181 of file xdr_mgf.h.
References XdrMGF::_num_levels.
Referenced by LegacyXdrIO::write_mesh().
{ _num_levels = num_levels; }
Definition at line 175 of file xdr_mgf.h.
References XdrMGF::orig_flag.
Referenced by LegacyXdrIO::read_mesh(), and LegacyXdrIO::write_mesh().
{ orig_flag = in_orig_flag; }
Definition at line 193 of file xdr_mgf.h.
Referenced by XdrMGF::get_num_levels(), XdrMGF::set_num_levels(), and XdrMGF::tokenize_first_line().
Definition at line 110 of file xdr_mesh.h.
Definition at line 206 of file xdr_mgf.h.
Referenced by XdrMGF::dataBlk(), XdrSOLN::header(), header(), and XdrMGF::init().
Definition at line 240 of file xdr_mgf.h.
Referenced by XdrMGF::dataBlk(), XdrSOLN::header(), header(), and XdrMGF::init().
Definition at line 248 of file xdr_mgf.h.
Referenced by XdrMGF::dataBlk(), XdrSOLN::header(), header(), and XdrMGF::init().
Definition at line 216 of file xdr_mgf.h.
Referenced by XdrMGF::dataBlk(), XdrMGF::fini(), XdrSOLN::header(), header(), and XdrMGF::init().
Definition at line 235 of file xdr_mgf.h.
Referenced by XdrMGF::get_orig_flag(), header(), XdrMGF::init(), and XdrMGF::set_orig_flag().
Generated automatically by Doxygen for libMesh from the source code.