kim-api  2.0.2+v2.0.2.GNU
An Application Programming Interface (API) for the Knowledgebase of Interatomic Models (KIM).
ex_model_driver_P_Morse.c
Go to the documentation of this file.
1 /* */
2 /* CDDL HEADER START */
3 /* */
4 /* The contents of this file are subject to the terms of the Common */
5 /* Development and Distribution License Version 1.0 (the "License"). */
6 /* */
7 /* You can obtain a copy of the license at */
8 /* http://www.opensource.org/licenses/CDDL-1.0. See the License for the */
9 /* specific language governing permissions and limitations under the License. */
10 /* */
11 /* When distributing Covered Code, include this CDDL HEADER in each file and */
12 /* include the License file in a prominent location with the name */
13 /* LICENSE.CDDL. If applicable, add the following below this CDDL HEADER, */
14 /* with the fields enclosed by brackets "[]" replaced with your own */
15 /* identifying information: */
16 /* */
17 /* Portions Copyright (c) [yyyy] [name of copyright owner]. */
18 /* All rights reserved. */
19 /* */
20 /* CDDL HEADER END */
21 /* */
22 
23 /* */
24 /* Copyright (c) 2013--2019, Regents of the University of Minnesota. */
25 /* All rights reserved. */
26 /* */
27 /* Contributors: */
28 /* Ryan S. Elliott */
29 /* Ellad B. Tadmor */
30 /* Stephen M. Whalen */
31 /* */
32 
33 /******************************************************************************/
34 /* */
35 /* ex_model_driver_P_Morse pair potential KIM Model Driver */
36 /* shifted to have zero energy at the cutoff radius */
37 /* */
38 /* Language: C */
39 /* */
40 /******************************************************************************/
41 
42 
43 #include "KIM_LogMacros.h"
44 #include "KIM_ModelDriverHeaders.h"
45 #include <math.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 
50 #define TRUE 1
51 #define FALSE 0
52 
53 /******************************************************************************/
54 /* Below are the definitions for some constants */
55 /******************************************************************************/
56 #define DIM 3 /* dimensionality of space */
57 #define SPECCODE 1 /* internal species code */
58 #define SPEC_NAME_LEN 64 /* max length of species name string */
59 #define SPEC_NAME_FMT "%63s"
60 
61 
62 /* Define prototype for Model Driver init */
63 int model_driver_create(KIM_ModelDriverCreate * const modelDriverCreate,
64  KIM_LengthUnit const requestedLengthUnit,
65  KIM_EnergyUnit const requestedEnergyUnit,
66  KIM_ChargeUnit const requestedChargeUnit,
67  KIM_TemperatureUnit const requestedTemperatureUnit,
68  KIM_TimeUnit const requestedTimeUnit);
69 
70 /* Define prototypes for destroy */
71 /* defined as static to avoid namespace clashes with other codes */
72 static int destroy_routine(KIM_ModelDestroy * const modelDestroy);
73 
74 /* Define prototype for routines */
75 static int
76 compute_routine(KIM_ModelCompute const * const modelCompute,
77  KIM_ModelComputeArguments const * const modelComputeArguments);
78 static int compute_arguments_create(
79  KIM_ModelCompute const * const modelCompute,
80  KIM_ModelComputeArgumentsCreate * const modelComputeArgumentsCreate);
81 static int compute_arguments_destroy(
82  KIM_ModelCompute const * const modelCompute,
83  KIM_ModelComputeArgumentsDestroy * const modelComputeArgumentsDestroy);
84 static int refresh_routine(KIM_ModelRefresh * const modelRefresh);
85 static int
87  modelWriteParameterizedModel);
88 
89 /* Define prototypes for pair potential calculations */
90 static void calc_phi(double const * epsilon,
91  double const * C,
92  double const * Rzero,
93  double const * shift,
94  double const cutoff,
95  double const r,
96  double * phi);
97 
98 static void calc_phi_dphi(double const * epsilon,
99  double const * C,
100  double const * Rzero,
101  double const * shift,
102  double const cutoff,
103  double const r,
104  double * phi,
105  double * dphi);
106 
107 /* Define model_buffer structure */
109 {
111  double cutoff;
112  double cutsq;
115  double epsilon;
116  double C;
117  double Rzero;
118  double shift;
119 };
120 
121 
122 /* Calculate pair potential phi(r) */
123 static void calc_phi(double const * epsilon,
124  double const * C,
125  double const * Rzero,
126  double const * shift,
127  double const cutoff,
128  double const r,
129  double * phi)
130 {
131  /* local variables */
132  double ep;
133  double ep2;
134 
135  ep = exp(-(*C) * (r - *Rzero));
136  ep2 = ep * ep;
137 
138  if (r > cutoff)
139  {
140  /* Argument exceeds cutoff radius */
141  *phi = 0.0;
142  }
143  else
144  {
145  *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
146  }
147 
148  return;
149 }
150 
151 /* Calculate pair potential phi(r) and its derivative dphi(r) */
152 static void calc_phi_dphi(double const * epsilon,
153  double const * C,
154  double const * Rzero,
155  double const * shift,
156  double const cutoff,
157  double const r,
158  double * phi,
159  double * dphi)
160 {
161  /* local variables */
162  double ep;
163  double ep2;
164 
165  ep = exp(-(*C) * (r - *Rzero));
166  ep2 = ep * ep;
167 
168  if (r > cutoff)
169  {
170  /* Argument exceeds cutoff radius */
171  *phi = 0.0;
172  *dphi = 0.0;
173  }
174  else
175  {
176  *phi = (*epsilon) * (-ep2 + 2.0 * ep) + *shift;
177  *dphi = 2.0 * (*epsilon) * (*C) * (-ep + ep2);
178  }
179 
180  return;
181 }
182 
183 /* compute function */
184 #undef KIM_LOGGER_FUNCTION_NAME
185 #define KIM_LOGGER_FUNCTION_NAME KIM_ModelCompute_LogEntry
186 #undef KIM_LOGGER_OBJECT_NAME
187 #define KIM_LOGGER_OBJECT_NAME modelCompute
188 static int
189 compute_routine(KIM_ModelCompute const * const modelCompute,
190  KIM_ModelComputeArguments const * const modelComputeArguments)
191 {
192  /* local variables */
193  double R;
194  double Rsqij;
195  double phi;
196  double dphi;
197  double dEidr;
198  double Rij[DIM];
199  int ier;
200  int i;
201  int j;
202  int jj;
203  int k;
204  int const * neighListOfCurrentPart;
205  struct model_buffer * buffer;
206  int comp_energy;
207  int comp_force;
208  int comp_particleEnergy;
209 
210  int * nParts;
211  int * particleSpeciesCodes;
212  int * particleContributing;
213  double cutoff;
214  double * cutsq;
215  double * epsilon;
216  double * C;
217  double * Rzero;
218  double * shift;
219  double * coords;
220  double * energy;
221  double * force;
222  double * particleEnergy;
223  int numOfPartNeigh;
224 
225  /* get buffer from KIM object */
226  KIM_ModelCompute_GetModelBufferPointer(modelCompute, (void **) &buffer);
227 
228  /* unpack info from the buffer */
229  cutoff = buffer->influenceDistance;
230  cutsq = &(buffer->cutsq);
231  epsilon = &(buffer->epsilon);
232  C = &(buffer->C);
233  Rzero = &(buffer->Rzero);
234  shift = &(buffer->shift);
235 
237  modelComputeArguments,
239  &nParts)
241  modelComputeArguments,
243  &particleSpeciesCodes)
245  modelComputeArguments,
247  &particleContributing)
249  modelComputeArguments,
251  &coords)
253  modelComputeArguments,
255  &energy)
257  modelComputeArguments,
259  &force)
261  modelComputeArguments,
263  &particleEnergy);
264  if (ier)
265  {
266  LOG_ERROR("GetArgumentPointer");
267  return ier;
268  }
269 
270  comp_energy = (energy != NULL);
271  comp_force = (force != NULL);
272  comp_particleEnergy = (particleEnergy != NULL);
273 
274  /* Check to be sure that the species are correct */
275 
276  ier = TRUE; /* assume an error */
277  for (i = 0; i < *nParts; ++i)
278  {
279  if (SPECCODE != particleSpeciesCodes[i])
280  {
281  LOG_ERROR("Unexpected species code detected");
282  return ier;
283  }
284  }
285  ier = FALSE; /* everything is ok */
286 
287  /* initialize potential energies, forces, and virial term */
288  if (comp_particleEnergy)
289  {
290  for (i = 0; i < *nParts; ++i) { particleEnergy[i] = 0.0; }
291  }
292  if (comp_energy) { *energy = 0.0; }
293 
294  if (comp_force)
295  {
296  for (i = 0; i < *nParts; ++i)
297  {
298  for (k = 0; k < DIM; ++k) { force[i * DIM + k] = 0.0; }
299  }
300  }
301 
302  /* Compute energy and forces */
303 
304  /* loop over particles and compute enregy and forces */
305  for (i = 0; i < *nParts; ++i)
306  {
307  if (particleContributing[i])
308  {
309  ier = KIM_ModelComputeArguments_GetNeighborList(modelComputeArguments,
310  0,
311  i,
312  &numOfPartNeigh,
313  &neighListOfCurrentPart);
314  if (ier)
315  {
316  /* some sort of problem, exit */
317  LOG_ERROR("KIM_get_neigh");
318  ier = TRUE;
319  return ier;
320  }
321 
322  /* loop over the neighbors of particle i */
323  for (jj = 0; jj < numOfPartNeigh; ++jj)
324  {
325  j = neighListOfCurrentPart[jj]; /* get neighbor ID */
326 
327  /* compute relative position vector and squared distance */
328  Rsqij = 0.0;
329  for (k = 0; k < DIM; ++k)
330  {
331  Rij[k] = coords[j * DIM + k] - coords[i * DIM + k];
332  /* compute squared distance */
333  Rsqij += Rij[k] * Rij[k];
334  }
335 
336  /* compute energy and force */
337  if (Rsqij < *cutsq)
338  {
339  /* particles are interacting ? */
340  R = sqrt(Rsqij);
341  if (comp_force)
342  {
343  /* compute pair potential and its derivative */
344  calc_phi_dphi(epsilon, C, Rzero, shift, cutoff, R, &phi, &dphi);
345 
346  /* compute dEidr */
347  dEidr = 0.5 * dphi;
348  }
349  else
350  {
351  /* compute just pair potential */
352  calc_phi(epsilon, C, Rzero, shift, cutoff, R, &phi);
353  }
354 
355  /* contribution to energy */
356  if (comp_particleEnergy) { particleEnergy[i] += 0.5 * phi; }
357  if (comp_energy) { *energy += 0.5 * phi; }
358 
359  /* contribution to forces */
360  if (comp_force)
361  {
362  for (k = 0; k < DIM; ++k)
363  {
364  force[i * DIM + k]
365  += dEidr * Rij[k] / R; /* accumulate force on i */
366  force[j * DIM + k]
367  -= dEidr * Rij[k] / R; /* accumulate force on j */
368  }
369  }
370  } /* if Rsqij */
371  } /* loop on jj */
372  } /* if particleContributing */
373  } /* infinite while loop (terminated by break statements above) */
374 
375  /* everything is great */
376  ier = FALSE;
377 
378  return ier;
379 }
380 
381 /* Create function */
382 #undef KIM_LOGGER_FUNCTION_NAME
383 #define KIM_LOGGER_FUNCTION_NAME KIM_ModelDriverCreate_LogEntry
384 #undef KIM_LOGGER_OBJECT_NAME
385 #define KIM_LOGGER_OBJECT_NAME modelDriverCreate
386 int model_driver_create(KIM_ModelDriverCreate * const modelDriverCreate,
387  KIM_LengthUnit const requestedLengthUnit,
388  KIM_EnergyUnit const requestedEnergyUnit,
389  KIM_ChargeUnit const requestedChargeUnit,
390  KIM_TemperatureUnit const requestedTemperatureUnit,
391  KIM_TimeUnit const requestedTimeUnit)
392 {
393  /* KIM variables */
394  int numberOfParameterFiles;
395  char const * paramfile1name;
396 
397  /* Local variables */
398  FILE * fid;
399  char speciesNameString[SPEC_NAME_LEN];
401  double cutoff;
402  double epsilon;
403  double C;
404  double Rzero;
405  int ier;
406  double dummy;
407  struct model_buffer * buffer;
408 
409  /* Use function pointer definitions to verify prototypes */
419 
420 
421  (void) create; /* avoid unused parameter warnings */
422  (void) requestedLengthUnit;
423  (void) requestedEnergyUnit;
424  (void) requestedChargeUnit;
425  (void) requestedTemperatureUnit;
426  (void) requestedTimeUnit;
427 
428 
429  /* using fixed units */
430  ier = KIM_ModelDriverCreate_SetUnits(modelDriverCreate,
436  if (ier == TRUE)
437  {
438  LOG_ERROR("Problem setting units");
439  return ier;
440  }
441 
442  ier = KIM_ModelDriverCreate_SetModelNumbering(modelDriverCreate,
444  if (ier == TRUE)
445  {
446  LOG_ERROR("Unable to set numbering");
447  return ier;
448  }
449 
450  /* store pointer to functions in KIM object */
452  modelDriverCreate,
455  TRUE,
456  (KIM_Function *) CACreate)
458  modelDriverCreate,
461  TRUE,
462  (KIM_Function *) compute)
464  modelDriverCreate,
467  TRUE,
468  (KIM_Function *) refresh)
470  modelDriverCreate,
473  FALSE,
474  (KIM_Function *) writeModel)
476  modelDriverCreate,
479  TRUE,
480  (KIM_Function *) CADestroy)
482  modelDriverCreate,
485  TRUE,
486  (KIM_Function *) destroy);
487 
488  /* get number of parameter files */
490  &numberOfParameterFiles);
491  /* set paramfile1name */
492  if (numberOfParameterFiles != 1)
493  {
494  ier = TRUE;
495  LOG_ERROR("Incorrect number of parameter files.");
496  return ier;
497  }
499  modelDriverCreate, 0, &paramfile1name);
500  if (ier == TRUE)
501  {
502  LOG_ERROR("Unable to get parameter file name.");
503  return ier;
504  }
505 
506  /* Read in model parameters from parameter file */
507  fid = fopen(paramfile1name, "r");
508  if (fid == NULL)
509  {
510  ier = TRUE;
511  LOG_ERROR("Unable to open parameter file for Morse parameters");
512  return ier;
513  }
514 
515  ier = fscanf(fid,
516  SPEC_NAME_FMT " \n%lf \n%lf \n%lf \n%lf",
517  speciesNameString, /* element symbol */
518  &cutoff, /* cutoff distance in angstroms */
519  &epsilon, /* Morse epsilon in eV */
520  &C, /* Morse C in 1/Angstroms */
521  &Rzero /* Morse Rzero in Angstroms */
522  );
523  fclose(fid);
524 
525  /* check that we read the right number of parameters */
526  if (5 != ier)
527  {
528  ier = TRUE;
529  LOG_ERROR("Unable to read all parameters");
530  return ier;
531  }
532 
533  /* register species */
534  speciesName = KIM_SpeciesName_FromString(speciesNameString);
536  modelDriverCreate, speciesName, SPECCODE);
537  if (ier == TRUE)
538  {
539  LOG_ERROR("Unable to set species code for Ar.");
540  return ier;
541  }
542 
543 
544  /* allocate buffer */
545  buffer = (struct model_buffer *) malloc(sizeof(struct model_buffer));
546  if (NULL == buffer)
547  {
548  ier = TRUE;
549  LOG_ERROR("malloc");
550  return ier;
551  }
552 
553  /* setup buffer */
554  /* set value of parameters */
555  buffer->influenceDistance = cutoff;
556  buffer->cutoff = cutoff;
557  buffer->cutsq = (cutoff) * (cutoff);
559  sprintf(buffer->speciesName, "%s", speciesNameString);
560  buffer->epsilon = epsilon;
561  buffer->C = C;
562  buffer->Rzero = Rzero;
563  /* set value of parameter shift */
564  dummy = 0.0;
565  /* call calc_phi with r=cutoff and shift=0.0 */
566  calc_phi(&(buffer->epsilon),
567  &(buffer->C),
568  &(buffer->Rzero),
569  &dummy,
570  cutoff,
571  cutoff,
572  &(buffer->shift));
573  /* set shift to -shift */
574  buffer->shift = -buffer->shift;
575 
576  /* end setup buffer */
577 
578  /* store in model buffer */
580  (void *) buffer);
581 
582  /* publish model parameters */
583  ier = KIM_ModelDriverCreate_SetParameterPointerDouble(modelDriverCreate,
584  1,
585  &(buffer->cutoff),
586  "cutoff",
587  "pair cutoff distance")
589  1,
590  &(buffer->epsilon),
591  "epsilon",
592  "Morse epsilon")
594  modelDriverCreate, 1, &(buffer->C), "C", "Morse C")
596  modelDriverCreate, 1, &(buffer->Rzero), "Rzero", "Morse Rzero");
597  if (ier == TRUE)
598  {
599  LOG_ERROR("Unable to set parameter pointer(s).");
600  return TRUE;
601  }
602 
603  /* store model cutoff in KIM object */
605  modelDriverCreate, &(buffer->influenceDistance));
607  modelDriverCreate,
608  1,
609  &(buffer->cutoff),
610  &(buffer->modelWillNotRequestNeighborsOfNoncontributingParticles));
611 
612  return FALSE;
613 }
614 
615 /* Refresh function */
616 #undef KIM_LOGGER_FUNCTION_NAME
617 #define KIM_LOGGER_FUNCTION_NAME KIM_ModelRefresh_LogEntry
618 #undef KIM_LOGGER_OBJECT_NAME
619 #define KIM_LOGGER_OBJECT_NAME modelRefresh
620 int refresh_routine(KIM_ModelRefresh * const modelRefresh)
621 {
622  double dummy;
623  struct model_buffer * buffer;
624 
625  /* get model buffer from KIM object */
626  KIM_ModelRefresh_GetModelBufferPointer(modelRefresh, (void **) &buffer);
627 
628  /* set value of parameter shift */
629  dummy = 0.0;
630  /* call calc_phi with r=cutoff and shift=0.0 */
631  calc_phi(&(buffer->epsilon),
632  &(buffer->C),
633  &(buffer->Rzero),
634  &dummy,
635  buffer->cutoff,
636  buffer->cutoff,
637  &(buffer->shift));
638  /* set shift to -shift */
639  buffer->shift = -buffer->shift;
640 
641 
642  /* store model cutoff in KIM object */
644  &(buffer->influenceDistance));
646  modelRefresh,
647  1,
648  &(buffer->cutoff),
649  &(buffer->modelWillNotRequestNeighborsOfNoncontributingParticles));
650 
651  return FALSE;
652 }
653 
654 
655 /* destroy function */
656 static int destroy_routine(KIM_ModelDestroy * const modelDestroy)
657 {
658  /* Local variables */
659  struct model_buffer * buffer;
660  int ier;
661 
662  /* get model buffer from KIM object */
663  KIM_ModelDestroy_GetModelBufferPointer(modelDestroy, (void **) &buffer);
664 
665  /* free the buffer */
666  free(buffer);
667 
668  ier = FALSE;
669  return ier;
670 }
671 
672 /* compute arguments create routine */
673 #undef KIM_LOGGER_FUNCTION_NAME
674 #define KIM_LOGGER_FUNCTION_NAME KIM_ModelComputeArgumentsCreate_LogEntry
675 #undef KIM_LOGGER_OBJECT_NAME
676 #define KIM_LOGGER_OBJECT_NAME modelComputeArgumentsCreate
678  KIM_ModelCompute const * const modelCompute,
679  KIM_ModelComputeArgumentsCreate * const modelComputeArgumentsCreate)
680 {
681  int ier;
682 
683  (void) modelCompute; /* avoid unused parameter warning */
684 
685  /* register arguments */
687  modelComputeArgumentsCreate,
691  modelComputeArgumentsCreate,
695  modelComputeArgumentsCreate,
698  if (ier == TRUE)
699  {
700  LOG_ERROR("Unable to set argument supportStatus.");
701  return TRUE;
702  }
703  else
704  {
705  return FALSE;
706  }
707 }
708 
709 /* compute arguments destroy routine */
711  KIM_ModelCompute const * const modelCompute,
712  KIM_ModelComputeArgumentsDestroy * const modelComputeArgumentsDestroy)
713 {
714  (void) modelCompute; /* avoid unused parameter warning */
715  (void) modelComputeArgumentsDestroy;
716 
717  /* Nothing further to do */
718 
719  return FALSE;
720 }
721 
722 /* write parameterized model routine */
723 #undef KIM_LOGGER_FUNCTION_NAME
724 #define KIM_LOGGER_FUNCTION_NAME KIM_ModelWriteParameterizedModel_LogEntry
725 #undef KIM_LOGGER_OBJECT_NAME
726 #define KIM_LOGGER_OBJECT_NAME modelWriteParameterizedModel
728  KIM_ModelWriteParameterizedModel const * const modelWriteParameterizedModel)
729 {
730  FILE * fp;
731  char stringBuffer[2048];
732  struct model_buffer const * buffer;
733  char const * path;
734  char const * modelName;
735 
736  /* get buffer from KIM object */
738  modelWriteParameterizedModel, (void **) &buffer);
739 
740  KIM_ModelWriteParameterizedModel_GetPath(modelWriteParameterizedModel, &path);
741  KIM_ModelWriteParameterizedModel_GetModelName(modelWriteParameterizedModel,
742  &modelName);
743 
744  sprintf(stringBuffer, "%s.params", modelName);
746  modelWriteParameterizedModel, stringBuffer);
747  sprintf(stringBuffer, "%s/%s.params", path, modelName);
748  fp = fopen(stringBuffer, "w");
749  if (NULL == fp)
750  {
751  LOG_ERROR("Unable to open parameter file for writing.");
752  return TRUE;
753  }
754 
755  fprintf(fp, "%s\n", buffer->speciesName);
756  fprintf(fp, "%20.10f\n", buffer->cutoff);
757  fprintf(fp, "%20.10f\n", buffer->epsilon);
758  fprintf(fp, "%20.10f\n", buffer->C);
759  fprintf(fp, "%20.10f\n", buffer->Rzero);
760  fclose(fp);
761 
762  return FALSE;
763 }
static int write_parameterized_model(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel)
int KIM_ModelComputeArgumentsCreateFunction(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
Prototype for MODEL_ROUTINE_NAME::ComputeArgumentsCreate routine.
#define SPECCODE
KIM_SupportStatus const KIM_SUPPORT_STATUS_optional
The standard optional status.
struct buffer buffer
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&#39;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&#39;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&#39;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&#39;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&#39;s buffer pointer within the Model object.
An Extensible Enumeration for the LengthUnit&#39;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&#39;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&#39;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&#39;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)
#define TRUE
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&#39;s buffer pointer within the Model object.
int KIM_ModelDriverCreate_GetParameterFileName(KIM_ModelDriverCreate const *const modelDriverCreate, int const index, char const **const parameterFileName)
Get a particular parameter file name.
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&#39;s supported by the KIM API.
Definition: KIM_TimeUnit.h:46
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.
#define FALSE
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...
#define DIM
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&#39;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&#39;s supported by the KIM API.
#define SPEC_NAME_LEN
void KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate *const modelDriverCreate, void *const ptr)
Set the Model&#39;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&#39;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.
#define SPEC_NAME_FMT
void KIM_ModelDriverCreate_SetNeighborListPointers(KIM_ModelDriverCreate *const modelDriverCreate, int const numberOfNeighborLists, double const *const cutoffs, int const *const modelWillNotRequestNeighborsOfNoncontributingParticles)
Set the Model&#39;s neighbor list data pointers.
static int destroy_routine(KIM_ModelDestroy *const modelDestroy)
An Extensible Enumeration for the SpeciesName&#39;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.