xref: /phasta/phSolver/common/hierarchic.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansenc------------------------------------------------------------------------
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc This file contains functions for dealing with higher order shape
4*59599516SKenneth E. Jansenc functions at the element level.
5*59599516SKenneth E. Jansenc
6*59599516SKenneth E. Jansenc Christian Whiting, Winter 1999
7*59599516SKenneth E. Jansenc------------------------------------------------------------------------
8*59599516SKenneth E. Jansen
9*59599516SKenneth E. Jansen      subroutine getsgn(ien, sgn)
10*59599516SKenneth E. Jansenc------------------------------------------------------------------------
11*59599516SKenneth E. Jansenc     returns the matrix of mode signs used for negating higher order
12*59599516SKenneth E. Jansenc     basis functions. Connectivity array is assumed to have negative
13*59599516SKenneth E. Jansenc     signs on all modes to be negated.
14*59599516SKenneth E. Jansenc------------------------------------------------------------------------
15*59599516SKenneth E. Jansen      include "common.h"
16*59599516SKenneth E. Jansen
17*59599516SKenneth E. Jansen      dimension ien(npro,nshl),  sgn(npro,nshl)
18*59599516SKenneth E. Jansen
19*59599516SKenneth E. Jansen      do i=nenl+1,nshl
20*59599516SKenneth E. Jansen         where ( ien(:,i) < 0 )
21*59599516SKenneth E. Jansen            sgn(:,i) = -one
22*59599516SKenneth E. Jansen         elsewhere
23*59599516SKenneth E. Jansen            sgn(:,i) = one
24*59599516SKenneth E. Jansen         endwhere
25*59599516SKenneth E. Jansen      enddo
26*59599516SKenneth E. Jansen
27*59599516SKenneth E. Jansen      return
28*59599516SKenneth E. Jansen      end
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen      subroutine getshp(shp, shgl, sgn, shape, shdrv)
31*59599516SKenneth E. Jansenc------------------------------------------------------------------------
32*59599516SKenneth E. Jansenc     returns the matrix of element shape functions with the higher
33*59599516SKenneth E. Jansenc     order modes correctly negated at the current quadrature point.
34*59599516SKenneth E. Jansenc------------------------------------------------------------------------
35*59599516SKenneth E. Jansen      include "common.h"
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansen      dimension shp(nshl,ngauss),   shgl(nsd,nshl,ngauss),
38*59599516SKenneth E. Jansen     &          sgn(npro,nshl),     shape(npro,nshl),
39*59599516SKenneth E. Jansen     &          shdrv(npro,nsd,nshl)
40*59599516SKenneth E. Jansen
41*59599516SKenneth E. Jansen
42*59599516SKenneth E. Jansen      do i=1,nenl
43*59599516SKenneth E. Jansen         shape(:,i) = shp(i,intp)
44*59599516SKenneth E. Jansen         do j=1,3
45*59599516SKenneth E. Jansen            shdrv(:,j,i) = shgl(j,i,intp)
46*59599516SKenneth E. Jansen         enddo
47*59599516SKenneth E. Jansen      enddo
48*59599516SKenneth E. Jansen      if ( ipord > 1 ) then
49*59599516SKenneth E. Jansen         do i=nenl+1,nshl
50*59599516SKenneth E. Jansen            shape(:,i) = sgn(:,i) * shp(i,intp)
51*59599516SKenneth E. Jansen            do j=1,3
52*59599516SKenneth E. Jansen               shdrv(:,j,i) = shgl(j,i,intp)*sgn(:,i)
53*59599516SKenneth E. Jansen            enddo
54*59599516SKenneth E. Jansen         enddo
55*59599516SKenneth E. Jansen      endif
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen      return
58*59599516SKenneth E. Jansen      end
59*59599516SKenneth E. Jansen
60*59599516SKenneth E. Jansen      subroutine getshpb(shp, shgl, sgn, shape, shdrv)
61*59599516SKenneth E. Jansenc------------------------------------------------------------------------
62*59599516SKenneth E. Jansenc     returns the matrix of element shape functions with the higher
63*59599516SKenneth E. Jansenc     order modes correctly negated at the current quadrature point.
64*59599516SKenneth E. Jansenc------------------------------------------------------------------------
65*59599516SKenneth E. Jansen      include "common.h"
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen      dimension shp(nshl,ngaussb),  shgl(nsd,nshl,ngaussb),
68*59599516SKenneth E. Jansen     &          sgn(npro,nshl),     shape(npro,nshl),
69*59599516SKenneth E. Jansen     &          shdrv(npro,nsd,nshl)
70*59599516SKenneth E. Jansen
71*59599516SKenneth E. Jansen
72*59599516SKenneth E. Jansen      do i=1,nenl
73*59599516SKenneth E. Jansen         shape(:,i) = shp(i,intp)
74*59599516SKenneth E. Jansen         do j=1,3
75*59599516SKenneth E. Jansen            shdrv(:,j,i) = shgl(j,i,intp)
76*59599516SKenneth E. Jansen         enddo
77*59599516SKenneth E. Jansen      enddo
78*59599516SKenneth E. Jansen      if ( ipord > 1 ) then
79*59599516SKenneth E. Jansen         do i=nenl+1,nshl
80*59599516SKenneth E. Jansen            shape(:,i) = sgn(:,i) * shp(i,intp)
81*59599516SKenneth E. Jansen            do j=1,3
82*59599516SKenneth E. Jansen               shdrv(:,j,i) = shgl(j,i,intp)*sgn(:,i)
83*59599516SKenneth E. Jansen            enddo
84*59599516SKenneth E. Jansen         enddo
85*59599516SKenneth E. Jansen      endif
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansen      return
88*59599516SKenneth E. Jansen      end
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen      subroutine getbnodes(lnode)
91*59599516SKenneth E. Jansenc------------------------------------------------------------------------
92*59599516SKenneth E. Jansenc     compute the higher order modes that lie on the boundary of the
93*59599516SKenneth E. Jansenc     element.
94*59599516SKenneth E. Jansenc------------------------------------------------------------------------
95*59599516SKenneth E. Jansen      include "common.h"
96*59599516SKenneth E. Jansen
97*59599516SKenneth E. Jansen      dimension lnode(27)
98*59599516SKenneth E. Jansen
99*59599516SKenneth E. Jansenc
100*59599516SKenneth E. Jansenc.... boundary triangle of tet element
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansen      if (lcsyst .eq. 1) then
103*59599516SKenneth E. Jansen         do n = 1, nenbl
104*59599516SKenneth E. Jansen            lnode(n) = n
105*59599516SKenneth E. Jansen         enddo
106*59599516SKenneth E. Jansen         if( ipord>1 ) then
107*59599516SKenneth E. Jansen            nem = ipord-1
108*59599516SKenneth E. Jansen            do n=1,3*nem
109*59599516SKenneth E. Jansen               lnode(nenbl+n) = nenbl+1+n
110*59599516SKenneth E. Jansen            enddo
111*59599516SKenneth E. Jansen         endif
112*59599516SKenneth E. Jansen         if( ipord>2 ) then
113*59599516SKenneth E. Jansen            nfm = (ipord-2)*(ipord-1)/2
114*59599516SKenneth E. Jansen            do n=1,nfm
115*59599516SKenneth E. Jansen               lnode(3+3*nem+n) = 4+6*nem+n
116*59599516SKenneth E. Jansen            enddo
117*59599516SKenneth E. Jansen         endif
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansenc.....boundary quadrilateral for a hex element
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansen      else if(lcsyst .eq. 2) then
122*59599516SKenneth E. Jansen         do n = 1, nenbl
123*59599516SKenneth E. Jansen            lnode(n) = n
124*59599516SKenneth E. Jansen         enddo
125*59599516SKenneth E. Jansen         if( ipord > 1) then
126*59599516SKenneth E. Jansen            nem = ipord -1
127*59599516SKenneth E. Jansen            do n=1,4*nem
128*59599516SKenneth E. Jansen               lnode(nenbl+n) = 8+n
129*59599516SKenneth E. Jansen            enddo
130*59599516SKenneth E. Jansen         endif
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen         if( ipord > 3) then
133*59599516SKenneth E. Jansen            nfm = (ipord-2)*(ipord-3)/2
134*59599516SKenneth E. Jansen            do n=1,nfm
135*59599516SKenneth E. Jansen               lnode(4+4*nem+n) = 8+12*nem+n
136*59599516SKenneth E. Jansen            enddo
137*59599516SKenneth E. Jansen         endif
138*59599516SKenneth E. Jansenc
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansenc.... This renumbers the boundary nodes for a wedge element when the
141*59599516SKenneth E. Jansenc     boundary element is a quad face.  From lnode = [1 2 3 4]
142*59599516SKenneth E. Jansenc                                        to   lnode = [1 4 5 2]
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansen      else if(lcsyst .eq. 3) then
145*59599516SKenneth E. Jansen         do n = 1, nenbl
146*59599516SKenneth E. Jansen            lnode(n) = n
147*59599516SKenneth E. Jansen         enddo
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansenc     Need to implement for cubic, this valid only for ipord=2
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansen         if( ipord>1 ) then
152*59599516SKenneth E. Jansen            nem = ipord-1
153*59599516SKenneth E. Jansen            do n=1,3*nem
154*59599516SKenneth E. Jansen               lnode(nenbl+n) = 6+n
155*59599516SKenneth E. Jansen            enddo
156*59599516SKenneth E. Jansen         endif
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansenc     Boundary quad of wedge element
159*59599516SKenneth E. Jansenc
160*59599516SKenneth E. Jansen      else if(lcsyst .eq. 4) then
161*59599516SKenneth E. Jansen         lnode(1) = 1
162*59599516SKenneth E. Jansen         lnode(2) = 4
163*59599516SKenneth E. Jansen         lnode(3) = 5
164*59599516SKenneth E. Jansen         lnode(4) = 2
165*59599516SKenneth E. Jansenc$$$c
166*59599516SKenneth E. Jansenc$$$c     Need to implement for cubic, this valid only for ipord=2
167*59599516SKenneth E. Jansenc$$$c
168*59599516SKenneth E. Jansenc$$$         if( ipord > 1) then
169*59599516SKenneth E. Jansenc$$$            lnode(5) = 9
170*59599516SKenneth E. Jansenc$$$            lnode(6) = 15
171*59599516SKenneth E. Jansenc$$$            lnode(7) = 12
172*59599516SKenneth E. Jansenc$$$            lnode(8) = 13
173*59599516SKenneth E. Jansenc$$$               nem = ipord -1
174*59599516SKenneth E. Jansenc$$$               do n=1,4*nem
175*59599516SKenneth E. Jansenc$$$                  lnode(nenbl+n) = 6+n
176*59599516SKenneth E. Jansenc$$$               enddo
177*59599516SKenneth E. Jansenc$$$         endif
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansenc     Boundary quad of pyramid element
180*59599516SKenneth E. Jansenc
181*59599516SKenneth E. Jansen      else if(lcsyst .eq. 5) then
182*59599516SKenneth E. Jansen         lnode(1) = 1
183*59599516SKenneth E. Jansen         lnode(2) = 2
184*59599516SKenneth E. Jansen         lnode(3) = 3
185*59599516SKenneth E. Jansen         lnode(4) = 4
186*59599516SKenneth E. Jansenc$$$  c
187*59599516SKenneth E. Jansenc$$$  c     Need to implement for cubic, this valid only for ipord=2
188*59599516SKenneth E. Jansenc$$$  c
189*59599516SKenneth E. Jansenc$$$            if( ipord > 1) then
190*59599516SKenneth E. Jansenc$$$               lnode(5) = 9
191*59599516SKenneth E. Jansenc$$$               lnode(6) = 15
192*59599516SKenneth E. Jansenc$$$               lnode(7) = 12
193*59599516SKenneth E. Jansenc$$$               lnode(8) = 13
194*59599516SKenneth E. Jansenc$$$               nem = ipord -1
195*59599516SKenneth E. Jansenc$$$               do n=1,4*nem
196*59599516SKenneth E. Jansenc$$$                  lnode(nenbl+n) = 6+n
197*59599516SKenneth E. Jansenc$$$               enddo
198*59599516SKenneth E. Jansenc$$$            endif
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansenc     Boundary triangle of pyramid element
201*59599516SKenneth E. Jansenc
202*59599516SKenneth E. Jansen      else if(lcsyst .eq. 6) then
203*59599516SKenneth E. Jansen         lnode(1) = 1
204*59599516SKenneth E. Jansen         lnode(2) = 5
205*59599516SKenneth E. Jansen         lnode(3) = 2
206*59599516SKenneth E. Jansenc$$$c
207*59599516SKenneth E. Jansenc$$$c     Need to implement for cubic, this valid only for ipord=2
208*59599516SKenneth E. Jansenc$$$c
209*59599516SKenneth E. Jansenc$$$            if( ipord > 1) then
210*59599516SKenneth E. Jansenc$$$               lnode(5) = 9
211*59599516SKenneth E. Jansenc$$$               lnode(6) = 15
212*59599516SKenneth E. Jansenc$$$               lnode(7) = 12
213*59599516SKenneth E. Jansenc$$$               lnode(8) = 13
214*59599516SKenneth E. Jansenc$$$               nem = ipord -1
215*59599516SKenneth E. Jansenc$$$               do n=1,4*nem
216*59599516SKenneth E. Jansenc$$$                  lnode(nenbl+n) = 6+n
217*59599516SKenneth E. Jansenc$$$               enddo
218*59599516SKenneth E. Jansenc$$$            endif
219*59599516SKenneth E. Jansenc
220*59599516SKenneth E. Jansenc.... other element types need to be implemented
221*59599516SKenneth E. Jansenc
222*59599516SKenneth E. Jansen      else
223*59599516SKenneth E. Jansen         write (*,*) 'Boundary element not implemented for lcyst='
224*59599516SKenneth E. Jansen     &        ,lcsyst
225*59599516SKenneth E. Jansen         stop
226*59599516SKenneth E. Jansen      endif
227*59599516SKenneth E. Jansen
228*59599516SKenneth E. Jansen      return
229*59599516SKenneth E. Jansen      end
230*59599516SKenneth E. Jansen
231*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
232*59599516SKenneth E. Jansenc
233*59599516SKenneth E. Jansenc  Evaluate coefficient vector at its interpolation points
234*59599516SKenneth E. Jansenc
235*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
236*59599516SKenneth E. Jansen      subroutine evalAtInterp( ycoeff,  yvals,  x,   nvars, npts )
237*59599516SKenneth E. Jansen
238*59599516SKenneth E. Jansen      use     pointer_data
239*59599516SKenneth E. Jansen      include "common.h"
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansen      integer nvars, npts, nHits(nshg)
242*59599516SKenneth E. Jansen
243*59599516SKenneth E. Jansen      real*8  ycoeff(nshg,ndof),   yvals(nshg,nvars),
244*59599516SKenneth E. Jansen     &        shp(nshl,npts),      shgl(nsd,nshl,npts),
245*59599516SKenneth E. Jansen     &        intpnt(3,npts),      x(numnp,nsd)
246*59599516SKenneth E. Jansen
247*59599516SKenneth E. Jansen      real*8, allocatable :: ycl(:,:,:)
248*59599516SKenneth E. Jansen      real*8, allocatable :: xl(:,:,:)
249*59599516SKenneth E. Jansen      real*8, allocatable :: yvl(:,:,:)
250*59599516SKenneth E. Jansen      real*8, allocatable :: sgn(:,:)
251*59599516SKenneth E. Jansen
252*59599516SKenneth E. Jansen      yvals = zero
253*59599516SKenneth E. Jansenc
254*59599516SKenneth E. Jansenc.... generate the shape functions at the interpolation points
255*59599516SKenneth E. Jansenc
256*59599516SKenneth E. Jansen      call getIntPnts(intpnt,npts)
257*59599516SKenneth E. Jansen      do i=1,npts
258*59599516SKenneth E. Jansen         call shpTet(ipord,intpnt(:,i),shp(:,i),shgl(:,:,i))
259*59599516SKenneth E. Jansen      enddo
260*59599516SKenneth E. Jansenc
261*59599516SKenneth E. Jansenc.... loop over element blocks
262*59599516SKenneth E. Jansenc
263*59599516SKenneth E. Jansen      nHits = 0
264*59599516SKenneth E. Jansen      do iblk = 1, nelblk
265*59599516SKenneth E. Jansen         iel    = lcblk(1,iblk)
266*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
267*59599516SKenneth E. Jansen         nenl   = lcblk(5,iblk) ! no. of vertices per element
268*59599516SKenneth E. Jansen         nshl   = lcblk(10,iblk)
269*59599516SKenneth E. Jansen         ndofl  = lcblk(8,iblk)
270*59599516SKenneth E. Jansen         npro   = lcblk(1,iblk+1) - iel
271*59599516SKenneth E. Jansen
272*59599516SKenneth E. Jansen         allocate ( ycl(npro,nshl,ndof ) )
273*59599516SKenneth E. Jansen         allocate ( yvl(npro,nshl,nvars) )
274*59599516SKenneth E. Jansen         allocate ( xl(npro,nenl,nsd   ) )
275*59599516SKenneth E. Jansen         allocate ( sgn(npro,nshl)       )
276*59599516SKenneth E. Jansen
277*59599516SKenneth E. Jansen         call getsgn(mien(iblk)%p,sgn)
278*59599516SKenneth E. Jansen
279*59599516SKenneth E. Jansen         call localy( ycoeff, ycl, mien(iblk)%p, ndof,  'gather  ')
280*59599516SKenneth E. Jansen         call localx( x,      xl,  mien(iblk)%p, nsd,   'gather  ')
281*59599516SKenneth E. Jansen
282*59599516SKenneth E. Jansen         call eval  ( xl,       ycl,      yvl,
283*59599516SKenneth E. Jansen     &                shp,      shgl,     sgn,
284*59599516SKenneth E. Jansen     &                nvars,    npts    )
285*59599516SKenneth E. Jansen
286*59599516SKenneth E. Jansenc
287*59599516SKenneth E. Jansenc.... average coefficients since stresses may be discontinuous
288*59599516SKenneth E. Jansenc
289*59599516SKenneth E. Jansen         call localSum( yvals,    yvl,    mien(iblk)%p,
290*59599516SKenneth E. Jansen     &                  nHits,    nVars)
291*59599516SKenneth E. Jansen
292*59599516SKenneth E. Jansen
293*59599516SKenneth E. Jansen         deallocate ( ycl )
294*59599516SKenneth E. Jansen         deallocate ( yvl )
295*59599516SKenneth E. Jansen         deallocate ( sgn )
296*59599516SKenneth E. Jansen         deallocate ( xl  )
297*59599516SKenneth E. Jansenc
298*59599516SKenneth E. Jansen      enddo
299*59599516SKenneth E. Jansen
300*59599516SKenneth E. Jansenc
301*59599516SKenneth E. Jansenc.... average the global values
302*59599516SKenneth E. Jansenc
303*59599516SKenneth E. Jansen      do i = 1, nshg
304*59599516SKenneth E. Jansen         do j = 1, nvars
305*59599516SKenneth E. Jansen            yvals(i,j) = yvals(i,j)/nHits(i) !(real(nHits(i),8))
306*59599516SKenneth E. Jansen         enddo
307*59599516SKenneth E. Jansen      enddo
308*59599516SKenneth E. Jansen
309*59599516SKenneth E. Jansen      return
310*59599516SKenneth E. Jansen      end
311*59599516SKenneth E. Jansen
312*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
313*59599516SKenneth E. Jansenc
314*59599516SKenneth E. Jansenc  evaluate in element coordinate system
315*59599516SKenneth E. Jansenc
316*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
317*59599516SKenneth E. Jansen      subroutine eval( xl,      ycl,     yvl,
318*59599516SKenneth E. Jansen     &                 shp,     shgl,    sgn,
319*59599516SKenneth E. Jansen     &                 nvars,   npts )
320*59599516SKenneth E. Jansen
321*59599516SKenneth E. Jansen      include "common.h"
322*59599516SKenneth E. Jansen
323*59599516SKenneth E. Jansen      integer nvars
324*59599516SKenneth E. Jansenc
325*59599516SKenneth E. Jansen      real*8  ycl(npro,nshl,ndof),   yvl(npro,nshl,nvars),
326*59599516SKenneth E. Jansen     &        sgn(npro,nshl),        shape(npro,nshl),
327*59599516SKenneth E. Jansen     &        shdrv(npro,nsd,nshl),  shp(nshl,npts),
328*59599516SKenneth E. Jansen     &        shgl(nsd,nshl,npts),   xl(npro,nenl,nsd),
329*59599516SKenneth E. Jansen     &        shg(npro,nshl,nsd),    gradV(npro,nsd,nsd),
330*59599516SKenneth E. Jansen     &        dxidx(npro,nsd,nsd),   tmp(npro), wtmp
331*59599516SKenneth E. Jansen
332*59599516SKenneth E. Jansen      yvl = zero
333*59599516SKenneth E. Jansenc
334*59599516SKenneth E. Jansenc.... loop over interpolation points
335*59599516SKenneth E. Jansenc
336*59599516SKenneth E. Jansen      do intp = 1, npts
337*59599516SKenneth E. Jansen         call getshp(shp,          shgl,      sgn,
338*59599516SKenneth E. Jansen     &               shape,        shdrv)
339*59599516SKenneth E. Jansen
340*59599516SKenneth E. Jansenc
341*59599516SKenneth E. Jansenc.... pressure and velocity
342*59599516SKenneth E. Jansenc
343*59599516SKenneth E. Jansen         do i = 1, nshl
344*59599516SKenneth E. Jansen            do j = 1, 4
345*59599516SKenneth E. Jansen               yvl(:,intp,j) = yvl(:,intp,j) + shape(:,i) * ycl(:,i,j)
346*59599516SKenneth E. Jansen            enddo
347*59599516SKenneth E. Jansen         enddo
348*59599516SKenneth E. Jansenc
349*59599516SKenneth E. Jansenc.... viscous stress
350*59599516SKenneth E. Jansenc
351*59599516SKenneth E. Jansen         call e3metric( xl,         shdrv,      dxidx,
352*59599516SKenneth E. Jansen     &                  shg,        tmp)
353*59599516SKenneth E. Jansen
354*59599516SKenneth E. Jansen         gradV = zero
355*59599516SKenneth E. Jansen         do n = 1, nshl
356*59599516SKenneth E. Jansen            gradV(:,1,1) = gradV(:,1,1) + shg(:,n,1) * ycl(:,n,2)
357*59599516SKenneth E. Jansen            gradV(:,2,1) = gradV(:,2,1) + shg(:,n,1) * ycl(:,n,3)
358*59599516SKenneth E. Jansen            gradV(:,3,1) = gradV(:,3,1) + shg(:,n,1) * ycl(:,n,4)
359*59599516SKenneth E. Jansenc
360*59599516SKenneth E. Jansen            gradV(:,1,2) = gradV(:,1,2) + shg(:,n,2) * ycl(:,n,2)
361*59599516SKenneth E. Jansen            gradV(:,2,2) = gradV(:,2,2) + shg(:,n,2) * ycl(:,n,3)
362*59599516SKenneth E. Jansen            gradV(:,3,2) = gradV(:,3,2) + shg(:,n,2) * ycl(:,n,4)
363*59599516SKenneth E. Jansenc
364*59599516SKenneth E. Jansen            gradV(:,1,3) = gradV(:,1,3) + shg(:,n,3) * ycl(:,n,2)
365*59599516SKenneth E. Jansen            gradV(:,2,3) = gradV(:,2,3) + shg(:,n,3) * ycl(:,n,3)
366*59599516SKenneth E. Jansen            gradV(:,3,3) = gradV(:,3,3) + shg(:,n,3) * ycl(:,n,4)
367*59599516SKenneth E. Jansen         enddo
368*59599516SKenneth E. Jansen
369*59599516SKenneth E. Jansen         rmu = datmat(1,2,1)
370*59599516SKenneth E. Jansen
371*59599516SKenneth E. Jansen         yvl(:,intp,6 ) = two * rmu * gradV(:,1,1)
372*59599516SKenneth E. Jansen         yvl(:,intp,7 ) = two * rmu * gradV(:,2,2)
373*59599516SKenneth E. Jansen         yvl(:,intp,8 ) = two * rmu * gradV(:,3,3)
374*59599516SKenneth E. Jansen
375*59599516SKenneth E. Jansen         yvl(:,intp,9 ) = rmu * ( gradV(:,1,2) + gradV(:,2,1) )
376*59599516SKenneth E. Jansen         yvl(:,intp,10) = rmu * ( gradV(:,1,3) + gradV(:,3,1) )
377*59599516SKenneth E. Jansen         yvl(:,intp,11) = rmu * ( gradV(:,2,3) + gradV(:,3,2) )
378*59599516SKenneth E. Jansen
379*59599516SKenneth E. Jansenc
380*59599516SKenneth E. Jansenc.... loop over interpolation points
381*59599516SKenneth E. Jansenc
382*59599516SKenneth E. Jansen      enddo
383*59599516SKenneth E. Jansen
384*59599516SKenneth E. Jansen      return
385*59599516SKenneth E. Jansen      end
386*59599516SKenneth E. Jansen
387*59599516SKenneth E. Jansen
388*59599516SKenneth E. Jansen
389