52 #define SPEC_NAME_LEN 64 53 #define SPEC_NAME_FMT "%63s" 81 modelWriteParameterizedModel);
84 static 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;
216 double * particleEnergy;
223 cutoff = buffer->influenceDistance;
224 cutsq = &(buffer->cutsq);
225 epsilon = &(buffer->epsilon);
227 Rzero = &(buffer->Rzero);
228 shift = &(buffer->shift);
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];
338 calc_phi_dphi(epsilon, C, Rzero, shift, cutoff, R, &phi, &dphi);
346 calc_phi(epsilon, C, Rzero, shift, cutoff, R, &phi);
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");
535 modelDriverCreate, speciesName,
SPECCODE);
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).");
604 modelDriverCreate, &(buffer->influenceDistance));
609 &(buffer->modelWillNotRequestNeighborsOfNoncontributingParticles));
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 638 buffer->shift = -buffer->shift;
641 buffer->influenceDistance = buffer->cutoff;
645 &(buffer->influenceDistance));
650 &(buffer->modelWillNotRequestNeighborsOfNoncontributingParticles));
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);
757 fprintf(fp,
"%20.10f\n", buffer->cutoff);
758 fprintf(fp,
"%20.10f\n", buffer->epsilon);
759 fprintf(fp,
"%20.10f\n", buffer->C);
760 fprintf(fp,
"%20.10f\n", buffer->Rzero);
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...
static int write_parameterized_model(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel)
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...
int KIM_ModelComputeArgumentsCreateFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
Prototype for MODEL_ROUTINE_NAME::ComputeArgumentsCreate routine.
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
The standard optional status.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_coordinates
The standard coordinates argument.
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_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.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy
The standard partialParticleEnergy argument.
void() KIM_Function(void)
Generic function type.
void KIM_ModelDestroy_GetModelBufferPointer(KIM_ModelDestroy const *const modelDestroy, void **const ptr)
Get the Model's buffer pointer within the Model object.
recursive subroutine, public destroy(model_destroy_handle, ierr)
static int compute_arguments_destroy(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
KIM_LanguageName const KIM_LANGUAGE_NAME_c
The standard c language.
void KIM_ModelDriverCreate_GetNumberOfParameterFiles(KIM_ModelDriverCreate const *const modelDriverCreate, int *const numberOfParameterFiles)
Get the number of parameter files provided by the parameterized model.
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.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialForces
The standard partialForces argument.
#define LOG_ERROR(message)
Convenience macro for ERROR Log entries with compile-time optimization.
char speciesName[SPEC_NAME_LEN]
int KIM_ModelComputeArguments_GetArgumentPointerDouble(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, double **const ptr)
Get the data pointer for a ComputeArgumentName.
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...
An Extensible Enumeration for the EnergyUnit's supported by the KIM API.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_ComputeArgumentsCreate
The standard ComputeArgumentsCreate routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_WriteParameterizedModel
The standard WriteParameterizedModel routine.
void KIM_ModelRefresh_GetModelBufferPointer(KIM_ModelRefresh const *const modelRefresh, void **const ptr)
Get the Model's buffer pointer within the Model object.
void KIM_ModelWriteParameterizedModel_SetParameterFileName(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, char const *const fileName)
Set the file name for the next parameter file.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleSpeciesCodes
The standard particleSpeciesCodes argument.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Compute
The standard Compute routine.
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)
void KIM_ModelWriteParameterizedModel_GetModelBufferPointer(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, void **const ptr)
Get the Model's buffer pointer within the Model object.
An Extensible Enumeration for the LengthUnit's supported by the KIM API.
recursive subroutine, public refresh(model_refresh_handle, ierr)
struct KIM_ModelCompute KIM_ModelCompute
Forward declaration.
An Extensible Enumeration for the ChargeUnit's supported by the KIM API.
KIM_TemperatureUnit const KIM_TEMPERATURE_UNIT_unused
Indicates that a TemperatureUnit is not used.
void KIM_ModelRefresh_SetInfluenceDistancePointer(KIM_ModelRefresh *const modelRefresh, double const *const influenceDistance)
Set the Model's influence distance data pointer.
struct KIM_ModelComputeArgumentsCreate KIM_ModelComputeArgumentsCreate
Forward declaration.
ChargeUnit const C
The standard Coulomb unit of charge.
void KIM_ModelDriverCreate_SetInfluenceDistancePointer(KIM_ModelDriverCreate *const modelDriverCreate, double const *const influenceDistance)
Set the Model's influence distance data pointer.
struct KIM_ModelDestroy KIM_ModelDestroy
Forward declaration.
KIM_TimeUnit const KIM_TIME_UNIT_unused
Indicates that a TimeUnit is not used.
static int refresh_routine(KIM_ModelRefresh *const modelRefresh)
int KIM_ModelComputeArgumentsDestroyFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
Prototype for MODEL_ROUTINE_NAME::ComputeArgumentsDestroy routine.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Destroy
The standard Destroy routine.
ComputeArgumentName const particleContributing
The standard particleContributing argument.
int KIM_ModelComputeArgumentsCreate_SetArgumentSupportStatus(KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate, KIM_ComputeArgumentName const computeArgumentName, KIM_SupportStatus const supportStatus)
Set the SupportStatus of a ComputeArgumentName.
void KIM_ModelCompute_GetModelBufferPointer(KIM_ModelCompute const *const modelCompute, void **const ptr)
Get the Model's buffer pointer within the Model object.
int KIM_ModelWriteParameterizedModelFunction(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel)
Prototype for MODEL_ROUTINE_NAME::WriteParameterizedModel routine.
static int compute_routine(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
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
The standard numberOfParticles argument.
An Extensible Enumeration for the TimeUnit's supported by the KIM API.
int KIM_ModelDriverCreate_SetSpeciesCode(KIM_ModelDriverCreate *const modelDriverCreate, KIM_SpeciesName const speciesName, int const code)
Set integer code for supported SpeciesName.
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.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_ComputeArgumentsDestroy
The standard ComputeArgumentsDestroy routine.
static int compute_arguments_create(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
struct KIM_ModelComputeArgumentsDestroy KIM_ModelComputeArgumentsDestroy
Forward declaration.
static void calc_phi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi)
struct KIM_ModelRefresh KIM_ModelRefresh
Forward declaration.
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...
KIM_EnergyUnit const KIM_ENERGY_UNIT_eV
The standard electronvolt unit of energy.
int modelWillNotRequestNeighborsOfNoncontributingParticles
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_ChargeUnit const KIM_CHARGE_UNIT_unused
Indicates that a ChargeUnit is not used.
ComputeArgumentName const particleSpeciesCodes
The standard particleSpeciesCodes argument.
void KIM_ModelWriteParameterizedModel_GetModelName(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel, char const **const modelName)
Get the name of the new parameterized model.
int KIM_ModelComputeFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArguments const *const modelComputeArguments)
Prototype for MODEL_ROUTINE_NAME::Compute routine.
int KIM_ModelRefreshFunction(KIM_ModelRefresh *const modelRefresh)
Prototype for MODEL_ROUTINE_NAME::Refresh routine.
struct KIM_ModelWriteParameterizedModel KIM_ModelWriteParameterizedModel
Forward declaration.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_partialEnergy
The standard partialEnergy argument.
int KIM_ModelDestroyFunction(KIM_ModelDestroy *const modelDestroy)
Prototype for MODEL_ROUTINE_NAME::Destroy routine.
An Extensible Enumeration for the TemperatureUnit's supported by the KIM API.
void KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate *const modelDriverCreate, void *const ptr)
Set the Model's buffer pointer within the Model object.
KIM_ModelRoutineName const KIM_MODEL_ROUTINE_NAME_Refresh
The standard Refresh routine.
int KIM_ModelDriverCreate_SetModelNumbering(KIM_ModelDriverCreate *const modelDriverCreate, KIM_Numbering const numbering)
Set the Model's particle Numbering.
struct KIM_ModelDriverCreate KIM_ModelDriverCreate
Forward declaration.
struct KIM_ModelComputeArguments KIM_ModelComputeArguments
Forward declaration.
KIM_LengthUnit const KIM_LENGTH_UNIT_A
The standard angstrom unit of length.
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_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.
static int destroy_routine(KIM_ModelDestroy *const modelDestroy)
An Extensible Enumeration for the SpeciesName's supported by the KIM API.
KIM_Numbering const KIM_NUMBERING_zeroBased
The standard zeroBased numbering.
int KIM_ModelComputeArguments_GetArgumentPointerInteger(KIM_ModelComputeArguments const *const modelComputeArguments, KIM_ComputeArgumentName const computeArgumentName, int **const ptr)
Get the data pointer for a ComputeArgumentName.
KIM_ComputeArgumentName const KIM_COMPUTE_ARGUMENT_NAME_particleContributing
The standard particleContributing argument.