/[escript]/trunk/paso/src/Coupler.c
ViewVC logotype

Diff of /trunk/paso/src/Coupler.c

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

revision 1552 by gross, Thu May 8 08:52:41 2008 UTC revision 1639 by gross, Mon Jul 14 08:55:25 2008 UTC
# Line 39  Paso_Connector* Paso_Connector_alloc(Pas Line 39  Paso_Connector* Paso_Connector_alloc(Pas
39       Paso_setError(SYSTEM_ERROR,"Paso_Coupler_alloc: send and recv mpi communicator don't match.");       Paso_setError(SYSTEM_ERROR,"Paso_Coupler_alloc: send and recv mpi communicator don't match.");
40       return NULL;       return NULL;
41    }    }
42      if ( send->local_length != recv->local_length ) {
43         Paso_setError(SYSTEM_ERROR,"Paso_Coupler_alloc: local length of send and recv Paso_SharedComponents must match.");
44         return NULL;
45      }
46      
47    if (!Paso_checkPtr(out)) {    if (!Paso_checkPtr(out)) {
48        out->send=Paso_SharedComponents_getReference(send);        out->send=Paso_SharedComponents_getReference(send);
49        out->recv= Paso_SharedComponents_getReference(recv);        out->recv= Paso_SharedComponents_getReference(recv);
# Line 71  void Paso_Connector_free(Paso_Connector* Line 76  void Paso_Connector_free(Paso_Connector*
76          Paso_SharedComponents_free(in->send);          Paso_SharedComponents_free(in->send);
77          Paso_SharedComponents_free(in->recv);          Paso_SharedComponents_free(in->recv);
78          Paso_MPIInfo_free(in->mpi_info);          Paso_MPIInfo_free(in->mpi_info);
79            MEMFREE(in);
80          #ifdef Paso_TRACE          #ifdef Paso_TRACE
81          printf("Paso_Coupler_dealloc: system matrix pattern as been deallocated.\n");          printf("Paso_Coupler_dealloc: system matrix pattern as been deallocated.\n");
82          #endif          #endif
# Line 87  Paso_Connector* Paso_Connector_unroll(Pa Line 93  Paso_Connector* Paso_Connector_unroll(Pa
93       Paso_Connector *out=NULL;       Paso_Connector *out=NULL;
94       if (Paso_noError()) {       if (Paso_noError()) {
95          if (block_size>1) {          if (block_size>1) {
96              new_send_shcomp=Paso_SharedComponents_alloc(in->send->numNeighbors,              new_send_shcomp=Paso_SharedComponents_alloc(in->send->local_length,
97                                                            in->send->numNeighbors,
98                                                          in->send->neighbor,                                                          in->send->neighbor,
99                                                          in->send->shared,                                                          in->send->shared,
100                                                          in->send->offsetInShared,                                                          in->send->offsetInShared,
101                                                          block_size,0,in->mpi_info);                                                          block_size,0,in->mpi_info);
102    
103              new_recv_shcomp=Paso_SharedComponents_alloc(in->recv->numNeighbors,              new_recv_shcomp=Paso_SharedComponents_alloc(in->recv->local_length,
104                                                            in->recv->numNeighbors,
105                                                          in->recv->neighbor,                                                          in->recv->neighbor,
106                                                          in->recv->shared,                                                          in->recv->shared,
107                                                          in->recv->offsetInShared,                                                          in->recv->offsetInShared,
# Line 126  Paso_Coupler* Paso_Coupler_alloc(Paso_Co Line 134  Paso_Coupler* Paso_Coupler_alloc(Paso_Co
134    Paso_resetError();    Paso_resetError();
135    out=MEMALLOC(1,Paso_Coupler);    out=MEMALLOC(1,Paso_Coupler);
136    if (!Paso_checkPtr(out)) {    if (!Paso_checkPtr(out)) {
137          out->data=NULL;
138        out->block_size=block_size;        out->block_size=block_size;
139        out->connector=Paso_Connector_getReference(connector);        out->connector=Paso_Connector_getReference(connector);
140        out->send_buffer=NULL;        out->send_buffer=NULL;
# Line 191  void Paso_Coupler_startCollect(Paso_Coup Line 200  void Paso_Coupler_startCollect(Paso_Coup
200    Paso_MPIInfo *mpi_info = coupler->mpi_info;      Paso_MPIInfo *mpi_info = coupler->mpi_info;  
201    dim_t block_size=coupler->block_size;    dim_t block_size=coupler->block_size;
202    size_t block_size_size=block_size*sizeof(double);    size_t block_size_size=block_size*sizeof(double);
203    dim_t i,j;    dim_t i;
204      coupler->data=(double*) in;
205    if ( mpi_info->size>1) {    if ( mpi_info->size>1) {
206       /* start reveiving input */       /* start reveiving input */
      #pragma omp master  
207       {       {
208          for (i=0; i< coupler->connector->recv->numNeighbors; ++i) {          for (i=0; i< coupler->connector->recv->numNeighbors; ++i) {
209              #ifdef PASO_MPI              #ifdef PASO_MPI
# Line 202  void Paso_Coupler_startCollect(Paso_Coup Line 211  void Paso_Coupler_startCollect(Paso_Coup
211                        (coupler->connector->recv->offsetInShared[i+1]- coupler->connector->recv->offsetInShared[i])*block_size,                        (coupler->connector->recv->offsetInShared[i+1]- coupler->connector->recv->offsetInShared[i])*block_size,
212                        MPI_DOUBLE,                        MPI_DOUBLE,
213                        coupler->connector->recv->neighbor[i],                        coupler->connector->recv->neighbor[i],
214                        mpi_info->msg_tag_counter+coupler->recv->neighbor[i],                        mpi_info->msg_tag_counter+coupler->connector->recv->neighbor[i],
215                        mpi_info->comm,                        mpi_info->comm,
216                        &(coupler->mpi_requests[i]));                        &(coupler->mpi_requests[i]));
217              #endif              #endif
# Line 215  void Paso_Coupler_startCollect(Paso_Coup Line 224  void Paso_Coupler_startCollect(Paso_Coup
224          memcpy(&(coupler->send_buffer[(block_size)*i]),&(in[ block_size * coupler->connector->send->shared[i]]), block_size_size);          memcpy(&(coupler->send_buffer[(block_size)*i]),&(in[ block_size * coupler->connector->send->shared[i]]), block_size_size);
225       }       }
226       /* send buffer out */       /* send buffer out */
      #pragma omp master  
227       {       {
228          for (i=0; i< coupler->connector->send->numNeighbors; ++i) {          for (i=0; i< coupler->connector->send->numNeighbors; ++i) {
229               #ifdef PASO_MPI               #ifdef PASO_MPI
230               MPI_Issend(&(coupler->send_buffer[coupler->send->offsetInShared[i] *  block_size]),               MPI_Issend(&(coupler->send_buffer[coupler->connector->send->offsetInShared[i] *  block_size]),
231                          (coupler->connector->send->offsetInShared[i+1]- coupler->connector->send->offsetInShared[i])*block_size,                          (coupler->connector->send->offsetInShared[i+1]- coupler->connector->send->offsetInShared[i])*block_size,
232                          MPI_DOUBLE,                          MPI_DOUBLE,
233                          coupler->connector->send->neighbor[i],                          coupler->connector->send->neighbor[i],
234                          mpi_info->msg_tag_counter+mpi_info->rank,                          mpi_info->msg_tag_counter+mpi_info->rank,
235                          mpi_info->comm,                          mpi_info->comm,
236                          &(coupler->mpi_requests[i+ coupler->recv->numNeighbors]));                          &(coupler->mpi_requests[i+ coupler->connector->recv->numNeighbors]));
237               #endif               #endif
238          }          }
239       }       }
# Line 238  double* Paso_Coupler_finishCollect(Paso_ Line 246  double* Paso_Coupler_finishCollect(Paso_
246    Paso_MPIInfo *mpi_info = coupler->mpi_info;      Paso_MPIInfo *mpi_info = coupler->mpi_info;  
247    if ( mpi_info->size>1) {    if ( mpi_info->size>1) {
248       /* wait for receive */       /* wait for receive */
      #pragma omp master  
      {  
249          #ifdef PASO_MPI          #ifdef PASO_MPI
250          MPI_Waitall(coupler->connector->recv->numNeighbors+coupler->connector->send->numNeighbors,          MPI_Waitall(coupler->connector->recv->numNeighbors+coupler->connector->send->numNeighbors,
251                      coupler->mpi_requests,                      coupler->mpi_requests,
252                      coupler->mpi_stati);                      coupler->mpi_stati);
253          #endif          #endif
      }  
254    }    }
255    return coupler->recv_buffer;    return coupler->recv_buffer;
256  }  }
257    dim_t Paso_Coupler_getLocalLength(const Paso_Coupler* in) {
258         return in->connector->send->local_length;
259    
260    }
261    void Paso_Coupler_copyAll(const Paso_Coupler* src, Paso_Coupler* target)
262    {
263       dim_t i;
264       #pragma omp parallel
265       {
266           #pragma omp for private(i)
267           for (i =0; i< src->connector->recv->numSharedComponents * src->block_size; ++i) {
268              target->recv_buffer[i]=src->recv_buffer[i];
269          }
270          #pragma omp for private(i)
271          for (i =0; i< Paso_Coupler_getLocalLength(src) * src->block_size; ++i) {
272              target->data[i]=src->data[i];
273         }
274      }
275    }

Legend:
Removed from v.1552  
changed lines
  Added in v.1639

  ViewVC Help
Powered by ViewVC 1.1.26