This forum has been archived. All content is frozen. Please use KDE Discuss instead.

Got error"you cannot insert an element that already exists,"

Tags: None
(comma "," separated)
cglwdm
Registered Member
Posts
18
Karma
0
Dear experts, I got a problem. When I turn on mp, I get the error
eigen_assert((p<=startId || m_data.index(p-1)!=inner) && "you cannot insert an element that already exists, you must call coeffRef to this end");

m_innerNonZeros[outer]++;
Code: Select all
#pragma omp parallel for
      for (int id=0;id<num_Element;id++)
      {
   for(int i=0;i<local_num_A;i++)
                        {
                           for(int j=0;j<local_num_A;j++)
                           {
                              int LL[6]={0,1,1,2,2,0};
                              if(abs(Al(i,j))>eps)
                              {
                                 int ii;int jj;
                                 if(i<local_num_I)
                                    ii=id*local_num_I+i;
                                 else
                                 {
                                    int k1=(i-local_num_I)/(Th[id].num_node*S_B);
                                    int k2=(i-local_num_I)%(Th[id].num_node*S_B);
                                    ii=num_I+Th[id].Pk_Number[degree_B_k][LL[k2]];//Th[id].L_P2_Numerber[k2];
                                 }
                                 
                                 
                                 if(j<local_num_I)
                                    jj=id*local_num_I+j;
                                 else
                                 {
                                    int k1=(j-local_num_I)/(Th[id].num_node*S_B);
                                    int k2=(j-local_num_I)%(Th[id].num_node*S_B);
                                    jj=num_I+Th[id].Pk_Number[degree_B_k][LL[k2]];
                                 }
                                 
                                 A.coeffRef(ii,jj)+=Al(i,j);
                              }
                           }


                }








If I take out #pragma omp parallel for , the code can work well, why?
steveshi
Registered Member
Posts
8
Karma
0
maybe, coeffRef should be used on an existed element.
PS. with OpenMP directive, the Matrix should be independent with each other, or threads conflict may happen.
User avatar
ggael
Moderator
Posts
3447
Karma
19
OS
SparseMatrix::coeffRef is more like std::vector::push_back in the context of multi-threading. So you either have to protect the call with a omp critical section (very costly), or better make sure you allocate enough room for each column using SparseMatrix::reserve(some_vector_of_integers) and then making sure that each column is filled by only one thread.


Bookmarks



Who is online

Registered users: Bing [Bot], Evergrowing, Google [Bot], rockscient