AdjoinableMPI
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
st.c
Go to the documentation of this file.
1 /*
2 ##########################################################
3 # This file is part of the AdjoinableMPI library #
4 # released under the MIT License. #
5 # The full COPYRIGHT notice can be found in the top #
6 # level directory of the AdjoinableMPI distribution. #
7 ##########################################################
8 */
9 #include <mpi.h>
10 #include "ampi/libCommon/st.h"
12 #include "ampi/adTool/support.h"
13 
15  void* buf,
16  MPI_Status *status) {
17  MPI_Request *plainRequest;
18  struct AMPI_Request_S *ampiRequest;
19 #ifdef AMPI_FORTRANCOMPATIBLE
20  struct AMPI_Request_S ampiRequestInst;
21  ampiRequest=&ampiRequestInst;
22  plainRequest=request;
23  BK_AMPI_get_AMPI_Request(plainRequest,ampiRequest,0);
24 #else
25  plainRequest=&(request->plainRequest);
26  ampiRequest=request;
27 #endif
28  /* push request */
29  ADTOOL_AMPI_push_AMPI_Request(ampiRequest);
30  return MPI_Wait(plainRequest,
31  status);
32 }
33 
35  void* buf,
36  MPI_Status *status) {
37  int rc;
38  struct AMPI_Request_S ampiRequest;
39  /* pop request */
40  ADTOOL_AMPI_pop_AMPI_Request(&ampiRequest);
41  ADTOOL_AMPI_setBufForAdjoint(&ampiRequest,buf);
42  switch(ampiRequest.origin) {
43  case AMPI_SEND_ORIGIN: {
45  rc=MPI_Irecv(ampiRequest.adjointTempBuf,
46  ampiRequest.adjointCount,
47  ampiRequest.datatype,
48  ampiRequest.endPoint,
49  ampiRequest.tag,
50  ampiRequest.comm,
51  &(ampiRequest.plainRequest));
52  break;
53  }
54  case AMPI_RECV_ORIGIN: {
55  ADTOOL_AMPI_setAdjointCount(&ampiRequest);
56  rc=MPI_Isend(ampiRequest.buf,
57  ampiRequest.adjointCount,
58  ampiRequest.datatype,
59  ampiRequest.endPoint,
60  ampiRequest.tag,
61  ampiRequest.comm,
62  &(ampiRequest.plainRequest));
63  break;
64  }
65  default:
66  rc=MPI_Abort(ampiRequest.comm, MPI_ERR_TYPE);
67  break;
68  }
69 #ifdef AMPI_FORTRANCOMPATIBLE
70  *request=ampiRequest.plainRequest;
71  BK_AMPI_put_AMPI_Request(&ampiRequest);
72 #endif
73  return rc;
74 }