58 #define EPSILON -0.0134783698072604 65 double influenceDistance;
92 static void calc_phi(
double* epsilon,
96 double* cutoff,
double r,
double* phi);
102 double* cutoff,
double r,
double* phi,
double* dphi);
108 double* cutoff,
double r,
double* phi,
double* dphi,
116 double* cutoff,
double r,
double* phi) {
121 ep = exp(-(*
C)*(r-*Rzero));
128 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift; }
137 double* cutoff,
double r,
double* phi,
double* dphi) {
142 ep = exp(-(*
C)*(r-*Rzero));
150 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
151 *dphi = 2.0*(*epsilon)*(*C)*( -ep + ep2 ); }
161 double* cutoff,
double r,
double* phi,
double* dphi,
167 ep = exp(-(*
C)*(r-*Rzero));
176 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
177 *dphi = 2.0*(*epsilon)*(*C)*( -ep + ep2 );
178 *d2phi = 2.0*(*epsilon)*(*C)*(*C)*(ep - 2.0*ep2); }
191 double *pR_pairs = &(R_pairs[0]);
199 double *pRij = &(Rij[0]);
200 double Rij_pairs[2][3];
201 double const * pRij_pairs = &(Rij_pairs[0][0]);
205 int *pi_pairs = &(i_pairs[0]);
208 int *pj_pairs = &(j_pairs[0]);
211 int const * neighListOfCurrentPart;
214 int comp_particleEnergy;
215 int comp_process_dEdr;
216 int comp_process_d2Edr2;
230 double* particleEnergy;
238 modelComputeArguments,
242 modelComputeArguments,
244 &comp_process_d2Edr2);
249 modelComputeArguments,
254 modelComputeArguments,
259 modelComputeArguments,
264 modelComputeArguments,
269 modelComputeArguments,
274 modelComputeArguments,
279 modelComputeArguments,
286 comp_energy = (energy != 0);
287 comp_force = (force != 0);
288 comp_particleEnergy = (particleEnergy != 0);
292 cutsq = (*cutoff)*(*cutoff);
299 calc_phi(&epsilon, &
C, &Rzero, &dummy, cutoff, *cutoff, &shift);
306 for (i = 0; i < *nParts; ++i) {
308 LOG_ERROR(
"Unexpected species code detected");
314 if (comp_particleEnergy) {
315 for (i = 0; i < *nParts; ++i) {
316 particleEnergy[i] = 0.0; } }
321 for (i = 0; i < *nParts; ++i) {
322 for (k = 0; k <
DIM; ++k) {
323 force[i*
DIM + k] = 0.0; } } }
329 for (i = 0; i< *nParts; ++i) {
333 modelComputeArguments,
334 0, i, &numOfPartNeigh, &neighListOfCurrentPart);
342 for (jj = 0; jj < numOfPartNeigh; ++ jj) {
343 j = neighListOfCurrentPart[jj];
347 for (k = 0; k <
DIM; ++k) {
348 Rij[k] = coords[j*
DIM + k] - coords[i*
DIM + k];
351 Rsqij += Rij[k]*Rij[k]; }
357 if (comp_process_d2Edr2) {
363 cutoff, R, &phi, &dphi, &d2phi);
367 d2Eidr = 0.5*d2phi; }
368 else if (comp_force || comp_process_dEdr) {
374 cutoff, R, &phi, &dphi);
387 if (comp_particleEnergy) {
388 particleEnergy[i] += 0.5*phi; }
390 *energy += 0.5*phi; }
393 if (comp_process_dEdr) {
395 modelComputeArguments, dEidr, R, pRij, i, j); }
398 if (comp_process_d2Edr2) {
399 R_pairs[0] = R_pairs[1] = R;
400 Rij_pairs[0][0] = Rij_pairs[1][0] = Rij[0];
401 Rij_pairs[0][1] = Rij_pairs[1][1] = Rij[1];
402 Rij_pairs[0][2] = Rij_pairs[1][2] = Rij[2];
403 i_pairs[0] = i_pairs[1] = i;
404 j_pairs[0] = j_pairs[1] = j;
407 modelComputeArguments,
408 d2Eidr, pR_pairs, pRij_pairs, pi_pairs, pj_pairs);
413 for (k = 0; k <
DIM; ++k) {
414 force[i*
DIM + k] += dEidr*Rij[k]/R;
415 force[j*
DIM + k] -= dEidr*Rij[k]/R; } } }
496 bufferPointer->influenceDistance =
CUTOFF;
497 bufferPointer->cutoff =
CUTOFF;
502 &(bufferPointer->influenceDistance));
506 &(bufferPointer->cutoff));
511 LOG_ERROR(
"Unable to successfully initialize model");
528 (
void **) &bufferPointer);
532 modelRefresh, &(bufferPointer->influenceDistance));
534 &(bufferPointer->cutoff));
546 (
void **) &bufferPointer);
563 modelComputeArgumentsCreate,
567 modelComputeArgumentsCreate,
571 modelComputeArgumentsCreate,
579 modelComputeArgumentsCreate,
584 modelComputeArgumentsCreate,
590 LOG_ERROR(
"Unable to successfully initialize compute arguments");
static int compute_arguments_destroy(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_coordinates
KIM_ComputeCallbackName const KIM_COMPUTE_CALLBACK_NAME_ProcessD2EDr2Term
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy
static void calc_phi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi)
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
KIM_LanguageName const KIM_LANGUAGE_NAME_c
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialForces
int KIM_ModelCreate_SetComputePointer(KIM_ModelCreate *const modelCreate, KIM_LanguageName const languageName, func *const fptr)
struct KIM_ModelRefresh KIM_ModelRefresh
int KIM_ModelComputeArguments_GetArgumentPointerDouble(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, double **const ptr)
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)
void KIM_ModelRefresh_GetModelBufferPointer(KIM_ModelRefresh const *const modelRefresh, void **const ptr)
static void calc_phi_dphi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi, double *dphi)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleSpeciesCodes
int KIM_ModelComputeArgumentsCreate_SetCallbackSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeCallbackName const computeCallbackName, KIM_SupportStatus const supportStatus)
int KIM_ModelComputeArguments_IsCallbackPresent(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeCallbackName const computeCallbackName, int *const present)
KIM_TemperatureUnit const KIM_TEMPERATURE_UNIT_unused
KIM_SpeciesName const KIM_SPECIES_NAME_Ar
KIM_TimeUnit const KIM_TIME_UNIT_unused
void KIM_ModelCreate_SetNeighborListCutoffsPointer(KIM_ModelCreate *const modelCreate, int const numberOfCutoffs, double const *const cutoffs)
void KIM_ModelRefresh_SetNeighborListCutoffsPointer(KIM_ModelRefresh *const modelRefresh, int const numberOfCutoffs, double const *const cutoffs)
int KIM_ModelCreate_SetComputeArgumentsCreatePointer(KIM_ModelCreate *const modelCreate, KIM_LanguageName const languageName, func *const fptr)
struct KIM_ModelDestroy KIM_ModelDestroy
void KIM_ModelCreate_SetModelBufferPointer(KIM_ModelCreate *const modelCreate, void *const ptr)
ComputeArgumentName const particleContributing
int KIM_ModelCreate_SetRefreshPointer(KIM_ModelCreate *const modelCreate, KIM_LanguageName const languageName, func *const fptr)
int KIM_ModelComputeArgumentsCreate_SetArgumentSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeArgumentName const computeArgumentName, KIM_SupportStatus const supportStatus)
static int model_destroy(KIM_ModelDestroy *const modelDestroy)
void KIM_ModelCompute_GetModelBufferPointer(KIM_ModelCompute const *const modelCompute, void **const ptr)
int KIM_ModelCreate_SetComputeArgumentsDestroyPointer(KIM_ModelCreate *const modelCreate, KIM_LanguageName const languageName, func *const fptr)
static int model_refresh(KIM_ModelRefresh *const modelRefresh)
#define LOG_ERROR(message)
int KIM_ModelCreate_SetDestroyPointer(KIM_ModelCreate *const modelCreate, KIM_LanguageName const languageName, func *const fptr)
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_numberOfParticles
static int compute(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
static int compute_arguments_create(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
struct KIM_ModelComputeArguments KIM_ModelComputeArguments
struct KIM_ModelComputeArgumentsCreate KIM_ModelComputeArgumentsCreate
void KIM_ModelCreate_SetInfluenceDistancePointer(KIM_ModelCreate *const modelCreate, double *const influenceDistance)
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)
int KIM_ModelCreate_SetModelNumbering(KIM_ModelCreate *const modelCreate, KIM_Numbering const numbering)
#define LOG_INFORMATION(message)
int KIM_ModelCreate_SetSpeciesCode(KIM_ModelCreate *const modelCreate, KIM_SpeciesName const speciesName, int const code)
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
void KIM_ModelRefresh_SetInfluenceDistancePointer(KIM_ModelRefresh *const modelRefresh, double *const influenceDistance)
KIM_ChargeUnit const KIM_CHARGE_UNIT_unused
ComputeArgumentName const particleSpeciesCodes
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialEnergy
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)
KIM_ComputeCallbackName const KIM_COMPUTE_CALLBACK_NAME_ProcessDEDrTerm
struct KIM_ModelCreate KIM_ModelCreate
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)
KIM_LengthUnit const KIM_LENGTH_UNIT_A
static void calc_phi_d2phi(double *epsilon, double *C, double *Rzero, double *shift, double *cutoff, double r, double *phi, double *dphi, double *d2phi)
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