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", &Lattice::interPlanarSpacing)
32 .def("latticeVector", [](const Lattice &lattice, const VectorDimD &p) {
33 return PyLatticeVector(lattice.latticeVector(p));
34 })
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);
40
41 std::vector<PyLatticeVector> pyLatticeVectors;
42 for(const auto& v : latticeVectors)
43 pyLatticeVectors.push_back(PyLatticeVector(v));
44 return pyLatticeVectors;
45 }, py::arg("boxVectors"),py::arg("filename")="");
46 if constexpr(dim==3) {
47 cls.def("generateCoincidentLattices",
48 [](const Lattice &lattice, const PyReciprocalLatticeDirection& rd, const double& maxDen, const int& N) {
49 return lattice.generateCoincidentLattices(rd.rld, maxDen, N);
50 }, py::arg("rd"), py::arg("maxDen") = 100, py::arg("N") = 100);
51 }
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);
61 }
62 cls.def("latticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
63 return PyLatticeDirection(self.latticeDirection(d,tol));
64 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
65 cls.def("reciprocalLatticeDirection",[](const Lattice& self, const VectorDimD& d, const double& tol){
66 return PyReciprocalLatticeDirection(self.reciprocalLatticeDirection(d,tol));
67 }, py::arg("cartesianCoordinate"), py::arg("tol")=FLT_EPSILON);
68 cls.def("planeParallelLatticeBasis",[](const Lattice& self, const PyReciprocalLatticeDirection& l, const bool& useRLLL){
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);
75 }
76}
77#endif //OILAB_LATTICE_BINDINGS_H
Lattice class.
Definition Lattice.h:34
LatticeVector class.
void bind_Lattice(py::module_ &m)