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 <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 = gbLAB::Lattice<dim>;
20 using LatticeVector = gbLAB::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, ("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", [](const Lattice& lattice, const PyReciprocalLatticeDirection& pyrlv) {
32 return lattice.interPlanarSpacing(pyrlv.rld);
33 })
34 .def("latticeVector", [](const Lattice &lattice, const VectorDimD &p) {
35 return PyLatticeVector(lattice.latticeVector(p));
36 })
37 .def("box",[](const Lattice& lattice, const std::vector<PyLatticeVector>& boxPyLatticeVectors, const std::string& filename){
38 std::vector<LatticeVector> boxLatticeVectors;
39 for(const auto& v : boxPyLatticeVectors)
40 boxLatticeVectors.push_back(v.lv);
41 auto latticeVectors= lattice.box(boxLatticeVectors,filename);
42
43 std::vector<PyLatticeVector> pyLatticeVectors;
44 for(const auto& v : latticeVectors)
45 pyLatticeVectors.push_back(PyLatticeVector(v));
46 return pyLatticeVectors;
47 }, py::arg("boxVectors"),py::arg("filename")="");
48 if constexpr(dim==3) {
49 cls.def("generateCoincidentLattices",
50 [](const Lattice &lattice, const PyReciprocalLatticeDirection& rd, const double& maxDen, const int& N) {
51 return lattice.generateCoincidentLattices(rd.rld, maxDen, N);
52 }, py::arg("rd"), py::arg("maxDen") = 100, py::arg("N") = 100);
53 }
54 if constexpr(dim==2) {
55 cls.def("generateCoincidentLattices",
56 [](const Lattice& lattice, const double& maxStrain, const double& maxDen, const int& N) {
57 return lattice.generateCoincidentLattices(maxStrain, maxDen, N);
58 }, py::arg("maxStrain"),py::arg("maxDen") = 50, py::arg("N") = 30);
59 cls.def("generateCoincidentLattices",
60 [](const Lattice& lattice, const Lattice& underformedLattice, const double& maxStrain, const double& maxDen, const int& N) {
61 return lattice.generateCoincidentLattices(underformedLattice, maxStrain, maxDen, N);
62 }, py::arg("undeformedLattice"), py::arg("maxStrain"),py::arg("maxDen") = 50, py::arg("N") = 30);
63 }
64 cls.def("latticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
65 return PyLatticeDirection(self.latticeDirection(d,tol));
66 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
67 cls.def("reciprocalLatticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
68 return PyReciprocalLatticeDirection(self.reciprocalLatticeDirection(d,tol));
69 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
70 cls.def("planeParallelLatticeBasis",[](const Lattice& self, const PyReciprocalLatticeDirection& l, const bool& useRLLL){
71 auto latticeBasis2D= self.planeParallelLatticeBasis(l.rld, useRLLL);
72 std::vector<PyLatticeDirection> pyLatticeBasis2D;
73 for(const auto elem : latticeBasis2D)
74 pyLatticeBasis2D.push_back(elem);
75 return pyLatticeBasis2D;
76 }, py::arg("reciprocalLatticeDirection"), py::arg("useRLLL")=false);
77 }
78}
79#endif //OILAB_LATTICE_BINDINGS_H
Lattice class.
Definition Lattice.h:34
LatticeVector class.
void bind_Lattice(py::module_ &m)