aboutsummaryrefslogtreecommitdiff
path: root/src/aread.f
blob: 2e283594986bfc1c4d483aa19ca2ab75e954802c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

      SUBROUTINE AREAD(LU,FNAME,NMAX,X,Y,N,NAME,ISPARS,ITYPE,INFO)
      DIMENSION X(NMAX), Y(NMAX)
      CHARACTER*(*) FNAME
      CHARACTER*(*) NAME
      CHARACTER*(*) ISPARS
C--------------------------------------------------------
C     Reads in several types of airfoil coordinate file.
C
C  Input:
C       LU      logical unit to use for reading
C       FNAME   name of coordinate file to be read,
C               if FNAME(1:1).eq.' ', unit LU is assumed 
C               to be already open
C       INFO   0 keep quiet
C              1 print info on airfoil
C  Output:
C       X,Y     coordinates
C       N       number of X,Y coordinates
C       NAME    character name string        (if ITYPE > 1)
C       ISPARS  ISES/MSES domain-size string (if ITYPE > 2)
C       ITYPE returns type of file:
C           0  None.  Read error occurred.
C           1  Generic.
C           2  Labeled generic.
C           3  MSES single element.
C           4  MSES multi-element.
C--------------------------------------------------------
      CHARACTER*80 LINE1,LINE2,LINE
      LOGICAL LOPEN, ERROR
      DIMENSION A(10)
C
      IEL = 0
      NEL = 0
C
C---- assume read error will occur
      ITYPE = 0
C
      LOPEN = FNAME(1:1) .NE. ' '
      IF(LOPEN) OPEN(LU,FILE=FNAME,STATUS='OLD',ERR=98)
C
 11   READ(LU,1000,END=99,ERR=98) LINE1
      IF(INDEX('#!',LINE1(1:1)) .NE. 0) GO TO 11
C
 12   READ(LU,1000,END=99) LINE2
      IF(INDEX('#!',LINE2(1:1)) .NE. 0) GO TO 12
C
      I = 1
C
C---- try to read two numbers from first line
      NA = 2
      CALL GETFLT(LINE1,A,NA,ERROR)
      IF(ERROR .OR. NA.LT.2) THEN
C------ must be a name string
        NAME = LINE1
      ELSE
C------ no name, just two valid numbers... must be plain airfoil file
        IF(INFO.GT.0) THEN
         WRITE(*,*)
         WRITE(*,*) 'Plain airfoil file'
        ENDIF
        ITYPE = 1
        REWIND(LU)
        GO TO 50
      ENDIF
C
C---- if we got here, there's a name line,
C-    so now try to read four MSES domain numbers from second line
      NA = 4
      CALL GETFLT(LINE2,A,NA,ERROR)
      IF(ERROR .OR. NA.LT.2) THEN
C------ less than two valid numbers... not a valid format
        GO TO 99
C
      ELSEIF(NA.EQ.2) THEN
C------ only two numbers... usual .dat labeled file
        NAME = LINE1
        IF(INFO.GT.0) THEN
         WRITE(*,*)
         WRITE(*,*) 'Labeled airfoil file.  Name:  ', NAME
        ENDIF
        ITYPE = 2
        REWIND(LU)
        READ(LU,1000,END=99) LINE1
        GO TO 50
C
      ELSE
C------ four or more numbers... MSES or MISES file
        IF(INFO.GT.0) THEN
         WRITE(*,*)
         WRITE(*,*) 'MSES airfoil file.  Name:  ', NAME
        ENDIF
        ITYPE = 3
        ISPARS = LINE2
      ENDIF
C
C---- read each element until 999.0 or end of file is encountered
   50 NEL = NEL + 1
      DO 55 I=1, NMAX
 51     READ(LU,1000,END=60) LINE
C
C------ skip comment line
        IF(INDEX('#!',LINE(1:1)) .NE. 0) GO TO 51
C
        NA = 2
        CALL GETFLT(LINE,A,NA,ERROR)
        IF(ERROR) GO TO 99
C
C------ skip line without at least two numbers
        IF(NA.LT.2) GO TO 51
C
        X(I) = A(1)
        Y(I) = A(2)
C
        IF (X(I) .EQ. 999.0 .AND. Y(I) .EQ. 999.0) THEN
C-------- if this is the element we want, just exit
          IF(IEL .EQ. NEL) GO TO 60
C
          IF(IEL.EQ.0) THEN
           CALL ASKI('Enter element number^',IEL)
           ITYPE = 4
          ENDIF
C
C-------- if this is the specified element, exit.
          IF(IEL .EQ. NEL) GO TO 60
          GO TO 50
        ENDIF
   55 CONTINUE
      WRITE(*,5030) NMAX
      WRITE(*,5900)
      IF(LOPEN) CLOSE(LU)
      ITYPE = 0
      RETURN
C
   60 N = I-1
      IF(LOPEN) CLOSE(LU)
      RETURN
C
   98 CONTINUE
      NFN = INDEX(FNAME,' ') + 1
      WRITE(*,5050) FNAME(1:NFN)
      WRITE(*,5900)
      ITYPE = 0
      RETURN
C
   99 CONTINUE
      IF(LOPEN) CLOSE(LU)
      WRITE(*,5100)
      WRITE(*,5900)
      ITYPE = 0
      RETURN
C...............................................................
 1000 FORMAT(A)
 5030 FORMAT(/' Buffer array size exceeded'
     &       /' Maximum number of points: ', I4 )
 5050 FORMAT(/' File OPEN error.  Nonexistent file:  ', A)
 5100 FORMAT(/' File READ error.  Unrecognizable file format')
 5900 FORMAT( ' *** LOAD NOT COMPLETED ***' )
      END ! AREAD