1!
2!     CalculiX - A 3-dimensional finite element program
3!              Copyright (C) 1998-2021 Guido Dhondt
4!
5!     This program is free software; you can redistribute it and/or
6!     modify it under the terms of the GNU General Public License as
7!     published by the Free Software Foundation(version 2);
8!
9!
10!     This program is distributed in the hope that it will be useful,
11!     but WITHOUT ANY WARRANTY; without even the implied warranty of
12!     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13!     GNU General Public License for more details.
14!
15!     You should have received a copy of the GNU General Public License
16!     along with this program; if not, write to the Free Software
17!     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18!
19      subroutine cataloguenodes(ipofano,ifano,ifreefa,ielfa,ifabou,
20     &  ipkon,konf,lakon,nface,nk)
21!
22!     catalogues the nodes for interpolation
23!
24      implicit none
25!
26      character*8 lakon(*)
27!
28      integer ipofano(*),ifano(2,*),ifreefa,ielfa(4,*),indexb,nk,
29     &  ifabou(*),iel,indexe,ipkon(*),k,node,ifaceq(8,6),nface,i,j,
30     &  konf(*),ifacet(7,4),ifacew(8,5),nf(5)
31!
32!     nodes belonging to the cell faces
33!
34      data ifaceq /4,3,2,1,11,10,9,12,
35     &            5,6,7,8,13,14,15,16,
36     &            1,2,6,5,9,18,13,17,
37     &            2,3,7,6,10,19,14,18,
38     &            3,4,8,7,11,20,15,19,
39     &            4,1,5,8,12,17,16,20/
40      data ifacet /1,3,2,7,6,5,11,
41     &             1,2,4,5,9,8,12,
42     &             2,3,4,6,10,9,13,
43     &             1,4,3,8,10,7,14/
44      data ifacew /1,3,2,9,8,7,0,0,
45     &             4,5,6,10,11,12,0,0,
46     &             1,2,5,4,7,14,10,13,
47     &             2,3,6,5,8,15,11,14,
48     &             4,6,3,1,12,15,9,13/
49      data nf /3,3,4,4,4/
50!
51      ifreefa=0
52!
53!     taking into account the walls (first priority)
54!
55      do i=1,nface
56         indexb=ielfa(2,i)
57         if(indexb.ge.0) cycle
58c         if(ifabou(-indexb+5).eq.1) then
59         if(ifabou(-indexb+5).gt.0) then
60            iel=ielfa(1,i)
61            indexe=ipkon(iel)
62            j=ielfa(4,i)
63!
64            if(lakon(iel)(4:4).eq.'8') then
65               do k=1,4
66                  node=konf(indexe+ifaceq(k,j))
67                  if(ipofano(node).eq.0) then
68                     ifreefa=ifreefa+1
69                     ipofano(node)=ifreefa
70                     ifano(1,ifreefa)=i
71                  elseif(ipofano(node).gt.0) then
72                     ifreefa=ifreefa+1
73                     ifano(2,ifreefa)=ipofano(node)
74                     ifano(1,ifreefa)=i
75                     ipofano(node)=ifreefa
76                  endif
77               enddo
78            elseif(lakon(iel)(4:4).eq.'6') then
79               do k=1,nf(j)
80                  node=konf(indexe+ifacew(k,j))
81                  if(ipofano(node).eq.0) then
82                     ifreefa=ifreefa+1
83                     ipofano(node)=ifreefa
84                     ifano(1,ifreefa)=i
85                  elseif(ipofano(node).gt.0) then
86                     ifreefa=ifreefa+1
87                     ifano(2,ifreefa)=ipofano(node)
88                     ifano(1,ifreefa)=i
89                     ipofano(node)=ifreefa
90                  endif
91               enddo
92            else
93               do k=1,3
94                  node=konf(indexe+ifacet(k,j))
95                  if(ipofano(node).eq.0) then
96                     ifreefa=ifreefa+1
97                     ipofano(node)=ifreefa
98                     ifano(1,ifreefa)=i
99                  elseif(ipofano(node).gt.0) then
100                     ifreefa=ifreefa+1
101                     ifano(2,ifreefa)=ipofano(node)
102                     ifano(1,ifreefa)=i
103                     ipofano(node)=ifreefa
104                  endif
105               enddo
106            endif
107         endif
108      enddo
109!
110!     marking the nodes used so far by putting a minus sign in front
111!
112      do i=1,nk
113         if(ipofano(i).gt.0) ipofano(i)=-ipofano(i)
114      enddo
115!
116!     taking into account the nodes at which all velocity
117!     components are prescribed (second priority)
118!
119      do i=1,nface
120         indexb=ielfa(2,i)
121         if(indexb.ge.0) cycle
122         if((ifabou(-indexb+1).ne.0).and.
123     &      (ifabou(-indexb+2).ne.0).and.
124     &      (ifabou(-indexb+3).ne.0)) then
125            iel=ielfa(1,i)
126            indexe=ipkon(iel)
127            j=ielfa(4,i)
128!
129            if(lakon(iel)(4:4).eq.'8') then
130               do k=1,4
131                  node=konf(indexe+ifaceq(k,j))
132                  if(ipofano(node).eq.0) then
133                     ifreefa=ifreefa+1
134                     ipofano(node)=ifreefa
135                     ifano(1,ifreefa)=i
136                  elseif(ipofano(node).gt.0) then
137                     ifreefa=ifreefa+1
138                     ifano(2,ifreefa)=ipofano(node)
139                     ifano(1,ifreefa)=i
140                     ipofano(node)=ifreefa
141                  endif
142               enddo
143            elseif(lakon(iel)(4:4).eq.'6') then
144               do k=1,nf(j)
145                  node=konf(indexe+ifacew(k,j))
146                  if(ipofano(node).eq.0) then
147                     ifreefa=ifreefa+1
148                     ipofano(node)=ifreefa
149                     ifano(1,ifreefa)=i
150                  elseif(ipofano(node).gt.0) then
151                     ifreefa=ifreefa+1
152                     ifano(2,ifreefa)=ipofano(node)
153                     ifano(1,ifreefa)=i
154                     ipofano(node)=ifreefa
155                  endif
156               enddo
157            else
158               do k=1,3
159                  node=konf(indexe+ifacet(k,j))
160                  if(ipofano(node).eq.0) then
161                     ifreefa=ifreefa+1
162                     ipofano(node)=ifreefa
163                     ifano(1,ifreefa)=i
164                  elseif(ipofano(node).gt.0) then
165                     ifreefa=ifreefa+1
166                     ifano(2,ifreefa)=ipofano(node)
167                     ifano(1,ifreefa)=i
168                     ipofano(node)=ifreefa
169                  endif
170               enddo
171            endif
172         endif
173      enddo
174!
175!     marking the nodes used so far by putting a minus sign in front
176!
177      do i=1,nk
178         if(ipofano(i).gt.0) ipofano(i)=-ipofano(i)
179      enddo
180!
181!     taking into account the nodes in which the pressure is
182!     prescribed (third priority)
183!
184      do i=1,nface
185         indexb=ielfa(2,i)
186         if(indexb.ge.0) cycle
187         if(ifabou(-indexb+4).ne.0) then
188            iel=ielfa(1,i)
189            indexe=ipkon(iel)
190            j=ielfa(4,i)
191!
192            if(lakon(iel)(4:4).eq.'8') then
193               do k=1,4
194                  node=konf(indexe+ifaceq(k,j))
195                  if(ipofano(node).eq.0) then
196                     ifreefa=ifreefa+1
197                     ipofano(node)=ifreefa
198                     ifano(1,ifreefa)=i
199                  elseif(ipofano(node).gt.0) then
200                     ifreefa=ifreefa+1
201                     ifano(2,ifreefa)=ipofano(node)
202                     ifano(1,ifreefa)=i
203                     ipofano(node)=ifreefa
204                  endif
205               enddo
206            elseif(lakon(iel)(4:4).eq.'6') then
207               do k=1,nf(j)
208                  node=konf(indexe+ifacew(k,j))
209                  if(ipofano(node).eq.0) then
210                     ifreefa=ifreefa+1
211                     ipofano(node)=ifreefa
212                     ifano(1,ifreefa)=i
213                  elseif(ipofano(node).gt.0) then
214                     ifreefa=ifreefa+1
215                     ifano(2,ifreefa)=ipofano(node)
216                     ifano(1,ifreefa)=i
217                     ipofano(node)=ifreefa
218                  endif
219               enddo
220            else
221               do k=1,3
222                  node=konf(indexe+ifacet(k,j))
223                  if(ipofano(node).eq.0) then
224                     ifreefa=ifreefa+1
225                     ipofano(node)=ifreefa
226                     ifano(1,ifreefa)=i
227                  elseif(ipofano(node).gt.0) then
228                     ifreefa=ifreefa+1
229                     ifano(2,ifreefa)=ipofano(node)
230                     ifano(1,ifreefa)=i
231                     ipofano(node)=ifreefa
232                  endif
233               enddo
234            endif
235         endif
236      enddo
237!
238!     marking the nodes used so far by putting a minus sign in front
239!
240      do i=1,nk
241         if(ipofano(i).gt.0) ipofano(i)=-ipofano(i)
242      enddo
243!
244!     taking into account faces with given mass flow (fourth priority)
245!
246      do i=1,nface
247         indexb=ielfa(2,i)
248         if(indexb.ge.0) cycle
249c         if(ifabou(-indexb+5).eq.2) then
250         if(ifabou(-indexb+5).lt.0) then
251            iel=ielfa(1,i)
252            indexe=ipkon(iel)
253            j=ielfa(4,i)
254!
255            if(lakon(iel)(4:4).eq.'8') then
256               do k=1,4
257                  node=konf(indexe+ifaceq(k,j))
258                  if(ipofano(node).eq.0) then
259                     ifreefa=ifreefa+1
260                     ipofano(node)=ifreefa
261                     ifano(1,ifreefa)=i
262                  elseif(ipofano(node).gt.0) then
263                     ifreefa=ifreefa+1
264                     ifano(2,ifreefa)=ipofano(node)
265                     ifano(1,ifreefa)=i
266                     ipofano(node)=ifreefa
267                  endif
268               enddo
269            elseif(lakon(iel)(4:4).eq.'6') then
270               do k=1,nf(j)
271                  node=konf(indexe+ifacew(k,j))
272                  if(ipofano(node).eq.0) then
273                     ifreefa=ifreefa+1
274                     ipofano(node)=ifreefa
275                     ifano(1,ifreefa)=i
276                  elseif(ipofano(node).gt.0) then
277                     ifreefa=ifreefa+1
278                     ifano(2,ifreefa)=ipofano(node)
279                     ifano(1,ifreefa)=i
280                     ipofano(node)=ifreefa
281                  endif
282               enddo
283            else
284               do k=1,3
285                  node=konf(indexe+ifacet(k,j))
286                  if(ipofano(node).eq.0) then
287                     ifreefa=ifreefa+1
288                     ipofano(node)=ifreefa
289                     ifano(1,ifreefa)=i
290                  elseif(ipofano(node).gt.0) then
291                     ifreefa=ifreefa+1
292                     ifano(2,ifreefa)=ipofano(node)
293                     ifano(1,ifreefa)=i
294                     ipofano(node)=ifreefa
295                  endif
296               enddo
297            endif
298         endif
299      enddo
300!
301!     marking the nodes used so far by putting a minus sign in front
302!
303      do i=1,nk
304         if(ipofano(i).gt.0) ipofano(i)=-ipofano(i)
305      enddo
306!
307!     taking into account the rest (last priority)
308!
309      do i=1,nface
310         indexb=ielfa(2,i)
311         iel=ielfa(1,i)
312         indexe=ipkon(iel)
313         j=ielfa(4,i)
314!
315         if(lakon(iel)(4:4).eq.'8') then
316            do k=1,4
317               node=konf(indexe+ifaceq(k,j))
318               if(ipofano(node).eq.0) then
319                  ifreefa=ifreefa+1
320                  ipofano(node)=ifreefa
321                  ifano(1,ifreefa)=i
322               elseif(ipofano(node).gt.0) then
323                  ifreefa=ifreefa+1
324                  ifano(2,ifreefa)=ipofano(node)
325                  ifano(1,ifreefa)=i
326                  ipofano(node)=ifreefa
327               endif
328            enddo
329         elseif(lakon(iel)(4:4).eq.'6') then
330            do k=1,nf(j)
331               node=konf(indexe+ifacew(k,j))
332               if(ipofano(node).eq.0) then
333                  ifreefa=ifreefa+1
334                  ipofano(node)=ifreefa
335                  ifano(1,ifreefa)=i
336               elseif(ipofano(node).gt.0) then
337                  ifreefa=ifreefa+1
338                  ifano(2,ifreefa)=ipofano(node)
339                  ifano(1,ifreefa)=i
340                  ipofano(node)=ifreefa
341               endif
342            enddo
343         else
344            do k=1,3
345               node=konf(indexe+ifacet(k,j))
346               if(ipofano(node).eq.0) then
347                  ifreefa=ifreefa+1
348                  ipofano(node)=ifreefa
349                  ifano(1,ifreefa)=i
350               elseif(ipofano(node).gt.0) then
351                  ifreefa=ifreefa+1
352                  ifano(2,ifreefa)=ipofano(node)
353                  ifano(1,ifreefa)=i
354                  ipofano(node)=ifreefa
355               endif
356            enddo
357         endif
358      enddo
359!
360!     removing all markings
361!
362      do i=1,nk
363         if(ipofano(i).lt.0) ipofano(i)=-ipofano(i)
364      enddo
365!
366      return
367      end
368