It looks like the 'auto' build and caching of the bounding box tree is not
thread-safe (we can add this to the reasons why I think the user should be
tasked with managing the bounding box tree initialisation).

Try calling Mesh::bounding_box_tree() before any calls to Function::eval.

Garth


On 25 August 2015 at 12:10, Alvaro Diez Gonzalez-Pardo <
alvaro.diez.gonzalez-pa...@cern.ch> wrote:

> Hello,
>
> I write to you to report a problem I've been having when trying to use
> dolfin functions in parallel exectution. Note that this does not refer to
> computation using dolfin libraries but rather using the results in parallel.
>
> you'll find the error report below this lines and as an attachment as well.
>
> thanks in advance for the help.
>
> Alvaro Diez
>
> =======================================ERROR
> REPORT:=====================================================================
>
>
> I'm trying to parallelize a program that uses dolfin libraries to solve
> Poisson and Laplace equations. I am using C++11 built-in multithreading
> class "thread.h".
> My class Carrier contains:
>
>                                 class Carrier
>                 {
>                         private:
>                                 [...]
>                                         SMSDetector * _detector;
>                                 [...]
>                 }
>
> where SMSDetector is:
>
>                 class SMSDetector
>                 {
>                         private:
>                                 [...]
>                                         Function _w_f_grad; // function to
> store the weighting field
>                                 (vectorial)
>                                         [...]
>                         public:
>                                         Function * get_w_f_grad();
>
>                 }
>
> When the number of threads used for the simulation is bigger than one
> (i.e. parallel execution) the program crashes with segmentation fault. The
> program needs to evaluate, for each Carrier I create a method like:
>
>                 _detector->get_w_f_grad()->eval(wrap_w_field, wrap_x);
>
>                 where the arguments for eval were defined as:
>
>                 Array<double> wrap_x(2, _x.data());
>                 Array<double> wrap_w_field(2, _w_field.data());
>
>
> The error persists even when mutexes are implemented to avoid race
> conditions produced when several Carriers try to access the eval().
> The error message I get (only the first time I run it after rebooting the
> machine) is:
>
>                 terminate called after throwing an instance of
> 'std::runtime_error' what():
>
>                 ***
>
> -------------------------------------------------------------------------
>                 *** DOLFIN encountered an error. If you are not able to
> resolve this issue
>                 *** using the information listed below, you can ask for
> help at
>                 ***
>                 ***     fenics@fenicsproject.org
>                 ***
>                 *** Remember to include the error message listed below
> and, if possible,
>                 *** include a *minimal* running example to reproduce the
> error.
>                 ***
>                 ***
>
> -------------------------------------------------------------------------
>                 *** Error:   Unable to compute collisions with bounding
> box tree.
>                 *** Reason:  Bounding box tree has not been built. You
> need to call tree.build().
>                 *** Where:   This error was encountered inside
> BoundingBoxTree.cpp.
>                 *** Process: unknown
>                 ***
>                 *** DOLFIN version: 1.5.0
>                 *** Git changeset:  unknown
>                 ***
>
> -------------------------------------------------------------------------
>
>                 [pcssd30:03650] *** Process received signal ***
>                 [pcssd30:03650] Signal: Aborted (6)
>                 [pcssd30:03650] Signal code:  (-6)
>                 [pcssd30:03650] [ 0] [0xb7735410]
>                 [pcssd30:03650] [ 1] [0xb7735428]
>                 [pcssd30:03650] [ 2]
> /lib/i386-linux-gnu/libc.so.6(gsignal+0x47) [0xb57bf607]
>                 [pcssd30:03650] [ 3]
> /lib/i386-linux-gnu/libc.so.6(abort+0x143) [0xb57c2a33]
>                 [pcssd30:03650] [ 4]
> /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x155)
> [0xb59cfd45]
>                 [pcssd30:03650] [ 5]
> /usr/lib/i386-linux-gnu/libstdc++.so.6(+0x70a33) [0xb59cda33]
>                 [pcssd30:03650] [ 6]
> /usr/lib/i386-linux-gnu/libstdc++.so.6(+0x70aad) [0xb59cdaad]
>                 [pcssd30:03650] [ 7]
> /usr/lib/i386-linux-gnu/libstdc++.so.6(+0x9cc6d) [0xb59f9c6d]
>                 [pcssd30:03650] [ 8]
> /lib/i386-linux-gnu/libpthread.so.0(+0x6f70) [0xb5570f70]
>                 [pcssd30:03650] [ 9]
> /lib/i386-linux-gnu/libc.so.6(clone+0x5e) [0xb587cbee]
>                 [pcssd30:03650] *** End of error message ***
>
>                 Aborted (core dumped)
>
>         When using a debugger (gdb), the error message reads:
>
>         "Program received signal SIGSEGV, Segmentation fault. 0xb7d90bd4
> in dolfin::MeshTopology::dim() const () from
> /usr/lib/i386-linux-gnu/libdolfin.so.1.5"
>
>         For more details on how the code works, the full program
> source-code is available on Github-> https://github.com/AlGepe/TRACS/ an
> the problematic part seems to be from line 87 of Carrier.cpp to the end of
> that method, most likely in lines 120 - 125 of that file.
> _______________________________________________
> fenics mailing list
> fenics@fenicsproject.org
> http://fenicsproject.org/mailman/listinfo/fenics
>
>
_______________________________________________
fenics mailing list
fenics@fenicsproject.org
http://fenicsproject.org/mailman/listinfo/fenics

Reply via email to