xref: /phasta/phSolver/common/local.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine local (global, rlocal, ientmp, n, code)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This subroutine performs a vector gather/scatter operation.
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc input:
8*59599516SKenneth E. Jansenc  global (nshg,n)             : global array
9*59599516SKenneth E. Jansenc  rlocal (npro,nshl,n)         : local array
10*59599516SKenneth E. Jansenc  ien    (npro,nshl)      : nodal connectivity
11*59599516SKenneth E. Jansenc  n                            : number of d.o.f.'s to be copied
12*59599516SKenneth E. Jansenc  code                         : the transfer code
13*59599516SKenneth E. Jansenc                                  .eq. 'gather  ', from global to local
14*59599516SKenneth E. Jansenc                                  .eq. 'scatter ', add  local to global
15*59599516SKenneth E. Jansenc                                  .eq. 'globaliz', from local to global
16*59599516SKenneth E. Jansenc
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1992.
19*59599516SKenneth E. Jansenc----------------------------------------------------------------------
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansen        include "common.h"
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen        dimension global(nshg,n),           rlocal(npro,nshl,n),
24*59599516SKenneth E. Jansen     &            ien(npro,nshl),           ientmp(npro,nshl)
25*59599516SKenneth E. Jansenc
26*59599516SKenneth E. Jansen        character*8 code
27*59599516SKenneth E. Jansen
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansenc.... cubic basis has negatives in ien
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansen        if (ipord > 2) then
32*59599516SKenneth E. Jansen           ien = abs(ientmp)
33*59599516SKenneth E. Jansen        else
34*59599516SKenneth E. Jansen           ien = ientmp
35*59599516SKenneth E. Jansen        endif
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansenc.... ------------------------>  'localization  '  <--------------------
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansen        if (code .eq. 'gather  ') then
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc.... gather the data
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen
44*59599516SKenneth E. Jansen          do j = 1, n
45*59599516SKenneth E. Jansen            do i = 1, nshl
46*59599516SKenneth E. Jansen              rlocal(:,i,j) = global(ien(:,i),j)
47*59599516SKenneth E. Jansen            enddo
48*59599516SKenneth E. Jansen          enddo
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansen
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansenc.... transfer count
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansen          gbytes = gbytes + n*nshl*npro
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansenc.... return
57*59599516SKenneth E. Jansenc
58*59599516SKenneth E. Jansen          return
59*59599516SKenneth E. Jansen        endif
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansenc.... ------------------------->  'assembling '  <----------------------
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansen        if (code .eq. 'scatter ') then
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. Jansenc.... scatter the data (possible collisions)
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansen          do j = 1, n
68*59599516SKenneth E. Jansen            do i = 1, nshl
69*59599516SKenneth E. Jansen              do nel = 1,npro
70*59599516SKenneth E. Jansen                global(ien(nel,i),j) = global(ien(nel,i),j)
71*59599516SKenneth E. Jansen     &                               + rlocal(nel,i,j)
72*59599516SKenneth E. Jansen              enddo
73*59599516SKenneth E. Jansen            enddo
74*59599516SKenneth E. Jansen          enddo
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansenc
77*59599516SKenneth E. Jansenc.... transfer and flop counts
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansen          sbytes = sbytes + n*nshl*npro
80*59599516SKenneth E. Jansen          flops  = flops  + n*nshl*npro
81*59599516SKenneth E. Jansenc
82*59599516SKenneth E. Jansenc.... return
83*59599516SKenneth E. Jansenc
84*59599516SKenneth E. Jansen          return
85*59599516SKenneth E. Jansen        endif
86*59599516SKenneth E. Jansenc
87*59599516SKenneth E. Jansenc.... ------------------------->  'globalizing '  <----------------------
88*59599516SKenneth E. Jansenc
89*59599516SKenneth E. Jansen        if (code .eq. 'globaliz') then
90*59599516SKenneth E. Jansenc
91*59599516SKenneth E. Jansenc.... scatter the data (possible collisions)
92*59599516SKenneth E. Jansenc
93*59599516SKenneth E. Jansen          do j = 1, n
94*59599516SKenneth E. Jansen            do i = 1, nshl
95*59599516SKenneth E. Jansen              do nel = 1,npro
96*59599516SKenneth E. Jansen                global(ien(nel,i),j) = rlocal(nel,i,j)
97*59599516SKenneth E. Jansen              enddo
98*59599516SKenneth E. Jansen            enddo
99*59599516SKenneth E. Jansen          enddo
100*59599516SKenneth E. Jansenc
101*59599516SKenneth E. Jansenc.... return
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansen          return
104*59599516SKenneth E. Jansen        endif
105*59599516SKenneth E. Jansenc
106*59599516SKenneth E. Jansenc.... --------------------------->  error  <---------------------------
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansen        call error ('local   ', code, 0)
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansenc.... end
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansen        end
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansen        subroutine localx (global, rlocal, ien, n, code)
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc----------------------------------------------------------------------
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansenc This subroutine performs a vector gather/scatter operation for the
119*59599516SKenneth E. Jansenc nodal coordinates array.
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansenc input:
122*59599516SKenneth E. Jansenc  global (numnp,n)             : global array
123*59599516SKenneth E. Jansenc  rlocal (npro,nenl,n)         : local array
124*59599516SKenneth E. Jansenc  ien    (npro,nshl)      : nodal connectivity
125*59599516SKenneth E. Jansenc  n                            : number of d.o.f.'s to be copied
126*59599516SKenneth E. Jansenc  code                         : the transfer code
127*59599516SKenneth E. Jansenc                                  .eq. 'gather  ', from global to local
128*59599516SKenneth E. Jansenc                                  .eq. 'scatter ', add  local to global
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1992.
132*59599516SKenneth E. Jansenc----------------------------------------------------------------------
133*59599516SKenneth E. Jansenc
134*59599516SKenneth E. Jansen        include "common.h"
135*59599516SKenneth E. Jansen
136*59599516SKenneth E. Jansen        dimension global(numnp,n),           rlocal(npro,nenl,n),
137*59599516SKenneth E. Jansen     &            ien(npro,nshl)
138*59599516SKenneth E. Jansenc
139*59599516SKenneth E. Jansen        character*8 code
140*59599516SKenneth E. Jansenc
141*59599516SKenneth E. Jansenc.... ------------------------>  'localization  '  <--------------------
142*59599516SKenneth E. Jansenc
143*59599516SKenneth E. Jansen        if (code .eq. 'gather  ') then
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansenc.... gather the data
146*59599516SKenneth E. Jansenc
147*59599516SKenneth E. Jansen          do j = 1, n
148*59599516SKenneth E. Jansen            do i = 1, nenl
149*59599516SKenneth E. Jansen              rlocal(:,i,j) = global(ien(:,i),j)
150*59599516SKenneth E. Jansen            enddo
151*59599516SKenneth E. Jansen          enddo
152*59599516SKenneth E. Jansen
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansenc
155*59599516SKenneth E. Jansenc.... transfer count
156*59599516SKenneth E. Jansenc
157*59599516SKenneth E. Jansen          gbytes = gbytes + n*nenl*npro
158*59599516SKenneth E. Jansenc
159*59599516SKenneth E. Jansenc.... return
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansen          return
162*59599516SKenneth E. Jansen        endif
163*59599516SKenneth E. Jansenc
164*59599516SKenneth E. Jansenc.... ------------------------->  'assembling '  <----------------------
165*59599516SKenneth E. Jansenc
166*59599516SKenneth E. Jansen        if (code .eq. 'scatter ') then
167*59599516SKenneth E. Jansenc
168*59599516SKenneth E. Jansenc.... scatter the data (possible collisions)
169*59599516SKenneth E. Jansenc
170*59599516SKenneth E. Jansen
171*59599516SKenneth E. Jansen          do j = 1, n
172*59599516SKenneth E. Jansen            do i = 1, nenl
173*59599516SKenneth E. Jansen              do nel = 1,npro
174*59599516SKenneth E. Jansen                global(ien(nel,i),j) = global(ien(nel,i),j)
175*59599516SKenneth E. Jansen     &                               + rlocal(nel,i,j)
176*59599516SKenneth E. Jansen              enddo
177*59599516SKenneth E. Jansen            enddo
178*59599516SKenneth E. Jansen          enddo
179*59599516SKenneth E. Jansen
180*59599516SKenneth E. Jansen
181*59599516SKenneth E. Jansenc
182*59599516SKenneth E. Jansenc.... transfer and flop counts
183*59599516SKenneth E. Jansenc
184*59599516SKenneth E. Jansen          sbytes = sbytes + n*nenl*npro
185*59599516SKenneth E. Jansen          flops  = flops  + n*nenl*npro
186*59599516SKenneth E. Jansenc
187*59599516SKenneth E. Jansenc.... return
188*59599516SKenneth E. Jansenc
189*59599516SKenneth E. Jansen          return
190*59599516SKenneth E. Jansen        endif
191*59599516SKenneth E. Jansenc
192*59599516SKenneth E. Jansenc.... --------------------------->  error  <---------------------------
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansen        call error ('local   ', code, 0)
195*59599516SKenneth E. Jansenc
196*59599516SKenneth E. Jansenc.... end
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansen        end
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansenc        subroutine localM (global, xKebe, xGoC, ien)
202*59599516SKenneth E. Jansencc
203*59599516SKenneth E. Jansencc----------------------------------------------------------------------
204*59599516SKenneth E. Jansencc This routine assembles a global tangent matrix from the element
205*59599516SKenneth E. Jansencc matrices.
206*59599516SKenneth E. Jansencc
207*59599516SKenneth E. Jansencc
208*59599516SKenneth E. Jansencc
209*59599516SKenneth E. Jansencc
210*59599516SKenneth E. Jansencc
211*59599516SKenneth E. Jansencc                         |  C      G^T |
212*59599516SKenneth E. Jansencc           globalK   =   |             |
213*59599516SKenneth E. Jansencc                         |  G      K   |
214*59599516SKenneth E. Jansencc
215*59599516SKenneth E. Jansencc
216*59599516SKenneth E. Jansencc
217*59599516SKenneth E. Jansencc
218*59599516SKenneth E. Jansencc Chris Whiting,  Winter '98
219*59599516SKenneth E. Jansencc----------------------------------------------------------------------
220*59599516SKenneth E. Jansencc
221*59599516SKenneth E. Jansenc        include "common.h"
222*59599516SKenneth E. Jansenc
223*59599516SKenneth E. Jansenc        dimension global(nshg*4,nshg*4),xKebe(npro,3*nshl,3*nshl),
224*59599516SKenneth E. Jansenc     &            xGoC(npro,4*nshl,nshl),
225*59599516SKenneth E. Jansenc     &            ien(npro,nshape)
226*59599516SKenneth E. Jansencc
227*59599516SKenneth E. Jansenc        character*8 code
228*59599516SKenneth E. Jansencc
229*59599516SKenneth E. Jansencc.... ------------------------->  'assembling '  <----------------------
230*59599516SKenneth E. Jansencc
231*59599516SKenneth E. Jansenc
232*59599516SKenneth E. Jansencc
233*59599516SKenneth E. Jansencc.... scatter the data (possible collisions)
234*59599516SKenneth E. Jansencc
235*59599516SKenneth E. Jansenc
236*59599516SKenneth E. Jansencc
237*59599516SKenneth E. Jansencc.... k
238*59599516SKenneth E. Jansencc
239*59599516SKenneth E. Jansenc          do iel = 1, numel
240*59599516SKenneth E. Jansenc
241*59599516SKenneth E. Jansenc             do i = 1, nshl
242*59599516SKenneth E. Jansenc                i0 = (i-1)*3
243*59599516SKenneth E. Jansencc
244*59599516SKenneth E. Jansenc                do j = 1, nshl
245*59599516SKenneth E. Jansenc                   j0 = (j-1)*3
246*59599516SKenneth E. Jansencc
247*59599516SKenneth E. Jansenc                   ia = (ien(iel,i)-1)*4 + 1
248*59599516SKenneth E. Jansenc                   ib = (ien(iel,j)-1)*4 + 1
249*59599516SKenneth E. Jansencc
250*59599516SKenneth E. Jansenc                   global(ia+1,ib+1) = global(ia+1,ib+1)
251*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+1,j0+1)
252*59599516SKenneth E. Jansenc                   global(ia+1,ib+2) = global(ia+1,ib+2)
253*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+1,j0+2)
254*59599516SKenneth E. Jansenc                   global(ia+1,ib+3) = global(ia+1,ib+3)
255*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+1,j0+3)
256*59599516SKenneth E. Jansenc                   global(ia+2,ib+1) = global(ia+2,ib+1)
257*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+2,j0+1)
258*59599516SKenneth E. Jansenc                   global(ia+2,ib+2) = global(ia+2,ib+2)
259*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+2,j0+2)
260*59599516SKenneth E. Jansenc                   global(ia+2,ib+3) = global(ia+2,ib+3)
261*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+2,j0+3)
262*59599516SKenneth E. Jansenc                   global(ia+3,ib+1) = global(ia+3,ib+1)
263*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+3,j0+1)
264*59599516SKenneth E. Jansenc                   global(ia+3,ib+2) = global(ia+3,ib+2)
265*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+3,j0+2)
266*59599516SKenneth E. Jansenc                   global(ia+3,ib+3) = global(ia+3,ib+3)
267*59599516SKenneth E. Jansenc     &                                       + xKebe(iel,i0+3,j0+3)
268*59599516SKenneth E. Jansencc
269*59599516SKenneth E. Jansenc                enddo
270*59599516SKenneth E. Jansencc
271*59599516SKenneth E. Jansenc             enddo
272*59599516SKenneth E. Jansencc
273*59599516SKenneth E. Jansenc          enddo
274*59599516SKenneth E. Jansenc
275*59599516SKenneth E. Jansencc
276*59599516SKenneth E. Jansencc.... G and G^T
277*59599516SKenneth E. Jansencc
278*59599516SKenneth E. Jansenc          do iel = 1, numel
279*59599516SKenneth E. Jansenc
280*59599516SKenneth E. Jansenc             do i = 1, nshl
281*59599516SKenneth E. Jansenc                i0 = (i-1)*3
282*59599516SKenneth E. Jansenc                do j = 1, nshl
283*59599516SKenneth E. Jansenc
284*59599516SKenneth E. Jansenc                   ia = (ien(iel,i)-1)*4 + 1
285*59599516SKenneth E. Jansenc                   ib = (ien(iel,j)-1)*4 + 1
286*59599516SKenneth E. Jansencc
287*59599516SKenneth E. Jansenc                global(ia+1,ib  ) = global(ia+1,ib  )+ xGoC(iel,i0+1,j)
288*59599516SKenneth E. Jansenc                global(ia+2,ib  ) = global(ia+2,ib  )+ xGoC(iel,i0+2,j)
289*59599516SKenneth E. Jansenc                global(ia+3,ib  ) = global(ia+3,ib  )+ xGoC(iel,i0+3,j)
290*59599516SKenneth E. Jansenc                global(ia  ,ib+1) = global(ia  ,ib+1)+ xGoC(iel,i0+1,j)
291*59599516SKenneth E. Jansenc                global(ia  ,ib+2) = global(ia  ,ib+2)+ xGoC(iel,i0+2,j)
292*59599516SKenneth E. Jansenc                global(ia  ,ib+3) = global(ia  ,ib+3)+ xGoC(iel,i0+3,j)
293*59599516SKenneth E. Jansenc
294*59599516SKenneth E. Jansencc
295*59599516SKenneth E. Jansenc             enddo
296*59599516SKenneth E. Jansencc
297*59599516SKenneth E. Jansenc          enddo
298*59599516SKenneth E. Jansenc       enddo
299*59599516SKenneth E. Jansenc
300*59599516SKenneth E. Jansencc
301*59599516SKenneth E. Jansencc.... C
302*59599516SKenneth E. Jansencc
303*59599516SKenneth E. Jansenc          do iel = 1, numel
304*59599516SKenneth E. Jansenc             do i = 1, nshl
305*59599516SKenneth E. Jansenc                i0 = 3*nshl + i
306*59599516SKenneth E. Jansenc                do j = 1, nshl
307*59599516SKenneth E. Jansenc                   ia = (ien(iel,i)-1)*4 + 1
308*59599516SKenneth E. Jansenc                   ib = (ien(iel,j)-1)*4 + 1
309*59599516SKenneth E. Jansencc
310*59599516SKenneth E. Jansenc                   global(ia,ib) = global(ia,ib) + xGoC(iel,i0,j)
311*59599516SKenneth E. Jansencc
312*59599516SKenneth E. Jansenc                enddo
313*59599516SKenneth E. Jansenc             enddo
314*59599516SKenneth E. Jansenc
315*59599516SKenneth E. Jansencc
316*59599516SKenneth E. Jansenc          enddo
317*59599516SKenneth E. Jansenc
318*59599516SKenneth E. Jansenc
319*59599516SKenneth E. Jansenc
320*59599516SKenneth E. Jansenccad	  ttim(4) = ttim(4) + secs(0.0)
321*59599516SKenneth E. Jansenc
322*59599516SKenneth E. Jansencc
323*59599516SKenneth E. Jansencc.... transfer and flop counts
324*59599516SKenneth E. Jansencc
325*59599516SKenneth E. Jansenc          sbytes = sbytes + nshl*nenl*npro
326*59599516SKenneth E. Jansenc          flops  = flops  + nshl*nenl*npro
327*59599516SKenneth E. Jansencc
328*59599516SKenneth E. Jansencc.... return
329*59599516SKenneth E. Jansencc
330*59599516SKenneth E. Jansenccad          call timer ('Back    ')
331*59599516SKenneth E. Jansenc          return
332*59599516SKenneth E. Jansencc
333*59599516SKenneth E. Jansencc.... --------------------------->  error  <---------------------------
334*59599516SKenneth E. Jansencc
335*59599516SKenneth E. Jansenc        call error ('local   ', code, 0)
336*59599516SKenneth E. Jansencc
337*59599516SKenneth E. Jansencc.... end
338*59599516SKenneth E. Jansencc
339*59599516SKenneth E. Jansenc        end
340*59599516SKenneth E. Jansencc
341*59599516SKenneth E. Jansenc
342*59599516SKenneth E. Jansen
343*59599516SKenneth E. Jansen
344*59599516SKenneth E. Jansen        subroutine localSum (global, rlocal, ientmp, nHits, n)
345*59599516SKenneth E. Jansenc
346*59599516SKenneth E. Jansenc----------------------------------------------------------------------
347*59599516SKenneth E. Jansenc
348*59599516SKenneth E. Jansenc  sum the data from the local array to the global degrees of
349*59599516SKenneth E. Jansenc  freedom and keep track of the number of locals contributing
350*59599516SKenneth E. Jansenc  to each global dof. This may be used to find the average.
351*59599516SKenneth E. Jansenc
352*59599516SKenneth E. Jansenc----------------------------------------------------------------------
353*59599516SKenneth E. Jansenc
354*59599516SKenneth E. Jansen        include "common.h"
355*59599516SKenneth E. Jansen
356*59599516SKenneth E. Jansen        dimension global(nshg,n),           rlocal(npro,nshl,n),
357*59599516SKenneth E. Jansen     &            ien(npro,nshl),           ientmp(npro,nshl),
358*59599516SKenneth E. Jansen     &            nHits(nshg)
359*59599516SKenneth E. Jansenc
360*59599516SKenneth E. Jansenc.... cubic basis has negatives in ien
361*59599516SKenneth E. Jansenc
362*59599516SKenneth E. Jansen        if (ipord > 2) then
363*59599516SKenneth E. Jansen           ien = abs(ientmp)
364*59599516SKenneth E. Jansen        else
365*59599516SKenneth E. Jansen           ien = ientmp
366*59599516SKenneth E. Jansen        endif
367*59599516SKenneth E. Jansenc
368*59599516SKenneth E. Jansenc.... ------------------------->  'assembling '  <----------------------
369*59599516SKenneth E. Jansenc
370*59599516SKenneth E. Jansen        do j = 1, n
371*59599516SKenneth E. Jansen           do i = 1, nshl
372*59599516SKenneth E. Jansen              do nel = 1,npro
373*59599516SKenneth E. Jansen                 idg = ien(nel,i)
374*59599516SKenneth E. Jansen                 global(idg,j) = global(idg,j) + rlocal(nel,i,j)
375*59599516SKenneth E. Jansen              enddo
376*59599516SKenneth E. Jansen           enddo
377*59599516SKenneth E. Jansen        enddo
378*59599516SKenneth E. Jansen        do i = 1, nshl
379*59599516SKenneth E. Jansen           do nel = 1,npro
380*59599516SKenneth E. Jansen              idg = ien(nel,i)
381*59599516SKenneth E. Jansen              nHits(idg) = nHits(idg) + 1
382*59599516SKenneth E. Jansen           enddo
383*59599516SKenneth E. Jansen        enddo
384*59599516SKenneth E. Jansenc
385*59599516SKenneth E. Jansenc.... end
386*59599516SKenneth E. Jansenc
387*59599516SKenneth E. Jansen        end
388*59599516SKenneth E. Jansen
389*59599516SKenneth E. Jansen      subroutine localb (global, rlocal, ientmp, n, code)
390*59599516SKenneth E. Jansenc
391*59599516SKenneth E. Jansenc----------------------------------------------------------------------
392*59599516SKenneth E. Jansenc
393*59599516SKenneth E. Jansenc This subroutine performs a vector gather/scatter operation on boundary only.
394*59599516SKenneth E. Jansenc
395*59599516SKenneth E. Jansenc input:
396*59599516SKenneth E. Jansenc  global (nshg,n)             : global array
397*59599516SKenneth E. Jansenc  rlocal (npro,nshl,n)         : local array
398*59599516SKenneth E. Jansenc  ien    (npro,nshl)      : nodal connectivity
399*59599516SKenneth E. Jansenc  n                            : number of d.o.f.'s to be copied
400*59599516SKenneth E. Jansenc  code                         : the transfer code
401*59599516SKenneth E. Jansenc                                  .eq. 'gather  ', from global to local
402*59599516SKenneth E. Jansenc                                  .eq. 'scatter ', add  local to global
403*59599516SKenneth E. Jansenc                                  .eq. 'globaliz', from local to global
404*59599516SKenneth E. Jansenc
405*59599516SKenneth E. Jansenc
406*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1992.
407*59599516SKenneth E. Jansenc----------------------------------------------------------------------
408*59599516SKenneth E. Jansenc
409*59599516SKenneth E. Jansen        include "common.h"
410*59599516SKenneth E. Jansen
411*59599516SKenneth E. Jansen        dimension global(nshg,n),           rlocal(npro,nshlb,n),
412*59599516SKenneth E. Jansen     &            ien(npro,nshl),           ientmp(npro,nshl)
413*59599516SKenneth E. Jansenc
414*59599516SKenneth E. Jansen        character*8 code
415*59599516SKenneth E. Jansen
416*59599516SKenneth E. Jansenc
417*59599516SKenneth E. Jansenc.... cubic basis has negatives in ien
418*59599516SKenneth E. Jansenc
419*59599516SKenneth E. Jansen        if (ipord > 2) then
420*59599516SKenneth E. Jansen           ien = abs(ientmp)
421*59599516SKenneth E. Jansen        else
422*59599516SKenneth E. Jansen           ien = ientmp
423*59599516SKenneth E. Jansen        endif
424*59599516SKenneth E. Jansenc
425*59599516SKenneth E. Jansenc.... ------------------------>  'localization  '  <--------------------
426*59599516SKenneth E. Jansenc
427*59599516SKenneth E. Jansen        if (code .eq. 'gather  ') then
428*59599516SKenneth E. Jansenc
429*59599516SKenneth E. Jansenc.... set timer
430*59599516SKenneth E. Jansenc
431*59599516SKenneth E. Jansencad          call timer ('Gather  ')
432*59599516SKenneth E. Jansenc
433*59599516SKenneth E. Jansenc.... gather the data
434*59599516SKenneth E. Jansenc
435*59599516SKenneth E. Jansen
436*59599516SKenneth E. Jansen          do j = 1, n
437*59599516SKenneth E. Jansen            do i = 1, nshlb
438*59599516SKenneth E. Jansen              rlocal(:,i,j) = global(ien(:,i),j)
439*59599516SKenneth E. Jansen            enddo
440*59599516SKenneth E. Jansen          enddo
441*59599516SKenneth E. Jansen
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansenc
444*59599516SKenneth E. Jansenc.... transfer count
445*59599516SKenneth E. Jansenc
446*59599516SKenneth E. Jansen          gbytes = gbytes + n*nshl*npro
447*59599516SKenneth E. Jansenc
448*59599516SKenneth E. Jansenc.... return
449*59599516SKenneth E. Jansenc
450*59599516SKenneth E. Jansencad          call timer ('Back    ')
451*59599516SKenneth E. Jansen          return
452*59599516SKenneth E. Jansen        endif
453*59599516SKenneth E. Jansenc
454*59599516SKenneth E. Jansenc.... ------------------------->  'assembling '  <----------------------
455*59599516SKenneth E. Jansenc
456*59599516SKenneth E. Jansen        if (code .eq. 'scatter ') then
457*59599516SKenneth E. Jansenc
458*59599516SKenneth E. Jansenc.... set timer
459*59599516SKenneth E. Jansenc
460*59599516SKenneth E. Jansencad          call timer ('Scatter ')
461*59599516SKenneth E. Jansenc
462*59599516SKenneth E. Jansenc.... scatter the data (possible collisions)
463*59599516SKenneth E. Jansenc
464*59599516SKenneth E. Jansen          do j = 1, n
465*59599516SKenneth E. Jansen            do i = 1, nshlb
466*59599516SKenneth E. Jansen              do nel = 1,npro
467*59599516SKenneth E. Jansen                global(ien(nel,i),j) = global(ien(nel,i),j)
468*59599516SKenneth E. Jansen     &                               + rlocal(nel,i,j)
469*59599516SKenneth E. Jansen              enddo
470*59599516SKenneth E. Jansen            enddo
471*59599516SKenneth E. Jansen          enddo
472*59599516SKenneth E. Jansen
473*59599516SKenneth E. Jansenc
474*59599516SKenneth E. Jansenc.... transfer and flop counts
475*59599516SKenneth E. Jansenc
476*59599516SKenneth E. Jansen          sbytes = sbytes + n*nshlb*npro
477*59599516SKenneth E. Jansen          flops  = flops  + n*nshlb*npro
478*59599516SKenneth E. Jansenc
479*59599516SKenneth E. Jansenc.... return
480*59599516SKenneth E. Jansenc
481*59599516SKenneth E. JansenCAD          call timer ('Back    ')
482*59599516SKenneth E. Jansen          return
483*59599516SKenneth E. Jansen        endif
484*59599516SKenneth E. Jansenc
485*59599516SKenneth E. Jansenc.... ------------------------->  'globalizing '  <----------------------
486*59599516SKenneth E. Jansenc
487*59599516SKenneth E. Jansen        if (code .eq. 'globaliz') then
488*59599516SKenneth E. Jansenc
489*59599516SKenneth E. Jansenc.... scatter the data (possible collisions)
490*59599516SKenneth E. Jansenc
491*59599516SKenneth E. Jansen          do j = 1, n
492*59599516SKenneth E. Jansen            do i = 1, nshlb
493*59599516SKenneth E. Jansen              do nel = 1,npro
494*59599516SKenneth E. Jansen                global(ien(nel,i),j) = rlocal(nel,i,j)
495*59599516SKenneth E. Jansen              enddo
496*59599516SKenneth E. Jansen            enddo
497*59599516SKenneth E. Jansen          enddo
498*59599516SKenneth E. Jansenc
499*59599516SKenneth E. Jansenc.... return
500*59599516SKenneth E. Jansenc
501*59599516SKenneth E. Jansencad          call timer ('Back    ')
502*59599516SKenneth E. Jansen          return
503*59599516SKenneth E. Jansen        endif
504*59599516SKenneth E. Jansenc
505*59599516SKenneth E. Jansenc.... --------------------------->  error  <---------------------------
506*59599516SKenneth E. Jansenc
507*59599516SKenneth E. Jansen        call error ('local   ', code, 0)
508*59599516SKenneth E. Jansenc
509*59599516SKenneth E. Jansenc.... end
510*59599516SKenneth E. Jansenc
511*59599516SKenneth E. Jansen        end
512*59599516SKenneth E. Jansenc
513*59599516SKenneth E. Jansen
514*59599516SKenneth E. Jansen
515*59599516SKenneth E. Jansen
516*59599516SKenneth E. Jansen
517