KChernov Цитата: Да и не всегда логично собирать все константы в одном модуле, а делать заплаточное решение не хочется
Я сечас работаю с коммерческой программой с открытым кодом ( по крайне мере большей его частью) Программа позволяет симулировать различные физические явления, т.е. теплоперенос, гидродинамика, химические реакции, кристализация, механическая деформация... и так далее. Естественно можно симулировать все сразу или в любых физически возможных комбинациях. Количество переменных и массивов просто огромное. Соответственно каждый отдельный модуль имеет свой собственный хидер файл. Например часть кода ответственная за решение теплопшереноса имеет хидер файл "heat.fh" . Если мне гдето не хватает заданных переменных относяшихся к решению теплопереноса, я просто вначале подпрограммы пропишу:
INCLUDE 'heat.fh'
Все. Естественно хидер файлов может быть несколько, соответственно все глобальные переменные (которые вы используете не только в локально в подпрограмме) прописанны в хидерах и отсортированны по физическому смыслу. Так что зря вы жалуетесь на нелогичность. Не нравится собирать все константы в одном файле, зделайте несколько. Рассортируйте как вам удобно. При желании весь проэк можно разбить на папки. В одной папке хидеры, в другой папке только вайлы решателя, в третей файлы расчета тепла,... и так далее....
Цитата: В моих задачах размерности могут меняться, а задавать так все возможные варианты - не выход.
Ну хороше, не нравятся константы, задайте как переменные, запихните их в common block совместно с SAVE стайтментом и все это в хидере.
Но только недавно вы говорили что вы хотите массывы задавать через параметр... Ну и если вам нужны переменные границы массива то вы либо чегото вырезаете или меняете форму массива, и небойсь еще и динамически задаете массив как allocatable. Иначе при чем здесь переменные размеры массива???
На использование хидера(ов) это не как не влияет. Из за использования SAVE переменные измененные в подпрограмме в commmon блоке будут сохранятся. Соответственно ничего не надо передавать из подпрограммы в основную программу и назад. Вся передача данных через common block, прописанный в хидере.
Пример использования хидеров я уже давал.... Но если массив переменных размеров и динамически задаваемый... то тут нюансов я сам не представляю... Наверно можно зделать так:
! файл bounds.fh
INTEGER Amin,Amax
INTEGER Bmin,Bmax
INTEGER Cmin,Cmax
COMMON /bounds_d/ Amin,Amax,Bmin,Bmax,Cmin,Cmax
SAVE /bounds_d/
! конец файла bounds.fh
PROGRAM testB
implicit none
include 'bounds.fh'
real, allocatable d
! Задаем размеры массива ( можно и расчитать....)
Аmin=-5
Amax=5
Bmin=0
Bmax=10
Cmin=-1
Cmax=1
! allocate array in memory
allocate (d(Amin:Amax,Bmin:Bmax,Cmin:Cmax))
! Передаем массив в подрпрограмму:
! границы передавать нет необходимости
call podrpr(d)
deallocate(d)
END
SUBROUTINE podrpr(d)
implicit none
include 'bounds.fh'
real d(Amin:Amax,Bmin:Bmax,Cmin:Cmax)
! операции внутри подпрограммы
return
Думаю что работать будет. Можно еще использовать module. S.Chapman писал про это с одной из своих книженций... типа "Sharing data using modules" Но тут я уже не советчик. Самому интересно почитать.