Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Топ:
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2017-09-30 | 247 |
5.00
из
|
Заказать работу |
|
|
Поскольку forall не цикл, а перечисление параллельных процессов, то напрашивающаяся аналогия с циклом ограниченна.
В ряде случаев операторы do и forall одинаковы по действию. Тривиальный пример:
Integer, dimension (1:4):: A
A=0! параллельные действия
forall (i=1:4)! параллельные действия
A(i)=0
End forall
do i=1,4! последовательные действия
A(i)=0
End do
Простой пример, из книги Немнюгина, иллюстрирующий разницу между do и forall
1. Используется оператор Do
integer,dimension (1:4):: A=(/ 1,2,3,4 /)
Do i=2,3! последовательные действия
A(i) = A(i-1) + A(i) + A(i+1)
Enddo
Получим
A(2) = A(1) + A(2) + A(3)=1+2+3=6
A(3) = A(2) + A(3) + A(4)=6+3+4=13! A(2)=6 - изменившееся значение
2. Оператор forall, перечисляющий параллельные процессы над исходными значениями массива, – те же по виду действия дают другой ответ
forall ( i=2:3)! параллельные действия
A(i)=A(i-1)+A(i)+A(i+1)! подставляется значение A(2)=2
! то же по-другому A(i)= sum (A(i-1:i+1)) - проясняет суть дела
End forall
Получим
A(2) = A(1) + A2) + A(3)=1+2+3=6
A(3) = A(2) + A(3) + A(4)=2+3+4=9! A(2)=2 исходное значение
A(2:3) = (/ sum (A(1:3)), sum (A(2:4)) - всё разъясняет: берем старые значения, а заносим новые значения A
и ни к чему здесь forall - это чисто академический стиль
Нетрудно заметить внешнее сходство Do - цикл и forall - как бы цикл по параллельным процессам. Не проходит аналогия forall с циклом foreach из языка PHP.
Есть кардинальное отличиецикла и перечисления параллельных процессовforall:
- doзадает последовательность действий, которые выполняются над скалярами либо целиком векторами;
- forall задает параллельные действия, которые выполняются над компонентами векторов, матриц, многомерных массивов, секциями с непременным требованием конформности условия и действий;
- doработает с текущими значениями массивов, а forall как бы работает с двойной памятью - использует стартовые значения массивов, а формирует новые значения.
|
Парафлоид – один оператор вместо двадцати
В этом разделе показан более сложный пример вычисления парафлоида -квадратной матрицы минимальных расстояний между вершинами ориентированного графа с взвешенными дугами. Граф задан квадратной матрицей инцидентности. Строки и столбцы матрицы соответствуют вершинам графа. Инцидентные дуги соответствуют положительным компонентам матрицы. Схематично показано вычисление меры близости вершин графа по методу Флойда.
Таблица 29.
Пример вычисления парафлоида в операторе forall
A | J | |
i | parafloid(i,j) = minval(A(i,:)+A(:,j)) | A(i,:)- строка i |
A(:,j)- столбец j |
С целью упрощения на схеме не показаны условия положительной определенности, дополнительно прописанные в операторе forall.
Парафлоид - единственный выполняемый оператор
program parafloida
Implicit none
integer, parameter:: N=10
! A - взвешенная входная матрица инцидентности
integer, dimension (1:n,1:n):: A=1, parafloid
! парафлоид parafloid - выходная матрица мин. расстояний
integer i,j
forall (i=1:n, j=1:n, i/=j) &
parafloid(i,j) = minval (A(i,:)+A(:,j), &
mask = A(i,:)>0.and. A(:,j)>0)
write (6,1) (parafloid(i,:),i=1,n)
1 format (1x,<n>i3)
end program parafloida
Попробуйте написать программу paraseqva с помощью традиционных конструкций – и Вы увидите, что она будет на порядок сложнее: вместо одного оператора - программа из 20 операторов.
program paraseqva! взвешенная входная матрица инцидентности
Implicit none
integer, parameter:: N=10
integer, dimension (1:n,1:n):: A=1, parafloid
! парафлоид - выходная матрица мин. расстояний
integer i,j
integer, dimension (1:n):: str,stlb, summa
integer parafloidMin,i1
open (6,file='parafloid.txt')
do i=1,N
A(i,i)=0
Enddo
do i=1,N
do j=1,N
if (i/=j) then
parafloidMin = huge (0)! #7fffffff
do i1=1,N
str=A(i,i1); stlb=A(i1,j); summa(i1)=str(i1)+stlb(i1)
Enddo
do i1=1,N
if (str(i1)==0.or. stlb(i1)==0) cycle
if (summa(i1)<parafloidMin) parafloidMin = summa(i1)
Enddo
parafloid(i,j) = parafloidMin
Else
parafloid(i,j) = 0
Endif
Enddo
Enddo
write (6,1) (parafloid(i,:),i=1,N)
1 format (1x,<N>i3)
end program paraseqva
Пример парафлоида – многогранный:
- A(i,:)- i-ая строка и A(:,j)- j-ый столбец заданы секциями двумерного массива, образующими векторы;
|
- конформные векторы A(i,:) и A(:,j) - суммируются A(i,:)+A(:,j), образуя новый вектор положительно определенных крестообразных сумм;
- из сумм выбирается минимум при помощи итоговой функции minVal, формируя элемент парафлоида;
- forall задаёт перебор в пространстве секции, совпадающей с положительно определёнными недиагональными элементами матрицы;
- данныйforall имеет объём вычислений, пропорциональный O (N3).
Ввод и вывод в Фортране
Ввод и вывод осуществляется операторами readиwrite (по-русски «читаем/пишем»). После операторов read и write в скобках записываются аргументы. Первый аргумент (целое) – условный номер устройства, с которого/на который осуществляется ввод/вывод. Всегда открыта для ввода/вывода консоль, имеющая номер 0 или обозначаемая символом «*».
Второй аргумент – ссылка на формат ввода/вывода. Символ «*» в качестве второго аргумента означает, что ввод/вывод выполняется без формата. Бесформатную форму чаще всего применяют при вводе и для отладочной печати. Если важны не только сами значения, но и форма их представления, то используют форматный вывод.
Бесформатный ввод/вывод
Бесформатный ввод/вывод выполняется под управлением списка
read (u,*) список_переменных
write (u,*) список_переменных_констант_выражений
Пример: прочитать переменные p и k и вывести их для контроля:
integer k; real p
read (1,*)p, k; write (2,*)’p=’, p, ’k=’, k
Обмен данными происходит в порядке следования элементов списка. В операторе read с устройства №1 читается сначала p, потом k. В операторе write на устройство №2 в одной строке выводятся последовательно: надпись «p=», значение p, надпись «k=», значение k.
Данные для ввода подготавливают через запятую, пробел или <Enter> – конец строки. Запись одинаковых чисел упрощает повторитель, например 8,8,8,8,8,8,8, легче записать как 7*8 (в данном случае «7*» – это повторить 7 раз следующее число).
Ввод/вывод по списку переменных, с каждой как «p= значение_p»:
Namelist /имя_Namelist / список_переменных! подробности – в помощи
read (u,имя_Namelist) или write (u,имя_Namelist)
Форматный вывод
Вывод без формата, применимый при отладке программ, дискомфортен для пользователя. Для создания привлекательного программного продукта требуется максимум внимания уделить оформлению результатов. Сочетая гибкость и математическую строгость, форматный вывод тут незаменим.
|
Фортран выгодно отличается от других языков тем, что ввод и вывод – операторы языка, и можно выверить форматы еще при компиляции. Концепция форматного вывода Фортрана настолько продуманна, что практически не изменялась с момента его появления. Формат размещают в любом месте программы и пишут следующим образом
m format (СД), где m – метка, по которой один или несколько операторов write ссылаются на оператор format, СД – список дескрипторов.
Пример:
real radius = 1
Open (2, file=’Out.txt’)
write (2,55) 2*3.14*radius
55 format (1x,'длина окружности'/2x,'с=',F5.2)
Здесь оператор write, используя оператор format с меткой 55, выводит в файл Out.txt две строки (символ «˜» означает пробел)
длина окружности
˜˜c=˜6.28
Дадим разъяснения:
– «длина окружности» и «с=» – пояснительные надписи;
- символ «/» – признак перехода к новой строке при выводе;
- 2x – 2 пробела,
- F5.2 – поле вещественного числа шириной в пять позиций с двумя цифрами, выводимыми после десятичной точки.
Уникальный СД может быть записан непосредственно внутри оператора write в виде строковой переменной или константы, например,
write (2, "(1x,'c=',F5.2) ") c
Внимание! Такой СД не контролируется компилятором, и ошибки выявятся на этапе счета, в отличие от использования оператора format.
Независимо от того, где СД записан – в операторе format или в операторе write, должны соблюдаться следующие правила:
1. СД заключен в скобки, элементы СД разделены запятыми или символом «/» по концу выводимой строки;
2. повторяющуюся последовательность дескрипторов заменяет повторитель, записанный перед дескриптором; например, вместо i4,i4 пишут 2i4;
3. повторяющуюся группу дескрипторов заменяет повторитель, записанный перед скобками, заключающими эту группу; например, вместо 1x,i4,i4,i4, 1x,i4,i4,i4 пишут 2(1x,i4,i4,i4) или, еще короче, 2(1x,3i4).
4. Все повторители, ширины полей – это явные натуральные константы или целочисленное выражение в угловых скобках < >;
5. дескрипторы в Фортране обозначены одной, реже двумя латинскими буквами, и подразделяются на:
- дескрипторы числовых данных I, F, E, D и универсальные G, Z;
- дескрипторы нечисловых данных A, L, и универсальные Z, G;
|
- оформительские дескрипторы: ”текст”, ’текст’, X, P, SS, SP, T, TR, TL, «:», «\», «/».
Дескрипторы данных
Таблица 30.
Тип | Дескрипторы | Примеры |
integer k | iw | write(1,"(1x,I5)")k |
real x | Fw.d - без порядка Ew.d - с порядком Gw.t - с порядком и без | write(1,"(1x,F7.2)")x write(1,"(1x,E11.2)")x write(1,"(1x,G11.2)")x |
double precision d | Dw.d - двойная точность | write(1,"(1x,D20.13)")b |
Пояснения к форматному выводу чисел:
1. w -общая ширина поля, задаваемая по усмотрению программиста, число будет прижато к правому краю и дополнено слева пробелами, если число не поместится в отведенное поле, то увидим «*****»;
2. для вещественных чисел количество цифр задается параметрами:
d – сколько цифр после десятичной точки в дескрипторах F, E, D;
t – сколько значащих цифр в универсальном дескрипторе Gw.t, компьютер «решит», выводить число с порядком, как E или без как в F;
3. для вывода чисел с большим по модулю или неизвестным порядком рекомендуется применять E, D, G.
Выводимая строка прижимается к левому краю поля.
Таблица 31.
Дескрипторы нечисловых данных
Тип | Дескриптор | Примеры | Примечания |
Logical M | Lw | write(1,"(1x,L5)")M | Вывод только «T» или «F» |
Character[*c] S | Aw | write (1,"(A5)") S | Усекается или дополняется справа пробелами в зависимости от соотношения w и c. |
m format [*c] S | A | write (1,"(1x,A)")S | ширина поля c, указана в описании строкиCharacter[*c]. |
|
|
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!