Skip to content

Commit

Permalink
fix linking of XML objects
Browse files Browse the repository at this point in the history
  • Loading branch information
hverhelst committed Dec 10, 2024
1 parent f8d5d1b commit 5186906
Show file tree
Hide file tree
Showing 12 changed files with 386 additions and 363 deletions.
61 changes: 61 additions & 0 deletions src/gsMaterialMatrixContainer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

// #include <gsKLShell/src/gsMaterialMatrixUtils.h>
// #include <gsKLShell/src/gsMaterialMatrixContainer.h>
#include <gsKLShell/src/gsMaterialMatrixXml.hpp>

using namespace gismo;

Expand Down Expand Up @@ -90,4 +91,64 @@ void gsMaterialMatrixContainer<T>::clear()
m_container.clear();
}


namespace internal
{
/// @brief get a MaterialMatrixContainer from XML data
///
/// \ingroup KLShell
template<class T>
class gsXml< gsMaterialMatrixContainer<T> >
{
private:
gsXml() { }
typedef gsMaterialMatrixContainer<T> Object;

public:
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixContainer<T>);
static std::string tag () { return "MaterialMatrixContainer"; }
static std::string type () { return ""; }

GSXML_GET_POINTER(Object);

static void get_into(gsXmlNode * node,Object & obj)
{
const int size = atoi(node->first_attribute("size")->value());

// Read material inventory
int count = countByTag("MaterialMatrix", node);
std::vector<typename gsMaterialMatrixBase<T>::Ptr> mat(count);
for (gsXmlNode * child = node->first_node("MaterialMatrix"); child; child =
child->next_sibling("MaterialMatrix"))
{
const int i = atoi(child->first_attribute("index")->value());
mat[i] = memory::make_shared(gsXml<gsMaterialMatrixBase<T>>::get(child));
}

obj = gsMaterialMatrixContainer<T>(size);
for (gsXmlNode * child = node->first_node("group"); child;
child = child->next_sibling("group"))
{
const int mIndex = atoi(child->first_attribute("material")->value());
std::istringstream group_str;
group_str.str( child->value() );

for(int patch; ( gsGetInt(group_str,patch)); )
obj.set(patch,mat[mIndex]);
}

}

static gsXmlNode * put (const Object & /* obj */,
gsXmlTree & /* data */)
{
GISMO_ERROR("Writing gsMaterialMatrixContainer to Xml is not implemented");
// gsWarn<<"Writing gsMaterialMatrixContainer to Xml is not implemented\n";
// gsXmlNode * result;
// return result;
// return putMaterialMatrixToXml< Object >( obj,data );
}
};
}

} // end namespace
4 changes: 4 additions & 0 deletions src/gsMaterialMatrixContainer_.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,9 @@ namespace gismo
{
CLASS_TEMPLATE_INST gsMaterialMatrixContainer<real_t>;

namespace internal
{
CLASS_TEMPLATE_INST gsXml< gsMaterialMatrixContainer<real_t>>;
}
}

38 changes: 38 additions & 0 deletions src/gsMaterialMatrixLinear.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#pragma once

#include <gsKLShell/src/gsMaterialMatrixXml.hpp>

namespace gismo
{

Expand Down Expand Up @@ -644,7 +646,43 @@ gsMatrix<T> gsMaterialMatrixLinear<dim,T>::_E(const T /*z*/, enum MaterialOutput
namespace internal
{

/// @brief get a Linear Material Matrix from XML data
///
/// \ingroup KLShell
template<short_t d, class T>
class gsXml< gsMaterialMatrixLinear<d,T> >
{
private:
gsXml() { }
typedef gsMaterialMatrixLinear<d,T> Object;

public:
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixLinear<TMPLA2(d,T)>);
static std::string tag () { return "MaterialMatrix"; }
static std::string type () { return "Linear" + to_string(d); }

GSXML_GET_POINTER(Object);

// static Object * get(gsXmlNode * node)
// {
// Object result;
// get_into(node, result);
// return result.clone().release();
// }

static void get_into(gsXmlNode * node,Object & obj)
{
obj = getMaterialMatrixFromXml< Object >( node );
}

static gsXmlNode * put (const Object & obj,
gsXmlTree & data)
{
return putMaterialMatrixToXml< Object >( obj,data );
// GISMO_NO_IMPLEMENTATION;
// return putGeometryToXml(obj,data);
}
};

}// namespace internal

Expand Down
6 changes: 6 additions & 0 deletions src/gsMaterialMatrixLinear_.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ namespace gismo
CLASS_TEMPLATE_INST gsMaterialMatrixLinear<2,real_t>;
CLASS_TEMPLATE_INST gsMaterialMatrixLinear<3,real_t>;

namespace internal
{
CLASS_TEMPLATE_INST gsXml< gsMaterialMatrixLinear<2,real_t> >;
CLASS_TEMPLATE_INST gsXml< gsMaterialMatrixLinear<3,real_t> >;
}

#ifdef GISMO_WITH_PYBIND11

namespace py = pybind11;
Expand Down
208 changes: 173 additions & 35 deletions src/gsMaterialMatrixNonlinear.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,64 @@

#pragma once

#include <gsKLShell/src/gsMaterialMatrixNonlinear.h>
#include <gsKLShell/src/gsMaterialMatrixXml.hpp>
#include <gsCore/gsFunction.h>

template <short_t d, typename T> class Cfun;
using namespace gismo;

template <short_t d, typename T>
class Cfun : public gsFunction<T>
{
public:
Cfun(const gsMaterialMatrixBase<T> * materialMat, index_t patch, const gsVector<T> & u, const T & z)
:
m_materialMat(materialMat),
m_patchID(patch),
m_points(u),
m_z(z)
{

}

Cfun(const gsMaterialMatrixBase<T> * materialMat, index_t patch, const gsVector<T> & u)
:
m_materialMat(materialMat),
m_patchID(patch),
m_points(u)
{
m_z.resize(1,1);
m_z.setZero();
}

void eval_into(const gsMatrix<T>& C, gsMatrix<T>& result) const
{
result.resize(targetDim(),C.cols());
gsMatrix<T> Ctmp;
for (index_t k=0; k!=C.cols(); k++)
{
Ctmp = C.col(k);
Ctmp(2,0) *= 0.5;
result.col(k) = m_materialMat->eval3D_matrix_C(Ctmp,m_patchID,m_points,m_z,MaterialOutput::MatrixA);
}
}

short_t domainDim() const
{
return 3;
}

short_t targetDim() const
{
return 9;
}

private:
const gsMaterialMatrixBase<T> * m_materialMat;
mutable index_t m_patchID;
mutable gsVector<T> m_points;
mutable T m_z;
};

namespace gismo
{
Expand Down Expand Up @@ -2759,60 +2814,143 @@ gsMaterialMatrixNonlinear<dim,T,matId,comp,mat,imp>::_Cabcd_impl(const index_t a
// GISMO_ERROR("Material model not implemented.");
// }

} // end namespace
namespace internal
{

using namespace gismo;
/// @brief get a Neo-Hookean Material Matrix from XML data
///
/// \ingroup KLShell
template<short_t d, class T, bool comp>
class gsXml< gsMaterialMatrixNonlinear<d,T,11,comp> >
{
private:
gsXml() { }
typedef gsMaterialMatrixNonlinear<d,T,11,comp> Object;

public:
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixNonlinear<TMPLA4(d,T,11,comp)>);
static std::string tag () { return "MaterialMatrix"; }
static std::string type ()
{
std::string comp_str = ((comp) ? "Compressible" : "Incompressible");
return comp_str + "NH" + to_string(d);
}

GSXML_GET_POINTER(Object);

template <short_t d, typename T>
class Cfun : public gsFunction<T>
static void get_into(gsXmlNode * node,Object & obj)
{
obj = getMaterialMatrixFromXml< Object >( node );
}

static gsXmlNode * put (const Object & obj,
gsXmlTree & data)
{
return putMaterialMatrixToXml< Object >( obj,data );
}
};

/// @brief get a Extended Neo-Hookean Material Matrix from XML data
///
/// \ingroup KLShell
template<short_t d, class T, bool comp>
class gsXml< gsMaterialMatrixNonlinear<d,T,12,comp> >
{
private:
gsXml() { }
typedef gsMaterialMatrixNonlinear<d,T,12,comp> Object;

public:
Cfun(const gsMaterialMatrixBase<T> * materialMat, index_t patch, const gsVector<T> & u, const T & z)
:
m_materialMat(materialMat),
m_patchID(patch),
m_points(u),
m_z(z)
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixNonlinear<TMPLA4(d,T,12,comp)>);
static std::string tag () { return "MaterialMatrix"; }
static std::string type ()
{
std::string comp_str = ((comp) ? "Compressible" : "Incompressible");
return comp_str + "NHe" + to_string(d);
}

GSXML_GET_POINTER(Object);

static void get_into(gsXmlNode * node,Object & obj)
{
obj = getMaterialMatrixFromXml< Object >( node );
}

Cfun(const gsMaterialMatrixBase<T> * materialMat, index_t patch, const gsVector<T> & u)
:
m_materialMat(materialMat),
m_patchID(patch),
m_points(u)
static gsXmlNode * put (const Object & obj,
gsXmlTree & data)
{
m_z.resize(1,1);
m_z.setZero();
return putMaterialMatrixToXml< Object >( obj,data );
}
};

void eval_into(const gsMatrix<T>& C, gsMatrix<T>& result) const
/// @brief get a Mooney-Rivlin Material Matrix from XML data
///
/// \ingroup KLShell
template<short_t d, class T, bool comp>
class gsXml< gsMaterialMatrixNonlinear<d,T,13,comp> >
{
private:
gsXml() { }
typedef gsMaterialMatrixNonlinear<d,T,13,comp> Object;

public:
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixNonlinear<TMPLA4(d,T,13,comp)>);
static std::string tag () { return "MaterialMatrix"; }
static std::string type ()
{
result.resize(targetDim(),C.cols());
gsMatrix<T> Ctmp;
for (index_t k=0; k!=C.cols(); k++)
{
Ctmp = C.col(k);
Ctmp(2,0) *= 0.5;
result.col(k) = m_materialMat->eval3D_matrix_C(Ctmp,m_patchID,m_points,m_z,MaterialOutput::MatrixA);
}
std::string comp_str = ((comp) ? "Compressible" : "Incompressible");
return comp_str + "MR" + to_string(d);
}

short_t domainDim() const
GSXML_GET_POINTER(Object);

static void get_into(gsXmlNode * node,Object & obj)
{
return 3;
obj = getMaterialMatrixFromXml< Object >( node );
}

short_t targetDim() const
static gsXmlNode * put (const Object & obj,
gsXmlTree & data)
{
return 9;
return putMaterialMatrixToXml< Object >( obj,data );
}
};

/// @brief get an Ogden Material Matrix from XML data
///
/// \ingroup KLShell
template<short_t d, class T, bool comp>
class gsXml< gsMaterialMatrixNonlinear<d,T,34,comp> >
{
private:
const gsMaterialMatrixBase<T> * m_materialMat;
mutable index_t m_patchID;
mutable gsVector<T> m_points;
mutable T m_z;
gsXml() { }
typedef gsMaterialMatrixNonlinear<d,T,34,comp> Object;

public:
GSXML_COMMON_FUNCTIONS(gsMaterialMatrixNonlinear<TMPLA4(d,T,34,comp)>);
static std::string tag () { return "MaterialMatrix"; }
static std::string type ()
{
std::string comp_str = ((comp) ? "Compressible" : "Incompressible");
return comp_str + "OG" + to_string(d);
}

GSXML_GET_POINTER(Object);

static void get_into(gsXmlNode * node,Object & obj)
{
obj = getMaterialMatrixFromXml< Object >( node );
}

static gsXmlNode * put (const Object & obj,
gsXmlTree & data)
{
return putMaterialMatrixToXml< Object >( obj,data );
}
};

}// namespace internal



} // end namespace
Loading

0 comments on commit 5186906

Please sign in to comment.