/[escript]/branches/diaplayground/ripley/src/Brick.cpp
ViewVC logotype

Diff of /branches/diaplayground/ripley/src/Brick.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4712 by sshaw, Wed Feb 26 04:08:41 2014 UTC revision 4722 by sshaw, Wed Mar 5 05:29:25 2014 UTC
# Line 2193  void Brick::createPattern() Line 2193  void Brick::createPattern()
2193      RankVector neighbour;      RankVector neighbour;
2194      IndexVector offsetInShared(1,0);      IndexVector offsetInShared(1,0);
2195      IndexVector sendShared, recvShared;      IndexVector sendShared, recvShared;
2196      int numShared=0;      int numShared=0, expectedShared=0;;
2197      const int x=m_mpiInfo->rank%m_NX[0];      const int x=m_mpiInfo->rank%m_NX[0];
2198      const int y=m_mpiInfo->rank%(m_NX[0]*m_NX[1])/m_NX[0];      const int y=m_mpiInfo->rank%(m_NX[0]*m_NX[1])/m_NX[0];
2199      const int z=m_mpiInfo->rank/(m_NX[0]*m_NX[1]);      const int z=m_mpiInfo->rank/(m_NX[0]*m_NX[1]);
# Line 2207  void Brick::createPattern() Line 2207  void Brick::createPattern()
2207                  const int nx=x+i0;                  const int nx=x+i0;
2208                  const int ny=y+i1;                  const int ny=y+i1;
2209                  const int nz=z+i2;                  const int nz=z+i2;
2210                    if (!(nx>=0 && ny>=0 && nz>=0 && nx<m_NX[0] && ny<m_NX[1] && nz<m_NX[2])) {
2211                        continue;
2212                    }
2213                    if (i0==0 && i1==0)
2214                        expectedShared += nDOF0*nDOF1;
2215                    else if (i0==0 && i2==0)
2216                        expectedShared += nDOF0*nDOF2;
2217                    else if (i1==0 && i2==0)
2218                        expectedShared += nDOF1*nDOF2;
2219                    else if (i0==0)
2220                        expectedShared += nDOF0;
2221                    else if (i1==0)
2222                        expectedShared += nDOF1;
2223                    else if (i2==0)
2224                        expectedShared += nDOF2;
2225                    else
2226                        expectedShared++;
2227                }
2228            }
2229        }
2230        
2231        vector<IndexVector> rowIndices(expectedShared);
2232        
2233        for (int i2=-1; i2<2; i2++) {
2234            for (int i1=-1; i1<2; i1++) {
2235                for (int i0=-1; i0<2; i0++) {
2236                    // skip this rank
2237                    if (i0==0 && i1==0 && i2==0)
2238                        continue;
2239                    // location of neighbour rank
2240                    const int nx=x+i0;
2241                    const int ny=y+i1;
2242                    const int nz=z+i2;
2243                  if (nx>=0 && ny>=0 && nz>=0 && nx<m_NX[0] && ny<m_NX[1] && nz<m_NX[2]) {                  if (nx>=0 && ny>=0 && nz>=0 && nx<m_NX[0] && ny<m_NX[1] && nz<m_NX[2]) {
2244                      neighbour.push_back(nz*m_NX[0]*m_NX[1]+ny*m_NX[0]+nx);                      neighbour.push_back(nz*m_NX[0]*m_NX[1]+ny*m_NX[0]+nx);
2245                      if (i0==0 && i1==0) {                      if (i0==0 && i1==0) {
# Line 2222  void Brick::createPattern() Line 2255  void Brick::createPattern()
2255                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
2256                                  if (j>0) {                                  if (j>0) {
2257                                      if (i>0)                                      if (i>0)
2258                                          colIndices[firstDOF+j-1-nDOF0].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j-1-nDOF0, numShared);
2259                                      colIndices[firstDOF+j-1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j-1, numShared);
2260                                      if (i<nDOF1-1)                                      if (i<nDOF1-1)
2261                                          colIndices[firstDOF+j-1+nDOF0].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j-1+nDOF0, numShared);
2262                                  }                                  }
2263                                  if (i>0)                                  if (i>0)
2264                                      colIndices[firstDOF+j-nDOF0].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j-nDOF0, numShared);
2265                                  colIndices[firstDOF+j].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+j, numShared);
2266                                  if (i<nDOF1-1)                                  if (i<nDOF1-1)
2267                                      colIndices[firstDOF+j+nDOF0].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j+nDOF0, numShared);
2268                                  if (j<nDOF0-1) {                                  if (j<nDOF0-1) {
2269                                      if (i>0)                                      if (i>0)
2270                                          colIndices[firstDOF+j+1-nDOF0].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j+1-nDOF0, numShared);
2271                                      colIndices[firstDOF+j+1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j+1, numShared);
2272                                      if (i<nDOF1-1)                                      if (i<nDOF1-1)
2273                                          colIndices[firstDOF+j+1+nDOF0].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j+1+nDOF0, numShared);
2274                                  }                                  }
2275                                  m_dofMap[firstNode+j]=numDOF+numShared;                                  m_dofMap[firstNode+j]=numDOF+numShared;
2276                              }                              }
# Line 2256  void Brick::createPattern() Line 2289  void Brick::createPattern()
2289                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
2290                                  if (j>0) {                                  if (j>0) {
2291                                      if (i>0)                                      if (i>0)
2292                                          colIndices[firstDOF+j-1-nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j-1-nDOF0*nDOF1, numShared);
2293                                      colIndices[firstDOF+j-1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j-1, numShared);
2294                                      if (i<nDOF2-1)                                      if (i<nDOF2-1)
2295                                          colIndices[firstDOF+j-1+nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j-1+nDOF0*nDOF1, numShared);
2296                                  }                                  }
2297                                  if (i>0)                                  if (i>0)
2298                                      colIndices[firstDOF+j-nDOF0*nDOF1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j-nDOF0*nDOF1, numShared);
2299                                  colIndices[firstDOF+j].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+j, numShared);
2300                                  if (i<nDOF2-1)                                  if (i<nDOF2-1)
2301                                      colIndices[firstDOF+j+nDOF0*nDOF1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j+nDOF0*nDOF1, numShared);
2302                                  if (j<nDOF0-1) {                                  if (j<nDOF0-1) {
2303                                      if (i>0)                                      if (i>0)
2304                                          colIndices[firstDOF+j+1-nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j+1-nDOF0*nDOF1, numShared);
2305                                      colIndices[firstDOF+j+1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j+1, numShared);
2306                                      if (i<nDOF2-1)                                      if (i<nDOF2-1)
2307                                          colIndices[firstDOF+j+1+nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+j+1+nDOF0*nDOF1, numShared);
2308                                  }                                  }
2309                                  m_dofMap[firstNode+j]=numDOF+numShared;                                  m_dofMap[firstNode+j]=numDOF+numShared;
2310                              }                              }
# Line 2290  void Brick::createPattern() Line 2323  void Brick::createPattern()
2323                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
2324                                  if (j>0) {                                  if (j>0) {
2325                                      if (i>0)                                      if (i>0)
2326                                          colIndices[firstDOF+(j-1)*nDOF0-nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+(j-1)*nDOF0-nDOF0*nDOF1, numShared);
2327                                      colIndices[firstDOF+(j-1)*nDOF0].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+(j-1)*nDOF0, numShared);
2328                                      if (i<nDOF2-1)                                      if (i<nDOF2-1)
2329                                          colIndices[firstDOF+(j-1)*nDOF0+nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+(j-1)*nDOF0+nDOF0*nDOF1, numShared);
2330                                  }                                  }
2331                                  if (i>0)                                  if (i>0)
2332                                      colIndices[firstDOF+j*nDOF0-nDOF0*nDOF1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j*nDOF0-nDOF0*nDOF1, numShared);
2333                                  colIndices[firstDOF+j*nDOF0].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+j*nDOF0, numShared);
2334                                  if (i<nDOF2-1)                                  if (i<nDOF2-1)
2335                                      colIndices[firstDOF+j*nDOF0+nDOF0*nDOF1].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+j*nDOF0+nDOF0*nDOF1, numShared);
2336                                  if (j<nDOF1-1) {                                  if (j<nDOF1-1) {
2337                                      if (i>0)                                      if (i>0)
2338                                          colIndices[firstDOF+(j+1)*nDOF0-nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+(j+1)*nDOF0-nDOF0*nDOF1, numShared);
2339                                      colIndices[firstDOF+(j+1)*nDOF0].push_back(numShared);                                      doublyLink(colIndices, rowIndices, firstDOF+(j+1)*nDOF0, numShared);
2340                                      if (i<nDOF2-1)                                      if (i<nDOF2-1)
2341                                          colIndices[firstDOF+(j+1)*nDOF0+nDOF0*nDOF1].push_back(numShared);                                          doublyLink(colIndices, rowIndices, firstDOF+(j+1)*nDOF0+nDOF0*nDOF1, numShared);
2342                                  }                                  }
2343                                  m_dofMap[firstNode+j*m_NN[0]]=numDOF+numShared;                                  m_dofMap[firstNode+j*m_NN[0]]=numDOF+numShared;
2344                              }                              }
# Line 2321  void Brick::createPattern() Line 2354  void Brick::createPattern()
2354                              sendShared.push_back(firstDOF+i);                              sendShared.push_back(firstDOF+i);
2355                              recvShared.push_back(numDOF+numShared);                              recvShared.push_back(numDOF+numShared);
2356                              if (i>0)                              if (i>0)
2357                                  colIndices[firstDOF+i-1].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+i-1, numShared);
2358                              colIndices[firstDOF+i].push_back(numShared);                              doublyLink(colIndices, rowIndices, firstDOF+i, numShared);
2359                              if (i<nDOF0-1)                              if (i<nDOF0-1)
2360                                  colIndices[firstDOF+i+1].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+i+1, numShared);
2361                              m_dofMap[firstNode+i]=numDOF+numShared;                              m_dofMap[firstNode+i]=numDOF+numShared;
2362                          }                          }
2363                      } else if (i1==0) {                      } else if (i1==0) {
# Line 2339  void Brick::createPattern() Line 2372  void Brick::createPattern()
2372                              sendShared.push_back(firstDOF+i*nDOF0);                              sendShared.push_back(firstDOF+i*nDOF0);
2373                              recvShared.push_back(numDOF+numShared);                              recvShared.push_back(numDOF+numShared);
2374                              if (i>0)                              if (i>0)
2375                                  colIndices[firstDOF+(i-1)*nDOF0].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+(i-1)*nDOF0, numShared);
2376                              colIndices[firstDOF+i*nDOF0].push_back(numShared);                              doublyLink(colIndices, rowIndices, firstDOF+i*nDOF0, numShared);
2377                              if (i<nDOF1-1)                              if (i<nDOF1-1)
2378                                  colIndices[firstDOF+(i+1)*nDOF0].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+(i+1)*nDOF0, numShared);
2379                              m_dofMap[firstNode+i*m_NN[0]]=numDOF+numShared;                              m_dofMap[firstNode+i*m_NN[0]]=numDOF+numShared;
2380                          }                          }
2381                      } else if (i2==0) {                      } else if (i2==0) {
# Line 2357  void Brick::createPattern() Line 2390  void Brick::createPattern()
2390                              sendShared.push_back(firstDOF+i*nDOF0*nDOF1);                              sendShared.push_back(firstDOF+i*nDOF0*nDOF1);
2391                              recvShared.push_back(numDOF+numShared);                              recvShared.push_back(numDOF+numShared);
2392                              if (i>0)                              if (i>0)
2393                                  colIndices[firstDOF+(i-1)*nDOF0*nDOF1].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+(i-1)*nDOF0*nDOF1, numShared);
2394                              colIndices[firstDOF+i*nDOF0*nDOF1].push_back(numShared);                              doublyLink(colIndices, rowIndices, firstDOF+i*nDOF0*nDOF1, numShared);
2395                              if (i<nDOF2-1)                              if (i<nDOF2-1)
2396                                  colIndices[firstDOF+(i+1)*nDOF0*nDOF1].push_back(numShared);                                  doublyLink(colIndices, rowIndices, firstDOF+(i+1)*nDOF0*nDOF1, numShared);
2397                              m_dofMap[firstNode+i*m_NN[0]*m_NN[1]]=numDOF+numShared;                              m_dofMap[firstNode+i*m_NN[0]*m_NN[1]]=numDOF+numShared;
2398                          }                          }
2399                      } else {                      } else {
# Line 2374  void Brick::createPattern() Line 2407  void Brick::createPattern()
2407                          offsetInShared.push_back(offsetInShared.back()+1);                          offsetInShared.push_back(offsetInShared.back()+1);
2408                          sendShared.push_back(dof);                          sendShared.push_back(dof);
2409                          recvShared.push_back(numDOF+numShared);                          recvShared.push_back(numDOF+numShared);
2410                          colIndices[dof].push_back(numShared);                          doublyLink(colIndices, rowIndices, dof, numShared);
2411                          m_dofMap[node]=numDOF+numShared;                          m_dofMap[node]=numDOF+numShared;
2412                          ++numShared;                          ++numShared;
2413                      }                      }
# Line 2383  void Brick::createPattern() Line 2416  void Brick::createPattern()
2416          }          }
2417      }      }
2418    
2419    #pragma omp parallel for
2420        for (int i = 0; i < numShared; i++) {
2421            std::sort(rowIndices[i].begin(), rowIndices[i].end());
2422        }
2423    
2424      // create connector      // create connector
2425      Paso_SharedComponents *snd_shcomp = Paso_SharedComponents_alloc(      Paso_SharedComponents *snd_shcomp = Paso_SharedComponents_alloc(
2426              numDOF, neighbour.size(), &neighbour[0], &sendShared[0],              numDOF, neighbour.size(), &neighbour[0], &sendShared[0],
# Line 2397  void Brick::createPattern() Line 2435  void Brick::createPattern()
2435      // create main and couple blocks      // create main and couple blocks
2436      Paso_Pattern *mainPattern = createMainPattern();      Paso_Pattern *mainPattern = createMainPattern();
2437      Paso_Pattern *colPattern, *rowPattern;      Paso_Pattern *colPattern, *rowPattern;
2438      createCouplePatterns(colIndices, numShared, &colPattern, &rowPattern);      createCouplePatterns(colIndices, rowIndices, numShared, &colPattern, &rowPattern);
2439    
2440      // allocate paso distribution      // allocate paso distribution
2441      Paso_Distribution* distribution = Paso_Distribution_alloc(m_mpiInfo,      Paso_Distribution* distribution = Paso_Distribution_alloc(m_mpiInfo,

Legend:
Removed from v.4712  
changed lines
  Added in v.4722

  ViewVC Help
Powered by ViewVC 1.1.26