Files
LIGGGHTS-PFM/src/cfd_datacoupling_mpi.cpp
2012-07-13 16:52:58 +02:00

172 lines
5.5 KiB
C++

/* ----------------------------------------------------------------------
LIGGGHTS - LAMMPS Improved for General Granular and Granular Heat
Transfer Simulations
LIGGGHTS is part of the CFDEMproject
www.liggghts.com | www.cfdem.com
Christoph Kloss, christoph.kloss@cfdem.com
Copyright 2009-2012 JKU Linz
Copyright 2012- DCS Computing GmbH, Linz
LIGGGHTS is based on LAMMPS
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
This software is distributed under the GNU General Public License.
See the README file in the top-level directory.
------------------------------------------------------------------------- */
#include "string.h"
#include "stdlib.h"
#include "atom.h"
#include "update.h"
#include "respa.h"
#include "error.h"
#include "memory.h"
#include "comm.h"
#include "modify.h"
#include "math.h"
#include "vector_liggghts.h"
#include "fix_cfd_coupling.h"
#include "fix_multisphere.h"
#include "cfd_datacoupling_mpi.h"
using namespace LAMMPS_NS;
#define DELTA 10000
/* ---------------------------------------------------------------------- */
CfdDatacouplingMPI::CfdDatacouplingMPI(LAMMPS *lmp,int iarg, int narg, char **arg,FixCfdCoupling* fc) :
CfdDatacoupling(lmp, iarg, narg, arg,fc)
{
liggghts_is_active = false;
if(!atom->tag_enable) error->one(FLERR,"CFD-DEM coupling via MPI requires particles to have tags");
this->fc_ = fc;
len_allred_double = 0;
allred_double = NULL;
len_allred_int = 0;
allred_int = NULL;
if(comm->me == 0) error->message(FLERR,"nevery as specified in LIGGGHTS is overriden by calling external program",1);
//NP do not make inital grow; this is done at the first ts together with callers arrays
//NP this is to ensure that caller arrays and allred arrays always have same length
}
CfdDatacouplingMPI::~CfdDatacouplingMPI()
{
//NP should destroy allreduce array here
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::exchange()
{
// does nothing since done by OF
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::pull(char *name,char *type,void *&from,char *datatype)
{
CfdDatacoupling::pull(name,type,from,datatype);
if(strcmp(datatype,"double") == 0)
pull_mpi<double>(name,type,from);
else if(strcmp(datatype,"int") == 0)
pull_mpi<int>(name,type,from);
else error->one(FLERR,"Illegal call to CfdDatacouplingMPI::pull, valid datatypes are 'int' and double'");
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::push(char *name,char *type,void *&to,char *datatype)
{
CfdDatacoupling::push(name,type,to,datatype);
if(strcmp(datatype,"double") == 0)
push_mpi<double>(name,type,to);
else if(strcmp(datatype,"int") == 0)
push_mpi<int>(name,type,to);
else error->one(FLERR,"Illegal call to CfdDatacouplingMPI::pull, valid datatypes are 'int' and double'");
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::allocate_external(int **&data, int len2,int len1,int initvalue)
{
if(len1 < 1 || len2 < 1)
error->one(FLERR,"Illegal length used in CfdDatacouplingMPI::allocate_external");
memory->grow(data, len1,len2, "CfdDatacouplingMPI:data");
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
data[i][j] = initvalue;
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::allocate_external(int **&data, int len2,char *keyword,int initvalue)
{
int len1;
if(strcmp(keyword,"nparticles") == 0) len1 = atom->tag_max();
else if(strcmp(keyword,"nbodies") == 0)
{
if(ms_data_)
len1 = ms_data_->tag_max_body();
else error->one(FLERR,"CFD datacoupling keyword 'nbodies' may only be used with multisphere model in LIGGGHTS");
}
else error->one(FLERR,"Illegal keyword used in CfdDatacouplingMPI::allocate_external");
if(len1 < 1 || len2 < 1)
len1 = len2 = 1;
memory->grow(data, len1,len2, "CfdDatacouplingMPI:data");
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
data[i][j] = initvalue;
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::allocate_external(double **&data, int len2,int len1,double initvalue)
{
if(len1 < 1 || len2 < 1)
error->one(FLERR,"Illegal length used in CfdDatacouplingMPI::allocate_external");
memory->grow(data, len1,len2, "CfdDatacouplingMPI:data");
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
data[i][j] = initvalue;
}
/* ---------------------------------------------------------------------- */
void CfdDatacouplingMPI::allocate_external(double **&data, int len2,char *keyword,double initvalue)
{
int len1;
if(strcmp(keyword,"nparticles") == 0) len1 = atom->tag_max();
else if(strcmp(keyword,"nbodies") == 0)
{
if(ms_data_)
len1 = ms_data_->tag_max_body();
else error->one(FLERR,"CFD datacoupling keyword 'nbodies' may only be used with multisphere model in LIGGGHTS");
}
else error->one(FLERR,"Illegal keyword used in CfdDatacouplingMPI::allocate_external");
if(len1 < 1 || len2 < 1)
len1 = len2 = 1;
memory->grow(data, len1,len2, "CfdDatacouplingMPI:data");
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
data[i][j] = initvalue;
}
/* ---------------------------------------------------------------------- */