LINUX.ORG.RU

Fortran Python

 ,


1

1

Есть крутая прога для инженерных расчетов, эта прога выдает большой файл (порядка 200Гб, а то и пару терабайт) с результатами(бинарник).

У этой проги есть API для работы с файлами результатов. На Фортране.

Есть современная прога на Питоне, которая должна обработать все результаты и выдать свои результаты для результатов.

Кароче, надо как-то из питона вызывать фортан.

Я придумал фортраном вытаскивать результаты в бинарник и потом работать с ними. Вот

Ответ на: комментарий от Jini

Вот аналогичная программа на Fortran 2008. Как её изменить, чтобы она заработала?

Не знаю, я вообще проги не пишу :) Но тут (и ниже для d)

list => array_to_list_view(i, size(i), 4) ! sizeof?

наверняка стоит заменить size(i) на kind(i) - должно показать размер в байтах, хотя в gnu compiller есть sizeof, но это их собственное расширение.

Но лучше глянь примеры тут http://fortranwiki.org/fortran/show/Linked list

gen_list похоже на то, что тебе нужно

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от Jini

Для создания одного односвязного списка --- да, этого достаточно. Для создания библиотеки

Изначально ты ныл, что не можешь составить односвязных списков. Ты уж определить что ли.

Тогда сначала ты пруф, что я сектант.

Данный тред. И попытки оказать, что ты чего-то не можешь на тьюрингово-полном языке.

Ну а как я тебе должен доказывать? Я утверждаю, что что-то сделать невозможно. Ты утверждаешь обратное. Я должен доказать отсутствие что ли? Ты что, и в Бога веришь?

Докажи, что чего-то нельзя сделать на полном по Тьюрингу языке.

Критического мышления у тебя нет, иначе ты бы видел, что про мои задачи мы вообще не говорили. Или ты хочешь сказать, что фортран не хуже питона во всех задачах?

В числодробилках (мы говорим о них) - фортран лучше пистона. Но не для гуманитариев.

Твои жалкие попытки попытки меня оскорбить забавны, но утомительны. Я начинаю терять остатки интереса к дискуссии. От тебя приходит слишком мало мыслей для размышления.

Слив засчитан.

Эта сложность никак не связана с выбором языка программирования. Здесь сложность в самой задаче. Особенности языка программирования начнут сказываться когда программист будет её формализовывать.

Чувак, формула (математическая) тот же програмный код по своей сути. Язык математики - самый высокий уровень абстракции, т.к. математика сама по себе асбтрактная наука.

Но на одних языках его делать проще, чем на других.

Я это оспаривал? Но пистон не тот язык, на котором проще.

Такие же ссылки я находил когда решал задачу. Вот программа на C99. В ней два массива, один int, другой double, преобразуются в списки, списки разворачиваются и печатаются. В программе продублирован лишь код печати списков и собственно последовательность действий, для наглядности. Функции list_reverse пофигу какие там типы данных в списках. Функция array_to_list_view написана для произвольного типа данных.

Мне тебя похвалить?

Вот аналогичная программа на Fortran 2008. Как её изменить, чтобы она заработала?

Читаешь код. Читаешь доки по языку. Правишь как хочешь.

Вот программа на GNU Fortran. Она работает, но в ней используются нестандартные расширения: Cray pointers и функция loc. Во-первых, они нестандартны, причём это не из тех расширений, что при необходимости добавляются сторонней библиотекой (как практически всё в std в C++). Если целевой компилятор их не умеет, то всё, скорее всего будет проще эту часть переписать на C, чем портировать.

Я тебя удивлю, тот же numpy - не стандартная либа питона. Не понимаю в чем претензия.

Во-вторых, в этом расширенном фортране получаются два вида указателей с разным синтаксисом для работы с ними. Это, опять же, недостаток, затрудняющий создание интерфейса библиотеки.

Охоспади. Еще один субъект, которому лень учить пару дополнительных API.

В-третьих, синтаксис для работы с Cray pointers крайне неудобен, так как переменные приходится объявлять парами и всюду работать с ними через побочные эффекты вида «изменили значение указателя, обработали значение переменной». Впрочем, я уже понял, что эстетические вкусы у нас совершенно разные и приводить этот аргумент бесполезно.

Тебе шашечки или ехать? Называл бы тред - хочу решение, которое удовлетворяет моим влажным фантазиям. Претензий бы не было.

Вообще, складывается ощущение, что фортран всеми силами старается оградить программиста от прямой пработы с памятью, но при этом не предоставляет никаких механизмов для решения проблем, которые в том же C решаются через void*. Это один из тех случаев, когда программа думает, что она умнее пользователя.

Видимо так и есть, судя по этому треду. А так - фортран не для этого делался. Нужна прямая работа с памятью - идите куда-нибудь в С или Rust. Asm.

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

Пишите на лиспе.

Алгоритм --- в императивной. Моё определение подходит и для других.

Закрывайте пустословие

В отличие от тебя, я стараюсь строго формулировать термины, в которых я веду дискуссию. Похоже, у тебя просто не математический склад ума (кто из нас гуманитарий?).

Чувак, у меня дисер по матану, если что) Вы не строго формулируете термины, а пытаетесь подобрать их в удобном свете для себя. Это называется подмена понятий.

Ну давай, покажи мне как ты будешь делать сортировку двух массивов разных типов разного размера с заданными операторами сравнения. Твоя очередь писать код. Можешь взять пузырьковую сортировку, сам алгоритм не имеет значения.

Кто вы такой, чтобы я для вас писал код? Окей, могу. Час работы стоит 100 евро. Хотите? Нет? так и думал.

Одна и та же задача на разных языках реализуется с разными усилиями. При этом разница во временных затратах может быть колоссальна. Что-то мне надоело тривиальные вещи рассказывать...

Так не цитируй википедию. Как бы я этого не отрицал. Просто ты говоришь о пистоне, т.к. это твой бог. Ты не можешь даже аргумент привести почему не фортран. Только словоблудие. Слив засчитан, чувак.

Я смотрю, ты целый один учебник прочитал и на большее тебя не хватило? Для fortran-only «программистов» это весьма характерно.

Я пишу на многих языках. Кстати, фортран как раз не знаю на столько хорошо, чтобы писать код или быть ментором. И очень много писал и пишу на питоне. Поэтому могу сказать - это недоязык

silver-bullet-bfg ★★
()
Ответ на: комментарий от grem

А что толку? Односвязный список там всё равно будет реализовываться через создание своего типа, внутри которого будет указатель на этот же тип, не?

Правильно, но нужен ещё указатель на данные.

На самом деле в Fоrtran есть целочисленный указатель (просто pointer), который всегда типа «integer(4)» (для переменной любого типа) и указатель-ссылка (используется в паре pointer-target).

Да. Первый ещё называется Cray pointer и это нестандартное расширение, которое, правда, поддерживается всеми известными мне компиляторами. В моём третьем варианте списки реализованы через них.

Это называется скрытие реализации, что нормально для языка высокого уровня.

Нормально когда есть альтернативы.

Зато сколько проблем пораждается в C за счёт отсуствия подобных скрытий.

Спорное утверждение.

Емнип и если я вообще правильно понимаю, то в C реализация такого примера (передача аргументом имени произвольной функции для подстановки, пример не мой) будет через указатели на функции:

А это и в фортране указатели на функции, только они записаны в другом синтаксисе.

Jini ★★
()
Ответ на: комментарий от grem

наверняка стоит заменить size(i) на kind(i) - должно показать размер в байтах, хотя в gnu compiller есть sizeof, но это их собственное расширение.

Да, спасибо, я не вспомнил название функции kind().

Но лучше глянь примеры тут http://fortranwiki.org/fortran/show/Linked list

( aedeph_ тоже) Эту ссылку я тоже видел шесть лет назад :). Не могу сейчас вспомнить что именно мне в ней не понравилось. Возможно, то, что для хранения указателей надо объявлять составной тип и потом вся эта многословность при работе с данными списка.

Пожалуй, я готов признать, что в фортране можно сделать односвязный список. Дальше мне углубляться не хочется. Спасибо за ссылки.

Jini ★★
()
Ответ на: комментарий от Jini

kind()

то есть size оставить, а вместо 4 и 8 kind

это и в фортране указатели на функции, только они записаны в другом синтаксисе.

ну вот тут реализация скрыта

grem ★★★★★
()
Ответ на: комментарий от Jini

это и в фортране указатели на функции, только они записаны в другом синтаксисе

Для C (если это C) еле написал методом множественного тыка (пойду возьму с полки пирожок).

Fortran ($ gfortran deg_test.f95):

program degtest
  implicit none
  intrinsic asin, acos, atan

  write (*, "(A16, F6.2)") 'F: arcsin(0.5) = ', deg(asin,0.5)
  write (*, "(A16, F6.2)") 'F: arccos(0.5) = ', deg(acos,0.5)
  write (*, "(A16, F6.2)") 'F: arctan(1.0) = ', deg(atan,1.0)

  contains
    real function deg(f, x)
      implicit none
      intrinsic atan
      real, external :: f
      real, intent(in) :: x

      deg = 45*f(x)/atan(1.0)
    end function deg

end program degtest
C ($ gcc deg_test.c -lm), без параметра "-lm" не соберётся:
#include <stdio.h>
#include <math.h>

int main()
{
  double (*pf)(double);
  double deg(double pf(double), double x);

  printf("C: arcsin(0.5) = %5.2f\n", deg(&asin, 0.5));
  printf("C: arccos(0.5) = %5.2f\n", deg(&acos, 0.5));
  printf("C: arctan(1.0) = %5.2f\n", deg(&atan, 1.0));

  return 0;
}

double deg(double pf(double), double x)
  {
    return 45.0*( pf(x) )/atan(1.0);
  }

Работает, но запись double deg(double pf(double), double x); смущает, глазах от «double» двоится.

grem ★★★★★
()
Ответ на: комментарий от Jini

Слив зачитан. Для справки - неплохо было бы практиковаться, а не только заниматься цитированием учебников.

silver-bullet-bfg ★★
()
26 апреля 2017 г.
Ответ на: комментарий от Jini

Как насчёт аналога ... шаблонов?

Есть быоа такая штука как Forpedo, в ней можно написать что-то похожее на шаблон, а она потом генерит за тебя код для разных типов на Fortran95. Но с тех пор как появились generic и transfer, этот проект не поддерживается. С другой стороны, ничто мешает его использовать в рамках кода совместимого с f95.

Возможно, это чуть удобнее mp4 и других методов.

grem ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.