forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@7383 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
9921d20788
commit
80101f0754
22
src/comm.cpp
22
src/comm.cpp
|
@ -66,6 +66,7 @@ Comm::Comm(LAMMPS *lmp) : Pointers(lmp)
|
||||||
MPI_Comm_size(world,&nprocs);
|
MPI_Comm_size(world,&nprocs);
|
||||||
|
|
||||||
user_procgrid[0] = user_procgrid[1] = user_procgrid[2] = 0;
|
user_procgrid[0] = user_procgrid[1] = user_procgrid[2] = 0;
|
||||||
|
coregrid[0] = coregrid[1] = coregrid[2] = 1;
|
||||||
gridflag = ONELEVEL;
|
gridflag = ONELEVEL;
|
||||||
mapflag = CART;
|
mapflag = CART;
|
||||||
customfile = NULL;
|
customfile = NULL;
|
||||||
|
@ -153,10 +154,16 @@ void Comm::set_proc_grid()
|
||||||
|
|
||||||
if (recv_from_partition >= 0) {
|
if (recv_from_partition >= 0) {
|
||||||
MPI_Status status;
|
MPI_Status status;
|
||||||
if (me == 0) MPI_Recv(other_procgrid,3,MPI_INT,
|
if (me == 0) {
|
||||||
|
MPI_Recv(other_procgrid,3,MPI_INT,
|
||||||
universe->root_proc[recv_from_partition],0,
|
universe->root_proc[recv_from_partition],0,
|
||||||
universe->uworld,&status);
|
universe->uworld,&status);
|
||||||
|
MPI_Recv(other_coregrid,3,MPI_INT,
|
||||||
|
universe->root_proc[recv_from_partition],0,
|
||||||
|
universe->uworld,&status);
|
||||||
|
}
|
||||||
MPI_Bcast(other_procgrid,3,MPI_INT,0,world);
|
MPI_Bcast(other_procgrid,3,MPI_INT,0,world);
|
||||||
|
MPI_Bcast(other_coregrid,3,MPI_INT,0,world);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create ProcMap class to create 3d grid and map procs to it
|
// create ProcMap class to create 3d grid and map procs to it
|
||||||
|
@ -168,12 +175,12 @@ void Comm::set_proc_grid()
|
||||||
|
|
||||||
if (gridflag == ONELEVEL) {
|
if (gridflag == ONELEVEL) {
|
||||||
pmap->onelevel_grid(nprocs,user_procgrid,procgrid,
|
pmap->onelevel_grid(nprocs,user_procgrid,procgrid,
|
||||||
otherflag,other_style,other_procgrid);
|
otherflag,other_style,other_procgrid,other_coregrid);
|
||||||
|
|
||||||
} else if (gridflag == TWOLEVEL) {
|
} else if (gridflag == TWOLEVEL) {
|
||||||
pmap->twolevel_grid(nprocs,user_procgrid,procgrid,
|
pmap->twolevel_grid(nprocs,user_procgrid,procgrid,
|
||||||
ncores,user_coregrid,coregrid,
|
ncores,user_coregrid,coregrid,
|
||||||
otherflag,other_style,other_procgrid);
|
otherflag,other_style,other_procgrid,other_coregrid);
|
||||||
|
|
||||||
} else if (gridflag == NUMA) {
|
} else if (gridflag == NUMA) {
|
||||||
pmap->numa_grid(nprocs,user_procgrid,procgrid,coregrid);
|
pmap->numa_grid(nprocs,user_procgrid,procgrid,coregrid);
|
||||||
|
@ -215,8 +222,6 @@ void Comm::set_proc_grid()
|
||||||
else if (mapflag == XYZ)
|
else if (mapflag == XYZ)
|
||||||
pmap->xyz_map(xyz,procgrid,ncores,coregrid,myloc,procneigh,grid2proc);
|
pmap->xyz_map(xyz,procgrid,ncores,coregrid,myloc,procneigh,grid2proc);
|
||||||
|
|
||||||
// printf("AAA %d: %d %d: %d %d: %d %d\n",);
|
|
||||||
|
|
||||||
} else if (gridflag == NUMA) {
|
} else if (gridflag == NUMA) {
|
||||||
pmap->numa_map(0,coregrid,myloc,procneigh,grid2proc);
|
pmap->numa_map(0,coregrid,myloc,procneigh,grid2proc);
|
||||||
|
|
||||||
|
@ -258,9 +263,14 @@ void Comm::set_proc_grid()
|
||||||
// send my 3d proc grid to another partition if requested
|
// send my 3d proc grid to another partition if requested
|
||||||
|
|
||||||
if (send_to_partition >= 0) {
|
if (send_to_partition >= 0) {
|
||||||
if (me == 0) MPI_Send(procgrid,3,MPI_INT,
|
if (me == 0) {
|
||||||
|
MPI_Send(procgrid,3,MPI_INT,
|
||||||
universe->root_proc[send_to_partition],0,
|
universe->root_proc[send_to_partition],0,
|
||||||
universe->uworld);
|
universe->uworld);
|
||||||
|
MPI_Send(coregrid,3,MPI_INT,
|
||||||
|
universe->root_proc[send_to_partition],0,
|
||||||
|
universe->uworld);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,7 @@ class Comm : protected Pointers {
|
||||||
int otherflag; // 1 if this partition dependent on another
|
int otherflag; // 1 if this partition dependent on another
|
||||||
int other_style; // style of dependency
|
int other_style; // style of dependency
|
||||||
int other_procgrid[3]; // proc layout of another partition
|
int other_procgrid[3]; // proc layout of another partition
|
||||||
|
int other_coregrid[3]; // core layout of another partition
|
||||||
int ncores; // # of cores per node
|
int ncores; // # of cores per node
|
||||||
int coregrid[3]; // 3d grid of cores within a node
|
int coregrid[3]; // 3d grid of cores within a node
|
||||||
int user_coregrid[3]; // user request for cores in each dim
|
int user_coregrid[3]; // user request for cores in each dim
|
||||||
|
|
|
@ -120,8 +120,8 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) :
|
||||||
format_default[0] = '\0';
|
format_default[0] = '\0';
|
||||||
|
|
||||||
for (int i = 0; i < size_one; i++) {
|
for (int i = 0; i < size_one; i++) {
|
||||||
if (vtype[i] == INT) format_default = strcat(format_default,"%d ");
|
if (vtype[i] == INT) strcat(format_default,"%d ");
|
||||||
else if (vtype[i] == DOUBLE) format_default = strcat(format_default,"%g ");
|
else if (vtype[i] == DOUBLE) strcat(format_default,"%g ");
|
||||||
else if (vtype[i] == STRING) strcat(format_default,"%s ");
|
else if (vtype[i] == STRING) strcat(format_default,"%s ");
|
||||||
vformat[i] = NULL;
|
vformat[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1306,14 +1306,16 @@ int DumpCustom::modify_param(int narg, char **arg)
|
||||||
if (strcmp(arg[1],"none") == 0) iregion = -1;
|
if (strcmp(arg[1],"none") == 0) iregion = -1;
|
||||||
else {
|
else {
|
||||||
iregion = domain->find_region(arg[1]);
|
iregion = domain->find_region(arg[1]);
|
||||||
if (iregion == -1) error->all(FLERR,"Dump_modify region ID does not exist");
|
if (iregion == -1)
|
||||||
|
error->all(FLERR,"Dump_modify region ID does not exist");
|
||||||
int n = strlen(arg[1]) + 1;
|
int n = strlen(arg[1]) + 1;
|
||||||
idregion = new char[n];
|
idregion = new char[n];
|
||||||
strcpy(idregion,arg[1]);
|
strcpy(idregion,arg[1]);
|
||||||
}
|
}
|
||||||
return 2;
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (strcmp(arg[0],"element") == 0) {
|
if (strcmp(arg[0],"element") == 0) {
|
||||||
if (narg < ntypes+1)
|
if (narg < ntypes+1)
|
||||||
error->all(FLERR,"Dump modify element names do not match atom types");
|
error->all(FLERR,"Dump modify element names do not match atom types");
|
||||||
|
|
||||||
|
@ -1330,8 +1332,9 @@ int DumpCustom::modify_param(int narg, char **arg)
|
||||||
strcpy(typenames[itype],arg[itype]);
|
strcpy(typenames[itype],arg[itype]);
|
||||||
}
|
}
|
||||||
return ntypes+1;
|
return ntypes+1;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (strcmp(arg[0],"thresh") == 0) {
|
if (strcmp(arg[0],"thresh") == 0) {
|
||||||
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
|
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
|
||||||
if (strcmp(arg[1],"none") == 0) {
|
if (strcmp(arg[1],"none") == 0) {
|
||||||
if (nthresh) {
|
if (nthresh) {
|
||||||
|
@ -1462,13 +1465,16 @@ int DumpCustom::modify_param(int narg, char **arg)
|
||||||
if (n < 0) error->all(FLERR,"Could not find dump modify compute ID");
|
if (n < 0) error->all(FLERR,"Could not find dump modify compute ID");
|
||||||
|
|
||||||
if (modify->compute[n]->peratom_flag == 0)
|
if (modify->compute[n]->peratom_flag == 0)
|
||||||
error->all(FLERR,"Dump modify compute ID does not compute per-atom info");
|
error->all(FLERR,
|
||||||
|
"Dump modify compute ID does not compute per-atom info");
|
||||||
if (argindex[nfield+nthresh] == 0 &&
|
if (argindex[nfield+nthresh] == 0 &&
|
||||||
modify->compute[n]->size_peratom_cols > 0)
|
modify->compute[n]->size_peratom_cols > 0)
|
||||||
error->all(FLERR,"Dump modify compute ID does not compute per-atom vector");
|
error->all(FLERR,
|
||||||
|
"Dump modify compute ID does not compute per-atom vector");
|
||||||
if (argindex[nfield+nthresh] > 0 &&
|
if (argindex[nfield+nthresh] > 0 &&
|
||||||
modify->compute[n]->size_peratom_cols == 0)
|
modify->compute[n]->size_peratom_cols == 0)
|
||||||
error->all(FLERR,"Dump modify compute ID does not compute per-atom array");
|
error->all(FLERR,
|
||||||
|
"Dump modify compute ID does not compute per-atom array");
|
||||||
if (argindex[nfield+nthresh] > 0 &&
|
if (argindex[nfield+nthresh] > 0 &&
|
||||||
argindex[nfield+nthresh] > modify->compute[n]->size_peratom_cols)
|
argindex[nfield+nthresh] > modify->compute[n]->size_peratom_cols)
|
||||||
error->all(FLERR,"Dump modify compute ID vector is not large enough");
|
error->all(FLERR,"Dump modify compute ID vector is not large enough");
|
||||||
|
|
|
@ -1327,7 +1327,9 @@ void Input::suffix()
|
||||||
void Input::thermo()
|
void Input::thermo()
|
||||||
{
|
{
|
||||||
if (narg != 1) error->all(FLERR,"Illegal thermo command");
|
if (narg != 1) error->all(FLERR,"Illegal thermo command");
|
||||||
output->thermo_every = atoi(arg[0]);
|
int n = atoi(arg[0]);
|
||||||
|
if (n < 0) error->all(FLERR,"Illegal thermo command");
|
||||||
|
output->thermo_every = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
|
@ -38,9 +38,6 @@ using namespace LAMMPS_NS;
|
||||||
|
|
||||||
#define DELTA 1
|
#define DELTA 1
|
||||||
|
|
||||||
#define MYMIN(a,b) ((a) < (b) ? (a) : (b))
|
|
||||||
#define MYMAX(a,b) ((a) > (b) ? (a) : (b))
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
initialize all output
|
initialize all output
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
@ -187,7 +184,7 @@ void Output::setup(int flag)
|
||||||
if (writeflag) modify->addstep_compute(next_dump[idump]);
|
if (writeflag) modify->addstep_compute(next_dump[idump]);
|
||||||
else modify->addstep_compute_all(next_dump[idump]);
|
else modify->addstep_compute_all(next_dump[idump]);
|
||||||
}
|
}
|
||||||
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
if (idump) next_dump_any = MIN(next_dump_any,next_dump[idump]);
|
||||||
else next_dump_any = next_dump[0];
|
else next_dump_any = next_dump[0];
|
||||||
}
|
}
|
||||||
} else next_dump_any = update->laststep + 1;
|
} else next_dump_any = update->laststep + 1;
|
||||||
|
@ -218,7 +215,7 @@ void Output::setup(int flag)
|
||||||
|
|
||||||
if (thermo_every) {
|
if (thermo_every) {
|
||||||
next_thermo = (ntimestep/thermo_every)*thermo_every + thermo_every;
|
next_thermo = (ntimestep/thermo_every)*thermo_every + thermo_every;
|
||||||
next_thermo = MYMIN(next_thermo,update->laststep);
|
next_thermo = MIN(next_thermo,update->laststep);
|
||||||
} else if (var_thermo) {
|
} else if (var_thermo) {
|
||||||
next_thermo = static_cast<int>
|
next_thermo = static_cast<int>
|
||||||
(input->variable->compute_equal(ivar_thermo));
|
(input->variable->compute_equal(ivar_thermo));
|
||||||
|
@ -230,8 +227,8 @@ void Output::setup(int flag)
|
||||||
|
|
||||||
// next = next timestep any output will be done
|
// next = next timestep any output will be done
|
||||||
|
|
||||||
next = MYMIN(next_dump_any,next_restart);
|
next = MIN(next_dump_any,next_restart);
|
||||||
next = MYMIN(next,next_thermo);
|
next = MIN(next,next_thermo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
@ -265,7 +262,7 @@ void Output::write(bigint ntimestep)
|
||||||
}
|
}
|
||||||
if (dump[idump]->clearstep) modify->addstep_compute(next_dump[idump]);
|
if (dump[idump]->clearstep) modify->addstep_compute(next_dump[idump]);
|
||||||
}
|
}
|
||||||
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
if (idump) next_dump_any = MIN(next_dump_any,next_dump[idump]);
|
||||||
else next_dump_any = next_dump[0];
|
else next_dump_any = next_dump[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -311,14 +308,14 @@ void Output::write(bigint ntimestep)
|
||||||
if (next_thermo <= ntimestep)
|
if (next_thermo <= ntimestep)
|
||||||
error->all(FLERR,"Thermo every variable returned a bad timestep");
|
error->all(FLERR,"Thermo every variable returned a bad timestep");
|
||||||
} else next_thermo = update->laststep;
|
} else next_thermo = update->laststep;
|
||||||
next_thermo = MYMIN(next_thermo,update->laststep);
|
next_thermo = MIN(next_thermo,update->laststep);
|
||||||
modify->addstep_compute(next_thermo);
|
modify->addstep_compute(next_thermo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// next = next timestep any output will be done
|
// next = next timestep any output will be done
|
||||||
|
|
||||||
next = MYMIN(next_dump_any,next_restart);
|
next = MIN(next_dump_any,next_restart);
|
||||||
next = MYMIN(next,next_thermo);
|
next = MIN(next,next_thermo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
@ -369,7 +366,8 @@ void Output::add_dump(int narg, char **arg)
|
||||||
// error checks
|
// error checks
|
||||||
|
|
||||||
for (int idump = 0; idump < ndump; idump++)
|
for (int idump = 0; idump < ndump; idump++)
|
||||||
if (strcmp(arg[0],dump[idump]->id) == 0) error->all(FLERR,"Reuse of dump ID");
|
if (strcmp(arg[0],dump[idump]->id) == 0)
|
||||||
|
error->all(FLERR,"Reuse of dump ID");
|
||||||
int igroup = group->find(arg[1]);
|
int igroup = group->find(arg[1]);
|
||||||
if (igroup == -1) error->all(FLERR,"Could not find dump group ID");
|
if (igroup == -1) error->all(FLERR,"Could not find dump group ID");
|
||||||
if (atoi(arg[3]) <= 0) error->all(FLERR,"Invalid dump frequency");
|
if (atoi(arg[3]) <= 0) error->all(FLERR,"Invalid dump frequency");
|
||||||
|
|
|
@ -41,7 +41,7 @@ ProcMap::ProcMap(LAMMPS *lmp) : Pointers(lmp) {}
|
||||||
|
|
||||||
void ProcMap::onelevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
void ProcMap::onelevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
||||||
int otherflag, int other_style,
|
int otherflag, int other_style,
|
||||||
int *other_procgrid)
|
int *other_procgrid, int *other_coregrid)
|
||||||
{
|
{
|
||||||
int **factors;
|
int **factors;
|
||||||
|
|
||||||
|
@ -56,7 +56,8 @@ void ProcMap::onelevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
||||||
if (domain->dimension == 2) npossible = cull_2d(npossible,factors,3);
|
if (domain->dimension == 2) npossible = cull_2d(npossible,factors,3);
|
||||||
npossible = cull_user(npossible,factors,3,user_procgrid);
|
npossible = cull_user(npossible,factors,3,user_procgrid);
|
||||||
if (otherflag) npossible = cull_other(npossible,factors,3,
|
if (otherflag) npossible = cull_other(npossible,factors,3,
|
||||||
other_style,other_procgrid);
|
other_style,other_procgrid,
|
||||||
|
other_coregrid);
|
||||||
|
|
||||||
// user/other constraints make failure possible
|
// user/other constraints make failure possible
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ void ProcMap::onelevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
||||||
void ProcMap::twolevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
void ProcMap::twolevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
||||||
int ncores, int *user_coregrid, int *coregrid,
|
int ncores, int *user_coregrid, int *coregrid,
|
||||||
int otherflag, int other_style,
|
int otherflag, int other_style,
|
||||||
int *other_procgrid)
|
int *other_procgrid, int *other_coregrid)
|
||||||
{
|
{
|
||||||
int **nfactors,**cfactors,**factors;
|
int **nfactors,**cfactors,**factors;
|
||||||
|
|
||||||
|
@ -116,7 +117,8 @@ void ProcMap::twolevel_grid(int nprocs, int *user_procgrid, int *procgrid,
|
||||||
|
|
||||||
npossible = cull_user(npossible,factors,4,user_procgrid);
|
npossible = cull_user(npossible,factors,4,user_procgrid);
|
||||||
if (otherflag) npossible = cull_other(npossible,factors,4,
|
if (otherflag) npossible = cull_other(npossible,factors,4,
|
||||||
other_style,other_procgrid);
|
other_style,other_procgrid,
|
||||||
|
other_coregrid);
|
||||||
|
|
||||||
// user/other constraints make failure possible
|
// user/other constraints make failure possible
|
||||||
|
|
||||||
|
@ -796,19 +798,21 @@ int ProcMap::cull_user(int n, int **factors, int m, int *user_factors)
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
remove any factors that do not match settings from other partition
|
remove any factors that do not match settings from other partition
|
||||||
MULTIPLE = other Px,Py,Pz must be multiple of my Px,Py,Pz
|
MULTIPLE = other Nx,Ny,Nz must be multiple of my Px,Py,Pz
|
||||||
|
where Nx,Ny,Nz = node grid = procgrid/coregrid
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
int ProcMap::cull_other(int n, int **factors, int m,
|
int ProcMap::cull_other(int n, int **factors, int m,
|
||||||
int other_style, int *other_grid)
|
int other_style, int *other_procgrid,
|
||||||
|
int *other_coregrid)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < n) {
|
while (i < n) {
|
||||||
if (other_style == MULTIPLE) {
|
if (other_style == MULTIPLE) {
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
if (other_grid[0] % factors[i][0]) flag = 1;
|
if ((other_procgrid[0]/other_coregrid[0]) % factors[i][0]) flag = 1;
|
||||||
if (other_grid[1] % factors[i][1]) flag = 1;
|
if ((other_procgrid[1]/other_coregrid[1]) % factors[i][1]) flag = 1;
|
||||||
if (other_grid[2] % factors[i][2]) flag = 1;
|
if ((other_procgrid[2]/other_coregrid[2]) % factors[i][2]) flag = 1;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
for (int j = 0; j < m; j++) factors[i][j] = factors[n-1][j];
|
for (int j = 0; j < m; j++) factors[i][j] = factors[n-1][j];
|
||||||
n--;
|
n--;
|
||||||
|
|
|
@ -22,8 +22,9 @@ class ProcMap : protected Pointers {
|
||||||
public:
|
public:
|
||||||
ProcMap(class LAMMPS *);
|
ProcMap(class LAMMPS *);
|
||||||
~ProcMap() {}
|
~ProcMap() {}
|
||||||
void onelevel_grid(int, int *, int *, int, int, int *);
|
void onelevel_grid(int, int *, int *, int, int, int *, int *);
|
||||||
void twolevel_grid(int, int *, int *, int, int *, int *, int, int, int *);
|
void twolevel_grid(int, int *, int *, int, int *, int *, int, int,
|
||||||
|
int *, int *);
|
||||||
void numa_grid(int, int *, int *, int *);
|
void numa_grid(int, int *, int *, int *);
|
||||||
void custom_grid(char *, int, int *, int *);
|
void custom_grid(char *, int, int *, int *);
|
||||||
void cart_map(int, int *, int *, int [3][2], int ***);
|
void cart_map(int, int *, int *, int [3][2], int ***);
|
||||||
|
@ -46,7 +47,7 @@ class ProcMap : protected Pointers {
|
||||||
int combine_factors(int, int **, int, int **, int **);
|
int combine_factors(int, int **, int, int **, int **);
|
||||||
int cull_2d(int, int **, int);
|
int cull_2d(int, int **, int);
|
||||||
int cull_user(int, int **, int, int *);
|
int cull_user(int, int **, int, int *);
|
||||||
int cull_other(int, int **, int, int, int *);
|
int cull_other(int, int **, int, int, int *, int *);
|
||||||
int best_factors(int, int **, int *, int, int, int);
|
int best_factors(int, int **, int *, int, int, int);
|
||||||
void grid_shift(int, int, int &, int &);
|
void grid_shift(int, int, int &, int &);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue