xref: /phasta/phSolver/incompressible/soldir.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine SolDir (y,          ac,        yold,      acold,
2*59599516SKenneth E. Jansen     &			   x,
3*59599516SKenneth E. Jansen     &                     iBC,       BC,
4*59599516SKenneth E. Jansen     &                     res,
5*59599516SKenneth E. Jansen     &                     iper,       ilwork,
6*59599516SKenneth E. Jansen     &                     shp, shgl, shpb, shglb)
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc----------------------------------------------------------------------
9*59599516SKenneth E. Jansenc     direct solver
10*59599516SKenneth E. Jansenc----------------------------------------------------------------------
11*59599516SKenneth E. Jansenc
12*59599516SKenneth E. Jansen        use pointer_data
13*59599516SKenneth E. Jansen
14*59599516SKenneth E. Jansen        include "common.h"
15*59599516SKenneth E. Jansen        include "mpif.h"
16*59599516SKenneth E. Jansen        include "auxmpi.h"
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansen        dimension y(nshg,ndof),             ac(nshg,ndof),
19*59599516SKenneth E. Jansen     &            yold(nshg,ndof),          acold(nshg,ndof),
20*59599516SKenneth E. Jansen     &            x(numnp,nsd),
21*59599516SKenneth E. Jansen     &            iBC(nshg),                BC(nshg,ndofBC),
22*59599516SKenneth E. Jansen     &            res(nshg,nflow),
23*59599516SKenneth E. Jansen     &            ilwork(nlwork),            iper(nshg)
24*59599516SKenneth E. Jansenc
25*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
26*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
27*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
28*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen        real*8    yAlpha(nshg,5),           acAlpha(nshg,5)
31*59599516SKenneth E. Jansen
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansen        dimension dyf(4*nshg),  indx(4*nshg), solinc(nshg,4)
34*59599516SKenneth E. Jansen
35*59599516SKenneth E. Jansen        dimension globMas(4*nshg,4*nshg)
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansen        write (*,*) 'Warning: using direct solver...'
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansenc.... set the element matrix flag
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen        lhs = 1   ! always
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansenc.... compute solution at n+alpha
44*59599516SKenneth E. Jansenc
45*59599516SKenneth E. Jansen      call itrYAlpha( yold,  acold,  y,  ac,  yAlpha,  acAlpha)
46*59599516SKenneth E. Jansenc
47*59599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansenc.... form the LHS matrices, the residual vector
50*59599516SKenneth E. Jansenc
51*59599516SKenneth E. Jansen        call ElmGMR (yAlpha,    acAlpha,            x,
52*59599516SKenneth E. Jansen     &               shp,       shgl,             iBC,
53*59599516SKenneth E. Jansen     &               BC,        shpb,           shglb,
54*59599516SKenneth E. Jansen     &               res,       iper,          ilwork,
55*59599516SKenneth E. Jansen     &              rowp,       colm,            lhsK,
56*59599516SKenneth E. Jansen     &              lhsP,       rerr   )
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen        globMas = zero
59*59599516SKenneth E. Jansen        npro = numel
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansencccc need to assemble here!
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansen        call bc3Global(globMas,   iBC)
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. JansencDEBUG: write the global matrix (nonzero blocks)
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansen        do i=1,nshg
68*59599516SKenneth E. Jansen           i0 = (i-1)*4
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen           do j=1,nshg
71*59599516SKenneth E. Jansen              j0 = (j-1)*4
72*59599516SKenneth E. Jansen
73*59599516SKenneth E. Jansen              if (globMas(i0+1,j0+1) .ne. 0) then
74*59599516SKenneth E. Jansen                 write (544,21) i,j
75*59599516SKenneth E. Jansen                 do ii=1,4
76*59599516SKenneth E. Jansen                    write(543,20) (globMas(i0+ii,j0+kk), kk=1,4)
77*59599516SKenneth E. Jansen                 enddo
78*59599516SKenneth E. Jansen              endif
79*59599516SKenneth E. Jansen           enddo
80*59599516SKenneth E. Jansen        enddo
81*59599516SKenneth E. Jansen
82*59599516SKenneth E. Jansen 20     format (4(2x,e14.7))
83*59599516SKenneth E. Jansen 21     format (2(2x,i8))
84*59599516SKenneth E. Jansen
85*59599516SKenneth E. Jansenc$$$        stop
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansenc
88*59599516SKenneth E. Jansenc.... LU factor the mass matrix
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansen        indx = 0
91*59599516SKenneth E. Jansen        call ludcmp(globMas,   4*nshg,    4*nshg,  indx,  d)
92*59599516SKenneth E. Jansen        write(543,*) 'rhs'
93*59599516SKenneth E. Jansen        do i=1, nshg
94*59599516SKenneth E. Jansen           i0 = 4*(i-1)
95*59599516SKenneth E. Jansen           dyf(i0+1) = res(i,1)
96*59599516SKenneth E. Jansen           dyf(i0+2) = res(i,2)
97*59599516SKenneth E. Jansen           dyf(i0+3) = res(i,3)
98*59599516SKenneth E. Jansen           dyf(i0+4) = res(i,4)
99*59599516SKenneth E. Jansen           write(543,20) (dyf(i0+j),j=1,4)
100*59599516SKenneth E. Jansen        enddo
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansenc.... back-substitute to find dY
103*59599516SKenneth E. Jansenc
104*59599516SKenneth E. Jansen        call lubksb(globMas,   4*nshg,    4*nshg,  indx,  dyf)
105*59599516SKenneth E. Jansenc
106*59599516SKenneth E. Jansen        write(543,*) 'soln'
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen        do i=1,nshg
109*59599516SKenneth E. Jansen           i0 = 4*(i-1)
110*59599516SKenneth E. Jansen           solinc(i,1) = dyf(i0+1)
111*59599516SKenneth E. Jansen           solinc(i,2) = dyf(i0+2)
112*59599516SKenneth E. Jansen           solinc(i,3) = dyf(i0+3)
113*59599516SKenneth E. Jansen           solinc(i,4) = dyf(i0+4)
114*59599516SKenneth E. Jansen        enddo
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansenc.... Now, you satisfy the boundary conditions to newly
118*59599516SKenneth E. Jansenc     obtained p,u,v,w
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansenc     You have to set boundary conditions first so Dy distributes
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansen        call itrCorrect ( y,    ac,    solinc, iBC)
124*59599516SKenneth E. Jansen  	call itrBC (y,  ac,  iBC,  BC,  iper, ilwork)
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansenc.... output the statistics
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansen      call rstatic (res, y, solinc)
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansenc.... end
131*59599516SKenneth E. Jansenc
132*59599516SKenneth E. Jansen      	return
133*59599516SKenneth E. Jansen        end
134