source: CIVL/examples/fortran/nek5000/core/bdry.f

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100755
File size: 63.2 KB
Line 
1c-----------------------------------------------------------------------
2 SUBROUTINE SETLOG(ifecho)
3C
4C Subroutine to initialize logical flags
5C
6 INCLUDE 'SIZE'
7 INCLUDE 'GEOM'
8 INCLUDE 'INPUT'
9 INCLUDE 'TSTEP'
10 INCLUDE 'CTIMER'
11 INCLUDE 'ADJOINT'
12
13 logical ifecho
14
15 COMMON /CPRINT/ IFPRINT
16C
17 common /nekcb/ cb
18 CHARACTER CB*3
19 LOGICAL IFALGN,IFNORX,IFNORY,IFNORZ,IFPRINT
20C
21 NFACE = 2*ldim
22C
23 IFPRINT = .TRUE.
24 IFVCOR = .TRUE.
25 IFGEOM = .FALSE.
26 IFINTQ = .FALSE.
27 IFSURT = .FALSE.
28 IFWCNO = .FALSE.
29 DO 10 IFIELD=1,NFIELD
30 IFNONL(IFIELD) = .FALSE.
31 10 CONTINUE
32C
33 CALL LFALSE (IFEPPM,NFACE*NELV)
34 CALL LFALSE (IFQINP,NFACE*NELV)
35C
36 IF (IFMVBD) THEN
37 IFGEOM = .TRUE.
38 IF ( IFFLOW .AND. .NOT.IFNAV ) IFWCNO = .TRUE.
39 IF ( IFMELT .AND. .NOT.IFFLOW ) IFWCNO = .TRUE.
40 ENDIF
41C
42 IF (IFFLOW) THEN
43 IERR = 0
44 IFIELD = 1
45 DO 100 IEL=1,NELV
46 DO 100 IFC=1,NFACE
47 CB = CBC(IFC,IEL,IFIELD)
48 CALL CHKNORD (IFALGN,IFNORX,IFNORY,IFNORZ,IFC,IEL)
49 CALL CHKCBC (CB,IEL,IFC,IFALGN,IERR)
50 IF (CB.EQ.'O ' .OR. CB.EQ.'o ' .OR.
51 $ CB.EQ.'ON ' .OR. CB.EQ.'on ' .OR.
52 $ CB.EQ.'S ' .OR. CB.EQ.'s ' .OR.
53 $ CB.EQ.'SL ' .OR. CB.EQ.'sl ' .OR.
54 $ CB.EQ.'MM ' .OR. CB.EQ.'mm ' .OR.
55 $ CB.EQ.'MS ' .OR. CB.EQ.'ms ') THEN
56 IFVCOR = .FALSE.
57 IFEPPM(IFC,IEL) = .TRUE.
58 ENDIF
59 IF (CB.EQ.'VL ' .OR. CB.EQ.'vl ' .OR.
60 $ CB.EQ.'WSL' .OR. CB.EQ.'wsl' .OR.
61 $ CB.EQ.'SL ' .OR. CB.EQ.'sl ' .OR.
62 $ CB.EQ.'SHL' .OR. CB.EQ.'shl' .OR.
63 $ CB.EQ.'MM ' .OR. CB.EQ.'mm ' .OR.
64 $ CB.EQ.'MS ' .OR. CB.EQ.'ms ' .OR.
65 $ CB.EQ.'O ' .OR. CB.EQ.'o ' .OR.
66 $ CB.EQ.'ON ' .OR. CB.EQ.'on ') THEN
67 IFQINP(IFC,IEL) = .TRUE.
68 ENDIF
69 IF (CB.EQ.'MS ' .OR. CB.EQ.'ms ' .OR.
70 $ CB.EQ.'MM ' .OR. CB.EQ.'mm ' .OR.
71 $ CB.EQ.'MSI' .OR. CB.EQ.'msi' ) THEN
72 IFSURT = .TRUE.
73 ENDIF
74 100 CONTINUE
75
76 ierr = iglsum(ierr,1)
77 if (ierr.gt.0) call exitt
78 ENDIF
79C
80 IF (IFHEAT) THEN
81C
82 DO 250 IFIELD=2,NFIELD
83 DO 250 IEL=1,NELFLD(IFIELD)
84 DO 250 IFC=1,NFACE
85 CB=CBC(IFC,IEL,IFIELD)
86 IF (CB.EQ.'r ' .OR. CB.EQ.'R ') THEN
87 IFNONL(IFIELD) = .TRUE.
88 ENDIF
89 250 CONTINUE
90C
91 ENDIF
92
93 if (ifmhd) call set_ifbcor
94C
95C Establish global consistency of LOGICALS amongst all processors.
96C
97 CALL GLLOG(IFVCOR , .FALSE.)
98 CALL GLLOG(IFSURT , .TRUE. )
99 CALL GLLOG(IFWCNO , .TRUE. )
100 DO 400 IFIELD=2,NFIELD
101 CALL GLLOG(IFNONL(IFIELD),.TRUE.)
102 400 CONTINUE
103C
104 IF (NIO.EQ.0 .AND. ifecho) THEN
105 WRITE (6,*) 'IFTRAN =',IFTRAN
106 WRITE (6,*) 'IFFLOW =',IFFLOW
107 WRITE (6,*) 'IFHEAT =',IFHEAT
108 WRITE (6,*) 'IFSPLIT =',IFSPLIT
109 WRITE (6,*) 'IFLOMACH =',IFLOMACH
110 WRITE (6,*) 'IFUSERVP =',IFUSERVP
111 WRITE (6,*) 'IFUSERMV =',IFUSERMV
112 WRITE (6,*) 'IFPERT =',IFPERT
113 WRITE (6,*) 'IFADJ =',IFADJ
114 WRITE (6,*) 'IFSTRS =',IFSTRS
115 WRITE (6,*) 'IFCHAR =',IFCHAR
116 WRITE (6,*) 'IFCYCLIC =',IFCYCLIC
117 WRITE (6,*) 'IFAXIS =',IFAXIS
118 WRITE (6,*) 'IFMVBD =',IFMVBD
119 WRITE (6,*) 'IFMELT =',IFMELT
120 WRITE (6,*) 'IFNEKNEK =',IFNEKNEK
121 WRITE (6,*) 'IFNEKNEKC =',IFNEKNEKC
122 WRITE (6,*) 'IFSYNC =',IFSYNC
123 WRITE (6,*) ' '
124 WRITE (6,*) 'IFVCOR =',IFVCOR
125 WRITE (6,*) 'IFINTQ =',IFINTQ
126 WRITE (6,*) 'IFGEOM =',IFGEOM
127 WRITE (6,*) 'IFSURT =',IFSURT
128 WRITE (6,*) 'IFWCNO =',IFWCNO
129
130 DO 500 IFIELD=1,NFIELD
131 WRITE (6,*) ' '
132 WRITE (6,*) 'IFTMSH for field',IFIELD,' = ',IFTMSH(IFIELD)
133 WRITE (6,*) 'IFADVC for field',IFIELD,' = ',IFADVC(IFIELD)
134 WRITE (6,*) 'IFNONL for field',IFIELD,' = ',IFNONL(IFIELD)
135 500 CONTINUE
136 WRITE (6,*) ' '
137 if (param(99).gt.0) write(6,*) 'Dealiasing enabled, nxd=', nxd
138 ENDIF
139C
140 RETURN
141 END
142C
143c-----------------------------------------------------------------------
144 SUBROUTINE SETRZER
145C-------------------------------------------------------------------
146C
147C Check for axisymmetric case.
148C Are some of the elements close to the axis?
149C
150C-------------------------------------------------------------------
151 INCLUDE 'SIZE'
152 INCLUDE 'GEOM'
153 INCLUDE 'INPUT'
154C
155C Single or double precision???
156C
157 DELTA = 1.E-9
158 X = 1.+DELTA
159 Y = 1.
160 DIFF = ABS(X-Y)
161 IF (DIFF.EQ.0.) EPS = 1.E-7
162 IF (DIFF.GT.0.) EPS = 1.E-14
163 eps1 = 1.e-6 ! for prenek mesh in real*4
164C
165 DO 100 IEL=1,NELT
166 IFRZER(IEL) = .FALSE.
167 IF (IFAXIS) THEN
168 NVERT = 0
169 DO 10 IC=1,4
170 IF(ABS(YC(IC,IEL)).LT.EPS1) THEN
171 NVERT = NVERT+1
172 YC(IC,IEL) = 0.0 ! exactly on the axis
173 ENDIF
174 10 CONTINUE
175 ENDIF
176 IEDGE = 1
177 IF ((NVERT.EQ.2).AND.(CCURVE(IEDGE,IEL).EQ.' '))
178 $ IFRZER(IEL) = .TRUE.
179 100 CONTINUE
180 RETURN
181 END
182C
183c-----------------------------------------------------------------------
184 SUBROUTINE CHKNORD (IFALGN,IFNORX,IFNORY,IFNORZ,IFC,IEL)
185C
186C Check direction of normal of an element face for
187C alignment with the X, Y, or Z axis.
188C
189 INCLUDE 'SIZE'
190 INCLUDE 'GEOM'
191C
192 LOGICAL IFALGN,IFNORX,IFNORY,IFNORZ
193C
194 SUMX = 0.0
195 SUMY = 0.0
196 SUMZ = 0.0
197 TOLNOR = 1.0e-3
198 IFALGN = .FALSE.
199 IFNORX = .FALSE.
200 IFNORY = .FALSE.
201 IFNORZ = .FALSE.
202C
203 IF (ldim.EQ.2) THEN
204C
205 NCPF = lx1
206 DO 100 IX=1,lx1
207 SUMX = SUMX + ABS( ABS(UNX(IX,1,IFC,IEL)) - 1.0 )
208 SUMY = SUMY + ABS( ABS(UNY(IX,1,IFC,IEL)) - 1.0 )
209 100 CONTINUE
210 SUMX = SUMX / NCPF
211 SUMY = SUMY / NCPF
212 IF ( SUMX.LT.TOLNOR ) THEN
213 IFNORX = .TRUE.
214 IFALGN = .TRUE.
215 ENDIF
216 IF ( SUMY.LT.TOLNOR ) THEN
217 IFNORY = .TRUE.
218 IFALGN = .TRUE.
219 ENDIF
220C
221 ELSE
222C
223 NCPF = lx1*lx1
224 DO 200 IX=1,lx1
225 DO 200 IY=1,ly1
226 SUMX = SUMX + ABS( ABS(UNX(IX,IY,IFC,IEL)) - 1.0 )
227 SUMY = SUMY + ABS( ABS(UNY(IX,IY,IFC,IEL)) - 1.0 )
228 SUMZ = SUMZ + ABS( ABS(UNZ(IX,IY,IFC,IEL)) - 1.0 )
229 200 CONTINUE
230 SUMX = SUMX / NCPF
231 SUMY = SUMY / NCPF
232 SUMZ = SUMZ / NCPF
233 IF ( SUMX.LT.TOLNOR ) THEN
234 IFNORX = .TRUE.
235 IFALGN = .TRUE.
236 ENDIF
237 IF ( SUMY.LT.TOLNOR ) THEN
238 IFNORY = .TRUE.
239 IFALGN = .TRUE.
240 ENDIF
241 IF ( SUMZ.LT.TOLNOR ) THEN
242 IFNORZ = .TRUE.
243 IFALGN = .TRUE.
244 ENDIF
245C
246 ENDIF
247C
248 RETURN
249 END
250c-----------------------------------------------------------------------
251 SUBROUTINE CHKAXCB
252C
253 INCLUDE 'SIZE'
254 INCLUDE 'INPUT'
255 CHARACTER CB*3
256C
257 IFLD = 1
258 NFACE = 2*ldim
259C
260 DO 100 IEL=1,NELV
261 DO 100 IFC=1,NFACE
262 CB = CBC(IFC,IEL,IFLD)
263 IF (CB.EQ.'A ' .AND. IFC.NE.1) GOTO 9000
264 100 CONTINUE
265C
266 RETURN
267C
268 9000 WRITE (6,*) ' Element face on the axis of symmetry must be FACE 1'
269 WRITE (6,*) ' Element',IEL,' face',IFC,' is on the axis.'
270 call exitt
271C
272 END
273c-----------------------------------------------------------------------
274 SUBROUTINE CHKCBC (CB,IEL,IFC,IFALGN,IERR)
275 include 'SIZE'
276 include 'PARALLEL'
277 include 'INPUT'
278C
279C Check for illegal boundary conditions
280C
281 CHARACTER CB*3
282 LOGICAL IFALGN
283
284 if (ifstrs) return
285
286 ieg = lglel(iel)
287
288C Laplacian formulation only
289 IF (CB.EQ.'SH ' .OR. CB.EQ.'sh ' .OR.
290 $ CB.EQ.'SHL' .OR. CB.EQ.'shl' .OR.
291 $ CB.EQ.'S ' .OR. CB.EQ.'s ' .OR.
292 $ CB.EQ.'SL ' .OR. CB.EQ.'sl ' .OR.
293 $ CB.EQ.'MM ' .OR. CB.EQ.'mm ' .OR.
294 $ CB.EQ.'MS ' .OR. CB.EQ.'ms ' .OR.
295 $ CB.EQ.'MSI' .OR. CB.EQ.'msi' ) GOTO 9001
296
297 IF ( .NOT.IFALGN .AND.
298 $ (CB.EQ.'ON ' .OR. CB.EQ.'on ' .OR. CB.EQ.'SYM') ) GOTO 9010
299
300 RETURN
301
302 9001 WRITE (6,*) ' Illegal traction boundary conditions detected for'
303 GOTO 9999
304
305 9010 WRITE (6,*) ' Mixed B.C. on a side nonaligned with either the X,Y,
306 $ or Z axis detected for'
307
308 9999 WRITE (6,*) ' Element',ieg,' side',IFC
309 WRITE (6,*) ' Requires PN/PN-2 STRESS FORMULATION'
310
311 ierr = err + 1
312
313 END
314c-----------------------------------------------------------------------
315 SUBROUTINE BCMASK
316C
317C Zero out masks corresponding to Dirichlet boundary points.
318C
319 INCLUDE 'SIZE'
320 INCLUDE 'TSTEP'
321 INCLUDE 'INPUT'
322 INCLUDE 'MVGEOM'
323 INCLUDE 'SOLN'
324 INCLUDE 'TOPOL'
325
326 common /nekcb/ cb
327 character*3 cb
328 character*1 cb1(3)
329 equivalence (cb1,cb)
330
331 logical ifalgn,ifnorx,ifnory,ifnorz
332 integer e,f
333
334 NFACES=2*ldim
335 NXYZ =lx1*ly1*lz1
336
337C
338C Masks for moving mesh
339C
340 IF (IFMVBD) THEN
341 IFIELD = 0
342 CALL STSMASK (W1MASK,W2MASK,W3MASK)
343 do e=1,nelv
344 do f=1,nfaces
345 if (cbc(f,e,1).eq.'msi'.or.cbc(f,e,1).eq.'msi') then
346 call facev(w1mask,e,f,0.0,lx1,ly1,lz1)
347 call facev(w2mask,e,f,0.0,lx1,ly1,lz1)
348 call facev(w3mask,e,f,0.0,lx1,ly1,lz1)
349 endif
350 enddo
351 enddo
352 ENDIF
353C
354C Masks for flow variables
355C
356 IF (IFFLOW) THEN
357 IFIELD = 1
358 NEL = NELFLD(IFIELD)
359 NTOT = NXYZ*NEL
360C
361C Pressure mask
362C
363 call rone(pmask,ntot)
364 do 50 iel=1,nelt
365 do 50 iface=1,nfaces
366 cb=cbc(iface,iel,ifield)
367 if (cb.eq.'O ' .or. cb.eq.'ON ' .or.
368 $ cb.eq.'o ' .or. cb.eq.'on ')
369 $ call facev(pmask,iel,iface,0.0,lx1,ly1,lz1)
370 50 continue
371 if (nelt.gt.nelv) then
372 nn=lx1*ly1*lz1*(nelt-nelv)
373 call rzero(pmask(1,1,1,nelv+1),nn)
374 endif
375C
376C Zero out mask at Neumann-Dirichlet interfaces
377C
378 CALL DSOP(PMASK,'MUL',lx1,ly1,lz1)
379C
380C Velocity masks
381C
382 IF (IFSTRS) THEN
383 CALL STSMASK (V1MASK,V2MASK,V3MASK)
384 ELSE
385C
386 CALL RONE(V1MASK,NTOT)
387 CALL RONE(V2MASK,NTOT)
388 CALL RONE(V3MASK,NTOT)
389C
390 DO 100 IEL=1,NELV
391 DO 100 IFACE=1,NFACES
392 CB =CBC(IFACE,IEL,IFIELD)
393 CALL CHKNORD (IFALGN,IFNORX,IFNORY,IFNORZ,IFACE,IEL)
394C
395C All-Dirichlet boundary conditions
396C
397 IF (CB.EQ.'v ' .OR. CB.EQ.'V ' .OR. CB.EQ.'vl ' .OR.
398 $ cb.eq.'MV ' .or. cb.eq.'mv ' .or.
399 $ CB.EQ.'VL ' .OR. CB.EQ.'W ') THEN
400 CALL FACEV (V1MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
401 CALL FACEV (V2MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
402 CALL FACEV (V3MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
403 GOTO 100
404 ENDIF
405C
406C Mixed-Dirichlet-Neumann boundary conditions
407C
408 IF (CB.EQ.'SYM') THEN
409 IF ( .NOT.IFALGN .OR. IFNORX )
410 $ CALL FACEV (V1MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
411 IF ( IFNORY )
412 $ CALL FACEV (V2MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
413 IF ( IFNORZ )
414 $ CALL FACEV (V3MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
415 GOTO 100
416 ENDIF
417
418 IF (CB.EQ.'ON ' .OR. CB.EQ.'on ') THEN
419 IF ( IFNORY .OR. IFNORZ )
420 $ CALL FACEV (V1MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
421 IF ( .NOT.IFALGN .OR. IFNORX .OR. IFNORZ )
422 $ CALL FACEV (V2MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
423 IF ( .NOT.IFALGN .OR. IFNORX .OR. IFNORY )
424 $ CALL FACEV (V3MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
425 GOTO 100
426 ENDIF
427 IF (CB.EQ.'A ') THEN
428 CALL FACEV (V2MASK,IEL,IFACE,0.0,lx1,ly1,lz1)
429 ENDIF
430 100 CONTINUE
431
432 call opdsop(v1mask,v2mask,v3mask,'MUL') ! no rotation for mul
433
434 ENDIF
435
436 CALL RONE(OMASK,NTOT)
437 DO 200 IEL=1,NELV
438 DO 200 IFACE=1,NFACES
439 CB =CBC(IFACE,IEL,IFIELD)
440 IF (CB.EQ.'A ') THEN
441 CALL FACEV (OMASK,IEL,IFACE,0.0,lx1,ly1,lz1)
442 ENDIF
443 200 CONTINUE
444 CALL DSOP(OMASK,'MUL',lx1,ly1,lz1)
445C
446 ENDIF
447C
448C Masks for passive scalars
449C
450 IF (IFHEAT) THEN
451C
452 DO 1200 IFIELD=2,NFIELD
453 IPSCAL = IFIELD-1
454 NEL = NELFLD(IFIELD)
455 NTOT = NXYZ*NEL
456 CALL RONE (TMASK(1,1,1,1,IPSCAL),NTOT)
457 DO 1100 IEL=1,NEL
458 DO 1100 IFACE=1,NFACES
459 CB =CBC(IFACE,IEL,IFIELD)
460C
461C Assign mask values.
462C
463 IF (CB.EQ.'T ' .OR. CB.EQ.'t ' .OR.
464 $ (CB.EQ.'A ' .AND. IFAZIV) .OR.
465 $ CB.EQ.'MCI' .OR. CB.EQ.'MLI' .OR.
466 $ CB.EQ.'KD ' .OR. CB.EQ.'kd ' .OR.
467 $ CB.EQ.'ED ' .OR. CB.EQ.'ed ' .OR.
468 $ CB.EQ.'KW ' .OR. CB.EQ.'KWS' .OR. CB.EQ.'EWS')
469 $ CALL FACEV (TMASK(1,1,1,1,IPSCAL),
470 $ IEL,IFACE,0.0,lx1,ly1,lz1)
471 1100 CONTINUE
472 CALL DSOP (TMASK(1,1,1,1,IPSCAL),'MUL',lx1,ly1,lz1)
473 1200 CONTINUE
474C
475 ENDIF
476C
477C Masks for B-field
478C
479 if (ifmhd) then
480 ifield = ifldmhd
481 nel = nelfld(ifield)
482 ntot = nxyz*nel
483C
484C B-field pressure mask
485C
486 call rone(bpmask,ntot)
487 do iel=1,nelv
488 do iface=1,nfaces
489 cb=cbc(iface,iel,ifield)
490 if (cb.eq.'O ' .or. cb.eq.'ON ')
491 $ call facev(bpmask,iel,iface,0.0,lx1,ly1,lz1)
492 enddo
493 enddo
494C
495C Zero out mask at Neumann-Dirichlet interfaces
496C
497 call dsop(bpmask,'MUL',lx1,ly1,lz1)
498C
499C B-field masks
500C
501 if (ifstrs) then
502 call stsmask (b1mask,b2mask,b3mask)
503 else
504C
505 call rone(b1mask,ntot)
506 call rone(b2mask,ntot)
507 call rone(b3mask,ntot)
508C
509 do iel=1,nelv
510 do iface=1,nfaces
511 cb =cbc(iface,iel,ifield)
512 call chknord (ifalgn,ifnorx,ifnory,ifnorz,iface,iel)
513c
514 if (cb.eq.'v ' .or. cb.eq.'V ' .or. cb.eq.'vl ' .or.
515 $ cb.eq.'VL ' .or. cb.eq.'W ') then
516c
517c All-Dirichlet boundary conditions
518c
519 call facev (b1mask,iel,iface,0.0,lx1,ly1,lz1)
520 call facev (b2mask,iel,iface,0.0,lx1,ly1,lz1)
521 call facev (b3mask,iel,iface,0.0,lx1,ly1,lz1)
522c
523 elseif (cb.eq.'SYM') then
524c
525c Mixed-Dirichlet-Neumann boundary conditions
526c
527 if ( .not.ifalgn .or. ifnorx )
528 $ call facev (b1mask,iel,iface,0.0,lx1,ly1,lz1)
529 if ( ifnory )
530 $ call facev (b2mask,iel,iface,0.0,lx1,ly1,lz1)
531 if ( ifnorz )
532 $ call facev (b3mask,iel,iface,0.0,lx1,ly1,lz1)
533c
534 elseif (cb.eq.'ON ') then
535c
536c Mixed-Dirichlet-Neumann boundary conditions
537c
538 if ( ifnory .or. ifnorz )
539 $ call facev (b1mask,iel,iface,0.0,lx1,ly1,lz1)
540 if ( .not.ifalgn .or. ifnorx .or. ifnorz )
541 $ call facev (b2mask,iel,iface,0.0,lx1,ly1,lz1)
542 if ( .not.ifalgn .or. ifnorx .or. ifnory )
543 $ call facev (b3mask,iel,iface,0.0,lx1,ly1,lz1)
544c
545 elseif (cb.eq.'A ') then
546c
547c axisymmetric centerline
548c
549 call facev (b2mask,iel,iface,0.0,lx1,ly1,lz1)
550c
551 else
552c
553 if ( cb1(1).eq.'d' )
554 $ call facev (b1mask,iel,iface,0.0,lx1,ly1,lz1)
555 if ( cb1(2).eq.'d' )
556 $ call facev (b2mask,iel,iface,0.0,lx1,ly1,lz1)
557 if ( cb1(3).eq.'d' .and. if3d )
558 $ call facev (b3mask,iel,iface,0.0,lx1,ly1,lz1)
559c
560 endif
561 enddo
562 enddo
563c
564 call dsop(b1mask,'MUL',lx1,ly1,lz1)
565 call dsop(b2mask,'MUL',lx1,ly1,lz1)
566 if (ldim.eq.3) call dsop(b3mask,'MUL',lx1,ly1,lz1)
567 endif
568 endif
569C
570 RETURN
571 END
572c-----------------------------------------------------------------------
573 SUBROUTINE BCDIRVC(V1,V2,V3,mask1,mask2,mask3)
574C
575C Apply Dirichlet boundary conditions to surface of vector (V1,V2,V3).
576C Use IFIELD as a guide to which boundary conditions are to be applied.
577C
578 INCLUDE 'SIZE'
579 INCLUDE 'TSTEP'
580 INCLUDE 'INPUT'
581 INCLUDE 'GEOM'
582 INCLUDE 'SOLN'
583 INCLUDE 'TOPOL'
584 INCLUDE 'CTIMER'
585 COMMON /SCRUZ/ TMP1(LX1,LY1,LZ1,LELV)
586 $ , TMP2(LX1,LY1,LZ1,LELV)
587 $ , TMP3(LX1,LY1,LZ1,LELV)
588 COMMON /SCRMG/ TMQ1(LX1,LY1,LZ1,LELV)
589 $ , TMQ2(LX1,LY1,LZ1,LELV)
590 $ , TMQ3(LX1,LY1,LZ1,LELV)
591C
592 REAL V1(lx1,ly1,lz1,LELV),V2(lx1,ly1,lz1,LELV)
593 $ ,V3(lx1,ly1,lz1,LELV)
594 real mask1(lx1,ly1,lz1,lelv),mask2(lx1,ly1,lz1,lelv)
595 $ ,mask3(lx1,ly1,lz1,lelv)
596c
597 common /nekcb/ cb
598 character cb*3
599 character*1 cb1(3)
600 equivalence (cb1,cb)
601c
602 logical ifonbc
603c
604 ifonbc = .false.
605c
606 if (icalld.eq.0) then
607 tusbc=0.0
608 nusbc=0
609 icalld=icalld+1
610 endif
611 nusbc=nusbc+1
612 etime1=dnekclock()
613C
614C
615 NFACES=2*ldim
616 NXYZ =lx1*ly1*lz1
617 NEL =NELFLD(IFIELD)
618 NTOT =NXYZ*NEL
619C
620 CALL RZERO(TMP1,NTOT)
621 CALL RZERO(TMP2,NTOT)
622 IF (IF3D) CALL RZERO(TMP3,NTOT)
623C
624C Velocity boundary conditions
625C
626c write(6,*) 'BCDIRV: ifield',ifield
627 DO 2100 ISWEEP=1,2
628 DO 2000 IE=1,NEL
629 DO 2000 IFACE=1,NFACES
630 CB = CBC(IFACE,IE,IFIELD)
631 BC1 = BC(1,IFACE,IE,IFIELD)
632 BC2 = BC(2,IFACE,IE,IFIELD)
633 BC3 = BC(3,IFACE,IE,IFIELD)
634
635 IF (CB.EQ.'V ' .OR. CB.EQ.'VL ' .OR.
636 $ CB.EQ.'WS ' .OR. CB.EQ.'WSL') THEN
637 CALL FACEV (TMP1,IE,IFACE,BC1,lx1,ly1,lz1)
638 CALL FACEV (TMP2,IE,IFACE,BC2,lx1,ly1,lz1)
639 IF (IF3D) CALL FACEV (TMP3,IE,IFACE,BC3,lx1,ly1,lz1)
640 IF ( IFQINP(IFACE,IE) )
641 $ CALL GLOBROT (TMP1(1,1,1,IE),TMP2(1,1,1,IE),
642 $ TMP3(1,1,1,IE),IE,IFACE)
643 ENDIF
644
645 IF (CB.EQ.'v ' .OR. CB.EQ.'vl ' .OR.
646 $ CB.EQ.'ws ' .OR. CB.EQ.'wsl' .OR.
647 $ CB.EQ.'mv ' .OR. CB.EQ.'mvn' .OR.
648 $ cb1(1).eq.'d'.or.cb1(2).eq.'d'.or.cb1(3).eq.'d') then
649
650 call faceiv (cb,tmp1(1,1,1,ie),tmp2(1,1,1,ie),
651 $ tmp3(1,1,1,ie),ie,iface,lx1,ly1,lz1)
652
653 IF ( IFQINP(IFACE,IE) )
654 $ CALL GLOBROT (TMP1(1,1,1,IE),TMP2(1,1,1,IE),
655 $ TMP3(1,1,1,IE),IE,IFACE)
656 ENDIF
657
658 IF (CB.EQ.'ON ' .OR. CB.EQ.'on ') then ! 5/21/01 pff
659 ifonbc =.true.
660 CALL FACEIV ('v ',TMP1(1,1,1,IE),TMP2(1,1,1,IE),
661 $ TMP3(1,1,1,IE),IE,IFACE,lx1,ly1,lz1)
662 ENDIF
663
664 2000 CONTINUE
665 DO 2010 IE=1,NEL
666 DO 2010 IFACE=1,NFACES
667 IF (CBC(IFACE,IE,IFIELD).EQ.'W ') THEN
668 CALL FACEV (TMP1,IE,IFACE,0.0,lx1,ly1,lz1)
669 CALL FACEV (TMP2,IE,IFACE,0.0,lx1,ly1,lz1)
670 IF (IF3D) CALL FACEV (TMP3,IE,IFACE,0.0,lx1,ly1,lz1)
671 ENDIF
672 2010 CONTINUE
673C
674C Take care of Neumann-Dirichlet shared edges...
675C
676 if (isweep.eq.1) then
677 call opdsop(tmp1,tmp2,tmp3,'MXA')
678 else
679 call opdsop(tmp1,tmp2,tmp3,'MNA')
680 endif
681 2100 CONTINUE
682C
683C Copy temporary array to velocity arrays.
684C
685 IF ( .NOT.IFSTRS ) THEN
686 CALL COL2(V1,mask1,NTOT)
687 CALL COL2(V2,mask2,NTOT)
688 IF (IF3D) CALL COL2(V3,mask3,NTOT)
689 if (ifonbc) then
690 call antimsk1(tmp1,mask1,ntot)
691 call antimsk1(tmp2,mask2,ntot)
692 if (if3d) call antimsk1(tmp3,mask3,ntot)
693 endif
694 ELSE
695 CALL RMASK (V1,V2,V3,NELV)
696 ENDIF
697
698 CALL ADD2(V1,TMP1,NTOT)
699 CALL ADD2(V2,TMP2,NTOT)
700 IF (IF3D) CALL ADD2(V3,TMP3,NTOT)
701
702 if (ifneknekc) call fix_surface_flux
703
704 tusbc=tusbc+(dnekclock()-etime1)
705
706 RETURN
707 END
708c-----------------------------------------------------------------------
709 SUBROUTINE BCDIRSC(S)
710C
711C Apply Dirichlet boundary conditions to surface of scalar, S.
712C Use IFIELD as a guide to which boundary conditions are to be applied.
713C
714 INCLUDE 'SIZE'
715 INCLUDE 'TSTEP'
716 INCLUDE 'INPUT'
717 INCLUDE 'SOLN'
718 INCLUDE 'TOPOL'
719 INCLUDE 'CTIMER'
720C
721 DIMENSION S(LX1,LY1,LZ1,LELT)
722 COMMON /SCRSF/ TMP(LX1,LY1,LZ1,LELT)
723 $ , TMA(LX1,LY1,LZ1,LELT)
724 $ , SMU(LX1,LY1,LZ1,LELT)
725 common /nekcb/ cb
726 CHARACTER CB*3
727
728 if (icalld.eq.0) then
729 tusbc=0.0
730 nusbc=0
731 icalld=icalld+1
732 endif
733 nusbc=nusbc+1
734 etime1=dnekclock()
735C
736 IFLD = 1
737 NFACES = 2*ldim
738 NXYZ = lx1*ly1*lz1
739 NEL = NELFLD(IFIELD)
740 NTOT = NXYZ*NEL
741 NFLDT = NFIELD - 1
742C
743 CALL RZERO(TMP,NTOT)
744C
745C Temperature boundary condition
746C
747 DO 2100 ISWEEP=1,2
748C
749 DO 2010 IE=1,NEL
750 DO 2010 IFACE=1,NFACES
751 CB=CBC(IFACE,IE,IFIELD)
752 BC1=BC(1,IFACE,IE,IFIELD)
753 BC2=BC(2,IFACE,IE,IFIELD)
754 BC3=BC(3,IFACE,IE,IFIELD)
755 BC4=BC(4,IFACE,IE,IFIELD)
756 BCK=BC(4,IFACE,IE,IFLD)
757 BCE=BC(5,IFACE,IE,IFLD)
758 IF (CB.EQ.'T ') CALL FACEV (TMP,IE,IFACE,BC1,lx1,ly1,lz1)
759 IF (CB.EQ.'MCI') CALL FACEV (TMP,IE,IFACE,BC4,lx1,ly1,lz1)
760 IF (CB.EQ.'MLI') CALL FACEV (TMP,IE,IFACE,BC4,lx1,ly1,lz1)
761 IF (CB.EQ.'KD ') CALL FACEV (TMP,IE,IFACE,BCK,lx1,ly1,lz1)
762 IF (CB.EQ.'ED ') CALL FACEV (TMP,IE,IFACE,BCE,lx1,ly1,lz1)
763 IF (CB.EQ.'t ' .OR. CB.EQ.'kd ' .or.
764 $ CB.EQ.'ed ' .or. cb.eq.'o ' .or. cb.eq.'on ')
765 $ CALL FACEIS (CB,TMP(1,1,1,IE),IE,IFACE,lx1,ly1,lz1)
766 2010 CONTINUE
767C
768C Take care of Neumann-Dirichlet shared edges...
769C
770 IF (ISWEEP.EQ.1) CALL DSOP(TMP,'MXA',lx1,ly1,lz1)
771 IF (ISWEEP.EQ.2) CALL DSOP(TMP,'MNA',lx1,ly1,lz1)
772 2100 CONTINUE
773C
774C Copy temporary array to temperature array.
775C
776 CALL COL2(S,TMASK(1,1,1,1,IFIELD-1),NTOT)
777 CALL ADD2(S,TMP,NTOT)
778
779 tusbc=tusbc+(dnekclock()-etime1)
780
781 RETURN
782 END
783C
784c-----------------------------------------------------------------------
785 SUBROUTINE BCNEUSC(S,ITYPE)
786C
787C Apply Neumann boundary conditions to surface of scalar, S.
788C Use IFIELD as a guide to which boundary conditions are to be applied.
789C
790C If ITYPE = 1, then S is returned as the rhs contribution to the
791C volumetric flux.
792C
793C If ITYPE =-1, then S is returned as the lhs contribution to the
794C diagonal of A.
795C
796C
797 INCLUDE 'SIZE'
798 INCLUDE 'TOTAL'
799 INCLUDE 'CTIMER'
800 INCLUDE 'NEKUSE'
801C
802 DIMENSION S(LX1,LY1,LZ1,LELT)
803 common /nekcb/ cb
804 CHARACTER CB*3
805C
806 if (icalld.eq.0) then
807 tusbc=0.0
808 nusbc=0
809 icalld=icalld+1
810 endif
811 nusbc=nusbc+1
812 etime1=dnekclock()
813C
814 NFACES=2*ldim
815 NXYZ =lx1*ly1*lz1
816 NEL =NELFLD(IFIELD)
817 NTOT =NXYZ*NEL
818 CALL RZERO(S,NTOT)
819C
820 IF (ITYPE.EQ.-1) THEN
821C
822C Compute diagonal contributions to accomodate Robin boundary conditions
823C
824 DO 1000 IE=1,NEL
825 DO 1000 IFACE=1,NFACES
826 ieg=lglel(ie)
827 CB =CBC(IFACE,IE,IFIELD)
828 IF (CB.EQ.'C ' .OR. CB.EQ.'c ' .OR.
829 $ CB.EQ.'R ' .OR. CB.EQ.'r ') THEN
830C
831 IF (CB.EQ.'C ') HC = BC(2,IFACE,IE,IFIELD)
832 IF (CB.EQ.'R ') THEN
833 TINF = BC(1,IFACE,IE,IFIELD)
834 HRAD = BC(2,IFACE,IE,IFIELD)
835 ENDIF
836 IA=0
837C
838C IA is areal counter, assumes advancing fastest index first. (IX...IY...IZ)
839C
840 CALL FACIND (KX1,KX2,KY1,KY2,KZ1,KZ2,lx1,ly1,lz1,IFACE)
841 DO 100 IZ=KZ1,KZ2
842 DO 100 IY=KY1,KY2
843 DO 100 IX=KX1,KX2
844 IA = IA + 1
845 TS = T(IX,IY,IZ,IE,IFIELD-1)
846 IF (CB.EQ.'c ' .OR. CB.EQ.'r ') THEN
847 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IE)
848 CALL USERBC (IX,IY,IZ,IFACE,IEG)
849 ENDIF
850 IF (CB.EQ.'r ' .OR. CB.EQ.'R ')
851 $ HC = HRAD * (TINF**2 + TS**2) * (TINF + TS)
852 S(IX,IY,IZ,IE) = S(IX,IY,IZ,IE) +
853 $ HC*AREA(IA,1,IFACE,IE)/BM1(IX,IY,IZ,IE)
854 100 CONTINUE
855 ENDIF
856 1000 CONTINUE
857 ENDIF
858 IF (ITYPE.EQ.1) THEN
859C
860C Add passive scalar fluxes to rhs
861C
862 DO 2000 IE=1,NEL
863 DO 2000 IFACE=1,NFACES
864 ieg=lglel(ie)
865 CB =CBC(IFACE,IE,IFIELD)
866 IF (CB.EQ.'F ' .OR. CB.EQ.'f ' .OR.
867 $ CB.EQ.'C ' .OR. CB.EQ.'c ' .OR.
868 $ CB.EQ.'R ' .OR. CB.EQ.'r ' ) THEN
869C
870 IF (CB.EQ.'F ') FLUX=BC(1,IFACE,IE,IFIELD)
871 IF (CB.EQ.'C ') FLUX=BC(1,IFACE,IE,IFIELD)
872 $ *BC(2,IFACE,IE,IFIELD)
873 IF (CB.EQ.'R ') THEN
874 TINF=BC(1,IFACE,IE,IFIELD)
875 HRAD=BC(2,IFACE,IE,IFIELD)
876 ENDIF
877C
878C Add local weighted flux values to rhs, S.
879C
880C IA is areal counter, assumes advancing fastest index first. (IX...IY...IZ)
881 IA=0
882 CALL FACIND (KX1,KX2,KY1,KY2,KZ1,KZ2,lx1,ly1,lz1,IFACE)
883 DO 200 IZ=KZ1,KZ2
884 DO 200 IY=KY1,KY2
885 DO 200 IX=KX1,KX2
886 IA = IA + 1
887 TS = T(IX,IY,IZ,IE,IFIELD-1)
888 IF (CB.EQ.'f ') THEN
889 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IE)
890 CALL USERBC (IX,IY,IZ,IFACE,IEG)
891 ENDIF
892 IF (CB.EQ.'c ') THEN
893 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IE)
894 CALL USERBC (IX,IY,IZ,IFACE,IEG)
895 FLUX = TINF*HC
896 ENDIF
897 IF (CB.EQ.'r ') THEN
898 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IE)
899 CALL USERBC (IX,IY,IZ,IFACE,IEG)
900 ENDIF
901 IF (CB.EQ.'R ' .OR. CB.EQ.'r ')
902 $ FLUX = HRAD*(TINF**2 + TS**2)*(TINF + TS) * TINF
903C
904C Add computed fluxes to boundary surfaces:
905C
906 S(IX,IY,IZ,IE) = S(IX,IY,IZ,IE)
907 $ + FLUX*AREA(IA,1,IFACE,IE)
908 200 CONTINUE
909 ENDIF
910 2000 CONTINUE
911 ENDIF
912C
913 tusbc=tusbc+(dnekclock()-etime1)
914C
915 RETURN
916 END
917c-----------------------------------------------------------------------
918 SUBROUTINE FACEIS (CB,S,IEL,IFACE,NX,NY,NZ)
919C
920C Assign inflow boundary conditions to face(IE,IFACE)
921C for scalar S.
922C
923 INCLUDE 'SIZE'
924 INCLUDE 'PARALLEL'
925 INCLUDE 'NEKUSE'
926 INCLUDE 'TSTEP' ! ifield 11/19/2010
927 INCLUDE 'SOLN' ! tmask() 11/19/2010
928C
929 DIMENSION S(LX1,LY1,LZ1)
930 CHARACTER CB*3
931c
932 common /nekcb/ cb3
933 character*3 cb3
934 cb3 = cb
935
936 ifld1 = ifield-1
937
938
939C Passive scalar term
940
941 ieg = lglel(iel)
942 CALL FACIND (KX1,KX2,KY1,KY2,KZ1,KZ2,NX,NY,NZ,IFACE)
943
944 if (cb.eq.'t ') then
945 DO 100 IZ=KZ1,KZ2 ! 11/19/2010: The tmask() screen
946 DO 100 IY=KY1,KY2 ! added here so users can leave
947 DO 100 IX=KX1,KX2 ! certain points to be Neumann,
948 if (tmask(ix,iy,iz,iel,ifld1).eq.0) then ! if desired.
949 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
950 CALL USERBC (IX,IY,IZ,IFACE,IEG)
951 S(IX,IY,IZ) = TEMP
952 endif
953 100 CONTINUE
954 RETURN
955
956 elseif (cb.eq.'o ' .or. cb.eq.'on ') then
957 DO 101 IZ=KZ1,KZ2 ! 11/19/2010: The tmask() screen
958 DO 101 IY=KY1,KY2 ! added here so users can leave
959 DO 101 IX=KX1,KX2 ! certain points to be Neumann,
960 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
961 CALL USERBC (IX,IY,IZ,IFACE,IEG)
962 S(IX,IY,IZ) = PA
963 101 CONTINUE
964 RETURN
965
966 ELSEIF (CB.EQ.'ms ' .OR. CB.EQ.'msi') THEN
967
968 DO 200 IZ=KZ1,KZ2
969 DO 200 IY=KY1,KY2
970 DO 200 IX=KX1,KX2
971 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
972 CALL USERBC (IX,IY,IZ,IFACE,IEG)
973 S(IX,IY,IZ) = SIGMA
974 200 CONTINUE
975C
976 ELSEIF (CB.EQ.'kd ') THEN
977C
978 DO 300 IZ=KZ1,KZ2
979 DO 300 IY=KY1,KY2
980 DO 300 IX=KX1,KX2
981 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
982 CALL USERBC (IX,IY,IZ,IFACE,IEG)
983 S(IX,IY,IZ) = TURBK
984 300 CONTINUE
985C
986 ELSEIF (CB.EQ.'ed ') THEN
987C
988 DO 400 IZ=KZ1,KZ2
989 DO 400 IY=KY1,KY2
990 DO 400 IX=KX1,KX2
991 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
992 CALL USERBC (IX,IY,IZ,IFACE,IEG)
993 S(IX,IY,IZ) = TURBE
994 400 CONTINUE
995C
996 ENDIF
997C
998 RETURN
999 END
1000c-----------------------------------------------------------------------
1001 SUBROUTINE FACEIV (CB,V1,V2,V3,IEL,IFACE,NX,NY,NZ)
1002C
1003C Assign fortran function boundary conditions to
1004C face IFACE of element IEL for vector (V1,V2,V3).
1005C
1006 INCLUDE 'SIZE'
1007 INCLUDE 'NEKUSE'
1008 INCLUDE 'PARALLEL'
1009C
1010 dimension v1(nx,ny,nz),v2(nx,ny,nz),v3(nx,ny,nz)
1011 character cb*3
1012c
1013 character*1 cb1(3)
1014c
1015 common /nekcb/ cb3
1016 character*3 cb3
1017 cb3 = cb
1018c
1019 call chcopy(cb1,cb,3)
1020c
1021 ieg = lglel(iel)
1022 CALL FACIND (KX1,KX2,KY1,KY2,KZ1,KZ2,NX,NY,NZ,IFACE)
1023C
1024 IF (CB.EQ.'v ' .OR. CB.EQ.'ws ' .OR. CB.EQ.'mv '.OR.
1025 $ CB.EQ.'mvn') THEN
1026C
1027 DO 100 IZ=KZ1,KZ2
1028 DO 100 IY=KY1,KY2
1029 DO 100 IX=KX1,KX2
1030 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1031 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1032 V1(IX,IY,IZ) = UX
1033 V2(IX,IY,IZ) = UY
1034 V3(IX,IY,IZ) = UZ
1035 100 CONTINUE
1036 RETURN
1037C
1038 elseif (cb1(1).eq.'d'.or.cb1(2).eq.'d'.or.cb1(3).eq.'d') then
1039C
1040 do iz=kz1,kz2
1041 do iy=ky1,ky2
1042 do ix=kx1,kx2
1043 if (optlevel.le.2) call nekasgn (ix,iy,iz,iel)
1044 call userbc (ix,iy,iz,iface,ieg)
1045 if (cb1(1).eq.'d') v1(ix,iy,iz) = ux
1046 if (cb1(2).eq.'d') v2(ix,iy,iz) = uy
1047 if (cb1(3).eq.'d') v3(ix,iy,iz) = uz
1048 enddo
1049 enddo
1050 enddo
1051 return
1052C
1053 ELSEIF (CB.EQ.'vl ' .OR. CB.EQ.'wsl') THEN
1054C
1055 DO 120 IZ=KZ1,KZ2
1056 DO 120 IY=KY1,KY2
1057 DO 120 IX=KX1,KX2
1058 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1059 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1060 V1(IX,IY,IZ) = UN
1061 V2(IX,IY,IZ) = U1
1062 V3(IX,IY,IZ) = U2
1063 120 CONTINUE
1064 RETURN
1065C
1066 ELSEIF (CB.EQ.'s ' .OR. CB.EQ.'sh ') THEN
1067C
1068 DO 200 IZ=KZ1,KZ2
1069 DO 200 IY=KY1,KY2
1070 DO 200 IX=KX1,KX2
1071 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1072 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1073 V1(IX,IY,IZ) = TRX
1074 V2(IX,IY,IZ) = TRY
1075 V3(IX,IY,IZ) = TRZ
1076 200 CONTINUE
1077 RETURN
1078C
1079 ELSEIF (CB.EQ.'sl ' .OR. CB.EQ.'shl') THEN
1080C
1081 DO 220 IZ=KZ1,KZ2
1082 DO 220 IY=KY1,KY2
1083 DO 220 IX=KX1,KX2
1084 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1085 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1086 V1(IX,IY,IZ) = TRN
1087 V2(IX,IY,IZ) = TR1
1088 V3(IX,IY,IZ) = TR2
1089 220 CONTINUE
1090C
1091 ELSEIF (CB.EQ.'ms ') THEN
1092C
1093 DO 240 IZ=KZ1,KZ2
1094 DO 240 IY=KY1,KY2
1095 DO 240 IX=KX1,KX2
1096 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1097 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1098 V1(IX,IY,IZ) = -PA
1099 V2(IX,IY,IZ) = TR1
1100 V3(IX,IY,IZ) = TR2
1101 240 CONTINUE
1102C
1103 ELSEIF (CB.EQ.'on ' .OR. CB.EQ.'o ') THEN
1104C
1105 DO 270 IZ=KZ1,KZ2
1106 DO 270 IY=KY1,KY2
1107 DO 270 IX=KX1,KX2
1108 if (optlevel.le.2) CALL NEKASGN (IX,IY,IZ,IEL)
1109 CALL USERBC (IX,IY,IZ,IFACE,IEG)
1110 V1(IX,IY,IZ) = -PA
1111 V2(IX,IY,IZ) = 0.0
1112 V3(IX,IY,IZ) = 0.0
1113 270 CONTINUE
1114C
1115 ENDIF
1116C
1117 RETURN
1118 END
1119c-----------------------------------------------------------------------
1120 subroutine nekasgn (ix,iy,iz,e)
1121C
1122C Assign NEKTON variables for definition (by user) of
1123C boundary conditions at collocation point (IX,IY,IZ)
1124C of element IEL.
1125C
1126C X X-coordinate
1127C Y Y-coordinate
1128C Z Z-coordinate
1129C UX X-velocity
1130C UY Y-velocity
1131C UZ Z-velocity
1132C TEMP Temperature
1133C PS1 Passive scalar No. 1
1134C PS2 Passive scalar No. 2
1135C . .
1136C . .
1137C PS9 Passive scalar No. 9
1138C SI2 Strainrate invariant II
1139C SI3 Strainrate invariant III
1140C
1141C Variables to be defined by user for imposition of
1142C boundary conditions :
1143C
1144C SH1 Shear component No. 1
1145C SH2 Shear component No. 2
1146C TRX X-traction
1147C TRY Y-traction
1148C TRZ Z-traction
1149C SIGMA Surface-tension coefficient
1150C FLUX Flux
1151C HC Convection heat transfer coefficient
1152C HRAD Radiation heat transfer coefficient
1153C TINF Temperature at infinity
1154C
1155 INCLUDE 'SIZE'
1156 INCLUDE 'GEOM'
1157 INCLUDE 'SOLN'
1158 INCLUDE 'INPUT'
1159 INCLUDE 'TSTEP'
1160 INCLUDE 'NEKUSE'
1161
1162 integer e
1163
1164 common /nekcb/ cb
1165 character cb*3
1166
1167 COMMON /SCREV / SII (LX1,LY1,LZ1,LELT)
1168 $ , SIII(LX1,LY1,LZ1,LELT)
1169
1170 x = xm1(ix,iy,iz,e)
1171 y = ym1(ix,iy,iz,e)
1172 z = zm1(ix,iy,iz,e)
1173
1174 r = x**2+y**2
1175 if (r.gt.0.0) r=sqrt(r)
1176 if (x.ne.0.0 .or. y.ne.0.0) theta = atan2(y,x)
1177
1178 ux = vx(ix,iy,iz,e)
1179 uy = vy(ix,iy,iz,e)
1180 uz = vz(ix,iy,iz,e)
1181 temp = t(ix,iy,iz,e,1)
1182 do ips=1,npscal
1183 ps(ips) = t(ix,iy,iz,e,ips+1)
1184 enddo
1185
1186 pa = pr(ix,iy,iz,e)
1187 p0 = p0th
1188
1189 si2 = sii (ix,iy,iz,e)
1190 si3 = siii(ix,iy,iz,e)
1191 udiff = vdiff (ix,iy,iz,e,ifield)
1192 utrans= vtrans(ix,iy,iz,e,ifield)
1193
1194 cbu = cb
1195
1196 return
1197 end
1198c-----------------------------------------------------------------------
1199 SUBROUTINE BCNEUTR
1200C
1201 INCLUDE 'SIZE'
1202 INCLUDE 'SOLN'
1203 INCLUDE 'GEOM'
1204 INCLUDE 'INPUT'
1205 COMMON /SCRSF/ TRX(LX1,LY1,LZ1)
1206 $ , TRY(LX1,LY1,LZ1)
1207 $ , TRZ(LX1,LY1,LZ1)
1208 COMMON /CTMP0/ STC(LX1,LY1,LZ1)
1209 REAL SIGST(LX1,LY1)
1210C
1211 LOGICAL IFALGN,IFNORX,IFNORY,IFNORZ
1212 common /nekcb/ cb
1213 CHARACTER CB*3
1214C
1215 IFLD = 1
1216 NFACE = 2*ldim
1217 NXY1 = lx1*ly1
1218 NXYZ1 = lx1*ly1*lz1
1219C
1220 DO 100 IEL=1,NELV
1221 DO 100 IFC=1,NFACE
1222C
1223 CB = CBC (IFC,IEL,IFLD)
1224 BC1 = BC(1,IFC,IEL,IFLD)
1225 BC2 = BC(2,IFC,IEL,IFLD)
1226 BC3 = BC(3,IFC,IEL,IFLD)
1227 BC4 = BC(4,IFC,IEL,IFLD)
1228 CALL RZERO3 (TRX,TRY,TRZ,NXYZ1)
1229C
1230C Prescribed tractions and shear tractions
1231C
1232 IF (CB.EQ.'S ' .OR. CB.EQ.'SL ' .OR.
1233 $ CB.EQ.'SH ' .OR. CB.EQ.'SHL' ) THEN
1234 CALL TRCON (TRX,TRY,TRZ,BC1,BC2,BC3,IEL,IFC)
1235 IF (IFQINP(IFC,IEL)) CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1236 GOTO 120
1237 ENDIF
1238 IF (CB.EQ.'s ' .OR. CB.EQ.'sl ' .OR.
1239 $ CB.EQ.'sh ' .OR. CB.EQ.'shl' ) THEN
1240 CALL FACEIV (CB,TRX,TRY,TRZ,IEL,IFC,lx1,ly1,lz1)
1241 CALL FACCVS (TRX,TRY,TRZ,AREA(1,1,IFC,IEL),IFC)
1242 IF (IFQINP(IFC,IEL)) CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1243 GOTO 120
1244 ENDIF
1245C
1246C Prescribed outflow ambient pressure
1247C
1248 IF (CB.EQ.'ON ' .OR. CB.EQ.'O ') THEN
1249 BCN = -BC1
1250 BC2 = 0.0
1251 BC3 = 0.0
1252 CALL TRCON (TRX,TRY,TRZ,BCN,BC2,BC3,IEL,IFC)
1253 CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1254 GOTO 120
1255 ENDIF
1256 IF (CB.EQ.'on ' .OR. CB.EQ.'o ') THEN
1257 CALL FACEIV (CB,TRX,TRY,TRZ,IEL,IFC,lx1,ly1,lz1)
1258 CALL FACCVS (TRX,TRY,TRZ,AREA(1,1,IFC,IEL),IFC)
1259 CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1260 GOTO 120
1261 ENDIF
1262C
1263C Surface-tension
1264C
1265 IF (CB.EQ.'MS ' .OR. CB.EQ.'MSI' .OR.
1266 $ CB.EQ.'MM ' .OR. CB.EQ.'mm ' .OR.
1267 $ CB.EQ.'ms ' .OR. CB.EQ.'msi') THEN
1268 IF (CB.EQ.'MS '.or.cb.eq.'MM ') THEN
1269 BCN = -BC1
1270 CALL TRCON (TRX,TRY,TRZ,BCN,BC2,BC3,IEL,IFC)
1271 CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1272 ENDIF
1273c IF (CB.EQ.'ms '.or.cb.eq.'mm ') THEN
1274 IF (CB.EQ.'ms '.or.cb.eq.'msi') THEN
1275 CALL FACEIV (CB,TRX,TRY,TRZ,IEL,IFC,lx1,ly1,lz1)
1276 CALL FACCVS (TRX,TRY,TRZ,AREA(1,1,IFC,IEL),IFC)
1277 CALL GLOBROT (TRX,TRY,TRZ,IEL,IFC)
1278 ENDIF
1279 IF (CB(1:1).EQ.'M') THEN
1280 CALL CFILL (SIGST,BC4,NXY1)
1281 ELSE
1282 CALL FACEIS (CB,STC,IEL,IFC,lx1,ly1,lz1)
1283 CALL FACEXS (SIGST,STC,IFC,0)
1284 ENDIF
1285 IF (IFAXIS) THEN
1286 CALL TRSTAX (TRX,TRY,SIGST,IEL,IFC)
1287 ELSEIF (ldim.EQ.2) THEN
1288 CALL TRST2D (TRX,TRY,SIGST,IEL,IFC)
1289 ELSE
1290 CALL TRST3D (TRX,TRY,TRZ,SIGST,IEL,IFC)
1291 ENDIF
1292 ENDIF
1293C
1294 120 CALL ADD2 (BFX(1,1,1,IEL),TRX,NXYZ1)
1295 CALL ADD2 (BFY(1,1,1,IEL),TRY,NXYZ1)
1296 IF (ldim.EQ.3) CALL ADD2 (BFZ(1,1,1,IEL),TRZ,NXYZ1)
1297C
1298 100 CONTINUE
1299C
1300 RETURN
1301 END
1302c-----------------------------------------------------------------------
1303 SUBROUTINE TRCON (TRX,TRY,TRZ,TR1,TR2,TR3,IEL,IFC)
1304C
1305 INCLUDE 'SIZE'
1306 INCLUDE 'GEOM'
1307 INCLUDE 'TOPOL'
1308C
1309 DIMENSION TRX(LX1,LY1,LZ1)
1310 $ , TRY(LX1,LY1,LZ1)
1311 $ , TRZ(LX1,LY1,LZ1)
1312C
1313 CALL DSSET(lx1,ly1,lz1)
1314 IFACE = EFACE1(IFC)
1315 JS1 = SKPDAT(1,IFACE)
1316 JF1 = SKPDAT(2,IFACE)
1317 JSKIP1 = SKPDAT(3,IFACE)
1318 JS2 = SKPDAT(4,IFACE)
1319 JF2 = SKPDAT(5,IFACE)
1320 JSKIP2 = SKPDAT(6,IFACE)
1321 I = 0
1322C
1323 IF (ldim.EQ.2) THEN
1324 DO 100 J2=JS2,JF2,JSKIP2
1325 DO 100 J1=JS1,JF1,JSKIP1
1326 I = I + 1
1327 TRX(J1,J2,1) = TR1*AREA(I,1,IFC,IEL)
1328 TRY(J1,J2,1) = TR2*AREA(I,1,IFC,IEL)
1329 100 CONTINUE
1330 ELSE
1331 DO 200 J2=JS2,JF2,JSKIP2
1332 DO 200 J1=JS1,JF1,JSKIP1
1333 I = I + 1
1334 TRX(J1,J2,1) = TR1*AREA(I,1,IFC,IEL)
1335 TRY(J1,J2,1) = TR2*AREA(I,1,IFC,IEL)
1336 TRZ(J1,J2,1) = TR3*AREA(I,1,IFC,IEL)
1337 200 CONTINUE
1338 ENDIF
1339C
1340 RETURN
1341 END
1342c-----------------------------------------------------------------------
1343 SUBROUTINE TRST2D (TRX,TRY,SIGST,IEL,IFC)
1344C
1345C Compute taction due to surface tension (2D)
1346C
1347 INCLUDE 'SIZE'
1348 INCLUDE 'GEOM'
1349 INCLUDE 'DXYZ'
1350 INCLUDE 'TOPOL'
1351 INCLUDE 'WZ'
1352 COMMON /CTMP1/ A1X(LX1),A1Y(LX1),STX(LX1),STY(LX1)
1353C
1354 DIMENSION TRX(LX1,LY1,LZ1),TRY(LX1,LY1,LZ1),SIGST(LX1,1)
1355 DIMENSION CANG(2),SANG(2)
1356 DIMENSION IXN(2),IYN(2),IAN(2)
1357C
1358 DO 100 IX=1,lx1
1359 AA = SIGST(IX,1) * WXM1(IX)
1360 STX(IX) = T1X(IX,1,IFC,IEL) * AA
1361 STY(IX) = T1Y(IX,1,IFC,IEL) * AA
1362 100 CONTINUE
1363C
1364 IF (IFC.EQ.3 .OR. IFC.EQ.4) THEN
1365 CALL CHSIGN (STX,lx1)
1366 CALL CHSIGN (STY,lx1)
1367 ENDIF
1368C
1369 IF (IFC.EQ.1 .OR. IFC.EQ.3) THEN
1370 CALL MXM (DXTM1,lx1,STX,lx1,A1X,1)
1371 CALL MXM (DXTM1,lx1,STY,lx1,A1Y,1)
1372 ELSE
1373 CALL MXM (DYTM1,ly1,STX,ly1,A1X,1)
1374 CALL MXM (DYTM1,ly1,STY,ly1,A1Y,1)
1375 ENDIF
1376C
1377 CALL DSSET (lx1,ly1,lz1)
1378 IFACE = EFACE1(IFC)
1379 JS1 = SKPDAT(1,IFACE)
1380 JF1 = SKPDAT(2,IFACE)
1381 JSKIP1 = SKPDAT(3,IFACE)
1382 JS2 = SKPDAT(4,IFACE)
1383 JF2 = SKPDAT(5,IFACE)
1384 JSKIP2 = SKPDAT(6,IFACE)
1385 I = 0
1386C
1387 DO 200 J2=JS2,JF2,JSKIP2
1388 DO 200 J1=JS1,JF1,JSKIP1
1389 I = I + 1
1390 TRX(J1,J2,1) = TRX(J1,J2,1) - A1X(I)
1391 TRY(J1,J2,1) = TRY(J1,J2,1) - A1Y(I)
1392 200 CONTINUE
1393C
1394C Contact angle corrections
1395C
1396 CALL CTANG2D (CANG,SANG,IXN,IYN,IAN,IFC,IEL)
1397 DO 500 I=1,2
1398 IX = IXN(I)
1399 IY = IYN(I)
1400 IA = IAN(I)
1401 TRX(IX,IY,1)=TRX(IX,IY,1) + SIGST(IA,1)*CANG(I)
1402 TRY(IX,IY,1)=TRY(IX,IY,1) + SIGST(IA,1)*SANG(I)
1403 500 CONTINUE
1404C
1405 RETURN
1406 END
1407c-----------------------------------------------------------------------
1408 SUBROUTINE TRSTAX (TRX,TRY,SIGST,IEL,IFC)
1409C
1410C Compute taction due to surface tension (axisymmetric)
1411C
1412 INCLUDE 'SIZE'
1413 INCLUDE 'GEOM'
1414 INCLUDE 'DXYZ'
1415 INCLUDE 'TOPOL'
1416 INCLUDE 'WZ'
1417 COMMON /CTMP1/ A1X(LX1),A1Y(LX1),A2X(LX1),A2Y(LX1)
1418 $ , STX(LX1),STY(LX1),XJM1(LX1)
1419 COMMON /CTMP0/ XFM1(LX1),YFM1(LX1),T1XF(LX1),T1YF(LX1)
1420C
1421 DIMENSION TRX(LX1,LY1,LZ1),TRY(LX1,LY1,LZ1),SIGST(LX1,LY1)
1422 DIMENSION CANG(2),SANG(2)
1423 DIMENSION IXN(2),IYN(2),IAN(2)
1424 LOGICAL IFGLJ
1425C
1426 IFGLJ = .FALSE.
1427 IF ( IFRZER(IEL) .AND. (IFC.EQ.2 .OR. IFC.EQ.4) ) IFGLJ = .TRUE.
1428 CALL FACEC2 (XFM1,YFM1,XM1(1,1,1,IEL),YM1(1,1,1,IEL),IFC)
1429C
1430 IF (IFGLJ) THEN
1431 CALL MXM (DAM1,ly1,XFM1,ly1,T1XF,1)
1432 CALL MXM (DAM1,ly1,YFM1,ly1,T1YF,1)
1433 YS0 = T1YF(1)
1434 ELSE
1435 CALL MXM (DXM1,lx1,XFM1,lx1,T1XF,1)
1436 CALL MXM (DXM1,lx1,YFM1,lx1,T1YF,1)
1437 ENDIF
1438C
1439 DO 10 IX=1,lx1
1440 XJM1(IX)=SQRT( T1XF(IX)**2 + T1YF(IX)**2 )
1441 T1XF(IX)=T1XF(IX) / XJM1(IX)
1442 T1YF(IX)=T1YF(IX) / XJM1(IX)
1443 10 CONTINUE
1444C
1445 IF ( IFGLJ ) THEN
1446 CALL MXM (DAM1,1,T1XF,ly1,T1XS0,1)
1447 CALL MXM (DAM1,1,UNY(1,1,IFC,IEL),ly1,UNYS0,1)
1448 DDX = WAM1(1)*SIGST(1,1)*T1XS0*YS0
1449 DDY = WAM1(1)*SIGST(1,1)*T1YF(1)*YS0*2.0
1450 A2X(1) = WAM1(1)*SIGST(1,1)*XJM1(1)*UNX(1,1,IFC,IEL)*UNYS0
1451 A2Y(1) = 0.0
1452 STX(1) = 0.0
1453 STY(1) = 0.0
1454 DO 100 IY=2,ly1
1455 AA = WAM1(IY) * SIGST(IY,1) / (1.0 + ZAM1(IY))
1456 STX(IY) = T1XF(IY) * AA
1457 STY(IY) = T1YF(IY) * AA
1458 AA = AA * XJM1(IY) * UNY(IY,1,IFC,IEL)
1459 A2X(IY) = UNX(IY,1,IFC,IEL) * AA
1460 A2Y(IY) = UNY(IY,1,IFC,IEL) * AA
1461 100 CONTINUE
1462 ELSE
1463 DO 200 IX=1,lx1
1464 AA = SIGST(IX,1) * WXM1(IX)
1465 STX(IX) = T1XF(IX) * AA
1466 STY(IX) = T1YF(IX) * AA
1467 AA = AA * XJM1(IX) * UNY(IX,1,IFC,IEL)
1468 A2X(IX) = UNX(IX,1,IFC,IEL) * AA
1469 A2Y(IX) = UNY(IX,1,IFC,IEL) * AA
1470 200 CONTINUE
1471 ENDIF
1472C
1473 IF (IFGLJ) THEN
1474 DO 220 IY=1,ly1
1475 YSIY = T1YF(IY)*XJM1(IY)
1476 DTX1 = 0.0
1477 DTY1 = DATM1(IY,1)*DDY
1478 DTX2 = YSIY*STX(IY)
1479 DTY2 = YSIY*STY(IY)
1480 DTY3 = 0.0
1481 DO 240 J=2,ly1
1482 DTYS = DATM1(IY,J)*YFM1(J)
1483 DTX1 = DTX1 + DTYS*STX(J)
1484 DTY3 = DTY3 + DTYS*STY(J)
1485 240 CONTINUE
1486 A1X(IY) = DTX1 + DTX2
1487 A1Y(IY) = DTY1 + DTY2 + DTY3
1488 220 CONTINUE
1489 A1X(1) = A1X(1) + DDX
1490 ELSE
1491 CALL MXM (DXTM1,lx1,STX,lx1,A1X,1)
1492 CALL MXM (DXTM1,lx1,STY,lx1,A1Y,1)
1493 CALL COL2 (A1X,YFM1,lx1)
1494 CALL COL2 (A1Y,YFM1,lx1)
1495 ENDIF
1496C
1497 CALL DSSET (lx1,ly1,lz1)
1498 IFACE = EFACE1(IFC)
1499 JS1 = SKPDAT(1,IFACE)
1500 JF1 = SKPDAT(2,IFACE)
1501 JSKIP1 = SKPDAT(3,IFACE)
1502 JS2 = SKPDAT(4,IFACE)
1503 JF2 = SKPDAT(5,IFACE)
1504 JSKIP2 = SKPDAT(6,IFACE)
1505 I = 0
1506C
1507 DO 300 J2=JS2,JF2,JSKIP2
1508 DO 300 J1=JS1,JF1,JSKIP1
1509 I = I + 1
1510 TRX(J1,J2,1) = TRX(J1,J2,1) - A2X(I) - A1X(I)
1511 TRY(J1,J2,1) = TRY(J1,J2,1) - A2Y(I) - A1Y(I)
1512 300 CONTINUE
1513C
1514C Contact angle corrections
1515C
1516 CALL CTANG2D (CANG,SANG,IXN,IYN,IAN,IFC,IEL)
1517 DO 500 I=1,2
1518 IX = IXN(I)
1519 IY = IYN(I)
1520 IA = IAN(I)
1521 AA = SIGST(IA,1)*YM1(IX,IY,1,IEL)
1522 TRX(IX,IY,1)=TRX(IX,IY,1) + AA*CANG(I)
1523 TRY(IX,IY,1)=TRY(IX,IY,1) + AA*SANG(I)
1524 500 CONTINUE
1525C
1526 RETURN
1527 END
1528c-----------------------------------------------------------------------
1529 SUBROUTINE CTANG2D (CANG,SANG,IXN,IYN,IAN,IFC,IEL)
1530C
1531 INCLUDE 'SIZE'
1532 INCLUDE 'GEOM'
1533 INCLUDE 'SOLN'
1534 INCLUDE 'INPUT'
1535C
1536 DIMENSION CANG(2),SANG(2)
1537 DIMENSION IXN(2),IYN(2),IAN(2),ISN(2),NEBPT(4,2)
1538 CHARACTER CBN*3
1539C
1540 DATA NEBPT /4,1,2,3, 2,3,4,1/
1541 IFLD = 1
1542 EPS = 1.e-6
1543C
1544 DO 100 I=1,2
1545 IFCN = NEBPT(IFC,I)
1546 CBN = CBC(IFCN,IEL,IFLD)
1547 IXN(I) = 1
1548 IYN(I) = 1
1549 IAN(I) = 1
1550 ISN(I) = 1
1551 CANG(I) = 0.0
1552 SANG(I) = 0.0
1553 IF (CBN.EQ.'E '.OR.CBN.EQ.'P '.OR.cbn.eq.'p '.or.
1554 $ CBN(1:1).EQ.'M' .OR. CBN(1:1).EQ.'m') GOTO 100
1555 NC = IFC
1556 IF (I.EQ.2) NC=IFCN
1557 IF (NC .EQ.2 .OR. NC .EQ.3) IXN(I) = lx1
1558 IF (NC .EQ.3 .OR. NC .EQ.4) IYN(I) = ly1
1559 IF (IFC .EQ.2 .OR. IFC .EQ.3) ISN(I) = lx1
1560 IF (IFCN.EQ.2 .OR. IFCN.EQ.3) IAN(I) = lx1
1561 IX = IXN(I)
1562 IY = IYN(I)
1563 IA = IAN(I)
1564 IS = ISN(I)
1565 IF (CBN(1:1).EQ.'V' .OR. CBN(1:1).EQ.'v' .OR.
1566 $ CBN .EQ.'S ' .OR. CBN .EQ.'s ' .OR.
1567 $ CBN .EQ.'SL ' .OR. CBN .EQ.'sl ' .OR.
1568 $ CBN(1:1).EQ.'O' .OR. CBN(1:1).EQ.'o' ) THEN
1569 UX=VX(IX,IY,1,IEL)
1570 UY=VY(IX,IY,1,IEL)
1571 UM=UX**2 + UY**2
1572 IF (UM.GT.EPS) THEN
1573 UNLX=UNX(IS,1,IFCN,IEL)
1574 UNLY=UNY(IS,1,IFCN,IEL)
1575 UM=SQRT(UM)
1576 DOT =UX*UNLX + UY*UNLY
1577 IF (DOT.LT.0.0) UM=-UM
1578 CANG(I)=UX/UM
1579 SANG(I)=UY/UM
1580 GOTO 100
1581 ENDIF
1582 ENDIF
1583 CANG(I)=UNX(IS,1,IFCN,IEL)
1584 SANG(I)=UNY(IS,1,IFCN,IEL)
1585 100 CONTINUE
1586C
1587 RETURN
1588 END
1589c-----------------------------------------------------------------------
1590 SUBROUTINE TRST3D (TRX,TRY,TRZ,SIGST,IEL,IFC)
1591C
1592C Compute taction due to surface tension (3D)
1593C
1594 INCLUDE 'SIZE'
1595 INCLUDE 'GEOM'
1596 INCLUDE 'WZ'
1597 COMMON /CTMP0/ XFM1(LX1,LY1),YFM1(LX1,LY1),ZFM1(LX1,LY1)
1598 COMMON /CTMP1/ DRM1(LX1,LX1),DRTM1(LX1,LY1)
1599 $ , DSM1(LX1,LX1),DSTM1(LX1,LY1)
1600 $ , WGS(LX1,LY1)
1601 COMMON /SCRMG/ XRM1(LX1,LY1),YRM1(LX1,LY1),ZRM1(LX1,LY1)
1602 $ , XSM1(LX1,LY1),YSM1(LX1,LY1),ZSM1(LX1,LY1)
1603 COMMON /SCRUZ/ S1X(LX1,LY1),S1Y(LX1,LY1),S1Z(LX1,LY1)
1604 $ , S2X(LX1,LY1),S2Y(LX1,LY1),S2Z(LX1,LY1)
1605 COMMON /SCRNS/ G1X(LX1,LY1),G1Y(LX1,LY1),G1Z(LX1,LY1)
1606 $ , G2X(LX1,LY1),G2Y(LX1,LY1),G2Z(LX1,LY1)
1607 $ , GBS(LX1,LY1),GB1L(LX1,LY1),GB2L(LX1,LY1)
1608C
1609 DIMENSION TRX(LX1,LY1,LZ1),TRY(LX1,LY1,LZ1),TRZ(LX1,LY1,LZ1)
1610 DIMENSION SIGST(LX1,LY1)
1611C
1612 NXY1 = lx1*ly1
1613C
1614 CALL RZERO3 (S1X,S1Y,S1Z,NXY1)
1615 CALL RZERO3 (S2X,S2Y,S2Z,NXY1)
1616 CALL FACEXV (XFM1,YFM1,ZFM1,XM1(1,1,1,IEL),YM1(1,1,1,IEL),
1617 $ ZM1(1,1,1,IEL),IFC,0)
1618 CALL SETDRS (DRM1,DRTM1,DSM1,DSTM1,IFC)
1619C
1620 CALL MXM (DRM1,lx1, XFM1,lx1,XRM1,ly1)
1621 CALL MXM (DRM1,lx1, YFM1,lx1,YRM1,ly1)
1622 CALL MXM (DRM1,lx1, ZFM1,lx1,ZRM1,ly1)
1623 CALL MXM (XFM1,lx1,DSTM1,ly1,XSM1,ly1)
1624 CALL MXM (YFM1,lx1,DSTM1,ly1,YSM1,ly1)
1625 CALL MXM (ZFM1,lx1,DSTM1,ly1,ZSM1,ly1)
1626C
1627 DO 100 IX=1,lx1
1628 DO 100 IY=1,ly1
1629 GB1X=XRM1(IX,IY)
1630 GB1Y=YRM1(IX,IY)
1631 GB1Z=ZRM1(IX,IY)
1632 GB2X=XSM1(IX,IY)
1633 GB2Y=YSM1(IX,IY)
1634 GB2Z=ZSM1(IX,IY)
1635 GB11=GB1X*GB1X + GB1Y*GB1Y + GB1Z*GB1Z
1636 GB12=GB1X*GB2X + GB1Y*GB2Y + GB1Z*GB2Z
1637 GB22=GB2X*GB2X + GB2Y*GB2Y + GB2Z*GB2Z
1638 GDET=GB11*GB22 - GB12*GB12
1639 IF (GDET .LT. 1.E-20) GO TO 9001
1640 GT11= GB22/GDET
1641 GT12=-GB12/GDET
1642 GT22= GB11/GDET
1643 GB1L(IX,IY)=SQRT(GB11)
1644 GB2L(IX,IY)=SQRT(GB22)
1645 GBS (IX,IY)=SQRT(GDET)
1646 WGS (IX,IY)=WXM1(IX)*WYM1(IY)*SIGST(IX,IY)
1647 BB = GBS(IX,IY) * WGS(IX,IY)
1648 G1X(IX,IY) = BB * ( GT11*GB1X + GT12*GB2X )
1649 G1Y(IX,IY) = BB * ( GT11*GB1Y + GT12*GB2Y )
1650 G1Z(IX,IY) = BB * ( GT11*GB1Z + GT12*GB2Z )
1651 G2X(IX,IY) = BB * ( GT12*GB1X + GT22*GB2X )
1652 G2Y(IX,IY) = BB * ( GT12*GB1Y + GT22*GB2Y )
1653 G2Z(IX,IY) = BB * ( GT12*GB1Z + GT22*GB2Z )
1654 100 CONTINUE
1655C
1656 CALL MXM (DRTM1,lx1,G1X,lx1,S1X,ly1)
1657 CALL MXM (DRTM1,lx1,G1Y,lx1,S1Y,ly1)
1658 CALL MXM (DRTM1,lx1,G1Z,lx1,S1Z,ly1)
1659C
1660 CALL MXM (G2X,lx1,DSM1,ly1,S2X,ly1)
1661 CALL MXM (G2Y,lx1,DSM1,ly1,S2Y,ly1)
1662 CALL MXM (G2Z,lx1,DSM1,ly1,S2Z,ly1)
1663C
1664 CALL ADD2 (S1X,S2X,NXY1)
1665 CALL ADD2 (S1Y,S2Y,NXY1)
1666 CALL ADD2 (S1Z,S2Z,NXY1)
1667C
1668C Contact angle option on hold
1669C
1670C ICONTAC=INT(BC2)
1671C IF (ICONTAC.NE.0) THEN
1672C IX=1
1673C IY=1
1674C IF (ICONTAC.GE.3) IY=ly1
1675C IF (ICONTAC.EQ.2 .OR. ICONTAC.EQ.3) IX=lx1
1676C ANG = BC3 * PI / 180.00
1677C RR = YM1(IX,IY,IZ,IEL)
1678C TRX(IX,IY,IZ)=TRX(IX,IY,IZ) + RR*SIGST*COS( ANG )
1679C TRY(IX,IY,IZ)=TRY(IX,IY,IZ) + RR*SIGST*SIN( ANG )
1680C ENDIF
1681C
1682 CALL FACSUB2 (TRX,TRY,TRZ,S1X,S1Y,S1Z,IFC)
1683C
1684 RETURN
1685C
1686 9001 WRITE ( 6,*) 'Zero area for Element=',IEL,' Face=',IFC
1687 call exitt
1688C
1689 END
1690c-----------------------------------------------------------------------
1691 SUBROUTINE SETDRS (DRM1,DRTM1,DSM1,DSTM1,IFC)
1692C
1693 INCLUDE 'SIZE'
1694 INCLUDE 'DXYZ'
1695C
1696 DIMENSION DRM1(LX1,LX1),DRTM1(LX1,LX1)
1697 $ , DSM1(LY1,LY1),DSTM1(LY1,LY1)
1698C
1699 NXY1=lx1*ly1
1700C
1701 IF (IFC.EQ.5 .OR. IFC.EQ.6) THEN
1702 CALL COPY (DRM1 ,DXM1 ,NXY1)
1703 CALL COPY (DSM1 ,DYM1 ,NXY1)
1704 CALL COPY (DRTM1,DXTM1,NXY1)
1705 CALL COPY (DSTM1,DYTM1,NXY1)
1706 ELSEIF (IFC.EQ.2 .OR. IFC.EQ.4) THEN
1707 CALL COPY (DRM1 ,DYM1 ,NXY1)
1708 CALL COPY (DSM1 ,DZM1 ,NXY1)
1709 CALL COPY (DRTM1,DYTM1,NXY1)
1710 CALL COPY (DSTM1,DZTM1 ,NXY1)
1711 ELSE
1712 CALL COPY (DRM1 ,DZM1 ,NXY1)
1713 CALL COPY (DSM1 ,DXM1 ,NXY1)
1714 CALL COPY (DRTM1,DZTM1,NXY1)
1715 CALL COPY (DSTM1,DXTM1,NXY1)
1716 ENDIF
1717C
1718 RETURN
1719 END
1720c-----------------------------------------------------------------------
1721 SUBROUTINE GLOBROT (R1,R2,R3,IEL,IFC)
1722C
1723C Rotate vector components R1,R2,R3 at face IFC
1724C of element IEL from local to global system.
1725C
1726C R1, R2, R3 have the (NX,NY,NZ) data structure
1727C IFACE1 is in the preprocessor notation
1728C IFACE is the dssum notation.
1729C
1730 INCLUDE 'SIZE'
1731 INCLUDE 'GEOM'
1732 INCLUDE 'TOPOL'
1733C
1734 DIMENSION R1(LX1,LY1,LZ1)
1735 $ , R2(LX1,LY1,LZ1)
1736 $ , R3(LX1,LY1,LZ1)
1737C
1738 CALL DSSET (lx1,ly1,lz1)
1739 IFACE = EFACE1(IFC)
1740 JS1 = SKPDAT(1,IFACE)
1741 JF1 = SKPDAT(2,IFACE)
1742 JSKIP1 = SKPDAT(3,IFACE)
1743 JS2 = SKPDAT(4,IFACE)
1744 JF2 = SKPDAT(5,IFACE)
1745 JSKIP2 = SKPDAT(6,IFACE)
1746 I = 0
1747C
1748 IF (ldim.EQ.2) THEN
1749 DO 200 J2=JS2,JF2,JSKIP2
1750 DO 200 J1=JS1,JF1,JSKIP1
1751 I = I+1
1752 RNORL = R1(J1,J2,1)
1753 RTAN1 = R2(J1,J2,1)
1754 R1(J1,J2,1) = RNORL*UNX(I,1,IFC,IEL) +
1755 $ RTAN1*T1X(I,1,IFC,IEL)
1756 R2(J1,J2,1) = RNORL*UNY(I,1,IFC,IEL) +
1757 $ RTAN1*T1Y(I,1,IFC,IEL)
1758 200 CONTINUE
1759 ELSE
1760 DO 300 J2=JS2,JF2,JSKIP2
1761 DO 300 J1=JS1,JF1,JSKIP1
1762 I = I+1
1763 RNORL = R1(J1,J2,1)
1764 RTAN1 = R2(J1,J2,1)
1765 RTAN2 = R3(J1,J2,1)
1766 R1(J1,J2,1) = RNORL*UNX(I,1,IFC,IEL) +
1767 $ RTAN1*T1X(I,1,IFC,IEL) +
1768 $ RTAN2*T2X(I,1,IFC,IEL)
1769 R2(J1,J2,1) = RNORL*UNY(I,1,IFC,IEL) +
1770 $ RTAN1*T1Y(I,1,IFC,IEL) +
1771 $ RTAN2*T2Y(I,1,IFC,IEL)
1772 R3(J1,J2,1) = RNORL*UNZ(I,1,IFC,IEL) +
1773 $ RTAN1*T1Z(I,1,IFC,IEL) +
1774 $ RTAN2*T2Z(I,1,IFC,IEL)
1775 300 CONTINUE
1776 ENDIF
1777C
1778 RETURN
1779 END
1780c-----------------------------------------------------------------------
1781 SUBROUTINE FACEC2 (A1,A2,B1,B2,IFC)
1782C
1783C 2-D Geometry only
1784C Extract A1,A2 from B1,B2 on surface IFC.
1785C
1786C A1, A2 have the (lx1, 1,NFACE) data structure
1787C B1, B2 have the (lx1,ly1, 1) data structure
1788C
1789 INCLUDE 'SIZE'
1790C
1791 DIMENSION A1(LX1),A2(LX1),B1(LX1,LY1),B2(LX1,LY1)
1792C
1793 IX=1
1794 IY=1
1795 IF (IFC.EQ.1 .OR. IFC.EQ.3) THEN
1796 IF (IFC.EQ.3) IY = ly1
1797 DO 10 IX=1,lx1
1798 A1(IX)=B1(IX,IY)
1799 A2(IX)=B2(IX,IY)
1800 10 CONTINUE
1801 ELSE
1802 IF (IFC.EQ.2) IX = lx1
1803 DO 20 IY=1,ly1
1804 A1(IY)=B1(IX,IY)
1805 A2(IY)=B2(IX,IY)
1806 20 CONTINUE
1807 ENDIF
1808C
1809 RETURN
1810 END
1811c-----------------------------------------------------------------------
1812 SUBROUTINE LFALSE (IFA,N)
1813 LOGICAL IFA(1)
1814 DO 100 I=1,N
1815 IFA(I)=.FALSE.
1816 100 CONTINUE
1817 RETURN
1818 END
1819c-----------------------------------------------------------------------
1820 SUBROUTINE RZERO3 (A,B,C,N)
1821 DIMENSION A(1),B(1),C(1)
1822 DO 100 I=1,N
1823 A(I)=0.0
1824 B(I)=0.0
1825 C(I)=0.0
1826 100 CONTINUE
1827 RETURN
1828 END
1829c-----------------------------------------------------------------------
1830 SUBROUTINE UNITVEC (X,Y,Z,N)
1831 DIMENSION X(1),Y(1),Z(1)
1832 DO 100 I=1,N
1833 XLNGTH = SQRT( X(I)**2 + Y(I)**2 + Z(I)**2 )
1834 IF (XLNGTH.NE.0.0) THEN
1835 X(I) = X(I)/XLNGTH
1836 Y(I) = Y(I)/XLNGTH
1837 Z(I) = Z(I)/XLNGTH
1838 ENDIF
1839 100 CONTINUE
1840 RETURN
1841 END
1842c-----------------------------------------------------------------------
1843 SUBROUTINE CHKZVN (VMAX,IEL,IFC,IVNORL)
1844C
1845 INCLUDE 'SIZE'
1846 INCLUDE 'GEOM'
1847 INCLUDE 'SOLN'
1848 COMMON /SCRMG/ V1(LX1,LY1,LZ1,LELV)
1849 $ , V2(LX1,LY1,LZ1,LELV)
1850 $ , V3(LX1,LY1,LZ1,LELV)
1851 $ , VV(LX1,LY1,LZ1,LELV)
1852C
1853 NXZ1 = lx1*lz1
1854 TOLV = 0.01*VMAX
1855C
1856 VNOR1 = FACDOT(V1(1,1,1,IEL),UNX(1,1,IFC,IEL),IFC)
1857 VNOR2 = FACDOT(V2(1,1,1,IEL),UNY(1,1,IFC,IEL),IFC)
1858 VNOR = VNOR1 + VNOR2
1859 IF (ldim.EQ.3) THEN
1860 VNOR3 = FACDOT(V3(1,1,1,IEL),UNZ(1,1,IFC,IEL),IFC)
1861 VNOR = VNOR + VNOR3
1862 ENDIF
1863 VNOR = ABS(VNOR) / NXZ1
1864C
1865 IVNORL = 1
1866 IF (VNOR .LT. TOLV) IVNORL = 0
1867C
1868 RETURN
1869 END
1870c-----------------------------------------------------------------------
1871 SUBROUTINE BCTWALL (TMP1,TMP2,TMP3)
1872C
1873C Apply Dirichlet boundary conditions to surface of vector (V1,V2,V3)
1874C (No antimask operation is applied).
1875C
1876 INCLUDE 'SIZE'
1877 INCLUDE 'GEOM'
1878 INCLUDE 'INPUT'
1879 INCLUDE 'TSTEP'
1880C
1881 DIMENSION TMP1(lx1,ly1,lz1,1)
1882 $ , TMP2(lx1,ly1,lz1,1)
1883 $ , TMP3(lx1,ly1,lz1,1)
1884 common /nekcb/ cb
1885 CHARACTER CB*3
1886C
1887 NFACE = 2*ldim
1888 NTOT1 = lx1*ly1*lz1*NELV
1889C
1890 CALL RZERO (TMP1,NTOT1)
1891 CALL RZERO (TMP2,NTOT1)
1892 IF (IF3D) CALL RZERO (TMP3,NTOT1)
1893C
1894 DO 2000 IEL=1,NELV
1895 DO 2000 IFC=1,NFACE
1896 CB = CBC (IFC,IEL,IFIELD)
1897 BC1 = BC(1,IFC,IEL,IFIELD)
1898 BC2 = BC(2,IFC,IEL,IFIELD)
1899 BC3 = BC(3,IFC,IEL,IFIELD)
1900 IF (CB.EQ.'V ' .OR. CB.EQ.'VL ' .OR.
1901 $ CB.EQ.'WS ' .OR. CB.EQ.'WSL') THEN
1902 CALL FACEV (TMP1,IEL,IFC,BC1,lx1,ly1,lz1)
1903 CALL FACEV (TMP2,IEL,IFC,BC2,lx1,ly1,lz1)
1904 IF (ldim.EQ.3) CALL FACEV (TMP3,IEL,IFC,BC3,lx1,ly1,lz1)
1905 IF (CB.EQ.'VL ' .OR. CB.EQ.'WSL')
1906 $ CALL GLOBROT (TMP1(1,1,1,IEL),TMP2(1,1,1,IEL),
1907 $ TMP3(1,1,1,IEL),IEL,IFC)
1908 ENDIF
1909 IF (CB.EQ.'v ' .OR. CB.EQ.'vl ' .OR.
1910 $ CB.EQ.'ws ' .OR. CB.EQ.'wsl' .OR.
1911 $ CB.EQ.'mv ' .OR. CB.EQ.'mvn') THEN
1912 CALL FACEIV (CB,TMP1(1,1,1,IEL),TMP2(1,1,1,IEL),
1913 $ TMP3(1,1,1,IEL),IEL,IFC,lx1,ly1,lz1)
1914 IF (CB.EQ.'vl ' .OR. CB.EQ.'wsl')
1915 $ CALL GLOBROT (TMP1(1,1,1,IEL),TMP2(1,1,1,IEL),
1916 $ TMP3(1,1,1,IEL),IEL,IFC)
1917 ENDIF
1918 2000 CONTINUE
1919C
1920 RETURN
1921 END
1922c-----------------------------------------------------------------------
1923 SUBROUTINE ANTIMSK1(X,XMASK,N)
1924C------------------------------------------------------------------
1925C
1926C Return only Dirichlet boundary values of X
1927C
1928C-------------------------------------------------------------------
1929 REAL X(1),XMASK(1)
1930 include 'OPCTR'
1931C
1932 DO 100 I=1,N
1933 X(I) = X(I)*(1.-XMASK(I))
1934 100 CONTINUE
1935 RETURN
1936 END
1937c-----------------------------------------------------------------------
1938 subroutine check_cyclic ! check for cyclic bcs
1939 include 'SIZE'
1940 include 'TOTAL'
1941
1942 common /scrmg/ v1(lx1,ly1,lz1,lelt)
1943 $ , v2(lx1,ly1,lz1,lelt)
1944 $ , v3(lx1,ly1,lz1,lelt)
1945
1946 integer e,f
1947
1948 nface = 2*ldim
1949
1950 n = lx1*ly1*lz1*nelt
1951 call rzero(v1,n)
1952 call rzero(v2,n)
1953 call rzero(v3,n)
1954
1955 ifield = 1
1956 do e=1,nelt ! possibly U or B field
1957 do f=1,nface
1958
1959 if (cbc(f,e,ifield).eq.'P '.or.cbc(f,e,ifield).eq.'p ') then
1960 call facind2 (js1,jf1,jskip1,js2,jf2,jskip2,f)
1961 k = 0
1962 do j2=js2,jf2,jskip2
1963 do j1=js1,jf1,jskip1
1964 k = k+1
1965 v1(j1,j2,1,e) = unx(j1,j2,1,e)
1966 v2(j1,j2,1,e) = uny(j1,j2,1,e)
1967 v3(j1,j2,1,e) = unz(j1,j2,1,e)
1968 enddo
1969 enddo
1970 endif
1971
1972 enddo
1973 enddo
1974
1975 ifcyclic = .false.
1976 call opdssum(v1,v2,v3)
1977
1978 eps = 1.e-4
1979 if (ldim.eq.2) call rzero(v3,n)
1980
1981 do e=1,nelt ! Check for turning angle
1982 do f=1,nface
1983
1984 if (cbc(f,e,ifield).eq.'P '.or.cbc(f,e,ifield).eq.'p ') then
1985
1986 call facindr(i0,i1,j0,j1,k0,k1,lx1,ly1,lz1,f) ! restricted indx
1987 snorm = 0.
1988 dnorm = 0.
1989 do k=k0,k1
1990 do j=j0,j1
1991 do i=i0,i1
1992 snorm = abs(v1(i,j,k,e))
1993 $ + abs(v2(i,j,k,e))
1994 $ + abs(v3(i,j,k,e))
1995 enddo
1996 enddo
1997 enddo
1998 if (snorm.gt.eps) ifcyclic = .true.
1999
2000 endif
2001
2002 enddo
2003 enddo
2004
2005 itest = 0
2006 if (ifcyclic) itest = 1
2007 itest = iglmax(itest,1)
2008
2009 if (itest.gt.0) ifcyclic = .true.
2010
2011 return
2012 end
2013c-----------------------------------------------------------------------
2014 real function glcflux(tx,ty,tz)
2015c
2016 include 'SIZE'
2017 include 'TOTAL'
2018
2019 real tx(lx1,ly1,lz1,lelv)
2020 real ty(lx1,ly1,lz1,lelv)
2021 real tz(lx1,ly1,lz1,lelv)
2022
2023 character cb*3
2024
2025 nxyz1= lx1*ly1*lz1
2026 ntot1= nxyz1*nelv
2027 nfaces = 2*ldim
2028
2029 termA = 0.0
2030 termVL= 0.0
2031
2032 do 100 iel=1,nelv
2033 do 100 iface=1,nfaces
2034 cb = cbc(iface,iel,1)
2035 if (cb.eq.'v ' .or. cb.eq.'V ' .or. cb.eq.'mv ') then
2036 call facind(kx1,kx2,ky1,ky2,kz1,kz2,lx1,ly1,lz1,iface)
2037 ia = 0
2038 do 10 iz=kz1,kz2
2039 do 10 iy=ky1,ky2
2040 do 10 ix=kx1,kx2
2041 ia =ia + 1
2042 termxyz = tx(ix,iy,iz,iel)*unx(ia,1,iface,iel)
2043 $ + ty(ix,iy,iz,iel)*uny(ia,1,iface,iel)
2044 $ + tz(ix,iy,iz,iel)*unz(ia,1,iface,iel)
2045 termA = termA + area(ia,1,iface,iel)
2046 termVL = termVL+ termxyz * area(ia,1,iface,iel)
2047 10 continue
2048 endif
2049 100 continue
2050
2051 glcflux = glsum(termVL,1) ! sum across processors
2052
2053 return
2054 end
2055c-----------------------------------------------------------------------
2056 subroutine local_bflux(flux,tx,ty,tz,ifld)
2057c
2058 include 'SIZE'
2059 include 'TOTAL'
2060
2061 real tx(lx1,ly1,lz1,1),
2062 $ ty(lx1,ly1,lz1,1),
2063 $ tz(lx1,ly1,lz1,1),
2064 $ flux(lx1,ly1,lz1,1)
2065
2066 character cb*3
2067
2068 nel = nelfld(ifld)
2069 nxyz = lx1*ly1*lz1
2070 ntot = nxyz*nel
2071 nfaces = 2*ldim
2072
2073 call rzero(flux,ntot)
2074
2075 do 100 iel=1,nel
2076 do 100 iface=1,nfaces
2077 cb = cbc(iface,iel,ifld)
2078 if (cb.ne.'E ') then
2079 call facind(kx1,kx2,ky1,ky2,kz1,kz2,lx1,ly1,lz1,iface)
2080 ia = 0
2081 do 10 iz=kz1,kz2
2082 do 10 iy=ky1,ky2
2083 do 10 ix=kx1,kx2
2084 ia =ia + 1
2085 dtmp = tx(ix,iy,iz,iel)*unx(ia,1,iface,iel)
2086 $ + ty(ix,iy,iz,iel)*uny(ia,1,iface,iel)
2087 $ + tz(ix,iy,iz,iel)*unz(ia,1,iface,iel)
2088 flux(ix,iy,iz,iel) = flux(ix,iy,iz,iel)
2089 $ + dtmp*area(ia,1,iface,iel)
2090 10 continue
2091 endif
2092 100 continue
2093
2094 return
2095 end
2096c-----------------------------------------------------------------------
2097 SUBROUTINE FACIND2 (JS1,JF1,JSKIP1,JS2,JF2,JSKIP2,IFC)
2098C
2099 INCLUDE 'SIZE'
2100 INCLUDE 'TOPOL'
2101C
2102 CALL DSSET (lx1,ly1,lz1)
2103 IFACE = EFACE1(IFC)
2104 JS1 = SKPDAT(1,IFACE)
2105 JF1 = SKPDAT(2,IFACE)
2106 JSKIP1 = SKPDAT(3,IFACE)
2107 JS2 = SKPDAT(4,IFACE)
2108 JF2 = SKPDAT(5,IFACE)
2109 JSKIP2 = SKPDAT(6,IFACE)
2110C
2111 RETURN
2112 END
2113c-----------------------------------------------------------------------
2114 subroutine create_obj(iobjo,sid_list,n)
2115c
2116c defines an object for a given list of surface ids
2117c
2118 include 'SIZE'
2119 include 'TOTAL'
2120
2121 integer sid_list(n)
2122
2123 integer e,f
2124
2125 nobj = nobj + 1
2126 iobj = nobj
2127
2128 if (maxobj.lt.nobj)
2129 $ call exitti('maxobj too small, increate in SIZE.$',ierr)
2130
2131 do e=1,nelv
2132 do f=1,2*ndim
2133 do i=1,n
2134 if (boundaryID(f,e) .eq. sid_list(i)) then
2135 nmember(iobj) = nmember(iobj) + 1
2136 mem = nmember(iobj)
2137 ieg = lglel(e)
2138 object(iobj,mem,1) = ieg
2139 object(iobj,mem,2) = f
2140c write(6,1) iobj,mem,f,ieg,e,nid,' OBJ'
2141 1 format(6i9,a4)
2142 endif
2143 enddo
2144 enddo
2145 enddo
2146
2147 iobjo = iobj
2148
2149 return
2150 end
2151c-----------------------------------------------------------------------
2152 subroutine setbc(bid,ifld,cbci)
2153c
2154c sets boundary condition for a given surface id and field
2155c
2156 include 'SIZE'
2157 include 'INPUT'
2158 include 'GEOM'
2159
2160 character*3 cbci
2161 integer bid
2162
2163 if (bid.lt.1 .or. bid.gt.lbid)
2164 $ call exitti('invalid boundary id!$',bid)
2165
2166 cbc_bmap(bid,ifld) = cbci
2167
2168 if (iftmsh(ifld)) then
2169 do iel = 1,nelt
2170 do ifc = 1,2*ndim
2171 if (boundaryIDt(ifc,iel).eq.bid)
2172 $ cbc(ifc,iel,ifld) = cbc_bmap(bid,ifld)
2173 enddo
2174 enddo
2175 else
2176 do iel = 1,nelv
2177 do ifc = 1,2*ndim
2178 if (boundaryID(ifc,iel).eq.bid)
2179 $ cbc(ifc,iel,ifld) = cbc_bmap(bid,ifld)
2180 enddo
2181 enddo
2182 endif
2183
2184 return
2185 end
Note: See TracBrowser for help on using the repository browser.