|
=============================
Пример:
ПЛОХО | Структурирование |
Lab_MPI СПбГУ 2007г. кафедра вычислительной физики | |
program main_mpi include 'mpif.h' integer rank, tag, cnt, ierr, status(mpi_status_size) real sndbuf, rcvbuf tag = 0 sndbuf = 3.14159 cnt = 1 call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world, rank, ierr) if (rank.eq.0) then call mpi_recv(rcvbuf, cnt, mpi_real, 1, tag, mpi_comm_world, status, ierr) call mpi_send(sndbuf, cnt, mpi_real, 1, tag, mpi_comm_world, ierr) else call mpi_recv(rcvbuf, cnt, mpi_real, 0, tag, mpi_comm_world, status, ierr) call mpi_send(sndbuf, cnt, mpi_real, 0, tag, mpi_comm_world, ierr) end if call mpi_finalize(ierr) stop end | ! Комменьарий, что за программа ! и кто автор program main_mpi IMPLICIT NONE! упростите себе отладку include 'mpif.h' integer rank, tag, cnt, ierr, status(mpi_status_size) real sndbuf, rcvbuf tag = 0 sndbuf = 3.14159 cnt = 1 call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world, rank, ierr) if (rank.eq.0) then call mpi_recv(rcvbuf, cnt, mpi_real, 1, tag, mpi_comm_world, status, ierr) call mpi_send(sndbuf, cnt, mpi_real, 1, tag, mpi_comm_world, ierr) else call mpi_recv(rcvbuf, cnt, mpi_real, 0, tag, mpi_comm_world, status, ierr) call mpi_send(sndbuf, cnt, mpi_real, 0, tag, mpi_comm_world, ierr) end if call mpi_finalize(ierr) stop end |
5. Условный оператор IF
Условное выполнение блоков операторов (IF THEN ELSE)
В языке Фортран, аналогично другим языкам программирования, имеется конструкция IF THEN ELSE условного выполнения блоков операторов. Простейший вариант такой конструкции имеет вид:
IF( <выражение> ) THEN
<Операторы -- тело блока>
END IF
Здесь <выражение> - логическое выражение, а <тело блока> - последовательность выполняемых операторов (возможно, ни одного). Конструкция работает следующим образом. Если выражение истинно, операторы тела блока выполняются. В противном случае они пропускаются, и выполняется оператор, стоящий сразу за "закрывающей скобкой" ENDIF.
В качестве выражения часто используется «Выражения отношения»
Выражение отношения устанавливает отношение типа "больше", "равно", "меньше" результатов вычисления двух арифметических выражений.
Оно имеет вид: Е1 <операция> Е2
где Е1 и Е2 - арифметические выражения, а <операция> - один из следующих знаков операции:
Знак операции Значение операции
F90 F77
==.EQ. (equal to) равно
/=.NE. (not equal to) не равно
>.GT. (greater than) больше чем
>=.GE. (greater than or equal to) больше или равно
<.LT. (less than) меньше чем
<=.LE. (less than or equal to) меньше или равно
Выражение отношения имеет значение "истина", если результаты вычисления арифметических выражений Е1 и Е2 удовлетворяют значению операции.
Пример. Если значение I больше J то, переменные меняются значениями:
IF(I.GT. J) THEN
TEMP = I
I = J
J = TEMP
END IF
Расширением этой конструкции является добавление альтернативных блоков действий:
IF( <выражение> ) THEN
<Операторы -- тело блока>
ELSEIF( <выражение> ) THEN
<Операторы -- тело блока>
ELSE
<Операторы -- тело блока>
END IF
Задание: Решите задачу 1102
Указания:
Данные во входном файле записаны в одну строку, поэтому следует использовать один оператрор READ для чтения всех 2-х чисел.
В оператор чтения READ добавьте через запятую чтение 2-ой переменной.
6. Логические операции.
В предыдущем разделе логическое выражение получалось с помощью операций отношения. Другие логические выражения строятся спомощью скобок и логических операторов, указанных в таблице
Логический Оператор | Операция | Приоритет |
.NOT. .AND. .OR. .EQV. .NEQV. | Отрицание = НЕ Конъюнкция = И Включающая дизъюнкция = ИЛИ Эквивалентность Неэквивалентность | Наивысший Средний Средний Низший Низший |
Пример: (A>B).AND. (A>C) – имеет значение ИСТИНА, тогда и только тогда, когда A – строго наибольшее число из чисел A, B, C
Задание: Решите задачу 1103.
Обратите внимание и проверьте свои программы: Вывод заголовка программы должен предшествовать основной РАБОТЕ программы
!!!Указания к задачам решаемым на занятии:!!!