53#define EPSILON -0.0134783698072604
88static void calc_phi(
double * epsilon,
128 ep = exp(-(*C) * (r - *Rzero));
138 *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
158 ep = exp(-(*C) * (r - *Rzero));
169 *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
170 *dphi = 2.0 * (*epsilon) * (*C) * (-ep + ep2);
192 ep = exp(-(*C) * (r - *Rzero));
204 *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
205 *dphi = 2.0 * (*epsilon) * (*C) * (-ep + ep2);
206 *d2phi = 2.0 * (*epsilon) * (*C) * (*C) * (ep - 2.0 * ep2);
213#undef KIM_LOGGER_FUNCTION_NAME
214#define KIM_LOGGER_FUNCTION_NAME KIM_ModelCompute_LogEntry
215#undef KIM_LOGGER_OBJECT_NAME
216#define KIM_LOGGER_OBJECT_NAME modelCompute
225 double * pR_pairs = &(R_pairs[0]);
233 double * pRij = &(Rij[0]);
234 double Rij_pairs[2][3];
235 double const * pRij_pairs = &(Rij_pairs[0][0]);
239 int * pi_pairs = &(i_pairs[0]);
242 int * pj_pairs = &(j_pairs[0]);
245 int const * neighListOfCurrentPart;
248 int comp_particleEnergy;
249 int comp_process_dEdr;
250 int comp_process_d2Edr2;
253 int * particleSpeciesCodes;
254 int * particleContributing;
265 double * particleEnergy;
273 modelComputeArguments,
277 modelComputeArguments,
279 &comp_process_d2Edr2);
283 modelComputeArguments,
287 modelComputeArguments,
289 &particleSpeciesCodes)
291 modelComputeArguments,
293 &particleContributing)
295 modelComputeArguments,
299 modelComputeArguments,
303 modelComputeArguments,
307 modelComputeArguments,
316 comp_energy = (energy != NULL);
317 comp_force = (force != NULL);
318 comp_particleEnergy = (particleEnergy != NULL);
322 (
void **) &bufferPointer);
324 cutsq = (*cutoff) * (*cutoff);
338 for (i = 0; i < *nParts; ++i)
340 if (
SPECCODE != particleSpeciesCodes[i])
342 LOG_ERROR(
"Unexpected species code detected");
350 if (comp_particleEnergy)
352 for (i = 0; i < *nParts; ++i) { particleEnergy[i] = 0.0; }
354 if (comp_energy) { *energy = 0.0; }
358 for (i = 0; i < *nParts; ++i)
360 for (k = 0; k <
DIM; ++k) { force[i *
DIM + k] = 0.0; }
368 for (i = 0; i < *nParts; ++i)
370 if (particleContributing[i])
376 &neighListOfCurrentPart);
386 for (jj = 0; jj < numOfPartNeigh; ++jj)
388 j = neighListOfCurrentPart[jj];
390 if (!(particleContributing[j] && (j < i)))
396 for (k = 0; k <
DIM; ++k)
398 Rij[k] = coords[j *
DIM + k] - coords[i *
DIM + k];
401 Rsqij += Rij[k] * Rij[k];
409 if (comp_process_d2Edr2)
413 &epsilon, &C, &Rzero, &shift,
cutoff, R, &phi, &dphi, &d2phi);
416 if (particleContributing[j])
424 d2Eidr = 0.5 * d2phi;
427 else if (comp_force || comp_process_dEdr)
431 &epsilon, &C, &Rzero, &shift,
cutoff, R, &phi, &dphi);
434 if (particleContributing[j]) { dEidr = dphi; }
447 if (comp_particleEnergy)
449 particleEnergy[i] += 0.5 * phi;
450 if (particleContributing[j]) { particleEnergy[j] += 0.5 * phi; }
454 if (particleContributing[j]) { *energy += phi; }
457 *energy += 0.5 * phi;
462 if (comp_process_dEdr)
465 modelComputeArguments, dEidr, R, pRij, i, j);
468 LOG_ERROR(
"ProcessDEDrTerm callback error");
475 if (comp_process_d2Edr2)
477 R_pairs[0] = R_pairs[1] = R;
478 Rij_pairs[0][0] = Rij_pairs[1][0] = Rij[0];
479 Rij_pairs[0][1] = Rij_pairs[1][1] = Rij[1];
480 Rij_pairs[0][2] = Rij_pairs[1][2] = Rij[2];
481 i_pairs[0] = i_pairs[1] = i;
482 j_pairs[0] = j_pairs[1] = j;
485 modelComputeArguments,
493 LOG_ERROR(
"ProcessDEDrTerm callback error");
502 for (k = 0; k <
DIM; ++k)
505 += dEidr * Rij[k] / R;
507 -= dEidr * Rij[k] / R;
524#undef KIM_LOGGER_FUNCTION_NAME
525#define KIM_LOGGER_FUNCTION_NAME KIM_ModelCreate_LogEntry
526#undef KIM_LOGGER_OBJECT_NAME
527#define KIM_LOGGER_OBJECT_NAME modelCreate
548 (void) requestedLengthUnit;
549 (void) requestedEnergyUnit;
550 (void) requestedChargeUnit;
551 (void) requestedTemperatureUnit;
552 (void) requestedTimeUnit;
627 LOG_ERROR(
"Unable to successfully initialize model");
635#undef KIM_LOGGER_FUNCTION_NAME
636#define KIM_LOGGER_FUNCTION_NAME KIM_ModelDestroy_LogEntry
637#undef KIM_LOGGER_OBJECT_NAME
638#define KIM_LOGGER_OBJECT_NAME modelDestroy
646 (
void **) &bufferPointer);
654#undef KIM_LOGGER_FUNCTION_NAME
655#define KIM_LOGGER_FUNCTION_NAME KIM_ModelCompute_LogEntry
656#undef KIM_LOGGER_OBJECT_NAME
657#define KIM_LOGGER_OBJECT_NAME modelCompute
670 modelComputeArgumentsCreate,
675 modelComputeArgumentsCreate,
680 modelComputeArgumentsCreate,
688 modelComputeArgumentsCreate,
693 modelComputeArgumentsCreate,
699 LOG_ERROR(
"Unable to successfully initialize compute arguments");
712 (void) modelComputeArgumentsDestroy;
KIM_ChargeUnit const KIM_CHARGE_UNIT_unused
Indicates that a ChargeUnit is not used.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_numberOfParticles
The standard numberOfParticles argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleContributing
The standard particleContributing argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_coordinates
The standard coordinates argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleSpeciesCodes
The standard particleSpeciesCodes argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialForces
The standard partialForces argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy
The standard partialParticleEnergy argument.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialEnergy
The standard partialEnergy argument.
KIM_ComputeCallbackName const KIM_COMPUTE_CALLBACK_NAME_ProcessD2EDr2Term
The standard ProcessD2EDr2Term callback.
KIM_ComputeCallbackName const KIM_COMPUTE_CALLBACK_NAME_ProcessDEDrTerm
The standard ProcessDEDrTerm callback.
KIM_EnergyUnit const KIM_ENERGY_UNIT_eV
The standard electronvolt unit of energy.
int KIM_ModelComputeArgumentsCreateFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
Prototype for MODEL_ROUTINE_NAME::ComputeArgumentsCreate routine.
int KIM_ModelDestroyFunction(KIM_ModelDestroy *const modelDestroy)
Prototype for MODEL_ROUTINE_NAME::Destroy routine.
struct KIM_ModelComputeArgumentsCreate KIM_ModelComputeArgumentsCreate
Forward declaration.
struct KIM_ModelComputeArgumentsDestroy KIM_ModelComputeArgumentsDestroy
Forward declaration.
struct KIM_ModelCreate KIM_ModelCreate
Forward declaration.
struct KIM_ModelDestroy KIM_ModelDestroy
Forward declaration.
struct KIM_ModelCompute KIM_ModelCompute
Forward declaration.
struct KIM_ModelComputeArguments KIM_ModelComputeArguments
Forward declaration.
void() KIM_Function(void)
Generic function type.
int KIM_ModelCreateFunction(KIM_ModelCreate *const modelCreate, KIM_LengthUnit const requestedLengthUnit, KIM_EnergyUnit const requestedEnergyUnit, KIM_ChargeUnit const requestedChargeUnit, KIM_TemperatureUnit const requestedTemperatureUnit, KIM_TimeUnit const requestedTimeUnit)
Prototype for MODEL_ROUTINE_NAME::Create routine.
int KIM_ModelComputeArgumentsDestroyFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
Prototype for MODEL_ROUTINE_NAME::ComputeArgumentsDestroy routine.
int KIM_ModelComputeFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
Prototype for MODEL_ROUTINE_NAME::Compute routine.
KIM_LanguageName const KIM_LANGUAGE_NAME_c
The standard c language.
KIM_LengthUnit const KIM_LENGTH_UNIT_A
The standard angstrom unit of length.
#define LOG_ERROR(message)
Convenience macro for ERROR Log entries with compile-time optimization.
#define LOG_INFORMATION(message)
Convenience macro for INFORMATION Log entries with compile-time optimization.
void KIM_ModelCompute_GetModelBufferPointer(KIM_ModelCompute const *const modelCompute, void **const ptr)
Get the Model's buffer pointer within the Model object.
int KIM_ModelComputeArguments_GetNeighborList(KIM_ModelComputeArguments const *const modelComputeArguments, int const neighborListIndex, int const particleNumber, int *const numberOfNeighbors, int const **const neighborsOfParticle)
Get the neighbor list for a particle of interest corresponding to a particular neighbor list cutoff d...
int KIM_ModelComputeArguments_GetArgumentPointerInteger(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, int **const ptr)
Get the data pointer for a ComputeArgumentName.
int KIM_ModelComputeArguments_GetArgumentPointerDouble(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, double **const ptr)
Get the data pointer for a ComputeArgumentName.
int KIM_ModelComputeArguments_IsCallbackPresent(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeCallbackName const computeCallbackName, int *const present)
Determine if the Simulator has provided a non-NULL function pointer for a ComputeCallbackName of inte...
int KIM_ModelComputeArguments_ProcessDEDrTerm(KIM_ModelComputeArguments const *const modelComputeArguments, double const de, double const r, double const *const dx, int const i, int const j)
Call the Simulator's COMPUTE_CALLBACK_NAME::ProcessDEDrTerm routine.
int KIM_ModelComputeArguments_ProcessD2EDr2Term(KIM_ModelComputeArguments const *const modelComputeArguments, double const de, double const *const r, double const *const dx, int const *const i, int const *const j)
Call the Simulator's COMPUTE_CALLBACK_NAME::ProcessD2EDr2Term routine.
int KIM_ModelComputeArgumentsCreate_SetCallbackSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeCallbackName const computeCallbackName, KIM_SupportStatus const supportStatus)
Set the SupportStatus of a ComputeCallbackName.
int KIM_ModelComputeArgumentsCreate_SetArgumentSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeArgumentName const computeArgumentName, KIM_SupportStatus const supportStatus)
Set the SupportStatus of a ComputeArgumentName.
int KIM_ModelCreate_SetSpeciesCode(KIM_ModelCreate *const modelCreate, KIM_SpeciesName const speciesName, int const code)
Set integer code for supported SpeciesName.
int KIM_ModelCreate_SetRoutinePointer(KIM_ModelCreate *const modelCreate, KIM_ModelRoutineName const modelRoutineName, KIM_LanguageName const languageName, int const required, KIM_Function *const fptr)
Set the function pointer for the ModelRoutineName of interest.
int KIM_ModelCreate_SetUnits(KIM_ModelCreate *const modelCreate, KIM_LengthUnit const lengthUnit, KIM_EnergyUnit const energyUnit, KIM_ChargeUnit const chargeUnit, KIM_TemperatureUnit const temperatureUnit, KIM_TimeUnit const timeUnit)
Set the Model's base unit values.
void KIM_ModelCreate_SetModelBufferPointer(KIM_ModelCreate *const modelCreate, void *const ptr)
Set the Model's buffer pointer within the Model object.
void KIM_ModelCreate_SetInfluenceDistancePointer(KIM_ModelCreate *const modelCreate, double const *const influenceDistance)
Set the Model's influence distance data pointer.
void KIM_ModelCreate_SetNeighborListPointers(KIM_ModelCreate *const modelCreate, int const numberOfNeighborLists, double const *const cutoffs, int const *const modelWillNotRequestNeighborsOfNoncontributingParticles)
Set the Model's neighbor list data pointers.
int KIM_ModelCreate_SetModelNumbering(KIM_ModelCreate *const modelCreate, KIM_Numbering const numbering)
Set the Model's particle Numbering.
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
Get the Model's buffer pointer within the Model object.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Destroy
The standard Destroy routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Compute
The standard Compute routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_ComputeArgumentsCreate
The standard ComputeArgumentsCreate routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_ComputeArgumentsDestroy
The standard ComputeArgumentsDestroy routine.
KIM_Numbering const KIM_NUMBERING_zeroBased
The standard zeroBased numbering.
KIM_SpeciesName const KIM_SPECIES_NAME_Ar
The standard Argon species.
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
The standard optional status.
KIM_TemperatureUnit const KIM_TEMPERATURE_UNIT_unused
Indicates that a TemperatureUnit is not used.
KIM_TimeUnit const KIM_TIME_UNIT_unused
Indicates that a TimeUnit is not used.
static void calc_phi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi)
static int model_compute(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
static void calc_phi_d2phi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi, double *dphi, double *d2phi)
static int model_destroy(KIM_ModelDestroy *const modelDestroy)
static void calc_phi_dphi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi, double *dphi)
int model_create(KIM_ModelCreate *const modelCreate, KIM_LengthUnit const requestedLengthUnit, KIM_EnergyUnit const requestedEnergyUnit, KIM_ChargeUnit const requestedChargeUnit, KIM_TemperatureUnit const requestedTemperatureUnit, KIM_TimeUnit const requestedTimeUnit)
An Extensible Enumeration for the ChargeUnit's supported by the KIM API.
An Extensible Enumeration for the EnergyUnit's supported by the KIM API.
An Extensible Enumeration for the LengthUnit's supported by the KIM API.
An Extensible Enumeration for the TemperatureUnit's supported by the KIM API.
An Extensible Enumeration for the TimeUnit's supported by the KIM API.
int modelWillNotRequestNeighborsOfNoncontributingParticles