/[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 3754 by caltinay, Wed Jan 4 07:07:37 2012 UTC revision 3755 by caltinay, Thu Jan 5 06:51:31 2012 UTC
# Line 1229  Paso_SystemMatrixPattern* Brick::getPatt Line 1229  Paso_SystemMatrixPattern* Brick::getPatt
1229                          // sharing front or back plane                          // sharing front or back plane
1230                          offsetInShared.push_back(offsetInShared.back()+nDOF0*nDOF1);                          offsetInShared.push_back(offsetInShared.back()+nDOF0*nDOF1);
1231                          for (dim_t i=0; i<nDOF1; i++) {                          for (dim_t i=0; i<nDOF1; i++) {
1232                              const int firstDOF=(i2==-1 ? i*nDOF0 : nDOF0*nDOF1*(nDOF2-1)+i*nDOF0);                              const int firstDOF=(i2==-1 ? i*nDOF0
1233                              const int firstNode=(i2==-1 ? left+i*m_N0 : left+m_N0*m_N1*(m_N2-1)+i*m_N0);                                      : i*nDOF0 + nDOF0*nDOF1*(nDOF2-1));
1234                                const int firstNode=(i2==-1 ? left+(i+bottom)*m_N0
1235                                        : left+(i+bottom)*m_N0+m_N0*m_N1*(m_N2-1));
1236                              for (dim_t j=0; j<nDOF0; j++, numShared++) {                              for (dim_t j=0; j<nDOF0; j++, numShared++) {
1237                                  sendShared.push_back(firstDOF+j);                                  sendShared.push_back(firstDOF+j);
1238                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
# Line 1260  Paso_SystemMatrixPattern* Brick::getPatt Line 1262  Paso_SystemMatrixPattern* Brick::getPatt
1262                          // sharing top or bottom plane                          // sharing top or bottom plane
1263                          offsetInShared.push_back(offsetInShared.back()+nDOF0*nDOF2);                          offsetInShared.push_back(offsetInShared.back()+nDOF0*nDOF2);
1264                          for (dim_t i=0; i<nDOF2; i++) {                          for (dim_t i=0; i<nDOF2; i++) {
1265                              const int firstDOF=(i1==-1 ? i*nDOF0*nDOF1 : nDOF0*((i+1)*nDOF1-1));                              const int firstDOF=(i1==-1 ? i*nDOF0*nDOF1
1266                              const int firstNode=(i1==-1 ? left+i*m_N0*m_N1 : left+m_N0*((i+1)*m_N1-1));                                      : nDOF0*((i+1)*nDOF1-1));
1267                                const int firstNode=(i1==-1 ?
1268                                        left+(i+front)*m_N0*m_N1
1269                                        : left+m_N0*((i+1+front)*m_N1-1));
1270                              for (dim_t j=0; j<nDOF0; j++, numShared++) {                              for (dim_t j=0; j<nDOF0; j++, numShared++) {
1271                                  sendShared.push_back(firstDOF+j);                                  sendShared.push_back(firstDOF+j);
1272                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
# Line 1291  Paso_SystemMatrixPattern* Brick::getPatt Line 1296  Paso_SystemMatrixPattern* Brick::getPatt
1296                          // sharing left or right plane                          // sharing left or right plane
1297                          offsetInShared.push_back(offsetInShared.back()+nDOF1*nDOF2);                          offsetInShared.push_back(offsetInShared.back()+nDOF1*nDOF2);
1298                          for (dim_t i=0; i<nDOF2; i++) {                          for (dim_t i=0; i<nDOF2; i++) {
1299                              const int firstDOF=(i0==-1 ? i*nDOF0*nDOF1 : nDOF0*(1+i*nDOF1)-1);                              const int firstDOF=(i0==-1 ? i*nDOF0*nDOF1
1300                              const int firstNode=(i0==-1 ? (bottom+i*m_N1)*m_N0 : (bottom+1+i*m_N1)*m_N0-1);                                      : nDOF0*(1+i*nDOF1)-1);
1301                                const int firstNode=(i0==-1 ?
1302                                        (bottom+(i+front)*m_N1)*m_N0
1303                                        : (bottom+1+(i+front)*m_N1)*m_N0-1);
1304                              for (dim_t j=0; j<nDOF1; j++, numShared++) {                              for (dim_t j=0; j<nDOF1; j++, numShared++) {
1305                                  sendShared.push_back(firstDOF+j*nDOF0);                                  sendShared.push_back(firstDOF+j*nDOF0);
1306                                  recvShared.push_back(numDOF+numShared);                                  recvShared.push_back(numDOF+numShared);
# Line 1319  Paso_SystemMatrixPattern* Brick::getPatt Line 1327  Paso_SystemMatrixPattern* Brick::getPatt
1327                              }                              }
1328                          }                          }
1329                      } else if (i0==0) {                      } else if (i0==0) {
1330                          // sharing an edge                          // sharing an edge in x direction
1331                          offsetInShared.push_back(offsetInShared.back()+nDOF0);                          offsetInShared.push_back(offsetInShared.back()+nDOF0);
1332                          const int firstDOF=(i1+1)/2*nDOF0*(nDOF1-1)                          const int firstDOF=(i1+1)/2*nDOF0*(nDOF1-1)
1333                                             +(i2+1)/2*nDOF0*nDOF1*(nDOF2-1);                                             +(i2+1)/2*nDOF0*nDOF1*(nDOF2-1);
1334                          const int firstNode=(i1+1)/2*m_N0*(m_N1-1)                          const int firstNode=(i1+1)/2*m_N0*(m_N1-1)
1335                                              +(i2+1)/2*m_N0*m_N1*(m_N2-1);                                              +(i2+1)/2*m_N0*m_N1*(m_N2-1);
                         // + left ?!  
1336                          for (dim_t i=0; i<nDOF0; i++, numShared++) {                          for (dim_t i=0; i<nDOF0; i++, numShared++) {
1337                              sendShared.push_back(firstDOF+i);                              sendShared.push_back(firstDOF+i);
1338                              recvShared.push_back(numDOF+numShared);                              recvShared.push_back(numDOF+numShared);
1339                              // FIXME: colIndices                              if (i>0)
                             if (i>0) {  
1340                                  colIndices[firstDOF+i-1].push_back(numShared);                                  colIndices[firstDOF+i-1].push_back(numShared);
                             }  
1341                              colIndices[firstDOF+i].push_back(numShared);                              colIndices[firstDOF+i].push_back(numShared);
1342                              if (i<nDOF0-1) {                              if (i<nDOF0-1)
1343                                  colIndices[firstDOF+i+1].push_back(numShared);                                  colIndices[firstDOF+i+1].push_back(numShared);
                             }  
1344                              m_dofMap[firstNode+i]=numDOF+numShared;                              m_dofMap[firstNode+i]=numDOF+numShared;
1345                          }                          }
   
1346                      } else if (i1==0) {                      } else if (i1==0) {
1347                          // sharing an edge                          // sharing an edge in y direction
1348                          offsetInShared.push_back(offsetInShared.back()+nDOF1);                          offsetInShared.push_back(offsetInShared.back()+nDOF1);
1349                            const int firstDOF=(i0+1)/2*(nDOF0-1)
1350                                               +(i2+1)/2*nDOF0*nDOF1*(nDOF2-1);
1351                            const int firstNode=(i0+1)/2*(m_N0-1)
1352                                                +(i2+1)/2*m_N0*m_N1*(m_N2-1);
1353                            for (dim_t i=0; i<nDOF1; i++, numShared++) {
1354                                sendShared.push_back(firstDOF+i*nDOF0);
1355                                recvShared.push_back(numDOF+numShared);
1356                                if (i>0)
1357                                    colIndices[firstDOF+(i-1)*nDOF0].push_back(numShared);
1358                                colIndices[firstDOF+i*nDOF0].push_back(numShared);
1359                                if (i<nDOF1-1)
1360                                    colIndices[firstDOF+(i+1)*nDOF0].push_back(numShared);
1361                                m_dofMap[firstNode+i*m_N0]=numDOF+numShared;
1362                            }
1363                      } else if (i2==0) {                      } else if (i2==0) {
1364                          // sharing an edge                          // sharing an edge in z direction
1365                          offsetInShared.push_back(offsetInShared.back()+nDOF2);                          offsetInShared.push_back(offsetInShared.back()+nDOF2);
1366                            const int firstDOF=(i0+1)/2*(nDOF0-1)
1367                                               +(i1+1)/2*nDOF0*(nDOF1-1);
1368                            const int firstNode=(i0+1)/2*(m_N0-1)
1369                                                +(i1+1)/2*m_N0*(m_N1-1);
1370                            for (dim_t i=0; i<nDOF2; i++, numShared++) {
1371                                sendShared.push_back(firstDOF+i*nDOF0*nDOF1);
1372                                recvShared.push_back(numDOF+numShared);
1373                                if (i>0)
1374                                    colIndices[firstDOF+(i-1)*nDOF0*nDOF1].push_back(numShared);
1375                                colIndices[firstDOF+i*nDOF0*nDOF1].push_back(numShared);
1376                                if (i<nDOF2-1)
1377                                    colIndices[firstDOF+(i+1)*nDOF0*nDOF1].push_back(numShared);
1378                                m_dofMap[firstNode+i*m_N0*m_N1]=numDOF+numShared;
1379                            }
1380                      } else {                      } else {
1381                          // sharing a node                          // sharing a node
1382                          const int dof=(i0+1)/2*(nDOF0-1)                          const int dof=(i0+1)/2*(nDOF0-1)
# Line 1670  void Brick::populateSampleIds() Line 1701  void Brick::populateSampleIds()
1701    
1702          // elements          // elements
1703  #pragma omp for nowait  #pragma omp for nowait
1704          for (dim_t k=0; k<getNumElements(); k++)          for (dim_t i2=0; i2<m_NE2; i2++) {
1705              m_elementId[k]=k;              for (dim_t i1=0; i1<m_NE1; i1++) {
1706                    for (dim_t i0=0; i0<m_NE0; i0++) {
1707                        m_elementId[i0+i1*m_NE0+i2*m_NE0*m_NE1] =
1708                            (m_offset2+i2)*m_gNE0*m_gNE1
1709                            +(m_offset1+i1)*m_gNE0
1710                            +m_offset0+i0;
1711                    }
1712                }
1713            }
1714    
1715          // face elements          // face elements
1716  #pragma omp for  #pragma omp for
# Line 2101  void Brick::nodesToDOF(escript::Data& ou Line 2140  void Brick::nodesToDOF(escript::Data& ou
2140      const index_t left = (m_offset0==0 ? 0 : 1);      const index_t left = (m_offset0==0 ? 0 : 1);
2141      const index_t bottom = (m_offset1==0 ? 0 : 1);      const index_t bottom = (m_offset1==0 ? 0 : 1);
2142      const index_t front = (m_offset2==0 ? 0 : 1);      const index_t front = (m_offset2==0 ? 0 : 1);
2143      const index_t right = (m_mpiInfo->rank%m_NX==m_NX-1 ? m_N0 : m_N0-1);      const index_t nDOF0 = (m_gNE0+1)/m_NX;
2144      const index_t top = (m_mpiInfo->rank%(m_NX*m_NY)/m_NX==m_NY-1 ? m_N1 : m_N1-1);      const index_t nDOF1 = (m_gNE1+1)/m_NY;
2145      const index_t back = (m_mpiInfo->rank/(m_NX*m_NY)==m_NZ-1 ? m_N2 : m_N2-1);      const index_t nDOF2 = (m_gNE2+1)/m_NZ;
2146      index_t n=0;  #pragma omp parallel for
2147      for (index_t i=front; i<back; i++) {      for (index_t i=0; i<nDOF2; i++) {
2148          for (index_t j=bottom; j<top; j++) {          for (index_t j=0; j<nDOF1; j++) {
2149              for (index_t k=left; k<right; k++, n++) {              for (index_t k=0; k<nDOF0; k++) {
2150                  const double* src=in.getSampleDataRO(k+j*m_N0+i*m_N0*m_N1);                  const index_t n=k+left+(j+bottom)*m_N0+(i+front)*m_N0*m_N1;
2151                    const double* src=in.getSampleDataRO(n);
2152                    copy(src, src+numComp, out.getSampleDataRW(k+j*nDOF0+i*nDOF0*nDOF1));
2153                }
2154            }
2155        }
2156    }
2157    
2158    //protected
2159    void Brick::dofToNodes(escript::Data& out, escript::Data& in) const
2160    {
2161        const dim_t numComp = in.getDataPointSize();
2162        out.requireWrite();
2163    
2164        //TODO: use coupler to get the rest of the values
2165    
2166        const index_t left = (m_offset0==0 ? 0 : 1);
2167        const index_t bottom = (m_offset1==0 ? 0 : 1);
2168        const index_t front = (m_offset2==0 ? 0 : 1);
2169        const index_t nDOF0 = (m_gNE0+1)/m_NX;
2170        const index_t nDOF1 = (m_gNE1+1)/m_NY;
2171        const index_t nDOF2 = (m_gNE2+1)/m_NZ;
2172    #pragma omp parallel for
2173        for (index_t i=0; i<nDOF2; i++) {
2174            for (index_t j=0; j<nDOF1; j++) {
2175                for (index_t k=0; k<nDOF0; k++) {
2176                    const double* src=in.getSampleDataRO(k+j*nDOF0+i*nDOF0*nDOF1);
2177                    const index_t n=k+left+(j+bottom)*m_N0+(i+front)*m_N0*m_N1;
2178                  copy(src, src+numComp, out.getSampleDataRW(n));                  copy(src, src+numComp, out.getSampleDataRW(n));
2179              }              }
2180          }          }

Legend:
Removed from v.3754  
changed lines
  Added in v.3755

  ViewVC Help
Powered by ViewVC 1.1.26