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

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 413246c was f53d5c9, checked in by Manchun Zheng <zmanchun@…>, 10 years ago

fixed typos.

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

  • Property mode set to 100644
File size: 2.6 KB
Line 
1#include<mpi.h>
2int left, right, nxl, nx, rank, nsteps;
3double * u, * u_new;
4
5/*@ \mpi_collective(MPI_COMM_WORLD, P2P):
6 @ requires rank == \mpi_comm_rank;
7 @ requires nxl > 0;
8 @ requires \mpi_valid(u, MPI_DOUBLE, nxl + 2);
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;
35 @ requires k > 0;
36 @ assigns u_new[0 .. (nxl + 2)];
37 @ ensures \forall int i; 0< i <= nxl
38 @ ==>
39 @ u[i] == \old(u[i] + k*(u[i+1] + u[i-1] - 2*u[i]));
40 @*/
41void update() {
42 /*@
43 @ loop invariants \forall int j; 0< j < i
44 @ ==>
45 @ u_new[j] == u[j] + k*(u[j+1] + u[j-1] - 2*u[j]);
46 @*/
47 for (int i = 1; i <= nxl; i++)
48 u_new[i] = u[i] + k*(u[i+1] + u[i-1] - 2*u[i]);
49 double * tmp = u_new; u_new=u; u=tmp;
50}
51
52/*@ requires nsteps > 1;
53 @ \mpi_collective(MPI_COMM_WORLD, P2P):
54 @ requires rank == \mpi_comm_rank;
55 @ requires nxl > 0;
56 @ requires \mpi_valid(u, nxl + 2, MPI_DOUBLE);
57 @ requires \mpi_valid(u_new, nxl + 2, MPI_DOUBLE);
58 @ requires nx == \sum(0, \mpi_comm_size - 1,
59 @ (\lambda int k; \remote(nxl, k)));
60 @ ensures \forall int i; 0 < i <= nx
61 @ ==>
62 @ u[i] == \old(u[i] + k*(u[i+1] + u[i-1] - 2*u[i]));
63 @ behavior maxrank:
64 @ assumes rank == \mpi_comm_size - 1;
65 @ requires right == 0 && left == rank - 1;
66 @ behavior minrank:
67 @ assumes rank == 0;
68 @ requires left == \mpi_comm_size - 1 && right == rank + 1;
69 @ behavior others:
70 @ assumes 0 < rank && rank < \mpi_comm_size;
71 @ requires left == rank - 1 && right == rank + 1;
72 @*/
73void diff1dIter() {
74 exchange_ghost_cells();
75 update();
76}
Note: See TracBrowser for help on using the repository browser.