2 subroutine setupcomm(comm,newcomm,newcommg,path_in,session_in)
9 integer comm, newcomm, newcommg
10 character session_in*(*), path_in*(*)
13 common /nekmpi/ mid,mp,nekcomm,nekgroup,nekreal
15 integer nid_global_root(0:nsessmax-1)
16 character*132 session_mult(0:nsessmax-1), path_mult(0:nsessmax-1)
19 logical mpi_is_initialized
24 if (.not.mpi_is_initialized)
call mpi_init(ierr)
35 if (ntags .lt. np_global)
then
36 if(nid_global.eq.0)
write(6,*)
'ABORT: MPI_TAG_UB too small!'
49 l =
ltrunc(session_in,len(session_in))
51 call blank(session_mult(0),132)
52 call chcopy(session_mult(0), session_in, l)
53 l =
ltrunc(path_in,len(path_in))
54 call blank(path_mult(0) ,132)
55 call chcopy(path_mult(0), path_in, l)
58 open (unit=8,
file=
'SESSION.NAME',status=
'old',err=24)
63 if (nlin.gt.2)
read(8,*,err=24) nsessions
64 if (nsessions.gt.1)
read(8,*,err=24) ifneknekc
66 call blank(session_mult(n),132)
67 call blank(path_mult(n) ,132)
68 read(8,11,err=24) session_mult(n)
69 read(8,11,err=24) path_mult(n)
70 if (nsessions.gt.1)
read(8,*,err=24) npsess(n)
76 $
write(6,*)
'Number of sessions:',nsessions
81 call err_chk(ierr,
' Error while reading SESSION.NAME!$')
83 call bcast(nsessions,isize)
84 if (nsessions .gt. nsessmax)
85 &
call exitti(
'nsessmax in SIZE too low!$',nsessmax)
86 if (nsessions .gt. 1) ifneknek = .true.
88 call bcast(ifneknekc,lsize)
90 call bcast(npsess(n),isize)
91 call bcast(session_mult(n),132*csize)
92 call bcast(path_mult(n),132*csize)
96 if (.not.ifneknek)
then
98 session = session_mult(0)
108 npall=npall+npsess(n)
110 if (npall.ne.np_global)
111 &
call exitti(
'Number of ranks does not match!$',npall)
114 nid_global_root_next=0
116 nid_global_root(n)=nid_global_root_next
117 nid_global_root_next=nid_global_root(n)+npsess(n)
118 if (nid_global.ge.nid_global_root(n).and.
119 & nid_global.lt.nid_global_root_next) idsess = n
123 session = session_mult(idsess)
124 path = path_mult(idsess)
127 if (nsessions.gt.2)
call exitti(
128 &
'More than 2 coupled sessions are currently not supported!$',
143 common /nekmpi/ nid_,np_,nekcomm,nekgroup,nekreal
146 integer*8 isize_mpi, lb
165 $
call exitti(
'Single precision mode not supported!',wdsize)
168 if (isize_mpi .ne. wdsize)
then
169 call exitti(
'MPI real size does not match$',isize_mpi)
173 if (isize_mpi .ne. isize)
then
174 call exitti(
'MPI integer size does not match$',isize_mpi)
178 if (isize_mpi .ne. isize8)
then
179 call exitti(
'MPI integer8 size does not match$',isize_mpi)
196 call fgslib_crystal_setup(cr_h,nekcomm,np)
200 subroutine gop( x, w, op, n)
207 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
215 if (icalld.eq.0)
then
225 call mpi_allreduce(x,w,n,mpi_double_precision,mpi_sum,nekcomm,ie)
226 elseif (op.EQ.
'M ')
then
227 call mpi_allreduce(x,w,n,mpi_double_precision,mpi_max,nekcomm,ie)
228 elseif (op.EQ.
'm ')
then
229 call mpi_allreduce(x,w,n,mpi_double_precision,mpi_min,nekcomm,ie)
230 elseif (op.EQ.
'* ')
then
231 call mpi_allreduce(x,w,n,mpi_double_precision,mpi_prod,nekcomm,ie)
233 write(6,*) nid,
' OP ',op,
' not supported. ABORT in GOP.'
251 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
258 elseif (op.EQ.
'M ')
then
260 elseif (op.EQ.
'm ')
then
262 elseif (op.EQ.
'* ')
then
265 write(6,*) nid,
' OP ',op,
' not supported. ABORT in igop.'
279 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
285 call mpi_allreduce (x,w,n,mpi_integer8,mpi_sum ,nekcomm,ierr)
286 elseif (op.EQ.
'M ')
then
287 call mpi_allreduce (x,w,n,mpi_integer8,mpi_max ,nekcomm,ierr)
288 elseif (op.EQ.
'm ')
then
289 call mpi_allreduce (x,w,n,mpi_integer8,mpi_min ,nekcomm,ierr)
290 elseif (op.EQ.
'* ')
then
291 call mpi_allreduce (x,w,n,mpi_integer8,mpi_prod,nekcomm,ierr)
293 write(6,*) nid,
' OP ',op,
' not supported. ABORT in igop.'
302 subroutine csend(mtype,buf,len,jnid,jpid)
304 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
307 call mpi_send (buf,len,mpi_byte,jnid,mtype,nekcomm,ierr)
314 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
315 integer status(mpi_status_size)
319 jnid = mpi_any_source
322 $ ,jnid,mtype,nekcomm,status,ierr)
324 if (len.gt.lenm)
then
325 write(6,*) nid,
'long message in mpi_crecv:',len,lenm
334 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
335 integer status(mpi_status_size)
341 $ ,jnid,mtype,nekcomm,status,ierr)
343 if (len.gt.lenm)
then
344 write(6,*) nid,
'long message in mpi_crecv:',len,lenm
353 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
354 integer status(mpi_status_size)
358 jnid = mpi_any_source
361 $ ,jnid,mtype,nekcomm,status,ierr)
364 if (len.gt.lenm)
then
365 write(6,*) nid,
'long message in mpi_crecv:',len,lenm
374 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
383 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
423 call bcast(item,isize)
425 if (item.eq.1) ifif=.true.
432 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
435 call mpi_bcast (buf,len,mpi_byte,0,nekcomm,ierr)
442 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
453 function isend(msgtag,x,len,jnid,jpid)
460 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
462 call mpi_isend (x,len,mpi_byte,jnid,msgtag
463 $ ,nekcomm,imsg,ierr)
477 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
479 call mpi_irecv (x,len,mpi_byte,mpi_any_source,msgtag
480 $ ,nekcomm,imsg,ierr)
491 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
492 integer status(mpi_status_size)
504 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
512 character*1 stringi(132)
513 character*1 stringo(132)
519 call blank(stringo,132)
520 call chcopy(stringo,stringi,132)
521 len =
indx1(stringo,
'$',1)
522 write(s25,25) rdata,idata
523 25
format(1x,1p1e14.6,i10)
524 call chcopy(stringo(len),s25,25)
526 if (nid.eq.0)
write(6,1) (stringo(k),k=1,len+24)
527 1
format(
'EXIT: ',132a1)
535 character*1 stringi(132)
536 character*1 stringo(132)
542 call blank(stringo,132)
543 call chcopy(stringo,stringi,132)
544 len =
indx1(stringo,
'$',1)
547 call chcopy(stringo(len),s11,11)
549 if (nid.eq.0)
write(6,1) (stringo(k),k=1,len+10)
550 1
format(
'EXIT: ',132a1)
558 character*1 string(132)
559 character*1 ostring(132)
568 len =
indx1(string,
'$',1)
569 call blank(ostring,132)
571 11
format(1x,
' ierr=',i3)
573 call chcopy(ostring,string,len-1)
574 call chcopy(ostring(len),s10,10)
576 if (nid.eq.0)
write(6,1) (ostring(k),k=1,len+10)
577 1
format(
'ERROR: ',132a1)
592 write(6,
'(A)')
'run successful: dying ...'
610 write(6,
'(A)')
'an error occured: dying ...'
633 ttotal = tstop-etimes
634 tsol = max(ttime - tprep,0.0)
644 dgp = max(dgp,1.)*max(istep,1)
645 dtmp0 = np*(ttime-tprep)
647 if (dtmp0.gt.0) dtmp1 = dgp/dtmp0
648 dtmp2 = (ttime-tprep)/max(istep,1)
651 write(6,
'(5(A,1p1e13.5,A,/))')
652 &
'total elapsed time : ',ttotal,
' sec'
653 & ,
'total solver time w/o IO : ',tsol,
' sec'
654 & ,
'time/timestep : ',dtmp2 ,
' sec'
655 & ,
'avg throughput per timestep : ',dtmp1 ,
' gridpts/CPUs'
656 & ,
'total max memory usage : ',dtmp4 ,
' GB'
658 write(6,
'(1(A,1p1e13.5,/))')
659 & ,
'total Gflops/s : ',gflops
690 write(6,*)
'Number of MPI ranks :', np
702 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
703 integer status(mpi_status_size)
710 call mpi_scan(x,r,1,mpi_integer,mpi_sum,nekcomm,ierr)
748 call pingpongo(alphas,betas,0,nodeb,.0005,io,ivb)
749 if (nid.eq.0)
write(6,2) nodeb,np,alphas,betas
750 2
format(2i10,1p2e15.7,
' alpha betao')
755 call pingpong (alphas,betas,0,nodeb,.0005,io,ivb,kk)
756 if (nid.eq.0)
write(6,1) nodeb,np,alphas,betas,kk
757 1
format(2i10,1p2e15.7,
' alpha beta',i1)
764 subroutine pingpong(alphas,betas,nodea,nodeb,dt,io,ivb,kk)
767 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
769 parameter(lt=lx1*ly1*lz1*lelt)
770 parameter(mwd = 3*lt/2)
771 common /scrns/ x(mwd),y(mwd),x1(mwd),y1(mwd)
774 integer status(mpi_status_size)
778 if (nid.eq.nodea)
then
779 write(fname,3) np,nodeb
780 3
format(
't',i4.4,
'.',i4.4)
781 if (io.ne.6)
open (unit=io,
file=fname)
788 if (nid.eq.nodea.and.ivb.gt.0)
write(io,*)
795 nloop = msg_vol/(nwds+2)
796 nloop = min(nloop,1000)
802 $
call ping_loop (t1,t0,len,nloop,nodea,nodeb,nid,x,y,x1,y1)
804 $
call ping_loop1(t1,t0,len,nloop,nodea,nodeb,nid,x,y)
806 $
call ping_loop2(t1,t0,len,nloop,nodea,nodeb,nid,x,y)
808 if (nid.eq.nodea)
then
809 tmsg = (t1-t0)/(2*nloop)
812 if (nwds.gt.0) tpwd = tmsg/nwds
813 if (ivb.gt.0)
write(io,1) nodeb,np,nloop,nwds,tmsg,tpwd,kk
814 1
format(3i6,i12,1p2e16.8,
' pgn',i1)
818 elseif (nwds.gt.10000)
then
819 betas = (betas*count + tpwd)/(count+1)
827 nwds = (nwds+1)*1.016
829 if (nwds.gt.mwd)
then
831 if (nid.eq.nodea.and.io.ne.6)
close(unit=io)
838 if (nid.eq.nodea.and.io.ne.6)
close(unit=io)
844 subroutine pingpongo(alphas,betas,nodea,nodeb,dt,io,ivb)
847 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
849 parameter(lt=lx1*ly1*lz1*lelt)
850 parameter(mwd = 3*lt)
851 common /scrns/ x(mwd),y(mwd)
854 integer status(mpi_status_size)
858 if (nid.eq.nodea)
then
859 write(fname,3) np,nodeb
860 3
format(
't',i4.4,
'.',i4.4)
861 if (io.ne.6)
open (unit=io,
file=fname)
868 if (nid.eq.nodea.and.ivb.gt.0)
write(io,*)
875 nloop = msg_vol/(nwds+2)
876 nloop = min(nloop,1000)
880 jnid = mpi_any_source
882 if (nid.eq.nodea)
then
884 msg =
irecv(itest,y,1)
885 call csend(itest,x,1,nodeb,0)
890 call mpi_irecv(y,len,mpi_byte,mpi_any_source,i
892 call mpi_send (x,len,mpi_byte,nodeb,i,nekcomm,ierr)
899 if (nwds.gt.0) tpwd = tmsg/nwds
900 if (ivb.gt.0)
write(io,1) nodeb,np,nloop,nwds,tmsg,tpwd
901 1
format(3i6,i12,1p2e16.8,
' pgo')
905 elseif (nwds.gt.10000)
then
906 betas = (betas*count + tpwd)/(count+1)
910 elseif (nid.eq.nodeb)
then
912 call crecv(itest,y,1)
913 call csend(itest,x,1,nodea,0)
918 $ ,jnid,i,nekcomm,status,ierr)
919 call mpi_send (x,len,mpi_byte,nodea,i,nekcomm,ierr)
926 nwds = (nwds+1)*1.016
927 if (nwds.gt.mwd)
then
928 if (nid.eq.nodea.and.io.ne.6)
close(unit=io)
935 if (nid.eq.nodea.and.io.ne.6)
close(unit=io)
943 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
944 parameter(lt=lx1*ly1*lz1*lelt)
945 common /scrns/ x(3*lt),y(3*lt)
955 call gop(tmsg,t1,
'+ ',1)
958 if (nid.eq.nodea)
then
961 call csend(1,x,1,nodeb,0)
967 call csend(i,x,len,nodeb,0)
974 elseif (nid.eq.nodeb)
then
977 call csend(1,x,1,nodea,0)
982 call csend(i,x,len,nodea,0)
990 call gop(tmsg,t1,
'+ ',1)
991 msg_vol = nwds*(dt/tmsg)
999 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
1001 integer status(mpi_status_size)
1003 parameter(lt=lx1*ly1*lz1*lelt)
1004 parameter(mwd = 3*lt)
1005 common /scrns/ x(mwd),y(mwd)
1006 common /scruz/ times(2,500)
1007 common /scrcg/ nwd(500)
1012 nwds = (nwds+1)*1.016
1013 if (nwds.gt.mwd)
goto 100
1020 do itest = mtest,1,-1
1023 call cfill(x,tiny,mwd)
1028 call gop(x,y,
'+ ',nwds)
1029 call gop(x,y,
'+ ',nwds)
1030 call gop(x,y,
'+ ',nwds)
1031 call gop(x,y,
'+ ',nwds)
1032 call gop(x,y,
'+ ',nwds)
1033 call gop(x,y,
'+ ',nwds)
1038 if (nwds.gt.0) tpwd = tmsg/nwds
1039 times(1,itest) = tmsg
1040 times(2,itest) = tpwd
1049 if (ivb.gt.0.or.itest.eq.1)
1050 $
write(6,1) np,nwds,(times(k,itest),k=1,2)
1051 1
format(i12,i12,1p2e16.8,
' gop')
1052 nwds = (nwds+1)*1.016
1053 if (nwds.gt.mwd)
goto 102
1066 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
1067 integer status(mpi_status_size)
1069 parameter(lt=lx1*ly1*lz1*lelt)
1070 parameter(mwd = 3*lt)
1071 common /scrns/ x(mwd),y(mwd)
1072 common /scruz/ times(2,500)
1078 call gp2(x,y,
'+ ',1,nid,np)
1081 call gp2(x,y,
'+ ',nwds,nid,np)
1082 call gp2(x,y,
'+ ',nwds,nid,np)
1083 call gp2(x,y,
'+ ',nwds,nid,np)
1084 call gp2(x,y,
'+ ',nwds,nid,np)
1089 if (nwds.gt.0) tpwd = tmsg/nwds
1090 times(1,itest) = tmsg
1091 times(2,itest) = tpwd
1093 nwds = (nwds+1)*1.016
1094 if (nwds.gt.mwd)
goto 101
1102 if (ivb.gt.0.or.itest.eq.1)
1103 $
write(6,1) np,nwds,(times(k,itest),k=1,2)
1104 1
format(i12,i12,1p2e16.8,
' gp2')
1105 nwds = (nwds+1)*1.016
1106 if (nwds.gt.mwd)
goto 102
1122 xor = or(m,n)-and(m,n)
1142 subroutine gp2( x, w, op, n, nid, np)
1151 integer bit, bytes, cnt, diff, spsize, i,
1152 * parent, troot, xor, root, lnp, log2
1160 if (type.gt.9992) type=type-998
1165 troot = max0((nid/np)*np, root)
1166 diff = xor(nid,troot)
1174 if (mod(nid,level2).ne.0)
goto 20
1175 call crecv(
type,w,bytes)
1176 if (op.eq.
'+ ')
then
1180 elseif (op.eq.
'* ')
then
1184 elseif (op.eq.
'M ')
then
1186 x(i) = max(x(i),w(i))
1188 elseif (op.eq.
'm ')
then
1190 x(i) = min(x(i),w(i))
1193 if (level2.lt.np)
goto 5
1196 20 parent = nid-level
1197 if (nid .ne. 0)
call csend(
type,x,bytes,parent,nullpid)
1202 if (nid.eq.root) ifgot=.true.
1208 call csend(typer,x,bytes,jnid,nullpid)
1209 elseif (mod(nid,level).eq.0)
then
1210 call crecv(typer,x,bytes)
1221 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
1226 integer status(mpi_status_size)
1229 if (nid.eq.nodea)
then
1231 call mpi_irecv(y,len,mpi_byte,nodeb,i,nekcomm,msg,ierr)
1232 call mpi_send (x,len,mpi_byte,nodeb,i,nekcomm,ierr)
1238 call mpi_irecv(y,len,mpi_byte,nodeb,i,nekcomm,msg,ierr)
1239 call mpi_send (x,len,mpi_byte,nodeb,i,nekcomm,ierr)
1245 elseif (nid.eq.nodeb)
then
1247 call mpi_irecv(y,len,mpi_byte,nodea,i,nekcomm,msg,ierr)
1253 call mpi_irecv(y,len,mpi_byte,nodea,i,nekcomm,msg,ierr)
1255 call mpi_send (x,len,mpi_byte,nodea,j,nekcomm,ierr)
1260 call mpi_send (x,len,mpi_byte,nodea,j,nekcomm,ierr)
1271 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
1276 integer status(mpi_status_size)
1279 if (nid.eq.nodea)
then
1281 call mpi_irecv(y,len,mpi_byte,nodeb,i,nekcomm,msg,ierr)
1282 call mpi_send (x,len,mpi_byte,nodeb,i,nekcomm,ierr)
1287 call mpi_send (x,len,mpi_byte,nodeb,i,nekcomm,ierr)
1288 call mpi_irecv(y,len,mpi_byte,nodeb,i,nekcomm,msg,ierr)
1293 elseif (nid.eq.nodeb)
then
1295 call mpi_irecv(y,len,mpi_byte,nodea,i,nekcomm,msg,ierr)
1301 call mpi_send (x,len,mpi_byte,nodea,j,nekcomm,ierr)
1302 call mpi_irecv(y,len,mpi_byte,nodea,i,nekcomm,msg,ierr)
1306 call mpi_send (x,len,mpi_byte,nodea,j,nekcomm,ierr)
1315 subroutine ping_loop(t1,t0,len,nloop,nodea,nodeb,nid,x1,y1,x2,y2)
1318 common /nekmpi/ mid,np,nekcomm,nekgroup,nekreal
1320 real x1(1),y1(1),x2(1),y2(1)
1323 integer status(mpi_status_size)
1326 if (nid.eq.nodea)
then
1327 call mpi_irecv(y1,len,mpi_byte,nodeb,itag,nekcomm,msg1,ierr)
1333 call mpi_send (x1,len,mpi_byte,nodeb,itag,nekcomm,ierr)
1334 call mpi_irecv(y2,len,mpi_byte,nodeb,itag,nekcomm,msg2,ierr)
1336 call mpi_send (x2,len,mpi_byte,nodeb,itag,nekcomm,ierr)
1337 call mpi_irecv(y1,len,mpi_byte,nodeb,itag,nekcomm,msg1,ierr)
1341 call mpi_send (x1,len,mpi_byte,nodeb,itag,nekcomm,ierr)
1344 elseif (nid.eq.nodeb)
then
1346 call mpi_irecv(y1,len,mpi_byte,nodea,itag,nekcomm,msg1,ierr)
1352 call mpi_send (x1,len,mpi_byte,nodea,itag,nekcomm,ierr)
1353 call mpi_irecv(y2,len,mpi_byte,nodea,itag,nekcomm,msg2,ierr)
1355 call mpi_send (x2,len,mpi_byte,nodea,itag,nekcomm,ierr)
1356 call mpi_irecv(y1,len,mpi_byte,nodea,itag,nekcomm,msg1,ierr)
1359 call mpi_send (x1,len,mpi_byte,nodea,itag,nekcomm,ierr)
1374 common /nekmpi/ nid,np,nekcomm,nekgroup,nekreal
1375 integer status(mpi_status_size)
1381 call mpi_scan(x,r,1,mpi_integer8,mpi_sum,nekcomm,ierr)
1391 if(ii.ne.5.and.ii.ne.6)
then
1392 inquire(unit=ii,opened=ifopen)
1393 if(ifopen)
close(ii)
1415 common /nekmpi/ mid,mp,nekcomm,nekgroup,nekreal
subroutine crecv2(mtype, buf, lenm, jnid)
subroutine create_comm(inewcomm)
function igl_running_sum(in)
subroutine setnekcomm(comm_in)
subroutine crecv(mtype, buf, lenm)
subroutine igop(x, w, op, n)
integer function mynode()
subroutine gop(x, w, op, n)
subroutine get_msg_vol(msg_vol, dt, nodea, nodeb)
subroutine comm_test(ivb)
subroutine pingpongo(alphas, betas, nodea, nodeb, dt, io, ivb)
subroutine exitti(stringi, idata)
integer function numnodes()
integer *8 function i8gl_running_sum(in)
function isend(msgtag, x, len, jnid, jpid)
subroutine gp2(x, w, op, n, nid, np)
subroutine ping_loop(t1, t0, len, nloop, nodea, nodeb, nid, x1, y1, x2, y2)
subroutine setupcomm(comm, newcomm, newcommg, path_in, session_in)
integer function xor(m, n)
subroutine platform_timer(ivb)
subroutine csend(mtype, buf, len, jnid, jpid)
subroutine fgslib_userexithandler(istatus)
subroutine exittr(stringi, rdata, idata)
subroutine bcast(buf, len)
subroutine crecv3(mtype, buf, len, lenm)
function irecv(msgtag, x, len)
subroutine err_chk(ierr, string)
subroutine ping_loop2(t1, t0, len, nloop, nodea, nodeb, nid, x, y)
subroutine print_runtime_info
subroutine pingpong(alphas, betas, nodea, nodeb, dt, io, ivb, kk)
real *8 function dnekclock()
subroutine i8gop(x, w, op, n)
subroutine ping_loop1(t1, t0, len, nloop, nodea, nodeb, nid, x, y)
real *8 function dnekclock_sync()
integer function indx1(S1, S2, L2)
subroutine icopy(a, b, n)
function ltrunc(string, l)
subroutine chcopy(a, b, n)
subroutine cfill(a, b, n)
subroutine i8copy(a, b, n)
subroutine mpi_barrier(comm, ierror)
subroutine mpi_initialized(mpi_is_initialized, ierr)
subroutine mpi_comm_dup(comm, comm_out, ierror)
subroutine mpi_scan(data1, data2, n, datatype, operation, comm, ierror)
subroutine mpi_isend(data, n, datatype, iproc, itag, comm, request, ierror)
subroutine mpi_finalize(ierror)
subroutine mpi_recv(data, n, datatype, iproc, itag, comm, istatus, ierror)
subroutine mpi_type_get_extent(ikey, ib, isize, ierr)
subroutine mpi_comm_split(comm, icolor, ikey, comm_new, ierror)
subroutine mpi_wait(irequest, istatus, ierror)
subroutine mpi_comm_rank(comm, me, ierror)
subroutine mpi_init(ierror)
subroutine mpi_comm_size(comm, nprocs, ierror)
subroutine mpi_allreduce(data1, data2, n, datatype, operation, comm, ierror)
subroutine mpi_comm_get_attr(icomm, ikey, ival, iflag, ierr)
subroutine mpi_irecv(data, n, datatype, iproc, itag, comm, irequest, ierror)
subroutine mpi_bcast(data, n, datatype, node, comm, ierror)
real *8 function mpi_wtime()
subroutine mpi_get_count(istatus, datatype, icount, ierror)
subroutine mpi_send(data, n, datatype, iproc, itag, comm, ierror)
subroutine mxm_test_all(nid, ivb)