46                           int iomode, 
const char *typestr) {
 
   57                           int iomode, 
const char *typestr) {
 
   66                              const char *typestr, 
int iomode) {
 
   71    Ippl::abort(
"IO mode for DiscParticle must be INPUT, OUTPUT, or APPEND.");
 
  120                                       unsigned int attrib)
 const {
 
  123      attrib < 
RecordList[record]->disctypes.size())
 
  124    return (
RecordList[record]->disctypes[attrib].c_str());
 
  134  unsigned int retval = 0;
 
  135  for (
unsigned int i=0; i < 
RecordList[record]->localparticles.size(); ++i)
 
  136    retval += 
RecordList[record]->localparticles[i];
 
  148  FILE *f = fopen(fnm.c_str(), mode.c_str());
 
  151  if (f == 0 && reporterr) {
 
  152    ERRORMSG(
"DiscParticle: Could not open file '" << fnm.c_str());
 
  179    ERRORMSG(
"Bad config file in DiscParticle::write_meta." << 
endl);
 
  182    ERRORMSG(
"Trying to write a DiscParticle .meta file for a DiscParticle");
 
  186    ERRORMSG(
"Only one fileset/SMP max allowed when writing" << 
endl);
 
  196  FILE *outputMeta = 
open_file(filename, std::string(
"w"));
 
  202  fprintf(outputMeta, 
"Type =           %s\n", 
TypeString.c_str());
 
  204  fprintf(outputMeta, 
"Records =        %ld\n", rnum);
 
  208  for (
unsigned int r=0; r < 
RecordList.size(); ++r) {
 
  210    fprintf(outputMeta, 
"RecordAttribs =  %u  %d\n", r,
 
  212    fprintf(outputMeta, 
"RecordLocPtcl =  %u  %d\n", r,
 
  214    fprintf(outputMeta, 
"RecordGlobPtcl = %u  %d\n", r,
 
  218    fprintf(outputMeta, 
"RecordElemByte = %u ", r);
 
  221    for (b=0; b<bmax; ++b)
 
  222      fprintf(outputMeta, 
" %d", 
RecordList[r]->bytesize[b]);
 
  223    fprintf(outputMeta, 
"\n");
 
  224    fprintf(outputMeta, 
"RecordDiscType = %u ", r);
 
  225    for (b=0; b<bmax; ++b)
 
  226      fprintf(outputMeta, 
" %s", 
RecordList[r]->disctypes[b].c_str());
 
  227    fprintf(outputMeta, 
"\n");
 
  228    fprintf(outputMeta, 
"RecordOffset =   %u ", r);
 
  230    for (b=0; b<bmax; ++b)
 
  231      fprintf(outputMeta, 
" %ld", 
RecordList[r]->offset[0][b]);
 
  232    fprintf(outputMeta, 
"\n");
 
  249    ERRORMSG(
"Bad config file in DiscParticle::read_meta." << 
endl);
 
  253  bool iserror = 
false;
 
  272      DiscMeta outputMeta(filename.c_str());
 
  273      if (outputMeta.
size() == 0)
 
  278      for ( ; metaline != outputMeta.
end(); ++metaline) {
 
  280        int linesread  = (*metaline).first;
 
  281        int numtokens  = (*metaline).second.first;
 
  282        std::string *tokens = (*metaline).second.second;
 
  285        if (tokens[0] == 
"Type") {
 
  286          if (numtokens > 1 && sf == 0)
 
  288        } 
else if (tokens[0] == 
"SMPs" && numtokens == 2) {
 
  289          unsigned int checkfileSMPs = atoi(tokens[1].c_str());
 
  291            ERRORMSG(
"SMP number mismatch in file " << filename);
 
  296        } 
else if (tokens[0] == 
"NextOffset" && numtokens == 2) {
 
  298        } 
else if (tokens[0] == 
"Records" && numtokens == 2) {
 
  299          unsigned int numrec = atoi(tokens[1].c_str());
 
  301            ERRORMSG(
"Illegal Records value in file '" << filename << 
"' ");
 
  307            for (
int r=0; r < atoi(tokens[1].c_str()); ++r)
 
  310        } 
else if (tokens[0] == 
"RecordAttribs" && numtokens == 3) {
 
  311          unsigned int recnum = atoi(tokens[1].c_str());
 
  312          int attribs = atoi(tokens[2].c_str());
 
  314            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  316          } 
else if (sf > 0 && attribs != 
RecordList[recnum]->attributes) {
 
  317            ERRORMSG(
"Illegal number of attributes in file " << filename);
 
  318            ERRORMSG(
" (" << attribs << 
" != ");
 
  324        } 
else if (tokens[0] == 
"RecordLocPtcl" && numtokens == 3) {
 
  325          unsigned int recnum = atoi(tokens[1].c_str());
 
  326          int nump = atoi(tokens[2].c_str());
 
  328            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  331            RecordList[recnum]->localparticles.push_back(nump);
 
  333        } 
else if (tokens[0] == 
"RecordGlobPtcl" && numtokens == 3) {
 
  334          unsigned int recnum = atoi(tokens[1].c_str());
 
  335          int nump = atoi(tokens[2].c_str());
 
  337            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  339          } 
else if (sf > 0 && nump != 
RecordList[recnum]->globalparticles) {
 
  340            ERRORMSG(
"Illegal number of global particles in file "<<filename);
 
  347        } 
else if (tokens[0] == 
"RecordElemByte" && numtokens >= 2) {
 
  348          unsigned int recnum = atoi(tokens[1].c_str());
 
  350            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  353            for (
int b=2; b < numtokens; ++b) {
 
  354              int bytesize = atoi(tokens[b].c_str());
 
  355              if (sf > 0 && bytesize != 
RecordList[recnum]->bytesize[b-2]) {
 
  356                ERRORMSG(
"Illegal byte size for attribute " << b-2);
 
  357                ERRORMSG(
" in file " << filename << 
"(" << bytesize);
 
  361              } 
else if (sf == 0) {
 
  362                RecordList[recnum]->bytesize.push_back(bytesize);
 
  367                 static_cast<unsigned int>(
RecordList[recnum]->attributes))) {
 
  368              ERRORMSG(
"Incorrect number of byte size values in file ");
 
  373        } 
else if (tokens[0] == 
"RecordDiscType" && numtokens >= 2) {
 
  374          unsigned int recnum = atoi(tokens[1].c_str());
 
  376            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  379            for (
int b=2; b < numtokens; ++b) {
 
  380              if (sf > 0 && tokens[b] != 
RecordList[recnum]->disctypes[b-2]) {
 
  381                ERRORMSG(
"Inconsistent DiscType for attribute " << b-2);
 
  382                ERRORMSG(
" in file " << filename << 
"(" << tokens[b]);
 
  386              } 
else if (sf == 0) {
 
  387                RecordList[recnum]->disctypes.push_back(tokens[b]);
 
  392                 static_cast<unsigned int>(
RecordList[recnum]->attributes))) {
 
  393              ERRORMSG(
"Incorrect number of DiscType values in file ");
 
  398        } 
else if (tokens[0] == 
"RecordOffset" && numtokens >= 2) {
 
  399          unsigned int recnum = atoi(tokens[1].c_str());
 
  401            ERRORMSG(
"Illegal record number '" << recnum << 
"'" << 
endl);
 
  404            std::vector<Offset_t> offsetvec;
 
  405            for (
int b=2; b < numtokens; ++b) {
 
  406              Offset_t offset = atol(tokens[b].c_str());
 
  407              if (sf > 0 && offset != 
RecordList[recnum]->offset[sf][b-2]) {
 
  408                ERRORMSG(
"Illegal offset for attribute " << b-2);
 
  409                ERRORMSG(
" in file " << filename << 
"(");
 
  410                ERRORMSG(
static_cast<long>(offset) << 
" != ");
 
  414              } 
else if (sf == 0) {
 
  415                offsetvec.push_back(offset);
 
  419                if (offsetvec.size() != (
RecordList[recnum]->attributes==0 ? 1u :
 
  420                                         static_cast<unsigned int>(
RecordList[recnum]->attributes))) {
 
  421                ERRORMSG(
"Incorrect number of offset values in file ");
 
  425                RecordList[recnum]->offset.push_back(offsetvec);
 
  436          ERRORMSG(
"Format error on line " << linesread << 
" in file ");
 
  449    for (
int s=0; s <= numinform; ++s) {
 
  459          int errint = iserror;
 
  466            for (
unsigned int r=0; r < 
RecordList.size(); ++r) {
 
  467              int filesnum = 
RecordList[r]->localparticles.size();
 
  471              for (
unsigned int p=0; p < 
RecordList[r]->localparticles.size(); ++p)
 
  473              for (
unsigned int b=0; b < 
RecordList[r]->bytesize.size(); ++b)
 
  477              std::string unknowndtype = 
"u";
 
  478              for (
unsigned int dr = 
RecordList[r]->disctypes.size();
 
  480                RecordList[r]->disctypes.push_back(unknowndtype);
 
  482              for (
unsigned int t=0; t < 
RecordList[r]->bytesize.size(); ++t)
 
  484              for (
unsigned int z=0; z < 
RecordList[r]->offset.size(); ++z) {
 
  485                for (
unsigned int o=0; o < 
RecordList[r]->offset[z].size(); ++o) {
 
  508    int errint = 0, numrec = 0, val = 0;
 
  510    iserror = (errint != 0);
 
  516      for (
int r=0; r < numrec; ++r) {
 
  518        int filesnum = 
RecordList[r]->localparticles.size();
 
  525        for (
int p=0; p < filesnum; ++p) {
 
  529        for (
int b=0; b < numattr; ++b) {
 
  533        for (
int t=0; t < numattr; ++t) {
 
  538        for (
int z=0; z < filesnum; ++z) {
 
  539          std::vector<Offset_t> offsetvec;
 
  542          for (
int o=0; o < numattr; ++o) {
 
  545            offsetvec.push_back(offset);
 
  575  std::vector<int> numvec;
 
  576  std::vector<Offset_t> offsetvec;
 
  582    ERRORMSG(
" in .data file for DiscParticle::write_data." << 
endl);
 
  588  int numattr = 
info->attributes;
 
  591  for (
int a=0; 
a < numattr; ++
a) {
 
  595    for (
unsigned int n=0; 
n < msgvec.size(); ++
n) {
 
  600        msgvec[
n]->get(nump);
 
  601        numvec.push_back(nump);
 
  609        void *msgdata = msgvec[
n]->remove();
 
  612        unsigned int totalbytes = nump * 
info->bytesize[
a];
 
  613        if (fwrite(msgdata, 1, totalbytes, outputData) != totalbytes) {
 
  614          ERRORMSG(
"Write error in DiscParticle::write_data" << 
endl);
 
  628      if ((
a+1) == numattr)
 
  634  info->offset.push_back(offsetvec);
 
  635  info->localparticles.push_back(totalnum);
 
  646                              unsigned int record, 
unsigned int fileset) {
 
  650  int nump = 
RecordList[record]->localparticles[fileset];
 
  651  int bytesize = 
RecordList[record]->bytesize[attrib];
 
  654  if (nump < 1 || bytesize < 1)
 
  660    if (fseek(outputData, seekpos, SEEK_SET) != 0) {
 
  661      ERRORMSG(
"Error seeking to position " << 
static_cast<long>(seekpos));
 
  662      ERRORMSG(
" in .data file for DiscParticle::read_data." << 
endl);
 
  669  unsigned int totalbytes = nump * bytesize;
 
  670  void *buffer = malloc(totalbytes);
 
  673  if (fread(buffer, 1, totalbytes, outputData) != totalbytes) {
 
  674    ERRORMSG(
"Read error in DiscParticle::read_data" << 
endl);
 
  697    msg << 
"For record " << r << 
":" << 
endl;
 
  700    msg << 
"  Byte size of attributes =";
 
  704    msg << 
"  DiscTypes of attributes =";
 
  711      msg << 
"  Local number of particles in fileset " << f << 
" = ";
 
  714        msg << 
"  Offset of attribute " << 
a << 
" in fileset " << f << 
" = ";
 
  720  msg << 
"Configuration file information:" << 
endl;
 
void putMessage(Message &m, const T &t)
void getMessage(Message &m, T &t)
Inform & endl(Inform &inf)
std::string::iterator iterator
bool send(Message *, int node, int tag, bool delmsg=true)
Message * receive_block(int &node, int &tag)
Message & put(const T &val)
Message & get(const T &cval)
int next_tag(int t, int s=1000)
unsigned int getOtherSMP(unsigned int sn) const
unsigned int getSMPBox0() const
unsigned int fileSMPs() const
unsigned int getNumOtherSMP() const
unsigned int getSMPNode(unsigned int n) const
unsigned int getNumSMPNodes() const
const std::string & getFilename(unsigned int fn) const
unsigned int mySMP() const
void printDebug(Inform &)
unsigned int getNumFiles() const
unsigned int size() const
container_t::iterator iterator
std::vector< RecordInfo * > RecordList
unsigned int get_NumLocalParticles(unsigned int record=0) const
DiscParticle(const char *fname, const char *config, int iomode, const char *typestr=0)
unsigned int get_NumRecords() const
bool write_data(FILE *outputData, std::vector< Message * > &, RecordInfo *)
unsigned int get_ElemByteSize(unsigned int record=0, unsigned int attrib=0) const
unsigned int get_NumAttributes(unsigned int record=0) const
FILE * open_file(const std::string &fnm, const std::string &mode, bool reporterr=true)
unsigned int get_NumGlobalParticles(unsigned int record=0) const
void * read_data(FILE *outputData, unsigned int attrib, unsigned int record, unsigned int fileset)
const char * get_DiscType(unsigned int record=0, unsigned int attrib=0) const
void initialize(const char *base, const char *config, const char *typestr, int iomode)
static void abort(const char *=0)
static Communicate * Comm