Как сделать так, чтобы 2 подпрограммы fortran имели один и тот же выходной файл?

Мне нужен код для записи данных двух кругов, чтобы экспортировать их как анимацию (vmd). Это должно дать мне около 6000 данных (3000 на круг).

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

       Program circulo
       implicit double precision(A-H,O-Z)
       Character*4 W1,W6
       Character*4 W2,W7   
       Open(3,file='circular.xyz',access='append',action='readwrite')
       open(9,file='circular.dat',form='formatted',action='readwrite')
       Call Circular1
       Call Circular2
       Stop
       End 
c*******************************************************************************

       Subroutine Circular1
       implicit double precision(A-H,O-Z)
       Dimension x(9000),y(9000),z(9000)
       Character*4 W1,W6
       W1='Rb'
       W6='   '
       Natomos = 1


       rewind(3)
       rewind(9)

       write(6,*) 'dame el valor del radio'
       read(5,*)Radio
       write(6,*) 'dame el valor del angulo inicial'
       read(5,*) Phio
       write(6,*) 'dame el valor de la velocidad angular'
       read(5,*) wo
       write(6,*) 'dame el valor de la aceleracion angular'
       read(5,*) alpha
       write(6,*) 'Estoy trabajando'

       Pi      = 3.1416
       Fact    = Pi/180.0d0
       Phio    = Phio*Fact
       Nciclos = 3000
       t       = 0.0
       dt      =0.005
       do i = 1,Nciclos
            write(3,*)Natomos
            write(3,*)
            Phi  = Phio + wo*t +.5*alpha*t*t
            x(i) = Radio*cos(Phi)
            y(i) = Radio*sin(Phi)
            z(i) = 0.0
            t    = t + dt
            write(9,23)x(i),y(i)
            write(3,12)w1,w6,x(i),y(i),z(i)       
       end do
23     FORMAT(2F15.6)
12     FORMAT(A4,A8,3F22.6)

       close(9)
       close(3)

       RETURN
       END subroutine
c**************************************************************************

       Subroutine Circular2
       implicit double precision(A-H,O-Z)
       Dimension a(9000),b(9000),c(9000)
       Character*4 W2,W7
       W2='Hg'
       W7='   '
       Natomos = 1


       rewind(3)
       rewind(9)

       write(6,*) 'dame el valor del radio2'
       read(5,*)Radio2
       write(6,*) 'dame el valor del angulo inicial2'
       read(5,*) Phio2
       write(6,*) 'dame el valor de la velocidad angular2'
       read(5,*) wo2
       write(6,*) 'dame el valor de la aceleracion angular2'
       read(5,*) alpha2
       write(6,*) 'Estoy trabajando'

       Pi      = 3.1416
       Fact    = Pi/180.0d0
       Phio2    = Phio2*Fact
       Nciclos = 3000
       t       = 0.0
       dt      =0.005
       do i = 1,Nciclos
            write(3,*)Natomos
            write(3,*)
            Phi  = Phio2 + wo2*t +.5*alpha2*t*t
            a(i) = Radio2*cos(Phi)
            b(i) = Radio2*sin(Phi)
            c(i) = 0.0
            t    = t + dt
            write(9,23)a(i),b(i)
            write(3,12)w2,w7,a(i),b(i),c(i)       
       end do
23     FORMAT(2F15.6)
12     FORMAT(A4,A8,3F22.6)

       close(9)
       close(3)

       RETURN
       END subroutine

В Фортране вы можете написать модуль «'и читать с устройства'» для взаимодействия с командной строкой. Жестко запрограммированные 3 и 9 могут быть неправильными на некоторых платформах. Точно так же рекомендуется избегать "низких" (скажем, менее 10) номеров файловых единиц, поскольку они могут конфликтовать с некоторыми предустановленными единицами.

Pierre de Buyl 10.09.2018 09:03

В вашем коде close(9) в Circular1 означает, что Circular2 не будет записывать в файл, указанный в операторе открытия. Вместо этого он перейдет к имени файла, зависящему от платформы (часто Fort.9).

Pierre de Buyl 10.09.2018 09:04

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

albert 10.09.2018 10:39

В первом комментарии я хотел написать модуль '*', но его съела разметка.

Pierre de Buyl 10.09.2018 10:42

Код выглядит очень некрасиво, используйте implicit none, используйте не блоки 5 и 6, а *, используйте отступы в каждой подпрограмме или функции, чтобы сделать структуру видимой, return и stop бесполезны перед end, строки формата лучше, чем помеченные операторы format.

Vladimir F 10.09.2018 11:12

Код может быть старый код f77. Для тех из нас, кто вырос на f77, этот код определенно не уродлив! ржу не могу

Natsfan 11.09.2018 21:25

Существующее поколение компьютерных людей, вероятно, сделало бы эту задачу на Python. Я бы сделал это в F77, потому что это я знал лучше всего. Для кода общего назначения подходит f77. Это просто «простой сценарий», который можно использовать один или два раза. Это не лучше и не хуже, чем использование Python или Perl.

Natsfan 11.09.2018 21:33
1
7
81
0

Другие вопросы по теме