This is a read only copy of the old FEniCS QA forum. Please visit the new QA forum to ask questions

Error: Assigning properties to subdomains in C++

0 votes

I am looking at a simple inbuilt fenics mesh or Gmsh, and trying to implement 'expression' class with different values using if-else statement to define properties in different regions of the mesh. I tested this approach successfully with a simple C++ program where I just plotted the changing parameter (property) with the mesh. It worked in serial and parallel. Then I tried a Poisson problem. It again worked in serial and parallel.

Now, the problem is that I am trying to use Fenics Solid Mechanics app (link). In this library, you have the option to call 2 physical models in your code. A vonMises model or a DruckerPrager model. Currently, I use vonMises model, and when I try to compile the Makefile to create a demo, I get an error.

You can observe, the error is related to the vonMises class. So, in the FSM library, there are 2 files - VonMises.cpp and VonMises.h. If you look at these files, in the first line you' ll see that the vonMises class intakes the parameter 'E' (one of the parameters I divided) as a 'double'.

class VonMises : public PlasticityModel { public: VonMises(double E, double nu, double yield_stress, double hardening_parameter);

However, now I am not defining 'E' as a 'double' anymore in my code. Earlier, I used to define it in my code as a double:

double E = 1500.0;

and now I am defining it as,

class Young : public Expression
{
  void eval(Array<double>& values, const Array<double>& x) const
  {
    if (x[1] >= 0.5 ) 
    {
      values[0] = 27000.0;
    }
    else 
    { 
      values[0] = 15000.0;
    }
  }
};
Young E_v;
auto V = std::make_shared<e::FunctionSpace>(mesh);
auto E = std::make_shared<Function>(V);
E->interpolate(E_v);

The vonMises.h file also calls PlasticityModel.h in the beginning. Even that file identifies 'E' as a double and then uses it to compute const double 'mu' and const double 'lambda' for the elastic tangent. Can anyone please recommend what can be done about this? Should I remove double from the library and install the library again or change something in the code itself, so that it will be accepted by the FSM library?

Please help.

The error is:

In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h:33:0,
                 from /usr/include/c++/5/bits/allocator.h:46,
                 from /usr/include/c++/5/string:41,
                 from /usr/include/dolfin/common/defines.h:27,
                 from /usr/include/dolfin/common/dolfin_common.h:7,
                 from /usr/include/dolfin.h:10,
                 from /home/chaitanya/FSM_trial/fenics-solid-mechanics/demo/Wave_Pulse_2D_VM/main.cpp:1:
/usr/include/c++/5/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = const fenicssolid::VonMises; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; _Tp = fenicssolid::VonMises]’:
/usr/include/c++/5/bits/alloc_traits.h:530:4:   required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = const fenicssolid::VonMises; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; _Tp = fenicssolid::VonMises; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<fenicssolid::VonMises>]’
/usr/include/c++/5/bits/shared_ptr_base.h:522:39:   required from ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc, _Args&& ...) [with _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; _Tp = const fenicssolid::VonMises; _Alloc = std::allocator<fenicssolid::VonMises>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr_base.h:617:4:   required from ‘std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& ...) [with _Tp = const fenicssolid::VonMises; _Alloc = std::allocator<fenicssolid::VonMises>; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr_base.h:1097:35:   required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<fenicssolid::VonMises>; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; _Tp = const fenicssolid::VonMises; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
/usr/include/c++/5/bits/shared_ptr.h:319:64:   required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<fenicssolid::VonMises>; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}; _Tp = const fenicssolid::VonMises]’
/usr/include/c++/5/bits/shared_ptr.h:620:39:   required from ‘std::shared_ptr<_Tp1> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = const fenicssolid::VonMises; _Alloc = std::allocator<fenicssolid::VonMises>; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}]’
/usr/include/c++/5/bits/shared_ptr.h:635:39:   required from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = const fenicssolid::VonMises; _Args = {std::shared_ptr<dolfin::Function>&, double&, const double&, const double&}]’
/home/chaitanya/FSM_trial/fenics-solid-mechanics/demo/Wave_Pulse_2D_VM/main.cpp:171:78:   required from here
/usr/include/c++/5/ext/new_allocator.h:120:4: error: no matching function for call to ‘fenicssolid::VonMises::VonMises(std::shared_ptr<dolfin::Function>&, double&, const double&, const double&)’
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^
In file included from /home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/FenicsSolidMechanics.h:15:0,
                 from /home/chaitanya/FSM_trial/fenics-solid-mechanics/demo/Wave_Pulse_2D_VM/main.cpp:2:
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:21:5: note: candidate: fenicssolid::VonMises::VonMises(double, double, double, double)
     VonMises(double E, double nu, double yield_stress,
     ^
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:21:5: note:   no known conversion for argument 1 from ‘std::shared_ptr<dolfin::Function>’ to ‘double’
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:16:9: note: candidate: fenicssolid::VonMises::VonMises(const fenicssolid::VonMises&)
   class VonMises : public PlasticityModel
         ^
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:16:9: note:   candidate expects 1 argument, 4 provided
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:16:9: note: candidate: fenicssolid::VonMises::VonMises(fenicssolid::VonMises&&)
/home/chaitanya/FSM_trial/fenics-solid-mechanics/local/include/fenics-solid-mechanics/VonMises.h:16:9: note:   candidate expects 1 argument, 4 provided
asked Oct 5, 2016 by Chaitanya_Raj_Goyal FEniCS User (4,150 points)
edited Oct 5, 2016 by Chaitanya_Raj_Goyal
...