52#define SPEC_NAME_LEN 64
53#define SPEC_NAME_FMT "%63s"
81 modelWriteParameterizedModel);
84static void calc_phi(
double const * epsilon,
119 double const * Rzero,
120 double const * shift,
129 ep = exp(-(*C) * (r - *Rzero));
139 *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
148 double const * Rzero,
149 double const * shift,
159 ep = exp(-(*C) * (r - *Rzero));
170 *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
171 *dphi = 2.0 * (*epsilon) * (*C) * (-ep + ep2);
178#undef KIM_LOGGER_FUNCTION_NAME
179#define KIM_LOGGER_FUNCTION_NAME KIM_ModelCompute_LogEntry
180#undef KIM_LOGGER_OBJECT_NAME
181#define KIM_LOGGER_OBJECT_NAME modelCompute
198 int const * neighListOfCurrentPart;
202 int comp_particleEnergy;
205 int * particleSpeciesCodes;
206 int * particleContributing;
216 double * particleEnergy;
231 modelComputeArguments,
235 modelComputeArguments,
237 &particleSpeciesCodes)
239 modelComputeArguments,
241 &particleContributing)
243 modelComputeArguments,
247 modelComputeArguments,
251 modelComputeArguments,
255 modelComputeArguments,
264 comp_energy = (energy != NULL);
265 comp_force = (force != NULL);
266 comp_particleEnergy = (particleEnergy != NULL);
271 for (i = 0; i < *nParts; ++i)
273 if (
SPECCODE != particleSpeciesCodes[i])
275 LOG_ERROR(
"Unexpected species code detected");
282 if (comp_particleEnergy)
284 for (i = 0; i < *nParts; ++i) { particleEnergy[i] = 0.0; }
286 if (comp_energy) { *energy = 0.0; }
290 for (i = 0; i < *nParts; ++i)
292 for (k = 0; k <
DIM; ++k) { force[i *
DIM + k] = 0.0; }
299 for (i = 0; i < *nParts; ++i)
301 if (particleContributing[i])
307 &neighListOfCurrentPart);
317 for (jj = 0; jj < numOfPartNeigh; ++jj)
319 j = neighListOfCurrentPart[jj];
323 for (k = 0; k <
DIM; ++k)
325 Rij[k] = coords[j *
DIM + k] - coords[i *
DIM + k];
327 Rsqij += Rij[k] * Rij[k];
350 if (comp_particleEnergy) { particleEnergy[i] += 0.5 * phi; }
351 if (comp_energy) { *energy += 0.5 * phi; }
356 for (k = 0; k <
DIM; ++k)
359 += dEidr * Rij[k] / R;
361 -= dEidr * Rij[k] / R;
376#undef KIM_LOGGER_FUNCTION_NAME
377#define KIM_LOGGER_FUNCTION_NAME KIM_ModelDriverCreate_LogEntry
378#undef KIM_LOGGER_OBJECT_NAME
379#define KIM_LOGGER_OBJECT_NAME modelDriverCreate
388 int numberOfParameterFiles;
389 char const * paramfiledirname;
390 char const * paramfilebasename;
391 char paramfile1name[2048];
418 (void) requestedLengthUnit;
419 (void) requestedEnergyUnit;
420 (void) requestedChargeUnit;
421 (void) requestedTemperatureUnit;
422 (void) requestedTimeUnit;
486 &numberOfParameterFiles);
488 if (numberOfParameterFiles != 1)
491 LOG_ERROR(
"Incorrect number of parameter files.");
497 modelDriverCreate, 0, ¶mfilebasename);
500 LOG_ERROR(
"Unable to get parameter file basename.");
503 sprintf(paramfile1name,
"%s/%s", paramfiledirname, paramfilebasename);
506 fid = fopen(paramfile1name,
"r");
510 LOG_ERROR(
"Unable to open parameter file for Morse parameters");
528 LOG_ERROR(
"Unable to read all parameters");
538 LOG_ERROR(
"Unable to set species code for Ar.");
558 sprintf(
buffer->speciesName,
"%s", speciesNameString);
586 "pair cutoff distance")
593 modelDriverCreate, 1, &(
buffer->C),
"C",
"Morse C")
595 modelDriverCreate, 1, &(
buffer->Rzero),
"Rzero",
"Morse Rzero");
598 LOG_ERROR(
"Unable to set parameter pointer(s).");
615#undef KIM_LOGGER_FUNCTION_NAME
616#define KIM_LOGGER_FUNCTION_NAME KIM_ModelRefresh_LogEntry
617#undef KIM_LOGGER_OBJECT_NAME
618#define KIM_LOGGER_OBJECT_NAME modelRefresh
674#undef KIM_LOGGER_FUNCTION_NAME
675#define KIM_LOGGER_FUNCTION_NAME KIM_ModelComputeArgumentsCreate_LogEntry
676#undef KIM_LOGGER_OBJECT_NAME
677#define KIM_LOGGER_OBJECT_NAME modelComputeArgumentsCreate
688 modelComputeArgumentsCreate,
692 modelComputeArgumentsCreate,
696 modelComputeArgumentsCreate,
701 LOG_ERROR(
"Unable to set argument supportStatus.");
716 (void) modelComputeArgumentsDestroy;
724#undef KIM_LOGGER_FUNCTION_NAME
725#define KIM_LOGGER_FUNCTION_NAME KIM_ModelWriteParameterizedModel_LogEntry
726#undef KIM_LOGGER_OBJECT_NAME
727#define KIM_LOGGER_OBJECT_NAME modelWriteParameterizedModel
732 char stringBuffer[2048];
735 char const * modelName;
739 modelWriteParameterizedModel, (
void **) &
buffer);
745 sprintf(stringBuffer,
"%s.params", modelName);
747 modelWriteParameterizedModel, stringBuffer);
748 sprintf(stringBuffer,
"%s/%s.params", path, modelName);
749 fp = fopen(stringBuffer,
"w");
752 LOG_ERROR(
"Unable to open parameter file for writing.");
756 fprintf(fp,
"%s\n",
buffer->speciesName);
758 fprintf(fp,
"%20.10f\n",
buffer->epsilon);
759 fprintf(fp,
"%20.10f\n",
buffer->C);
760 fprintf(fp,
"%20.10f\n",
buffer->Rzero);
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_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.
struct KIM_ModelWriteParameterizedModel KIM_ModelWriteParameterizedModel
Forward declaration.
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_ModelDestroy KIM_ModelDestroy
Forward declaration.
int KIM_ModelWriteParameterizedModelFunction(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel)
Prototype for MODEL_ROUTINE_NAME::WriteParameterizedModel routine.
struct KIM_ModelCompute KIM_ModelCompute
Forward declaration.
struct KIM_ModelComputeArguments KIM_ModelComputeArguments
Forward declaration.
void() KIM_Function(void)
Generic function type.
struct KIM_ModelDriverCreate KIM_ModelDriverCreate
Forward declaration.
int KIM_ModelDriverCreateFunction(KIM_ModelDriverCreate *const modelDriverCreate, 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_ModelRefreshFunction(KIM_ModelRefresh *const modelRefresh)
Prototype for MODEL_ROUTINE_NAME::Refresh 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.
struct KIM_ModelRefresh KIM_ModelRefresh
Forward declaration.
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.
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_ModelComputeArgumentsCreate_SetArgumentSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeArgumentName const computeArgumentName, KIM_SupportStatus const supportStatus)
Set the SupportStatus of a ComputeArgumentName.
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
Get the Model's buffer pointer within the Model object.
void KIM_ModelDriverCreate_GetParameterFileDirectoryName(KIM_ModelDriverCreate const *const modelDriverCreate, char const **const directoryName)
Get absolute path name of the temporary directory where parameter files provided by the model are wri...
void KIM_ModelDriverCreate_SetInfluenceDistancePointer(KIM_ModelDriverCreate *const modelDriverCreate, double const *const influenceDistance)
Set the Model's influence distance data pointer.
int KIM_ModelDriverCreate_SetRoutinePointer(KIM_ModelDriverCreate *const modelDriverCreate, KIM_ModelRoutineName const modelRoutineName, KIM_LanguageName const languageName, int const required, KIM_Function *const fptr)
Set the function pointer for the ModelRoutineName of interest.
void KIM_ModelDriverCreate_GetNumberOfParameterFiles(KIM_ModelDriverCreate const *const modelDriverCreate, int *const numberOfParameterFiles)
Get the number of parameter files provided by the parameterized model.
void KIM_ModelDriverCreate_SetNeighborListPointers(KIM_ModelDriverCreate *const modelDriverCreate, int const numberOfNeighborLists, double const *const cutoffs, int const *const modelWillNotRequestNeighborsOfNoncontributingParticles)
Set the Model's neighbor list data pointers.
int KIM_ModelDriverCreate_GetParameterFileBasename(KIM_ModelDriverCreate const *const modelDriverCreate, int const index, char const **const parameterFileBasename)
Get a particular parameter file basename. The file is located in the Model's parameter file directory...
int KIM_ModelDriverCreate_SetModelNumbering(KIM_ModelDriverCreate *const modelDriverCreate, KIM_Numbering const numbering)
Set the Model's particle Numbering.
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)
Set the Model's base unit values.
int KIM_ModelDriverCreate_SetParameterPointerDouble(KIM_ModelDriverCreate *const modelDriverCreate, int const extent, double *const ptr, char const *const name, char const *const description)
Set the next parameter data pointer to be provided by the model.
int KIM_ModelDriverCreate_SetSpeciesCode(KIM_ModelDriverCreate *const modelDriverCreate, KIM_SpeciesName const speciesName, int const code)
Set integer code for supported SpeciesName.
void KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate *const modelDriverCreate, void *const ptr)
Set the Model's buffer pointer within the Model object.
void KIM_ModelRefresh_SetInfluenceDistancePointer(KIM_ModelRefresh *const modelRefresh, double const *const influenceDistance)
Set the Model's influence distance data pointer.
void KIM_ModelRefresh_GetModelBufferPointer(KIM_ModelRefresh const *const modelRefresh, void **const ptr)
Get the Model's buffer pointer within the Model object.
void KIM_ModelRefresh_SetNeighborListPointers(KIM_ModelRefresh *const modelRefresh, int const numberOfNeighborLists, double const *const cutoffs, int const *const modelWillNotRequestNeighborsOfNoncontributingParticles)
Set the Model's neighbor list data pointers.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Destroy
The standard Destroy routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Refresh
The standard Refresh routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Compute
The standard Compute routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_WriteParameterizedModel
The standard WriteParameterizedModel 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.
void KIM_ModelWriteParameterizedModel_GetModelBufferPointer(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, void **const ptr)
Get the Model's buffer pointer within the Model object.
void KIM_ModelWriteParameterizedModel_GetModelName(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, char const **const modelName)
Get the name of the new parameterized model.
void KIM_ModelWriteParameterizedModel_GetPath(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, char const **const path)
Get the directory path where the parameterized model files should be written.
void KIM_ModelWriteParameterizedModel_SetParameterFileName(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, char const *const fileName)
Set the file name for the next parameter file.
KIM_Numbering const KIM_NUMBERING_zeroBased
The standard zeroBased numbering.
KIM_SpeciesName KIM_SpeciesName_FromString(char const *const str)
Create a SpeciesName object corresponding to the provided string. If the string does not match one of...
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 int refresh_routine(KIM_ModelRefresh *const modelRefresh)
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)
static int destroy_routine(KIM_ModelDestroy *const modelDestroy)
static void calc_phi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi)
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)
static int compute_routine(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
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 SpeciesName'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
char speciesName[SPEC_NAME_LEN]
int modelWillNotRequestNeighborsOfNoncontributingParticles