11 #ifndef DISC_PARTICLE_H
12 #define DISC_PARTICLE_H
15 #ifdef IPPL_PRINTDEBUG
57 DiscParticle(
const char *fname,
const char *config,
int iomode,
58 const char *typestr = 0);
63 DiscParticle(
const char *fname,
int iomode,
const char * = 0);
109 unsigned int attrib=0)
const {
119 unsigned int attrib=0)
const;
157 ERRORMSG(
"Bad config or meta file in DiscParticle::read." <<
endl);
160 ERRORMSG(
"Trying to read for DiscParticle created for output." <<
endl);
163 ERRORMSG(
"Illegal record number in DiscParticle::read." <<
endl);
166 ERRORMSG(
"Record " << record <<
" does not contain information for an ");
170 ERRORMSG(
"Record " << record <<
" has a different number of attributes ");
171 ERRORMSG(
"than in the given IpplParticleBase." <<
endl);
180 ERRORMSG(
"Mismatched data type size for attribute " << ca <<
" in ");
186 DPCTLDBG(std::string dbgmsgname(
"DiscParticle::read(IpplParticleBase) "));
204 int localnum =
RecordList[record]->localparticles[sf];
209 DPCTLDBG(dbgmsg<<
"Opening data file '" << filename <<
"' ..."<<
endl);
210 FILE *datafile =
open_file(filename, std::string(
"r"));
222 void *buf =
read_data(datafile, a, record, sf);
231 DPCTLDBG(dbgmsg<<
"Creating "<<localnum <<
" new particles."<<
endl);
242 DPCTLDBG(dbgmsg <<
"Doing final update after reading in particles ...");
277 ERRORMSG(
"Bad config or meta file in DiscParticle::read." <<
endl);
280 ERRORMSG(
"Trying to read for a DiscParticle created for output."<<
endl);
283 ERRORMSG(
"Illegal record number in DiscParticle::read." <<
endl);
286 ERRORMSG(
"Record " << record <<
" does not contain information for a ");
290 ERRORMSG(
"Mismatched attribute data type size in ");
297 DPCTLDBG(std::string dbgmsgname(
"DiscParticle::read(ParticleAttrib) "));
302 DPCTLDBG(dbgmsg <<
"Deleting existing " << pattr.
size());
313 int localnum =
RecordList[record]->localparticles[sf];
318 DPCTLDBG(dbgmsg<<
"Opening data file '"<<filename <<
"' ..." <<
endl);
319 FILE *datafile =
open_file(filename, std::string(
"r"));
328 void *buf =
read_data(datafile, 0, record, sf);
336 DPCTLDBG(dbgmsg<<
"Creating "<<localnum<<
" new particles." <<
endl);
346 DPCTLDBG(dbgmsg <<
"This node now has " << pattr.
size());
385 ERRORMSG(
"Bad config or meta file in DiscParticle::write." <<
endl);
388 ERRORMSG(
"Trying to write for a DiscParticle created for input."<<
endl);
394 DPCTLDBG(std::string dbgmsgname(
"DiscParticle::write(IpplParticleBase) "));
410 DPCTLDBG(dbgmsg <<
" particles into a message." <<
endl);
419 std::string openmode =
"a";
423 DPCTLDBG(dbgmsg <<
"Opening data file '" << filename <<
"' ..." <<
endl);
424 FILE *datafile =
open_file(filename, openmode);
434 std::vector<Message *> msgvec;
435 msgvec.push_back(msg);
445 DPCTLDBG(dbgmsg <<
"Box0 node waiting to receive " << notreceived);
446 DPCTLDBG(dbgmsg <<
" messages, from this SMP and ");
448 while (notreceived > 0) {
455 DPCTLDBG(dbgmsg<<
"Received msg from node " << any_node <<
" w tag ");
456 DPCTLDBG(dbgmsg<< tag <<
"; still waiting for " << notreceived);
461 msgvec.push_back(recmsg);
483 info->
offset.push_back(std::vector<Offset_t>());
487 DPCTLDBG(dbgmsg <<
"Finished writing; saving RecordInfo record ..."<<
endl);
492 DPCTLDBG(dbgmsg <<
"Doing final re-write of .meta file ..." <<
endl);
499 DPCTLDBG(dbgmsg <<
"At final barrier at end of write ..." <<
endl);
533 ERRORMSG(
"Bad config or meta file in DiscParticle::write." <<
endl);
536 ERRORMSG(
"Trying to write for a DiscParticle created for input."<<
endl);
542 DPCTLDBG(std::string dbgmsgname(
"DiscParticle::write(ParticleAttrib) "));
556 DPCTLDBG(dbgmsg <<
" particles into a message." <<
endl);
566 std::string openmode =
"a";
570 DPCTLDBG(dbgmsg <<
"Opening data file '" << filename <<
"' ..." <<
endl);
571 FILE *datafile =
open_file(filename, openmode);
581 std::vector<Message *> msgvec;
582 msgvec.push_back(msg);
592 DPCTLDBG(dbgmsg <<
"Box0 node waiting to receive " << notreceived);
593 DPCTLDBG(dbgmsg <<
" messages, from this SMP and ");
595 while (notreceived > 0) {
602 DPCTLDBG(dbgmsg<<
"Received msg from node " << any_node <<
" w tag ");
603 DPCTLDBG(dbgmsg<< tag <<
"; still waiting for " << notreceived);
608 msgvec.push_back(recmsg);
624 DPCTLDBG(dbgmsg <<
"Sending " << pattr.
size() <<
" particles to node ");
630 info->
offset.push_back(std::vector<Offset_t>());
634 DPCTLDBG(dbgmsg <<
"Finished writing; saving RecordInfo record ..."<<
endl);
639 DPCTLDBG(dbgmsg <<
"Doing final re-write of .meta file ..." <<
endl);
646 DPCTLDBG(dbgmsg <<
"At final barrier at end of write ..." <<
endl);
688 std::vector<std::vector<Offset_t> >
offset;
704 void initialize(
const char *base,
const char *config,
705 const char *typestr,
int iomode);
711 FILE *
open_file(
const std::string& fnm,
const std::string& mode,
712 bool reporterr =
true);
724 void *
read_data(FILE *outputData,
unsigned int attrib,
725 unsigned int record,
unsigned int fileset);
742 #endif // DISC_PARTICLE_H
bool read(ParticleAttrib< T > &pattr, unsigned int record)
void * read_data(FILE *outputData, unsigned int attrib, unsigned int record, unsigned int fileset)
const std::string & getConfigFile() const
std::vector< std::vector< Offset_t > > offset
const char * get_DiscType(unsigned int record=0, unsigned int attrib=0) const
virtual size_t getMessage(Message &, size_t)
int get_DataMode(unsigned int record=0) const
std::vector< int > localparticles
unsigned int get_ElemByteSize(unsigned int record=0, unsigned int attrib=0) const
attrib_container_t::size_type numAttributes() const
void destroy(size_t, size_t, bool=false)
unsigned int get_NumLocalParticles(unsigned int record=0) const
unsigned int getNumSMPNodes() const
DiscParticle(const char *fname, const char *config, int iomode, const char *typestr=0)
bool read(IpplParticleBase< T > &pbase, unsigned int record)
int next_tag(int t, int s=1000)
unsigned int getNumOtherSMP() const
size_t getTotalNum() const
unsigned int get_NumGlobalParticles(unsigned int record=0) const
std::vector< RecordInfo * > RecordList
unsigned int elementSize() const
Message & putmsg(void *, int, int=0)
size_t getLocalNum() const
unsigned int get_NumAttributes(unsigned int record=0) const
unsigned int getOtherSMP(unsigned int sn) const
virtual size_t putMessage(Message &, size_t, size_t)
unsigned int get_NumRecords() const
std::vector< int > bytesize
virtual void destroy(size_t M, size_t I, bool optDestroy=true)
const char * get_TypeString() const
FILE * open_file(const std::string &fnm, const std::string &mode, bool reporterr=true)
bool write_data(FILE *outputData, std::vector< Message * > &, RecordInfo *)
size_t putMessage(Message &, size_t, size_t)
Message & put(const T &val)
const std::string & getFilename(unsigned int fn) const
ParticleAttribBase & getAttribute(attrib_container_t::size_type N)
const std::string & typeString() const
unsigned int getSMPBox0() const
bool write(ParticleAttrib< T > &pattr)
size_t getMessageAndCreate(Message &)
std::vector< std::string > disctypes
Message * receive_block(int &node, int &tag)
Message & setDelete(const bool c)
static Communicate * Comm
Message & setCopy(const bool c)
bool send(Message *, int node, int tag, bool delmsg=true)
unsigned int getNumFiles() const
DiscParticle & operator=(const DiscParticle &)
void initialize(const char *base, const char *config, const char *typestr, int iomode)
bool write(IpplParticleBase< T > &pbase)
Inform & endl(Inform &inf)