MeshFunction assert(entity.dim() == _dim) failed

Asked by Phil Marinier on 2009-11-25

I am trying to apply an neumann BC on one edge of my 2d rectangular domain. To do so, I made two MeshFunctions:

                        dolfin::Mesh mesh(*anode);
   dim = mesh.topology().dim() - 1;
   dolfin::MeshFunction<unsigned int> ASD(mesh, dim);
   right->mark(ASD, 3);
   dolfin::MeshFunction<unsigned int> empty(mesh, dim);

right is an instance of my own Edge class, which inherits from dolfin::SubDomain. I use these MeshFunctions later like so:

                        //solve for Phi
   dolfin::VariationalProblem problem(a, L, bcs, &empty, &empty, &ASD);
   problem.solve(Phi);

I do it this way because I couldn't get it to compile any other way. There is a demo that uses "0" as in the integer value instead of my "empty" MeshFunction, but when I tried that, I couldn't get it to compile. I put the mesh function that I care about in the last position, because as I understand it, that is the position for external facets. Which in this case, would be my external edges. I can compile this code and it runs up until i try to call "solve." I then get that assertion error. I was looking in the code, and it seems like _dim is the dimension that is passed to the mesh function, and entity.dim() is the dimension of the MeshEntity the MeshFunction is trying to mark. So what I think is happening, is that the MeshFunction somehow thinks I have a 3d domain.

The full error message is as follows:

Solving linear variational problem
  Matrix of size 1251 x 1251 has 8551 nonzero entries.
forward: ./dolfin/mesh/MeshFunction.h:108: const T& dolfin::MeshFunction<T>::operator()(const dolfin::MeshEntity&) const [with T = unsigned int]: Assertion `entity.dim() == _dim' failed.
[wolf:24774] *** Process received signal ***
[wolf:24774] Signal: Aborted (6)
[wolf:24774] Signal code: (-6)
[wolf:24774] [ 0] [0xb7f5f410]
[wolf:24774] [ 1] /lib/tls/i686/cmov/libc.so.6(abort+0x188) [0xb634f098]
[wolf:24774] [ 2] /lib/tls/i686/cmov/libc.so.6(__assert_fail+0xee) [0xb63465ce]
[wolf:24774] [ 3] /usr/local/lib/libdolfin.so.0(_ZN6dolfin9Assembler14assemble_cellsERNS_13GenericTensorERKNS_4FormERNS_3UFCEPKNS_12MeshFunctionIjEEPSt6vectorIdSaIdEE+0x53e) [0xb7d6e2fe]
[wolf:24774] [ 4] /usr/local/lib/libdolfin.so.0(_ZN6dolfin9Assembler8assembleERNS_13GenericTensorERKNS_4FormEPKNS_12MeshFunctionIjEES9_S9_b+0xe2) [0xb7d6f402]
[wolf:24774] [ 5] /usr/local/lib/libdolfin.so.0(_ZN6dolfin8assembleERNS_13GenericTensorERKNS_4FormEPKNS_12MeshFunctionIjEES8_S8_b+0x41) [0xb7d5a691]
[wolf:24774] [ 6] /usr/local/lib/libdolfin.so.0(_ZN6dolfin18VariationalProblem12solve_linearERNS_8FunctionE+0x852) [0xb7d94c32]
[wolf:24774] [ 7] /usr/local/lib/libdolfin.so.0(_ZN6dolfin18VariationalProblem5solveERNS_8FunctionE+0x2a) [0xb7d955da]
[wolf:24774] [ 8] ./forward(_ZN7ASolver5solveEPdS0_S0_S0_S0_S0_ddP4Edge+0x466) [0x809c336]
[wolf:24774] [ 9] ./forward(_ZN9Fiterator5solveEPdS0_S0_+0x7e1) [0x8086d31]
[wolf:24774] [10] ./forward(main+0x7ec) [0x807294c]
[wolf:24774] [11] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb6338775]
[wolf:24774] [12] ./forward [0x8072051]
[wolf:24774] *** End of error message ***
Aborted

My main is called forward, since this is the forward solution to my problem, and hopefully I will also be doing the inverse later. I saw this thread: http://<email address hidden>/msg04158.html and that's why I use a copy constructor to make a new mesh that I for everything I define. This way I can be absolutely sure that the program knows I'm using the same mesh.

Any help would be appreciated,

Thank you very much,

Phil

Question information

Language:
English Edit question
Status:
Solved
For:
DOLFIN Edit question
Assignee:
No assignee Edit question
Solved by:
Anders Logg
Solved:
2009-11-25
Last query:
2009-11-25
Last reply:
2009-11-25
Best Anders Logg (logg) said : #1

You should use the second argument (exterior_facet_domains) for
specifying Neumann boundaries.

Try

 VariationalProblem problem(a, L, bcs, 0, &ASD, 0);

and see if that helps.

--
Anders

On Wed, Nov 25, 2009 at 04:04:59PM -0000, Phil Marinier wrote:
> New question #91692 on DOLFIN:
> https://answers.launchpad.net/dolfin/+question/91692
>
> I am trying to apply an neumann BC on one edge of my 2d rectangular domain. To do so, I made two MeshFunctions:
>
> dolfin::Mesh mesh(*anode);
> dim = mesh.topology().dim() - 1;
> dolfin::MeshFunction<unsigned int> ASD(mesh, dim);
> right->mark(ASD, 3);
> dolfin::MeshFunction<unsigned int> empty(mesh, dim);
>
> right is an instance of my own Edge class, which inherits from dolfin::SubDomain. I use these MeshFunctions later like so:
>
> //solve for Phi
> dolfin::VariationalProblem problem(a, L, bcs, &empty, &empty, &ASD);
> problem.solve(Phi);
>
> I do it this way because I couldn't get it to compile any other way. There is a demo that uses "0" as in the integer value instead of my "empty" MeshFunction, but when I tried that, I couldn't get it to compile. I put the mesh function that I care about in the last position, because as I understand it, that is the position for external facets. Which in this case, would be my external edges. I can compile this code and it runs up until i try to call "solve." I then get that assertion error. I was looking in the code, and it seems like _dim is the dimension that is passed to the mesh function, and entity.dim() is the dimension of the MeshEntity the MeshFunction is trying to mark. So what I think is happening, is that the MeshFunction somehow thinks I have a 3d domain.
>
> The full error message is as follows:
>
> Solving linear variational problem
> Matrix of size 1251 x 1251 has 8551 nonzero entries.
> forward: ./dolfin/mesh/MeshFunction.h:108: const T& dolfin::MeshFunction<T>::operator()(const dolfin::MeshEntity&) const [with T = unsigned int]: Assertion `entity.dim() == _dim' failed.
> [wolf:24774] *** Process received signal ***
> [wolf:24774] Signal: Aborted (6)
> [wolf:24774] Signal code: (-6)
> [wolf:24774] [ 0] [0xb7f5f410]
> [wolf:24774] [ 1] /lib/tls/i686/cmov/libc.so.6(abort+0x188) [0xb634f098]
> [wolf:24774] [ 2] /lib/tls/i686/cmov/libc.so.6(__assert_fail+0xee) [0xb63465ce]
> [wolf:24774] [ 3] /usr/local/lib/libdolfin.so.0(_ZN6dolfin9Assembler14assemble_cellsERNS_13GenericTensorERKNS_4FormERNS_3UFCEPKNS_12MeshFunctionIjEEPSt6vectorIdSaIdEE+0x53e) [0xb7d6e2fe]
> [wolf:24774] [ 4] /usr/local/lib/libdolfin.so.0(_ZN6dolfin9Assembler8assembleERNS_13GenericTensorERKNS_4FormEPKNS_12MeshFunctionIjEES9_S9_b+0xe2) [0xb7d6f402]
> [wolf:24774] [ 5] /usr/local/lib/libdolfin.so.0(_ZN6dolfin8assembleERNS_13GenericTensorERKNS_4FormEPKNS_12MeshFunctionIjEES8_S8_b+0x41) [0xb7d5a691]
> [wolf:24774] [ 6] /usr/local/lib/libdolfin.so.0(_ZN6dolfin18VariationalProblem12solve_linearERNS_8FunctionE+0x852) [0xb7d94c32]
> [wolf:24774] [ 7] /usr/local/lib/libdolfin.so.0(_ZN6dolfin18VariationalProblem5solveERNS_8FunctionE+0x2a) [0xb7d955da]
> [wolf:24774] [ 8] ./forward(_ZN7ASolver5solveEPdS0_S0_S0_S0_S0_ddP4Edge+0x466) [0x809c336]
> [wolf:24774] [ 9] ./forward(_ZN9Fiterator5solveEPdS0_S0_+0x7e1) [0x8086d31]
> [wolf:24774] [10] ./forward(main+0x7ec) [0x807294c]
> [wolf:24774] [11] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb6338775]
> [wolf:24774] [12] ./forward [0x8072051]
> [wolf:24774] *** End of error message ***
> Aborted
>
> My main is called forward, since this is the forward solution to my problem, and hopefully I will also be doing the inverse later. I saw this thread: http://<email address hidden>/msg04158.html and that's why I use a copy constructor to make a new mesh that I for everything I define. This way I can be absolutely sure that the program knows I'm using the same mesh.
>
> Any help would be appreciated,
>
> Thank you very much,
>
> Phil
>

Phil Marinier (lonewolf-13p) said : #2

Thank you very much