87 static void calc_phi(
double const * epsilon,
91 double const cutoff,
double const r,
double* phi);
97 double const cutoff,
double const r,
98 double* phi,
double* dphi);
103 double influenceDistance;
117 double const cutoff,
double const r,
double* phi)
123 ep = exp(-(*
C)*(r-*Rzero));
133 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
144 double const cutoff,
double const r,
145 double* phi,
double* dphi)
151 ep = exp(-(*
C)*(r-*Rzero));
162 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
163 *dphi = 2.0*(*epsilon)*(*C)*( -ep + ep2 );
187 int const * neighListOfCurrentPart;
188 struct model_buffer*
buffer;
191 int comp_particleEnergy;
205 double* particleEnergy;
212 cutoff =
buffer->influenceDistance;
214 epsilon = &(
buffer->epsilon);
221 modelComputeArguments,
226 modelComputeArguments,
231 modelComputeArguments,
236 modelComputeArguments,
241 modelComputeArguments,
246 modelComputeArguments,
251 modelComputeArguments,
260 comp_energy = (energy != 0);
261 comp_force = (force != 0);
262 comp_particleEnergy = (particleEnergy != 0);
267 for (i = 0; i < *nParts; ++i)
271 LOG_ERROR(
"Unexpected species code detected");
278 if (comp_particleEnergy)
280 for (i = 0; i < *nParts; ++i)
282 particleEnergy[i] = 0.0;
292 for (i = 0; i < *nParts; ++i)
294 for (k = 0; k <
DIM; ++k)
296 force[i*
DIM + k] = 0.0;
304 for (i = 0; i < *nParts; ++i)
309 modelComputeArguments,
310 0, i, &numOfPartNeigh, &neighListOfCurrentPart);
320 for (jj = 0; jj < numOfPartNeigh; ++ jj)
322 j = neighListOfCurrentPart[jj];
326 for (k = 0; k <
DIM; ++k)
328 Rij[k] = coords[j*
DIM + k] - coords[i*
DIM + k];
330 Rsqij += Rij[k]*Rij[k];
345 cutoff, R, &phi, &dphi);
361 if (comp_particleEnergy)
363 particleEnergy[i] += 0.5*phi;
373 for (k = 0; k <
DIM; ++k)
375 force[i*
DIM + k] += dEidr*Rij[k]/R;
376 force[j*
DIM + k] -= dEidr*Rij[k]/R;
401 int numberOfParameterFiles;
402 char const * paramfile1name;
406 char speciesNameString[100];
414 struct model_buffer*
buffer;
456 modelDriverCreate, &numberOfParameterFiles);
458 if (numberOfParameterFiles != 1)
461 LOG_ERROR(
"Incorrect number of parameter files.");
470 LOG_ERROR(
"Unable to get parameter file name.");
475 fid = fopen(paramfile1name,
"r");
479 LOG_ERROR(
"Unable to open parameter file for Morse parameters");
483 ier = fscanf(fid,
"%s \n%lf \n%lf \n%lf \n%lf",
496 LOG_ERROR(
"Unable to read all parameters");
508 LOG_ERROR(
"Unable to set species code for Ar.");
514 buffer = (
struct model_buffer*) malloc(
sizeof(
struct model_buffer));
524 buffer->influenceDistance = cutoff;
525 buffer->cutsq = (cutoff)*(cutoff);
526 buffer->epsilon = epsilon;
536 cutoff, cutoff, &(
buffer->shift));
549 &(
buffer->influenceDistance));
551 modelDriverCreate, 1,
552 &(
buffer->influenceDistance));
561 struct model_buffer*
buffer;
567 modelRefresh, &(
buffer->influenceDistance));
569 modelRefresh, 1, &(
buffer->influenceDistance));
578 struct model_buffer*
buffer;
600 modelComputeArgumentsCreate,
605 modelComputeArgumentsCreate,
610 modelComputeArgumentsCreate,
615 LOG_ERROR(
"Unable to set argument supportStatus.");
void KIM_ModelDriverCreate_GetNumberOfParameterFiles(KIM_ModelDriverCreate *const modelDriverCreate, int *const numberOfParameterFiles)
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_coordinates
int KIM_ModelDriverCreate_SetUnits(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LengthUnit const lengthUnit, KIM_EnergyUnit const energyUnit, KIM_ChargeUnit const chargeUnit, KIM_TemperatureUnit const temperatureUnit, KIM_TimeUnit const timeUnit)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
static int compute_arguments_destroy(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
KIM_LanguageName const KIM_LANGUAGE_NAME_c
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialForces
struct KIM_ModelRefresh KIM_ModelRefresh
int KIM_ModelComputeArguments_GetArgumentPointerDouble(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, double **const ptr)
KIM_SpeciesName KIM_SpeciesName_FromString(char const *const str)
void KIM_ModelDriverCreate_SetInfluenceDistancePointer(KIM_ModelDriverCreate *const modelDriverCreate, double *const influenceDistance)
void KIM_ModelRefresh_GetModelBufferPointer(KIM_ModelRefresh const *const modelRefresh, void **const ptr)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleSpeciesCodes
static void calc_phi_dphi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi, double *dphi)
KIM_TemperatureUnit const KIM_TEMPERATURE_UNIT_unused
int KIM_ModelDriverCreate_SetComputeArgumentsCreatePointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
KIM_TimeUnit const KIM_TIME_UNIT_unused
void KIM_ModelRefresh_SetNeighborListCutoffsPointer(KIM_ModelRefresh *const modelRefresh, int const numberOfCutoffs, double const *const cutoffs)
struct KIM_ModelDestroy KIM_ModelDestroy
ComputeArgumentName const particleContributing
int KIM_ModelComputeArgumentsCreate_SetArgumentSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeArgumentName const computeArgumentName, KIM_SupportStatus const supportStatus)
struct KIM_ModelDriverCreate KIM_ModelDriverCreate
void KIM_ModelCompute_GetModelBufferPointer(KIM_ModelCompute const *const modelCompute, void **const ptr)
void KIM_ModelDriverCreate_SetNeighborListCutoffsPointer(KIM_ModelDriverCreate *const modelDriverCreate, int const numberOfCutoffs, double const *const cutoffs)
static int compute(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
#define LOG_ERROR(message)
int model_driver_create(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LengthUnit const requestedLengthUnit, KIM_EnergyUnit const requestedEnergyUnit, KIM_ChargeUnit const requestedChargeUnit, KIM_TemperatureUnit const requestedTemperatureUnit, KIM_TimeUnit const requestedTimeUnit)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_numberOfParticles
struct KIM_ModelComputeArguments KIM_ModelComputeArguments
struct KIM_ModelComputeArgumentsCreate KIM_ModelComputeArgumentsCreate
int KIM_ModelDriverCreate_GetParameterFileName(KIM_ModelDriverCreate *const modelDriverCreate, int const index, char const **const parameterFileName)
int KIM_ModelDriverCreate_SetSpeciesCode(KIM_ModelDriverCreate *const modelDriverCreate, KIM_SpeciesName const speciesName, int const code)
static int compute_arguments_create(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
int KIM_ModelDriverCreate_SetComputePointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
int KIM_ModelDriverCreate_SetComputeArgumentsDestroyPointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
int KIM_ModelDriverCreate_SetDestroyPointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
static void calc_phi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi)
int KIM_ModelComputeArguments_GetNeighborList(KIM_ModelComputeArguments const *const modelComputeArguments, int const neighborListIndex, int const particleNumber, int *const numberOfNeighbors, int const **const neighborsOfParticle)
struct KIM_ModelComputeArgumentsDestroy KIM_ModelComputeArgumentsDestroy
KIM_EnergyUnit const KIM_ENERGY_UNIT_eV
static int refresh(KIM_ModelRefresh *const modelRefresh)
void KIM_ModelRefresh_SetInfluenceDistancePointer(KIM_ModelRefresh *const modelRefresh, double *const influenceDistance)
KIM_ChargeUnit const KIM_CHARGE_UNIT_unused
ComputeArgumentName const particleSpeciesCodes
static int destroy(KIM_ModelDestroy *const modelDestroy)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialEnergy
void KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate *const modelDriverCreate, void *const ptr)
int KIM_ModelDriverCreate_SetModelNumbering(KIM_ModelDriverCreate *const modelDriverCreate, KIM_Numbering const numbering)
KIM_LengthUnit const KIM_LENGTH_UNIT_A
int KIM_ModelDriverCreate_SetRefreshPointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
KIM_Numbering const KIM_NUMBERING_zeroBased
int KIM_ModelComputeArguments_GetArgumentPointerInteger(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, int **const ptr)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleContributing
struct KIM_ModelCompute KIM_ModelCompute