source: CPL/oasis3-mct_5.0/pyoasis/examples/7-multiple-puts/C/sender-serial.c @ 6328

Last change on this file since 6328 was 6328, checked in by aclsce, 17 months ago

First import of oasis3-mct_5.0 (from oasis git server, branch OASIS3-MCT_5.0)

File size: 3.1 KB
Line 
1#include <stdio.h>
2#include "oasis_c.h"
3
4int main(int argc, char *argv[])
5{
6  char *comp_name = "sender-serial";
7  fprintf(stdout,"Component name: %s\n", comp_name);
8  fflush(stdout);
9
10  int comp_id;
11
12  OASIS_CHECK_ERR(oasis_c_init_comp(&comp_id, comp_name, OASIS_COUPLED));
13  fprintf(stdout, "Sender: Component ID: %d\n", comp_id);
14  fflush(stdout);
15
16  const int n_points = 1;
17  int part_params[OASIS_Serial_Params];
18  part_params[OASIS_Strategy] = OASIS_Serial;
19  part_params[OASIS_Length] = n_points;
20  int part_id;
21
22  OASIS_CHECK_ERR(oasis_c_def_partition(&part_id, OASIS_Serial_Params,
23                                        part_params, OASIS_No_Gsize,
24                                        OASIS_No_Name));
25  fprintf(stdout, "Sender: part_id: %d\n", part_id);
26  fflush(stdout);
27
28  char *var_name[2]  = {"FSENDOCN_1","FSENDOCN_2"};
29  int bundle_size = 1;
30  int var_id[2];
31
32  int i;
33  for (i = 0; i<2; i++) {
34    fprintf(stdout, "Sender: var_name %s\n", var_name[i]);
35    OASIS_CHECK_ERR(oasis_c_def_var(&var_id[i], var_name[i], part_id, bundle_size, OASIS_OUT, OASIS_REAL));
36    fprintf(stdout, "Sender: var_id %d\n", var_id[i]);
37    fflush(stdout);
38  }
39
40  OASIS_CHECK_ERR(oasis_c_enddef());
41
42  MPI_Comm intra_one;
43  int intra_size, intra_rank;
44  OASIS_CHECK_ERR(oasis_c_get_intracomm(&intra_one, "receiver_one"));
45  OASIS_CHECK_MPI_ERR(MPI_Comm_size(intra_one, &intra_size));
46  OASIS_CHECK_MPI_ERR(MPI_Comm_rank(intra_one, &intra_rank));
47  fprintf(stdout,"Sender intra_one: rank = %d of %d\n",intra_rank,intra_size);
48  fflush(stdout);
49
50  MPI_Comm inter_two;
51  int inter_size, inter_rank;
52  OASIS_CHECK_ERR(oasis_c_get_intercomm(&inter_two, "receiver_two"));
53  OASIS_CHECK_MPI_ERR(MPI_Comm_size(inter_two, &inter_size));
54  OASIS_CHECK_MPI_ERR(MPI_Comm_rank(inter_two, &inter_rank));
55  fprintf(stdout,"Sender inter_two: rank = %d of %d\n",inter_rank,inter_size);
56  fflush(stdout);
57
58  int ncpl;
59  OASIS_CHECK_ERR(oasis_c_get_ncpl(var_id[1], &ncpl));
60  int cpl_freqs[ncpl];
61  OASIS_CHECK_ERR(oasis_c_get_freqs(var_id[1], OASIS_OUT, ncpl, cpl_freqs));
62
63  char outbuff[256];
64  sprintf(outbuff,"Sender: coupling frequencies for %s are",var_name[1]);
65  for (i = 0; i<ncpl; i++) sprintf(outbuff,"%s %d",outbuff, cpl_freqs[i]);
66  fprintf(stdout,"%s\n",outbuff);
67  fflush(stdout);
68
69  float field[n_points];
70  int date;
71  for (date = 0; date < 43200; date++) {
72
73    int kinfo;
74    OASIS_CHECK_ERR(oasis_c_put_inquire(var_id[1], date, &kinfo));
75
76    if ( kinfo == OASIS_Sent ) {
77      for (i = 0; i < n_points; i++ ) field[i] = (float) date;
78      OASIS_CHECK_ERR(oasis_c_put(var_id[0], date, n_points, 1, bundle_size,
79                                  OASIS_REAL, OASIS_COL_MAJOR, field,
80                                  OASIS_No_Restart, &kinfo));
81    }
82
83    bool do_send = 0;
84    for (i = 0; i < ncpl ; i++ ) do_send = do_send || (date % cpl_freqs[i]) == 0;
85    if ( do_send ) {
86      OASIS_CHECK_ERR(oasis_c_set_debug(2));
87      for (i = 0; i < n_points; i++ ) field[i] = -1.0 * (float) date;
88      bool ll_rst = date % 10800 == 0;
89      OASIS_CHECK_ERR(oasis_c_put(var_id[1], date, n_points, 1, bundle_size,
90                                  OASIS_REAL, OASIS_COL_MAJOR, field,
91                                  ll_rst, &kinfo));
92      OASIS_CHECK_ERR(oasis_c_set_debug(0));
93    }
94
95  }
96
97  OASIS_CHECK_ERR(oasis_c_terminate());
98
99}
Note: See TracBrowser for help on using the repository browser.