MDStressLab++
Loading...
Searching...
No Matches
testLDADSWTriclinic.cpp

Regression test for LDAD stress under non-orthogonal periodic boundary conditions. The test uses a skew representation of the same crystal as testLDADSW, computes Piola and Cauchy LDAD stresses, and compares stress components against the orthogonal reference results while allowing the grid coordinates to differ by the periodic representation.

Full code:

1/*
2 * Regression test for LDAD stress under a non-orthogonal periodic basis.
3 */
4#include "MethodLdad.h"
5#include <string>
6#include <iostream>
7#include <tuple>
8#include <fstream>
9#include "BoxConfiguration.h"
10#include "calculateStress.h"
11#include "Grid.h"
12#include "typedef.h"
13
14namespace {
15void checkSkewedBox(const Matrix3d& box, const std::string& name)
16{
17 if (std::abs(box.col(0).dot(box.col(1))) < epsilon ||
18 std::abs(box.col(0).dot(box.col(2))) < epsilon ||
19 std::abs(box.col(1).dot(box.col(2))) < epsilon)
20 MY_ERROR(name + " is not non-orthogonal.");
21}
22
23template<typename TMethod, StressType stressType>
24void compareStressComponentsToReference(const Stress<TMethod,stressType>& stress,
25 const std::string& referenceFilename)
26{
27 std::ifstream fileReference(referenceFilename);
28 if(!fileReference) MY_ERROR("ERROR: " + referenceFilename + " could not be opened for reading!");
29
30 int ngridReference;
31 fileReference >> ngridReference;
32 if(stress.field.size() != ngridReference)
33 MY_ERROR("Test failed in " + referenceFilename + ". Number of grid points do not match.");
34
35 std::string line;
36 std::getline(fileReference,line);
37 std::getline(fileReference,line);
38
39 double maxDifference= 0.0;
40 for (int i_point=0; i_point<ngridReference; ++i_point)
41 {
42 double x,y,z;
43 double sxx,syy,szz,sxy,sxz,syz;
44 fileReference >> x >> y >> z >> sxx >> syy >> szz >> sxy >> sxz >> syz;
45
46 const Matrix3d& value= stress.field[i_point];
47 maxDifference= std::max(maxDifference,std::abs(value(0,0)-sxx));
48 maxDifference= std::max(maxDifference,std::abs(value(1,1)-syy));
49 maxDifference= std::max(maxDifference,std::abs(value(2,2)-szz));
50 maxDifference= std::max(maxDifference,std::abs(value(0,1)-sxy));
51 maxDifference= std::max(maxDifference,std::abs(value(0,2)-sxz));
52 maxDifference= std::max(maxDifference,std::abs(value(1,2)-syz));
53 }
54
55 const double tolerance= 1e-8;
56 if (maxDifference > tolerance)
57 {
58 std::cout << "Maximum stress-component difference = " << maxDifference << std::endl;
59 std::cout << "Tolerance = " << tolerance << std::endl;
60 MY_ERROR("Non-orthogonal PBC stress regression failed against " + referenceFilename);
61 }
62}
63}
64
65int main()
66{
67 int numberOfParticles;
68 int referenceAndFinal= true;
69 std::string configFileName= "config.data";
70 std::string modelname= "SW_StillingerWeber_1985_Si__MO_405512056662_005";
71
72 std::ifstream file(configFileName);
73 if(!file) MY_ERROR("ERROR: config.data could not be opened for reading!");
74
75 file >> numberOfParticles;
76 if (numberOfParticles < 0) MY_ERROR("Error: Negative number of particles.\n");
77
78 BoxConfiguration body{numberOfParticles,referenceAndFinal};
79 body.read(configFileName,referenceAndFinal);
80 checkSkewedBox(body.reference_box,"Reference box");
81 checkSkewedBox(body.box,"Current box");
82
83 Kim kim(modelname);
84
85 int ngrid = 125;
86 Grid<Reference> gridFromFile_ref(ngrid);
87 gridFromFile_ref.read("grid_pk1.data");
88
89 Grid<Current> gridFromFile_def(ngrid);
90 gridFromFile_def.read("grid_cauchy.data");
91
92 Matrix3d ldadVectors_ref;
93 ldadVectors_ref << 5.43094977840521, 0.0, 0.0,
94 0.0, 5.43094977840521, 0.0,
95 0.0, 0.0, 5.43094977840521;
96
97 MethodLdadConstant ldad_constant_ref(ldadVectors_ref);
98 MethodLdadTrigonometric ldad_trigonometric_ref(ldadVectors_ref);
99
100 Stress<MethodLdadConstant,Piola> ldad_constant_stress_ref("ldad_constant_ref",ldad_constant_ref,&gridFromFile_ref);
101 Stress<MethodLdadTrigonometric,Piola> ldad_trigonometric_stress_ref("ldad_trigonometric_ref",ldad_trigonometric_ref,&gridFromFile_ref);
102
103 calculateStress(body,kim,std::tie(ldad_constant_stress_ref));
104 ldad_constant_stress_ref.write();
105 calculateStress(body,kim,std::tie(ldad_trigonometric_stress_ref));
106 ldad_trigonometric_stress_ref.write();
107
108 Matrix3d ldadVectors_def;
109 ldadVectors_def << 5.43094977840521, 0.0, 0.0,
110 0.0, 5.4852592761892621, 0.0,
111 0.0, 0.0, 5.43094977840521;
112
113 MethodLdadConstant ldad_constant_def(ldadVectors_def);
114 MethodLdadTrigonometric ldad_trigonometric_def(ldadVectors_def);
115
116 Stress<MethodLdadConstant,Cauchy> ldad_constant_stress_def("ldad_constant_def",ldad_constant_def,&gridFromFile_def);
117 Stress<MethodLdadTrigonometric,Cauchy> ldad_trigonometric_stress_def("ldad_trigonometric_def",ldad_trigonometric_def,&gridFromFile_def);
118
119 calculateStress(body,kim,std::tie(ldad_constant_stress_def));
120 ldad_constant_stress_def.write();
121 calculateStress(body,kim,std::tie(ldad_trigonometric_stress_def));
122 ldad_trigonometric_stress_def.write();
123
124 compareStressComponentsToReference(ldad_constant_stress_ref,"ldad_constant_refReference.stress");
125 compareStressComponentsToReference(ldad_constant_stress_def,"ldad_constant_defReference.stress");
126 compareStressComponentsToReference(ldad_trigonometric_stress_ref,"ldad_trigonometric_refReference.stress");
127 compareStressComponentsToReference(ldad_trigonometric_stress_def,"ldad_trigonometric_defReference.stress");
128 return 0;
129}
int calculateStress(const BoxConfiguration &body, Kim &kim, std::tuple<> stress, const bool &projectForces=false)
Represents a particle configuration including simulation box information.
void read(std::string configFileName, int referenceAndFinal)
A function to read the properties of atoms from a file in a MDStressLab format.
Definition Grid.h:38
Definition kim.h:21
Lattice-dependent averaging-domain method.
Definition MethodLdad.h:39
Three-dimensional stress field on a grid.
Definition Stress.h:42
std::vector< Matrix3d > field
A three-dimensional stress field.
Definition Stress.h:47
int main()
#define MY_ERROR(message)
Definition typedef.h:17
Eigen::Matrix< double, DIM, DIM, Eigen::RowMajor > Matrix3d
Definition typedef.h:56
const double epsilon
Definition typedef.h:73