1

I would be grateful if someone could help me out here. I'm just starting out learning how to program, so there is a great chance I'm missing something very obvious. I'm trying to write a program in Fortran 90 that solves question 4 i) on page 45 of this pdf. I have finally managed to get my code to compile to something, but now that something is somewhat rubbish, the data it produces is crazy (as time increases, I get a decrease in distance after whatever I input at t0). Can someone spot my mistake? I realize this is quite a lot of code to look through, I'm sorry for asking so much of you. Thanks in advance for looking through!


   PROGRAM PARACHUTIST
   ! Tabulation of parachutist's descent z and and speed zdot
   ! as functions of time t

     !Assign the program's associated constants

    IMPLICIT NONE
      REAL z, zdot, g, U1, U2, z0, u0, t0, q0, t, x,c,s
    INTEGER I


g=9.8
U1=54
U2=5

!Break z0 down a little with q0

q0=COSH(g*t0/U1)
z0=U1**2/g*LOG(q0)
u0=U1*TANH(g*t0/U1)

      !Prompt for and read in the free-fall time

      Print*, 'Input free-fall time in seconds:'
      Read*, t0

      !Print the table headings
      WRITE(*,1000)

1000 FORMAT (6X, 'TIME', 6X, 'DISTANCE', 6X, 'VELOCITY',            /6X, '(SEC)', 7X, '(M)', 10X, '(M/SEC)',&
        /6X, '0.0', 10X, '0.0', 10X, '0.0' )

      !Loop covering the specified times
      t=0 

    DO I=0,20

  ! Calculate the distance above ground
200         IF(t<=t0) THEN
            x=g*t/U1
            z=U1**2/g*LOG(COSH(x))
            zdot=U1*TANH(x)

    Elseif(t>t0) THEN
            x=g*(t-t0)/U2  
    !store re-used expressions

            c=cosh(x)
            s=sinh(x)
            z= z0 + (U2**2/g)*LOG(c+ (u0/U2)*s)
            zdot=U2*(U2*s+u0*c)/(U2*c+u0*s) 

        Endif

         !Print a line of table using T formats
         WRITE(*,100) t, z, zdot
100      Format(4X, F5.2, 6X, F7.2, 6X, F7.2)

!Stop with message if landed

         If(z.GE.500) THEN
        PRINT*, 'LANDED'
        STOP
         !If we haven't yet landed then increment t as in 
        !   problem specs
         Elseif(t<15) then
            t=t+1
         Elseif(t.GE.15) then
            t=t+10

        ENDIF

     !End of the t-loop
      END DO

  END PROGRAM PARACHUTIST
7
  • I don't know Fortran, but in other programming languages you specify inequalities like this: a <= b (a less than or equal b), a >= b (a greater than or equal b). So I suppose the mistake is in the else if statement (t => t0). Try changing it to t0 <= t (As this is what you intended to check against I guess) Commented Apr 29, 2012 at 10:39
  • @krdx Thank you so much, that fixed that right up! My code is compiling now but as I suspected, my output data is off so I must have gone astray somewhere else. I'll update my question to reflect this development and in the meanwhile see if I can spot my mistakes. Commented Apr 29, 2012 at 10:43
  • The traditional way to compare numbers in FORTRAN is to use operators such as .GE. and .LT., but I do not know anything about level 90. Commented Apr 29, 2012 at 11:06
  • 2
    @PhilipSheard The 90 standard allows the use of <= and such, I think in that area at least I'm safe. Commented Apr 29, 2012 at 11:08
  • 1
    I see my error now! I was using t0 in my variable assignments before I even read the input for it! So it must have been going as t0=0 before that. Thanks heaps everyone for looking through and your input. I'll keep this up for a few more minutes in case some people are looking through, but then I'll delete it since it's now settled and to reduce the clutter/amount of unanswered questions. Commented Apr 29, 2012 at 11:17

1 Answer 1

2

I wrote this as two comments, but it was really too lengthy. Go ahead and delete it all if you had planned to do so. I just browsed through a document comparing Fortran77 and "modern" Fortran90. (I coded in Fortran77 when I was just starting school, awhile ago...). Here are some suggestions:

Be careful with your use of "ELSEIF". It is usually okay for ELSE and IF to have the space omitted, but that is not true otherwise with free-format code (I think the only other instances of space-optional are DOUBLE PRECISION, ELSE IF, GO TO, END DO, and END IF).

An advantage of using Fortran90 is that you shouldn't even need ELSE IF's, (nor computed GOTO's!) as there is SELECT CASE.

You shouldn't need FORMAT either, as it can be incorporated directly with a format string in the READ or WRITE statement itself.

Yes, you can use either the old Fortran 77 operators .GE..GT..EQ..NE..LE..LT. or the new ones >= > == /= <= <. However, I'm not sure if you should mix them, which I noticed in your code.

EDIT: The second link above, about Control Structures, describes how you can use DO loops instead of IF's in Fortran90, sections 3.2 - 3.5. You can use named DO's, indefinite DO loops, DO WHILE's, all sorts of things! There are examples too. (The name of the entire document is Fortran90 for Fortran77 Programmers.)

Sign up to request clarification or add additional context in comments.

5 Comments

Here's one more link for you, specifically about Fortran 90 and DO loops personal.psu.edu/jhm/f90/lectures/15.html and a lot more. It has little multiple choice questions, they were fun, I spent half the night re-learning vi editor and UNIX file system commands, then taking the cute "test your knowledge" at the end of every section.
@Stefano Borini is correct, Fortran is case insensitive, so you will be safer by using lower case instead of capital letters. Proper spacing and indenting is vital, because you need to end every umm 132 char (?) line with an & as well as not breaking lines up with comments. That is accomplished with fewer errors if you are careful about formatting your code neatly ;o)
according to your link (and my experience), elseif is totally fine. (It is listed as an exception to the whitespace is significant rule).
@mgilson Okay, good to know. It just looked quirky to me at first, habit, I guess. I checked, found that link, with the list of items where white space is optional, and it does include else if. I've always used goto instead of go to and never had problems. It would look so odd to see doubleprecision even though it should be okay!
Yeah, I have yet to see doubleprecision. I use elseif and endif and enddo and goto all the time though (I don't think I ever use the 2 word forms except when working on a project someone else wrote where they follow the other convention).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.