Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Having some issues with a piece of fortran95 code

  1. Jan 27, 2012 #1
    Hello,

    I am pretty new to programming at all and am having some issues with working out why this program is not compiling:


    Program MAIN
    DO J = 1, 11
    K = 10 + J
    P = 0.4 !POSITION OF MAXIMUM CAMBER AT 40% CHORD!
    M = FLOAT (J + 1)* 0.01 !MAXIMUM CAMBER!
    DO I = 1, 11
    DO X = 0, 1
    DX = 1
    IF (X .LT. P) THEN
    Yc = (M/(P*P))*(2*P*X-(X*X))
    ELSE
    Yc = (M/((1-P)*(1-P))*((1-(2*P))+(2*P*X)-(X*X)))
    END IF
    DYc = Yc(I) - (Yc(I - 1))
    FIRST = 0.2969*SQRT(X)
    SECOND = 0.1260*X
    THIRD = 0.3516*X*X
    FOURTH = 0.2843*X*X*X
    FIFTH = 0.1015*X*X*X*X
    Yt = (T/0.2)*(FIRST - SECOND - THIRD + FOURTH - FIFTH)
    THETA = ATAN(DYc/DX)
    Yupper = Yc + (Yt*COS(THETA))
    Ylower = Yc - (Yt*COS(THETA))
    END DO
    END DO
    WRITE (J, *)
    DO I = 1, 11
    X(I), Yupper(I), Ylower(I)
    END DO
    END DO


    The code in bold red font are the problem lines and the compiler gives me an "Unclassifiable statement" error for both lines.

    Any help would be very much appreciated.

    Regards,
    Charlie
     
  2. jcsd
  3. Jan 27, 2012 #2

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    Code (Text):
    DYc = Yc(I) - (Yc(I - 1))
    If you want to use an array in Fortan you have to declare it first, for example

    Code (Text):
    Program MAIN
    DIMENSION Yc(11)
    DO J = 1,11
    etc
    But you have already used Yc as a scalar variable. You can't use the same variable name for two different things.

    Code (Text):
    X(I), Yupper(I), Ylower(I)
    I can't even guess what type of Fortran statement that was supposed to be. Neither can the compiler, hence the error message.
     
  4. Jan 27, 2012 #3
    Thanks very much for the prompt reply,

    The DYc variable i was trying to get was just a delta value of Yc so I thought the I-(I-1) statement mathematically correct.

    Also the code:
    X(I), Yupper(I), Ylower(I)
    I wanted the program to write all three variables to the file fort.(I)

    sorry again first time coding so have been patching together all the resources I could find.

    Regards,
    Charles
     
  5. Jan 28, 2012 #4

    Mark44

    Staff: Mentor

    Then you need to use an output function - WRITE.

    Are you trying to write different values to different files? If you don't know that you need to use an output function to do output, you're going to have a really tough time doing output to separate files.

    It would behoove you to do some research on Fortran file I/O.


     
  6. Jan 28, 2012 #5
    I am trying to write all three variables to one file. then repeat the process 'I' times

    I used the write command as shown:

    WRITE (J, *)
    DO I = 1, 11
    X(I), Yupper(I), Ylower(I)

    So i would have assumed that the code would write to the file fort.(J) the X, Yupper and Ylower values for each 'I' value.

    What I am hoping to receive is a number of files of the following format:

    I X Yupper Ylower
    --------------------------------
    1 | | |
    2 | | |
    3 | | |
    4 | | |
     
  7. Jan 28, 2012 #6

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    Unfortunately, "assuming" the compiler will guess what your program is supposed to do usually fails. :rolleyes:

    In Fortran each WRITE statement produces one line of output. So you need something like
    Code (Text):

    DO I = 1, 11
    WRITE (J, *) X(I), Yupper(I), Ylower(I)
    ENDDO
    Actually, that won't quite work either, because in your outer loop j goes from 1 to 11, but Fortran reserves a few file numbers for "default" files which read input from the keyboard and write output to the monitor. Those numbers may be 0 1 and 2, or sometimes 5 and 6 (for historical reasons). If you want to create 11 files on disk, the simplest fix for this would be to use file numbers like 11 thru 21 or 51 thru 61 or whatever, which won't clash with anything else.
     
  8. Jan 29, 2012 #7
    Thanks for all the responses so far. Right I have reworked my intial code now and have got it to work and compile however I still do have a problem in that one of my calculations is not being carried out.

    Code:

    DO J = 1, 11
    NP = 11 !NUMBER OF POINTS ALONG CHORD!
    K = 10 + J !CHANNEL TO WRITE TO!
    P = 0.4 !POSITION OF MAXIMUM CAMBER AT 40% CHORD!
    P2 = P*P !P SQUARED!
    T = 0.12 !WING THICKNESS!
    PI = 3.1415927
    XR = (PI/(NP-1)) !GET RADIAN DISTRIBUTION!
    Yc1 = 0 !VARIABLE TO CALULATE DELTA Yc!
    NACA = (J*1000)+(P*1000)+(T*100)
    WRITE (K,*) 'NACA', NACA
    WRITE (K, '(1X,I10, "X", I14,"Y")') 1, 1
    DO XT = 1, NP !REPEAT LOOP FOR AS MANY POINTS REQUIRED!
    XC = (XR*(XT - 1)) !GET EQUAL SPACING IN RADIANS!
    X = ((COS(XC)) + 1) / 2 !HALF COSINE DISTRIBUTION!
    X2 = X*X
    X3 = X*X*X
    X4 = X*X*X*X
    IF (X .LT. P) THEN !DECIDE WHICH EQUATION TO USE!
    Yc = ((J/100)/P2)*(2*P*X-(X2))
    ELSE
    Yc = ((J/100)/(1-(2*P)+P2))*((1-(2*P))+(2*P*X)-(X2))
    END IF
    WRITE (6, *) Yc
    FIRST = 0.2969*SQRT(X) !Yt EQUATION BROKEN DOWN!
    SECOND = 0.1260*X !Yt EQUATION BROKEN DOWN!
    THIRD = 0.3516*X2 !Yt EQUATION BROKEN DOWN!
    FOURTH = 0.2843*X3 !Yt EQUATION BROKEN DOWN!
    FIFTH = 0.1015*X4 !Yt EQUATION BROKEN DOWN!
    Yt = (T/0.2)*(FIRST - SECOND - THIRD + FOURTH - FIFTH)
    DYc = (Yc1 - Yc)
    DX = 1
    THETA = ATAN(DYc/DX)
    Yupper = Yc + (Yt*COS(THETA))
    Ylower = Yc - (Yt*COS(THETA))
    Yc1 = Yc
    WRITE (K, *) X, Yupper, Yc
    END DO
    DO XT = (NP-1), 1, -1 !REPEAT LOOP FOR AS MANY POINTS REQUIRED!
    XC = (XR*(XT - 1)) !GET EQUAL SPACING IN RADIANS!
    X = ((COS(XC)) + 1) / 2 !HALF COSINE DISTRIBUTION!
    X2 = X*X
    X3 = X*X*X
    X4 = X*X*X*X
    IF (X .LT. P) THEN
    Yc = ((J/100)/P2)*(2*P*X-(X2))
    ELSE
    Yc = ((J/100)/(1-(2*P)+P2))*((1-(2*P))+(2*P*X)-(X2))
    END IF
    WRITE (6, *) Yc
    FIRST = 0.2969*SQRT(X) !Yt EQUATION BROKEN DOWN!
    SECOND = 0.1260*X !Yt EQUATION BROKEN DOWN!
    THIRD = 0.3516*X2 !Yt EQUATION BROKEN DOWN!
    FOURTH = 0.2843*X3 !Yt EQUATION BROKEN DOWN!
    FIFTH = 0.1015*X4 !Yt EQUATION BROKEN DOWN!
    Yt = (T/0.2)*(FIRST - SECOND - THIRD + FOURTH - FIFTH)
    DYc = (Yc1 - Yc)
    DX = 1
    THETA = ATAN(DYc/DX)
    Yupper = Yc + (Yt*COS(THETA))
    Ylower = Yc - (Yt*COS(THETA))
    Yc1 = Yc
    WRITE (K, *) X, Ylower, Yc
    END DO
    END DO
    END PROGRAM



    The Yc variables are always set to zero and I cant figure out why. All the components are ok and so the calculations should be ok. any help would be greatly appreciated.

    Regards,
    Charles
     
  9. Jan 29, 2012 #8

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    Yc = ((J/100)/P2)*(2*P*X-(X2))

    Variables with names starting with the letters I thru N are integer variables.

    J/100 is dividing an integer by an integer, and Fortran gives the result of that as an integer. J/100 will always equal = 0 if J is less than 100. You can fix this with

    Yc = ((J/100.0)/P2)*(2*P*X-(X2))

    Dividing an integer by a real constant (written with a decimal point) will give a real result, which seems to be what you want.

    Or you could write

    Yc = ((J/(100*P2))*(2*P*X-(X2))

    100*P2 is an integer times a real which gives a real value. Then J / (real value) gives another real value.
     
  10. Jan 29, 2012 #9
    AlephZero,

    Thank you very much that is absolutely perfect. I thought it would be a simple solution but just could not see it myself.

    Thank you again for all of your help.
     
  11. Jan 30, 2012 #10
    I have another hopefully simple to answer problem. In my code I have got it to calculate x values from 0 - 1 in decimal values and the y values associated with these. I than print off the values straight away and progress the x value so i end up with a table like so:


    NACA 2412
    X Y Z
    upper surface
    1.0000000 0.0000000 0.0000000
    0.97552824 0.0000000 5.01149474E-03
    0.90450847 0.0000000 1.86340362E-02
    0.79389262 0.0000000 3.72849256E-02
    0.65450847 0.0000000 5.64936101E-02
    0.49999997 0.0000000 7.17544481E-02
    0.34549147 0.0000000 7.87679926E-02
    0.20610739 0.0000000 7.27545992E-02
    9.54914838E-02 0.0000000 5.43368347E-02
    2.44717114E-02 0.0000000 2.82343049E-02
    1.91068949E-15 0.0000000 7.78673392E-09
    lower surface
    1.0000000 0.0000000 0.0000000
    0.97552824 0.0000000 -1.81513163E-03
    0.90450847 0.0000000 -6.91501191E-03
    0.79389262 0.0000000 -1.45239700E-02
    0.65450847 0.0000000 -2.36907862E-02
    0.49999997 0.0000000 -3.28655615E-02
    0.34549147 0.0000000 -3.95107903E-02
    0.20610739 0.0000000 -4.21531908E-02
    9.54914838E-02 0.0000000 -3.75181958E-02
    2.44717114E-02 0.0000000 -2.34896801E-02

    is there a way that I can get the lower surface results to be displayed in reverse order (from 0 to 1) the code will not allow me just do

    do 11, 1, -1

    as the equations used do not have the sufficient variables in this direction.
    should I save the x and y values to an array and then get the array to be read and printed backwards? if so how do i do this.

    I have attached my revised code.
     

    Attached Files:

Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Having some issues with a piece of fortran95 code
  1. Fortran95 HELP (Replies: 5)

Loading...