95 static void calc_phi(
double const * epsilon,
99 double const cutoff,
double const r,
double* phi);
105 double const cutoff,
double const r,
106 double* phi,
double* dphi);
111 double influenceDistance;
125 double const cutoff,
double const r,
double* phi)
131 ep = exp(-(*
C)*(r-*Rzero));
141 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
152 double const cutoff,
double const r,
153 double* phi,
double* dphi)
159 ep = exp(-(*
C)*(r-*Rzero));
170 *phi = (*epsilon)*( -ep2 + 2.0*ep ) + *shift;
171 *dphi = 2.0*(*epsilon)*(*C)*( -ep + ep2 );
193 int const * neighListOfCurrentPart;
194 struct model_buffer* buffer;
197 int comp_particleEnergy;
211 double* particleEnergy;
218 cutoff = buffer->influenceDistance;
219 cutsq = &(buffer->cutsq);
220 epsilon = &(buffer->epsilon);
222 Rzero = &(buffer->Rzero);
223 shift = &(buffer->shift);
266 comp_energy = (energy != 0);
267 comp_force = (force != 0);
268 comp_particleEnergy = (particleEnergy != 0);
273 for (i = 0; i < *nParts; ++i)
277 LOG_ERROR(
"Unexpected species code detected");
284 if (comp_particleEnergy)
286 for (i = 0; i < *nParts; ++i)
288 particleEnergy[i] = 0.0;
298 for (i = 0; i < *nParts; ++i)
300 for (k = 0; k <
DIM; ++k)
302 force[i*
DIM + k] = 0.0;
310 for (i = 0; i < *nParts; ++i)
315 modelCompute, 0, i, &numOfPartNeigh, &neighListOfCurrentPart);
325 for (jj = 0; jj < numOfPartNeigh; ++ jj)
327 j = neighListOfCurrentPart[jj];
331 for (k = 0; k <
DIM; ++k)
333 Rij[k] = coords[j*
DIM + k] - coords[i*
DIM + k];
335 Rsqij += Rij[k]*Rij[k];
350 cutoff, R, &phi, &dphi);
366 if (comp_particleEnergy)
368 particleEnergy[i] += 0.5*phi;
378 for (k = 0; k <
DIM; ++k)
380 force[i*
DIM + k] += dEidr*Rij[k]/R;
381 force[j*
DIM + k] -= dEidr*Rij[k]/R;
406 int numberOfParameterFiles;
407 char const * paramfile1name;
411 char speciesNameString[100];
419 struct model_buffer* buffer;
452 LOG_ERROR(
"Unable to set argument supportStatus.");
468 modelDriverCreate, &numberOfParameterFiles);
470 if (numberOfParameterFiles != 1)
473 LOG_ERROR(
"Incorrect number of parameter files.");
482 LOG_ERROR(
"Unable to get parameter file name.");
487 fid = fopen(paramfile1name,
"r");
491 LOG_ERROR(
"Unable to open parameter file for Morse parameters");
495 ier = fscanf(fid,
"%s \n%lf \n%lf \n%lf \n%lf",
508 LOG_ERROR(
"Unable to read all parameters");
520 LOG_ERROR(
"Unable to set species code for Ar.");
526 buffer = (
struct model_buffer*) malloc(
sizeof(
struct model_buffer));
536 buffer->influenceDistance = cutoff;
537 buffer->cutsq = (cutoff)*(cutoff);
538 buffer->epsilon = epsilon;
540 buffer->Rzero = Rzero;
548 cutoff, cutoff, &(buffer->shift));
550 buffer->shift = -buffer->shift;
561 &(buffer->influenceDistance));
563 modelDriverCreate, 1,
564 &(buffer->influenceDistance));
573 struct model_buffer* buffer;
579 modelRefresh, &(buffer->influenceDistance));
581 modelRefresh, 1, &(buffer->influenceDistance));
590 struct model_buffer* buffer;
KIM_SpeciesName KIM_SpeciesNameFromString(char const *const str)
void KIM_ModelDriverCreate_GetNumberOfParameterFiles(KIM_ModelDriverCreate *const modelDriverCreate, int *const numberOfParameterFiles)
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
KIM_ArgumentName const KIM_ARGUMENT_NAME_particleContributing
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)
static int compute(KIM_ModelCompute const *const modelCompute)
KIM_ArgumentName const KIM_ARGUMENT_NAME_numberOfParticles
KIM_ChargeUnit const KIM_CHARGE_UNIT_e
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
KIM_LanguageName const KIM_LANGUAGE_NAME_c
ArgumentName const particleContributing
struct KIM_ModelRefresh KIM_ModelRefresh
void KIM_ModelDriverCreate_SetInfluenceDistancePointer(KIM_ModelDriverCreate *const modelDriverCreate, double *const influenceDistance)
void KIM_ModelRefresh_GetModelBufferPointer(KIM_ModelRefresh const *const modelRefresh, void **const ptr)
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)
int KIM_ModelDriverCreate_SetArgumentSupportStatus(KIM_ModelDriverCreate *const modelDriverCreate, KIM_ArgumentName const argumentName, KIM_SupportStatus const supportStatus)
void KIM_ModelRefresh_SetNeighborListCutoffsPointer(KIM_ModelRefresh *const modelRefresh, int const numberOfCutoffs, double const *const cutoffs)
KIM_ArgumentName const KIM_ARGUMENT_NAME_partialParticleEnergy
KIM_ArgumentName const KIM_ARGUMENT_NAME_partialForces
struct KIM_ModelDestroy KIM_ModelDestroy
struct KIM_ModelDriverCreate KIM_ModelDriverCreate
int KIM_ModelCompute_GetNeighborList(KIM_ModelCompute const *const modelCompute, int const neighborListIndex, int const particleNumber, int *const numberOfNeighbors, int const **const neighborsOfParticle)
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)
ArgumentName const particleSpeciesCodes
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_TimeUnit const KIM_TIME_UNIT_ps
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)
int KIM_ModelCompute_GetArgumentPointerInteger(KIM_ModelCompute const *const modelCompute, KIM_ArgumentName const argumentName, int **const ptr)
int KIM_ModelDriverCreate_SetComputePointer(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)
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_ArgumentName const KIM_ARGUMENT_NAME_coordinates
KIM_ArgumentName const KIM_ARGUMENT_NAME_particleSpeciesCodes
static int destroy(KIM_ModelDestroy *const modelDestroy)
int KIM_ModelCompute_GetArgumentPointerDouble(KIM_ModelCompute const *const modelCompute, KIM_ArgumentName const argumentName, double **const ptr)
void KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate *const modelDriverCreate, void *const ptr)
#define LOG_ERROR(message)
KIM_LengthUnit const KIM_LENGTH_UNIT_A
KIM_ArgumentName const KIM_ARGUMENT_NAME_partialEnergy
KIM_TemperatureUnit const KIM_TEMPERATURE_UNIT_K
int KIM_ModelDriverCreate_SetRefreshPointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LanguageName const languageName, func *const fptr)
struct KIM_ModelCompute KIM_ModelCompute