source: CIVL/examples/fortran/nek5000/core/connect2.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: 28.2 KB
Line 
1c-----------------------------------------------------------------------
2 subroutine readat
3C
4C Read in data from preprocessor input file (.rea)
5C
6 INCLUDE 'SIZE'
7 INCLUDE 'INPUT'
8 INCLUDE 'GEOM'
9 INCLUDE 'PARALLEL'
10 INCLUDE 'CTIMER'
11
12 logical ifbswap,ifre2,parfound
13 character*132 string
14 integer idum(3*numsts+3)
15
16 ierr = 0
17 call flush_io
18
19 ! check if new rea file version exists
20 if(nid.eq.0) inquire(file=parfle, exist=parfound)
21 call bcast(parfound,lsize)
22 if (parfound) then
23 if(nio.eq.0) write(6,'(A,A)') ' Reading ', parfle
24 call readat_par
25 goto 99
26 endif
27
28 etime0 = dnekclock_sync()
29
30 if(nid.eq.0) then
31 write(6,'(A,A)') ' Reading ', reafle
32 open (unit=9,file=reafle,status='old', iostat=ierr)
33 endif
34
35 call bcast(ierr,isize)
36 if (ierr .gt. 0) call exitti('Cannot open rea file!$',1)
37
38C Read parameters and logical flags
39 call rdparam
40 meshPartitioner=3 ! HYBRID (RSB+RCB)
41
42C Read Mesh Info
43 if(nid.eq.0) then
44 read(9,*) ! xfac,yfac,xzero,yzero
45 read(9,*) ! dummy
46 read(9,*) nelgs,ldimr,nelgv
47 nelgt = abs(nelgs)
48 endif
49 call bcast(ldimr,ISIZE)
50 call bcast(nelgs,ISIZE)
51 call bcast(nelgv,ISIZE)
52 call bcast(nelgt,ISIZE)
53 ifre2 = .false.
54 if (nelgs.lt.0) ifre2 = .true.
55
56 call usrdat0
57
58 if (nelgt.gt.350000 .and. .not.ifre2)
59 $ call exitti('Problem size requires .re2!$',1)
60
61 if (ifre2) call read_re2_hdr(ifbswap, .true.) ! rank0 will open and read
62 call chk_nel ! make certain sufficient array sizes
63
64 call mapelpr
65
66 if (ifre2) then
67 call read_re2_data(ifbswap, .true., .true., .true.)
68 else
69 maxrd = 32 ! max # procs to read at once
70 mread = (np-1)/maxrd+1 ! mod param
71 iread = 0 ! mod param
72 x = 0
73 do i=0,np-1,maxrd
74 call nekgsync()
75 if (mod(nid,mread).eq.iread) then
76 if (nid.ne.0) then
77 open(UNIT=9,FILE=REAFLE,STATUS='OLD')
78 call cscan(string,'MESH DATA',9)
79 read(9,*) string
80 endif
81 call rdmesh
82 call rdcurve ! Curved side data
83 call rdbdry ! Boundary Conditions
84 if (nid.ne.0) close(unit=9)
85 endif
86 iread = iread + 1
87 enddo
88 endif
89
90C Read Restart options / Initial Conditions / Drive Force
91 CALL RDICDF
92C Read materials property data
93 CALL RDMATP
94C Read history data
95 CALL RDHIST
96C Read output specs
97 CALL RDOUT
98C Read objects
99 CALL RDOBJ
100
101 call nekgsync()
102
103C End of input data, close read file.
104 if(nid.eq.0) then
105 close(unit=9)
106 call echopar
107 write(6,'(A,g13.5,A,/)') ' done :: read .rea file ',
108 $ dnekclock()-etime0,' sec'
109 endif
110
111 99 call izero(boundaryID, size(boundaryID))
112 call izero(boundaryIDt, size(boundaryIDt))
113
114 ifld = 2
115 if(ifflow) ifld = 1
116 do iel = 1,nelv
117 do ifc = 1,2*ndim
118 boundaryID(ifc,iel) = bc(5,ifc,iel,ifld)
119 enddo
120 enddo
121
122 ntmsh = 0
123 do i=1,ldimt
124 if(iftmsh(1+i)) ntmsh = ntmsh + 1
125 enddo
126
127 if (ntmsh.gt.0) then
128 do iel = 1,nelt
129 do ifc = 1,2*ndim
130 boundaryIDt(ifc,iel) = bc(5,ifc,iel,2)
131 enddo
132 enddo
133 endif
134
135 return
136 END
137c-----------------------------------------------------------------------
138 subroutine vrdsmsh
139C
140C=====================================================================
141C Verify that mesh and dssum are properly defined by performing
142C a direct stiffness operation on the X,Y and Z coordinates.
143C Note that periodic faces are not checked here.
144C=====================================================================
145C
146 INCLUDE 'SIZE'
147 INCLUDE 'TOTAL'
148 COMMON /SCRNS/ TA(LX1,LY1,LZ1,LELT),TB(LX1,LY1,LZ1,LELT)
149 $ ,QMASK(LX1,LY1,LZ1,LELT),tmp(2)
150 CHARACTER*3 CB
151
152c call vrdsmshx ! verify mesh topology
153
154 if(nio.eq.0) write(*,*) 'verify mesh topology'
155
156 IERR = 0
157 EPS = 1.0e-04
158 EPS = 1.0e-03
159 IFIELD = 1
160 if (nelgv.ne.nelgt .or. .not.ifflow) ifield = 2
161 NXYZ1 = lx1*ly1*lz1
162 NTOT = lx1*ly1*lz1*NELT
163 NFACES = 2*ldim
164
165 xmx = glmax(xm1,ntot)
166 xmn = glmin(xm1,ntot)
167 ymx = glmax(ym1,ntot)
168 ymn = glmin(ym1,ntot)
169 zmx = glmax(zm1,ntot)
170 zmn = glmin(zm1,ntot)
171 if (nio.eq.0) write(6,*) xmn,xmx,' Xrange'
172 if (nio.eq.0) write(6,*) ymn,ymx,' Yrange'
173 if (nio.eq.0) write(6,*) zmn,zmx,' Zrange'
174c return
175C
176C First check - use 1/Multiplicity
177C
178 IF (IFHEAT) THEN
179 CALL COPY(TA,TMULT,NTOT)
180 ELSE
181 CALL COPY(TA,VMULT,NTOT)
182 ENDIF
183c
184c write(6,1)
185c $(nid,'tab4',lglel(ie),(ta(k,1,1,ie),k=1,lx1*ly1),ie=1,nelt)
186c 1 format(i3,a4,i3,16f5.2)
187c
188 CALL DSSUM(TA,lx1,ly1,lz1)
189c
190c write(6,1)
191c $(nid,'taaf',lglel(ie),(ta(k,1,1,ie),k=1,lx1*ly1),ie=1,nelt)
192c
193 CALL RONE (TB,NTOT)
194 CALL SUB2 (TB,TA,NTOT)
195 DO 1000 IE=1,NELT
196 ieg=lglel(ie)
197 DO 1000 IZ=1,lz1
198 DO 1000 IY=1,ly1
199 DO 1000 IX=1,lx1
200 IF (ABS(TB(IX,IY,IZ,IE)).GT.EPS ) THEN
201 WRITE(6,1005) IX,IY,IZ,IEG
202 $ ,XM1(IX,IY,IZ,IE),YM1(IX,IY,IZ,IE),ZM1(IX,IY,IZ,IE)
203 $ ,TA(IX,IY,IZ,IE),eps
204c WRITE(7,1005) IX,IY,IZ,IEG
205c $ ,XM1(IX,IY,IZ,IE),TB(IX,IY,IZ,IE),TA(IX,IY,IZ,IE)
206c $ ,QMASK(IX,IY,IZ,IE)
207 1005 FORMAT(2X,'WARNING: DSSUM problem at:',/
208 $ ,1X,'I,J,K,IE:',3I5,i12,/
209 $ ,2X,'Near X =',3G16.8,', d:',2G16.8)
210 IERR=4
211 ENDIF
212 1000 CONTINUE
213C
214C Set up QMASK quickly to annihilate checks on periodic bc's
215C
216 CALL RONE(QMASK,NTOT)
217 DO 100 IEL=1,NELT
218 DO 100 IFACE=1,NFACES
219 CB =CBC(IFACE,IEL,IFIELD)
220 IF (CB.EQ.'P '.or.cb.eq.'p ')
221 $ CALL FACEV(QMASK,IEL,IFACE,0.0,lx1,ly1,lz1)
222 100 CONTINUE
223 CALL DSOP(QMASK,'MUL',lx1,ly1,lz1)
224
225c xxmin = glmin(xm1,ntot)
226c yymin = glmin(ym1,ntot)
227c zzmin = glmin(zm1,ntot)
228c xxmax = glmax(xm1,ntot)
229c yymax = glmax(ym1,ntot)
230c zzmax = glmax(zm1,ntot)
231c if (nio.eq.0) write(6,7) xxmin,yymin,zzmin,xxmax,yymax,zzmax
232c 7 format('xyz minmx2:',6g13.5)
233
234
235
236C
237C X-component
238C
239 CALL COPY(TA,XM1,NTOT)
240 CALL COPY(TB,XM1,NTOT)
241 CALL DSOP(TA,'MIN',lx1,ly1,lz1)
242 CALL DSOP(TB,'MAX',lx1,ly1,lz1)
243 CALL SUB2(TA,XM1,NTOT)
244 CALL SUB2(TB,XM1,NTOT)
245 CALL COL2(TA,QMASK,NTOT)
246 CALL COL2(TB,QMASK,NTOT)
247 DO 1100 IE=1,NELT
248 XSCMAX = VLMAX(XM1(1,1,1,IE),NXYZ1)
249 XSCMIN = VLMIN(XM1(1,1,1,IE),NXYZ1)
250 SCAL1=ABS(XSCMAX-XSCMIN)
251 SCAL2=ABS(XSCMAX)
252 SCAL3=ABS(XSCMIN)
253 SCAL1=MAX(SCAL1,SCAL2)
254 SCAL1=MAX(SCAL1,SCAL3)
255 XSCALE = 1./SCAL1
256 ieg=lglel(ie)
257 DO 1100 IZ=1,lz1
258 DO 1100 IY=1,ly1
259 DO 1100 IX=1,lx1
260 if (abs(ta(ix,iy,iz,ie)*xscale).gt.eps .or.
261 $ abs(tb(ix,iy,iz,ie)*xscale).gt.eps ) then
262 write(6,1105) ix,iy,iz,ieg
263 $ ,xm1(ix,iy,iz,ie),ym1(ix,iy,iz,ie),zm1(ix,iy,iz,ie)
264 $ ,tb(ix,iy,iz,ie),ta(ix,iy,iz,ie),XSCALE
265 1105 format(1x,'WARNING1 Element mesh mismatch at:',/
266 $ ,1x,'i,j,k,ie:',3i5,I12,/
267 $ ,1X,'Near X =',3G16.8,', d:',3G16.8)
268 ierr=1
269 endif
270 1100 CONTINUE
271C
272C Y-component
273C
274 CALL COPY(TA,YM1,NTOT)
275 CALL COPY(TB,YM1,NTOT)
276 CALL DSOP(TA,'MIN',lx1,ly1,lz1)
277 CALL DSOP(TB,'MAX',lx1,ly1,lz1)
278 CALL SUB2(TA,YM1,NTOT)
279 CALL SUB2(TB,YM1,NTOT)
280 CALL COL2(TA,QMASK,NTOT)
281 CALL COL2(TB,QMASK,NTOT)
282 DO 1200 IE=1,NELT
283 YSCMAX = VLMAX(YM1(1,1,1,IE),NXYZ1)
284 YSCMIN = VLMIN(YM1(1,1,1,IE),NXYZ1)
285 SCAL1=ABS(YSCMAX-YSCMIN)
286 SCAL2=ABS(YSCMAX)
287 SCAL3=ABS(YSCMIN)
288 SCAL1=MAX(SCAL1,SCAL2)
289 SCAL1=MAX(SCAL1,SCAL3)
290 YSCALE = 1./SCAL1
291 ieg=lglel(ie)
292 DO 1200 IZ=1,lz1
293 DO 1200 IY=1,ly1
294 DO 1200 IX=1,lx1
295 IF (ABS(TA(IX,IY,IZ,IE)*YSCALE).GT.EPS .OR.
296 $ ABS(TB(IX,IY,IZ,IE)*YSCALE).GT.EPS ) THEN
297 WRITE(6,1205) IX,IY,IZ,IEG
298 $ ,XM1(IX,IY,IZ,IE),YM1(IX,IY,IZ,IE),ZM1(IX,IY,IZ,IE)
299 $ ,TB(IX,IY,IZ,IE),TA(IX,IY,IZ,IE),yscale
300 1205 FORMAT(1X,'WARNING2 Element mesh mismatch at:',/
301 $ ,1X,'I,J,K,IE:',3I5,i12,/
302 $ ,1X,'Near Y =',3G16.8,', d:',3G16.8)
303 IERR=2
304 ENDIF
305 1200 CONTINUE
306C
307C Z-component
308C
309 IF (IF3D) THEN
310 CALL COPY(TA,ZM1,NTOT)
311 CALL COPY(TB,ZM1,NTOT)
312 CALL DSOP(TA,'MIN',lx1,ly1,lz1)
313 CALL DSOP(TB,'MAX',lx1,ly1,lz1)
314 CALL SUB2(TA,ZM1,NTOT)
315 CALL SUB2(TB,ZM1,NTOT)
316 CALL COL2(TA,QMASK,NTOT)
317 CALL COL2(TB,QMASK,NTOT)
318 DO 1300 IE=1,NELT
319 ZSCMAX = VLMAX(ZM1(1,1,1,IE),NXYZ1)
320 ZSCMIN = VLMIN(ZM1(1,1,1,IE),NXYZ1)
321 SCAL1=ABS(ZSCMAX-ZSCMIN)
322 SCAL2=ABS(ZSCMAX)
323 SCAL3=ABS(ZSCMIN)
324 SCAL1=MAX(SCAL1,SCAL2)
325 SCAL1=MAX(SCAL1,SCAL3)
326 ZSCALE = 1./SCAL1
327 ieg=lglel(ie)
328 DO 1300 IZ=1,lz1
329 DO 1300 IY=1,ly1
330 DO 1300 IX=1,lx1
331 IF (ABS(TA(IX,IY,IZ,IE)*ZSCALE).GT.EPS .OR.
332 $ ABS(TB(IX,IY,IZ,IE)*ZSCALE).GT.EPS ) THEN
333 WRITE(6,1305) IX,IY,IZ,IEG
334 $ ,XM1(IX,IY,IZ,IE),YM1(IX,IY,IZ,IE),ZM1(IX,IY,IZ,IE)
335 $ ,TB(IX,IY,IZ,IE),TA(IX,IY,IZ,IE),zscale
336 1305 FORMAT(1X,'WARNING3 Element mesh mismatch at:',/
337 $ ,1X,'I,J,K,IE:',3I5,i12,/
338 $ ,1X,'Near Z =',3G16.8,', d:',3G16.8)
339 IERR=3
340 ENDIF
341 1300 CONTINUE
342 ENDIF
343
344 ierr = iglsum(ierr,1)
345 IF (IERR.gt.0) THEN
346 if(nid.eq.0) WRITE(6,1400)
347 1400 FORMAT
348 $ (' Mesh consistency check failed. EXITING in VRDSMSH.')
349 call exitt
350 ENDIF
351
352 tmp(1)=ierr
353 CALL GOP(tmp,tmp(2),'M ',1)
354 IF (tmp(1).ge.4.0) THEN
355 WRITE(6,1400)
356 $ (' Mesh consistency check failed. EXITING in VRDSMSH.')
357 call exitt
358 ENDIF
359
360 if(nio.eq.0) then
361 write(6,*) 'done :: verify mesh topology'
362 write(6,*) ' '
363 endif
364
365 return
366 end
367c-----------------------------------------------------------------------
368 subroutine vrdsmshx ! verify mesh topology
369C
370C=====================================================================
371C Verify that mesh and dssum are properly defined by performing
372C a direct stiffness operation on the X,Y and Z coordinates.
373C Note that periodic faces are not checked here.
374C=====================================================================
375C
376 INCLUDE 'SIZE'
377 INCLUDE 'TOTAL'
378 common /scrns/ tc(lx1,ly1,lz1,lelt),td(lx1,ly1,lz1,lelt)
379 $ , ta(lx1,ly1,lz1,lelt),tb(lx1,ly1,lz1,lelt)
380 $ , qmask(lx1,ly1,lz1,lelt)
381 CHARACTER*3 CB
382C
383 IERR = 0
384 EPS = 1.0e-04
385 EPS = 1.0e-03
386 IFIELD = 1
387 IF (IFHEAT) IFIELD = 2
388 NXYZ1 = lx1*ly1*lz1
389 NTOT = lx1*ly1*lz1*NELT
390 NFACES = 2*ldim
391
392 xmx = glmax(xm1,ntot)
393 xmn = glmin(xm1,ntot)
394 ymx = glmax(ym1,ntot)
395 ymn = glmin(ym1,ntot)
396 zmx = glmax(zm1,ntot)
397 zmn = glmin(zm1,ntot)
398 if (nio.eq.0) write(6,*) xmn,xmx,' Xrange'
399 if (nio.eq.0) write(6,*) ymn,ymx,' Yrange'
400 if (nio.eq.0) write(6,*) zmn,zmx,' Zrange'
401c return
402C
403C First check - use 1/Multiplicity
404C
405 IF (IFHEAT) THEN
406 CALL COPY(TA,TMULT,NTOT)
407 ELSE
408 CALL COPY(TA,VMULT,NTOT)
409 ENDIF
410c
411c write(6,1)
412c $(nid,'tab4',lglel(ie),(ta(k,1,1,ie),k=1,lx1*ly1),ie=1,nelt)
413c 1 format(i3,a4,i3,16f5.2)
414c
415 CALL DSSUM(TA,lx1,ly1,lz1)
416c
417c write(6,1)
418c $(nid,'taaf',lglel(ie),(ta(k,1,1,ie),k=1,lx1*ly1),ie=1,nelt)
419c
420 CALL RONE (TB,NTOT)
421 CALL SUB2 (TB,TA,NTOT)
422 DO 1000 IE=1,NELT
423 ieg=lglel(ie)
424 DO 1000 IZ=1,lz1
425 DO 1000 IY=1,ly1
426 DO 1000 IX=1,lx1
427 IF (ABS(TB(IX,IY,IZ,IE)).GT.EPS ) THEN
428 WRITE(6,1005) IX,IY,IZ,IEG
429 $ ,XM1(IX,IY,IZ,IE),YM1(IX,IY,IZ,IE),ZM1(IX,IY,IZ,IE)
430 $ ,TA(IX,IY,IZ,IE),eps
431c WRITE(7,1005) IX,IY,IZ,IEG
432c $ ,XM1(IX,IY,IZ,IE),TB(IX,IY,IZ,IE),TA(IX,IY,IZ,IE)
433c $ ,QMASK(IX,IY,IZ,IE)
434 1005 FORMAT(2X,'WARNING: DSSUM problem at:',/
435 $ ,1X,'I,J,K,IE:',3I5,i12,/
436 $ ,2X,'Near X =',3G16.8,', d:',2G16.8)
437 IERR=4
438 ENDIF
439 1000 CONTINUE
440C
441C Set up QMASK quickly to annihilate checks on periodic bc's
442C
443 CALL RONE(QMASK,NTOT)
444 DO 100 IEL=1,NELT
445 DO 100 IFACE=1,NFACES
446 CB =CBC(IFACE,IEL,IFIELD)
447 IF (CB.EQ.'P '.or.cb.eq.'p ')
448 $ CALL FACEV(QMASK,IEL,IFACE,0.0,lx1,ly1,lz1)
449 100 CONTINUE
450 call dsop(QMASK,'MUL',lx1,ly1,lz1)
451
452 xxmin = glmin(xm1,ntot)
453 yymin = glmin(ym1,ntot)
454 zzmin = glmin(zm1,ntot)
455 xxmax = glmax(xm1,ntot)
456 yymax = glmax(ym1,ntot)
457 zzmax = glmax(zm1,ntot)
458 if (nio.eq.0) write(6,7) xxmin,yymin,zzmin,xxmax,yymax,zzmax
459 7 format('xyz minmx2:',6g13.5)
460
461
462C
463C X-component
464C
465 call copy(ta,xm1,ntot)
466 call copy(tb,xm1,ntot)
467 call dsop(ta,'min',lx1,ly1,lz1)
468 call dsop(tb,'max',lx1,ly1,lz1)
469
470 call copy(tc,xm1,ntot)
471 call copy(td,xm1,ntot)
472 call dsop(tc,'min',lx1,ly1,lz1)
473 call dsop(td,'max',lx1,ly1,lz1)
474
475 xxmin = glmin(xm1,ntot)
476 xxmax = glmax(xm1,ntot)
477 yymax = glmax(ta ,ntot)
478 yymin = glmin(ta ,ntot)
479 zzmin = glmin(tb ,ntot)
480 zzmax = glmax(tb ,ntot)
481 if (nio.eq.0) write(6,9) xxmin,yymin,zzmin,xxmax,yymax,zzmax
482 9 format('xyz minmx3:',6g13.5)
483
484 CALL SUB2(TA,XM1,NTOT)
485 CALL SUB2(TB,XM1,NTOT)
486
487 xxmin = glmin(qmask,ntot)
488 xxmax = glmax(qmask,ntot)
489 yymax = glmax(ta ,ntot)
490 yymin = glmin(ta ,ntot)
491 zzmin = glmin(tb ,ntot)
492 zzmax = glmax(tb ,ntot)
493 if (nio.eq.0) write(6,19) xxmin,yymin,zzmin,xxmax,yymax,zzmax
494 19 format('xyz minmx4:',6g13.5)
495
496 CALL COL2(TA,QMASK,NTOT)
497 CALL COL2(TB,QMASK,NTOT)
498
499 xxmin = glmin(qmask,ntot)
500 xxmax = glmax(qmask,ntot)
501 yymax = glmax(ta ,ntot)
502 yymin = glmin(ta ,ntot)
503 zzmin = glmin(tb ,ntot)
504 zzmax = glmax(tb ,ntot)
505 if (nio.eq.0) write(6,29) xxmin,yymin,zzmin,xxmax,yymax,zzmax
506 29 format('xyz minmx5:',6g13.5)
507
508 DO 1100 IE=1,NELT
509 XSCMAX = VLMAX(XM1(1,1,1,IE),NXYZ1)
510 XSCMIN = VLMIN(XM1(1,1,1,IE),NXYZ1)
511 SCAL1=ABS(XSCMAX-XSCMIN)
512 SCAL2=ABS(XSCMAX)
513 SCAL3=ABS(XSCMIN)
514 SCAL1=MAX(SCAL1,SCAL2)
515 SCAL1=MAX(SCAL1,SCAL3)
516 XSCALE = 1./SCAL1
517 ieg=lglel(ie)
518 DO 1100 IZ=1,lz1
519 DO 1100 IY=1,ly1
520 DO 1100 IX=1,lx1
521 if (abs(ta(ix,iy,iz,ie)*xscale).gt.eps .or.
522 $ abs(tb(ix,iy,iz,ie)*xscale).gt.eps ) then
523 write(6,1105) nid,ix,iy,iz,ie,ieg
524 $ ,xm1(ix,iy,iz,ie),tc(ix,iy,iz,ie),td(ix,iy,iz,ie)
525 $ ,ym1(ix,iy,iz,ie),zm1(ix,iy,iz,ie)
526 $ ,ta(ix,iy,iz,ie),tb(ix,iy,iz,ie),xscale
527 $ ,qmask(ix,iy,iz,ie)
528 1105 format(i4.4,1x,'ie:',3i3,i10,i10,1p9e11.3)
529c1105 format(i4.4,1x,'ie:',3i3,i6,1p9e11.3)
530 ierr=1
531 goto 1101
532 endif
533 1100 CONTINUE
534 1101 CONTINUE
535
536 xxmin = glmin(xm1,ntot)
537 xxmax = glmax(xm1,ntot)
538 yymax = glmax(ta ,ntot)
539 yymin = glmin(ta ,ntot)
540 zzmin = glmin(tb ,ntot)
541 zzmax = glmax(tb ,ntot)
542 if (nio.eq.0) write(6,39) xxmin,yymin,zzmin,xxmax,yymax,zzmax
543 39 format('xyz minmx5:',6g13.5)
544
545c ifvo = .true.
546c ifpo = .false.
547c ifto = .true.
548c call outpost(xm1,ta,tb,pr,qmask,' ')
549c call exitt
550
551 return
552 end
553c-----------------------------------------------------------------------
554 subroutine rotat2(xyz,angle,npts)
555C
556C Rotate NPTS through ANGLE (in two directions IF3D).
557C
558 INCLUDE 'SIZE'
559 INCLUDE 'INPUT'
560 DIMENSION XYZ(3,1)
561 COMMON /CTMP0/ RMTRX(3,3),RX(3,3),RZ(3,3),XYZN(3,10)
562C
563 SINA=SIN(ANGLE)
564 COSA=COS(ANGLE)
565 CALL RZERO(RX,9)
566 CALL RZERO(RZ,9)
567 RX(1,1)=COSA
568 RX(2,2)=COSA
569 RX(1,2)=SINA
570 RX(2,1)=-SINA
571 RX(3,3)=1.0
572 IF (IF3D) THEN
573 RZ(1,1)=COSA
574 RZ(3,3)=COSA
575 RZ(1,3)=SINA
576 RZ(3,1)=-SINA
577 RZ(2,2)=1.0
578 ELSE
579 RZ(1,1)=1.0
580 RZ(2,2)=1.0
581 RZ(3,3)=1.0
582 ENDIF
583 CALL MXM(RX,3,RZ,3,RMTRX,3)
584C
585C Strip mine mxms in chunks of 10:
586 DO 100 I=1,NPTS-10,10
587 CALL MXM(RMTRX,3,XYZ(1,I),3,XYZN,10)
588 CALL COPY(XYZ(1,I),XYZN,30)
589 100 CONTINUE
590 N10=MOD1(NPTS,10)
591 I=NPTS-N10+1
592 CALL RZERO(XYZN,30)
593 IF (N10.GT.0) THEN
594 CALL MXM(RMTRX,3,XYZ(1,I),3,XYZN,N10)
595 CALL COPY(XYZ(1,I),XYZN,3*N10)
596 ENDIF
597C
598 return
599 END
600c-----------------------------------------------------------------------
601 subroutine scale(xyzl,nl)
602C
603C Rescale XYZL such that the mean value of IXX=IYY=IZZ for each element.
604C
605 INCLUDE 'SIZE'
606 INCLUDE 'INPUT'
607 DIMENSION XYZL(3,8,LELT)
608 COMMON /CTMP0/ VO(LELT),XYZI(3,LELT),CG(3,LELT)
609 $ ,TI(6),WORK(6)
610C
611C Compute volumes -
612C
613 CALL VOLUME2(VO,XYZL,NL)
614 VTOT=GLSUM (VO,NL)
615C
616C Compute (weighted) average inertia for each element.
617C
618 NCRNR=2**ldim
619 CALL RZERO(TI,6)
620 DO 100 IL=1,NL
621 VO0 = VO(IL)/VTOT
622 CALL INRTIA(XYZI(1,IL),CG(1,IL),XYZL(1,1,IL),NCRNR,1)
623 TI(1)=TI(1)+XYZI(1,IL)*VO0
624 TI(2)=TI(2)+XYZI(2,IL)*VO0
625 TI(3)=TI(3)+XYZI(3,IL)*VO0
626 TI(4)=TI(4)+CG(1,IL) *VO0
627 TI(5)=TI(5)+CG(2,IL) *VO0
628 TI(6)=TI(6)+CG(3,IL) *VO0
629 100 CONTINUE
630 CALL GOP(TI,WORK,'+ ',6)
631 XI =SQRT(TI(1))
632 YI =SQRT(TI(2))
633 ZI =1.0
634 IF (IF3D) ZI=SQRT(TI(3))
635C
636C Rescale ( & shift to a nearly mean zero )
637C
638 DO 200 IL=1,NL
639 DO 200 IC=1,NCRNR
640 XYZL(1,IC,IL)=(XYZL(1,IC,IL)-TI(4))/XI
641 XYZL(2,IC,IL)=(XYZL(2,IC,IL)-TI(5))/YI
642 XYZL(3,IC,IL)=(XYZL(3,IC,IL)-TI(6))/ZI
643 200 CONTINUE
644C
645 return
646 END
647c-----------------------------------------------------------------------
648 subroutine inrtia(xyzi,cg,xyzl,n,itype)
649C
650C Compute cg and inertia for a collection of unit point masses.
651C This is a global (multiprocessor) operation, only IF itype=2.
652C
653 DIMENSION XYZI(3),CG(3),XYZL(3,1)
654 DIMENSION TI(4),WORK(4)
655C
656 TI(1)=0.0
657 TI(2)=0.0
658 TI(3)=0.0
659 TI(4)=N
660 DO 100 I=1,N
661 TI(1)=TI(1)+XYZL(1,I)
662 TI(2)=TI(2)+XYZL(2,I)
663 TI(3)=TI(3)+XYZL(3,I)
664 100 CONTINUE
665 IF (ITYPE.EQ.2) CALL GOP(TI,WORK,'+ ',4)
666 IF (TI(4).EQ.0.0) TI(4)=1.0
667 CG(1)=TI(1)/TI(4)
668 CG(2)=TI(2)/TI(4)
669 CG(3)=TI(3)/TI(4)
670C
671 TI(1)=0.0
672 TI(2)=0.0
673 TI(3)=0.0
674 DO 200 I=1,N
675 TI(1)=TI(1)+( XYZL(1,I)-CG(1) )**2
676 TI(2)=TI(2)+( XYZL(2,I)-CG(2) )**2
677 TI(3)=TI(3)+( XYZL(3,I)-CG(3) )**2
678 200 CONTINUE
679 IF (ITYPE.EQ.2) CALL GOP(TI,WORK,'+ ',3)
680 TI(1)=TI(1)/TI(4)
681 TI(2)=TI(2)/TI(4)
682 TI(3)=TI(3)/TI(4)
683 IF (ITYPE.EQ.2) THEN
684C std. def'n of inertia.
685 XYZI(1)=TI(2)+TI(3)
686 XYZI(2)=TI(3)+TI(1)
687 XYZI(3)=TI(1)+TI(2)
688 ELSE
689 XYZI(1)=TI(1)
690 XYZI(2)=TI(2)
691 XYZI(3)=TI(3)
692 ENDIF
693C
694 return
695 END
696c-----------------------------------------------------------------------
697 subroutine volume2(vol,xyz,n)
698 INCLUDE 'SIZE'
699 INCLUDE 'INPUT'
700 DIMENSION XYZ(3,2,2,2,1)
701 DIMENSION VOL(1)
702C
703 DO 1000 IE=1,N
704 VOL(IE)=0.0
705 IF (IF3D) THEN
706 DO 20 K=1,2
707 DO 20 J=1,2
708 DO 20 I=1,2
709 VOL1 = (XYZ(1,2,J,K,IE)-XYZ(1,1,J,K,IE))
710 $ * (XYZ(2,I,2,K,IE)-XYZ(2,I,1,K,IE))
711 $ * (XYZ(3,I,J,2,IE)-XYZ(3,I,J,1,IE))
712 VOL2 = (XYZ(1,2,J,K,IE)-XYZ(1,1,J,K,IE))
713 $ * (XYZ(2,I,J,2,IE)-XYZ(2,I,J,1,IE))
714 $ * (XYZ(3,I,2,K,IE)-XYZ(3,I,1,K,IE))
715 VOL3 = (XYZ(1,I,2,K,IE)-XYZ(1,I,1,K,IE))
716 $ * (XYZ(2,2,J,K,IE)-XYZ(2,1,J,K,IE))
717 $ * (XYZ(3,I,J,2,IE)-XYZ(3,I,J,1,IE))
718 VOL4 = (XYZ(1,I,J,2,IE)-XYZ(1,I,J,1,IE))
719 $ * (XYZ(2,I,2,K,IE)-XYZ(2,I,1,K,IE))
720 $ * (XYZ(3,I,2,K,IE)-XYZ(3,I,1,K,IE))
721 VOL5 = (XYZ(1,I,2,K,IE)-XYZ(1,I,1,K,IE))
722 $ * (XYZ(2,I,J,2,IE)-XYZ(2,I,J,1,IE))
723 $ * (XYZ(3,2,J,K,IE)-XYZ(3,1,J,K,IE))
724 VOL6 = (XYZ(1,I,J,2,IE)-XYZ(1,I,J,1,IE))
725 $ * (XYZ(2,I,2,K,IE)-XYZ(2,I,1,K,IE))
726 $ * (XYZ(3,2,J,K,IE)-XYZ(3,1,J,K,IE))
727 VOL(IE) = VOL(IE)+VOL1+VOL2+VOL3+VOL4+VOL5+VOL6
728 20 CONTINUE
729 VOL(IE)=VOL(IE)/8.0
730 ELSE
731C 2-D:
732 DO 40 J=1,2
733 DO 40 I=1,2
734 VOL1 = (XYZ(1,2,J,1,IE)-XYZ(1,1,J,1,IE))
735 $ * (XYZ(2,I,2,1,IE)-XYZ(2,I,1,1,IE))
736 VOL3 = (XYZ(1,I,2,1,IE)-XYZ(1,I,1,1,IE))
737 $ * (XYZ(2,2,J,1,IE)-XYZ(2,1,J,1,IE))
738 VOL(IE)=VOL(IE)+VOL1+VOL3
739 40 CONTINUE
740 VOL(IE)=VOL(IE)/4.0
741 ENDIF
742 VOL(IE)=ABS(VOL(IE))
743 1000 CONTINUE
744C
745 return
746 END
747c-----------------------------------------------------------------------
748 subroutine findcg(cg,xyz,n)
749C
750C Compute cg for N elements.
751C
752 INCLUDE 'SIZE'
753 DIMENSION CG(3,1),XYZ(3,8,1)
754C
755 NCRNR=2**ldim
756 CALL RZERO(CG,3*N)
757 DO 100 I =1,N
758 DO 100 IC=1,NCRNR
759 CG(1,I)=CG(1,I)+XYZ(1,IC,I)
760 CG(2,I)=CG(2,I)+XYZ(2,IC,I)
761 CG(3,I)=CG(3,I)+XYZ(3,IC,I)
762 100 CONTINUE
763 TMP=1.0/(NCRNR)
764 CALL CMULT(CG,TMP,3*N)
765 return
766 END
767c-----------------------------------------------------------------------
768 subroutine divide(list1,list2,nl1,nl2,ifok,list,nl,xyzi,cg,WGT)
769C
770C Divide the elements associated with this subdomain according to
771C the direction having the smallest moment of inertia (the "long"
772C direction).
773C
774 INCLUDE 'SIZE'
775 INCLUDE 'INPUT'
776 INCLUDE 'PARALLEL'
777 INCLUDE 'TSTEP'
778C
779 DIMENSION LIST(LELT),LIST1(LELT),LIST2(LELT)
780 DIMENSION XYZI(3),CG(3,LELT),wgt(1)
781 COMMON /CTMP0/ XCG(LELT),YCG(LELT),ZCG(LELT)
782 REAL IXX,IYY,IZZ
783 INTEGER WORK(2),WRK2(2)
784 LOGICAL IFOK
785C
786C Choose "long" direction:
787C
788 IXX=XYZI(1)
789 IYY=XYZI(2)
790 IZZ=XYZI(3)
791 IF (IF3D) THEN
792 IF (IXX.LE.IYY.AND.IXX.LE.IZZ) THEN
793 DO 104 IE=1,NL
794 XCG(IE)=CG(1,IE)
795 YCG(IE)=CG(2,IE)
796 ZCG(IE)=CG(3,IE)
797 104 CONTINUE
798 ELSEIF (IYY.LE.IXX.AND.IYY.LE.IZZ) THEN
799 DO 106 IE=1,NL
800 XCG(IE)=CG(2,IE)
801 YCG(IE)=CG(3,IE)
802 ZCG(IE)=CG(1,IE)
803 106 CONTINUE
804 ELSEIF (IZZ.LE.IXX.AND.IZZ.LE.IYY) THEN
805 DO 108 IE=1,NL
806 XCG(IE)=CG(3,IE)
807 YCG(IE)=CG(1,IE)
808 ZCG(IE)=CG(2,IE)
809 108 CONTINUE
810 ENDIF
811 ELSE
812C 2-D:
813 IF (IXX.LE.IYY) THEN
814 DO 114 IE=1,NL
815 XCG(IE)=CG(1,IE)
816 YCG(IE)=CG(2,IE)
817 114 CONTINUE
818 ELSE
819 DO 116 IE=1,NL
820 XCG(IE)=CG(2,IE)
821 YCG(IE)=CG(1,IE)
822 116 CONTINUE
823 ENDIF
824 ENDIF
825 call col2(xcg,wgt,nl)
826 call col2(ycg,wgt,nl)
827 call col2(zcg,wgt,nl)
828C
829C Find median value of CG to determine dividing point:
830C
831 XM=FMDIAN(XCG,NL,IFOK)
832 YM=FMDIAN(YCG,NL,IFOK)
833 ZM=0.0
834 IF (IF3D) ZM=FMDIAN(ZCG,NL,IFOK)
835C
836C Diagnostics
837C
838 IF (.NOT.IFOK) THEN
839 WRITE(6,130) NID,NL,XM,YM,ZM
840 DO 120 IL=1,NL
841 WRITE(6,135) NID,IL,XCG(IL),YCG(IL),ZCG(IL)
842 120 CONTINUE
843 130 FORMAT(I10,'DIVIDE: NL,XM,YM,ZM',I3,3F12.5)
844 135 FORMAT(I10,'DIVIDE: NID,IL,XC,YC,ZCG',I4,3F12.5)
845 ENDIF
846C
847C=============================================================
848C Divide LIST into LIST1 (XCG < XM) and LIST2 (XCG>XM).
849C=============================================================
850C
851 NL1=0
852 NL2=0
853 DO 200 IE=1,NL
854 IF (XCG(IE).LT.XM) THEN
855 NL1=NL1+1
856 LIST1(NL1)=LIST(IE)
857 ENDIF
858 IF (XCG(IE).GT.XM) THEN
859 NL2=NL2+1
860 LIST2(NL2)=LIST(IE)
861 ENDIF
862 IF (XCG(IE).EQ.XM) THEN
863C
864C We have to look at the other directions to arrive at
865C a unique subdivision algortithm.
866C
867C
868C More Diagnostics
869C
870 IF (.NOT.IFOK) WRITE(6,201) NID,IE,XCG(IE),XM
871 201 FORMAT(I10,'DIVIDE: IE,XCG,XM:',I4,3F12.5)
872C
873 IF (YCG(IE).LT.YM) THEN
874 NL1=NL1+1
875 LIST1(NL1)=LIST(IE)
876 ENDIF
877 IF (YCG(IE).GT.YM) THEN
878 NL2=NL2+1
879 LIST2(NL2)=LIST(IE)
880 ENDIF
881 IF (YCG(IE).EQ.YM) THEN
882C look at 3rd direction.
883 IF (IF3D .AND. ZCG(IE).LT.ZM) THEN
884 NL1=NL1+1
885 LIST1(NL1)=LIST(IE)
886 ELSE IF (IF3D .AND. ZCG(IE).GT.ZM) THEN
887 NL2=NL2+1
888 LIST2(NL2)=LIST(IE)
889 ELSE
890C for 2- or 3-D intdeterminate case:
891 NL1=NL1+1
892 LIST1(NL1)=LIST(IE)
893 ENDIF
894 ENDIF
895C
896 ENDIF
897 200 CONTINUE
898C
899C Check for an even distribution (i.e. - not different by
900C more than 1):
901C
902 IFOK=.TRUE.
903 WORK(1)=NL1
904 WORK(2)=NL2
905 CALL IGOP(WORK,WRK2,'+ ',2)
906 IF (ABS(WORK(1)-WORK(2)).GT.1) IFOK=.FALSE.
907C
908 return
909 END
910c-----------------------------------------------------------------------
911 subroutine bufchk(buf,n)
912 integer n
913 real buf(n)
914 do i=1,n
915 write(6,*) buf(i), ' whhhh'
916 enddo
917 return
918 end
919c-----------------------------------------------------------------------
920 subroutine chk_xyz
921 include 'SIZE'
922 include 'TOTAL'
923 integer e,f,eg
924
925 do e=1,nelt
926 eg = lglel(e)
927 write(6,1) nid,eg,e,(cbc(f,e,1),f=1,6)
928 enddo
929 1 format(3i12,6(1x,a3),' cbc')
930
931 return
932 end
933c-----------------------------------------------------------------------
934 subroutine chk_nel
935 include 'SIZE'
936 include 'TOTAL'
937
938 neltmx=np*lelt
939 nelvmx=np*lelv
940
941 neltmx=min(neltmx,lelg)
942 nelvmx=min(nelvmx,lelg)
943
944 nelgt = iglmax(nelgt,1)
945 nelgv = iglmax(nelgv,1)
946
947c write(6,*) nid,' inside chk_nel',nelgt,neltmx,nelvmx
948
949 if (nelgt.gt.neltmx.or.nelgv.gt.nelvmx) then
950 if (nid.eq.0) then
951 lelt_needed = nelgt/np
952 if (mod(nelgt,np).ne.0) lelt_needed = lelt_needed + 1
953 write(6,12) lelt,lelg,lelt_needed,np,nelgt
954 12 format(//,2X,'ABORT: Problem size too large!'
955 $ ,/,2X
956 $ ,/,2X,'This solver has been compiled for:'
957 $ ,/,2X,' number of elements/proc (lelt):',i12
958 $ ,/,2X,' total number of elements (lelg):',i12
959 $ ,/,2X
960 $ ,/,2X,'Recompile with the following SIZE parameters:'
961 $ ,/,2X,' lelt >= ',i12,' for np = ',i12
962 $ ,/,2X,' lelg >= ',i12,/)
963c write(6,*)'help:',lp,np,nelvmx,nelgv,neltmx,nelgt
964c write(6,*)'help:',lelt,lelv,lelgv
965 endif
966 call exitt
967 endif
968
969 if(nelgt.gt.nelgt_max) then
970 if(nid.eq.0) write(6,*)
971 $ 'ABORT: Total number of elements too large!',
972 $ ' nel_max = ', nelgt_max
973 call exitt
974 endif
975
976 if (nelt.gt.lelt) then
977 write(6,'(A,3I12)') 'ABORT: nelt>lelt!', nid, nelt, lelt
978 call exitt
979 endif
980
981 return
982 end
983c-----------------------------------------------------------------------
984 subroutine cscan(sout,key,nk)
985
986 character*132 sout,key
987 character*132 string
988 character*1 string1(132)
989 equivalence (string1,string)
990c
991 do i=1,100000000
992 call blank(string,132)
993 read (nk,80,end=100,err=100) string
994 call chcopy(sout,string,132)
995c write (6,*) string
996 if (indx1(string,key,nk).ne.0) return
997 enddo
998 100 continue
999c
1000 80 format(a132)
1001 return
1002
1003 end
1004c-----------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.