/usr/share/doc/freefem++/examples/examples++-mpi/MPIGMRESmacro.idp is in freefem++-doc 3.19.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // MPIGMRSmacro.idp file.. version 0.
// include in MPIGMRES.edp file ..
// Frederic Hecht 2010
// LGPL licence
// Author Frederic.Hecht@upmc.fr
// -------------------------------
// macro to def // send-recv message
// -----------------------------------
func real maxM(matrix & A)
{
int[int] I(1),J(1);
real[int] C(1);
[I,J,C] =A;
return C.max ;
}
macro InitU(n,Vh,Th,aTh,U)
Vh[int] U(n);
for(int j=0;j<n;++j)
{
Th=aTh[j];
U[j]=0;
}
//EOM
macro ISendRecvAny(comm,jpart,Si,Ri)
{ /* sorry no Irecv of complex objet ...*/
int n= jpart.n,nn=n+n;
if(vdebug) cout << mpirank << " --ISendRecvAny " << n << endl;
mpiRequest[int] rq(nn);
for (int j=0;j<n;++j)
Irecv(processor(jpart[j],comm,rq[j]),Ri[j]);
if(vdebug) cout << mpirank << " ++ISendRecvAny " << n << endl;
for (int j=0;j<n;++j)
Isend(processor(jpart[j],comm,rq[n+j]),Si[j]);
for (int j=0;j<nn;++j)
{
int k= mpiWaitAny(rq);
if(vdebug)
cout << " ++ISendRecvAny wait: get " << k << endl;
}
}
//EOM
macro SendRecvAny(comm,jpart,Si,Ri)
{ verbosity=200;
int n= jpart.n;
for (int j=0;j<n;++j)
processor(comm,jpart[j]) << Si[j];
cout << " ** wait revc " << endl;
for (int j=0;j<n;++j)
processor(comm,jpart[j]) >> Ri[j];
}
// EOM
macro CheckUV(comm,jpart,Si,Ri)
{
int ipart=mpiRank(comm);
int n= jpart.n;
int[int] rn(n),sn(n),in(n);
for (int j=0;j<n;++j)
{ sn[j]= Si[j][].n;
processor(jpart[j],comm) << sn[j];
processor(jpart[j],comm) << ipart;
}
for (int j=0;j<n;++j)
processor(jpart[j],comm) >> rn[j];
for (int j=0;j<n;++j)
processor(jpart[j],comm) >> in[j];
int err=0;
for (int j=0;j<n;++j)
{
int rj=Ri[j][].n;
err += rj != rn[j];
cout << rj << " s ========= r " << rn[j] << " " << ipart << " <-> " << in[j] << " " << err << endl;
}
assert(err==0);
}//EOM
macro SendRecvUV(comm,jpart,Si,Ri)
{
int n= jpart.n;
mpiRequest[int] rq(n);
for (int j=0;j<n;++j)
Irecv(processor(jpart[j],comm,rq[j]), Ri[j][]);
for (int j=0;j<n;++j)
processor(jpart[j],comm) << Si[j][];
/* for (int j=0;j<n;++j)
processor(jpart[j],comm) >> Ri[j][];*/
for (int j=0;j<n;++j)
int k= mpiWaitAny(rq);
}
// EOF
|