Программирование на современном Фортране Занимает лидирующее положение среди языков программирования, ориентированных на решение научно-технических задач, требующих большого объема вычислений Постоянно развивается и совершенствуется в соответствии с развитием вычислительной техники и технологий программирования Накоплен огромный фонд прикладных программ Удобство программирования Эффективность выполнения программ Стандартизация языка на международном уровне
Структура программы Программа состоит из программных единиц: главная программная единица (PROGRAM); подпрограмма (SUBROUTINE); функция (FUNCTION); блок данных (BLOCK DATA); модуль (MODULE).
Лексемы Имена (до 31 символа – в старых версиях 6) Метки (не более 5 цифр) Ключевые слова Встроенные операции: + - * / ** - арифметические.NOT..AND..OR..EQV..NEQV. – логические.EQ..LT..LE..GT..GE..NE. – отношения == >= /=
Формат исходного текста Фиксированный (зафиксированы позиции строки) С Длина строки 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 ! Вещественный 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
Условные операторы IF (X.LT. 0) X = -X IF (A.LT. 0.0) THEN X = A ELSE IF (A.EQ. 0.0) THEN X = A ELSE IF (A.LT. 3.0) THEN X = A ELSE X = A 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
Циклы DO WHILE (IND
Функции 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 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 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