1               program cmge

2               include 'mpif.h'

3               include 'type'

4               integer ktype(NDIM)

5               real*8  x(NDIM),y(NDIM),value(NDIM),pi,angle1,angle2

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

7               real*8  yc,xl,xr,yl,yr,fr,eps

8               real*8  dd,dd1,qi,qii

9               complex*16 z(NDIM),iq,tmp,tmp2,v1,v2

10              complex*16 v_a(NDIM)

11              INTEGER*2  irow,dummy,ixl,ixr,iyl,iyr

12              CHARACTER cGfile*11,dGfile*11,eGfile*11,

13            *           fGfile*16,tGfile*11

14              call MPI_Init(ierr)

15              comm=MPI_COMM_WORLD

16              call MPI_Comm_rank(comm,my_id,ierr)

17              call MPI_Comm_size(comm,np,ierr)

18              t_all=MPI_Wtime()

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

20                call input(nnod,nn,nr,nl,x,y,ktype,value,fr,eps)

21              close(1)

22              call MPI_Barrier(comm,ierr)           

23              if (my_id.eq.0) then

24                fGFile(1:4)='cmge'

25                dGFile(1:4)='mest'

26                eGFile(1:4)='time'

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

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

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

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

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

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

33              end if

34              i_shag=int(nnod/np)

35              i_step=i_shag*my_id

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

37                i_shag=i_shag+1

38                i_step=i_shag*my_id

39              end if

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

41                i_shag= nnod-i_step

42              end if

43              lxnul=nr+(nl-nr)/2

44              CALL Redefine_Coord(X(nr),Y(nr),0.99d0,Lxnul-nr+1,1)

45              CALL Redefine_Coord(X(lxnul),Y(lxnul),

46            *      0.99d0,nl-Lxnul+1,-1)

47              Iter=1

48              step=0.01

49              it=1

50       1000  continue

51              t_begin=MPI_Wtime()

52              If(It.Eq.2) Then

53                Fr1=Fr

54                Fr=Fr-step

55                fGFile(1:1)='V'

56                write(fGFile(2:5),'(I4.4)') nnod

57                write(fGFile(5:8),'(I4.4)') NINT(Fr1*10000)

58                Iter=1

59                OPEN(5,file=fGfile(1:8)//'.rez')

60                  DO I = 1,Nnod

61                    READ(5,*) k,X(I),Y(I),Ktype(I),Value(I)

62                  ENDDO

63                CLOSE(5)

64              End If

65       556    continue

66              YC=Y(lxnul)

67              yh=1.d0

68              DO I=nl,Nr+2,-1

69                QI=DSQRT(1.d0-(1.d0-Fr*Fr)*(Y(I)-YH)/(YC-YH))

70                QII=DSQRT(1.d0-(1.d0-Fr*Fr)*(Y(I-1)-YH)/(YC-YH))

71                SI =DSQRT((X(I)-X(I-1))**2.d0+(Y(I)-Y(I-1))**2.d0)

72                value(I-1)=value(I)+(QI+QII)*SI/2.d0

73              EndDo

74       104    Format(1x,I4,2(2x,E15.9),2x,I2,2x,2E15.9)

75       1232   format(2f10.5,i2,f10.5)

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

77       2222   format(e20.10)

78              t_metod=MPI_Wtime()

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

80              t_metod=MPI_Wtime()-t_metod

81              t_iter=MPI_Wtime()

82              CALL iteration(Nnod,dGfile)

83              t_iter=MPI_Wtime()-t_iter

84              do i=1,nnod

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

86                   wx(i)=value(i)

87                   wy(i)=c(i)

88                else

89                   wy(i)=value(i)

90                   wx(i)=c(i)

91                end if

92              end do               

93              DO I= Nr+1,Nl-1

94                y(i)=y(i)-(wy(i)-1.d0)

95              end do

96              Iter=Iter+1

97              SMAX=0.d0

98              DO I=Nr+1,Nl-1

99                IF(SMAX.LE.DABS(wY(I)-1.d0)) SMAX=DABS(wY(I)-1.d0)

100         end do

101         t_end=MPI_Wtime()-t_begin

102         if (my_id.eq.0) then

103           write(*,*) iter,eps,smax,y(lxnul),Fr

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

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

106           close(4)

107         end if

108         if(smax.le.eps) goto 1111

109         goto 556

110         t_all=MPI_Wtime()-t_all

111         if (my_id.eq.0) then

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

113             write(4,*) iter,t_all

114           close(4)

115         end if

116  1111   Frud=Dsqrt(2.*(Yc-1.)/(1.-Fr*Fr))

117         if (my_id.eq.0) then

118           tGFile(1:1)='V'

119           write(tGFile(2:5),'(I4.4)') nnod

120           write(tGFile(5:8),'(I4.4)') NINT(Fr*10000)

121           OPEN(15,file=tGfile(1:8)//'.rez')

122             It=2

123             Fr1=Fr

124             DO I = 1,Nnod

125               Write(15,104) I,X(I),Y(I),Ktype(I),Value(I)

126             ENDDO

127             ah=y(lxnul)-1.d0

128             Write(15,*) 'Амплитуда=',Ah

129             Write(15,*) Iter-1

130             Write(15,*) 'ПАРАМЕТР V=',Fr,'ЧИСЛО ФрудА FR=',

131       *     Frud

132             write(15,*) Frud,ah

133             WRITE(15,*) 'максимальное отклонение=',Smax

134           CLOSE(15)

135           OPEN(2,FILE='cmge.rez',ACCESS='APPEND')

136             write(2,*) fr,frud,ah,iter

137           close(2)

138         end if

139         It=2

140         t_end_all=MPI_Wtime()-t_all

141         if (my_id.eq.0) then

142           OPEN(7,FILE='time_all.rez',ACCESS='APPEND')

143             write(7,*) 'P: ',np,' N: ',nnod,' F: ',

144       *                 fr,' T: ',t_end_all

145          close(7)   

146         end if    

147         IF(FR.GT.0.00001) goto 1000

148         call MPI_Finalize(ierr)     

149         STOP

150         end

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