first version of scafacos.h without the inclusion of the ScaFaCoS header

This commit is contained in:
Rene Halver 2018-08-22 17:18:36 -06:00
parent fd56124a94
commit 01fe356904
2 changed files with 55 additions and 47 deletions

View File

@ -90,7 +90,7 @@ Scafacos::~Scafacos()
memory->destroy(efield);
// clean up of the ScaFaCoS handle and internal arrays
fcs_destroy(fcs);
fcs_destroy((FCS)fcs);
}
/* ---------------------------------------------------------------------- */
@ -112,20 +112,24 @@ void Scafacos::init()
if (domain->triclinic)
error->all(FLERR,"Cannot use ScaFaCoS with triclinic domain yet");
if (atom->natoms > INT_MAX && sizeof(fcs_int) != 8)
if (atom->natoms > INT_MAX && sizeof(int) != 8)
error->all(FLERR,"Scafacos atom count exceeds 2B");
if (atom->molecular > 0)
error->all(FLERR,
"Cannot use Scafacos with molecular charged systems yet");
FCSResult result;
// one-time initialization of ScaFaCoS
qqrd2e = force->qqrd2e;
if (!initialized) {
result = fcs_init(&fcs,method,world);
check_result(result);
printf("DEBUG: %p\n",&fcs);
result = fcs_init((FCS*)&fcs,method,world);
check_result((void*)&result);
printf("DEBUG: %p\n",&fcs);
setup_handle();
@ -136,8 +140,8 @@ void Scafacos::init()
strcmp(method,"p2nfft") == 0 ||
strcmp(method,"ewald") == 0)
{
result = fcs_set_tolerance(fcs,tolerance_type,tolerance);
check_result(result);
result = fcs_set_tolerance((FCS)fcs,tolerance_type,tolerance);
check_result((void*)&result);
}
double **x = atom->x;
@ -147,9 +151,9 @@ void Scafacos::init()
if (strcmp(method,"fmm") == 0)
{
if (fmm_tuning_flag == 1)
fcs_fmm_set_internal_tuning(fcs,FCS_FMM_INHOMOGENOUS_SYSTEM);
fcs_fmm_set_internal_tuning((FCS)fcs,FCS_FMM_INHOMOGENOUS_SYSTEM);
else
fcs_fmm_set_internal_tuning(fcs,FCS_FMM_HOMOGENOUS_SYSTEM);
fcs_fmm_set_internal_tuning((FCS)fcs,FCS_FMM_HOMOGENOUS_SYSTEM);
}
// for the FMM at least one particle is required per process
@ -158,15 +162,15 @@ void Scafacos::init()
int empty = (nlocal==0)?1:0;
MPI_Allreduce(MPI_IN_PLACE,&empty,1,MPI_INT,MPI_SUM,world);
if (empty > 0)
fcs_set_redistribute(fcs,1);
fcs_set_redistribute((FCS)fcs,1);
else
fcs_set_redistribute(fcs,0);
fcs_set_redistribute((FCS)fcs,0);
}
result = fcs_tune(fcs,nlocal,&x[0][0],q);
check_result(result);
result = fcs_tune((FCS)fcs,nlocal,&x[0][0],q);
check_result((void*)&result);
// more useful here, since the parameters should be tuned now
if (me == 0) fcs_print_parameters(fcs);
if (me == 0) fcs_print_parameters((FCS)fcs);
}
initialized = 1;
@ -181,6 +185,7 @@ void Scafacos::compute(int eflag, int vflag)
int nlocal = atom->nlocal;
const double qscale = qqrd2e;
FCSResult result;
// for the FMM at least one particle is required per process
if (strcmp(method,"fmm"))
@ -188,9 +193,9 @@ void Scafacos::compute(int eflag, int vflag)
int empty = (nlocal==0)?1:0;
MPI_Allreduce(MPI_IN_PLACE,&empty,1,MPI_INT,MPI_SUM,world);
if (empty > 0)
fcs_set_redistribute(fcs,1);
fcs_set_redistribute((FCS)fcs,1);
else
fcs_set_redistribute(fcs,0);
fcs_set_redistribute((FCS)fcs,0);
}
if (eflag || vflag) ev_setup(eflag,vflag);
@ -214,7 +219,7 @@ void Scafacos::compute(int eflag, int vflag)
if (vflag_global)
{
fcs_set_compute_virial(fcs,1);
fcs_set_compute_virial((FCS)fcs,1);
//if (strcmp(method,"p3m") == 0)
// error->all(FLERR,"ScaFaCoS p3m does not support computation of virial");
}
@ -223,8 +228,8 @@ void Scafacos::compute(int eflag, int vflag)
memcpy(xpbc,&x[0][0],3*nlocal*sizeof(double));
int j = 0;
if (domain->xperiodic || domain -> yperiodic || domain -> zperiodic){
int j = 0;
for (int i = 0; i < nlocal; i++) {
domain->remap(&xpbc[j]);
j += 3;
@ -234,20 +239,20 @@ void Scafacos::compute(int eflag, int vflag)
if (box_has_changed()) {
setup_handle();
result = fcs_tune(fcs,nlocal,xpbc,q);
check_result(result);
result = fcs_tune((FCS)fcs,nlocal,xpbc,q);
check_result((void*)&result);
}
// invoke ScaFaCoS solver
result = fcs_run(fcs,nlocal,xpbc,q,&efield[0][0],epot);
check_result(result);
result = fcs_run((FCS)fcs,nlocal,xpbc,q,&efield[0][0],epot);
check_result((void*)&result);
// extract virial
if (vflag_global)
{
fcs_get_virial(fcs,virial_int);
fcs_get_virial((FCS)fcs,virial_int);
virial[0] = virial_int[0];
virial[1] = virial_int[1];
virial[2] = virial_int[2];
@ -380,6 +385,8 @@ double Scafacos::memory_usage()
void Scafacos::setup_handle()
{
FCSResult result;
// store simulation box params
// setup periodicity
@ -404,23 +411,23 @@ void Scafacos::setup_handle()
old_natoms = atom->natoms;
// store parameters to ScaFaCoS handle
result = fcs_set_box_a(fcs,old_box_x);
check_result(result);
result = fcs_set_box_a((FCS)fcs,old_box_x);
check_result((void*)&result);
result = fcs_set_box_b(fcs,old_box_y);
check_result(result);
result = fcs_set_box_b((FCS)fcs,old_box_y);
check_result((void*)&result);
result = fcs_set_box_c(fcs,old_box_z);
check_result(result);
result = fcs_set_box_c((FCS)fcs,old_box_z);
check_result((void*)&result);
result = fcs_set_box_origin(fcs,old_origin);
check_result(result);
result = fcs_set_box_origin((FCS)fcs,old_origin);
check_result((void*)&result);
result = fcs_set_periodicity(fcs,old_periodicity);
check_result(result);
result = fcs_set_periodicity((FCS)fcs,old_periodicity);
check_result((void*)&result);
result = fcs_set_total_particles(fcs,old_natoms);
check_result(result);
result = fcs_set_total_particles((FCS)fcs,old_natoms);
check_result((void*)&result);
// allow ScaFaCoS to calculate the near field computations for now
// TODO: allow the delegation of the near field computations
@ -428,8 +435,8 @@ void Scafacos::setup_handle()
// (near_field_flag = 1 -> enables the internal near field calcs
// 0 -> disables the internal near field calcs
int near_field_flag = 1;
result = fcs_set_near_field_flag(fcs,near_field_flag);
check_result(result);
result = fcs_set_near_field_flag((FCS)fcs,near_field_flag);
check_result((void*)&result);
}
/* ----------------------------------------------------------------------
@ -460,8 +467,10 @@ bool Scafacos::box_has_changed()
check ScaFaCoS result for error condition
------------------------------------------------------------------------- */
void Scafacos::check_result(FCSResult result)
void Scafacos::check_result(void* result_p)
{
FCSResult result = *(FCSResult*)result_p;
if (!result) return;
std::stringstream ss;

View File

@ -21,7 +21,7 @@ KSpaceStyle(scafacos,Scafacos)
#define LMP_SCAFACOS_H
#include "kspace.h"
#include "fcs.h"
//#include "fcs.h"
namespace LAMMPS_NS {
@ -35,7 +35,7 @@ class Scafacos : public KSpace {
int modify_param(int, char **);
double memory_usage();
private:
private:
int me;
char *method;
@ -46,20 +46,19 @@ class Scafacos : public KSpace {
int fmm_tuning_flag;
FCS fcs; // ScaFaCoS handle
FCSResult result; // result for each ScaFaCoS call
void* fcs; // ScaFaCoS handle
// simulation state: box, natoms
// so ScaFaCoS can detect if changes, e.g. for NPT
fcs_float old_box_x[3],old_box_y[3],old_box_z[3];
fcs_float old_origin[3];
fcs_int old_periodicity[3];
fcs_int old_natoms;
double old_box_x[3],old_box_y[3],old_box_z[3];
double old_origin[3];
int old_periodicity[3];
int old_natoms;
fcs_float virial_int[9];
double virial_int[9];
void check_result(FCSResult);
void check_result(void*);
void setup_handle();
bool box_has_changed();
};