Я являюсь абсолютным новичком в FORTRAN и стараюсь преобразовать исходный файл из 1000 строк FORTRAN в MATLAB для моего собственного использования. Я до сих пор прекрасно себя чувствую, вкладывая в кучи PRINT
заявления, чтобы отслеживать переменные и обеспечивать правильную работу математики. Я пришел к странному происходящему в ФОРТРАН, который я не могу решить.Где FORTRAN получает эти значения?
Существует подпрограмма, которая определяется как так
subroutine addprc
complex tmat,b,ci,c1,c2,cim,ab1(50),ab2(50),acans(10,2),fg1(50),fg2(50)
common dtr,rtd,pi
common /mtxcom/ nrank,nranki,tmat(50,50),b(50,50),cmxnrm(25)
common /cmvcom/ nm,kmv,cmv,twm,prodm
Существует немного более common
и dimension
распределения ниже, но они не должны быть актуальными. В первый раз, когда определен массив ab1(50)
, в этой подпрограмме. Для моего сценария MATLAB я инициализировал его как ab1=zeros(1,50);
. Затем она используется в этом цикле (в FORTRAN):
do 20 n = 1,nrank
np = n+nrank
cn = real(n)
n1 = n+1
c1 = 4.0*ci**n
c2 = 4.0*ci**n1
p1 = cn*costh*pnmllg(n1)-(cn+cmv)*pnmllg(n)
p2 = cmv*pnmllg(n1)
ab1(n-ij) = c1*p2*uu1
ab1(np-ijt) = -c2*p1*uu1
ab2(n-ij) = -c1*p1*uu2
ab2(np-ijt) = c2*p2*uu2
Я проверил значение все остальные переменные в этой точке, и они согласны с моим сценарием MATLAB. Работая в обратном направлении, я обнаружил проблему, что как-то ab1
уже содержит значения. Команда печати непосредственно перед циклом, например.
PRINT *,'before ab1', SUM(ab1)
do 20 n = 1,1
(107.500008, 5.38305187)
. Это сложное число, так что два значения являются точными, но что не замечательно в том, что у него есть что-то в нем вообще? Infact единственный раз, когда используется ab1
, находится в этом блоке кода.
Есть ли что-нибудь, что мне не хватает здесь? Я просмотрел исходный файл (ctrl-f: ab1), чтобы найти его. Исходный источник - это .for-файл, и я скомпилировал их в Eclipse с помощью gfortran. Спасибо за ваше время.
re: общие блоки неактуальны, имейте в виду, если символ является общим блоком, некоторые другие программные единицы могут получить доступ к этому общему блоку с разными именами символов. – agentp
Где находится цикл 'ij'' ijt'? – ja72
@george: Я заметил это поведение от других переменных. Единственное, что я не уверен в том, как узнать, что его использует, поскольку это первый раз, когда определен 'ab1'. @ ja72 Цикл 'ij'' ijt' определен немного раньше, как показано ниже. 'ij = kmv-1, если (ij.lt.0), ij = 0 ijt = 2 * ij', поэтому ничего необычного. –