source: CIVL/examples/contracts/contractsMPI/diffusion1d.c@ 1217407

1.23 2.0 main test-branch
Last change on this file since 1217407 was 885c088, checked in by Ziqing Luo <ziqing@…>, 10 years ago

imrpoved the contract transformer

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@3623 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 2.5 KB
Line 
1#include<mpi.h>
2int left, right, nxl, nx, rank, nsteps;
3double * u, * u_new, k;
4
5/*@ \mpi_collective(MPI_COMM_WORLD, P2P):
6 @ requires rank == \mpi_comm_rank;
7 @ requires nxl > 0;
8 @ requires \mpi_valid(u, nxl + 2, MPI_DOUBLE);
9 @ ensures \on(left, u[nxl + 1]) == u[1]; //deliver 1
10 @ ensures \on(right, u[0]) == u[nxl]; //deliver 2
11 @ ensures \on(left, u[nxl]) == u[0]; //obtain 1
12 @ ensures \on(right, u[1]) == u[nxl + 1]; //obtain 2
13 @ behavior maxrank:
14 @ assumes rank == \mpi_comm_size - 1;
15 @ requires right == 0 && left == rank - 1;
16 @ behavior minrank:
17 @ assumes rank == 0;
18 @ requires left == \mpi_comm_size - 1 && right == rank + 1;
19 @ behavior others:
20 @ assumes 0 < rank && rank < \mpi_comm_size;
21 @ requires left == rank - 1 && right == rank + 1;
22 @*/
23void exchange_ghost_cells() {
24 MPI_Sendrecv(&u[1], 1, MPI_DOUBLE, left, 0,
25 &u[nxl+1], 1, MPI_DOUBLE, right, 0,
26 MPI_COMM_WORLD, MPI_STATUS_IGNORE);
27 MPI_Sendrecv(&u[nxl], 1, MPI_DOUBLE, right, 0,
28 &u[0], 1, MPI_DOUBLE, left, 0,
29 MPI_COMM_WORLD, MPI_STATUS_IGNORE);
30}
31
32/*@ requires \valid(u + (0 .. (nxl + 2)));
33 @ requires \valid(u_new + (0 .. (nxl + 2)));
34 @ requires nxl > 0 && nxl <= 4;
35 @ requires k > 0;
36 @ assigns u_new[0 .. (nxl + 2)];
37 @ ensures \forall int i; 0< i && i <= nxl
38 @ ==>
39 @ u[i] == \old(u[i] + k*(u[i+1] + u[i-1] - 2*u[i]));
40 @*/
41void update() {
42 for (int i = 1; i <= nxl; i++)
43 u_new[i] = u[i] + k*(u[i+1] + u[i-1] - 2*u[i]);
44 double * tmp = u_new; u_new=u; u=tmp;
45}
46
47/*@ requires nsteps > 1;
48 @ \mpi_collective(MPI_COMM_WORLD, P2P):
49 @ requires rank == \mpi_comm_rank;
50 @ requires nxl > 0;
51 @ requires \mpi_valid(u, nxl + 2, MPI_DOUBLE);
52 @ requires \mpi_valid(u_new, nxl + 2, MPI_DOUBLE);
53 @ requires nx == \sum(0, \mpi_comm_size - 1,
54 @ (\lambda int k; \on(k, nxl)));
55 @ ensures \forall int i; 0 < i <= nx
56 @ ==>
57 @ u[i] == \old(u[i] + k*(u[i+1] + u[i-1] - 2*u[i]));
58 @ behavior maxrank:
59 @ assumes rank == \mpi_comm_size - 1;
60 @ requires right == 0 && left == rank - 1;
61 @ behavior minrank:
62 @ assumes rank == 0;
63 @ requires left == \mpi_comm_size - 1 && right == rank + 1;
64 @ behavior others:
65 @ assumes 0 < rank && rank < \mpi_comm_size;
66 @ requires left == rank - 1 && right == rank + 1;
67 @*/
68void diff1dIter() {
69 exchange_ghost_cells();
70 update();
71}
Note: See TracBrowser for help on using the repository browser.