1               program cmge

2               include 'mpif.h'

3               include 'type'

4               integer ktype(NDIM)

5               real*8 x(NDIM),y(NDIM),value(NDIM)

6               real*8 wx(NDIM),wy(NDIM)

7               real*8 uk(NDIM),vk(NDIM),dfi(NDIM)

8               real*8 ax(NDIM),ay(NDIM),afi(NDIM)

9               real*8 EP0,EP,EK0,EK,E10,E1,EF0,EF,SQ0,SQ,DelE1a,DelE1o

10              real*8 fr,x0,t,dt,tmin,tmax

11              CHARACTER  cGfile*11,dGfile*11,eGfile*11,fGfile*16

12       1111   format(4f12.6)

13       1112   format(1000(f10.6,1x))

14       1113   format(a12,7f10.5)

15       1114   format(I5,3X,e12.5,3X,e12.5,3X,e12.5,3X,e12.5,3X,

16            *       e12.5,3X,e12.5)

17       1115   format(i5,f14.8,f14.8)

18              call MPI_Init(ierr)

19              comm=MPI_COMM_WORLD

20              call MPI_Comm_rank(comm,my_id,ierr)

21              call MPI_Comm_size(comm,np,ierr)

22              t_all=MPI_Wtime()

23              OPEN(1,FILE='new.dat')

24                call  input(nnod,nn,nr,nl,x,y,ktype,value,

25            *         fr,tmin,tmax)

26              close(1)

27              if (my_id.eq.0) then

28                cGFile(1:4)='cmge'

29                dGFile(1:4)='mest'

30                eGFile(1:4)='time'

31                write(cGFile(5:8),'(I4.4)') nnod

32                write(cGFile(9:10),'(I2.2)') np

33                write(dGFile(5:8),'(I4.4)') nnod

34                write(dGFile(9:10),'(I2.2)') np

35                write(eGFile(5:8),'(I4.4)') nnod

36                write(eGFile(9:10),'(I2.2)') np

37                call output(nnod,cGfile)

38              end if

39              i_shag=int(nnod/np)

40              i_step=i_shag*my_id

41              if (i_shag*np.lt.nnod) then

42                i_shag=i_shag+1

43                i_step=i_shag*my_id

44              end if

45              if (my_id.eq.np-1) then

46                i_shag= nnod-i_step

47              end if

48              dt=tmin

49              X0=-5.d0

50              kt=0

51              CALL Solit(nnod,nn,nr,nl,x,y,ktype,value,X0)

52              CALL Redefine_CoordY(X(Nn),Y(Nn),0.99d0,Nr-Nn+1,1)

53              CALL Redefine_CoordY(X(Nl),Y(Nl),0.99d0,nnod-Nl+1,-1)

54              Iter=1

55              T=0.d0

56       556    continue

57              t_begin=MPI_Wtime()

58              if (my_id.eq.0) then

59                write(*,1115) Iter,T,dt

60              end if

61              t_metod=MPI_Wtime()

62              call metod(nnod,x,y,value,ktype)

63              t_metod=MPI_Wtime()-t_metod

64              t_iter=MPI_Wtime()

65              CALL iteration(Nnod,dGfile)

66              t_iter=MPI_Wtime()-t_iter

67              do i=1,nnod

68                if (ktype(i).eq.0) then

69                  wx(i)=value(i)

70                  wy(i)=c(i)

71                else

72                  wy(i)=value(i)

73                  wx(i)=c(i)

74                end if

75              end do               

76              CALL VELOXY(nnod,nn,nr,nl,x,y,wx,wy,uk,vk,dfi,

77            *      dt,tmin,tmax)

78              Call Ener(nnod,nn,nr,nl,x,y,wx,wy,dfi,EP,EK,E1,SQ)

79              IF(T.Eq.0.D0) Then

80                EP0=EP

81                EK0=EK

82                E10=E1

83                EF0=EF

84                SQ0=SQ

85              EndIf

86              DelE1a=E10-E1

87              DelE1o=(E10-E1)*100/E10

88              if (my_id.eq.0) then

89                fGFile(1:4)='ener'

90                write(fGFile(5:8),'(I4.4)') nnod

91                write(fGFile(9:10),'(I2.2)') np

92                open(UNIT=3,FILE=fGfile(1:10)//'.rez',

93            *       ACCESS='APPEND')

94                  WRITE(3,1114)ITer,T,EP,EK,E1,DelE1a,DelE1o

95                close(3)

96              end if    

97              DO I=NR+1,NL-1

98                KTYPE(I)=0

99                VALUE(I)=wx(I)+(0.5*(UK(I)**2+VK(I)**2)-

100       *            Y(I)/(Fr**2))*dt

101           X(I)=X(i)+UK(I)*dt

102           Y(i)=Y(I)+VK(I)*dt

103         EndDo

104         t=t+dt

105         if (my_id.eq.0) then

106           OPEN(2,FILE=cGfile(1:10)//'.rez',ACCESS='APPEND')

107             DO I=1,Nnod

108               WRITE(2,1111) X(I),Y(I),wx(i),wy(i)

109             end do

110             write(2,1113) '[ITERATION]',t,dt,EP,EK,E1,

111       *                   DelE1a,DelE1o

112           close(2)

113         end if

114         Iter=Iter+1

115         t_end=MPI_Wtime()-t_begin

116         if (my_id.eq.0) then

117           write(*,*) 'time=',iter,t_end,t_iter,t_metod

118           OPEN(4,FILE=eGfile(1:10)//'.rez',ACCESS='APPEND')   

119             write(4,*) iter,t_end,t_iter,t_metod

120           close(4)

121         end if    

122         if (t.ge.20.d0) goto 2200

123         goto 556

124  2200   Continue     

125         call MPI_Finalize(ierr)      

126         STOP

127         end

Рис. 66. Листинг управляющего блока фортран-программы для реализации алгоритма решения нестационарной задачи