Путаница на Фортране, модули, объявления, фиктивные аргументы

моя проблема состоит в том, чтобы интегрировать функцию с помощью интеграции romberg. Я пересдаю этот курс и успешно закончил последний семестр, но на этот раз мой профессор требует модули, которые я никак не мог понять. Другой проблемой всегда были пустые аргументы. Базовая схема такая

Global variable module >
Main prog >
external fn within prog >                       
subprogram romberg (module, uses function)

Я поместил свою переменную "x" в модуль глобальных переменных, но не уверен, где мне нужен интерфейс и где мне нужен оператор USE. Я не могу скомпилировать модуль romberg, потому что он не видит переменную x, которую я объявил, независимо от того, где я ее разместил.

MODULE globvar
IMPLICIT NONE
INTEGER,PARAMETER:: dp=selected_real_kind(15)
REAL(dp)::a,b,epsil,cp,h,x,mu
REAL(dp),PARAMETER::pi=3.141592653589, m=45000.0, D=1.032, Ts=250.0, k=0.153
INTEGER::maxit,nt,n,exitflag
END MODULE globvar

Ромберг Мод

MODULE romod
CONTAINS

SUBROUTINE Romberg(f,a,b,nt,epsi,maxit,exitflag,n)
IMPLICIT NONE
INTEGER, PARAMETER :: dp = selected_real_kind(15)
REAL(dp),INTENT(IN)::a,b
INTEGER,INTENT(IN)::epsi,maxit
INTEGER,INTENT(OUT)::exitflag
INTEGER,INTENT(INOUT)::nt
REAL(dp),DIMENSION(maxit+1,maxit+1)::T
REAL(dp)::sone,stwo,h
INTEGER::r,n,I,j,k

INTERFACE !Interface function ! I was told this wasnt needed then it was
FUNCTION f(x)
USE globvar
IMPLICIT NONE
INTEGER::f
END FUNCTION f
END INTERFACE

Romberg algorithm omitted, unless asked for. x is being passed to an upper and lower limit
END SUBROUTINE Romberg

END MODULE romod

Основная программа

PROGRAM Waste
USE globvar
USE romod
IMPLICIT NONE
INTEGER, EXTERNAL::f

INTERFACE
FUNCTION f(x)
USE globvar !Use Module Variables
IMPLICIT NONE
INTEGER::f
END FUNCTION f
END INTERFACE

read prompts

CALL Romberg(f,a,b,nt,epsi,maxit,exitflag,n)

END PROGRAM Waste

FUNCTION f(x)
USE globvar !Use Module Variables
IMPLICIT NONE
INTEGER::f

f=x**3

END FUNCTION f

END PROGRAM Waste

Любая помощь будет оценена по достоинству. Я уже пятый семестр использую Фортран, и некоторые правила до сих пор ускользают от меня.


person Jake    schedule 10.09.2015    source источник
comment
Если вы запросите помощь с университетским заданием и закончите фразой «Я не люблю тратить день на отладку», вы не получите много ответов. Возможно, вам следует перефразировать, чтобы сосредоточиться конкретно на одной проблеме, например «где мне нужен интерфейс». Возможно, на этот вопрос уже был дан ответ stackoverflow.com/ поиск?q=fortran+интерфейс   -  person widged    schedule 10.09.2015
comment
Спасибо, буду продолжать искать. Справедливости ради, это мой 5-й семестр в серии из 3-х занятий по инженерной специализации, и Фортран был моей ключевой задачей. В конце концов, это просто занимает слишком много времени, когда есть другие занятия, на которых нужно сосредоточиться, которые столь же интенсивны.   -  person Jake    schedule 10.09.2015
comment
Есть ли у вас веская причина для того, чтобы функция f была внешней? Вы, конечно, можете сделать это таким образом (и вы близки), но это чище и без интерфейса, если вы этого не сделаете.   -  person Ross    schedule 10.09.2015
comment
Я думаю, что ваша непосредственная проблема заключается в том, что вы пытаетесь определить x дважды - один раз как глобальную переменную, а также как входные данные для функции f. Должны ли они быть одинаковыми?   -  person Ross    schedule 10.09.2015
comment
Единственная причина, по которой он является внешним, заключается в том, что профессор просит, чтобы он был внешним, иначе я бы обернул его в основную программу, чтобы упростить ситуацию. Единственное, что он упомянул в качестве фиктивных аргументов, это имя функции, используя fun1 для основной программы и внешней функции и f в подпрограмме. Эта же логика использовалась в прошлом семестре, но только давала мне ошибки. Когда я сделал это, все вокруг было скомпилировано. Я взял x из глобального модуля и сделал INTENT(IN::x) в функции, и она скомпилировалась просто отлично! Спасибо. Теперь моя проблема в том, что мой файл a.out/a.exe не запускается локально или на школьных серверах.   -  person Jake    schedule 10.09.2015
comment
@Jake Что вы имеете в виду, не будет работать - можете ли вы отредактировать вопрос, чтобы включить новое сообщение об ошибке? Кроме того, рассмотрите возможность добавления @Ross при ответе на мой вопрос - так я увижу его быстрее.   -  person Ross    schedule 10.09.2015
comment
Извините, @ross, я привыкаю к ​​этому сайту как к ресурсу. Я очень ценю помощь. Моя команда a.out не работала, но я обнаружил, что должен использовать ./a.out, чего никогда не было. На моем локальном компьютере я застрял в цикле выполнения в моем алгоритме Ромберга, но когда я подключился к своим университетским серверам, программа запустилась, но доставила мне проблемы, нужно многое учитывать. Я предполагаю, что это из-за синтаксических ошибок и потратил некоторое время на проверку вычислений. Могу написать более конкретную тему. Кажется, я не могу вывести свой ответ ромберга на переменную в основной программе.   -  person Jake    schedule 10.09.2015
comment
@ross Перед моим интегралом стоит константа (var/pi*var), но интегрируется вся функция, что может быть проблемой. В любом случае, я ценю, что вы нашли время в течение дня, чтобы помочь мне.   -  person Jake    schedule 10.09.2015


Ответы (1)


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

предположим, у меня есть «глобальная» переменная x через use module как в вызывающей программе, так и в функции, и я делаю это:

 USE globvar
  ...
 x=2
 y=3
 z=f(y)

..

 function f(x)
 USE globvar
 f=x^2

!! х 2 или 3 ?? Конечно, это логически непоследовательно и не скомпилируется. (и компилятор не будет удовлетворен, если вы будете старательно вызывать только f(x) )

Мой совет — избегать использования глобальных переменных вообще.

re: interface, в вашей функции нет ничего, что требовало бы явного интерфейса.

person agentp    schedule 10.09.2015