oILAB
Loading...
Searching...
No Matches
LatticeBindings.h
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 7/3/25.
3//
4
5#ifndef OILAB_LATTICE_BINDINGS_H
6#define OILAB_LATTICE_BINDINGS_H
7
8#include <pybind11/pybind11.h>
9#include "../Lattices/LatticeModule.h"
10#include <pybind11/stl.h>
11namespace py = pybind11;
12
13namespace pyoilab {
14 template<int dim>
15 void bind_Lattice(py::module_ &m) {
16 using Lattice = oILAB::Lattice<dim>;
20 using LatticeVector = oILAB::LatticeVector<dim>;
21
22 using MatrixDimD = Eigen::Matrix<double, dim, dim>;
23 using VectorDimD = Eigen::Matrix<double, dim, 1>;
24
25 py::class_<Lattice> cls(m,
26 ("Lattice" + std::to_string(dim) + "D").c_str());
27 cls.def(py::init<const MatrixDimD &, const MatrixDimD &>(), py::arg("A"),
28 py::arg("Q") = MatrixDimD::Identity())
29 .def_readonly("latticeBasis", &Lattice::latticeBasis)
30 .def_readonly("reciprocalBasis", &Lattice::reciprocalBasis)
31 .def_readonly("F", &Lattice::F)
32 .def("interPlanarSpacing",
33 [](const Lattice &lattice,
34 const PyReciprocalLatticeDirection &pyrlv) {
35 return lattice.interPlanarSpacing(pyrlv.rld);
36 })
37 .def("latticeVector",
38 [](const Lattice &lattice, const VectorDimD &p) {
39 return PyLatticeVector(lattice.latticeVector(p));
40 })
41 .def(
42 "box",
43 [](const Lattice &lattice,
44 const std::vector<PyLatticeVector> &boxPyLatticeVectors,
45 const std::string &filename) {
46 std::vector<LatticeVector> boxLatticeVectors;
47 for(const auto& v : boxPyLatticeVectors)
48 boxLatticeVectors.push_back(v.lv);
49 auto latticeVectors= lattice.box(boxLatticeVectors,filename);
50
51 std::vector<PyLatticeVector> pyLatticeVectors;
52 for(const auto& v : latticeVectors)
53 pyLatticeVectors.push_back(PyLatticeVector(v));
54 return pyLatticeVectors;
55 },
56 py::arg("boxVectors"), py::arg("filename") = "");
57 if constexpr (dim == 3) {
58 cls.def(
59 "generateCoincidentLattices",
60 [](const Lattice &lattice, const PyReciprocalLatticeDirection &rd,
61 const double &maxDen, const int &N) {
62 return lattice.generateCoincidentLattices(rd.rld, maxDen, N);
63 },
64 py::arg("rd"), py::arg("maxDen") = 100, py::arg("N") = 100);
65 }
66 if constexpr(dim==2) {
67 cls.def("generateCoincidentLattices",
68 [](const Lattice& lattice, const double& maxStrain, const double& maxDen, const int& N) {
69 return lattice.generateCoincidentLattices(maxStrain, maxDen, N);
70 }, py::arg("maxStrain"),py::arg("maxDen") = 50, py::arg("N") = 30);
71 cls.def("generateCoincidentLattices",
72 [](const Lattice& lattice, const Lattice& underformedLattice, const double& maxStrain, const double& maxDen, const int& N) {
73 return lattice.generateCoincidentLattices(underformedLattice, maxStrain, maxDen, N);
74 }, py::arg("undeformedLattice"), py::arg("maxStrain"),py::arg("maxDen") = 50, py::arg("N") = 30);
75 }
76 cls.def("latticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
77 return PyLatticeDirection(self.latticeDirection(d,tol));
78 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
79 cls.def("reciprocalLatticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
80 return PyReciprocalLatticeDirection(self.reciprocalLatticeDirection(d,tol));
81 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
82 cls.def("planeParallelLatticeBasis",[](const Lattice& self, const PyReciprocalLatticeDirection& l, const bool& useRLLL){
83 auto latticeBasis2D= self.planeParallelLatticeBasis(l.rld, useRLLL);
84 std::vector<PyLatticeDirection> pyLatticeBasis2D;
85 for(const auto elem : latticeBasis2D)
86 pyLatticeBasis2D.push_back(elem);
87 return pyLatticeBasis2D;
88 }, py::arg("reciprocalLatticeDirection"), py::arg("useRLLL")=false);
89 }
90}
91#endif //OILAB_LATTICE_BINDINGS_H
Lattice class.
Definition Lattice.h:31
LatticeVector class.
void bind_Lattice(py::module_ &m)