31 #ifndef LENNARD_JONES_612_IMPLEMENTATION_HPP_ 32 #define LENNARD_JONES_612_IMPLEMENTATION_HPP_ 43 #define MAX_PARAMETER_FILES 1 45 #define PARAM_SHIFT_INDEX 0 46 #define PARAM_CUTOFFS_INDEX 1 47 #define PARAM_EPSILONS_INDEX 2 48 #define PARAM_SIGMAS_INDEX 3 96 modelComputeArgumentsCreate)
const;
98 modelComputeArgumentsDestroy)
const;
107 int numberModelSpecies_;
108 std::vector<int> modelSpeciesCodeList_;
109 int numberUniqueSpeciesPairs_;
139 double influenceDistance_;
140 double ** cutoffsSq2D_;
141 int modelWillNotRequestNeighborsOfNoncontributingParticles_;
142 double ** fourEpsilonSigma6_2D_;
143 double ** fourEpsilonSigma12_2D_;
144 double ** twentyFourEpsilonSigma6_2D_;
145 double ** fortyEightEpsilonSigma12_2D_;
146 double ** oneSixtyEightEpsilonSigma6_2D_;
147 double ** sixTwentyFourEpsilonSigma12_2D_;
156 int cachedNumberOfParticles_;
163 void AllocatePrivateParameterMemory();
164 void AllocateParameterMemory();
167 int const numberParameterFiles,
169 int ProcessParameterFiles(
171 int const numberParameterFiles,
172 FILE *
const parameterFilePointers[MAX_PARAMETER_FILES]);
173 void getNextDataLine(FILE *
const filePtr,
174 char *
const nextLine,
176 int * endOfFileFlag);
178 CloseParameterFiles(
int const numberParameterFiles,
179 FILE *
const parameterFilePointers[MAX_PARAMETER_FILES]);
186 int RegisterKIMModelSettings(
188 int RegisterKIMComputeArgumentsSettings(
192 int RegisterKIMFunctions(
196 template<
class ModelObj>
197 int SetRefreshMutableValues(ModelObj *
const modelObj);
201 int SetComputeMutableValues(
203 bool & isComputeProcess_dEdr,
204 bool & isComputeProcess_d2Edr2,
205 bool & isComputeEnergy,
206 bool & isComputeForces,
207 bool & isComputeParticleEnergy,
208 bool & isComputeVirial,
209 bool & isComputeParticleVirial,
214 double *& particleEnergy,
219 int const *
const particleSpeciesCodes)
const;
220 int GetComputeIndex(
const bool & isComputeProcess_dEdr,
221 const bool & isComputeProcess_d2Edr2,
222 const bool & isComputeEnergy,
223 const bool & isComputeForces,
224 const bool & isComputeParticleEnergy,
225 const bool & isComputeVirial,
226 const bool & isComputeParticleVirial,
227 const bool & isShift)
const;
228 void ProcessVirialTerm(
const double & dEidr,
230 const double *
const r_ij,
234 void ProcessParticleVirialTerm(
const double & dEidr,
236 const double *
const r_ij,
242 template<
bool isComputeProcess_dEdr,
243 bool isComputeProcess_d2Edr2,
244 bool isComputeEnergy,
245 bool isComputeForces,
246 bool isComputeParticleEnergy,
247 bool isComputeVirial,
248 bool isComputeParticleVirial,
252 const int *
const particleSpeciesCodes,
253 const int *
const particleContributing,
255 double *
const energy,
257 double *
const particleEnergy,
277 #define LENNARD_JONES_PHI(exshift) \ 279 * (constFourEpsSig12_2D[iSpecies][jSpecies] * r6iv \ 280 - constFourEpsSig6_2D[iSpecies][jSpecies]) exshift; 283 #undef KIM_LOGGER_OBJECT_NAME 284 #define KIM_LOGGER_OBJECT_NAME modelCompute 286 template<
bool isComputeProcess_dEdr,
287 bool isComputeProcess_d2Edr2,
288 bool isComputeEnergy,
289 bool isComputeForces,
290 bool isComputeParticleEnergy,
291 bool isComputeVirial,
292 bool isComputeParticleVirial,
300 double *
const energy,
302 double *
const particleEnergy,
308 if ((isComputeEnergy ==
false) && (isComputeParticleEnergy ==
false)
309 && (isComputeForces ==
false) && (isComputeProcess_dEdr ==
false)
310 && (isComputeProcess_d2Edr2 ==
false) && (isComputeVirial ==
false)
311 && (isComputeParticleVirial ==
false))
315 if (isComputeEnergy ==
true) { *energy = 0.0; }
316 if (isComputeVirial ==
true)
318 for (
int i = 0; i < 6; ++i) virial[i] = 0.0;
320 if (isComputeParticleEnergy ==
true)
322 int const cachedNumParticles = cachedNumberOfParticles_;
323 for (
int i = 0; i < cachedNumParticles; ++i) { particleEnergy[i] = 0.0; }
325 if (isComputeForces ==
true)
327 int const cachedNumParticles = cachedNumberOfParticles_;
328 for (
int i = 0; i < cachedNumParticles; ++i)
330 for (
int j = 0; j <
DIMENSION; ++j) forces[i][j] = 0.0;
333 if (isComputeParticleVirial ==
true)
335 int const cachedNumParticles = cachedNumberOfParticles_;
336 for (
int i = 0; i < cachedNumParticles; ++i)
338 for (
int j = 0; j < 6; ++j) particleVirial[i][j] = 0.0;
347 int const * n1atom = NULL;
348 double const *
const *
const constCutoffsSq2D = cutoffsSq2D_;
349 double const *
const *
const constFourEpsSig6_2D = fourEpsilonSigma6_2D_;
350 double const *
const *
const constFourEpsSig12_2D = fourEpsilonSigma12_2D_;
351 double const *
const *
const constTwentyFourEpsSig6_2D
352 = twentyFourEpsilonSigma6_2D_;
353 double const *
const *
const constFortyEightEpsSig12_2D
354 = fortyEightEpsilonSigma12_2D_;
355 double const *
const *
const constOneSixtyEightEpsSig6_2D
356 = oneSixtyEightEpsilonSigma6_2D_;
357 double const *
const *
const constSixTwentyFourEpsSig12_2D
358 = sixTwentyFourEpsilonSigma12_2D_;
359 double const *
const *
const constShifts2D = shifts2D_;
360 for (ii = 0; ii < cachedNumberOfParticles_; ++ii)
362 if (particleContributing[ii])
365 int const numNei = numnei;
366 int const *
const n1Atom = n1atom;
368 int const iSpecies = particleSpeciesCodes[i];
371 for (
int jj = 0; jj < numNei; ++jj)
373 int const j = n1Atom[jj];
374 int const jContrib = particleContributing[j];
376 if (!(jContrib && (j < i)))
378 int const jSpecies = particleSpeciesCodes[j];
384 r_ij[k] = coordinates[j][k] - coordinates[i][k];
385 double const *
const r_ij_const =
const_cast<double *
>(r_ij);
388 double const rij2 = r_ij_const[0] * r_ij_const[0]
389 + r_ij_const[1] * r_ij_const[1]
390 + r_ij_const[2] * r_ij_const[2];
392 if (rij2 <= constCutoffsSq2D[iSpecies][jSpecies])
395 double dphiByR = 0.0;
397 double dEidrByR = 0.0;
398 double d2Eidr2 = 0.0;
399 double const r2iv = 1.0 / rij2;
400 double const r6iv = r2iv * r2iv * r2iv;
402 if (isComputeProcess_d2Edr2 ==
true)
406 * (constSixTwentyFourEpsSig12_2D[iSpecies][jSpecies] * r6iv
407 - constOneSixtyEightEpsSig6_2D[iSpecies][jSpecies])
409 if (jContrib == 1) { d2Eidr2 = d2phi; }
412 d2Eidr2 = 0.5 * d2phi;
416 if ((isComputeProcess_dEdr ==
true) || (isComputeForces ==
true)
417 || (isComputeVirial ==
true)
418 || (isComputeParticleVirial ==
true))
422 * (constTwentyFourEpsSig6_2D[iSpecies][jSpecies]
423 - constFortyEightEpsSig12_2D[iSpecies][jSpecies] * r6iv)
425 if (jContrib == 1) { dEidrByR = dphiByR; }
428 dEidrByR = 0.5 * dphiByR;
432 if ((isComputeEnergy ==
true) || (isComputeParticleEnergy ==
true))
443 if (isComputeEnergy ==
true)
445 if (jContrib == 1) { *energy += phi; }
448 *energy += 0.5 * phi;
453 if (isComputeParticleEnergy ==
true)
455 double const halfPhi = 0.5 * phi;
456 particleEnergy[i] += halfPhi;
457 if (jContrib == 1) { particleEnergy[j] += halfPhi; }
461 if (isComputeForces ==
true)
465 double const contrib = dEidrByR * r_ij_const[k];
466 forces[i][k] += contrib;
467 forces[j][k] -= contrib;
472 if ((isComputeProcess_dEdr ==
true) || (isComputeVirial ==
true)
473 || (isComputeParticleVirial ==
true))
475 double const rij = sqrt(rij2);
476 double const dEidr = dEidrByR * rij;
478 if (isComputeProcess_dEdr ==
true)
481 dEidr, rij, r_ij_const, i, j);
489 if (isComputeVirial ==
true)
490 { ProcessVirialTerm(dEidr, rij, r_ij_const, i, j, virial); }
492 if (isComputeParticleVirial ==
true)
494 ProcessParticleVirialTerm(
495 dEidr, rij, r_ij_const, i, j, particleVirial);
500 if (isComputeProcess_d2Edr2 ==
true)
502 double const rij = sqrt(rij2);
503 double const R_pairs[2] = {rij, rij};
504 double const *
const pRs = &R_pairs[0];
505 double const Rij_pairs[6] = {r_ij_const[0],
511 double const *
const pRijConsts = &Rij_pairs[0];
512 int const i_pairs[2] = {i, i};
513 int const j_pairs[2] = {j, j};
514 int const *
const pis = &i_pairs[0];
515 int const *
const pjs = &j_pairs[0];
518 d2Eidr2, pRs, pRijConsts, pis, pjs);
536 #endif // LENNARD_JONES_612_IMPLEMENTATION_HPP_ int ComputeArgumentsCreate(KIM::ModelComputeArgumentsCreate *const modelComputeArgumentsCreate) const
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::R...
An Extensible Enumeration for the TemperatureUnit's supported by the KIM API.
An Extensible Enumeration for the TimeUnit's supported by the KIM API.
#define MAX_PARAMETER_FILES
ComputeArgumentName const coordinates
The standard coordinates argument.
#define LOG_ERROR(message)
Convenience macro for ERROR Log entries with compile-time optimization.
int() GetNeighborFunction(void const *const, int const, int *const, int const **const)
int ProcessDEDrTerm(double const de, double const r, double const *const dx, int const i, int const j) const
Call the Simulator's COMPUTE_CALLBACK_NAME::ProcessDEDrTerm routine.
int ProcessD2EDr2Term(double const de, double const *const r, double const *const dx, int const *const i, int const *const j) const
Call the Simulator's COMPUTE_CALLBACK_NAME::ProcessD2EDr2Term routine.
double VectorOfSizeDIM[DIMENSION]
void AllocateAndInitialize2DArray(double **&arrayPtr, int const extentZero, int const extentOne)
An Extensible Enumeration for the LengthUnit's supported by the KIM API.
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
ComputeArgumentName const particleContributing
The standard particleContributing argument.
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
LennardJones612Implementation(KIM::ModelDriverCreate *const modelDriverCreate, KIM::LengthUnit const requestedLengthUnit, KIM::EnergyUnit const requestedEnergyUnit, KIM::ChargeUnit const requestedChargeUnit, KIM::TemperatureUnit const requestedTemperatureUnit, KIM::TimeUnit const requestedTimeUnit, int *const ier)
void Deallocate2DArray(double **&arrayPtr)
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
An Extensible Enumeration for the EnergyUnit's supported by the KIM API.
int Refresh(KIM::ModelRefresh *const modelRefresh)
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
~LennardJones612Implementation()
int ComputeArgumentsDestroy(KIM::ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy) const
ComputeArgumentName const particleSpeciesCodes
The standard particleSpeciesCodes argument.
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
#define LENNARD_JONES_PHI(exshift)
An Extensible Enumeration for the ChargeUnit's supported by the KIM API.
int GetNeighborList(int const neighborListIndex, int const particleNumber, int *const numberOfNeighbors, int const **const neighborsOfParticle) const
Get the neighbor list for a particle of interest corresponding to a particular neighbor list cutoff d...
double VectorOfSizeSix[6]
int Compute(KIM::ModelCompute const *const modelCompute, KIM::ModelComputeArguments const *const modelComputeArguments)