xref: /phasta/phSolver/incompressible/solfar.f (revision bd36043d6c86bfee311b9eaff539555a870d94ea)
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,
11*bd36043dSBen Matthews     &                   GradV,       sumtime
12*bd36043dSBen Matthews#ifdef HAVE_SVLS
13*bd36043dSBen Matthews     &                   ,svLS_lhs,  svLS_ls,   svLS_nFaces)
14*bd36043dSBen Matthews#else
15*bd36043dSBen Matthews     &                   )
16*bd36043dSBen Matthews#endif
1759599516SKenneth E. Jansenc
1859599516SKenneth E. Jansenc----------------------------------------------------------------------
1959599516SKenneth E. Jansenc
20ae8d68e4SKenneth E. Jansenc This is the 2nd interface routine to the  linear equation
2159599516SKenneth E. Jansenc solver library that uses the CGP and GMRES methods.
2259599516SKenneth E. Jansenc
2359599516SKenneth E. Jansenc input:
2459599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
2559599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
2659599516SKenneth E. Jansenc  yold   (nshg,ndof)           : Y-variables at beginning of step
2759599516SKenneth E. Jansenc  acold   (nshg,ndof)          : Primvar. accel. at beginning of step
2859599516SKenneth E. Jansenc  x      (numnp,nsd)            : node coordinates
2959599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
3059599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
3159599516SKenneth E. Jansenc  iper   (nshg)                : periodic nodal information
3259599516SKenneth E. Jansenc
3359599516SKenneth E. Jansenc output:
3459599516SKenneth E. Jansenc  res    (nshg,nflow)           : preconditioned residual
3559599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
3659599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
3759599516SKenneth E. Jansenc
3859599516SKenneth E. Jansenc
3959599516SKenneth E. Jansenc The followings are preliminary steps required to use Farzin's
4059599516SKenneth E. Jansenc solver library.  New way of writing has to be used such as
4159599516SKenneth E. Jansenc
4259599516SKenneth E. Jansenc          |  K     G | | du |    | Rmom  |
4359599516SKenneth E. Jansenc          |          | |    | =  |       |
4459599516SKenneth E. Jansenc          | G^t    C | | dp |    | Rcon  |
4559599516SKenneth E. Jansenc
4659599516SKenneth E. Jansenc          |     E    | | dT | =  | Rtemp |
4759599516SKenneth E. Jansenc
4859599516SKenneth E. Jansenc     where
4959599516SKenneth E. Jansenc
5059599516SKenneth E. Jansenc      xKebe : K_ab = dRmom_a/du_b    xTe : E_ab = dRtemp_a/dT_b
5159599516SKenneth E. Jansenc
5259599516SKenneth E. Jansenc              G_ab = dRmom_a/dp_b
5359599516SKenneth E. Jansenc      xGoC  :
5459599516SKenneth E. Jansenc              C_ab = dRcon_a/dp_b
5559599516SKenneth E. Jansenc
5659599516SKenneth E. Jansenc              resf = Rmon Rcon       rest = Rtemp
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansenc
5959599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
6059599516SKenneth E. Jansenc Juin Kim, Summer 1998. (Incompressible flow solver interface)
6159599516SKenneth E. Jansenc Alberto Figueroa.  CMM-FSI
6259599516SKenneth E. Jansenc----------------------------------------------------------------------
6359599516SKenneth E. Jansenc
6459599516SKenneth E. Jansen      use pointer_data
6559599516SKenneth E. Jansen#ifdef AMG
6659599516SKenneth E. Jansen      use ramg_data
6759599516SKenneth E. Jansen#endif
6859599516SKenneth E. Jansen
6959599516SKenneth E. Jansen      include "common.h"
7059599516SKenneth E. Jansen      include "mpif.h"
7159599516SKenneth E. Jansen      include "auxmpi.h"
72*bd36043dSBen Matthews#ifdef HAVE_SVLS
73ae8d68e4SKenneth E. Jansen        include "svLS.h"
74*bd36043dSBen Matthews#endif
7559599516SKenneth E. Jansenc
76ae8d68e4SKenneth E. JansenC
77ae8d68e4SKenneth E. JansenC     Argument variables
78ae8d68e4SKenneth E. JansenC
79ae8d68e4SKenneth E. Jansen      INTEGER            npermdims
80ae8d68e4SKenneth E. Jansen      INTEGER             ntmpdims
81ae8d68e4SKenneth E. JansenC
82ae8d68e4SKenneth E. JansenC     Local variables
83ae8d68e4SKenneth E. JansenC
84ae8d68e4SKenneth E. Jansen      INTEGER              lesid
85ae8d68e4SKenneth E. JansenC
86ae8d68e4SKenneth E. Jansen      REAL*8                rdtmp
87ae8d68e4SKenneth E. JansenC
88*bd36043dSBen Matthews#ifdef HAVE_SVLS
89efb88323SKenneth E. Jansen      TYPE(svLS_lhsType), INTENT(INOUT) :: svLS_lhs
90efb88323SKenneth E. Jansen      TYPE(svLS_lsType), INTENT(INOUT) ::  svLS_ls
91*bd36043dSBen Matthews#endif
92ae8d68e4SKenneth E. Jansen
9359599516SKenneth E. Jansen      real*8    y(nshg,ndof),             ac(nshg,ndof),
9459599516SKenneth E. Jansen     &          yold(nshg,ndof),          acold(nshg,ndof),
9559599516SKenneth E. Jansen     &          u(nshg,nsd),              uold(nshg,nsd),
9659599516SKenneth E. Jansen     &          x(numnp,nsd),             BC(nshg,ndofBC),
9759599516SKenneth E. Jansen     &          res(nshg,nflow),          tmpres(nshg,nflow),
9859599516SKenneth E. Jansen     &          flowDiag(nshg,4),
9959599516SKenneth E. Jansen     &          aperm(nshg,nPermDims),    atemp(nshg,nTmpDims),
10059599516SKenneth E. Jansen     &          sclrDiag(nshg,1),
10159599516SKenneth E. Jansen     &          lhsK(9,nnz_tot),          lhsP(4,nnz_tot),
10259599516SKenneth E. Jansen     &          GradV(nshg,nsdsq)
10359599516SKenneth E. Jansenc
10459599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
10559599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT),
10659599516SKenneth E. Jansen     &          shpb(MAXTOP,maxsh,MAXQPT),
10759599516SKenneth E. Jansen     &          shglb(MAXTOP,nsd,maxsh,MAXQPT)
10859599516SKenneth E. Jansenc
10959599516SKenneth E. Jansen      integer   usr(100),                 eqnType,temp,
11059599516SKenneth E. Jansen     &          rowp(nshg*nnz),           colm(nshg+1),
11159599516SKenneth E. Jansen     &          iBC(nshg),                ilwork(nlwork),
11259599516SKenneth E. Jansen     &          iper(nshg)
11359599516SKenneth E. Jansenc
11459599516SKenneth E. Jansen      real*8    yAlpha(nshg,ndof),        acAlpha(nshg,ndof),
11559599516SKenneth E. Jansen     &          uAlpha(nshg,nsd),
11659599516SKenneth E. Jansen     &          lesP(nshg,4),             lesQ(nshg,4),
11759599516SKenneth E. Jansen     &          solinc(nshg,ndof),        CGsol(nshg)
11859599516SKenneth E. Jansen
11959599516SKenneth E. Jansen      real*8     tcorecp(2)
12059599516SKenneth E. Jansen
12159599516SKenneth E. Jansen      real*8    rerr(nshg,10),            rtmp(nshg,4),rtemp
12259599516SKenneth E. Jansen
12359599516SKenneth E. Jansen      real*8    msum(4),mval(4),cpusec(10)
124ae8d68e4SKenneth E. Jansen      REAL*8 sumtime
125*bd36043dSBen Matthews#ifdef HAVE_SVLS
126*bd36043dSBen Matthews      INTEGER svLS_nFaces
127*bd36043dSBen Matthews#endif
128*bd36043dSBen Matthews      INTEGER dof, i, j, k, l
129ae8d68e4SKenneth E. Jansen      INTEGER, ALLOCATABLE :: incL(:)
130ae8d68e4SKenneth E. Jansen      REAL*8, ALLOCATABLE :: faceRes(:), Res4(:,:), Val4(:,:)
13159599516SKenneth E. Jansen
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
13459599516SKenneth E. Jansenc
13559599516SKenneth E. Jansenc
13659599516SKenneth E. Jansenc.... set the parameters for flux and surface tension calculations
13759599516SKenneth E. Jansenc
13859599516SKenneth E. Jansenc
13959599516SKenneth E. Jansen        temp = npro
14059599516SKenneth E. Jansen
14159599516SKenneth E. Jansen
14259599516SKenneth E. Jansen        idflx = 0
14359599516SKenneth E. Jansen        if(idiff >= 1 )  idflx= (nflow-1) * nsd
14459599516SKenneth E. Jansen        if (isurf == 1) idflx=nflow*nsd
14559599516SKenneth E. Jansenc.... compute solution at n+alpha
14659599516SKenneth E. Jansenc
14759599516SKenneth E. Jansen      call itrYAlpha( uold,    yold,    acold,
14859599516SKenneth E. Jansen     &                u,       y,       ac,
14959599516SKenneth E. Jansen     &                uAlpha,  yAlpha,  acAlpha)
15059599516SKenneth E. Jansen
15159599516SKenneth E. Jansenc
15259599516SKenneth E. Jansenc.... form the LHS matrices, the residual vector (at alpha)
15359599516SKenneth E. Jansenc
15459599516SKenneth E. Jansenc      call summary_start()
15559599516SKenneth E. Jansen      impistat=1
15659599516SKenneth E. Jansen      impistat2=1
15759599516SKenneth E. Jansen      telmcp1 = TMRC()
15859599516SKenneth E. Jansen      call ElmGMR (uAlpha,    yAlpha,     acAlpha,    x,
15959599516SKenneth E. Jansen     &             shp,       shgl,       iBC,
16059599516SKenneth E. Jansen     &             BC,        shpb,       shglb,
16159599516SKenneth E. Jansen     &             res,       iper,       ilwork,
16259599516SKenneth E. Jansen     &             rowp,      colm,       lhsK,
16359599516SKenneth E. Jansen     &             lhsP,      rerr,       GradV   )
16459599516SKenneth E. Jansen      telmcp2 = TMRC()
16559599516SKenneth E. Jansen      impistat=0
16659599516SKenneth E. Jansen      impistat2=0
16759599516SKenneth E. Jansenc      call summary_stop()
16859599516SKenneth E. Jansen
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansen            tmpres(:,:) = res(:,:)
17159599516SKenneth E. Jansen            iblk = 1
172*bd36043dSBen Matthews#ifdef HAVE_SVLS
173ae8d68e4SKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
17459599516SKenneth E. Jansen
175ae8d68e4SKenneth E. Jansenc####################################################################
176ae8d68e4SKenneth E. Jansen!     Here calling svLS
177ae8d68e4SKenneth E. Jansen
178ae8d68e4SKenneth E. Jansen      ALLOCATE(faceRes(svLS_nFaces), incL(svLS_nFaces))
179f4e2c78fSKenneth 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
180ae8d68e4SKenneth E. Jansen      incL = 1
181ae8d68e4SKenneth E. Jansen      dof = 4
182ae8d68e4SKenneth E. Jansen      IF (.NOT.ALLOCATED(Res4)) THEN
183ae8d68e4SKenneth E. Jansen         ALLOCATE (Res4(dof,nshg), Val4(dof*dof,nnz_tot))
184ae8d68e4SKenneth E. Jansen      END IF
185ae8d68e4SKenneth E. Jansen
186ae8d68e4SKenneth E. Jansen      DO i=1, nshg
187ae8d68e4SKenneth E. Jansen         Res4(1:dof,i) = res(i,1:dof)
188ae8d68e4SKenneth E. Jansen      END DO
189ae8d68e4SKenneth E. Jansen
190ae8d68e4SKenneth E. Jansen      DO i=1, nnz_tot
191ae8d68e4SKenneth E. Jansen         Val4(1:3,i)   = lhsK(1:3,i)
192ae8d68e4SKenneth E. Jansen         Val4(5:7,i)   = lhsK(4:6,i)
193ae8d68e4SKenneth E. Jansen         Val4(9:11,i)  = lhsK(7:9,i)
194ae8d68e4SKenneth E. Jansen         Val4(13:15,i) = lhsP(1:3,i)
195ae8d68e4SKenneth E. Jansen         Val4(16,i)    = lhsP(4,i)
196ae8d68e4SKenneth E. Jansen      END DO
197ae8d68e4SKenneth E. Jansen
198ae8d68e4SKenneth E. Jansen      !Val4(4:12:4,:) = -lhsP(1:3,:)^t
199ae8d68e4SKenneth E. Jansen      DO i=1, nshg
200ae8d68e4SKenneth E. Jansen         Do j=colm(i), colm(i+1) - 1
201ae8d68e4SKenneth E. Jansen            k = rowp(j)
202ae8d68e4SKenneth E. Jansen            DO l=colm(k), colm(k+1) - 1
203ae8d68e4SKenneth E. Jansen               IF (rowp(l) .EQ. i) THEN
204ae8d68e4SKenneth E. Jansen                  Val4(4:12:4,l) = -lhsP(1:3,j)
205ae8d68e4SKenneth E. Jansen                  EXIT
206ae8d68e4SKenneth E. Jansen               END IF
207ae8d68e4SKenneth E. Jansen            END DO
208ae8d68e4SKenneth E. Jansen         END DO
209ae8d68e4SKenneth E. Jansen      END DO
210ae8d68e4SKenneth E. Jansen      CALL svLS_SOLVE(svLS_lhs, svLS_ls, dof, Res4, Val4, incL,
211ae8d68e4SKenneth E. Jansen     2   faceRes)
212ae8d68e4SKenneth E. Jansen
213ec121c45SKenneth E. Jansen      if(myrank.eq.master) write(*,*) 'svLS outer iterations', svLS_ls%RI%itr
214efb88323SKenneth E. Jansen      statsflow(1)=1.0*svLS_ls%GM%itr
215efb88323SKenneth E. Jansen      statsflow(4)=1.0*svLS_ls%CG%itr
216ae8d68e4SKenneth E. Jansen      DO i=1, nshg
217ae8d68e4SKenneth E. Jansen         solinc(i,1:dof) = Res4(1:dof,i)
218ae8d68e4SKenneth E. Jansen      END DO
219*bd36043dSBen Matthews#endif
220*bd36043dSBen Matthews#if defined(HAVE_SVLS) && defined(HAVE_ACUSOLVE)
221ae8d68e4SKenneth E. Jansenc####################################################################
222ae8d68e4SKenneth E. Jansen      ELSE
223*bd36043dSBen Matthews#elif defined(HAVE_SVLS)
224*bd36043dSBen Matthews      ENDIF
225*bd36043dSBen Matthews#endif
226*bd36043dSBen Matthews#ifdef HAVE_ACUSOLVE
227ae8d68e4SKenneth E. Jansenc
22859599516SKenneth E. Jansenc.... lesSolve : main matrix solver
22959599516SKenneth E. Jansenc
23059599516SKenneth E. Jansen      lesId   = numeqns(1)
23159599516SKenneth E. Jansen      eqnType = 1
23259599516SKenneth E. Jansen
23359599516SKenneth E. Jansenc      call summary_start()
23459599516SKenneth E. Jansen      impistat=1
23559599516SKenneth E. Jansen      impistat2=1
23659599516SKenneth E. Jansen      tlescp1 = TMRC()
23759599516SKenneth E. Jansen#ifdef AMG
23859599516SKenneth E. Jansen      ! Initial Time Profiling
23959599516SKenneth E. Jansen      call cpu_time(cpusec(1))
24059599516SKenneth E. Jansen      if (irun_amg_prec.gt.0) then
24159599516SKenneth E. Jansen          call ramg_control(colm,rowp,lhsK,lhsP,
24259599516SKenneth E. Jansen     &         ilwork,BC,iBC,iper)
24359599516SKenneth E. Jansen      end if
24459599516SKenneth E. Jansen
24559599516SKenneth E. Jansen      call cpu_time(cpusec(6))
24659599516SKenneth E. Jansen      if (irun_amg_prec.gt.0) then
24759599516SKenneth E. Jansen      ramg_flag = 1
24859599516SKenneth E. Jansen      if (irun_amg_prec.eq.2) then ! Some setup work (mode a)
24959599516SKenneth E. Jansen        ramg_window = 1.0
25059599516SKenneth E. Jansen        ramg_redo = 0
25159599516SKenneth E. Jansen      endif
25259599516SKenneth E. Jansen      do while (ramg_flag.le.irun_amg_prec)
25359599516SKenneth E. Jansen      ! if smart solve, possible run solve twice
25459599516SKenneth E. Jansen      ! restart only if meets plateau
25559599516SKenneth E. Jansen#endif
25659599516SKenneth E. Jansen
25759599516SKenneth E. Jansenc
25859599516SKenneth E. Jansenc.... setup the linear algebra solver
25959599516SKenneth E. Jansenc
26059599516SKenneth E. Jansen      rtmp = res(:,1:4)
26159599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          aperm,
26259599516SKenneth E. Jansen     &              atemp,      rtmp,             solinc,
26359599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
26459599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
26559599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
26659599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDims,
26759599516SKenneth E. Jansen     &              nTmpDims,   rowp,             colm,
26859599516SKenneth E. Jansen     &              lhsK,       lhsP,             rdtmp,
26959599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
27059599516SKenneth E. Jansenc
27159599516SKenneth E. Jansenc.... solve linear system
27259599516SKenneth E. Jansenc
27359599516SKenneth E. Jansen      call myfLesSolve ( lesId, usr )
27459599516SKenneth E. Jansen#ifdef AMG
27559599516SKenneth E. Jansen      ramg_flag = ramg_flag + 2 ! Default no second run in mode a
27659599516SKenneth E. Jansen      if (irun_amg_prec.eq.3) then
27759599516SKenneth E. Jansen          if (maxIters.gt.int(statsflow(4))) then
27859599516SKenneth E. Jansen          ramg_flag = ramg_flag + 1 ! Default no second run in mode b
27959599516SKenneth E. Jansen          endif
28059599516SKenneth E. Jansen      endif
28159599516SKenneth E. Jansen      enddo
28259599516SKenneth E. Jansen      else
28359599516SKenneth E. Jansenc
28459599516SKenneth E. Jansenc.... setup the linear algebra solver
28559599516SKenneth E. Jansenc
28659599516SKenneth E. Jansen      rtmp = res(:,1:4)
28759599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          aperm,
28859599516SKenneth E. Jansen     &              atemp,      rtmp,             solinc,
28959599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
29059599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
29159599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
29259599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDims,
29359599516SKenneth E. Jansen     &              nTmpDims,   rowp,             colm,
29459599516SKenneth E. Jansen     &              lhsK,       lhsP,             rdtmp,
29559599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
29659599516SKenneth E. Jansen
29759599516SKenneth E. Jansen          call myfLesSolve( lesId, usr )
29859599516SKenneth E. Jansen      endif
29959599516SKenneth E. Jansen
30059599516SKenneth E. Jansen      call cpu_time(cpusec(3))
30159599516SKenneth E. Jansen
30259599516SKenneth E. Jansen      ramg_time(1) = ramg_time(1) + cpusec(3)-cpusec(1)
30359599516SKenneth E. Jansen      ramg_time(7) = ramg_time(7) + cpusec(6)-cpusec(1)
30459599516SKenneth E. Jansen
30559599516SKenneth E. Jansen      ! ramg_time: 1 : local total
30659599516SKenneth E. Jansen      !            4 : local VG-cycle
30759599516SKenneth E. Jansen      !            7 : local setup time
30859599516SKenneth E. Jansen      !           11 : Ap-product level 1
30959599516SKenneth E. Jansen      !           12 : Ap-product level >1
31059599516SKenneth E. Jansen      !           13 : Prolongation/Restriction
31159599516SKenneth E. Jansen      !           20 : local boundary MLS time
31259599516SKenneth E. Jansen
31359599516SKenneth E. Jansen      if (myrank.eq.master) then
31459599516SKenneth E. Jansen      write(*,*)
31559599516SKenneth E. Jansen      endif
31659599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Total ACUSIM Solver:",
31759599516SKenneth E. Jansen     &                    ramg_time(1))
31859599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Setup: ",ramg_time(7))
31959599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Prec'd cycle: ",ramg_time(4))
32059599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Ap product(level=1): ",
32159599516SKenneth E. Jansen     &                      ramg_time(11))
32259599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Ap product(level>=2): ",
32359599516SKenneth E. Jansen     &                      ramg_time(12))
32459599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Pro/Restr ",
32559599516SKenneth E. Jansen     &                      ramg_time(13))
32659599516SKenneth E. Jansen      call ramg_print_time(" == AMG == Boundary Ap (GS only)",
32759599516SKenneth E. Jansen     &                      ramg_time(20))
32859599516SKenneth E. Jansen      if (myrank.eq.master) then
32959599516SKenneth E. Jansen      write(*,*)
33059599516SKenneth E. Jansen      endif
33159599516SKenneth E. Jansen
33259599516SKenneth E. Jansen#endif
33359599516SKenneth E. Jansen
33459599516SKenneth E. Jansen      ! End Time profiling output
33559599516SKenneth E. Jansen
33659599516SKenneth E. Jansen      call getSol ( usr, solinc )
33759599516SKenneth E. Jansen
33859599516SKenneth E. Jansen      if (numpe > 1) then
33959599516SKenneth E. Jansen         call commu ( solinc, ilwork, nflow, 'out')
34059599516SKenneth E. Jansen      endif
341*bd36043dSBen Matthews#endif
342*bd36043dSBen Matthews#if defined(HAVE_SVLS) && defined(HAVE_ACUSOLVE)
343436818eeSKenneth E. Jansen      ENDIF ! end of selection between solvers.
344*bd36043dSBen Matthews#endif
34559599516SKenneth E. Jansen      tlescp2 = TMRC()
34659599516SKenneth E. Jansen      impistat=0
34759599516SKenneth E. Jansen      impistat2=0
34859599516SKenneth E. Jansenc      call summary_stop()
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen      tcorecp(1) = tcorecp(1) + telmcp2-telmcp1 ! elem. formation
35159599516SKenneth E. Jansen      tcorecp(2) = tcorecp(2) + tlescp2-tlescp1 ! linear alg. solution
35259599516SKenneth E. Jansen      call rstatic (res, y, solinc) ! output flow stats
35359599516SKenneth E. Jansenc
35459599516SKenneth E. Jansenc.... end
35559599516SKenneth E. Jansenc
35659599516SKenneth E. Jansen      return
35759599516SKenneth E. Jansen      end
35859599516SKenneth E. Jansen
35959599516SKenneth E. Jansen      subroutine SolSclr(y,          ac,         u,
36059599516SKenneth E. Jansen     &                   yold,       acold,      uold,
36159599516SKenneth E. Jansen     &                   x,          iBC,
36259599516SKenneth E. Jansen     &                   BC,         nPermDimsS,  nTmpDimsS,
36359599516SKenneth E. Jansen     &                   apermS,     atempS,     iper,
36459599516SKenneth E. Jansen     &                   ilwork,     shp,        shgl,
36559599516SKenneth E. Jansen     &                   shpb,       shglb,      rowp,
36659599516SKenneth E. Jansen     &                   colm,       lhsS,       solinc,
367*bd36043dSBen Matthews     &                   tcorecpscal
368*bd36043dSBen Matthews#ifdef HAVE_SVLS
369*bd36043dSBen Matthews     &                   ,svLS_lhs,  svLS_ls,   svLS_nFaces)
370*bd36043dSBen Matthews#else
371*bd36043dSBen Matthews     &                   )
372*bd36043dSBen Matthews#endif
37359599516SKenneth E. Jansenc
37459599516SKenneth E. Jansenc----------------------------------------------------------------------
37559599516SKenneth E. Jansenc
37659599516SKenneth E. Jansenc This is the 2nd interface routine to the Farzin's linear equation
37759599516SKenneth E. Jansenc solver library.
37859599516SKenneth E. Jansenc
37959599516SKenneth E. Jansenc input:
38059599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
38159599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
38259599516SKenneth E. Jansenc  yold   (nshg,ndof)           : Y-variables at beginning of step
38359599516SKenneth E. Jansenc  x      (numnp,nsd)            : node coordinates
38459599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
38559599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
38659599516SKenneth E. Jansenc  iper   (nshg)                : periodic nodal information
38759599516SKenneth E. Jansenc
38859599516SKenneth E. Jansenc output:
38959599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_f
39059599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
39159599516SKenneth E. Jansenc
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansenc The followings are preliminary steps required to use Farzin's
39459599516SKenneth E. Jansenc solver library.  New way of writing has to be used such as
39559599516SKenneth E. Jansenc
39659599516SKenneth E. Jansenc          |     E    | | dS | =  | RScal |
39759599516SKenneth E. Jansenc
39859599516SKenneth E. Jansenc----------------------------------------------------------------------
39959599516SKenneth E. Jansenc
40059599516SKenneth E. Jansen      use pointer_data
40159599516SKenneth E. Jansen
40259599516SKenneth E. Jansen      include "common.h"
40359599516SKenneth E. Jansen      include "mpif.h"
40459599516SKenneth E. Jansen      include "auxmpi.h"
405*bd36043dSBen Matthews#ifdef HAVE_SVLS
406436818eeSKenneth E. Jansen        include "svLS.h"
407*bd36043dSBen Matthews#endif
40859599516SKenneth E. Jansenc
40959599516SKenneth E. Jansen      real*8    y(nshg,ndof),             ac(nshg,ndof),
41059599516SKenneth E. Jansen     &          yold(nshg,ndof),          acold(nshg,ndof),
41159599516SKenneth E. Jansen     &          u(nshg,nsd),              uold(nshg,nsd),
41259599516SKenneth E. Jansen     &          x(numnp,nsd),             BC(nshg,ndofBC),
41359599516SKenneth E. Jansen     &          res(nshg,1),
41459599516SKenneth E. Jansen     &          flowDiag(nshg,4),
41559599516SKenneth E. Jansen     &          sclrDiag(nshg,1),           lhsS(nnz_tot),
41659599516SKenneth E. Jansen     &          apermS(nshg,nPermDimsS),  atempS(nshg,nTmpDimsS)
41759599516SKenneth E. Jansen
41859599516SKenneth E. Jansenc
41959599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
42059599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT),
42159599516SKenneth E. Jansen     &          shpb(MAXTOP,maxsh,MAXQPT),
42259599516SKenneth E. Jansen     &          shglb(MAXTOP,nsd,maxsh,MAXQPT)
42359599516SKenneth E. Jansenc
42459599516SKenneth E. Jansen      integer   usr(100),                 eqnType,
42559599516SKenneth E. Jansen     &          rowp(nshg*nnz),           colm(nshg+1),
42659599516SKenneth E. Jansen     &          iBC(nshg),                ilwork(nlwork),
42759599516SKenneth E. Jansen     &          iper(nshg)
42859599516SKenneth E. Jansenc
42959599516SKenneth E. Jansen      real*8    yAlpha(nshg,ndof),        acAlpha(nshg,ndof),
43059599516SKenneth E. Jansen     &          uAlpha(nshg,nsd),
43159599516SKenneth E. Jansen     &          lesP(nshg,1),               lesQ(nshg,1),
43259599516SKenneth E. Jansen     &          solinc(nshg,1),           CGsol(nshg),
43359599516SKenneth E. Jansen     &          tcorecpscal(2)
434*bd36043dSBen Matthews#ifdef HAVE_SVLS
435436818eeSKenneth E. Jansen      TYPE(svLS_lhsType), INTENT(INOUT) :: svLS_lhs
436436818eeSKenneth E. Jansen      TYPE(svLS_lsType), INTENT(INOUT) ::  svLS_ls
437*bd36043dSBen Matthews      INTEGER svLS_nFaces
438*bd36043dSBen Matthews#endif
439436818eeSKenneth E. Jansen      REAL*8 sumtime
440*bd36043dSBen Matthews      INTEGER dof, i, j, k, l
441436818eeSKenneth E. Jansen      INTEGER, ALLOCATABLE :: incL(:)
442436818eeSKenneth E. Jansen      REAL*8, ALLOCATABLE :: faceRes(:), Res1(:,:), Val1(:,:)
44359599516SKenneth E. Jansen
44459599516SKenneth E. Jansenc
44559599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
44659599516SKenneth E. Jansenc
44759599516SKenneth E. Jansenc.... compute solution at n+alpha
44859599516SKenneth E. Jansenc
44959599516SKenneth E. Jansen      call itrYAlpha( uold,    yold,    acold,
45059599516SKenneth E. Jansen     &                u,       y,       ac,
45159599516SKenneth E. Jansen     &                uAlpha,  yAlpha,  acAlpha)
45259599516SKenneth E. Jansenc
45359599516SKenneth E. Jansenc.... form the LHS matrices, the residual vector (at alpha)
45459599516SKenneth E. Jansenc
45559599516SKenneth E. Jansen      impistat=2
45659599516SKenneth E. Jansen      impistat2=1
45759599516SKenneth E. Jansen      telmcp1 = TMRC()
45859599516SKenneth E. Jansen      call ElmGMRSclr(yAlpha,acAlpha,    x,
45959599516SKenneth E. Jansen     &             shp,       shgl,       iBC,
46059599516SKenneth E. Jansen     &             BC,        shpb,       shglb,
46159599516SKenneth E. Jansen     &             res,       iper,       ilwork,
46259599516SKenneth E. Jansen     &             rowp,      colm,       lhsS   )
46359599516SKenneth E. Jansen      telmcp2 = TMRC()
46459599516SKenneth E. Jansen      impistat=0
46559599516SKenneth E. Jansen      impistat2=0
466436818eeSKenneth E. Jansen      statssclr(1)=0
467*bd36043dSBen Matthews#ifdef HAVE_SVLS
468436818eeSKenneth E. Jansen      IF (svLSFlag .EQ. 1) THEN
469436818eeSKenneth E. Jansen
470436818eeSKenneth E. Jansenc####################################################################
471436818eeSKenneth E. Jansen!     Here calling svLS
472436818eeSKenneth E. Jansen
473436818eeSKenneth E. Jansen      ALLOCATE(faceRes(svLS_nFaces), incL(svLS_nFaces))
474ec121c45SKenneth E. Jansen      faceRes=zero
475436818eeSKenneth E. Jansen      incL = 1
476436818eeSKenneth E. Jansen      dof = 1
477436818eeSKenneth E. Jansen      IF (.NOT.ALLOCATED(Res1)) THEN
478436818eeSKenneth E. Jansen         ALLOCATE (Res1(dof,nshg), Val1(dof*dof,nnz_tot))
479436818eeSKenneth E. Jansen      END IF
480436818eeSKenneth E. Jansen
481436818eeSKenneth E. Jansen      DO i=1, nshg
482436818eeSKenneth E. Jansen         Res1(1,i) = res(i,1)
483436818eeSKenneth E. Jansen      END DO
484436818eeSKenneth E. Jansen
485436818eeSKenneth E. Jansen      DO i=1, nnz_tot
486436818eeSKenneth E. Jansen         Val1(1,i)    = lhsS(i)
487436818eeSKenneth E. Jansen      END DO
488436818eeSKenneth E. Jansen
489436818eeSKenneth E. Jansen      CALL svLS_SOLVE(svLS_lhs, svLS_ls, dof, Res1, Val1, incL,
490436818eeSKenneth E. Jansen     2   faceRes)
491436818eeSKenneth E. Jansen      statssclr(1)=1.0*svLS_ls%RI%itr
492436818eeSKenneth E. Jansen      DO i=1, nshg
493436818eeSKenneth E. Jansen         solinc(i,1) = Res1(1,i)
494436818eeSKenneth E. Jansen      END DO
495*bd36043dSBen Matthews#endif
496*bd36043dSBen Matthews#if defined(HAVE_SVLS) && defined(HAVE_ACUSOLVE)
497436818eeSKenneth E. Jansenc####################################################################
498436818eeSKenneth E. Jansen      ELSE
499*bd36043dSBen Matthews#elif defined(HAVE_SVLS)
500*bd36043dSBen Matthews      ENDIF
501*bd36043dSBen Matthews#endif
502*bd36043dSBen Matthews#ifdef HAVE_ACUSOLVE
50359599516SKenneth E. Jansenc
50459599516SKenneth E. Jansenc.... lesSolve : main matrix solver
50559599516SKenneth E. Jansenc
50659599516SKenneth E. Jansen      lesId   = numeqns(1+nsolt+isclr)
50759599516SKenneth E. Jansen      eqnType = 2
50859599516SKenneth E. Jansenc
50959599516SKenneth E. Jansenc.... setup the linear algebra solver
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansen
51259599516SKenneth E. Jansen      impistat=2
51359599516SKenneth E. Jansen      impistat2=1
51459599516SKenneth E. Jansen      tlescp1 = TMRC()
51559599516SKenneth E. Jansen      call usrNew ( usr,        eqnType,          apermS,
51659599516SKenneth E. Jansen     &              atempS,     res,              solinc,
51759599516SKenneth E. Jansen     &              flowDiag,   sclrDiag,         lesP,
51859599516SKenneth E. Jansen     &              lesQ,       iBC,              BC,
51959599516SKenneth E. Jansen     &              iper,       ilwork,           numpe,
52059599516SKenneth E. Jansen     &              nshg,       nshl,             nPermDimsS,
52159599516SKenneth E. Jansen     &              nTmpDimsS,  rowp,             colm,
52259599516SKenneth E. Jansen     &              rlhsK,      rlhsP,            lhsS,
52359599516SKenneth E. Jansen     &              nnz_tot,    CGsol )
52459599516SKenneth E. Jansenc
52559599516SKenneth E. Jansenc.... solve linear system
52659599516SKenneth E. Jansenc
52759599516SKenneth E. Jansen      call myfLesSolve ( lesId, usr )
52859599516SKenneth E. Jansen      call getSol ( usr, solinc )
52959599516SKenneth E. Jansen
53059599516SKenneth E. Jansen      if (numpe > 1) then
53159599516SKenneth E. Jansen         call commu ( solinc, ilwork, 1, 'out')
53259599516SKenneth E. Jansen      endif
533*bd36043dSBen Matthews#endif
534*bd36043dSBen Matthews#if defined(HAVE_SVLS) && defined(HAVE_ACUSOLVE)
535436818eeSKenneth E. Jansen      ENDIF ! decision between solvers
536*bd36043dSBen Matthews#endif
53759599516SKenneth E. Jansen      tlescp2 = TMRC()
53859599516SKenneth E. Jansen      impistat=0
53959599516SKenneth E. Jansen      impistat2=0
54059599516SKenneth E. Jansen
54159599516SKenneth E. Jansen      tcorecpscal(1) = tcorecpscal(1) + telmcp2-telmcp1 ! elem. formation
54259599516SKenneth E. Jansen      tcorecpscal(2) = tcorecpscal(2) + tlescp2-tlescp1 ! linear alg. solution
54359599516SKenneth E. Jansen
54459599516SKenneth E. Jansen      nsolsc=5+isclr
54559599516SKenneth E. Jansen      call rstaticSclr (res, y, solinc, nsolsc) ! output scalar stats
54659599516SKenneth E. Jansenc
54759599516SKenneth E. Jansenc.... end
54859599516SKenneth E. Jansenc
54959599516SKenneth E. Jansen      return
55059599516SKenneth E. Jansen      end
55159599516SKenneth E. Jansen
55259599516SKenneth E. Jansen
55359599516SKenneth E. Jansen
55459599516SKenneth E. Jansen
55559599516SKenneth E. Jansen
556