diff --git a/python/Element.hpp b/python/Element.hpp index c22c2e6..aa09dfc 100644 --- a/python/Element.hpp +++ b/python/Element.hpp @@ -1,29 +1,27 @@ /* ================================================================================================= (c - GPLv3) T.W.J. de Geus (Tom) | tom@geus.me | www.geus.me | github.com/tdegeus/GooseFEM ================================================================================================= */ #include <GooseFEM/GooseFEM.h> #include <pybind11/pybind11.h> #include <pyxtensor/pyxtensor.hpp> namespace py = pybind11; void init_Element(py::module& m) { - m.def( - "asElementVector", + m.def("asElementVector", &GooseFEM::Element::asElementVector, "Convert nodal vector [nnode, ndim] to nodal vector stored per element [nelem, nne, ndim]", py::arg("conn"), py::arg("nodevec")); - m.def( - "assembleElementVector", + m.def("assembleElementVector", &GooseFEM::Element::assembleNodeVector, "Assemble nodal vector stored per element [nelem, nne, ndim] to nodal vector [nnode, ndim]", py::arg("conn"), py::arg("elemvec")); } diff --git a/python/ElementHex8.hpp b/python/ElementHex8.hpp index ef85435..a0d6f5f 100644 --- a/python/ElementHex8.hpp +++ b/python/ElementHex8.hpp @@ -1,148 +1,135 @@ /* ================================================================================================= (c - GPLv3) T.W.J. de Geus (Tom) | tom@geus.me | www.geus.me | github.com/tdegeus/GooseFEM ================================================================================================= */ #include <GooseFEM/GooseFEM.h> #include <pybind11/pybind11.h> #include <pyxtensor/pyxtensor.hpp> namespace py = pybind11; void init_ElementHex8(py::module& m) { py::class_<GooseFEM::Element::Hex8::Quadrature>(m, "Quadrature") .def(py::init<const xt::xtensor<double, 3>&>(), "Quadrature", py::arg("x")) - .def( - py::init< + .def(py::init< const xt::xtensor<double, 3>&, const xt::xtensor<double, 2>&, const xt::xtensor<double, 1>&>(), "Quadrature", py::arg("x"), py::arg("xi"), py::arg("w")) - .def( - "update_x", + .def("update_x", &GooseFEM::Element::Hex8::Quadrature::update_x, "Update the nodal positions") - .def("nelem", &GooseFEM::Element::Hex8::Quadrature::nelem, "Number of elements") - - .def("nne", &GooseFEM::Element::Hex8::Quadrature::nne, "Number of nodes per element") - - .def("ndim", &GooseFEM::Element::Hex8::Quadrature::ndim, "Number of dimensions") - - .def("nip", &GooseFEM::Element::Hex8::Quadrature::nip, "Number of integration points") - .def("dV", &GooseFEM::Element::Hex8::Quadrature::dV, "Integration point volume (qscalar)") - .def( - "GradN_vector", + .def("GradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Hex8::Quadrature::GradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "GradN_vector_T", + .def("GradN_vector_T", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Hex8::Quadrature::GradN_vector_T, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "SymGradN_vector", + .def("SymGradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Hex8::Quadrature::SymGradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "Int_N_scalar_NT_dV", + .def("Int_N_scalar_NT_dV", py::overload_cast<const xt::xtensor<double, 2>&>( &GooseFEM::Element::Hex8::Quadrature::Int_N_scalar_NT_dV, py::const_), "Integration, returns 'elemmat'", py::arg("qscalar")) - .def( - "Int_gradN_dot_tensor2_dV", + .def("Int_gradN_dot_tensor2_dV", py::overload_cast<const xt::xtensor<double, 4>&>( &GooseFEM::Element::Hex8::Quadrature::Int_gradN_dot_tensor2_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "Int_gradN_dot_tensor4_dot_gradNT_dV", + .def("Int_gradN_dot_tensor4_dot_gradNT_dV", py::overload_cast<const xt::xtensor<double, 6>&>( &GooseFEM::Element::Hex8::Quadrature::Int_gradN_dot_tensor4_dot_gradNT_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "AsTensor", + // Derived from QuadratureBase + + .def("nelem", &GooseFEM::Element::Hex8::Quadrature::nelem, "Number of elements") + + .def("nne", &GooseFEM::Element::Hex8::Quadrature::nne, "Number of nodes per element") + + .def("ndim", &GooseFEM::Element::Hex8::Quadrature::ndim, "Number of dimensions") + + .def("nip", &GooseFEM::Element::Hex8::Quadrature::nip, "Number of integration points") + + .def("AsTensor", (xt::xarray<double>(GooseFEM::Element::Hex8::Quadrature::*)( size_t, const xt::xtensor<double, 2>&) const) &GooseFEM::Element::Hex8::Quadrature::AsTensor<double>, "Convert 'qscalar' to 'qtensor' of certain rank") - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Hex8::Quadrature::*)( - size_t) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Hex8::Quadrature::*)(size_t) const) &GooseFEM::Element::Hex8::Quadrature::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank")) - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Hex8::Quadrature::*)( - size_t, double) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Hex8::Quadrature::*)(size_t, double) const) &GooseFEM::Element::Hex8::Quadrature::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank"), py::arg("val")) - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<>( &GooseFEM::Element::Hex8::Quadrature::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'") - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<double>( &GooseFEM::Element::Hex8::Quadrature::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'", py::arg("val")) .def("__repr__", [](const GooseFEM::Element::Hex8::Quadrature&) { return "<GooseFEM.Element.Hex8.Quadrature>"; }); } void init_ElementHex8Gauss(py::module& m) { m.def("nip", &GooseFEM::Element::Hex8::Gauss::nip, "Return number of integration point"); m.def("xi", &GooseFEM::Element::Hex8::Gauss::xi, "Return integration point coordinates"); m.def("w", &GooseFEM::Element::Hex8::Gauss::w, "Return integration point weights"); } void init_ElementHex8Nodal(py::module& m) { m.def("nip", &GooseFEM::Element::Hex8::Nodal::nip, "Return number of integration point"); m.def("xi", &GooseFEM::Element::Hex8::Nodal::xi, "Return integration point coordinates"); m.def("w", &GooseFEM::Element::Hex8::Nodal::w, "Return integration point weights"); } diff --git a/python/ElementQuad4.hpp b/python/ElementQuad4.hpp index 44190a4..76f39c5 100644 --- a/python/ElementQuad4.hpp +++ b/python/ElementQuad4.hpp @@ -1,166 +1,150 @@ /* ================================================================================================= (c - GPLv3) T.W.J. de Geus (Tom) | tom@geus.me | www.geus.me | github.com/tdegeus/GooseFEM ================================================================================================= */ #include <GooseFEM/GooseFEM.h> #include <pybind11/pybind11.h> #include <pyxtensor/pyxtensor.hpp> namespace py = pybind11; void init_ElementQuad4(py::module& m) { py::class_<GooseFEM::Element::Quad4::Quadrature>(m, "Quadrature") .def(py::init<const xt::xtensor<double, 3>&>(), "Quadrature", py::arg("x")) - .def( - py::init< + .def(py::init< const xt::xtensor<double, 3>&, const xt::xtensor<double, 2>&, const xt::xtensor<double, 1>&>(), "Quadrature", py::arg("x"), py::arg("xi"), py::arg("w")) - .def( - "update_x", + .def("update_x", &GooseFEM::Element::Quad4::Quadrature::update_x, "Update the nodal positions") .def("dV", &GooseFEM::Element::Quad4::Quadrature::dV, "Integration point volume (qscalar)") - .def( - "Interp_N_vector", + .def("Interp_N_vector", &GooseFEM::Element::Quad4::Quadrature::Interp_N_vector<double>, "See :cpp:class:`GooseFEM::Quad4::Quadrature::Interp_N_vector`.", py::arg("elemvec")) - .def( - "GradN_vector", + .def("GradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::Quadrature::GradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "GradN_vector_T", + .def("GradN_vector_T", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::Quadrature::GradN_vector_T, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "SymGradN_vector", + .def("SymGradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::Quadrature::SymGradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "Int_N_scalar_NT_dV", + .def("Int_N_scalar_NT_dV", py::overload_cast<const xt::xtensor<double, 2>&>( &GooseFEM::Element::Quad4::Quadrature::Int_N_scalar_NT_dV, py::const_), "Integration, returns 'elemmat'", py::arg("qscalar")) - .def( - "Int_gradN_dot_tensor2_dV", + .def("Int_gradN_dot_tensor2_dV", py::overload_cast<const xt::xtensor<double, 4>&>( &GooseFEM::Element::Quad4::Quadrature::Int_gradN_dot_tensor2_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "Int_gradN_dot_tensor4_dot_gradNT_dV", + .def("Int_gradN_dot_tensor4_dot_gradNT_dV", py::overload_cast<const xt::xtensor<double, 6>&>( &GooseFEM::Element::Quad4::Quadrature::Int_gradN_dot_tensor4_dot_gradNT_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) // Derived from QuadratureBase .def("nelem", &GooseFEM::Element::Quad4::Quadrature::nelem, "Number of elements") .def("nne", &GooseFEM::Element::Quad4::Quadrature::nne, "Number of nodes per element") .def("ndim", &GooseFEM::Element::Quad4::Quadrature::ndim, "Number of dimensions") .def("nip", &GooseFEM::Element::Quad4::Quadrature::nip, "Number of integration points") - .def( - "AsTensor", + .def("AsTensor", (xt::xarray<double>(GooseFEM::Element::Quad4::Quadrature::*)( size_t, const xt::xtensor<double, 2>&) const) &GooseFEM::Element::Quad4::Quadrature::AsTensor<double>, "Convert 'qscalar' to 'qtensor' of certain rank") - .def( - "ShapeQtensor", + .def("ShapeQtensor", (std::vector<size_t>(GooseFEM::Element::Quad4::Quadrature::*)(size_t) const) &GooseFEM::Element::Quad4::Quadrature::ShapeQtensor, "Shape of 'qtensor'", py::arg("rank")) - .def( - "ShapeQscalar", + .def("ShapeQscalar", &GooseFEM::Element::Quad4::Quadrature::ShapeQscalar, "Shape of 'qscalar'") - .def( - "AllocateQtensor", + .def("AllocateQtensor", (xt::xarray<double>(GooseFEM::Element::Quad4::Quadrature::*)(size_t) const) &GooseFEM::Element::Quad4::Quadrature::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank")) - .def( - "AllocateQtensor", + .def("AllocateQtensor", (xt::xarray<double>(GooseFEM::Element::Quad4::Quadrature::*)(size_t, double) const) &GooseFEM::Element::Quad4::Quadrature::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank"), py::arg("val")) - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<>( &GooseFEM::Element::Quad4::Quadrature::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'") - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<double>( &GooseFEM::Element::Quad4::Quadrature::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'", py::arg("val")) .def("__repr__", [](const GooseFEM::Element::Quad4::Quadrature&) { return "<GooseFEM.Element.Quad4.Quadrature>"; }); } void init_ElementQuad4Gauss(py::module& m) { m.def("nip", &GooseFEM::Element::Quad4::Gauss::nip, "Return number of integration point"); m.def("xi", &GooseFEM::Element::Quad4::Gauss::xi, "Return integration point coordinates"); m.def("w", &GooseFEM::Element::Quad4::Gauss::w, "Return integration point weights"); } void init_ElementQuad4Nodal(py::module& m) { m.def("nip", &GooseFEM::Element::Quad4::Nodal::nip, "Return number of integration point"); m.def("xi", &GooseFEM::Element::Quad4::Nodal::xi, "Return integration point coordinates"); m.def("w", &GooseFEM::Element::Quad4::Nodal::w, "Return integration point weights"); } diff --git a/python/ElementQuad4Axisymmetric.hpp b/python/ElementQuad4Axisymmetric.hpp index 61776cf..bed138c 100644 --- a/python/ElementQuad4Axisymmetric.hpp +++ b/python/ElementQuad4Axisymmetric.hpp @@ -1,141 +1,118 @@ /* ================================================================================================= (c - GPLv3) T.W.J. de Geus (Tom) | tom@geus.me | www.geus.me | github.com/tdegeus/GooseFEM ================================================================================================= */ #include <GooseFEM/GooseFEM.h> #include <pybind11/pybind11.h> #include <pyxtensor/pyxtensor.hpp> namespace py = pybind11; void init_ElementQuad4Axisymmetric(py::module& m) { py::class_<GooseFEM::Element::Quad4::QuadratureAxisymmetric>(m, "QuadratureAxisymmetric") .def(py::init<const xt::xtensor<double, 3>&>(), "QuadratureAxisymmetric", py::arg("x")) - .def( - py::init< + .def(py::init< const xt::xtensor<double, 3>&, const xt::xtensor<double, 2>&, const xt::xtensor<double, 1>&>(), "QuadratureAxisymmetric", py::arg("x"), py::arg("xi"), py::arg("w")) - .def( - "update_x", + .def("update_x", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::update_x, "Update the nodal positions") - .def( - "nelem", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nelem, "Number of elements") - - .def( - "nne", - &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nne, - "Number of nodes per element") - - .def( - "ndim", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::ndim, "Number of dimensions") - - .def( - "nip", - &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nip, - "Number of integration points") - - .def( - "dV", + .def("dV", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::dV, "Integration point volume (qscalar)") - .def( - "GradN_vector", + .def("GradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::GradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "GradN_vector_T", + .def("GradN_vector_T", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::GradN_vector_T, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "SymGradN_vector", + .def("SymGradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::SymGradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "Int_N_scalar_NT_dV", + .def("Int_N_scalar_NT_dV", py::overload_cast<const xt::xtensor<double, 2>&>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::Int_N_scalar_NT_dV, py::const_), "Integration, returns 'elemmat'", py::arg("qscalar")) - .def( - "Int_gradN_dot_tensor2_dV", + .def("Int_gradN_dot_tensor2_dV", py::overload_cast<const xt::xtensor<double, 4>&>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::Int_gradN_dot_tensor2_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "Int_gradN_dot_tensor4_dot_gradNT_dV", + .def("Int_gradN_dot_tensor4_dot_gradNT_dV", py::overload_cast<const xt::xtensor<double, 6>&>( - &GooseFEM::Element::Quad4::QuadratureAxisymmetric:: - Int_gradN_dot_tensor4_dot_gradNT_dV, + &GooseFEM::Element::Quad4::QuadratureAxisymmetric::Int_gradN_dot_tensor4_dot_gradNT_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "AsTensor", + // Derived from QuadratureBase + + .def("nelem", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nelem, "Number of elements") + + .def("nne", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nne, "Number of nodes per element") + + .def("ndim", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::ndim, "Number of dimensions") + + .def("nip", &GooseFEM::Element::Quad4::QuadratureAxisymmetric::nip, "Number of integration points") + + .def("AsTensor", (xt::xarray<double>(GooseFEM::Element::Quad4::QuadratureAxisymmetric::*)( size_t, const xt::xtensor<double, 2>&) const) &GooseFEM::Element::Quad4::QuadratureAxisymmetric::AsTensor<double>, "Convert 'qscalar' to 'qtensor' of certain rank") - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Quad4::QuadratureAxisymmetric::*)( - size_t) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Quad4::QuadratureAxisymmetric::*)(size_t) const) &GooseFEM::Element::Quad4::QuadratureAxisymmetric::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank")) - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Quad4::QuadratureAxisymmetric::*)( - size_t, double) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Quad4::QuadratureAxisymmetric::*)(size_t, double) const) &GooseFEM::Element::Quad4::QuadratureAxisymmetric::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank"), py::arg("val")) - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'") - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<double>( &GooseFEM::Element::Quad4::QuadratureAxisymmetric::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'", py::arg("val")) .def("__repr__", [](const GooseFEM::Element::Quad4::QuadratureAxisymmetric&) { return "<GooseFEM.Element.Quad4.QuadratureAxisymmetric>"; }); } diff --git a/python/ElementQuad4Planar.hpp b/python/ElementQuad4Planar.hpp index 268cb1e..3f79802 100644 --- a/python/ElementQuad4Planar.hpp +++ b/python/ElementQuad4Planar.hpp @@ -1,132 +1,117 @@ /* ================================================================================================= (c - GPLv3) T.W.J. de Geus (Tom) | tom@geus.me | www.geus.me | github.com/tdegeus/GooseFEM ================================================================================================= */ #include <GooseFEM/GooseFEM.h> #include <pybind11/pybind11.h> #include <pyxtensor/pyxtensor.hpp> namespace py = pybind11; void init_ElementQuad4Planar(py::module& m) { py::class_<GooseFEM::Element::Quad4::QuadraturePlanar>(m, "QuadraturePlanar") .def(py::init<const xt::xtensor<double, 3>&>(), "QuadraturePlanar", py::arg("x")) - .def( - py::init< + .def(py::init< const xt::xtensor<double, 3>&, const xt::xtensor<double, 2>&, const xt::xtensor<double, 1>&>(), "QuadraturePlanar", py::arg("x"), py::arg("xi"), py::arg("w")) - .def( - "update_x", + .def("update_x", &GooseFEM::Element::Quad4::QuadraturePlanar::update_x, "Update the nodal positions") - .def("nelem", &GooseFEM::Element::Quad4::QuadraturePlanar::nelem, "Number of elements") - - .def("nne", &GooseFEM::Element::Quad4::QuadraturePlanar::nne, "Number of nodes per element") - - .def("ndim", &GooseFEM::Element::Quad4::QuadraturePlanar::ndim, "Number of dimensions") - - .def( - "nip", &GooseFEM::Element::Quad4::QuadraturePlanar::nip, "Number of integration points") - - .def( - "dV", + .def("dV", &GooseFEM::Element::Quad4::QuadraturePlanar::dV, "Integration point volume (qscalar)") - .def( - "GradN_vector", + .def("GradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::GradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "GradN_vector_T", + .def("GradN_vector_T", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::GradN_vector_T, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "SymGradN_vector", + .def("SymGradN_vector", py::overload_cast<const xt::xtensor<double, 3>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::SymGradN_vector, py::const_), "Dyadic product, returns 'qtensor'", py::arg("elemvec")) - .def( - "Int_N_scalar_NT_dV", + .def("Int_N_scalar_NT_dV", py::overload_cast<const xt::xtensor<double, 2>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::Int_N_scalar_NT_dV, py::const_), "Integration, returns 'elemmat'", py::arg("qscalar")) - .def( - "Int_gradN_dot_tensor2_dV", + .def("Int_gradN_dot_tensor2_dV", py::overload_cast<const xt::xtensor<double, 4>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::Int_gradN_dot_tensor2_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "Int_gradN_dot_tensor4_dot_gradNT_dV", + .def("Int_gradN_dot_tensor4_dot_gradNT_dV", py::overload_cast<const xt::xtensor<double, 6>&>( &GooseFEM::Element::Quad4::QuadraturePlanar::Int_gradN_dot_tensor4_dot_gradNT_dV, py::const_), "Integration, returns 'elemvec'", py::arg("qtensor")) - .def( - "AsTensor", + // Derived from QuadratureBase + + .def("nelem", &GooseFEM::Element::Quad4::QuadraturePlanar::nelem, "Number of elements") + + .def("nne", &GooseFEM::Element::Quad4::QuadraturePlanar::nne, "Number of nodes per element") + + .def("ndim", &GooseFEM::Element::Quad4::QuadraturePlanar::ndim, "Number of dimensions") + + .def("nip", &GooseFEM::Element::Quad4::QuadraturePlanar::nip, "Number of integration points") + + .def("AsTensor", (xt::xarray<double>(GooseFEM::Element::Quad4::QuadraturePlanar::*)( size_t, const xt::xtensor<double, 2>&) const) &GooseFEM::Element::Quad4::QuadraturePlanar::AsTensor<double>, "Convert 'qscalar' to 'qtensor' of certain rank") - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Quad4::QuadraturePlanar::*)( - size_t) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Quad4::QuadraturePlanar::*)(size_t) const) &GooseFEM::Element::Quad4::QuadraturePlanar::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank")) - .def( - "AllocateQtensor", - (xt::xarray<double>(GooseFEM::Element::Quad4::QuadraturePlanar::*)( - size_t, double) const) + .def("AllocateQtensor", + (xt::xarray<double>(GooseFEM::Element::Quad4::QuadraturePlanar::*)(size_t, double) const) &GooseFEM::Element::Quad4::QuadraturePlanar::AllocateQtensor<double>, "Allocate 'qtensor'", py::arg("rank"), py::arg("val")) - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<>( &GooseFEM::Element::Quad4::QuadraturePlanar::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'") - .def( - "AllocateQscalar", + .def("AllocateQscalar", py::overload_cast<double>( &GooseFEM::Element::Quad4::QuadraturePlanar::AllocateQscalar<double>, py::const_), "Allocate 'qscalar'", py::arg("val")) .def("__repr__", [](const GooseFEM::Element::Quad4::QuadraturePlanar&) { return "<GooseFEM.Element.Quad4.QuadraturePlanar>"; }); }