Dear Andriy,
Good to hear from you. The region was not taken into account in the
verification of the assembly string. I commited a patch for that. It
should work now.
Best regards,
Yves
On 09/03/2021 10:24, Andriy Andreykiv wrote:
Good day!!
I have a model that is based on a mixed mesh of beams and plates. I am
trying to assemble my Timoshenko beam torsional contribution on the
beam region of the mesh.
When the mesh was uniform, with beams only, it worked fine, but when I
added the plates (even though I assemble only the beam region) I'm
starting to get dimension mismatches like this one:
Trace 1: Imported mesh with 128 beam and 96 plate elements
Def TangentProjectionGrad_Test_rotation:=(Grad_Test_rotation .
Normalized(element_K)) . Normalized(element_K)
--------------------------------------------------------------------------------------^
Dot product of expressions of different sizes (2 != 3).
Kind request to advise.
Below I created a minimal working code with two GMSH meshes (beams
only and a mixed mesh with beams and plates).
#include <catch2/catch.hpp>
#include <getfem/getfem_import.h>
#include <getfem/getfem_models.h>
std::string tensorTangentProjectionOnFrame(getfem::ga_workspace &workspace, const std::string &name)
{
auto tangentName = "TangentProjection" + name;
workspace.add_macro(tangentName, "(" + name + " . Normalized(element_K)) .
Normalized(element_K)");
return tangentName;
}
TEST_CASE("assembly with mixed meshes")
{
auto meshName = "tower_with_floors.msh"; //mixed beam/plates mesh, doesn't
work
//auto meshName = "tower_dense.msh"; //beams only, works
getfem::mesh mesh;
std::map<std::string, bgeot::size_type> regionMap;
std::set<bgeot::size_type> lowerDimConvexes;
getfem::import_mesh_gmsh(meshName, mesh, true, &lowerDimConvexes,
®ionMap, false, nullptr, false);
auto shellRegion = getfem::mesh_region::free_region_id(mesh);
auto frameRegion = shellRegion + 1;
size_t nFrames = 0;
size_t nShells = 0;
for (auto &&cv : dal::bv_iterable_c{mesh.convex_index()})
{
const auto pGeoTrans = mesh.trans_of_convex(cv);
if (pGeoTrans->dim() == 1)
{
mesh.region(frameRegion).add(cv);
++nFrames;
}
else if (pGeoTrans->dim() == 2)
{
mesh.region(shellRegion).add(cv);
++nShells;
}
}
GMM_SIMPLE_TRACE1("Imported mesh with " << nFrames << " beam and "
<< nShells << " plate elements");
getfem::mesh_fem mf(mesh);
mf.set_qdim(3);
mf.set_classical_finite_element(2);
getfem::mesh_im mim(mesh);
mim.set_integration_method(4);
getfem::model model;
model.add_fem_variable("rotation", mf);
model.add_initialized_scalar_data("G", 10e6); //shear modulus
model.add_initialized_scalar_data("It", 1); //torsional moment of inertia
//Assembling Timoshenko torsional component on a frame region
getfem::ga_workspace workspace(model);
workspace.add_macro("Torsion", tensorTangentProjectionOnFrame(workspace,
"Grad_rotation"));
workspace.add_macro("VarTorsion", tensorTangentProjectionOnFrame(workspace,
"Grad_Test_rotation"));
workspace.add_expression("G * It * VarTorsion * Torsion", mim,
frameRegion);
REQUIRE_NOTHROW(workspace.assembly(1));
}
Best regards,
Andriy
--
Yves Renard (yves.ren...@insa-lyon.fr) tel : (33) 04.72.43.87.08
INSA-Lyon
20, rue Albert Einstein
69621 Villeurbanne Cedex, FRANCE
http://math.univ-lyon1.fr/~renard
---------