xref: /phasta/phSolver/incompressible/hessian.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine hessian ( y,         x,
2*59599516SKenneth E. Jansen     &                       shp,       shgl,      iBC,
3*59599516SKenneth E. Jansen     &                       shpb,      shglb,     iper,
4*59599516SKenneth E. Jansen     &                       ilwork,    uhess,     gradu  )
5*59599516SKenneth E. Jansen        use pointer_data  ! brings in the pointers for the blocked arrays
6*59599516SKenneth E. Jansen
7*59599516SKenneth E. Jansen        include "common.h"
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansen        dimension y(nshg,ndof),
10*59599516SKenneth E. Jansen     &            x(numnp,nsd),         iBC(nshg),
11*59599516SKenneth E. Jansen     &            iper(nshg)
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
14*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
15*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
16*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansen        dimension gradu(nshg,9),     rmass(nshg),
19*59599516SKenneth E. Jansen     &            uhess(nshg,27)
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansenc
24*59599516SKenneth E. Jansen           gradu = zero
25*59599516SKenneth E. Jansen           rmass = zero
26*59599516SKenneth E. Jansen
27*59599516SKenneth E. Jansen           do iblk = 1, nelblk
28*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
29*59599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
30*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
31*59599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
32*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
33*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
34*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
35*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
36*59599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
37*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
38*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
39*59599516SKenneth E. Jansenc
40*59599516SKenneth E. Jansen              call velocity_gradient ( y,
41*59599516SKenneth E. Jansen     &                                 x,
42*59599516SKenneth E. Jansen     &                                 shp(lcsyst,1:nshl,:),
43*59599516SKenneth E. Jansen     &                                 shgl(lcsyst,:,1:nshl,:),
44*59599516SKenneth E. Jansen     &                                 mien(iblk)%p,
45*59599516SKenneth E. Jansen     &                                 gradu,
46*59599516SKenneth E. Jansen     &                                 rmass )
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansen           end do
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansenc
51*59599516SKenneth E. Jansen           call reconstruct( rmass, gradu, iBC, iper, ilwork, 9 )
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansen           uhess = zero
54*59599516SKenneth E. Jansen           rmass = zero
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen           do iblk = 1, nelblk
57*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
58*59599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
59*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
60*59599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
61*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
62*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
63*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
64*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
65*59599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
66*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
67*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen              call velocity_hessian (  gradu,
71*59599516SKenneth E. Jansen     &                                 x,
72*59599516SKenneth E. Jansen     &                                 shp(lcsyst,1:nshl,:),
73*59599516SKenneth E. Jansen     &                                 shgl(lcsyst,:,1:nshl,:),
74*59599516SKenneth E. Jansen     &                                 mien(iblk)%p,
75*59599516SKenneth E. Jansen     &                                 uhess,
76*59599516SKenneth E. Jansen     &				       rmass  )
77*59599516SKenneth E. Jansen           end do
78*59599516SKenneth E. Jansen
79*59599516SKenneth E. Jansen
80*59599516SKenneth E. Jansen           call reconstruct( rmass, uhess, iBC, iper, ilwork, 27 )
81*59599516SKenneth E. Jansenc
82*59599516SKenneth E. Jansen      return
83*59599516SKenneth E. Jansen      end
84*59599516SKenneth E. Jansen
85*59599516SKenneth E. Jansenc-----------------------------------------------------------------------------
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansen        subroutine velocity_gradient ( y,       x,       shp,     shgl,
88*59599516SKenneth E. Jansen     &                                 ien,     gradu,   rmass    )
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen        include "common.h"
91*59599516SKenneth E. Jansenc
92*59599516SKenneth E. Jansen        dimension y(nshg,ndof),               x(numnp,nsd),
93*59599516SKenneth E. Jansen     &            shp(nshl,ngauss),           shgl(nsd,nshl,ngauss),
94*59599516SKenneth E. Jansen     &            ien(npro,nshl),             gradu(nshg,9),
95*59599516SKenneth E. Jansen     &            shdrv(npro,nsd,nshl),       shape( npro, nshl ),
96*59599516SKenneth E. Jansen     &            gradul(npro,9) ,            rmass( nshg )
97*59599516SKenneth E. Jansenc
98*59599516SKenneth E. Jansen        dimension yl(npro,nshl,ndof),          xl(npro,nenl,nsd),
99*59599516SKenneth E. Jansen     &            ql(npro,nshl,9),             dxidx(npro,nsd,nsd),
100*59599516SKenneth E. Jansen     &            WdetJ(npro),		       rmassl(npro,nshl)
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansen        dimension sgn(npro,nshl)
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansenc.... create the matrix of mode signs for the hierarchic basis
106*59599516SKenneth E. Jansenc     functions.
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansen        do i=1,nshl
109*59599516SKenneth E. Jansen           where ( ien(:,i) < 0 )
110*59599516SKenneth E. Jansen              sgn(:,i) = -one
111*59599516SKenneth E. Jansen           elsewhere
112*59599516SKenneth E. Jansen              sgn(:,i) = one
113*59599516SKenneth E. Jansen           endwhere
114*59599516SKenneth E. Jansen        enddo
115*59599516SKenneth E. Jansen
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansenc.... gather the variables
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansen
120*59599516SKenneth E. Jansen        call localy (y,    yl,     ien,    ndof,   'gather  ')
121*59599516SKenneth E. Jansen        call localx (x,    xl,     ien,    nsd,    'gather  ')
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc.... get the element residuals
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansen        ql     = zero
126*59599516SKenneth E. Jansen        rmassl = zero
127*59599516SKenneth E. Jansen
128*59599516SKenneth E. Jansen        do intp = 1, ngauss
129*59599516SKenneth E. Jansen
130*59599516SKenneth E. Jansen            if ( Qwt( lcsyst, intp ) .eq. zero ) cycle
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen            gradul = zero
133*59599516SKenneth E. Jansen            call getshp( shp, shgl, sgn, shape, shdrv )
134*59599516SKenneth E. Jansen            call local_gradient( yl(:,:,2:4), 3,  shdrv, xl,
135*59599516SKenneth E. Jansen     &                           gradul , dxidx, WdetJ )
136*59599516SKenneth E. Jansen
137*59599516SKenneth E. Jansenc.... assemble contribution of gradu to each element node
138*59599516SKenneth E. Jansenc
139*59599516SKenneth E. Jansen            do i=1,nshl
140*59599516SKenneth E. Jansen                do j = 1, 9
141*59599516SKenneth E. Jansen                    ql(:,i,j) = ql(:,i,j)+shape(:,i)*WdetJ*gradul(:,j)
142*59599516SKenneth E. Jansen                end do
143*59599516SKenneth E. Jansen
144*59599516SKenneth E. Jansen                rmassl(:,i) = rmassl(:,i) + shape(:,i)*WdetJ
145*59599516SKenneth E. Jansen
146*59599516SKenneth E. Jansen             end do
147*59599516SKenneth E. Jansen
148*59599516SKenneth E. Jansen        end do
149*59599516SKenneth E. Jansenc
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansen        call local (gradu,  ql,     ien,  9,  'scatter ')
152*59599516SKenneth E. Jansen        call local (rmass,  rmassl, ien,  1,  'scatter ')
153*59599516SKenneth E. Jansenc
154*59599516SKenneth E. Jansenc.... end
155*59599516SKenneth E. Jansenc
156*59599516SKenneth E. Jansen        return
157*59599516SKenneth E. Jansen        end
158*59599516SKenneth E. Jansen
159*59599516SKenneth E. Jansen
160*59599516SKenneth E. Jansenc-----------------------------------------------------------------------------
161*59599516SKenneth E. Jansen
162*59599516SKenneth E. Jansen        subroutine velocity_hessian ( gradu,   x,     shp,   shgl,
163*59599516SKenneth E. Jansen     &                                ien,     uhess, rmass  )
164*59599516SKenneth E. Jansen
165*59599516SKenneth E. Jansen        include "common.h"
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansen        dimension gradu(nshg,9),              x(numnp,nsd),
168*59599516SKenneth E. Jansen     &            shp(nshl,ngauss),           shgl(nsd,nshl,ngauss),
169*59599516SKenneth E. Jansen     &            ien(npro,nshl),             uhess(nshg,27),
170*59599516SKenneth E. Jansen     &            shdrv(npro,nsd,nshl),       shape( npro, nshl ),
171*59599516SKenneth E. Jansen     &            uhessl(npro,27),            rmass( nshg )
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansen        dimension gradul(npro,nshl,9),          xl(npro,nenl,nsd),
174*59599516SKenneth E. Jansen     &            ql(npro,nshl,27),             dxidx(npro,nsd,nsd),
175*59599516SKenneth E. Jansen     &            WdetJ(npro),                  rmassl(npro, nshl)
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansenc
178*59599516SKenneth E. Jansen        dimension sgn(npro,nshl)
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansenc.... create the matrix of mode signs for the hierarchic basis
181*59599516SKenneth E. Jansenc     functions.
182*59599516SKenneth E. Jansenc
183*59599516SKenneth E. Jansen        do i=1,nshl
184*59599516SKenneth E. Jansen           where ( ien(:,i) < 0 )
185*59599516SKenneth E. Jansen              sgn(:,i) = -one
186*59599516SKenneth E. Jansen           elsewhere
187*59599516SKenneth E. Jansen              sgn(:,i) = one
188*59599516SKenneth E. Jansen           endwhere
189*59599516SKenneth E. Jansen        enddo
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansenc
192*59599516SKenneth E. Jansenc.... gather the variables
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansen
195*59599516SKenneth E. Jansen        call local  (gradu,  gradul, ien,    9 ,   'gather  ')
196*59599516SKenneth E. Jansen        call localx (x,      xl,     ien,    nsd,  'gather  ')
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansenc.... get the element residuals
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansen        ql     = zero
201*59599516SKenneth E. Jansen	rmassl = zero
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansen        do intp = 1, ngauss
204*59599516SKenneth E. Jansen
205*59599516SKenneth E. Jansen            if ( Qwt( lcsyst, intp ) .eq. zero ) cycle
206*59599516SKenneth E. Jansen
207*59599516SKenneth E. Jansen            uhessl = zero
208*59599516SKenneth E. Jansen            call getshp( shp, shgl, sgn, shape, shdrv )
209*59599516SKenneth E. Jansen            call local_gradient( gradul, 9,  shdrv, xl,
210*59599516SKenneth E. Jansen     &                           uhessl , dxidx, WdetJ )
211*59599516SKenneth E. Jansen
212*59599516SKenneth E. Jansenc.... assemble contribution of gradu .,
213*59599516SKenneth E. Jansenc
214*59599516SKenneth E. Jansen            do i=1,nshl
215*59599516SKenneth E. Jansen                do j = 1,27
216*59599516SKenneth E. Jansen                    ql(:,i,j)=ql(:,i,j)+shape(:,i)*WdetJ*uhessl(:,j )
217*59599516SKenneth E. Jansen                end do
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen                rmassl(:,i) = rmassl(:,i) + shape(:,i)*WdetJ
220*59599516SKenneth E. Jansen             end do
221*59599516SKenneth E. Jansen
222*59599516SKenneth E. Jansen        end do
223*59599516SKenneth E. Jansenc
224*59599516SKenneth E. Jansenc
225*59599516SKenneth E. Jansen        call local (uhess,  ql,     ien,  27,     'scatter ')
226*59599516SKenneth E. Jansen        call local (rmass,  rmassl, ien,   1,     'scatter ')
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansenc.... end
229*59599516SKenneth E. Jansenc
230*59599516SKenneth E. Jansen        return
231*59599516SKenneth E. Jansen        end
232*59599516SKenneth E. Jansen
233*59599516SKenneth E. Jansen
234*59599516SKenneth E. Jansenc--------------------------------------------------------------------
235*59599516SKenneth E. Jansen      subroutine reconstruct( rmass, qres, iBC, iper, ilwork, vsize )
236*59599516SKenneth E. Jansen
237*59599516SKenneth E. Jansen      include "common.h"
238*59599516SKenneth E. Jansen
239*59599516SKenneth E. Jansen      integer vsize
240*59599516SKenneth E. Jansen      dimension rmass(nshg), qres( nshg, vsize),
241*59599516SKenneth E. Jansen     &          iBC(nshg), iper(nshg)
242*59599516SKenneth E. Jansenc
243*59599516SKenneth E. Jansenc
244*59599516SKenneth E. Jansenc.... compute qi for node A, i.e., qres <-- qres/rmass
245*59599516SKenneth E. Jansenc
246*59599516SKenneth E. Jansen       if (numpe > 1) then
247*59599516SKenneth E. Jansen          call commu ( qres  , ilwork,  vsize  , 'in ')
248*59599516SKenneth E. Jansen          call commu ( rmass , ilwork,  1  , 'in ')
249*59599516SKenneth E. Jansen       endif
250*59599516SKenneth E. Jansenc
251*59599516SKenneth E. Jansenc  take care of periodic boundary conditions
252*59599516SKenneth E. Jansenc
253*59599516SKenneth E. Jansen        do j= 1,nshg
254*59599516SKenneth E. Jansen          if ((btest(iBC(j),10))) then
255*59599516SKenneth E. Jansen            i = iper(j)
256*59599516SKenneth E. Jansen            rmass(i) = rmass(i) + rmass(j)
257*59599516SKenneth E. Jansen            qres(i,:) = qres(i,:) + qres(j,:)
258*59599516SKenneth E. Jansen          endif
259*59599516SKenneth E. Jansen        enddo
260*59599516SKenneth E. Jansen
261*59599516SKenneth E. Jansen        do j= 1,nshg
262*59599516SKenneth E. Jansen          if ((btest(iBC(j),10))) then
263*59599516SKenneth E. Jansen            i = iper(j)
264*59599516SKenneth E. Jansen            rmass(j) = rmass(i)
265*59599516SKenneth E. Jansen            qres(j,:) = qres(i,:)
266*59599516SKenneth E. Jansen          endif
267*59599516SKenneth E. Jansen        enddo
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansenc.... invert the diagonal mass matrix and find q
270*59599516SKenneth E. Jansenc
271*59599516SKenneth E. Jansen        rmass = one/rmass
272*59599516SKenneth E. Jansen
273*59599516SKenneth E. Jansen       do i=1,vsize
274*59599516SKenneth E. Jansen          qres(:,i) = rmass*qres(:,i)
275*59599516SKenneth E. Jansen       enddo
276*59599516SKenneth E. Jansen
277*59599516SKenneth E. Jansen       if(numpe > 1) then
278*59599516SKenneth E. Jansen          call commu (qres, ilwork, vsize, 'out')
279*59599516SKenneth E. Jansen       endif
280*59599516SKenneth E. Jansen
281*59599516SKenneth E. Jansenc.... return
282*59599516SKenneth E. Jansenc
283*59599516SKenneth E. Jansen        return
284*59599516SKenneth E. Jansen        end
285*59599516SKenneth E. Jansen
286*59599516SKenneth E. Jansenc-------------------------------------------------------------------------
287*59599516SKenneth E. Jansen
288*59599516SKenneth E. Jansen        subroutine local_gradient ( vector,   vsize, shgl,   xl,
289*59599516SKenneth E. Jansen     &                              gradient, dxidx,   WdetJ )
290*59599516SKenneth E. Jansenc
291*59599516SKenneth E. Jansenc
292*59599516SKenneth E. Jansen        include "common.h"
293*59599516SKenneth E. Jansenc
294*59599516SKenneth E. Jansenc  passed arrays
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansen        integer vsize
297*59599516SKenneth E. Jansenc
298*59599516SKenneth E. Jansen        dimension vector(npro,nshl,vsize),
299*59599516SKenneth E. Jansen     &            shgl(npro,nsd,nshl),        xl(npro,nenl,nsd),
300*59599516SKenneth E. Jansen     &            gradient(npro,vsize*3),     shg(npro,nshl,nsd),
301*59599516SKenneth E. Jansen     &            dxidx(npro,nsd,nsd),        WdetJ(npro)
302*59599516SKenneth E. Jansenc
303*59599516SKenneth E. Jansenc  local arrays
304*59599516SKenneth E. Jansenc
305*59599516SKenneth E. Jansen        dimension tmp(npro),           dxdxi(npro,nsd,nsd)
306*59599516SKenneth E. Jansen
307*59599516SKenneth E. Jansenc
308*59599516SKenneth E. Jansenc.... compute the deformation gradient
309*59599516SKenneth E. Jansenc
310*59599516SKenneth E. Jansen        dxdxi = zero
311*59599516SKenneth E. Jansenc
312*59599516SKenneth E. Jansen          do n = 1, nenl
313*59599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(:,1,n)
314*59599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(:,2,n)
315*59599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(:,3,n)
316*59599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(:,1,n)
317*59599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(:,2,n)
318*59599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(:,3,n)
319*59599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(:,1,n)
320*59599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(:,2,n)
321*59599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(:,3,n)
322*59599516SKenneth E. Jansen          enddo
323*59599516SKenneth E. Jansenc
324*59599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
325*59599516SKenneth E. Jansenc
326*59599516SKenneth E. Jansen        dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
327*59599516SKenneth E. Jansen     &                 - dxdxi(:,3,2) * dxdxi(:,2,3)
328*59599516SKenneth E. Jansen        dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
329*59599516SKenneth E. Jansen     &                 - dxdxi(:,1,2) * dxdxi(:,3,3)
330*59599516SKenneth E. Jansen        dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
331*59599516SKenneth E. Jansen     &                 - dxdxi(:,1,3) * dxdxi(:,2,2)
332*59599516SKenneth E. Jansen        tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
333*59599516SKenneth E. Jansen     &                       + dxidx(:,1,2) * dxdxi(:,2,1)
334*59599516SKenneth E. Jansen     &                       + dxidx(:,1,3) * dxdxi(:,3,1) )
335*59599516SKenneth E. Jansen        dxidx(:,1,1) = dxidx(:,1,1) * tmp
336*59599516SKenneth E. Jansen        dxidx(:,1,2) = dxidx(:,1,2) * tmp
337*59599516SKenneth E. Jansen        dxidx(:,1,3) = dxidx(:,1,3) * tmp
338*59599516SKenneth E. Jansen        dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
339*59599516SKenneth E. Jansen     &                - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
340*59599516SKenneth E. Jansen        dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
341*59599516SKenneth E. Jansen     &                - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
342*59599516SKenneth E. Jansen        dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
343*59599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
344*59599516SKenneth E. Jansen        dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
345*59599516SKenneth E. Jansen     &                - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
346*59599516SKenneth E. Jansen        dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
347*59599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
348*59599516SKenneth E. Jansen        dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
349*59599516SKenneth E. Jansen     &                - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
350*59599516SKenneth E. Jansenc
351*59599516SKenneth E. Jansen        WdetJ = Qwt(lcsyst,intp)/ tmp
352*59599516SKenneth E. Jansen
353*59599516SKenneth E. Jansenc
354*59599516SKenneth E. Jansenc.... --------------------->  Global Gradients  <-----------------------
355*59599516SKenneth E. Jansenc
356*59599516SKenneth E. Jansen        gradient = zero
357*59599516SKenneth E. Jansenc
358*59599516SKenneth E. Jansenc
359*59599516SKenneth E. Jansen        do n = 1, nshl
360*59599516SKenneth E. Jansenc
361*59599516SKenneth E. Jansenc.... compute the global gradient of shape-function
362*59599516SKenneth E. Jansenc
363*59599516SKenneth E. Jansenc            ! N_{a,x_i}= N_{a,xi_i} xi_{i,x_j}
364*59599516SKenneth E. Jansenc
365*59599516SKenneth E. Jansen          shg(:,n,1) = shgl(:,1,n) * dxidx(:,1,1) +
366*59599516SKenneth E. Jansen     &                 shgl(:,2,n) * dxidx(:,2,1) +
367*59599516SKenneth E. Jansen     &                 shgl(:,3,n) * dxidx(:,3,1)
368*59599516SKenneth E. Jansen          shg(:,n,2) = shgl(:,1,n) * dxidx(:,1,2) +
369*59599516SKenneth E. Jansen     &                 shgl(:,2,n) * dxidx(:,2,2) +
370*59599516SKenneth E. Jansen     &                 shgl(:,3,n) * dxidx(:,3,2)
371*59599516SKenneth E. Jansen          shg(:,n,3) = shgl(:,1,n) * dxidx(:,1,3) +
372*59599516SKenneth E. Jansen     &                 shgl(:,2,n) * dxidx(:,2,3) +
373*59599516SKenneth E. Jansen     &                 shgl(:,3,n) * dxidx(:,3,3)
374*59599516SKenneth E. Jansenc
375*59599516SKenneth E. Jansenc
376*59599516SKenneth E. Jansenc  Y_{,x_i}=SUM_{a=1}^nenl (N_{a,x_i}(int) Ya)
377*59599516SKenneth E. Jansenc
378*59599516SKenneth E. Jansen          do i = 1, 3
379*59599516SKenneth E. Jansen            do j = 1, vsize
380*59599516SKenneth E. Jansen               k = (i-1)*vsize+j
381*59599516SKenneth E. Jansen               gradient(:,k) = gradient(:,k) + shg(:,n,i)*vector(:,n,j)
382*59599516SKenneth E. Jansen            end do
383*59599516SKenneth E. Jansen          end do
384*59599516SKenneth E. Jansen
385*59599516SKenneth E. Jansen       end do
386*59599516SKenneth E. Jansen
387*59599516SKenneth E. Jansenc
388*59599516SKenneth E. Jansenc.... return
389*59599516SKenneth E. Jansenc
390*59599516SKenneth E. Jansen       return
391*59599516SKenneth E. Jansen       end
392