xref: /phasta/phSolver/incompressible/solfar.f (revision ec121c45c2bc5b2560ecdf76f4d2a36933c1de2c)
159599516SKenneth E. Jansen      subroutine SolFlow(y,          ac,         u,
259599516SKenneth E. Jansen     &                   yold,       acold,      uold,
359599516SKenneth E. Jansen     &                   x,          iBC,
459599516SKenneth E. Jansen     &                   BC,         res,
559599516SKenneth E. Jansen     &                   nPermDims,  nTmpDims,  aperm,
659599516SKenneth E. Jansen     &                   atemp,      iper,
759599516SKenneth E. Jansen     &                   ilwork,     shp,        shgl,
859599516SKenneth E. Jansen     &                   shpb,       shglb,      rowp,
959599516SKenneth E. Jansen     &                   colm,       lhsK,       lhsP,
1059599516SKenneth E. Jansen     &                   solinc,     rerr,       tcorecp,
11ae8d68e4SKenneth E. Jansen     &                   GradV,       sumtime,
12ae8d68e4SKenneth E. Jansen     &                   svLS_lhs,  svLS_ls,   svLS_nFaces)
1359599516SKenneth E. Jansenc
1459599516SKenneth E. Jansenc----------------------------------------------------------------------
1559599516SKenneth E. Jansenc
16ae8d68e4SKenneth E. Jansenc This is the 2nd interface routine to the  linear equation
1759599516SKenneth E. Jansenc solver library that uses the CGP and GMRES methods.
1859599516SKenneth E. Jansenc
1959599516SKenneth E. Jansenc input:
2059599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
2159599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
2259599516SKenneth E. Jansenc  yold   (nshg,ndof)           : Y-variables at beginning of step
2359599516SKenneth E. Jansenc  acold   (nshg,ndof)          : Primvar. accel. at beginning of step
2459599516SKenneth E. Jansenc  x      (numnp,nsd)            : node coordinates
2559599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
2659599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
2759599516SKenneth E. Jansenc  iper   (nshg)                : periodic nodal information
2859599516SKenneth E. Jansenc
2959599516SKenneth E. Jansenc output:
3059599516SKenneth E. Jansenc  res    (nshg,nflow)           : preconditioned residual
3159599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
3259599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
3359599516SKenneth E. Jansenc
3459599516SKenneth E. Jansenc
3559599516SKenneth E. Jansenc The followings are preliminary steps required to use Farzin's
3659599516SKenneth E. Jansenc solver library.  New way of writing has to be used such as
3759599516SKenneth E. Jansenc
3859599516SKenneth E. Jansenc          |  K     G | | du |    | Rmom  |
3959599516SKenneth E. Jansenc          |          | |    | =  |       |
4059599516SKenneth E. Jansenc          | G^t    C | | dp |    | Rcon  |
4159599516SKenneth E. Jansenc
4259599516SKenneth E. Jansenc          |     E    | | dT | =  | Rtemp |
4359599516SKenneth E. Jansenc
4459599516SKenneth E. Jansenc     where
4559599516SKenneth E. Jansenc
4659599516SKenneth E. Jansenc      xKebe : K_ab = dRmom_a/du_b    xTe : E_ab = dRtemp_a/dT_b
4759599516SKenneth E. Jansenc
4859599516SKenneth E. Jansenc              G_ab = dRmom_a/dp_b
4959599516SKenneth E. Jansenc      xGoC  :
5059599516SKenneth E. Jansenc              C_ab = dRcon_a/dp_b
5159599516SKenneth E. Jansenc
5259599516SKenneth E. Jansenc              resf = Rmon Rcon       rest = Rtemp
5359599516SKenneth E. Jansenc
5459599516SKenneth E. Jansenc
5559599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
5659599516SKenneth E. Jansenc Juin Kim, Summer 1998. (Incompressible flow solver interface)
5759599516SKenneth E. Jansenc Alberto Figueroa.  CMM-FSI
5859599516SKenneth E. Jansenc----------------------------------------------------------------------
5959599516SKenneth E. Jansenc
6059599516SKenneth E. Jansen      use pointer_data
6159599516SKenneth E. Jansen#ifdef AMG
6259599516SKenneth E. Jansen      use ramg_data
6359599516SKenneth E. Jansen#endif
6459599516SKenneth E. Jansen
6559599516SKenneth E. Jansen      include "common.h"
6659599516SKenneth E. Jansen      include "mpif.h"
6759599516SKenneth E. Jansen      include "auxmpi.h"
68ae8d68e4SKenneth E. Jansen        include "svLS.h"
6959599516SKenneth E. Jansenc
70ae8d68e4SKenneth E. JansenC
71ae8d68e4SKenneth E. JansenC     Argument variables
72ae8d68e4SKenneth E. JansenC
73ae8d68e4SKenneth E. Jansen      INTEGER            npermdims
74ae8d68e4SKenneth E. Jansen      INTEGER             ntmpdims
75ae8d68e4SKenneth E. JansenC
76ae8d68e4SKenneth E. JansenC     Local variables
77ae8d68e4SKenneth E. JansenC
78ae8d68e4SKenneth E. Jansen      INTEGER              lesid
79ae8d68e4SKenneth E. JansenC
80ae8d68e4SKenneth E. Jansen      REAL*8                rdtmp
81ae8d68e4SKenneth E. JansenC
82efb88323SKenneth E. Jansen      TYPE(svLS_lhsType), INTENT(INOUT) :: svLS_lhs
83efb88323SKenneth E. Jansen      TYPE(svLS_lsType), INTENT(INOUT) ::  svLS_ls
84ae8d68e4SKenneth E. Jansen
8559599516SKenneth E. Jansen      real*8    y(nshg,ndof),             ac(nshg,ndof),
8659599516SKenneth E. Jansen     &          yold(nshg,ndof),          acold(nshg,ndof),
8759599516SKenneth E. Jansen     &          u(nshg,nsd),              uold(nshg,nsd),
8859599516SKenneth E. Jansen     &          x(numnp,nsd),             BC(nshg,ndofBC),
8959599516SKenneth E. Jansen     &          res(nshg,nflow),          tmpres(nshg,nflow),
9059599516SKenneth E. Jansen     &          flowDiag(nshg,4),
9159599516SKenneth E. Jansen     &          aperm(nshg,nPermDims),    atemp(nshg,nTmpDims),
9259599516SKenneth E. Jansen     &          sclrDiag(nshg,1),
9359599516SKenneth E. Jansen     &          lhsK(9,nnz_tot),          lhsP(4,nnz_tot),
9459599516SKenneth E. Jansen     &          GradV(nshg,nsdsq)
9559599516SKenneth E. Jansenc
9659599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
9759599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT),
9859599516SKenneth E. Jansen     &          shpb(MAXTOP,maxsh,MAXQPT),
9959599516SKenneth E. Jansen     &          shglb(MAXTOP,nsd,maxsh,MAXQPT)
10059599516SKenneth E. Jansenc
10159599516SKenneth E. Jansen      integer   usr(100),                 eqnType,temp,
10259599516SKenneth E. Jansen     &          rowp(nshg*nnz),           colm(nshg+1),
10359599516SKenneth E. Jansen     &          iBC(nshg),                ilwork(nlwork),
10459599516SKenneth E. Jansen     &          iper(nshg)
10559599516SKenneth E. Jansenc
10659599516SKenneth E. Jansen      real*8    yAlpha(nshg,ndof),        acAlpha(nshg,ndof),
10759599516SKenneth E. Jansen     &          uAlpha(nshg,nsd),
10859599516SKenneth E. Jansen     &          lesP(nshg,4),             lesQ(nshg,4),
10959599516SKenneth E. Jansen     &          solinc(nshg,ndof),        CGsol(nshg)
11059599516SKenneth E. Jansen
11159599516SKenneth E. Jansen      real*8     tcorecp(2)
11259599516SKenneth E. Jansen
11359599516SKenneth E. Jansen      real*8    rerr(nshg,10),            rtmp(nshg,4),rtemp
11459599516SKenneth E. Jansen
11559599516SKenneth E. Jansen      real*8    msum(4),mval(4),cpusec(10)
116ae8d68e4SKenneth E. Jansen      REAL*8 sumtime
117ae8d68e4SKenneth E. Jansen      INTEGER dof, svLS_nFaces, i, j, k, l
118ae8d68e4SKenneth E. Jansen      INTEGER, ALLOCATABLE :: incL(:)
119ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: faceRes(:), Res4(:,:), Val4(:,:)
12059599516SKenneth E. Jansen
12159599516SKenneth E. Jansenc
12259599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
12359599516SKenneth E. Jansenc
12459599516SKenneth E. Jansenc
12559599516SKenneth E. Jansenc.... set the parameters for flux and surface tension calculations
12659599516SKenneth E. Jansenc
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansen        temp = npro
12959599516SKenneth E. Jansen
13059599516SKenneth E. Jansen
13159599516SKenneth E. Jansen        idflx = 0
13259599516SKenneth E. Jansen        if(idiff >= 1 )  idflx= (nflow-1) * nsd
13359599516SKenneth E. Jansen        if (isurf == 1) idflx=nflow*nsd
13459599516SKenneth E. Jansenc.... compute solution at n+alpha
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansen      call itrYAlpha( uold,    yold,    acold,
13759599516SKenneth E. Jansen     &                u,       y,       ac,
13859599516SKenneth E. Jansen     &                uAlpha,  yAlpha,  acAlpha)
13959599516SKenneth E. Jansen
14059599516SKenneth E. Jansenc
14159599516SKenneth E. Jansenc.... form the LHS matrices, the residual vector (at alpha)
14259599516SKenneth E. Jansenc
14359599516SKenneth E. Jansenc      call summary_start()
14459599516SKenneth E. Jansen      impistat=1
14559599516SKenneth E. Jansen      impistat2=1
14659599516SKenneth E. Jansen      telmcp1 = TMRC()
14759599516SKenneth E. Jansen      call ElmGMR (uAlpha,    yAlpha,     acAlpha,    x,
14859599516SKenneth E. Jansen     &             shp,       shgl,       iBC,
14959599516SKenneth E. Jansen     &             BC,        shpb,       shglb,
15059599516SKenneth E. Jansen     &             res,       iper,       ilwork,
15159599516SKenneth E. Jansen     &             rowp,      colm,       lhsK,
15259599516SKenneth E. Jansen     &             lhsP,      rerr,       GradV   )
15359599516SKenneth E. Jansen      telmcp2 = TMRC()
15459599516SKenneth E. Jansen      impistat=0
15559599516SKenneth E. Jansen      impistat2=0
15659599516SKenneth E. Jansenc      call summary_stop()
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen
15959599516SKenneth E. Jansen            tmpres(:,:) = res(:,:)
16059599516SKenneth E. Jansen            iblk = 1
161ae8d68e4SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
16259599516SKenneth E. Jansen
163ae8d68e4SKenneth E. Jansenc####################################################################
164ae8d68e4SKenneth E. Jansen!     Here calling svLS
165ae8d68e4SKenneth E. Jansen
166ae8d68e4SKenneth E. Jansen      ALLOCATE(faceRes(svLS_nFaces), incL(svLS_nFaces))
167f4e2c78fSKenneth E. Jansen      faceRes=zero  ! function to compute this left out at this time but would be needed to enable adnvanced p vs. Q BC's
168ae8d68e4SKenneth E. Jansen      incL = 1
169ae8d68e4SKenneth E. Jansen      dof = 4
170ae8d68e4SKenneth E. Jansen      IF (.NOT.ALLOCATED(Res4)) THEN
171ae8d68e4SKenneth E. Jansen         ALLOCATE (Res4(dof,nshg), Val4(dof*dof,nnz_tot))
172ae8d68e4SKenneth E. Jansen      END IF
173ae8d68e4SKenneth E. Jansen
174ae8d68e4SKenneth E. Jansen      DO i=1, nshg
175ae8d68e4SKenneth E. Jansen         Res4(1:dof,i) = res(i,1:dof)
176ae8d68e4SKenneth E. Jansen      END DO
177ae8d68e4SKenneth E. Jansen
178ae8d68e4SKenneth E. Jansen      DO i=1, nnz_tot
179ae8d68e4SKenneth E. Jansen         Val4(1:3,i)   = lhsK(1:3,i)
180ae8d68e4SKenneth E. Jansen         Val4(5:7,i)   = lhsK(4:6,i)
181ae8d68e4SKenneth E. Jansen         Val4(9:11,i)  = lhsK(7:9,i)
182ae8d68e4SKenneth E. Jansen         Val4(13:15,i) = lhsP(1:3,i)
183ae8d68e4SKenneth E. Jansen         Val4(16,i)    = lhsP(4,i)
184ae8d68e4SKenneth E. Jansen      END DO
185ae8d68e4SKenneth E. Jansen
186ae8d68e4SKenneth E. Jansen      !Val4(4:12:4,:) = -lhsP(1:3,:)^t
187ae8d68e4SKenneth E. Jansen      DO i=1, nshg
188ae8d68e4SKenneth E. Jansen         Do j=colm(i), colm(i+1) - 1
189ae8d68e4SKenneth E. Jansen            k = rowp(j)
190ae8d68e4SKenneth E. Jansen            DO l=colm(k), colm(k+1) - 1
191ae8d68e4SKenneth E. Jansen               IF (rowp(l) .EQ. i) THEN
192ae8d68e4SKenneth E. Jansen                  Val4(4:12:4,l) = -lhsP(1:3,j)
193ae8d68e4SKenneth E. Jansen                  EXIT
194ae8d68e4SKenneth E. Jansen               END IF
195ae8d68e4SKenneth E. Jansen            END DO
196ae8d68e4SKenneth E. Jansen         END DO
197ae8d68e4SKenneth E. Jansen      END DO
198ae8d68e4SKenneth E. Jansen      CALL svLS_SOLVE(svLS_lhs, svLS_ls, dof, Res4, Val4, incL,
199ae8d68e4SKenneth E. Jansen     2   faceRes)
200ae8d68e4SKenneth E. Jansen
201*ec121c45SKenneth E. Jansen      if(myrank.eq.master) write(*,*) 'svLS outer iterations', svLS_ls%RI%itr
202efb88323SKenneth E. Jansen      statsflow(1)=1.0*svLS_ls%GM%itr
203efb88323SKenneth E. Jansen      statsflow(4)=1.0*svLS_ls%CG%itr
204ae8d68e4SKenneth E. Jansen      DO i=1, nshg
205ae8d68e4SKenneth E. Jansen         solinc(i,1:dof) = Res4(1:dof,i)
206ae8d68e4SKenneth E. Jansen      END DO
207ae8d68e4SKenneth E. Jansen
208ae8d68e4SKenneth E. Jansenc####################################################################
209ae8d68e4SKenneth E. Jansen      ELSE
210ae8d68e4SKenneth E. Jansenc
21159599516SKenneth E. Jansenc.... lesSolve : main matrix solver
21259599516SKenneth E. Jansenc
21359599516SKenneth E. Jansen      lesId   = numeqns(1)
21459599516SKenneth E. Jansen      eqnType = 1
21559599516SKenneth E. Jansen
21659599516SKenneth E. Jansenc      call summary_start()
21759599516SKenneth E. Jansen      impistat=1
21859599516SKenneth E. Jansen      impistat2=1
21959599516SKenneth E. Jansen      tlescp1 = TMRC()
22059599516SKenneth E. Jansen#ifdef AMG
22159599516SKenneth E. Jansen      ! Initial Time Profiling
22259599516SKenneth E. Jansen      call cpu_time(cpusec(1))
22359599516SKenneth E. Jansen      if (irun_amg_prec.gt.0) then
22459599516SKenneth E. Jansen          call ramg_control(colm,rowp,lhsK,lhsP,
22559599516SKenneth E. Jansen     &         ilwork,BC,iBC,iper)
22659599516SKenneth E. Jansen      end if
22759599516SKenneth E. Jansen
22859599516SKenneth E. Jansen      call cpu_time(cpusec(6))
22959599516SKenneth E. Jansen      if (irun_amg_prec.gt.0) then
23059599516SKenneth E. Jansen      ramg_flag = 1
23159599516SKenneth E. Jansen      if (irun_amg_prec.eq.2) then ! Some setup work (mode a)
23259599516SKenneth E. Jansen        ramg_window = 1.0
23359599516SKenneth E. Jansen        ramg_redo = 0
23459599516SKenneth E. Jansen      endif
23559599516SKenneth E. Jansen      do while (ramg_flag.le.irun_amg_prec)
23659599516SKenneth E. Jansen      ! if smart solve, possible run solve twice
23759599516SKenneth E. Jansen      ! restart only if meets plateau
23859599516SKenneth E. Jansen#endif
23959599516SKenneth E. Jansen
24059599516SKenneth E. Jansenc
24159599516SKenneth E. Jansenc.... setup the linear algebra solver
24259599516SKenneth E. Jansenc
24359599516SKenneth E. Jansen      rtmp = res(:,1:4)
24459599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          aperm,
24559599516SKenneth E. Jansen     &              atemp,      rtmp,             solinc,
24659599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
24759599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
24859599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
24959599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDims,
25059599516SKenneth E. Jansen     &              nTmpDims,   rowp,             colm,
25159599516SKenneth E. Jansen     &              lhsK,       lhsP,             rdtmp,
25259599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
25359599516SKenneth E. Jansenc
25459599516SKenneth E. Jansenc.... solve linear system
25559599516SKenneth E. Jansenc
25659599516SKenneth E. Jansen      call myfLesSolve ( lesId, usr )
25759599516SKenneth E. Jansen#ifdef AMG
25859599516SKenneth E. Jansen      ramg_flag = ramg_flag + 2 ! Default no second run in mode a
25959599516SKenneth E. Jansen      if (irun_amg_prec.eq.3) then
26059599516SKenneth E. Jansen          if (maxIters.gt.int(statsflow(4))) then
26159599516SKenneth E. Jansen          ramg_flag = ramg_flag + 1 ! Default no second run in mode b
26259599516SKenneth E. Jansen          endif
26359599516SKenneth E. Jansen      endif
26459599516SKenneth E. Jansen      enddo
26559599516SKenneth E. Jansen      else
26659599516SKenneth E. Jansenc
26759599516SKenneth E. Jansenc.... setup the linear algebra solver
26859599516SKenneth E. Jansenc
26959599516SKenneth E. Jansen      rtmp = res(:,1:4)
27059599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          aperm,
27159599516SKenneth E. Jansen     &              atemp,      rtmp,             solinc,
27259599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
27359599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
27459599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
27559599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDims,
27659599516SKenneth E. Jansen     &              nTmpDims,   rowp,             colm,
27759599516SKenneth E. Jansen     &              lhsK,       lhsP,             rdtmp,
27859599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
27959599516SKenneth E. Jansen
28059599516SKenneth E. Jansen          call myfLesSolve( lesId, usr )
28159599516SKenneth E. Jansen      endif
28259599516SKenneth E. Jansen
28359599516SKenneth E. Jansen      call cpu_time(cpusec(3))
28459599516SKenneth E. Jansen
28559599516SKenneth E. Jansen      ramg_time(1) = ramg_time(1) + cpusec(3)-cpusec(1)
28659599516SKenneth E. Jansen      ramg_time(7) = ramg_time(7) + cpusec(6)-cpusec(1)
28759599516SKenneth E. Jansen
28859599516SKenneth E. Jansen      ! ramg_time: 1 : local total
28959599516SKenneth E. Jansen      !            4 : local VG-cycle
29059599516SKenneth E. Jansen      !            7 : local setup time
29159599516SKenneth E. Jansen      !           11 : Ap-product level 1
29259599516SKenneth E. Jansen      !           12 : Ap-product level >1
29359599516SKenneth E. Jansen      !           13 : Prolongation/Restriction
29459599516SKenneth E. Jansen      !           20 : local boundary MLS time
29559599516SKenneth E. Jansen
29659599516SKenneth E. Jansen      if (myrank.eq.master) then
29759599516SKenneth E. Jansen      write(*,*)
29859599516SKenneth E. Jansen      endif
29959599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Total ACUSIM Solver:",
30059599516SKenneth E. Jansen     &                    ramg_time(1))
30159599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Setup: ",ramg_time(7))
30259599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Prec'd cycle: ",ramg_time(4))
30359599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Ap product(level=1): ",
30459599516SKenneth E. Jansen     &                      ramg_time(11))
30559599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Ap product(level>=2): ",
30659599516SKenneth E. Jansen     &                      ramg_time(12))
30759599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Pro/Restr ",
30859599516SKenneth E. Jansen     &                      ramg_time(13))
30959599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Boundary Ap (GS only)",
31059599516SKenneth E. Jansen     &                      ramg_time(20))
31159599516SKenneth E. Jansen      if (myrank.eq.master) then
31259599516SKenneth E. Jansen      write(*,*)
31359599516SKenneth E. Jansen      endif
31459599516SKenneth E. Jansen
31559599516SKenneth E. Jansen#endif
31659599516SKenneth E. Jansen
31759599516SKenneth E. Jansen      ! End Time profiling output
31859599516SKenneth E. Jansen
31959599516SKenneth E. Jansen      call getSol ( usr, solinc )
32059599516SKenneth E. Jansen
32159599516SKenneth E. Jansen      if (numpe > 1) then
32259599516SKenneth E. Jansen         call commu ( solinc, ilwork, nflow, 'out')
32359599516SKenneth E. Jansen      endif
324436818eeSKenneth E. Jansen      ENDIF ! end of selection between solvers.
32559599516SKenneth E. Jansen      tlescp2 = TMRC()
32659599516SKenneth E. Jansen      impistat=0
32759599516SKenneth E. Jansen      impistat2=0
32859599516SKenneth E. Jansenc      call summary_stop()
32959599516SKenneth E. Jansen
33059599516SKenneth E. Jansen      tcorecp(1) = tcorecp(1) + telmcp2-telmcp1 ! elem. formation
33159599516SKenneth E. Jansen      tcorecp(2) = tcorecp(2) + tlescp2-tlescp1 ! linear alg. solution
33259599516SKenneth E. Jansen      call rstatic (res, y, solinc) ! output flow stats
33359599516SKenneth E. Jansenc
33459599516SKenneth E. Jansenc.... end
33559599516SKenneth E. Jansenc
33659599516SKenneth E. Jansen      return
33759599516SKenneth E. Jansen      end
33859599516SKenneth E. Jansen
33959599516SKenneth E. Jansen      subroutine SolSclr(y,          ac,         u,
34059599516SKenneth E. Jansen     &                   yold,       acold,      uold,
34159599516SKenneth E. Jansen     &                   x,          iBC,
34259599516SKenneth E. Jansen     &                   BC,         nPermDimsS,  nTmpDimsS,
34359599516SKenneth E. Jansen     &                   apermS,     atempS,     iper,
34459599516SKenneth E. Jansen     &                   ilwork,     shp,        shgl,
34559599516SKenneth E. Jansen     &                   shpb,       shglb,      rowp,
34659599516SKenneth E. Jansen     &                   colm,       lhsS,       solinc,
347436818eeSKenneth E. Jansen     &                   tcorecpscal,
348436818eeSKenneth E. Jansen     &                   svLS_lhs,  svLS_ls,   svLS_nFaces)
34959599516SKenneth E. Jansenc
35059599516SKenneth E. Jansenc----------------------------------------------------------------------
35159599516SKenneth E. Jansenc
35259599516SKenneth E. Jansenc This is the 2nd interface routine to the Farzin's linear equation
35359599516SKenneth E. Jansenc solver library.
35459599516SKenneth E. Jansenc
35559599516SKenneth E. Jansenc input:
35659599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
35759599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
35859599516SKenneth E. Jansenc  yold   (nshg,ndof)           : Y-variables at beginning of step
35959599516SKenneth E. Jansenc  x      (numnp,nsd)            : node coordinates
36059599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
36159599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
36259599516SKenneth E. Jansenc  iper   (nshg)                : periodic nodal information
36359599516SKenneth E. Jansenc
36459599516SKenneth E. Jansenc output:
36559599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
36659599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
36759599516SKenneth E. Jansenc
36859599516SKenneth E. Jansenc
36959599516SKenneth E. Jansenc The followings are preliminary steps required to use Farzin's
37059599516SKenneth E. Jansenc solver library.  New way of writing has to be used such as
37159599516SKenneth E. Jansenc
37259599516SKenneth E. Jansenc          |     E    | | dS | =  | RScal |
37359599516SKenneth E. Jansenc
37459599516SKenneth E. Jansenc----------------------------------------------------------------------
37559599516SKenneth E. Jansenc
37659599516SKenneth E. Jansen      use pointer_data
37759599516SKenneth E. Jansen
37859599516SKenneth E. Jansen      include "common.h"
37959599516SKenneth E. Jansen      include "mpif.h"
38059599516SKenneth E. Jansen      include "auxmpi.h"
381436818eeSKenneth E. Jansen        include "svLS.h"
38259599516SKenneth E. Jansenc
38359599516SKenneth E. Jansen      real*8    y(nshg,ndof),             ac(nshg,ndof),
38459599516SKenneth E. Jansen     &          yold(nshg,ndof),          acold(nshg,ndof),
38559599516SKenneth E. Jansen     &          u(nshg,nsd),              uold(nshg,nsd),
38659599516SKenneth E. Jansen     &          x(numnp,nsd),             BC(nshg,ndofBC),
38759599516SKenneth E. Jansen     &          res(nshg,1),
38859599516SKenneth E. Jansen     &          flowDiag(nshg,4),
38959599516SKenneth E. Jansen     &          sclrDiag(nshg,1),           lhsS(nnz_tot),
39059599516SKenneth E. Jansen     &          apermS(nshg,nPermDimsS),  atempS(nshg,nTmpDimsS)
39159599516SKenneth E. Jansen
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
39459599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT),
39559599516SKenneth E. Jansen     &          shpb(MAXTOP,maxsh,MAXQPT),
39659599516SKenneth E. Jansen     &          shglb(MAXTOP,nsd,maxsh,MAXQPT)
39759599516SKenneth E. Jansenc
39859599516SKenneth E. Jansen      integer   usr(100),                 eqnType,
39959599516SKenneth E. Jansen     &          rowp(nshg*nnz),           colm(nshg+1),
40059599516SKenneth E. Jansen     &          iBC(nshg),                ilwork(nlwork),
40159599516SKenneth E. Jansen     &          iper(nshg)
40259599516SKenneth E. Jansenc
40359599516SKenneth E. Jansen      real*8    yAlpha(nshg,ndof),        acAlpha(nshg,ndof),
40459599516SKenneth E. Jansen     &          uAlpha(nshg,nsd),
40559599516SKenneth E. Jansen     &          lesP(nshg,1),               lesQ(nshg,1),
40659599516SKenneth E. Jansen     &          solinc(nshg,1),           CGsol(nshg),
40759599516SKenneth E. Jansen     &          tcorecpscal(2)
408436818eeSKenneth E. Jansen      TYPE(svLS_lhsType), INTENT(INOUT) :: svLS_lhs
409436818eeSKenneth E. Jansen      TYPE(svLS_lsType), INTENT(INOUT) ::  svLS_ls
410436818eeSKenneth E. Jansen      REAL*8 sumtime
411436818eeSKenneth E. Jansen      INTEGER dof, svLS_nFaces, i, j, k, l
412436818eeSKenneth E. Jansen      INTEGER, ALLOCATABLE :: incL(:)
413436818eeSKenneth E. Jansen      REAL*8, ALLOCATABLE :: faceRes(:), Res1(:,:), Val1(:,:)
41459599516SKenneth E. Jansen
41559599516SKenneth E. Jansenc
41659599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
41759599516SKenneth E. Jansenc
41859599516SKenneth E. Jansenc.... compute solution at n+alpha
41959599516SKenneth E. Jansenc
42059599516SKenneth E. Jansen      call itrYAlpha( uold,    yold,    acold,
42159599516SKenneth E. Jansen     &                u,       y,       ac,
42259599516SKenneth E. Jansen     &                uAlpha,  yAlpha,  acAlpha)
42359599516SKenneth E. Jansenc
42459599516SKenneth E. Jansenc.... form the LHS matrices, the residual vector (at alpha)
42559599516SKenneth E. Jansenc
42659599516SKenneth E. Jansen      impistat=2
42759599516SKenneth E. Jansen      impistat2=1
42859599516SKenneth E. Jansen      telmcp1 = TMRC()
42959599516SKenneth E. Jansen      call ElmGMRSclr(yAlpha,acAlpha,    x,
43059599516SKenneth E. Jansen     &             shp,       shgl,       iBC,
43159599516SKenneth E. Jansen     &             BC,        shpb,       shglb,
43259599516SKenneth E. Jansen     &             res,       iper,       ilwork,
43359599516SKenneth E. Jansen     &             rowp,      colm,       lhsS   )
43459599516SKenneth E. Jansen      telmcp2 = TMRC()
43559599516SKenneth E. Jansen      impistat=0
43659599516SKenneth E. Jansen      impistat2=0
437436818eeSKenneth E. Jansen      statssclr(1)=0
438436818eeSKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
439436818eeSKenneth E. Jansen
440436818eeSKenneth E. Jansenc####################################################################
441436818eeSKenneth E. Jansen!     Here calling svLS
442436818eeSKenneth E. Jansen
443436818eeSKenneth E. Jansen      ALLOCATE(faceRes(svLS_nFaces), incL(svLS_nFaces))
444*ec121c45SKenneth E. Jansen      faceRes=zero
445436818eeSKenneth E. Jansen      incL = 1
446436818eeSKenneth E. Jansen      dof = 1
447436818eeSKenneth E. Jansen      IF (.NOT.ALLOCATED(Res1)) THEN
448436818eeSKenneth E. Jansen         ALLOCATE (Res1(dof,nshg), Val1(dof*dof,nnz_tot))
449436818eeSKenneth E. Jansen      END IF
450436818eeSKenneth E. Jansen
451436818eeSKenneth E. Jansen      DO i=1, nshg
452436818eeSKenneth E. Jansen         Res1(1,i) = res(i,1)
453436818eeSKenneth E. Jansen      END DO
454436818eeSKenneth E. Jansen
455436818eeSKenneth E. Jansen      DO i=1, nnz_tot
456436818eeSKenneth E. Jansen         Val1(1,i)    = lhsS(i)
457436818eeSKenneth E. Jansen      END DO
458436818eeSKenneth E. Jansen
459436818eeSKenneth E. Jansen      CALL svLS_SOLVE(svLS_lhs, svLS_ls, dof, Res1, Val1, incL,
460436818eeSKenneth E. Jansen     2   faceRes)
461436818eeSKenneth E. Jansen      statssclr(1)=1.0*svLS_ls%RI%itr
462436818eeSKenneth E. Jansen      DO i=1, nshg
463436818eeSKenneth E. Jansen         solinc(i,1) = Res1(1,i)
464436818eeSKenneth E. Jansen      END DO
465436818eeSKenneth E. Jansen
466436818eeSKenneth E. Jansenc####################################################################
467436818eeSKenneth E. Jansen      ELSE
46859599516SKenneth E. Jansenc
46959599516SKenneth E. Jansenc.... lesSolve : main matrix solver
47059599516SKenneth E. Jansenc
47159599516SKenneth E. Jansen      lesId   = numeqns(1+nsolt+isclr)
47259599516SKenneth E. Jansen      eqnType = 2
47359599516SKenneth E. Jansenc
47459599516SKenneth E. Jansenc.... setup the linear algebra solver
47559599516SKenneth E. Jansenc
47659599516SKenneth E. Jansen
47759599516SKenneth E. Jansen      impistat=2
47859599516SKenneth E. Jansen      impistat2=1
47959599516SKenneth E. Jansen      tlescp1 = TMRC()
48059599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          apermS,
48159599516SKenneth E. Jansen     &              atempS,     res,              solinc,
48259599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
48359599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
48459599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
48559599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDimsS,
48659599516SKenneth E. Jansen     &              nTmpDimsS,  rowp,             colm,
48759599516SKenneth E. Jansen     &              rlhsK,      rlhsP,            lhsS,
48859599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
48959599516SKenneth E. Jansenc
49059599516SKenneth E. Jansenc.... solve linear system
49159599516SKenneth E. Jansenc
49259599516SKenneth E. Jansen      call myfLesSolve ( lesId, usr )
49359599516SKenneth E. Jansen      call getSol ( usr, solinc )
49459599516SKenneth E. Jansen
49559599516SKenneth E. Jansen      if (numpe > 1) then
49659599516SKenneth E. Jansen         call commu ( solinc, ilwork, 1, 'out')
49759599516SKenneth E. Jansen      endif
498436818eeSKenneth E. Jansen      ENDIF ! decision between solvers
49959599516SKenneth E. Jansen      tlescp2 = TMRC()
50059599516SKenneth E. Jansen      impistat=0
50159599516SKenneth E. Jansen      impistat2=0
50259599516SKenneth E. Jansen
50359599516SKenneth E. Jansen      tcorecpscal(1) = tcorecpscal(1) + telmcp2-telmcp1 ! elem. formation
50459599516SKenneth E. Jansen      tcorecpscal(2) = tcorecpscal(2) + tlescp2-tlescp1 ! linear alg. solution
50559599516SKenneth E. Jansen
50659599516SKenneth E. Jansen      nsolsc=5+isclr
50759599516SKenneth E. Jansen      call rstaticSclr (res, y, solinc, nsolsc) ! output scalar stats
50859599516SKenneth E. Jansenc
50959599516SKenneth E. Jansenc.... end
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansen      return
51259599516SKenneth E. Jansen      end
51359599516SKenneth E. Jansen
51459599516SKenneth E. Jansen
51559599516SKenneth E. Jansen
51659599516SKenneth E. Jansen
51759599516SKenneth E. Jansen
518