Fortran Fortran program for oscillator using Euler method

AI Thread Summary
The Fortran program for solving an oscillator using the Euler method contains several critical errors, primarily related to undefined array indices and improper variable handling. The variable 'i' is never initialized, leading to issues with the DO WHILE loop that checks the condition based on 't(i)'. Additionally, the functions 'dx' and 'dv' are not utilized effectively, and there are inconsistencies in how arrays are passed to the subroutine 'Euler'. The program also suffers from potential format issues, which could be causing the "Unclassifiable statement" error during compilation. Overall, significant revisions are needed to ensure proper functionality and logic flow in the code.
koushan
Messages
5
Reaction score
0
I am trying to run a program with fortran. The program is about solving the Oscillator using Euler Method. I am trying to run this code and applying array arguments (as I want to extend it to 3 dimensions afterwards).
When I try to compile, it comes up with an error "Unclassifiable statement at (1)". I don't know how to resolved this error.
This is my code:

program Oscilator
implicit none

real :: h !(Step size)
integer, parameter :: n=100
real, dimension(1:n) :: x,v,t
external dx,dv
integer :: i

x(1) = 0.017
t(1) = 0.0
v(1) = 0.0

write(*,*) 't x v'

do while(t(i) <= n)
h = t(i+1) - t(i)
call Euler(h,x,v)
write(6,'(4(e12.5,3x))') t(i), x(i), v(i)

t(i)=t(i+1)
x(i)=x(i+1)
v(i)=v(i+1)

end do

end program Oscilator

function dx(t)
implicit none
real dx, t
dx = exp(-0.9*t)*(-2.5*exp(0.557*t)-2.8*exp(-0.557*t))
end function dx

function dv(t)
implicit none
real dv, t
dv=-0.2941*exp(-0.343*t)-5.9439*exp(-1.457*t)
end function dv

subroutine Euler(h,x,v)
implicit none
real :: v,x,h,dv
integer :: i

x(i+1) = x(i) + v(i)*h
v(i+1) = v(i) + dv(i)*h


end subroutine Euler
 
Technology news on Phys.org
Please use
Code:
 tags when attaching source files.

IDK about your error, but the program has some serious errors in implementation.

For example, in the main program, you have a DO WHILE construct calculating values for the arrays t,x, and v.
The problem is, the array index i is never defined or calculated, either inside or outside the DO WHILE construct.

The condition for termination (t(i) <= n) can't be met because what value of the t array should be used?  There are no statements which define any of the values of the t array except for t(1) = 0.0.
 
koushan said:
When I try to compile, it comes up with an error "Unclassifiable statement at (1)".
I don't know either about this error. What compiler are you using?

To add to what SteamKing said, here are some more flagrant errors:

koushan said:
do while(t(i) <= n)
h = t(i+1) - t(i)
t(i) has never been defined. And usually, you would do this the other way around: you define h, and then increment t.

koushan said:
write(6,'(4(e12.5,3x))') t(i), x(i), v(i)

t(i)=t(i+1)
x(i)=x(i+1)
v(i)=v(i+1)
If you're only going to print out t, x, and v, there is no need to store them in an array.


koushan said:
function dx(t)
implicit none
real dx, t
dx = exp(-0.9*t)*(-2.5*exp(0.557*t)-2.8*exp(-0.557*t))
end function dx
This function is never used.


koushan said:
dv=-0.2941*exp(-0.343*t)-5.9439*exp(-1.457*t)
This is an extremely strange equation to see in combination with the Euler method. You seem to already know what ##v(t)## is. What problem are you actually trying to solve?

koushan said:
subroutine Euler(h,x,v)
implicit none
real :: v,x,h,dv
integer :: i

x(i+1) = x(i) + v(i)*h
v(i+1) = v(i) + dv(i)*h

end subroutine Euler
x and v are not arrays in the subroutine, so they shouldn't have any index. dv is not declared as external. dv takes a real as an argument, not an integer. i is never defined.
 
Most likely, the error is because you and your compiler have different ideas about whether the program file is in fixed format or free format. Or, you are using an editor which has added some unwanted (and invisible) characters to the file.

But as others have said, there are plenty more problems to fix after have sorted that out!
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I had a Microsoft Technical interview this past Friday, the question I was asked was this : How do you find the middle value for a dataset that is too big to fit in RAM? I was not able to figure this out during the interview, but I have been look in this all weekend and I read something online that said it can be done at O(N) using something called the counting sort histogram algorithm ( I did not learn that in my advanced data structures and algorithms class). I have watched some youtube...

Similar threads

Back
Top