Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на ФОРТРАН, как общего так и конкретного характера.
Постарайтесь дать как можно больше информации о возникшей проблеме -- это в конце концов в ваших же интересах чтобы вам помогли...

прежде чем просить помощи в задании
платное решение задач

ресурсы этого топика
ссылка на подборку ресурсов, собранных посетителями этого форума
 
то, чем мы решили поделиться
ссылка на страничку программ etc собственного изготовления, которыми любезно делятся наши форумчане


если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
 
просьба к пишущим и отвечающим все большие листинги оформлять тегом more
и отключать графические смайлики при размещении фортран-кода

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 18:11 14-01-2007 | Исправлено: akaGM, 09:47 01-03-2020
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
warever

Цитата:
Ну во-первых, присутствует неподдельное желание научиться программировать,

Ну вообще субж - не тот язык, с которого стоит начинать учиться программированию.
Но если есть опыт с Маплом - может и нормально пойдёт (кстати Мапл вроде умеет запускать из под себя фортрановский код, так что в этом смысле тоже правильный вариант).
 

Цитата:
теперь им не обойтись, задача там непростая

Интересно, что же это за задача такая на диплом.
 
В общем учитывая это
Цитата:
Имеет собственный язык программирования, напоминающий Паскаль.
, я бы порекомендовал изучение программирования начать именно с Паскаля (если вы разобрались с Маплом, месяца точно должно хватить). Это нужно именно чтобы разобраться с процедурной методологией программирования (субж тоже такой, так что пригодится) + получить некий алгоритмический базис.
 
А вот уже потом изучение субжа я бы начал с использования ещё одной Мапловской фичи: возможность генерировать фортрановский код из Мапла. Чтобы скорейшим образом провести аналогии между Маплом, Паскалем и Фортраном.
 
Ну а потом уже по книжкам попробовать.
 
Но даже после всего этого я бы поостерёг от написания серьёзных программ полностью на субже - гораздо эффективнее использовать интерфейс и возможности Мапла для ввода, вывода и обработки данных и только тогда, когда скорости Мапла начинает не хватать, использовать описанное мною в начале свойство Мапла - работать с кодом на Фортране.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 00:07 17-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
gtk-fortran
 
круто...
а для Qt есть чё-нить подобное?
 
warever
не знаю как дела обстоят в Maple, а вот в Математике даже есть непосредственная генерация фортран-кода, но мне больше нравится Матлаб, там это дело ещё и с Си можно легко увязать, и даже свой С-компилятор встроен (не свой конечно, Lattice C, что даже лучше)

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 00:29 17-11-2011 | Исправлено: akaGM, 00:31 17-11-2011
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
Цитата:
А у интела обновления нету
Я ставил версию 10-дневной давности.
Цитата:
или спросить их на этот счет?
Да я как-то сбоку.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 09:46 17-11-2011
OlGu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
 
Не могу найти ответ на казалось бы простой вопрос:
 
как сделать так, чтобы при прямом доступе к файлу новая запись записывалась с новой строки? Или это вообще невозможно?
 
Нужно для адекватного восприятия файла визуализатором.
 
Заранее спасибо.

Всего записей: 6 | Зарегистр. 17-11-2011 | Отправлено: 21:55 17-11-2011
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OlGu
Ну можете просто класть в него символ переноса строки.
Байтовые значения тут:  http://www.robelle.com/smugbook/ascii.html
В Windows строки заканчиваются CR+LF, в *nix LF.  Только потом если прямым доступом читать будете о них лучше помнить

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 22:04 17-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OlGu
а что у тебя представляет собой запись?
через record или как?

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 23:40 17-11-2011
OlGu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
попробовал ставить "LF" в конце записи - она не выводится, но и на новую строку не переводит..  
 
akaGM
запись я описываю только в open параметром recl, вообще вся процедура записи выглядит примерно так:
 
open(0, file='test.txt', access='direct', recl=35, form='formatted')
write(0,fmt="(a16)", rec=1) 'variables = x, u'
write(0,"(a9,i6)", rec=2) 'zone i = ', 2
write(0,fmt="(f16.8,3X, f16.8)", rec=3) x1, u1
write(0,fmt="(f16.8,3X, f16.8)", rec=4) x2, u2
close(0)
 
Файлы с таким заголовком нужны для Tecplot. Причём как выяснилось, при том что выводится всё в одну строку, Tecplot рисует все привильно! Единственная проблема теперь, что визуально просматривать файл неудобно..

Всего записей: 6 | Зарегистр. 17-11-2011 | Отправлено: 15:35 19-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OlGu
тебе нужно каждую строчку "смотреть"?
тогда вот так вроде надо...
character*2 CRLF
parameter (CRLF=char(13)//char(10))
write(101,fmt="(f16.8,3X, f16.8, a2)", rec=3) x1, u1, CRLF
 

Цитата:
open(0)
ну ты даешь...
советую хотя бы так open(101, )

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 17:11 19-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите, пожалуйста, команду для динамическового перевыделения памяти. Допустим, я создал массив
 
real *8, allocatable:: mas(
allocate (mas(100500))
 
и в процессе работы мне потребовалось увеличить размер массива. Я так понимаю, это технически возможно (наприме, в Си есть команды malloc для выделения памяти и realloc для перевыделения), но нужную мне команду в справке фортрана я не нашел. Создавать новый массив с нужным размером памяти и убивать старый - не вариант, так как на краткий момент времени требуемая оперативная память увеличивается примерно вдвое.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 00:52 20-11-2011
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
нет в фортране realloc
пока только так, с одной копией и одним move_alloc
 

Код:
program test_move_alloc
    integer, allocatable :: a(:), b(:)
 
    allocate(a(3))
    a = [ 1, 2, 3 ]
    print *, a    
    allocate(b(5))
    b=a
    call move_alloc(b, a)
     
    print *, allocated(a), allocated(b)
    print *, a
end program test_move_alloc

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 01:25 20-11-2011 | Исправлено: terminat0r, 01:43 20-11-2011
ttrfdvs

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос - кто нибудь использует Open64 AMD Fortran ?
 
Я поставил себе под Ubuntu 64x,  но с настройкой компилятора не получается.
На сайте написано кратко по настройкам переменных и маршрутов  для запуска компилятора.
Делаю так же, но ничего не работает.
 
ЕСЛИ кто пользуется Open64  - дайте список настроек переменных среды и маршрутов  
у меня он сидит в /opt/open64
 
если явно указать маршрут к компилятору, то он запускается
 
/opt/open64/bin/openf90 --version
Open64 Compiler Suite: Version 5.0
Built on: 2011-11-09 11:16:36 +0800
Thread model: posix
GNU gcc version 4.2.0 (Open64 5.0 driver)
 
но библиотек не находит

Всего записей: 7 | Зарегистр. 22-10-2011 | Отправлено: 01:43 20-11-2011
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ttrfdvs
"маршрут", это что-то новенькое :)
 
 
не пользовался но проблема у вас кажись тривиальная и к фортрану не относится
если используется bash то в ~/.bashrc добавить строки
 
 
export PATH=/opt/open64/bin:$PATH
export LD_LIBRARY_PATH=/opt/open64/lib64_или_где_там_эти_библиотеки_его:$LD_LIBRARY_PATH

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 01:49 20-11-2011
ttrfdvs

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сделал, но сразу не заработало.
 
Разобрался, нужно после редактирования bashrc
запустить  bash
 
СПАСИБО !!!

Всего записей: 7 | Зарегистр. 22-10-2011 | Отправлено: 02:27 20-11-2011 | Исправлено: ttrfdvs, 02:33 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
плохо дело(  
 
А в чем принципиальная трудность создания аналога realloc в фортране? В си же так можно, причем это делается без создания временной копии массива

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 02:35 20-11-2011
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
да никакой трудности нет, возможно немного надо помучится с многомерными массивами и полиморфизмом, но это все решаемо, так как люди все это уже давно сделали в плюсах и явах и иже с ними. Хотя бы для элементарных случаев сделали вместо пихания всякой чепухи в стандарт
 
дело действительно плохо, сравните
 

Код:
program reallocate
    integer, allocatable :: a(:),temp(:)
    integer :: n,i
    character(100) :: arg
    call get_command_argument(1, arg)
    read(arg,*) n
    allocate(a(1))
    a=1
    do i=2,n-1
        allocate(temp(i))
        temp=0
        temp(1:i-1) = a
        call move_alloc(temp,a)
        a(i) = i
    end do
    print *,sum(a)
end program

 
gfortran realloc_fortran.f90 -o realloc_fortran.x
 
 

Код:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
 
int main(int argc,char **argv) {
    if(argc<2) {printf("bad args\n"); exit(1);}
    int n = atoi(argv[1]);
    int *data = malloc(sizeof data[0]);
    for(int i=1;i<n;i++) {
        data = realloc(data,(i+1)*sizeof data[0]);
        if(!data) abort();
        data[i] = i;
    }
    int sum=0;
    for (int i=1; i<n; i++)
   {
     sum = sum + data[i];
   }
   printf("%d \n", sum);
}

 
gcc --std=c99 -O3 realloc_c.c -o realloc_c.x
 
 

Код:
time ./realloc_fortran_if.x  100000
704982704
 
real    0m6.345s
user    0m3.378s
sys    0m2.961s
 
time ./realloc_c 100000
704982704  
 
real    0m0.009s
user    0m0.005s
sys    0m0.003s

 
Весело?

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 02:48 20-11-2011 | Исправлено: terminat0r, 03:00 20-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r

Цитата:
int *data = malloc(sizeof data[0]);
теперь так можно, типа sizeof стал оператором что ли?
 
stepanoxus

Цитата:
Создавать новый массив с нужным размером памяти и убивать старый - не вариант, так как на краткий момент времени требуемая оперативная память увеличивается примерно вдвое.
а можно сначала убить...
у тебя что, требование сохранять содержимое в этом перевыделяемом массиве?

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 12:59 20-11-2011
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r

Цитата:
Весело?

Нехороший пример, в стиле "индийского кода". А realloc быстрее move_alloc именно в этом примере, в реальных приложениях это обычно не так. Дело в том что вы выделяете память для одного и того же массива и потому realloc имеет возможность просто наращивать кусок памяти. В реальных приложениях вы будете делать ещё что-то, работать с другими массивами итд, поэтому realloc не найдя возможности "нарастить" память (потому как после вашего массива лежит ещё что-то там) будет искать непрерывный блок и найдя его также как и move_alloc скопирует всё туда и ваши тайминги для F и C тут же ссинхронизируются .
Имхо именно поэтому realloc никогда не был приоритетом для введения в стандарт, так как частое его использование не рекомендуется (время+фрагментация памяти).
 
Добавлено:

Цитата:
Создавать новый массив с нужным размером памяти и убивать старый - не вариант, так как на краткий момент времени требуемая оперативная память увеличивается примерно вдвое.  

И в realloc будет происходить тоже самое (ну разве что вы будете писать в точности то что написал terminat0r).
Точнее не так, если наращиваемый массив будет единственным растущим тогда трюк с realloc должен прокатить. Иначе - нет.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 13:12 20-11-2011 | Исправлено: FuzzyLogic, 13:17 20-11-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r

Цитата:
call move_alloc

А это реальное копирование?
И память там нужна будет на сумму размеров (или как с этим в С?)?
Если да, то этот вариант годится разве что для маленьких массивов.
 
 
stepanoxus

Цитата:
и в процессе работы мне потребовалось увеличить размер массива.

Как-то сразу подумалось, что нельзя так.
Но решил подождать ответа более знающих коллег.
 
Тогда получается, что можно попробовать использовать в коде на Ф работу с памятью через С.
Ведь передача параметров допускается, а значит (по крайней мере теоретически) можно написать соответствующие вызовы на С (а может быть уже есть и готовый апи) и вызывать их из Ф при необходимости.
 
В принципе можно решить эту проблему и средствами Ф, написав промежуточный уровень - менеджер массивов: то есть нужен будет общий пул массивов и механизм переадресации при доступе на этот пул. С использованием ООП-возможностей Ф такое точно можно сделать, а вот без - не уверен. Ну и возможно после этого по скорости Ф уже будет не на высоте (а может и не повлияет сильно).
 
Может можно и на common-ах что-то сделать, но это уже будет хак.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:20 20-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic прав, т.к.:

Цитата:
realloc returns a void pointer to the reallocated (and possibly moved) memory block.
...
the new block can be in a different location

 
KChernov

Цитата:
Тогда получается, что можно попробовать использовать в коде на Ф работу с памятью через С.

смешение двух менеждеров памяти и двух куч не вариант...

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 13:21 20-11-2011 | Исправлено: akaGM, 13:25 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
а можно сначала убить...  
 у тебя что, требование сохранять содержимое в этом перевыделяемом массиве?

да, именно так.  
 
FuzzyLogic

Цитата:
И в realloc будет происходить тоже самое (ну разве что вы будете писать в точности то что написал terminat0r).  
 Точнее не так, если наращиваемый массив будет единственным растущим тогда трюк с realloc должен прокатить. Иначе - нет.

У меня динамическое выделение памяти требуется для двух массивов - один целый, другой вещественный, оба одного размера. Суть проблемы в чем - хочется решать как можно большую СЛАУ на персональном ноутбуке без распараллеливания и сохранения матриц на жесткий диск. Т.е. все входные данные должны храниться в RAM, которой всего 6 Гб. Для решателя требуется четыре массива - два известной длины (n, размер задачи), длина двух других - неизвестной длины (nNonZeros, количество ненулевых элементов матрицы СЛАУ).  Для количества ненулевых элементов есть оценка сверху, но она неэффективна (примерно в 3 раза завышает фактическое значение). А хочется хранить входные данные максимально сжато, чтобы можно было решать задачи как можно большей размерности.  
 
Задачу можно попытаться решить с другого конца -  подойдет забивание почти всей RAM памятью под эти два массива, затем уменьшение выделенного под них места до фактически необходимого. Можно как-то узнать длину наибольшего непрерывного свободного блока памяти в таком случае? То есть нужно узнать такое наибольшее N, чтобы выполнилась команда allocate (mas1(N),mas2(N))

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 15:33 20-11-2011 | Исправлено: stepanoxus, 15:36 20-11-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru