Dear all,

I am doing multiscale finite element method (FE^2) using deal.ii. That is, 
we have a mesh at macro level, and at each quadrature point, we attach a 
representative volume element (RVE) as micro mesh. Since each RVE problem 
is independent, I want use parallel computation on RVE problem.

Let's simplify the problem as: 
First, we have a 1-D macro mesh, and at each element (interval) we have 2 
quadrature points. On each quadrature point, we generate a new Vector, 
i.e., solution_x. Then, I want to remember this Vector by writing it into 
local_quadrature_point_history().

I have written the following code, expecting that we can divide the entire 
elements into 4 sub_ranges, and write new Vector to 
local_quadrature_point_history() in parallel. But it turns out that it 
cannot save any computational time. Can anyone give me any suggestions? 
Thank you!


void Step3::Write_problem_on_cell_range (DoFHandler<1>::cell_iterator  
&range_begin,

                                                                    
 DoFHandler<1>::cell_iterator  &range_end)

{

    const unsigned int   n_q_points  = quadrature_formula_MACRO.size();

    static Threads::Mutex mutex;

    Threads::Mutex::ScopedLock lock (mutex);

    

    DoFHandler<1>::cell_iterator cell_MACRO = range_begin, endc_MACRO = 
range_end;

    for (; cell_MACRO!=endc_MACRO; ++cell_MACRO)

    {

        // build history

        PointHistory<1> *local_quadrature_points_history_MACRO

        = reinterpret_cast<PointHistory<1> *>(cell_MACRO->user_pointer());

        

        // BEGIN RVE problem

        for (unsigned int q_index = 0; q_index<n_q_points; ++q_index)

        {

            solution_x_RVE[0] = 1;    solution_x_RVE[1] = 2;

            // Write

            local_quadrature_points_history_MACRO[q_index].solution_x_RVE_h 
= solution_x_RVE;

        }

    }

}


void Step3::Write_problem ()

{

    static unsigned int n_virtual_cores = MultithreadInfo::n_threads();

    Threads::ThreadGroup<void> threads;

    
std::vector<std::pair<DoFHandler<1>::cell_iterator,DoFHandler<1>::cell_iterator>
 
>

    sub_ranges =  Threads::split_range <DoFHandler<1
>::cell_iterator>(dof_handler_MACRO.begin_active(),

                                                                      
dof_handler_MACRO.end(),

                                                                      
n_virtual_cores);

    

    for (unsigned int t=0; t<n_virtual_cores; ++t)

        threads += Threads::new_thread 
(&Step3::Write_problem_on_cell_range, *this,

                                                              
sub_ranges[t].first, sub_ranges[t].second);

    threads.join_all();

}





Best,

Chenchen

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to