22 using MatrixDimD = Eigen::Matrix<double, dim, dim>;
23 using VectorDimD = Eigen::Matrix<double, dim, 1>;
25 py::class_<Lattice> cls(m, (
"Lattice" + std::to_string(dim) +
"D").c_str());
26 cls.def(py::init<const MatrixDimD&, const MatrixDimD&>(),
27 py::arg(
"A"), py::arg(
"Q")=MatrixDimD::Identity())
28 .def_readonly(
"latticeBasis", &Lattice::latticeBasis)
29 .def_readonly(
"reciprocalBasis", &Lattice::reciprocalBasis)
30 .def_readonly(
"F", &Lattice::F)
31 .def(
"interPlanarSpacing", &Lattice::interPlanarSpacing)
32 .def(
"latticeVector", [](
const Lattice &lattice,
const VectorDimD &p) {
35 .def(
"box",[](
const Lattice& lattice,
const std::vector<PyLatticeVector>& boxPyLatticeVectors,
const std::string& filename){
36 std::vector<LatticeVector> boxLatticeVectors;
37 for(
const auto& v : boxPyLatticeVectors)
38 boxLatticeVectors.push_back(v.lv);
39 auto latticeVectors= lattice.box(boxLatticeVectors,filename);
41 std::vector<PyLatticeVector> pyLatticeVectors;
42 for(
const auto& v : latticeVectors)
44 return pyLatticeVectors;
45 }, py::arg(
"boxVectors"),py::arg(
"filename")=
"");
46 if constexpr(dim==3) {
47 cls.def(
"generateCoincidentLattices",
49 return lattice.generateCoincidentLattices(rd.
rld, maxDen, N);
50 }, py::arg(
"rd"), py::arg(
"maxDen") = 100, py::arg(
"N") = 100);
52 if constexpr(dim==2) {
53 cls.def(
"generateCoincidentLattices",
54 [](
const Lattice& lattice,
const double& maxStrain,
const double& maxDen,
const int& N) {
55 return lattice.generateCoincidentLattices(maxStrain, maxDen, N);
56 }, py::arg(
"maxStrain"),py::arg(
"maxDen") = 50, py::arg(
"N") = 30);
57 cls.def(
"generateCoincidentLattices",
58 [](
const Lattice& lattice,
const Lattice& underformedLattice,
const double& maxStrain,
const double& maxDen,
const int& N) {
59 return lattice.generateCoincidentLattices(underformedLattice, maxStrain, maxDen, N);
60 }, py::arg(
"undeformedLattice"), py::arg(
"maxStrain"),py::arg(
"maxDen") = 50, py::arg(
"N") = 30);
62 cls.def(
"latticeDirection",[](
const Lattice& self,
const VectorDimD& d,
const double& tol){
64 }, py::arg(
"cartesianCoordinate"), py::arg(
"tol")=FLT_EPSILON);
65 cls.def(
"reciprocalLatticeDirection",[](
const Lattice& self,
const VectorDimD& d,
const double& tol){
67 }, py::arg(
"cartesianCoordinate"), py::arg(
"tol")=FLT_EPSILON);
69 auto latticeBasis2D= self.planeParallelLatticeBasis(l.
rld, useRLLL);
70 std::vector<PyLatticeDirection> pyLatticeBasis2D;
71 for(
const auto elem : latticeBasis2D)
72 pyLatticeBasis2D.push_back(elem);
73 return pyLatticeBasis2D;
74 }, py::arg(
"reciprocalLatticeDirection"), py::arg(
"useRLLL")=
false);