subroutine etchh(iam, nodes, ierr) c- include 'mpif.h' c integer iam, nodes integer ierr, status(MPI_STATUS_SIZE) c double precision stime,etime,htime double precision sinit,endtime,wholtime double precision dummy1, dummy2 real*8 r,dt,dx,dy,dx2,dy2,w,tol,tol1,t,b real*8 u1t(1650,1650),u1new(1650,1650),temp1(1650,1650) real*8 u2t(825,1650),u2new(825,1650) c integer tctime,ctime,ttime,itercnt,time,tend,start double precision tctime,ctime,ttime,time,tend,start integer idummy1, idummy2, itercnt integer maxrow1,maxcol1,maxrow2,maxcol2,a1,a2 integer i,j,k,maxsiz,sum,maxtime,itime,transiz,transiz1 integer realsiz,intsiz,matsiz,numnodes,maxnod,internod integer allnodes,npid,numrows1,numrows2,extra1,extra2 character*1 u2out(825,1650) character*12 fname, gname c- parameter(maxsiz = 1650) parameter( transiz = 2722500) parameter( matsiz = 2722500) parameter(transiz1 = 1361250) c common / both / dt,dx,dy,w,tol,b,r common / ireg1 / maxrow1,maxcol1,a1,maxrow2,maxcol2,a2 common / inidt1 / maxnod,internod,maxtime common / inidt2 / t common / rows / numrows1,numrows2,extra1,extra2 common / top /temp1 common / bottom / u2t common /newtop/ u1new common /newbot/ u2new common /perf/time,ctime,dummy1 common /iperf/idummy1, idummy2, itercnt c- c matsiz = maxsiz*maxsiz c- write(6,*) 'please print the name of the input file' read(5,*) fname write(6,*) 'please print the name of the output file' read(5,*) gname open(unit = 20, file = fname) open(unit = 21, file = gname) c c- read initializing data from file "input" c read(20,*) tol,tol1,w,maxrow1,maxcol1,maxrow2,maxcol2,maxtime read(20,*) a1,a2,c,b,dt,dx,dy c write(6,*) 'please print "maxtime" [integer] ' read(5,*) maxtime write(6,*) 'please print "b" [float] ' read(5,*) b write(6,*) 'please print "dt" [float] ' read(5,*) dt write(6,*) 'message from node#', iam, 1 '- number of processors are = ' 1, nodes c write(21,900)tol,tol1,w,maxrow1,maxrow2,maxcol1,maxcol2,maxtime write(21,910)a1,a2,c,b,dt,dx,dy read(20,*) maxnod,internod c if(nodes.eq.4) then maxnod=3 internod=2 elseif (nodes.eq.8)then maxnod=7 internod=6 elseif (nodes.eq.16)then maxnod=15 internod=13 elseif (nodes.eq.32)then maxnod=31 internod=27 elseif (nodes.eq.64)then maxnod=63 internod=53 else endif c write(21,920) maxnod,internod write(6,920) maxnod,internod close(20) c- c- Initialize values for the matrix u1t,u2t c- do 100 i = 1,maxrow1 do 110 j = 1,maxcol1 u1t(i,j) = 0.0 110 continue 100 continue c- do 120 i = 1,maxrow2 do 130 j = 1,maxcol2 u2t(i,j) = 0.0 130 continue 120 continue c- c- Initialize constants c- numrows1 = maxrow1 /(internod + 1) numrows2 = maxrow2 /(maxnod - internod) extra1 = maxrow1 - ( numrows1*(internod + 1)) extra2 = maxrow2 - (numrows2*(maxnod-internod)) dx2 = dx*dx dy2 = dy*dy r = 1.0/dt + 2.0/dx2 + 2.0/dy2 t = 0.0 c c- send initalizing data to the nodes c do 121 i = 1, nodes-1 call MPI_SEND(maxnod,3,MPI_INTEGER,i, 1 51, MPI_COMM_WORLD, ierr) call MPI_SEND(t,1,MPI_DOUBLE_PRECISION,i, 1 55, MPI_COMM_WORLD, ierr) call MPI_SEND(numrows1,4,MPI_INTEGER,i, 1 75, MPI_COMM_WORLD, ierr) call MPI_SEND(dt,7,MPI_DOUBLE_PRECISION,i, 1 101, MPI_COMM_WORLD, ierr) call MPI_SEND(maxrow1,6,MPI_INTEGER,i, 1 111, MPI_COMM_WORLD, ierr) 121 continue c .......................................................... sinit = MPI_WTIME() c .......................................................... do 400 itime = 1,maxtime write(6,*) 'time step = ', itime stime = MPI_WTIME() c c t = t + dt c- do 160 k = 1, internod do 155 i = 1,maxrow1/2 do 155 j = 1,maxcol1 temp1(i,j) = u1t(i,j) 155 continue call MPI_SEND(temp1,transiz,MPI_DOUBLE_PRECISION,k, 1 130, MPI_COMM_WORLD, ierr) do 157 i = maxrow1/2+1,maxrow1 do 157 j = 1,maxcol1 temp1(i,j) = u1t(i,j) 157 continue call MPI_SEND(temp1,transiz,MPI_DOUBLE_PRECISION,k, 1 131, MPI_COMM_WORLD, ierr) 160 continue c- c- do 170 i = internod+1,maxnod call MPI_SEND(u2t,transiz1,MPI_DOUBLE_PRECISION,i, 1 140, MPI_COMM_WORLD, ierr) 170 continue c- receive data back from the nodes call etch6n(iam, nodes, ierr) ttime = 0 tctime = 0 write (21,*)' Node: ',iam,' no of iterations ',itercnt write (21,*)' total time ',time,' total calc time ', ctime ttime = ttime + time tctime = tctime + ctime do 300 i = 1,maxnod call MPI_RECV(time,3, 1 MPI_DOUBLE_PRECISION, i, 1 400+i, MPI_COMM_WORLD, status, ierr) call MPI_RECV(itime,3,MPI_INTEGER,i, 1 1400+i, MPI_COMM_WORLD, status, ierr) write(21,*)' Node: ',i,' no of iterations ',itercnt write(21,*)' total time ',time,' total calc time ', ctime ttime = ttime + time tctime = tctime + ctime 300 continue c- c- c- start = 1 do 180 i = 0,internod if(i.gt.0) call MPI_RECV(temp1,transiz, 1 MPI_DOUBLE_PRECISION,i, 1 300+i, MPI_COMM_WORLD, status, ierr) do 185 k = 1,maxrow1/2 do 185 j = 1,maxcol1 u1new(k,j) = temp1(k,j) 185 continue c if(i.gt.0) call MPI_RECV(temp1,transiz, 1 MPI_DOUBLE_PRECISION,i, 1 500+i, MPI_COMM_WORLD, status, ierr) do 187 k = maxrow1/2 + 1, maxrow1 do 187 j = 1,maxcol1 u1new(k,j) = temp1(k,j) 187 continue c do 190 k = start, start + numrows1 -1 do 200 j = 1,maxcol1 u1t(k,j) = u1new(k,j) 200 continue 190 continue start = start + numrows1 180 continue c do 205 i = start,maxrow1 do 207 j = 1,maxcol1 u1t(i,j) = u1new(i,j) 207 continue 205 continue c- c- start = 1 do 210 i = internod+1,maxnod if(i.gt.0) call MPI_RECV(u2new,transiz1, 1 MPI_DOUBLE_PRECISION,i, 1 300+i, MPI_COMM_WORLD, status, ierr) if (i .eq. internod + 1) then tend = start + numrows2 -1 + extra1 else tend = start + numrows2 -1 endif do 220 k = start,tend do 230 j = 1,maxcol2 u2t(k,j) = u2new(k,j) 230 continue 220 continue start = start + numrows2 210 continue c etime = MPI_WTIME() htime = etime - stime c write(6,*) 'htime = ', htime write(21,*)' total time nodes',ttime, 1 'total time calc nodes',tctime write(21,*) ' total time host',htime c- write out solution at time t c- write(21,*)' at time t = ',t do 500 i = 1,maxrow2 do 500 j = 1,maxcol2 if ( u2t(i,j) .gt. tol1) then u2out(i,j) = '*' else u2out(i,j) = '-' endif 500 continue c- c- do 510 i = 1,maxrow2 write(21,1020)(u2out(i,j),j=maxcol2,3*maxcol2/4,-1) 510 continue write(21,*) do 511 i = 1,maxrow2 write(21,1020)(u2out(i,j),j=3*maxcol2/4-1,maxcol2/2,-1) 511 continue write(21,*) do 512 i =1,maxrow2 write(21,1020)(u2out(i,j),j=maxcol2/2-1,maxcol2/4,-1) 512 continue write(21,*) do 513 i=1,maxrow2 write(21,1020)(u2out(i,j),j=maxcol2/4-1,1,-1) 513 continue write(21,1030) c- c- end of time loop c- 400 continue c- c- format statements for output c- 900 format( t5,'tol = ',g10.5,t25,'tol1 =',g10.5/ 1 t5,' w = ',g10.5/ 2 t5,'maxrow1 = ',i4,t25,'maxrow2 = ',i4/ 3 t5,'maxcol1 = ',i4,t25,'maxcol2 = ',i4/ 4 t5,'maxtime = ',i4) 910 format( t5,'a1 = ',i4,2x,'a2 = ',i4/ 1 t5,'c = ',g10.5,t25,'b = ',g10.5/ 2 t5,'dt = ',g10.5,2x,'dx = ',g10.5,2x,'dy = ',g10.5//) 920 format( t5,'maxnod = ',i4,' internod =',i4/) 1000 format(t10,21g8.2) 1010 format(/) 1020 format(t10,101A1) 1030 format(//) c- c endtime = MPI_WTIME() c wholtime = endtime - sinit c write(6,*) "whole_time= ", wholtime c- write(6,*) "END OF RUN " close(21) return end