git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@11100 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2013-12-06 23:19:33 +00:00
parent f41d6124fb
commit a4c075eacf
5 changed files with 115 additions and 52 deletions

View File

@ -34,6 +34,7 @@
#include "comm.h"
#include "output.h"
#include "thermo.h"
#include "mpiio.h"
#include "memory.h"
#include "error.h"
@ -96,17 +97,24 @@ void WriteRestart::command(int narg, char **arg)
if (strchr(arg[0],'%')) multiproc = nprocs;
else multiproc = 0;
if (strstr(arg[0],".mpi")) mpiio = 1;
else mpiio = 0;
if (strstr(arg[0],".mpi")) mpiioflag = 1;
else mpiioflag = 0;
if (multiproc && mpiio)
if (multiproc && mpiioflag)
error->all(FLERR,
"Write restart MPI-IO output not allowed with '%' in filename");
if (mpiioflag) {
mpiio = new RestartMPIIO(lmp);
if (!mpiio->mpiio_exists)
error->all(FLERR,"Writing to MPI-IO filename when "
"MPIIO package is not installed");
}
// setup output style and process optional args
// also called by Output class for periodic restart files
multiproc_options(multiproc,mpiio,narg-1,&arg[1]);
multiproc_options(multiproc,mpiioflag,narg-1,&arg[1]);
// init entire system since comm->exchange is done
// comm::init needs neighbor::init needs pair::init needs kspace::init, etc
@ -136,11 +144,11 @@ void WriteRestart::command(int narg, char **arg)
/* ----------------------------------------------------------------------
------------------------------------------------------------------------- */
void WriteRestart::multiproc_options(int multiproc_caller, int mpiio_caller,
void WriteRestart::multiproc_options(int multiproc_caller, int mpiioflag_caller,
int narg, char **arg)
{
multiproc = multiproc_caller;
mpiio = mpiio_caller;
mpiioflag = mpiioflag_caller;
// defaults for multiproc file writing
@ -363,33 +371,50 @@ void WriteRestart::write(char *file)
}
}
// MPI-IO output to single file
if (mpiioflag) {
// add calls to RestartMPIIO class
// reopen header file in append mode
// perform writes
// mpiio->open(file);
// mpiio->write(send_size,buf);
// mpiio->close();
}
// output of one or more native files
// filewriter = 1 = this proc writes to file
// ping each proc in my cluster, receive its data, write data to file
// else wait for ping from fileproc, send my data to fileproc
int tmp,recv_size;
MPI_Status status;
MPI_Request request;
else {
int tmp,recv_size;
MPI_Status status;
MPI_Request request;
if (filewriter) {
write_int(PROCSPERFILE,nclusterprocs);
for (int iproc = 0; iproc < nclusterprocs; iproc++) {
if (iproc) {
MPI_Irecv(buf,max_size,MPI_DOUBLE,me+iproc,0,world,&request);
MPI_Send(&tmp,0,MPI_INT,me+iproc,0,world);
MPI_Wait(&request,&status);
MPI_Get_count(&status,MPI_DOUBLE,&recv_size);
} else recv_size = send_size;
if (filewriter) {
write_int(PROCSPERFILE,nclusterprocs);
for (int iproc = 0; iproc < nclusterprocs; iproc++) {
if (iproc) {
MPI_Irecv(buf,max_size,MPI_DOUBLE,me+iproc,0,world,&request);
MPI_Send(&tmp,0,MPI_INT,me+iproc,0,world);
MPI_Wait(&request,&status);
MPI_Get_count(&status,MPI_DOUBLE,&recv_size);
} else recv_size = send_size;
write_double_vec(PERPROC,recv_size,buf);
}
fclose(fp);
write_double_vec(PERPROC,recv_size,buf);
} else {
MPI_Recv(&tmp,0,MPI_INT,fileproc,0,world,&status);
MPI_Rsend(buf,send_size,MPI_DOUBLE,fileproc,0,world);
}
fclose(fp);
} else {
MPI_Recv(&tmp,0,MPI_INT,fileproc,0,world,&status);
MPI_Rsend(buf,send_size,MPI_DOUBLE,fileproc,0,world);
}
// clean up
memory->destroy(buf);
// invoke any fixes that write their own restart file
@ -528,9 +553,12 @@ void WriteRestart::file_layout(int send_size)
{
if (me == 0) {
write_int(MULTIPROC,multiproc);
write_int(MPIIO,mpiio);
write_int(MPIIO,mpiioflag);
}
// NOTE: could add MPI-IO specific fields to header here
// e.g. gather send_size across all procs and call write_int_vec()
// -1 flag signals end of file layout info
if (me == 0) {