getfem-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: assembly error with mixed meshes


From: Yves Renard
Subject: Re: assembly error with mixed meshes
Date: Tue, 9 Mar 2021 17:50:12 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1


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,                            &regionMap, 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.Renard@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

---------

reply via email to

[Prev in Thread] Current Thread [Next in Thread]