[Dune] Problem in implementing parallel linear solver

Kumar, Paras paras.kumar at fau.de
Thu Dec 7 17:33:04 CET 2017


Hi,

On 2017-12-07 17:00, Markus Blatt wrote:
> On Thu, Dec 07, 2017 at 02:49:13PM +0100, Kumar, Paras wrote:
>> >>
>> >>Here, are a few observations which might give some clues about the error
>> >>I
>> >>make, but I'm not sure.
>> >>1. As can be seen in the output file, A is tridiagonal where as the
>> >>distributed are not always symmetric.
>> >
>> >Please check where the unsymmetry happens. This should only happen
>> >rows whose index is not marked as owner.
>> >
>> >using OwnerSet = DuneCommunication::OwnerSet;
>> >using GlobalLookup = DuneCommunication::GlobalLookupIndexSet;
>> >GlobalLookup global(DuneComm.indexSet());
>> >auto pair = global.pair(index);
>> >if(!pair || OwnerSet::contains(pair.local().attribute())
>> >  cerr<<"Houston we have a problem at index "<<index<<" which is
>> >  owned.
>> >
>> Could you please explain how do we get the variable index. It seems to 
>> be
>> the local index (probably wrt *comm_redist in my example code). Also, 
>> do I
>> need to do this check for all dofs in an iterative manner.
>> 
> 
> Well if you have an iterator r over matrix rows, then you should use
> r.index() as index. You can also use the index of a column interator.
> 
> Only check the indices of rows, cols that exhibit unsymmetries.
> 
> Markus

When tried with the complete A matrix, I got the message for every row. 
When tried with the parallel_A matrices, I got a segmentation fault.
**************************************************************************
using OwnerSet = DuneCommunication::OwnerSet;
using GlobalLookup = DuneCommunication::GlobalLookupIndexSet;
GlobalLookup global(DuneComm.indexSet());
for(auto r = app->A.begin(); r !=app->A.end(); ++r){
//for(auto r = parallel_A.begin(); r !=parallel_A.end(); ++r){
	auto pair = global.pair(r.index());
		if(!pair || OwnerSet::contains(pair->local().attribute()))
   			std::cerr<<"Houston we have a problem at index "<<r.index()<<" 
which is owned. from rank "<<app->world_rank <<std::endl;
}
**************************************************************************
here app->A is the full A matrix which is only available at the master 
process while parallel_A is the redistributed part of the matrix on each 
of the processes.

Another query, should we have DuneComm.indexSet() or 
comm_redist->indexSet() [please refer the attached code file for 
details].

> 
> _______________________________________________
> Dune mailing list
> Dune at lists.dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune

With best regards,
Paras Kumar




More information about the Dune mailing list