31 #ifndef LENNARD_JONES_612_IMPLEMENTATION_HPP_ 32 #define LENNARD_JONES_612_IMPLEMENTATION_HPP_ 44 #define MAX_PARAMETER_FILES 1 46 #define PARAM_SHIFT_INDEX 0 47 #define PARAM_CUTOFFS_INDEX 1 48 #define PARAM_EPSILONS_INDEX 2 49 #define PARAM_SIGMAS_INDEX 3 97 modelComputeArgumentsCreate)
const;
99 modelComputeArgumentsDestroy)
const;
108 int numberModelSpecies_;
109 std::vector<int> modelSpeciesCodeList_;
110 int numberUniqueSpeciesPairs_;
140 double influenceDistance_;
141 double ** cutoffsSq2D_;
142 int modelWillNotRequestNeighborsOfNoncontributingParticles_;
143 double ** fourEpsilonSigma6_2D_;
144 double ** fourEpsilonSigma12_2D_;
145 double ** twentyFourEpsilonSigma6_2D_;
146 double ** fortyEightEpsilonSigma12_2D_;
147 double ** oneSixtyEightEpsilonSigma6_2D_;
148 double ** sixTwentyFourEpsilonSigma12_2D_;
157 int cachedNumberOfParticles_;
164 void AllocatePrivateParameterMemory();
165 void AllocateParameterMemory();
168 int const numberParameterFiles,
170 int ProcessParameterFiles(
172 int const numberParameterFiles,
173 FILE *
const parameterFilePointers[MAX_PARAMETER_FILES]);
174 void getNextDataLine(FILE *
const filePtr,
175 char *
const nextLine,
177 int * endOfFileFlag);
179 CloseParameterFiles(
int const numberParameterFiles,
180 FILE *
const parameterFilePointers[MAX_PARAMETER_FILES]);
187 int RegisterKIMModelSettings(
189 int RegisterKIMComputeArgumentsSettings(
193 int RegisterKIMFunctions(
197 template<
class ModelObj>
198 int SetRefreshMutableValues(ModelObj *
const modelObj);
202 int SetComputeMutableValues(
204 bool & isComputeProcess_dEdr,
205 bool & isComputeProcess_d2Edr2,
206 bool & isComputeEnergy,
207 bool & isComputeForces,
208 bool & isComputeParticleEnergy,
209 bool & isComputeVirial,
210 bool & isComputeParticleVirial,
215 double *& particleEnergy,
220 int const *
const particleSpeciesCodes)
const;
221 int GetComputeIndex(
const bool & isComputeProcess_dEdr,
222 const bool & isComputeProcess_d2Edr2,
223 const bool & isComputeEnergy,
224 const bool & isComputeForces,
225 const bool & isComputeParticleEnergy,
226 const bool & isComputeVirial,
227 const bool & isComputeParticleVirial,
228 const bool & isShift)
const;
229 void ProcessVirialTerm(
const double & dEidr,
231 const double *
const r_ij,
235 void ProcessParticleVirialTerm(
const double & dEidr,
237 const double *
const r_ij,
243 template<
bool isComputeProcess_dEdr,
244 bool isComputeProcess_d2Edr2,
245 bool isComputeEnergy,
246 bool isComputeForces,
247 bool isComputeParticleEnergy,
248 bool isComputeVirial,
249 bool isComputeParticleVirial,
253 const int *
const particleSpeciesCodes,
254 const int *
const particleContributing,
256 double *
const energy,
258 double *
const particleEnergy,
278 #define LENNARD_JONES_PHI(exshift) \ 280 * (constFourEpsSig12_2D[iSpecies][jSpecies] * r6iv \ 281 - constFourEpsSig6_2D[iSpecies][jSpecies]) exshift; 284 #undef KIM_LOGGER_OBJECT_NAME 285 #define KIM_LOGGER_OBJECT_NAME modelCompute 287 template<
bool isComputeProcess_dEdr,
288 bool isComputeProcess_d2Edr2,
289 bool isComputeEnergy,
290 bool isComputeForces,
291 bool isComputeParticleEnergy,
292 bool isComputeVirial,
293 bool isComputeParticleVirial,
301 double *
const energy,
303 double *
const particleEnergy,
309 if ((isComputeEnergy ==
false) && (isComputeParticleEnergy ==
false)
310 && (isComputeForces ==
false) && (isComputeProcess_dEdr ==
false)
311 && (isComputeProcess_d2Edr2 ==
false) && (isComputeVirial ==
false)
312 && (isComputeParticleVirial ==
false))
316 if (isComputeEnergy ==
true) { *energy = 0.0; }
317 if (isComputeVirial ==
true)
319 for (
int i = 0; i < 6; ++i) virial[i] = 0.0;
321 if (isComputeParticleEnergy ==
true)
323 int const cachedNumParticles = cachedNumberOfParticles_;
324 for (
int i = 0; i < cachedNumParticles; ++i) { particleEnergy[i] = 0.0; }
326 if (isComputeForces ==
true)
328 int const cachedNumParticles = cachedNumberOfParticles_;
329 for (
int i = 0; i < cachedNumParticles; ++i)
331 for (
int j = 0; j <
DIMENSION; ++j) forces[i][j] = 0.0;
334 if (isComputeParticleVirial ==
true)
336 int const cachedNumParticles = cachedNumberOfParticles_;
337 for (
int i = 0; i < cachedNumParticles; ++i)
339 for (
int j = 0; j < 6; ++j) particleVirial[i][j] = 0.0;
348 int const * n1atom = NULL;
349 double const *
const *
const constCutoffsSq2D = cutoffsSq2D_;
350 double const *
const *
const constFourEpsSig6_2D = fourEpsilonSigma6_2D_;
351 double const *
const *
const constFourEpsSig12_2D = fourEpsilonSigma12_2D_;
352 double const *
const *
const constTwentyFourEpsSig6_2D
353 = twentyFourEpsilonSigma6_2D_;
354 double const *
const *
const constFortyEightEpsSig12_2D
355 = fortyEightEpsilonSigma12_2D_;
356 double const *
const *
const constOneSixtyEightEpsSig6_2D
357 = oneSixtyEightEpsilonSigma6_2D_;
358 double const *
const *
const constSixTwentyFourEpsSig12_2D
359 = sixTwentyFourEpsilonSigma12_2D_;
360 double const *
const *
const constShifts2D = shifts2D_;
361 for (ii = 0; ii < cachedNumberOfParticles_; ++ii)
363 if (particleContributing[ii])
366 int const numNei = numnei;
367 int const *
const n1Atom = n1atom;
369 int const iSpecies = particleSpeciesCodes[i];
372 for (
int jj = 0; jj < numNei; ++jj)
374 int const j = n1Atom[jj];
375 int const jContrib = particleContributing[j];
377 if (!(jContrib && (j < i)))
379 int const jSpecies = particleSpeciesCodes[j];
385 r_ij[k] = coordinates[j][k] - coordinates[i][k];
386 double const *
const r_ij_const =
const_cast<double *
>(r_ij);
389 double const rij2 = r_ij_const[0] * r_ij_const[0]
390 + r_ij_const[1] * r_ij_const[1]
391 + r_ij_const[2] * r_ij_const[2];
393 if (rij2 <= constCutoffsSq2D[iSpecies][jSpecies])
396 double dphiByR = 0.0;
398 double dEidrByR = 0.0;
399 double d2Eidr2 = 0.0;
400 double const r2iv = 1.0 / rij2;
401 double const r6iv = r2iv * r2iv * r2iv;
403 if (isComputeProcess_d2Edr2 ==
true)
407 * (constSixTwentyFourEpsSig12_2D[iSpecies][jSpecies] * r6iv
408 - constOneSixtyEightEpsSig6_2D[iSpecies][jSpecies])
410 if (jContrib == 1) { d2Eidr2 = d2phi; }
413 d2Eidr2 = 0.5 * d2phi;
417 if ((isComputeProcess_dEdr ==
true) || (isComputeForces ==
true)
418 || (isComputeVirial ==
true)
419 || (isComputeParticleVirial ==
true))
423 * (constTwentyFourEpsSig6_2D[iSpecies][jSpecies]
424 - constFortyEightEpsSig12_2D[iSpecies][jSpecies] * r6iv)
426 if (jContrib == 1) { dEidrByR = dphiByR; }
429 dEidrByR = 0.5 * dphiByR;
433 if ((isComputeEnergy ==
true) || (isComputeParticleEnergy ==
true))
446 if (isComputeEnergy ==
true)
448 if (jContrib == 1) { *energy += phi; }
451 *energy += 0.5 * phi;
456 if (isComputeParticleEnergy ==
true)
458 double const halfPhi = 0.5 * phi;
459 particleEnergy[i] += halfPhi;
460 if (jContrib == 1) { particleEnergy[j] += halfPhi; }
464 if (isComputeForces ==
true)
468 double const contrib = dEidrByR * r_ij_const[k];
469 forces[i][k] += contrib;
470 forces[j][k] -= contrib;
475 if ((isComputeProcess_dEdr ==
true) || (isComputeVirial ==
true)
476 || (isComputeParticleVirial ==
true))
478 double const rij = sqrt(rij2);
479 double const dEidr = dEidrByR * rij;
481 if (isComputeProcess_dEdr ==
true)
484 dEidr, rij, r_ij_const, i, j);
492 if (isComputeVirial ==
true)
494 ProcessVirialTerm(dEidr, rij, r_ij_const, i, j, virial);
497 if (isComputeParticleVirial ==
true)
499 ProcessParticleVirialTerm(
500 dEidr, rij, r_ij_const, i, j, particleVirial);
505 if (isComputeProcess_d2Edr2 ==
true)
507 double const rij = sqrt(rij2);
508 double const R_pairs[2] = {rij, rij};
509 double const *
const pRs = &R_pairs[0];
510 double const Rij_pairs[6] = {r_ij_const[0],
516 double const *
const pRijConsts = &Rij_pairs[0];
517 int const i_pairs[2] = {i, i};
518 int const j_pairs[2] = {j, j};
519 int const *
const pis = &i_pairs[0];
520 int const *
const pjs = &j_pairs[0];
523 d2Eidr2, pRs, pRijConsts, pis, pjs);
541 #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)