230 likes | 403 Views
Программирование на современном Фортране. Занимает лидирующее положение среди языков программирования, ориентированных на решение научно-технических задач, требующих большого объема вычислений
E N D
Программирование на современном Фортране • Занимает лидирующее положение среди языков программирования, ориентированных на решение научно-технических задач, требующих большого объема вычислений • Постоянно развивается и совершенствуется в соответствии с развитием вычислительной техники и технологий программирования • Накоплен огромный фонд прикладных программ • Удобство программирования • Эффективность выполнения программ • Стандартизация языка на международном уровне
Структура программы Программа состоит из программных единиц: • главная программная единица (PROGRAM); • подпрограмма(SUBROUTINE); • функция (FUNCTION); • блок данных (BLOCK DATA); • модуль (MODULE).
Лексемы • Имена (до 31 символа – в старых версиях 6) • Метки (не более 5 цифр) • Ключевые слова • Встроенные операции: + - * / ** - арифметические .NOT. .AND. .OR. .EQV. .NEQV. – логические .EQ. .LT. .LE. .GT. .GE. .NE. – отношения == < <= > >= /=
Формат исходного текста • Фиксированный (зафиксированы позиции строки) 1234567 С Длина строки 72 символа * 1-5 метка 123 A (I,J) = (A (I-1,J) + A (I+1,J) + A (I,J-1) * + A (I, J+1))/4 • Свободный ! Оператор со строкой продолжения A = ‘ Перенос строки на & & строку-продолжение’
Оператор IMPLICIT принцип умолчания: приписывание объектам типа по имени объекта I,J,K,L,M,N – INTEGER остальные – REAL INTEGER ICOUNT0 … ICOUNT0=ICOUNTO+1 IMPLICIT NONE ! Тип всех объектов должен быть ! объявлен явно
Базовые типы данных • Целый INTEGER I ! 34567 • Вещественный REAL X,Y,Z! -3.2 DOBLE PRECISION T! 12.6E-11 • Комплексный COMPLEX Z1, Z2 ! (2.5, -3.) • Логический LOGICAL L ! .TRUE. или .FALSE. • Символьный CHARACTER (LEN=6) C1, C2 ! ‘SUM’ или “PART1”
Производные типы данных TYPE BOOK CHARACTER (LEN = 30) TITLE CHARACTER (LEN = 20) AUTHOR INTEGER NUM_OF_PAGES END TYPE BOOK TYPE (BOOK) :: BOOK_1, BOOK_2 BOOK_1%AUTHOR = ‘Tolstoy’
Массивы REAL Z (100,200) REAL, DIMENSION (100,100) :: X,Y DIMENSION W (2:10, 3, -1:1) REAL, DIMENSION(21):: AR= (/(1.5,2.8, L=1,10), 6.4/) REAL, DIMENSION (:,:) ALLOCATABLE :: AR1, AR2 READ (*,*) NX,NY ALLOCATE ( AR1 (NX,NY), AR2 (NX,NY)) … DEALLOCATE (AR1, AR2, STAT = NUMB_ERR)
Массивы “по столбцам”
Секция массива REAL, DIMENSION :: Z (M,N), V(3), A (3,3) Z (3,:) – третья строка матрицы Z; Z (:,J) – J-ый столбец матрицы Z; Z (K1:K2, L1:L2:L3) – прямоугольная секция V = (/2, 1, 3/) A (3,V) - секция массива содержащая элементы: A(3,2), A(3,1) и A(3,3)
Операторы присваивания REAL X (10,20), Y(40), Z (-7:12), W (10,10) Z(1) = 7.4 Z = 7.4 X(10, :) = 2.9 * Y (2:40:2) +EXP(Z) Y (1:40) = Y (40:1:-1) Y (3:5) = Y (2:4) W(1:10, I) = X (J,1:10)
Присваивание по маске WHERE (A<0.0) A=0.0 WHERE (W /=Y) X(10, :) = (W+Y)/(W-Y) ELSEWHERE X(10, :) = 0.0 END WHERE
Условные операторы IF (X .LT. 0) X = -X IF (A .LT. 0.0) THEN X = A + 1.0 ELSE IF (A .EQ. 0.0) THEN X = A + 2.0 ELSE IF (A .LT. 3.0) THEN X = A + 3.0 ELSE X = A + 4.0 ENDIF … IF (N-10) 10, 20, 30
Конструкция выбора SELECT CASE (N) CASE (:-1) X = -N CASE (0, 4:6, 9) X = 0 CASE DEFAULT X = N END SELECT
Циклы DO 20 I = 10, 1, -2 WRITE (*,*) ‘I =', I 20 CONTINUE DO I = 1, 10 WRITE (*,*) ‘I =', I ENDDO
Циклы SUM=0.0 I=0 DO WHILE (I<5) ! WHILE (I<5) DO I=I+1 SUM=SUM + 1 ENDDO … DO I=I+1 SUM=SUM + 1 UNTIL (I<5)
Циклы DO WHILE (IND<5) IND=IND-1 IF (IND < 0) EXIT IF(IND==0) CYCLE … ENDDO LOOP1: DO WHILE (N<1000) READ *,N IF (N .EQ. SIGNAL) EXIT LOOP1 … ENDDO
Функции REAL FUNCTION FUNC(M,T) INTEGER M REAL T SAVE ICOUNT FUNC = 0.1*T * (M**2 + 14*M + 46) IF (FUNC .LT. 0) FUNC = 0.0 ICOUNT = ICOUNT + 1 RETURN END … IF (FUNC(I,X) .GT. FUNC(J,Y)) THEN …
Процедуры SUBROUTINE S (X,N,METHOD,PR) INTEGER, OPTIONAL :: PR, METHOD REAL, INTENT(OUT) :: X (N) INTEGER, INTENT(IN) :: N REAL WORK (N) ! Автоматический массив EXTERNAL FUNC WORK (1) = FUNC (1, X(1)) … END SUBROUTINE S CALL S (Y,N, PR=6)
Рекурсивная функция RECURSIVE FUNCTION FACTORIAL (N) RESULT (NFACTORIAL) INTEGER, INTENT (IN) :: N INTEGER NFACTORIAL SELECT CASE (N) CASE (0) NFACTORIAL = 1 CASE (1:) NFACTORIAL = N * FACTORIAL (N-1) CASE DEFAULT NFACTORIAL = -1 END SELECT END FUNCTION FACTORIAL
Оператор COMMON SUBROUTINE SUB1 (some arguments) declarations of arguments REAL ALPHA, BETA COMMON /COEFF/ ALPHA, BETA ! Описание общей области statements! памяти, доступной разным RETURN ! блокам. END SUBROUTINE SUB2 (some arguments) declarations of arguments REAL ALPHA, BETA COMMON /COEFF/ ALPHA, BETA statements RETURN END
Оператор DATA REAL A1, A2, A3 INTEGER M1, N1 DATA A1, A2, A3 /1., 2., 3./, M1 , N1 /1, -1/ REAL W1, W2, W3 DATA W1, W2, W3 / 3*0.0/ REAL AR (10, 10) DATA AR /100*1.1/ DATA AR(1,1),AR(10,1),AR(1,10),AR(10,10) /2*1.0, 2*2.0/
PROGRAM JAC PARAMETER (L=8, ITMAX=20) REAL A(L,L), EPS, MAXEPS, B(L,L) PRINT *, '********** TEST_JACOBI **********' MAXEPS = 0.5E - 7 DO IT = 1, ITMAX EPS = 0. DO J = 2, L-1 DO I = 2, L-1 EPS = MAX ( EPS, ABS( B( I, J) - A( I, J))) A(I, J) = B(I, J) ENDDO ENDDO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+ * A( I, J+1 )) / 4 ENDDO ENDDO PRINT 200, IT, EPS 200 FORMAT(' IT = ',I4, ' EPS = ', E14.7) IF ( EPS . LT . MAXEPS ) GO TO 3 ENDDO 3 OPEN (3, FILE='JAC.DAT', FORM='FORMATTED', STATUS='UNKNOWN') WRITE (3,*) B CLOSE (3) END