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