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 nodestiedface(tieset,ntie,ipkon,kon,
20     &  lakon,set,istartset,iendset,ialset,nset,ifaceslave,
21     &  istartfield,iendfield,ifield,nconf,ncone,kind)
22!
23!     identifies slave nodes in tied slave faces
24!
25      implicit none
26!
27      character*1 kind
28      character*8 lakon(*)
29      character*81 tieset(3,*),slavset,set(*)
30!
31      integer ntie,nset,istartset(*),iendset(*),ialset(*),ifree,
32     &  ipkon(*),kon(*),node,ifaceslave(*),i,j,k,l,
33     &  ifaceq(8,6),ifacet(6,4),ilength,id,ncone,
34     &  ifacew1(4,5),ifacew2(8,5),nelem,jface,indexe,
35     &  nnodelem,nface,nope,nodef(8),
36     &  ifield(*),istartfield(*),iendfield(*),nconf
37!
38!     nodes per face for hex elements
39!
40      data ifaceq /4,3,2,1,11,10,9,12,
41     &            5,6,7,8,13,14,15,16,
42     &            1,2,6,5,9,18,13,17,
43     &            2,3,7,6,10,19,14,18,
44     &            3,4,8,7,11,20,15,19,
45     &            4,1,5,8,12,17,16,20/
46!
47!     nodes per face for tet elements
48!
49      data ifacet /1,3,2,7,6,5,
50     &             1,2,4,5,9,8,
51     &             2,3,4,6,10,9,
52     &             1,4,3,8,10,7/
53!
54!     nodes per face for linear wedge elements
55!
56      data ifacew1 /1,3,2,0,
57     &             4,5,6,0,
58     &             1,2,5,4,
59     &             2,3,6,5,
60     &             3,1,4,6/
61!
62!     nodes per face for quadratic wedge elements
63!
64      data ifacew2 /1,3,2,9,8,7,0,0,
65     &             4,5,6,10,11,12,0,0,
66     &             1,2,5,4,7,14,10,13,
67     &             2,3,6,5,8,15,11,14,
68     &             3,1,4,6,9,13,12,15/
69!
70      ifree=1
71!
72      do i=1,ntie
73         ilength=0
74         if(tieset(1,i)(81:81).ne.kind) cycle
75         if(ifaceslave(i).eq.0) cycle
76         slavset=tieset(2,i)
77c         do j=1,nset
78c            if(set(j).eq.slavset) exit
79c         enddo
80         call cident81(set,slavset,nset,id)
81         j=nset+1
82         if(id.gt.0) then
83           if(slavset.eq.set(id)) then
84             j=id
85           endif
86         endif
87!
88         istartfield(i)=ifree
89         do j=istartset(j),iendset(j)
90            ncone=ncone-1
91            nelem=int(ialset(j)/10.)
92            jface=ialset(j)-10*nelem
93!
94            indexe=ipkon(nelem)
95            if(lakon(nelem)(4:4).eq.'2') then
96               nnodelem=8
97               nface=6
98            elseif(lakon(nelem)(4:4).eq.'8') then
99               nnodelem=4
100               nface=6
101            elseif(lakon(nelem)(4:5).eq.'10') then
102               nnodelem=6
103               nface=4
104            elseif(lakon(nelem)(4:4).eq.'4') then
105               nnodelem=3
106               nface=4
107            elseif(lakon(nelem)(4:5).eq.'15') then
108               if(jface.le.2) then
109                  nnodelem=6
110               else
111                  nnodelem=8
112               endif
113               nface=5
114               nope=15
115            elseif(lakon(nelem)(4:4).eq.'6') then
116               if(jface.le.2) then
117                  nnodelem=3
118               else
119                  nnodelem=4
120               endif
121               nface=5
122               nope=6
123            else
124               cycle
125            endif
126!
127!     determining the nodes of the face
128!
129            if(nface.eq.4) then
130               do k=1,nnodelem
131                  nodef(k)=kon(indexe+ifacet(k,jface))
132               enddo
133            elseif(nface.eq.5) then
134               if(nope.eq.6) then
135                  do k=1,nnodelem
136                     nodef(k)=kon(indexe+ifacew1(k,jface))
137                  enddo
138               elseif(nope.eq.15) then
139                  do k=1,nnodelem
140                     nodef(k)=kon(indexe+ifacew2(k,jface))
141                  enddo
142               endif
143            elseif(nface.eq.6) then
144               do k=1,nnodelem
145                  nodef(k)=kon(indexe+ifaceq(k,jface))
146               enddo
147            endif
148!
149!           inserting the nodes in ifield
150!
151            do k=1,nnodelem
152               node=nodef(k)
153               call nident(ifield(istartfield(i)),node,ilength,id)
154               id=istartfield(i)+id-1
155               if(id.gt.istartfield(i)-1) then
156                  if(ifield(id).eq.node) cycle
157               endif
158               do l=ifree,id+2,-1
159                  ifield(l)=ifield(l-1)
160               enddo
161               ifield(id+1)=node
162               ifree=ifree+1
163               ilength=ilength+1
164            enddo
165         enddo
166         iendfield(i)=ifree-1
167      enddo
168!
169      nconf=ifree-1
170!
171      return
172      end
173
174