xref: /libCEED/examples/nek/bps/bps.usr (revision 05939c60cfb5d1161f71e01d6b7bc784737e6bea)
186a4271fSThilina RathnayakeC Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
286a4271fSThilina RathnayakeC the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
386a4271fSThilina RathnayakeC reserved. See files LICENSE and NOTICE for details.
486a4271fSThilina RathnayakeC
586a4271fSThilina RathnayakeC This file is part of CEED, a collection of benchmarks, miniapps, software
686a4271fSThilina RathnayakeC libraries and APIs for efficient high-order finite element and spectral
786a4271fSThilina RathnayakeC element discretizations for exascale applications. For more information and
886a4271fSThilina RathnayakeC source code availability see http://github.com/ceed.
986a4271fSThilina RathnayakeC
1086a4271fSThilina RathnayakeC The CEED research is supported by the Exascale Computing Project (17-SC-20-SC)
1186a4271fSThilina RathnayakeC a collaborative effort of two U.S. Department of Energy organizations (Office
1286a4271fSThilina RathnayakeC of Science and the National Nuclear Security Administration) responsible for
1386a4271fSThilina RathnayakeC the planning and preparation of a capable exascale ecosystem, including
1486a4271fSThilina RathnayakeC software, applications, hardware, advanced system engineering and early
1586a4271fSThilina RathnayakeC testbed platforms, in support of the nation's exascale computing imperative.
1686a4271fSThilina Rathnayake
1786a4271fSThilina RathnayakeC> @file
1886a4271fSThilina RathnayakeC> Mass and diffusion operators examples using Nek5000
1986a4271fSThilina RathnayakeC TESTARGS -c {ceed_resource} -e bp1 -n 1 -b 4 -test
2086a4271fSThilina Rathnayake
2186a4271fSThilina RathnayakeC-----------------------------------------------------------------------
2286a4271fSThilina Rathnayake      subroutine masssetupf(ctx,q,u1,u2,u3,u4,u5,u6,u7,
2386a4271fSThilina Rathnayake     $  u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,
2486a4271fSThilina Rathnayake     $  v9,v10,v11,v12,v13,v14,v15,v16,ierr)
2586a4271fSThilina RathnayakeC     Set up mass operator
2686a4271fSThilina RathnayakeC     Input: u1,u2,u3,q             Output: v1,v2,ierr
2786a4271fSThilina Rathnayake      integer q,ierr
2886a4271fSThilina Rathnayake      real*8 ctx(1)
2986a4271fSThilina Rathnayake      real*8 u1(3*q)
3086a4271fSThilina Rathnayake      real*8 u2(9*q)
3186a4271fSThilina Rathnayake      real*8 u3(q)
3286a4271fSThilina Rathnayake      real*8 v1(q)
3386a4271fSThilina Rathnayake      real*8 v2(q)
3486a4271fSThilina Rathnayake      real*8 a11,a12,a13,a21,a22,a23,a31,a32,a33
3586a4271fSThilina Rathnayake      real*8 g11,g12,g13,g21,g22,g23,g31,g32,g33
3686a4271fSThilina Rathnayake      real*8 jacmq
3786a4271fSThilina Rathnayake
3886a4271fSThilina Rathnayake      do i=1,q
3986a4271fSThilina Rathnayake        a11=u2(i+q*0)
4086a4271fSThilina Rathnayake        a12=u2(i+q*3)
4186a4271fSThilina Rathnayake        a13=u2(i+q*6)
4286a4271fSThilina Rathnayake
4386a4271fSThilina Rathnayake        a21=u2(i+q*1)
4486a4271fSThilina Rathnayake        a22=u2(i+q*4)
4586a4271fSThilina Rathnayake        a23=u2(i+q*7)
4686a4271fSThilina Rathnayake
4786a4271fSThilina Rathnayake        a31=u2(i+q*2)
4886a4271fSThilina Rathnayake        a32=u2(i+q*5)
4986a4271fSThilina Rathnayake        a33=u2(i+q*8)
5086a4271fSThilina Rathnayake
5186a4271fSThilina Rathnayake        g11 = (a22*a33-a23*a32)
5286a4271fSThilina Rathnayake        g12 = (a13*a32-a33*a12)
5386a4271fSThilina Rathnayake        g13 = (a12*a23-a22*a13)
5486a4271fSThilina Rathnayake
5586a4271fSThilina Rathnayake        g21 = (a23*a31-a21*a33)
5686a4271fSThilina Rathnayake        g22 = (a11*a33-a31*a13)
5786a4271fSThilina Rathnayake        g23 = (a13*a21-a23*a11)
5886a4271fSThilina Rathnayake
5986a4271fSThilina Rathnayake        g31 = (a21*a32-a22*a31)
6086a4271fSThilina Rathnayake        g32 = (a12*a31-a32*a11)
6186a4271fSThilina Rathnayake        g33 = (a11*a22-a21*a12)
6286a4271fSThilina Rathnayake
6386a4271fSThilina Rathnayake        jacmq = a11*g11+a21*g12+a31*g13
6486a4271fSThilina Rathnayake
6586a4271fSThilina RathnayakeC       Rho
6686a4271fSThilina Rathnayake        v1(i)=u3(i)*jacmq
6786a4271fSThilina Rathnayake
6886a4271fSThilina RathnayakeC       RHS
6986a4271fSThilina Rathnayake        v2(i)=u3(i)*jacmq
7086a4271fSThilina Rathnayake     $             *dsqrt(u1(i+q*0)*u1(i+q*0)
7186a4271fSThilina Rathnayake     $                   +u1(i+q*1)*u1(i+q*1)
7286a4271fSThilina Rathnayake     $                   +u1(i+q*2)*u1(i+q*2))
7386a4271fSThilina Rathnayake      enddo
7486a4271fSThilina Rathnayake
7586a4271fSThilina Rathnayake      ierr=0
7686a4271fSThilina Rathnayake      end
7786a4271fSThilina RathnayakeC-----------------------------------------------------------------------
7886a4271fSThilina Rathnayake      subroutine massf(ctx,q,u1,u2,u3,u4,u5,u6,u7,
7986a4271fSThilina Rathnayake     $  u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,
8086a4271fSThilina Rathnayake     $  v9,v10,v11,v12,v13,v14,v15,v16,ierr)
8186a4271fSThilina RathnayakeC     Apply mass operator
8286a4271fSThilina RathnayakeC     Input: u1,u2,q                Output: v1,ierr
8386a4271fSThilina Rathnayake      integer q,ierr
8486a4271fSThilina Rathnayake      real*8 ctx(1)
8586a4271fSThilina Rathnayake      real*8 u1(q)
8686a4271fSThilina Rathnayake      real*8 u2(q)
8786a4271fSThilina Rathnayake      real*8 v1(q)
8886a4271fSThilina Rathnayake
8986a4271fSThilina Rathnayake      do i=1,q
9086a4271fSThilina Rathnayake        v1(i)=u2(i)*u1(i)
9186a4271fSThilina Rathnayake      enddo
9286a4271fSThilina Rathnayake
9386a4271fSThilina Rathnayake      ierr=0
9486a4271fSThilina Rathnayake      end
9586a4271fSThilina RathnayakeC-----------------------------------------------------------------------
9686a4271fSThilina Rathnayake      subroutine diffsetupf(ctx,q,u1,u2,u3,u4,u5,u6,u7,
9786a4271fSThilina Rathnayake     $  u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,
9886a4271fSThilina Rathnayake     $  v9,v10,v11,v12,v13,v14,v15,v16,ierr)
9986a4271fSThilina RathnayakeC     Set up diffusion operator
10086a4271fSThilina RathnayakeC     Input: u1,u2,u3,q             Output: v1,v2,ierr
10186a4271fSThilina Rathnayake      integer q,ierr
10286a4271fSThilina Rathnayake      real*8 ctx(1)
10386a4271fSThilina Rathnayake      real*8 u1(3*q)
10486a4271fSThilina Rathnayake      real*8 u2(9*q)
10586a4271fSThilina Rathnayake      real*8 u3(q)
10686a4271fSThilina Rathnayake      real*8 v1(6*q)
10786a4271fSThilina Rathnayake      real*8 v2(q)
10886a4271fSThilina Rathnayake      real*8 a11,a12,a13,a21,a22,a23,a31,a32,a33
10986a4271fSThilina Rathnayake      real*8 g11,g12,g13,g21,g22,g23,g31,g32,g33
11086a4271fSThilina Rathnayake      real*8 jacmq,scl
11186a4271fSThilina Rathnayake      real*8 c(3),k(3)
11286a4271fSThilina Rathnayake
11386a4271fSThilina Rathnayake      do i=1,q
11486a4271fSThilina Rathnayake        pi = 3.14159265358979323846
11586a4271fSThilina Rathnayake
11686a4271fSThilina Rathnayake        c(1)=0.
11786a4271fSThilina Rathnayake        c(2)=1.
11886a4271fSThilina Rathnayake        c(3)=2.
11986a4271fSThilina Rathnayake        k(1)=1.
12086a4271fSThilina Rathnayake        k(2)=2.
12186a4271fSThilina Rathnayake        k(3)=3.
12286a4271fSThilina Rathnayake
12386a4271fSThilina Rathnayake        a11=u2(i+q*0)
12486a4271fSThilina Rathnayake        a12=u2(i+q*3)
12586a4271fSThilina Rathnayake        a13=u2(i+q*6)
12686a4271fSThilina Rathnayake
12786a4271fSThilina Rathnayake        a21=u2(i+q*1)
12886a4271fSThilina Rathnayake        a22=u2(i+q*4)
12986a4271fSThilina Rathnayake        a23=u2(i+q*7)
13086a4271fSThilina Rathnayake
13186a4271fSThilina Rathnayake        a31=u2(i+q*2)
13286a4271fSThilina Rathnayake        a32=u2(i+q*5)
13386a4271fSThilina Rathnayake        a33=u2(i+q*8)
13486a4271fSThilina Rathnayake
13586a4271fSThilina Rathnayake        g11 = (a22*a33-a23*a32)
13686a4271fSThilina Rathnayake        g12 = (a13*a32-a33*a12)
13786a4271fSThilina Rathnayake        g13 = (a12*a23-a22*a13)
13886a4271fSThilina Rathnayake
13986a4271fSThilina Rathnayake        g21 = (a23*a31-a21*a33)
14086a4271fSThilina Rathnayake        g22 = (a11*a33-a31*a13)
14186a4271fSThilina Rathnayake        g23 = (a13*a21-a23*a11)
14286a4271fSThilina Rathnayake
14386a4271fSThilina Rathnayake        g31 = (a21*a32-a22*a31)
14486a4271fSThilina Rathnayake        g32 = (a12*a31-a32*a11)
14586a4271fSThilina Rathnayake        g33 = (a11*a22-a21*a12)
14686a4271fSThilina Rathnayake
14786a4271fSThilina Rathnayake        jacmq = a11*g11+a21*g12+a31*g13
14886a4271fSThilina Rathnayake
14986a4271fSThilina Rathnayake        scl = u3(i)/jacmq
15086a4271fSThilina Rathnayake
15186a4271fSThilina RathnayakeC       Geometric factors
15286a4271fSThilina Rathnayake        v1(i+0*q) = scl*(g11*g11+g12*g12+g13*g13) ! Grr
15386a4271fSThilina Rathnayake        v1(i+1*q) = scl*(g11*g21+g12*g22+g13*g23) ! Grs
15486a4271fSThilina Rathnayake        v1(i+2*q) = scl*(g11*g31+g12*g32+g13*g33) ! Grt
15586a4271fSThilina Rathnayake        v1(i+3*q) = scl*(g21*g21+g22*g22+g23*g23) ! Gss
15686a4271fSThilina Rathnayake        v1(i+4*q) = scl*(g21*g31+g22*g32+g23*g33) ! Gst
15786a4271fSThilina Rathnayake        v1(i+5*q) = scl*(g31*g31+g32*g32+g33*g33) ! Gtt
15886a4271fSThilina Rathnayake
15986a4271fSThilina RathnayakeC       RHS
16086a4271fSThilina Rathnayake        v2(i) = u3(i)*jacmq*pi*pi
16186a4271fSThilina Rathnayake     $            *dsin(pi*(c(1)+k(1)*u1(i+0*q)))
16286a4271fSThilina Rathnayake     $            *dsin(pi*(c(2)+k(2)*u1(i+1*q)))
16386a4271fSThilina Rathnayake     $            *dsin(pi*(c(3)+k(3)*u1(i+2*q)))
16486a4271fSThilina Rathnayake     $            *(k(1)*k(1)+k(2)*k(2)+k(3)*k(3))
16586a4271fSThilina Rathnayake
16686a4271fSThilina Rathnayake      enddo
16786a4271fSThilina Rathnayake
16886a4271fSThilina Rathnayake      ierr=0
16986a4271fSThilina Rathnayake      end
17086a4271fSThilina RathnayakeC-----------------------------------------------------------------------
17186a4271fSThilina Rathnayake      subroutine diffusionf(ctx,q,u1,u2,u3,u4,u5,u6,u7,
17286a4271fSThilina Rathnayake     $  u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,
17386a4271fSThilina Rathnayake     $  v9,v10,v11,v12,v13,v14,v15,v16,ierr)
17486a4271fSThilina RathnayakeC     Apply diffusion operator
17586a4271fSThilina RathnayakeC     Input: u1,u2,q                Output: v1,ierr
17686a4271fSThilina Rathnayake      integer q,ierr
17786a4271fSThilina Rathnayake      real*8 ctx(1)
17886a4271fSThilina Rathnayake      real*8 u1(3*q)
17986a4271fSThilina Rathnayake      real*8 u2(6*q)
18086a4271fSThilina Rathnayake      real*8 v1(3*q)
18186a4271fSThilina Rathnayake
18286a4271fSThilina Rathnayake      do i=1,q
18386a4271fSThilina Rathnayake        v1(i+0*q)=
18486a4271fSThilina Rathnayake     $     u2(i+0*q)*u1(i)+u2(i+1*q)*u1(i+q)+u2(i+2*q)*u1(i+2*q)
18586a4271fSThilina Rathnayake        v1(i+1*q)=
18686a4271fSThilina Rathnayake     $     u2(i+1*q)*u1(i)+u2(i+3*q)*u1(i+q)+u2(i+4*q)*u1(i+2*q)
18786a4271fSThilina Rathnayake        v1(i+2*q)=
18886a4271fSThilina Rathnayake     $     u2(i+2*q)*u1(i)+u2(i+4*q)*u1(i+q)+u2(i+5*q)*u1(i+2*q)
18986a4271fSThilina Rathnayake      enddo
19086a4271fSThilina Rathnayake
19186a4271fSThilina Rathnayake      ierr=0
19286a4271fSThilina Rathnayake      end
19386a4271fSThilina RathnayakeC-----------------------------------------------------------------------
19486a4271fSThilina Rathnayake      subroutine set_h2_as_rhoJac_GL(h2,bmq,nxq)
19586a4271fSThilina RathnayakeC     Set h2 as rhoJac
19686a4271fSThilina RathnayakeC     Input: bmq,nxq                Output: h2
19786a4271fSThilina Rathnayake      include 'SIZE'
19886a4271fSThilina Rathnayake      real*8 h2(1),bmq(1)
19986a4271fSThilina Rathnayake
20086a4271fSThilina Rathnayake      common /ctmp77/ wd(lxd),zd(lxd)
20186a4271fSThilina Rathnayake      integer e,i,L
20286a4271fSThilina Rathnayake
20386a4271fSThilina Rathnayake      call zwgl(zd,wd,nxq)  ! nxq = number of points
20486a4271fSThilina Rathnayake
20586a4271fSThilina Rathnayake      q = 1.0               ! Later, this can be a function of position...
20686a4271fSThilina Rathnayake
20786a4271fSThilina Rathnayake      L = 0
20886a4271fSThilina Rathnayake      do e=1,lelt
20986a4271fSThilina Rathnayake      do i=1,nxq**ldim
21086a4271fSThilina Rathnayake         L=L+1
21186a4271fSThilina Rathnayake         h2(L) = q*bmq(L)
21286a4271fSThilina Rathnayake      enddo
21386a4271fSThilina Rathnayake      enddo
21486a4271fSThilina Rathnayake
21586a4271fSThilina Rathnayake      return
21686a4271fSThilina Rathnayake      end
21786a4271fSThilina RathnayakeC-----------------------------------------------------------------------
21886a4271fSThilina Rathnayake      subroutine dist_fld_h1(e)
21986a4271fSThilina RathnayakeC     Set distance initial condition for BP1
22086a4271fSThilina RathnayakeC     Input:                        Output: e
22186a4271fSThilina Rathnayake      include 'SIZE'
22286a4271fSThilina Rathnayake      include 'TOTAL'
22386a4271fSThilina Rathnayake      real*8 x,y,z
22486a4271fSThilina Rathnayake      real*8 e(1)
22586a4271fSThilina Rathnayake
22686a4271fSThilina Rathnayake      n=lx1*ly1*lz1*nelt
22786a4271fSThilina Rathnayake
22886a4271fSThilina Rathnayake      do i=1,n
22986a4271fSThilina Rathnayake        x=xm1(i,1,1,1)
23086a4271fSThilina Rathnayake        y=ym1(i,1,1,1)
23186a4271fSThilina Rathnayake        z=zm1(i,1,1,1)
23286a4271fSThilina Rathnayake
23386a4271fSThilina Rathnayake        e(i) = dsqrt(x*x+y*y+z*z)
23486a4271fSThilina Rathnayake      enddo
23586a4271fSThilina Rathnayake
23686a4271fSThilina Rathnayake      call dsavg(e)  ! This is requisite for random fields
23786a4271fSThilina Rathnayake
23886a4271fSThilina Rathnayake      return
23986a4271fSThilina Rathnayake      end
24086a4271fSThilina RathnayakeC-----------------------------------------------------------------------
24186a4271fSThilina Rathnayake      subroutine sin_fld_h1(e)
24286a4271fSThilina RathnayakeC     Set sine initial condition for BP3
24386a4271fSThilina RathnayakeC     Input:                        Output: e
24486a4271fSThilina Rathnayake      include 'SIZE'
24586a4271fSThilina Rathnayake      include 'TOTAL'
24686a4271fSThilina Rathnayake      real*8 x,y,z
24786a4271fSThilina Rathnayake      real*8 e(1)
24886a4271fSThilina Rathnayake      real*8 c(3),k(3)
24986a4271fSThilina Rathnayake
25086a4271fSThilina Rathnayake      n=lx1*ly1*lz1*nelt
25186a4271fSThilina Rathnayake      pi = 3.14159265358979323846
25286a4271fSThilina Rathnayake
25386a4271fSThilina Rathnayake      c(1)=0.
25486a4271fSThilina Rathnayake      c(2)=1.
25586a4271fSThilina Rathnayake      c(3)=2.
25686a4271fSThilina Rathnayake      k(1)=1.
25786a4271fSThilina Rathnayake      k(2)=2.
25886a4271fSThilina Rathnayake      k(3)=3.
25986a4271fSThilina Rathnayake
26086a4271fSThilina Rathnayake      do i=1,n
26186a4271fSThilina Rathnayake        x=xm1(i,1,1,1)
26286a4271fSThilina Rathnayake        y=ym1(i,1,1,1)
26386a4271fSThilina Rathnayake        z=zm1(i,1,1,1)
26486a4271fSThilina Rathnayake
26586a4271fSThilina Rathnayake        e(i) = dsin(pi*(c(1)+k(1)*x))
26686a4271fSThilina Rathnayake     &        *dsin(pi*(c(2)+k(2)*y))
26786a4271fSThilina Rathnayake     &        *dsin(pi*(c(3)+k(3)*z))
26886a4271fSThilina Rathnayake
26986a4271fSThilina Rathnayake      enddo
27086a4271fSThilina Rathnayake
27186a4271fSThilina Rathnayake      call dsavg(e)  ! This is requisite for random fields
27286a4271fSThilina Rathnayake
27386a4271fSThilina Rathnayake      return
27486a4271fSThilina Rathnayake      end
27586a4271fSThilina RathnayakeC-----------------------------------------------------------------------
27686a4271fSThilina Rathnayake      subroutine uservp(ix,iy,iz,eg) ! set variable properties
27786a4271fSThilina Rathnayake      include 'SIZE'
27886a4271fSThilina Rathnayake      include 'TOTAL'
27986a4271fSThilina Rathnayake      include 'NEKUSE'
28086a4271fSThilina Rathnayake      integer e,f,eg
28186a4271fSThilina RathnayakeC     e = gllel(eg)
28286a4271fSThilina Rathnayake
28386a4271fSThilina Rathnayake      udiff  = 0.0
28486a4271fSThilina Rathnayake      utrans = 0.0
28586a4271fSThilina Rathnayake
28686a4271fSThilina Rathnayake      return
28786a4271fSThilina Rathnayake      end
28886a4271fSThilina RathnayakeC-----------------------------------------------------------------------
28986a4271fSThilina Rathnayake      subroutine userf(ix,iy,iz,eg) ! set acceleration term
29086a4271fSThilina RathnayakeC
29186a4271fSThilina RathnayakeC     Note: this is an acceleration term, NOT a force!
29286a4271fSThilina RathnayakeC     Thus, ffx will subsequently be multiplied by rho(x,t).
29386a4271fSThilina RathnayakeC
29486a4271fSThilina Rathnayake      include 'SIZE'
29586a4271fSThilina Rathnayake      include 'TOTAL'
29686a4271fSThilina Rathnayake      include 'NEKUSE'
29786a4271fSThilina Rathnayake      integer e,f,eg
29886a4271fSThilina RathnayakeC     e = gllel(eg)
29986a4271fSThilina Rathnayake
30086a4271fSThilina Rathnayake      ffx = 0.0
30186a4271fSThilina Rathnayake      ffy = 0.0
30286a4271fSThilina Rathnayake      ffz = 0.0
30386a4271fSThilina Rathnayake
30486a4271fSThilina Rathnayake      return
30586a4271fSThilina Rathnayake      end
30686a4271fSThilina RathnayakeC-----------------------------------------------------------------------
30786a4271fSThilina Rathnayake      subroutine userq(i,j,k,eg) ! set source term
30886a4271fSThilina Rathnayake      include 'SIZE'
30986a4271fSThilina Rathnayake      include 'TOTAL'
31086a4271fSThilina Rathnayake      include 'NEKUSE'
31186a4271fSThilina Rathnayake      integer e,f,eg
31286a4271fSThilina Rathnayake      e = gllel(eg)
31386a4271fSThilina Rathnayake
31486a4271fSThilina Rathnayake      qvol   = 0
31586a4271fSThilina Rathnayake
31686a4271fSThilina Rathnayake      return
31786a4271fSThilina Rathnayake      end
31886a4271fSThilina RathnayakeC-----------------------------------------------------------------------
31986a4271fSThilina Rathnayake      subroutine userbc(ix,iy,iz,f,eg) ! set up boundary conditions
32086a4271fSThilina RathnayakeC     NOTE ::: This subroutine MAY NOT be called by every process
32186a4271fSThilina Rathnayake      include 'SIZE'
32286a4271fSThilina Rathnayake      include 'TOTAL'
32386a4271fSThilina Rathnayake      include 'NEKUSE'
32486a4271fSThilina Rathnayake      integer e,f,eg
32586a4271fSThilina Rathnayake
32686a4271fSThilina Rathnayake      ux   = 0.0
32786a4271fSThilina Rathnayake      uy   = 0.0
32886a4271fSThilina Rathnayake      uz   = 0.0
32986a4271fSThilina Rathnayake      temp = 0.0
33086a4271fSThilina Rathnayake
33186a4271fSThilina Rathnayake      return
33286a4271fSThilina Rathnayake      end
33386a4271fSThilina RathnayakeC-----------------------------------------------------------------------
33486a4271fSThilina Rathnayake      subroutine useric(ix,iy,iz,eg) ! set up initial conditions
33586a4271fSThilina Rathnayake      include 'SIZE'
33686a4271fSThilina Rathnayake      include 'TOTAL'
33786a4271fSThilina Rathnayake      include 'NEKUSE'
33886a4271fSThilina Rathnayake      integer e,f,eg
33986a4271fSThilina Rathnayake
34086a4271fSThilina Rathnayake      ux   = 0.0
34186a4271fSThilina Rathnayake      uy   = 0.0
34286a4271fSThilina Rathnayake      uz   = 0.0
34386a4271fSThilina Rathnayake      temp = 0.0
34486a4271fSThilina Rathnayake
34586a4271fSThilina Rathnayake      return
34686a4271fSThilina Rathnayake      end
34786a4271fSThilina RathnayakeC-----------------------------------------------------------------------
34886a4271fSThilina Rathnayake      subroutine usrdat   ! This routine to modify element vertices
34986a4271fSThilina Rathnayake      include 'SIZE'
35086a4271fSThilina Rathnayake      include 'TOTAL'
35186a4271fSThilina Rathnayake
35286a4271fSThilina Rathnayake      return
35386a4271fSThilina Rathnayake      end
35486a4271fSThilina RathnayakeC-----------------------------------------------------------------------
35586a4271fSThilina Rathnayake      subroutine usrdat2  ! This routine to modify mesh coordinates
35686a4271fSThilina Rathnayake      include 'SIZE'
35786a4271fSThilina Rathnayake      include 'TOTAL'
35886a4271fSThilina Rathnayake
35986a4271fSThilina Rathnayake      x0 = 0
36086a4271fSThilina Rathnayake      x1 = 1
36186a4271fSThilina Rathnayake      call rescale_x(xm1,x0,x1)
36286a4271fSThilina Rathnayake      call rescale_x(ym1,x0,x1)
36386a4271fSThilina Rathnayake      call rescale_x(zm1,x0,x1)
36486a4271fSThilina Rathnayake
36586a4271fSThilina Rathnayake      param(59)=1  ! Force Nek to use the "deformed element" formulation
36686a4271fSThilina Rathnayake
36786a4271fSThilina Rathnayake      return
36886a4271fSThilina Rathnayake      end
36986a4271fSThilina RathnayakeC-----------------------------------------------------------------------
37086a4271fSThilina Rathnayake      subroutine usrdat3
37186a4271fSThilina Rathnayake      include 'SIZE'
37286a4271fSThilina Rathnayake      include 'TOTAL'
37386a4271fSThilina Rathnayake
37486a4271fSThilina Rathnayake      return
37586a4271fSThilina Rathnayake      end
37686a4271fSThilina RathnayakeC-----------------------------------------------------------------------
37786a4271fSThilina Rathnayake      subroutine xmask1   (r1,h2,nel)
37886a4271fSThilina RathnayakeC     Apply zero Dirichlet boundary conditions
37986a4271fSThilina RathnayakeC     Input: h2,nel                 Output: r1
38086a4271fSThilina Rathnayake      include 'SIZE'
38186a4271fSThilina Rathnayake      include 'TOTAL'
38286a4271fSThilina Rathnayake      real*8 r1(1),h2(1)
38386a4271fSThilina Rathnayake
38486a4271fSThilina Rathnayake      n=nx1*ny1*nz1*nel
38586a4271fSThilina Rathnayake      do i=1,n
38686a4271fSThilina Rathnayake         r1(i)=r1(i)*h2(i)
38786a4271fSThilina Rathnayake      enddo
38886a4271fSThilina Rathnayake
38986a4271fSThilina Rathnayake      return
39086a4271fSThilina Rathnayake      end
39186a4271fSThilina RathnayakeC-----------------------------------------------------------------------
39286a4271fSThilina Rathnayake      function glrdif(x,y,n)
39386a4271fSThilina RathnayakeC     Compute Linfty norm of (x-y)
39486a4271fSThilina RathnayakeC     Input: x,y                    Output: n
39586a4271fSThilina Rathnayake      real*8 x(n),y(n)
39686a4271fSThilina Rathnayake
39786a4271fSThilina Rathnayake      dmx=0
39886a4271fSThilina Rathnayake      xmx=0
39986a4271fSThilina Rathnayake      ymx=0
40086a4271fSThilina Rathnayake
40186a4271fSThilina Rathnayake      do i=1,n
40286a4271fSThilina Rathnayake         diff=abs(x(i)-y(i))
40386a4271fSThilina Rathnayake         dmx =max(dmx,diff)
40486a4271fSThilina Rathnayake         xmx =max(xmx,x(i))
40586a4271fSThilina Rathnayake         ymx =max(ymx,y(i))
40686a4271fSThilina Rathnayake      enddo
40786a4271fSThilina Rathnayake
40886a4271fSThilina Rathnayake      xmx = max(xmx,ymx)
40986a4271fSThilina Rathnayake      dmx = glmax(dmx,1) ! max across processors
41086a4271fSThilina Rathnayake      xmx = glmax(xmx,1)
41186a4271fSThilina Rathnayake
41286a4271fSThilina Rathnayake      if (xmx.gt.0) then
41386a4271fSThilina Rathnayake         glrdif = dmx/xmx
41486a4271fSThilina Rathnayake      else
41586a4271fSThilina Rathnayake         glrdif = -dmx   ! Negative indicates something strange
41686a4271fSThilina Rathnayake      endif
41786a4271fSThilina Rathnayake
41886a4271fSThilina Rathnayake      return
41986a4271fSThilina Rathnayake      end
42086a4271fSThilina RathnayakeC-----------------------------------------------------------------------
42186a4271fSThilina Rathnayake      subroutine loc_grad3(ur,us,ut,u,N,D,Dt)
42286a4271fSThilina RathnayakeC     3D transpose of local gradient
42386a4271fSThilina RathnayakeC     Input: u,N,D,Dt               Output: ur,us,ut
42486a4271fSThilina Rathnayake      real*8 ur(0:N,0:N,0:N),us(0:N,0:N,0:N),ut(0:N,0:N,0:N)
42586a4271fSThilina Rathnayake      real*8 u (0:N,0:N,0:N)
42686a4271fSThilina Rathnayake      real*8 D (0:N,0:N),Dt(0:N,0:N)
42786a4271fSThilina Rathnayake
42886a4271fSThilina Rathnayake      m1 = N+1
42986a4271fSThilina Rathnayake      m2 = m1*m1
43086a4271fSThilina Rathnayake
43186a4271fSThilina Rathnayake      call mxm(D ,m1,u(0,0,0),m1,ur,m2)
43286a4271fSThilina Rathnayake      do k=0,N
43386a4271fSThilina Rathnayake         call mxm(u(0,0,k),m1,Dt,m1,us(0,0,k),m1)
43486a4271fSThilina Rathnayake      enddo
43586a4271fSThilina Rathnayake      call mxm(u(0,0,0),m2,Dt,m1,ut,m1)
43686a4271fSThilina Rathnayake
43786a4271fSThilina Rathnayake      return
43886a4271fSThilina Rathnayake      end
43986a4271fSThilina Rathnayakec-----------------------------------------------------------------------
44086a4271fSThilina Rathnayake      subroutine loc_grad3t(u,ur,us,ut,N,D,Dt,w)
44186a4271fSThilina RathnayakeC     3D transpose of local gradient
44286a4271fSThilina RathnayakeC     Input: ur,us,ut,N,D,Dt        Output: u
44386a4271fSThilina Rathnayake       real*8 u (0:N,0:N,0:N)
44486a4271fSThilina Rathnayake       real*8 ur(0:N,0:N,0:N),us(0:N,0:N,0:N),ut(0:N,0:N,0:N)
44586a4271fSThilina Rathnayake       real*8 D (0:N,0:N),Dt(0:N,0:N)
44686a4271fSThilina Rathnayake       real*8 w (0:N,0:N,0:N)
44786a4271fSThilina Rathnayake
44886a4271fSThilina Rathnayake       m1 = N+1
44986a4271fSThilina Rathnayake       m2 = m1*m1
45086a4271fSThilina Rathnayake       m3 = m1*m1*m1
45186a4271fSThilina Rathnayake
45286a4271fSThilina Rathnayake       call mxm(Dt,m1,ur,m1,u(0,0,0),m2)
45386a4271fSThilina Rathnayake       do k=0,N
45486a4271fSThilina Rathnayake          call mxm(us(0,0,k),m1,D ,m1,w(0,0,k),m1)
45586a4271fSThilina Rathnayake       enddo
45686a4271fSThilina Rathnayake       call add2(u(0,0,0),w,m3)
45786a4271fSThilina Rathnayake       call mxm(ut,m2,D ,m1,w,m1)
45886a4271fSThilina Rathnayake       call add2(u(0,0,0),w,m3)
45986a4271fSThilina Rathnayake
46086a4271fSThilina Rathnayake      return
46186a4271fSThilina Rathnayake      end
46286a4271fSThilina RathnayakeC-----------------------------------------------------------------------
46386a4271fSThilina Rathnayake      subroutine geodatq(gf,bmq,w3mq,nxq)
46486a4271fSThilina RathnayakeC     Routine to generate elemental geometric matrices on mesh 1
46586a4271fSThilina RathnayakeC     (Gauss-Legendre Lobatto mesh).
46686a4271fSThilina Rathnayake      include 'SIZE'
46786a4271fSThilina Rathnayake      include 'TOTAL'
46886a4271fSThilina Rathnayake
46986a4271fSThilina Rathnayake      parameter (lg=3+3*(ldim-2),lzq=lx1+1,lxyd=lzq**ldim)
47086a4271fSThilina Rathnayake
47186a4271fSThilina Rathnayake      real*8 gf(lg,nxq**ldim,lelt),bmq(nxq**ldim,lelt),w3mq(nxq,nxq,nxq)
47286a4271fSThilina Rathnayake
47386a4271fSThilina Rathnayake      common /ctmp1/ xr(lxyd),xs(lxyd),xt(lxyd)
47486a4271fSThilina Rathnayake      common /sxrns/ yr(lxyd),ys(lxyd),yt(lxyd)
47586a4271fSThilina Rathnayake     $ ,             zr(lxyd),zs(lxyd),zt(lxyd)
47686a4271fSThilina Rathnayake
47786a4271fSThilina Rathnayake      common /ctmp77/ wd(lxd),zd(lxd)
47886a4271fSThilina Rathnayake      common /dxmfine/ dxmq(lzq,lzq),dxtmq(lzq,lzq)
47986a4271fSThilina Rathnayake
48086a4271fSThilina Rathnayake      integer e
48186a4271fSThilina Rathnayake      real*8 tmp(lxyd)
48286a4271fSThilina Rathnayake      real*8 a11,a12,a13,a21,a22,a23,a31,a32,a33
48386a4271fSThilina Rathnayake      real*8 g11,g12,g13,g21,g22,g23,g31,g32,g33
48486a4271fSThilina Rathnayake      real*8 jacmq
48586a4271fSThilina Rathnayake
48686a4271fSThilina Rathnayake      if (nxq.gt.lzq) call exitti('ABORT: recompile with lzq=$',nxq)
48786a4271fSThilina Rathnayake
48886a4271fSThilina Rathnayake      call zwgl    (zd,wd,lzq)                            ! nxq = number of points
48986a4271fSThilina Rathnayake      call gen_dgl (dxmq,dxtmq,lzq,lzq,tmp)
49086a4271fSThilina Rathnayake
49186a4271fSThilina Rathnayake      do k=1,nxq
49286a4271fSThilina Rathnayake      do j=1,nxq
49386a4271fSThilina Rathnayake      do i=1,nxq
49486a4271fSThilina Rathnayake         w3mq(i,j,k) = wd(i)*wd(j)*wd(k)
49586a4271fSThilina Rathnayake      enddo
49686a4271fSThilina Rathnayake      enddo
49786a4271fSThilina Rathnayake      enddo
49886a4271fSThilina Rathnayake
49986a4271fSThilina Rathnayake      nxyzq = nxq**ldim
50086a4271fSThilina Rathnayake      nxqm1 = lzq-1
50186a4271fSThilina Rathnayake
50286a4271fSThilina Rathnayake      do e=1,nelt
50386a4271fSThilina Rathnayake         call intp_rstd (tmp,xm1(1,1,1,e),lx1,lzq,if3d,0) ! 0-->Fwd interpolation
50486a4271fSThilina Rathnayake         call loc_grad3 (xr,xs,xt,tmp,nxqm1,dxmq,dxtmq)
50586a4271fSThilina Rathnayake
50686a4271fSThilina Rathnayake         call intp_rstd (tmp,ym1(1,1,1,e),lx1,lzq,if3d,0)
50786a4271fSThilina Rathnayake         call loc_grad3 (yr,ys,yt,tmp,nxqm1,dxmq,dxtmq)
50886a4271fSThilina Rathnayake
50986a4271fSThilina Rathnayake         call intp_rstd (tmp,zm1(1,1,1,e),lx1,lzq,if3d,0)
51086a4271fSThilina Rathnayake         call loc_grad3 (zr,zs,zt,tmp,nxqm1,dxmq,dxtmq)
51186a4271fSThilina Rathnayake
51286a4271fSThilina Rathnayake         do i=1,nxyzq
51386a4271fSThilina Rathnayake            a11 = xr(i)
51486a4271fSThilina Rathnayake            a12 = xs(i)
51586a4271fSThilina Rathnayake            a13 = xt(i)
51686a4271fSThilina Rathnayake
51786a4271fSThilina Rathnayake            a21 = yr(i)
51886a4271fSThilina Rathnayake            a22 = ys(i)
51986a4271fSThilina Rathnayake            a23 = yt(i)
52086a4271fSThilina Rathnayake
52186a4271fSThilina Rathnayake            a31 = zr(i)
52286a4271fSThilina Rathnayake            a32 = zs(i)
52386a4271fSThilina Rathnayake            a33 = zt(i)
52486a4271fSThilina Rathnayake
52586a4271fSThilina Rathnayake            g11 = (a22*a33-a23*a32)
52686a4271fSThilina Rathnayake            g12 = (a13*a32-a33*a12)
52786a4271fSThilina Rathnayake            g13 = (a12*a23-a22*a13)
52886a4271fSThilina Rathnayake
52986a4271fSThilina Rathnayake            g21 = (a23*a31-a21*a33)
53086a4271fSThilina Rathnayake            g22 = (a11*a33-a31*a13)
53186a4271fSThilina Rathnayake            g23 = (a13*a21-a23*a11)
53286a4271fSThilina Rathnayake
53386a4271fSThilina Rathnayake            g31 = (a21*a32-a22*a31)
53486a4271fSThilina Rathnayake            g32 = (a12*a31-a32*a11)
53586a4271fSThilina Rathnayake            g33 = (a11*a22-a21*a12)
53686a4271fSThilina Rathnayake
53786a4271fSThilina Rathnayake            jacmq = a11*g11+a21*g12+a31*g13
53886a4271fSThilina Rathnayake
53986a4271fSThilina Rathnayake            bmq(i,e)  = w3mq(i,1,1)*jacmq
54086a4271fSThilina Rathnayake            scale     = w3mq(i,1,1)/jacmq
54186a4271fSThilina Rathnayake
54286a4271fSThilina Rathnayake            gf(1,i,e) = scale*(g11*g11+g12*g12+g13*g13) ! Grr
54386a4271fSThilina Rathnayake            gf(2,i,e) = scale*(g11*g21+g12*g22+g13*g23) ! Grs
54486a4271fSThilina Rathnayake            gf(3,i,e) = scale*(g11*g31+g12*g32+g13*g33) ! Grt
54586a4271fSThilina Rathnayake            gf(4,i,e) = scale*(g21*g21+g22*g22+g23*g23) ! Gss
54686a4271fSThilina Rathnayake            gf(5,i,e) = scale*(g21*g31+g22*g32+g23*g33) ! Gst
54786a4271fSThilina Rathnayake            gf(6,i,e) = scale*(g31*g31+g32*g32+g33*g33) ! Gtt
54886a4271fSThilina Rathnayake
54986a4271fSThilina Rathnayake         enddo
55086a4271fSThilina Rathnayake      enddo
55186a4271fSThilina Rathnayake
55286a4271fSThilina Rathnayake      return
55386a4271fSThilina Rathnayake      end
55486a4271fSThilina RathnayakeC-----------------------------------------------------------------------
55586a4271fSThilina Rathnayake      subroutine setprecn_bp1 (d,h1,h2)
55686a4271fSThilina RathnayakeC     Generate diagonal preconditioner for Helmholtz operator
55786a4271fSThilina RathnayakeC     Input: h1,h2                  Output: d
55886a4271fSThilina Rathnayake      include 'SIZE'
55986a4271fSThilina Rathnayake      include 'TOTAL'
56086a4271fSThilina Rathnayake
56186a4271fSThilina Rathnayake      parameter (lxyz=lx1*ly1*lz1,lg=3+3*(ldim-2))
56286a4271fSThilina Rathnayake
56386a4271fSThilina Rathnayake      real*8    d(lx1,ly1,lz1,lelt),h1(lxyz,lelt),h2(lxyz,lelt)
56486a4271fSThilina Rathnayake      integer e
56586a4271fSThilina Rathnayake
56686a4271fSThilina Rathnayake      real*8         gf(lg,lx1,ly1,lz1,lelt) ! Equivalence new gf() data
56786a4271fSThilina Rathnayake      equivalence (gf,g1m1)                  ! layout to g1m1...g6m1
56886a4271fSThilina Rathnayake
56986a4271fSThilina Rathnayake      real*8 ysm1(ly1)
57086a4271fSThilina Rathnayake
57186a4271fSThilina Rathnayake      nel   = nelfld(ifield)
57286a4271fSThilina Rathnayake      n     = nel*lx1*ly1*lz1
57386a4271fSThilina Rathnayake      nxyz  = lx1*ly1*lz1
57486a4271fSThilina Rathnayake
57586a4271fSThilina Rathnayake      call copy    (d,bm1,n)   ! Mass matrix preconditioning full mass matrix
57686a4271fSThilina Rathnayake      call dssum   (d,nx1,ny1,nz1)
57786a4271fSThilina Rathnayake      call invcol1 (d,n)
57886a4271fSThilina Rathnayake      return
57986a4271fSThilina Rathnayake
58086a4271fSThilina Rathnayake      call dsset(lx1,ly1,lz1)
58186a4271fSThilina Rathnayake
58286a4271fSThilina Rathnayake      do 1000 e=1,nel
58386a4271fSThilina Rathnayake
58486a4271fSThilina Rathnayake        call rzero(d(1,1,1,e),nxyz)
58586a4271fSThilina Rathnayake
58686a4271fSThilina Rathnayake        do 320 iz=1,lz1
58786a4271fSThilina Rathnayake         do 320 iy=1,ly1
58886a4271fSThilina Rathnayake         do 320 ix=1,lx1
58986a4271fSThilina Rathnayake         do 320 iq=1,lx1
59086a4271fSThilina Rathnayake           d(ix,iy,iz,e) = d(ix,iy,iz,e)
59186a4271fSThilina Rathnayake     $                   + gf(1,iq,iy,iz,e) * dxm1(iq,ix)**2
59286a4271fSThilina Rathnayake     $                   + gf(2,ix,iq,iz,e) * dxm1(iq,iy)**2
59386a4271fSThilina Rathnayake     $                   + gf(3,ix,iy,iq,e) * dxm1(iq,iz)**2
59486a4271fSThilina Rathnayake  320    continue
59586a4271fSThilina RathnayakeC
59686a4271fSThilina RathnayakeC        Add cross terms if element is deformed.
59786a4271fSThilina RathnayakeC
59886a4271fSThilina Rathnayake         if (lxyz.gt.0) then
59986a4271fSThilina Rathnayake
60086a4271fSThilina Rathnayake           do i2=1,ly1,ly1-1
60186a4271fSThilina Rathnayake           do i1=1,lx1,lx1-1
60286a4271fSThilina Rathnayake              d(1,i1,i2,e) = d(1,i1,i2,e)
60386a4271fSThilina Rathnayake     $            + gf(4,1,i1,i2,e) * dxtm1(1,1)*dytm1(i1,i1)
60486a4271fSThilina Rathnayake     $            + gf(5,1,i1,i2,e) * dxtm1(1,1)*dztm1(i2,i2)
60586a4271fSThilina Rathnayake              d(lx1,i1,i2,e) = d(lx1,i1,i2,e)
60686a4271fSThilina Rathnayake     $            + gf(4,lx1,i1,i2,e) * dxtm1(lx1,lx1)*dytm1(i1,i1)
60786a4271fSThilina Rathnayake     $            + gf(5,lx1,i1,i2,e) * dxtm1(lx1,lx1)*dztm1(i2,i2)
60886a4271fSThilina Rathnayake              d(i1,1,i2,e) = d(i1,1,i2,e)
60986a4271fSThilina Rathnayake     $            + gf(4,i1,1,i2,e) * dytm1(1,1)*dxtm1(i1,i1)
61086a4271fSThilina Rathnayake     $            + gf(6,i1,1,i2,e) * dytm1(1,1)*dztm1(i2,i2)
61186a4271fSThilina Rathnayake              d(i1,ly1,i2,e) = d(i1,ly1,i2,e)
61286a4271fSThilina Rathnayake     $            + gf(4,i1,ly1,i2,e) * dytm1(ly1,ly1)*dxtm1(i1,i1)
61386a4271fSThilina Rathnayake     $            + gf(6,i1,ly1,i2,e) * dytm1(ly1,ly1)*dztm1(i2,i2)
61486a4271fSThilina Rathnayake              d(i1,i2,1,e) = d(i1,i2,1,e)
61586a4271fSThilina Rathnayake     $            + gf(5,i1,i2,1,e) * dztm1(1,1)*dxtm1(i1,i1)
61686a4271fSThilina Rathnayake     $            + gf(6,i1,i2,1,e) * dztm1(1,1)*dytm1(i2,i2)
61786a4271fSThilina Rathnayake              d(i1,i2,lz1,e) = d(i1,i2,lz1,e)
61886a4271fSThilina Rathnayake     $            + gf(5,i1,i2,lz1,e) * dztm1(lz1,lz1)*dxtm1(i1,i1)
61986a4271fSThilina Rathnayake     $            + gf(6,i1,i2,lz1,e) * dztm1(lz1,lz1)*dytm1(i2,i2)
62086a4271fSThilina Rathnayake
62186a4271fSThilina Rathnayake           enddo
62286a4271fSThilina Rathnayake           enddo
62386a4271fSThilina Rathnayake         endif
62486a4271fSThilina Rathnayake
62586a4271fSThilina Rathnayake        do i=1,lxyz
62686a4271fSThilina Rathnayake           d(i,1,1,e)=d(i,1,1,e)*h1(i,e)+h2(i,e)*bm1(i,1,1,e)
62786a4271fSThilina Rathnayake        enddo
62886a4271fSThilina Rathnayake
62986a4271fSThilina Rathnayake 1000 continue ! element loop
63086a4271fSThilina Rathnayake
63186a4271fSThilina RathnayakeC     If axisymmetric, add a diagonal term in the radial direction (ISD=2)
63286a4271fSThilina Rathnayake
63386a4271fSThilina Rathnayake      if (ifaxis.and.(isd.eq.2)) then
63486a4271fSThilina Rathnayake         do 1200 e=1,nel
63586a4271fSThilina Rathnayake            if (ifrzer(e)) call mxm(ym1(1,1,1,e),lx1,datm1,ly1,ysm1,1)
63686a4271fSThilina Rathnayake            k=0
63786a4271fSThilina Rathnayake            do 1190 j=1,ly1
63886a4271fSThilina Rathnayake            do 1190 i=1,lx1
63986a4271fSThilina Rathnayake               k=k+1
64086a4271fSThilina Rathnayake               if (ym1(i,j,1,e).ne.0.) then
64186a4271fSThilina Rathnayake                  term1 = bm1(i,j,1,e)/ym1(i,j,1,e)**2
64286a4271fSThilina Rathnayake                  if (ifrzer(e)) then
64386a4271fSThilina Rathnayake                     term2 =  wxm1(i)*wam1(1)*dam1(1,j)
64486a4271fSThilina Rathnayake     $                       *jacm1(i,1,1,e)/ysm1(i)
64586a4271fSThilina Rathnayake                  else
64686a4271fSThilina Rathnayake                     term2 = 0.
64786a4271fSThilina Rathnayake                  endif
64886a4271fSThilina Rathnayake                  d(i,j,1,e) = d(i,j,1,e) + h1(k,e)*(term1+term2)
64986a4271fSThilina Rathnayake               endif
65086a4271fSThilina Rathnayake 1190       continue
65186a4271fSThilina Rathnayake 1200    continue
65286a4271fSThilina Rathnayake
65386a4271fSThilina Rathnayake      endif
65486a4271fSThilina Rathnayake      call dssum   (d,nx1,ny1,nz1)
65586a4271fSThilina Rathnayake      call invcol1 (d,n)
65686a4271fSThilina Rathnayake
65786a4271fSThilina Rathnayake      if (nio.eq.0) write(6,1) n,d(1,1,1,1),h1(1,1),h2(1,1),bm1(1,1,1,1)
65886a4271fSThilina Rathnayake   1  format(i9,1p4e12.4,' diag prec')
65986a4271fSThilina Rathnayake
66086a4271fSThilina Rathnayake      return
66186a4271fSThilina Rathnayake      end
66286a4271fSThilina RathnayakeC-----------------------------------------------------------------------
66386a4271fSThilina Rathnayake      subroutine setprecn_bp3 (d,h1,h2)
66486a4271fSThilina RathnayakeC     Generate dummy diagonal preconditioner for Helmholtz operator
66586a4271fSThilina RathnayakeC     Input: h1,h2                  Output: d
66686a4271fSThilina Rathnayake      include 'SIZE'
66786a4271fSThilina Rathnayake      include 'TOTAL'
66886a4271fSThilina Rathnayake
66986a4271fSThilina Rathnayake      parameter (n=lx1*ly1*lz1*lelt)
67086a4271fSThilina Rathnayake      real*8 d(n),h1(n),h2(n)
67186a4271fSThilina Rathnayake
67286a4271fSThilina Rathnayake      call rone (d,n)
67386a4271fSThilina Rathnayake
67486a4271fSThilina Rathnayake      return
67586a4271fSThilina Rathnayake      end
67686a4271fSThilina RathnayakeC-----------------------------------------------------------------------
67786a4271fSThilina Rathnayake      subroutine userchk
67886a4271fSThilina Rathnayake      include 'SIZE'
67986a4271fSThilina Rathnayake      include 'TOTAL'
68086a4271fSThilina Rathnayake
68186a4271fSThilina Rathnayake      integer bp
68286a4271fSThilina Rathnayake
68386a4271fSThilina Rathnayake      call get_bp(bp)
68486a4271fSThilina Rathnayake
68586a4271fSThilina Rathnayake      if (bp==1) then
68686a4271fSThilina Rathnayake        if (istep.gt.0) call bp1
68786a4271fSThilina Rathnayake      elseif (bp==3) then
68886a4271fSThilina Rathnayake        if (istep.gt.0) call bp3
68986a4271fSThilina Rathnayake      else
69086a4271fSThilina Rathnayake        write(6,*) "INVALID BP SPECIFICED"
69186a4271fSThilina Rathnayake      endif
69286a4271fSThilina Rathnayake
69386a4271fSThilina Rathnayake      return
69486a4271fSThilina Rathnayake      end
69586a4271fSThilina RathnayakeC-----------------------------------------------------------------------
69686a4271fSThilina Rathnayake      subroutine bp1
69786a4271fSThilina RathnayakeC     Solution to BP1 using libCEED
69886a4271fSThilina Rathnayake      include 'SIZE'
69986a4271fSThilina Rathnayake      include 'TOTAL'
70086a4271fSThilina Rathnayake      include 'CTIMER'  ! ifsync
70186a4271fSThilina Rathnayake      include 'FDMH1'
70286a4271fSThilina Rathnayake      include 'ceedf.h'
70386a4271fSThilina Rathnayake
70486a4271fSThilina Rathnayake      parameter (lzq=lx1+1)
70586a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2),lq=lzq**ldim)
70686a4271fSThilina Rathnayake      common /bpgfactors/ gf(lg*lq,lelt),bmq(lq,lelt),w3mq(lq)
70786a4271fSThilina Rathnayake
70886a4271fSThilina Rathnayake      parameter (lt=lx1*ly1*lz1*lelt)
70986a4271fSThilina Rathnayake      parameter (ld=lxd*lyd*lzd*lelt)
71086a4271fSThilina Rathnayake      common /vcrns/ u1(lt),r1(lt),r2(lt),r3(lt)
71186a4271fSThilina Rathnayake      common /vcrny/ e1(lt)
71286a4271fSThilina Rathnayake      common /vcrvh/ h1(lt),h2(lx*lelt),pap(3)
71386a4271fSThilina Rathnayake      real*8 coords(ldim*lx*lelt)
71486a4271fSThilina Rathnayake
71586a4271fSThilina Rathnayake      logical ifh3
716e2b2c771Svaleria      integer*8 nnode
71786a4271fSThilina Rathnayake      integer ceed,err,test
71886a4271fSThilina Rathnayake      character*64 spec
71986a4271fSThilina Rathnayake
720e2b2c771Svaleria      integer p,q,ncomp,enode,lnode
72186a4271fSThilina Rathnayake      integer vec_p1,vec_ap1,vec_qdata,vec_coords,vec_rhs
72286a4271fSThilina Rathnayake      integer erstrctu,erstrctx,erstrctw
72386a4271fSThilina Rathnayake      integer basisu,basisx
72486a4271fSThilina Rathnayake      integer qf_mass,qf_setup
72586a4271fSThilina Rathnayake      integer op_mass,op_setup
72686a4271fSThilina Rathnayake      real*8  x,y,z
72786a4271fSThilina Rathnayake      integer*8 offset
72886a4271fSThilina Rathnayake
72986a4271fSThilina Rathnayake      external massf,masssetupf
73086a4271fSThilina Rathnayake
73186a4271fSThilina Rathnayake      ifield = 1
73286a4271fSThilina Rathnayake      nxq    = nx1+1
73386a4271fSThilina Rathnayake      n = nx1*ny1*nz1*nelt
73486a4271fSThilina Rathnayake
73586a4271fSThilina Rathnayake      ifsync = .false.
73686a4271fSThilina Rathnayake
73786a4271fSThilina RathnayakeC     Set up coordinates
73886a4271fSThilina Rathnayake      ii=0
73986a4271fSThilina Rathnayake      do j=0,nelt-1
74086a4271fSThilina Rathnayake      do i=1,lx
74186a4271fSThilina Rathnayake        ii=ii+1
74286a4271fSThilina Rathnayake        x = xm1(ii,1,1,1)
74386a4271fSThilina Rathnayake        y = ym1(ii,1,1,1)
74486a4271fSThilina Rathnayake        z = zm1(ii,1,1,1)
74586a4271fSThilina Rathnayake        coords(i+0*lx+3*j*lx)=x
74686a4271fSThilina Rathnayake        coords(i+1*lx+3*j*lx)=y
74786a4271fSThilina Rathnayake        coords(i+2*lx+3*j*lx)=z
74886a4271fSThilina Rathnayake      enddo
74986a4271fSThilina Rathnayake      enddo
75086a4271fSThilina Rathnayake
75186a4271fSThilina RathnayakeC     Init ceed library
75286a4271fSThilina Rathnayake      call get_spec(spec)
75386a4271fSThilina Rathnayake      call ceedinit(trim(spec)//char(0),ceed,err)
75486a4271fSThilina Rathnayake
75586a4271fSThilina Rathnayake      call get_test(test)
75686a4271fSThilina Rathnayake
75786a4271fSThilina RathnayakeC     Set up Nek geometry data
75886a4271fSThilina Rathnayake      call geodatq       (gf,bmq,w3mq,nxq)         ! Set up gf() arrays
75986a4271fSThilina Rathnayake      call set_h2_as_rhoJac_GL(h2,bmq,nxq)
76086a4271fSThilina Rathnayake
76186a4271fSThilina RathnayakeC     Set up true soln
76286a4271fSThilina Rathnayake      call dist_fld_h1   (e1)
76386a4271fSThilina Rathnayake      call copy          (h1,e1,n)                 ! Save exact soln in h1
76486a4271fSThilina Rathnayake
76586a4271fSThilina RathnayakeC     Set up solver parameters
76686a4271fSThilina Rathnayake      tol       = 1e-10
76786a4271fSThilina Rathnayake      param(22) = tol
76886a4271fSThilina Rathnayake      maxit     = 100
76986a4271fSThilina Rathnayake
77086a4271fSThilina Rathnayake      call nekgsync()
77186a4271fSThilina Rathnayake
77286a4271fSThilina RathnayakeC     Create ceed basis for mesh and computation
77386a4271fSThilina Rathnayake      p=nx1
77486a4271fSThilina Rathnayake      q=p+1
77586a4271fSThilina Rathnayake      ncomp=1
77686a4271fSThilina Rathnayake      call ceedbasiscreatetensorh1lagrange(ceed,ndim,ndim,p,q,
77786a4271fSThilina Rathnayake     $  ceed_gauss,basisx,err)
77886a4271fSThilina Rathnayake      call ceedbasiscreatetensorh1lagrange(ceed,ndim,ncomp,p,q,
77986a4271fSThilina Rathnayake     $  ceed_gauss,basisu,err)
78086a4271fSThilina Rathnayake
78186a4271fSThilina RathnayakeC     Create ceed element restrictions for mesh and computation
782e2b2c771Svaleria      enode=p**ldim
783e2b2c771Svaleria      lnode=enode*nelt*ncomp
784e2b2c771Svaleria      call ceedelemrestrictioncreateidentity(ceed,nelt,enode,lnode,
78586a4271fSThilina Rathnayake     $  ldim,erstrctx,err)
786e2b2c771Svaleria      call ceedelemrestrictioncreateidentity(ceed,nelt,enode,lnode,
78786a4271fSThilina Rathnayake     $  ncomp,erstrctu,err)
78886a4271fSThilina Rathnayake      call ceedelemrestrictioncreateidentity(ceed,nelt,q**ldim,
78986a4271fSThilina Rathnayake     $  nelt*q**ldim,1,erstrctw,err)
79086a4271fSThilina Rathnayake
79186a4271fSThilina RathnayakeC     Create ceed vectors
792e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_p1,err)
793e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_ap1,err)
794e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_rhs,err)
79586a4271fSThilina Rathnayake      call ceedvectorcreate(ceed,ldim*lx*nelt,vec_coords,err)
79686a4271fSThilina Rathnayake      call ceedvectorcreate(ceed,nelt*q**ldim,vec_qdata,err)
79786a4271fSThilina Rathnayake
79886a4271fSThilina Rathnayake      offset=0
79986a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_coords,ceed_mem_host,
80086a4271fSThilina Rathnayake     $  ceed_use_pointer,coords,offset,err)
80186a4271fSThilina Rathnayake
80286a4271fSThilina RathnayakeC     Create ceed qfunctions for masssetupf and massf
80386a4271fSThilina Rathnayake      call ceedqfunctioncreateinterior(ceed,1,masssetupf,
80486a4271fSThilina Rathnayake     $  __FILE__
80586a4271fSThilina Rathnayake     $  //':masssetupf',qf_setup,err)
80686a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'x',ldim,
80786a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
80886a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'dx',ldim,
80986a4271fSThilina Rathnayake     $  ceed_eval_grad,err)
81086a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'weight',1,
81186a4271fSThilina Rathnayake     $  ceed_eval_weight,err)
81286a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_setup,'rho',1,
81386a4271fSThilina Rathnayake     $  ceed_eval_none,err)
81486a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_setup,'rhs',1,
81586a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
81686a4271fSThilina Rathnayake
81786a4271fSThilina Rathnayake      call ceedqfunctioncreateinterior(ceed,1,massf,
81886a4271fSThilina Rathnayake     $  __FILE__
81986a4271fSThilina Rathnayake     $  //':massf',qf_mass,err)
82086a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_mass,'u',1,
82186a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
82286a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_mass,'rho',1,
82386a4271fSThilina Rathnayake     $  ceed_eval_none,err)
82486a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_mass,'v',1,
82586a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
82686a4271fSThilina Rathnayake
82786a4271fSThilina RathnayakeC     Create ceed operators
82886a4271fSThilina Rathnayake      call ceedoperatorcreate(ceed,qf_setup,
82986a4271fSThilina Rathnayake     $  ceed_null,ceed_null,op_setup,err)
83086a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'x',erstrctx,
83186a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_active,err)
83286a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'dx',erstrctx,
83386a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_active,err)
83486a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'weight',erstrctx,
83586a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_none,err)
83686a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'rho',erstrctw,
83786a4271fSThilina Rathnayake     $  ceed_notranspose,ceed_basis_collocated,
83886a4271fSThilina Rathnayake     $  ceed_vector_active,err)
83986a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'rhs',erstrctu,
84086a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,vec_rhs,err)
84186a4271fSThilina Rathnayake
84286a4271fSThilina Rathnayake      call ceedoperatorcreate(ceed,qf_mass,
84386a4271fSThilina Rathnayake     $  ceed_null,ceed_null,op_mass,err)
84486a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_mass,'u',erstrctu,
84586a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,ceed_vector_active,err)
84686a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_mass,'rho',erstrctw,
84786a4271fSThilina Rathnayake     $  ceed_notranspose,ceed_basis_collocated,
84886a4271fSThilina Rathnayake     $  vec_qdata,err)
84986a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_mass,'v',erstrctu,
85086a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,ceed_vector_active,err)
85186a4271fSThilina Rathnayake
85286a4271fSThilina RathnayakeC     Compute setup data
85386a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_rhs,ceed_mem_host,
85486a4271fSThilina Rathnayake     $  ceed_use_pointer,r1,offset,err)
85586a4271fSThilina Rathnayake      call ceedoperatorapply(op_setup,vec_coords,vec_qdata,
85686a4271fSThilina Rathnayake     $  ceed_request_immediate,err)
85786a4271fSThilina Rathnayake
85886a4271fSThilina RathnayakeC     Set up true RHS
85986a4271fSThilina Rathnayake      call dssum         (r1,nx1,ny1,nz1)          ! r1
86086a4271fSThilina Rathnayake
86186a4271fSThilina RathnayakeC     Set up algebraic RHS with libCEED
86286a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_p1,ceed_mem_host,
86386a4271fSThilina Rathnayake     $  ceed_use_pointer,h1,offset,err)
86486a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_ap1,ceed_mem_host,
86586a4271fSThilina Rathnayake     $  ceed_use_pointer,r2,offset,err)
86686a4271fSThilina Rathnayake      call ceedoperatorapply(op_mass,vec_p1,vec_ap1,
86786a4271fSThilina Rathnayake     $  ceed_request_immediate,err)                ! r2 = A_ceed*h1
86886a4271fSThilina Rathnayake      call dssum         (r2,nx1,ny1,nz1)
86986a4271fSThilina Rathnayake
87086a4271fSThilina RathnayakeC     Set up algebraic RHS with Nek5000
87186a4271fSThilina Rathnayake      call axhm1         (pap,r3,h1,h1,h2,'bp1')   ! r3 = A_nek5k*h1
87286a4271fSThilina Rathnayake      call dssum         (r3,nx1,ny1,nz1)
87386a4271fSThilina Rathnayake
87486a4271fSThilina Rathnayake      call nekgsync()
87586a4271fSThilina Rathnayake
87686a4271fSThilina RathnayakeC     Solve true RHS
87786a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "libCEED true RHS"
87886a4271fSThilina Rathnayake      tstart = dnekclock()
87986a4271fSThilina Rathnayake      call cggos(u1,r1,h1,h2,vmult,binvm1,tol,ceed,op_mass,
88086a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp1')
88186a4271fSThilina Rathnayake      tstop  = dnekclock()
88286a4271fSThilina Rathnayake
88386a4271fSThilina RathnayakeC     Output
88486a4271fSThilina Rathnayake      telaps = (tstop-tstart)
88586a4271fSThilina Rathnayake      maxits = maxit
88686a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
88786a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
88886a4271fSThilina Rathnayake
88986a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
89086a4271fSThilina Rathnayake        if (maxit>=100) then
89186a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
89286a4271fSThilina Rathnayake        endif
89386a4271fSThilina Rathnayake        if (dabs(er1)>5e-3) then
89486a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
89586a4271fSThilina Rathnayake        endif
89686a4271fSThilina Rathnayake      endif
89786a4271fSThilina Rathnayake
89886a4271fSThilina Rathnayake      nx     = nx1-1
899e2b2c771Svaleria      nnode  = nelgt            ! nnodes
900e2b2c771Svaleria      nnode  = nnode*(nx**ldim) ! nnodes
901e2b2c771Svaleria      nppp   = nnode/np         ! nnodes/proc
90286a4271fSThilina Rathnayake
903*05939c60Sjeremylt      dofps  = nnode/telaps     ! DOF/sec - scalar form
90486a4271fSThilina Rathnayake      titers = telaps/maxits    ! time per iteration
90586a4271fSThilina Rathnayake      tppp_s = titers/nppp      ! time per iteraton per local point
90686a4271fSThilina Rathnayake
90786a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
908*05939c60Sjeremylt     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s
90986a4271fSThilina Rathnayake
91086a4271fSThilina RathnayakeC     Solve libCEED algebraic RHS
91186a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "libCEED algebraic RHS"
91286a4271fSThilina Rathnayake      maxit = 100
91386a4271fSThilina Rathnayake      tstart = dnekclock()
91486a4271fSThilina Rathnayake      call cggos(u1,r2,h1,h2,vmult,binvm1,tol,ceed,op_mass,
91586a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp1')
91686a4271fSThilina Rathnayake      tstop  = dnekclock()
91786a4271fSThilina Rathnayake
91886a4271fSThilina RathnayakeC     Output
91986a4271fSThilina Rathnayake      telaps = (tstop-tstart)
92086a4271fSThilina Rathnayake      maxits = maxit
92186a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
92286a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
92386a4271fSThilina Rathnayake
92486a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
92586a4271fSThilina Rathnayake        if (maxit>=100) then
92686a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
92786a4271fSThilina Rathnayake        endif
92886a4271fSThilina Rathnayake        if (dabs(er1)>1e-5) then
92986a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
93086a4271fSThilina Rathnayake        endif
93186a4271fSThilina Rathnayake      endif
93286a4271fSThilina Rathnayake
93386a4271fSThilina Rathnayake      nx      = nx1-1
934e2b2c771Svaleria      nnode   = nelgt            ! nnodes
935e2b2c771Svaleria      nnode   = nnode*(nx**ldim) ! nnodes
936e2b2c771Svaleria      nppp    = nnode/np         ! nnodes/proc
93786a4271fSThilina Rathnayake
938*05939c60Sjeremylt      dofps   = nnode/telaps     ! DOF/sec - scalar form
93986a4271fSThilina Rathnayake      titers  = telaps/maxits    ! time per iteration
94086a4271fSThilina Rathnayake      tppp_s  = titers/nppp      ! time per iteraton per local point
94186a4271fSThilina Rathnayake
94286a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
943*05939c60Sjeremylt     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s
94486a4271fSThilina Rathnayake
94586a4271fSThilina RathnayakeC     Solve Nek5000 algebraic RHS
94686a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "Nek5000 algebraic RHS"
94786a4271fSThilina Rathnayake      maxit = 100
94886a4271fSThilina Rathnayake      tstart = dnekclock()
94986a4271fSThilina Rathnayake      call cggos(u1,r3,h1,h2,vmult,binvm1,tol,ceed,op_mass,
95086a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp1')
95186a4271fSThilina Rathnayake      tstop  = dnekclock()
95286a4271fSThilina Rathnayake
95386a4271fSThilina RathnayakeC     Output
95486a4271fSThilina Rathnayake      telaps = (tstop-tstart)
95586a4271fSThilina Rathnayake      maxits = maxit
95686a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
95786a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
95886a4271fSThilina Rathnayake
95986a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
96086a4271fSThilina Rathnayake        if (maxit>=100) then
96186a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
96286a4271fSThilina Rathnayake        endif
96386a4271fSThilina Rathnayake        if (dabs(er1)>1e-5) then
96486a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
96586a4271fSThilina Rathnayake        endif
96686a4271fSThilina Rathnayake      endif
96786a4271fSThilina Rathnayake
96886a4271fSThilina Rathnayake      nx      = nx1-1
969e2b2c771Svaleria      nnode   = nelgt            ! nnodes
970e2b2c771Svaleria      nnode   = nnode*(nx**ldim) ! nnodes
971e2b2c771Svaleria      nppp    = nnode/np         ! nnodes/proc
97286a4271fSThilina Rathnayake
973*05939c60Sjeremylt      dofps   = nnode/telaps     ! DOF/sec - scalar form
97486a4271fSThilina Rathnayake      titers  = telaps/maxits    ! time per iteration
97586a4271fSThilina Rathnayake      tppp_s  = titers/nppp      ! time per iteraton per local point
97686a4271fSThilina Rathnayake
97786a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
978*05939c60Sjeremylt     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s
97986a4271fSThilina Rathnayake
98086a4271fSThilina Rathnayake    1 format(a12,i7,i3,i7,i10,i14,i10,i4,1p4e13.5)
98186a4271fSThilina Rathnayake    3 format(i3,i9,e12.4,1x,a8,i9)
98286a4271fSThilina Rathnayake
98386a4271fSThilina RathnayakeC     Destroy ceed handles
98486a4271fSThilina Rathnayake      call ceedvectordestroy(vec_p1,err)
98586a4271fSThilina Rathnayake      call ceedvectordestroy(vec_ap1,err)
98686a4271fSThilina Rathnayake      call ceedvectordestroy(vec_rhs,err)
98786a4271fSThilina Rathnayake      call ceedvectordestroy(vec_qdata,err)
98886a4271fSThilina Rathnayake      call ceedvectordestroy(vec_coords,err)
98986a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctu,err)
99086a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctx,err)
99186a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctw,err)
99286a4271fSThilina Rathnayake      call ceedbasisdestroy(basisu,err)
99386a4271fSThilina Rathnayake      call ceedbasisdestroy(basisx,err)
99486a4271fSThilina Rathnayake      call ceedqfunctiondestroy(qf_setup,err)
99586a4271fSThilina Rathnayake      call ceedqfunctiondestroy(qf_mass,err)
99686a4271fSThilina Rathnayake      call ceedoperatordestroy(op_setup,err)
99786a4271fSThilina Rathnayake      call ceedoperatordestroy(op_mass,err)
99886a4271fSThilina Rathnayake      call ceeddestroy(ceed,err)
99986a4271fSThilina Rathnayake
100086a4271fSThilina Rathnayake      return
100186a4271fSThilina Rathnayake      end
100286a4271fSThilina RathnayakeC-----------------------------------------------------------------------
100386a4271fSThilina Rathnayake      subroutine bp3
100486a4271fSThilina RathnayakeC     Solution to BP3 using libCEED
100586a4271fSThilina Rathnayake      include 'SIZE'
100686a4271fSThilina Rathnayake      include 'TOTAL'
100786a4271fSThilina Rathnayake      include 'CTIMER'  ! ifsync
100886a4271fSThilina Rathnayake      include 'FDMH1'
100986a4271fSThilina Rathnayake      include 'ceedf.h'
101086a4271fSThilina Rathnayake
101186a4271fSThilina Rathnayake      parameter (lzq=lx1+1)
101286a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2),lq=lzq**ldim)
101386a4271fSThilina Rathnayake      common /bpgfactors/ gf(lg*lq,lelt),bmq(lq,lelt),w3mq(lq)
101486a4271fSThilina Rathnayake
101586a4271fSThilina Rathnayake      parameter (lt=lx1*ly1*lz1*lelt)
101686a4271fSThilina Rathnayake      parameter (ld=lxd*lyd*lzd*lelt)
101786a4271fSThilina Rathnayake      common /vcrns/ u1(lt),r1(lt),r2(lt),r3(lt)
101886a4271fSThilina Rathnayake      common /vcrny/ e1(lt)
101986a4271fSThilina Rathnayake      common /vcrvh/ h1(lt),h2(ld),pap(3)
102086a4271fSThilina Rathnayake      real*8 coords(ldim*lx*lelt)
102186a4271fSThilina Rathnayake
102286a4271fSThilina Rathnayake      logical ifh3
1023e2b2c771Svaleria      integer*8 nnode
102486a4271fSThilina Rathnayake      integer ceed,err,test
102586a4271fSThilina Rathnayake      character*64 spec
102686a4271fSThilina Rathnayake
1027e2b2c771Svaleria      integer p,q,ncomp,enode,lnode
102886a4271fSThilina Rathnayake      integer vec_p1,vec_ap1,vec_qdata,vec_coords,vec_rhs
102986a4271fSThilina Rathnayake      integer erstrctu,erstrctx,erstrctw
103086a4271fSThilina Rathnayake      integer basisu,basisx
103186a4271fSThilina Rathnayake      integer qf_diffusion,qf_setup
103286a4271fSThilina Rathnayake      integer op_diffusion,op_setup
103386a4271fSThilina Rathnayake      integer ii,i,ngeo
103486a4271fSThilina Rathnayake      real*8  x,y,z
103586a4271fSThilina Rathnayake      integer*8 offset
103686a4271fSThilina Rathnayake
103786a4271fSThilina Rathnayake      external diffusionf,diffsetupf
103886a4271fSThilina Rathnayake
103986a4271fSThilina Rathnayake      ifield = 1
104086a4271fSThilina Rathnayake      nxq    = nx1+1
104186a4271fSThilina Rathnayake      n = nx1*ny1*nz1*nelt
104286a4271fSThilina Rathnayake
104386a4271fSThilina Rathnayake      ifsync = .false.
104486a4271fSThilina Rathnayake
104586a4271fSThilina RathnayakeC     Set up coordinates and mask
104686a4271fSThilina Rathnayake      ii=0
104786a4271fSThilina Rathnayake      do j=0,nelt-1
104886a4271fSThilina Rathnayake      do i=1,lx
104986a4271fSThilina Rathnayake        ii=ii+1
105086a4271fSThilina Rathnayake        x = xm1(ii,1,1,1)
105186a4271fSThilina Rathnayake        y = ym1(ii,1,1,1)
105286a4271fSThilina Rathnayake        z = zm1(ii,1,1,1)
105386a4271fSThilina Rathnayake        coords(i+0*lx+3*j*lx)=x
105486a4271fSThilina Rathnayake        coords(i+1*lx+3*j*lx)=y
105586a4271fSThilina Rathnayake        coords(i+2*lx+3*j*lx)=z
105686a4271fSThilina Rathnayake        if ( x.eq.0.or.x.eq.1
105786a4271fSThilina Rathnayake     $   .or.y.eq.0.or.y.eq.1
105886a4271fSThilina Rathnayake     $   .or.z.eq.0.or.z.eq.1 ) then
105986a4271fSThilina Rathnayake          h2(ii)=0.
106086a4271fSThilina Rathnayake        else
106186a4271fSThilina Rathnayake          h2(ii)=1.
106286a4271fSThilina Rathnayake        endif
106386a4271fSThilina Rathnayake      enddo
106486a4271fSThilina Rathnayake      enddo
106586a4271fSThilina Rathnayake
106686a4271fSThilina RathnayakeC     Init ceed library
106786a4271fSThilina Rathnayake      call get_spec(spec)
106886a4271fSThilina Rathnayake      call ceedinit(trim(spec)//char(0),ceed,err)
106986a4271fSThilina Rathnayake
107086a4271fSThilina Rathnayake      call get_test(test)
107186a4271fSThilina Rathnayake
107286a4271fSThilina RathnayakeC     Set up Nek geometry data
107386a4271fSThilina Rathnayake      call geodatq       (gf,bmq,w3mq,nxq)         ! Set up gf() arrays
107486a4271fSThilina Rathnayake
107586a4271fSThilina RathnayakeC     Set up true soln
107686a4271fSThilina Rathnayake      call sin_fld_h1    (e1)
107786a4271fSThilina Rathnayake      call xmask1        (e1,h2,nelt)
107886a4271fSThilina Rathnayake      call copy          (h1,e1,n)                 ! Save exact soln in h1
107986a4271fSThilina Rathnayake
108086a4271fSThilina RathnayakeC     Set up solver parameters
108186a4271fSThilina Rathnayake      tol       = 1e-10
108286a4271fSThilina Rathnayake      param(22) = tol
108386a4271fSThilina Rathnayake      maxit     = 100
108486a4271fSThilina Rathnayake
108586a4271fSThilina Rathnayake      call nekgsync()
108686a4271fSThilina Rathnayake
108786a4271fSThilina RathnayakeC     Create ceed basis for mesh and computation
108886a4271fSThilina Rathnayake      p=nx1
108986a4271fSThilina Rathnayake      q=p+1
109086a4271fSThilina Rathnayake      ncomp=1
109186a4271fSThilina Rathnayake      call ceedbasiscreatetensorh1lagrange(ceed,ldim,3*ncomp,p,q,
109286a4271fSThilina Rathnayake     $  ceed_gauss,basisx,err)
109386a4271fSThilina Rathnayake      call ceedbasiscreatetensorh1lagrange(ceed,ldim,ncomp,p,q,
109486a4271fSThilina Rathnayake     $  ceed_gauss,basisu,err)
109586a4271fSThilina Rathnayake
109686a4271fSThilina RathnayakeC     Create ceed element restrictions for mesh and computation
1097e2b2c771Svaleria      enode=p**ldim
1098e2b2c771Svaleria      lnode=enode*nelt*ncomp
109986a4271fSThilina Rathnayake      ngeo=(ldim*(ldim+1))/2
1100e2b2c771Svaleria      call ceedelemrestrictioncreateidentity(ceed,nelt,enode,lnode,
110186a4271fSThilina Rathnayake     $  ldim,erstrctx,err)
1102e2b2c771Svaleria      call ceedelemrestrictioncreateidentity(ceed,nelt,enode,lnode,
110386a4271fSThilina Rathnayake     $  ncomp,erstrctu,err)
110486a4271fSThilina Rathnayake      call ceedelemrestrictioncreateidentity(ceed,nelt,q**ldim,
110586a4271fSThilina Rathnayake     $  nelt*q**ldim,ngeo,erstrctw,err)
110686a4271fSThilina Rathnayake
110786a4271fSThilina RathnayakeC     Create ceed vectors
1108e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_p1,err)
1109e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_ap1,err)
1110e2b2c771Svaleria      call ceedvectorcreate(ceed,lnode,vec_rhs,err)
111186a4271fSThilina Rathnayake      call ceedvectorcreate(ceed,ldim*lx*nelt,vec_coords,err)
111286a4271fSThilina Rathnayake      call ceedvectorcreate(ceed,nelt*ngeo*q**ldim,vec_qdata,err)
111386a4271fSThilina Rathnayake
111486a4271fSThilina Rathnayake      offset=0
111586a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_coords,ceed_mem_host,
111686a4271fSThilina Rathnayake     $  ceed_use_pointer,coords,offset,err)
111786a4271fSThilina Rathnayake
111886a4271fSThilina RathnayakeC     Create ceed qfunctions for diffsetupf and diffusionf
111986a4271fSThilina Rathnayake      call ceedqfunctioncreateinterior(ceed,1,diffsetupf,
112086a4271fSThilina Rathnayake     $  __FILE__
112186a4271fSThilina Rathnayake     $  //':diffsetupf'//char(0),qf_setup,err)
112286a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'x',ldim,
112386a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
112486a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'dx',ldim,
112586a4271fSThilina Rathnayake     $  ceed_eval_grad,err)
112686a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_setup,'weight',1,
112786a4271fSThilina Rathnayake     $  ceed_eval_weight,err)
112886a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_setup,'rho',ngeo,
112986a4271fSThilina Rathnayake     $  ceed_eval_none,err)
113086a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_setup,'rhs',1,
113186a4271fSThilina Rathnayake     $  ceed_eval_interp,err)
113286a4271fSThilina Rathnayake
113386a4271fSThilina Rathnayake      call ceedqfunctioncreateinterior(ceed,1,diffusionf,
113486a4271fSThilina Rathnayake     $  __FILE__
113586a4271fSThilina Rathnayake     $  //':diffusionf'//char(0),qf_diffusion,err)
113686a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_diffusion,'u',1,
113786a4271fSThilina Rathnayake     $  ceed_eval_grad,err)
113886a4271fSThilina Rathnayake      call ceedqfunctionaddinput(qf_diffusion,'rho',ngeo,
113986a4271fSThilina Rathnayake     $  ceed_eval_none,err)
114086a4271fSThilina Rathnayake      call ceedqfunctionaddoutput(qf_diffusion,'v',1,
114186a4271fSThilina Rathnayake     $  ceed_eval_grad,err)
114286a4271fSThilina Rathnayake
114386a4271fSThilina RathnayakeC     Create ceed operators
114486a4271fSThilina Rathnayake      call ceedoperatorcreate(ceed,qf_setup,
114586a4271fSThilina Rathnayake     $  ceed_null,ceed_null,op_setup,err)
114686a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'x',erstrctx,
114786a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_active,err)
114886a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'dx',erstrctx,
114986a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_active,err)
115086a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'weight',erstrctx,
115186a4271fSThilina Rathnayake     $  ceed_notranspose,basisx,ceed_vector_none,err)
115286a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'rho',erstrctw,
115386a4271fSThilina Rathnayake     $  ceed_notranspose,ceed_basis_collocated,
115486a4271fSThilina Rathnayake     $  ceed_vector_active,err)
115586a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_setup,'rhs',erstrctu,
115686a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,vec_rhs,err)
115786a4271fSThilina Rathnayake
115886a4271fSThilina Rathnayake      call ceedoperatorcreate(ceed,qf_diffusion,
115986a4271fSThilina Rathnayake     $  ceed_null,ceed_null,op_diffusion,err)
116086a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_diffusion,'u',erstrctu,
116186a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,ceed_vector_active,err)
116286a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_diffusion,'rho',erstrctw,
116386a4271fSThilina Rathnayake     $  ceed_notranspose,ceed_basis_collocated,
116486a4271fSThilina Rathnayake     $  vec_qdata,err)
116586a4271fSThilina Rathnayake      call ceedoperatorsetfield(op_diffusion,'v',erstrctu,
116686a4271fSThilina Rathnayake     $  ceed_notranspose,basisu,ceed_vector_active,err)
116786a4271fSThilina Rathnayake
116886a4271fSThilina RathnayakeC     Compute setup data
116986a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_rhs,ceed_mem_host,
117086a4271fSThilina Rathnayake     $  ceed_use_pointer,r1,offset,err)
117186a4271fSThilina Rathnayake      call ceedoperatorapply(op_setup,vec_coords,vec_qdata,
117286a4271fSThilina Rathnayake     $  ceed_request_immediate,err)
117386a4271fSThilina Rathnayake
117486a4271fSThilina RathnayakeC     Set up true RHS
117586a4271fSThilina Rathnayake      call dssum         (r1,nx1,ny1,nz1)          ! r1
117686a4271fSThilina Rathnayake      call xmask1        (r1,h2,nelt)
117786a4271fSThilina Rathnayake
117886a4271fSThilina RathnayakeC     Set up algebraic RHS with libCEED
117986a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_p1,ceed_mem_host,
118086a4271fSThilina Rathnayake     $  ceed_use_pointer,h1,offset,err)
118186a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_ap1,ceed_mem_host,
118286a4271fSThilina Rathnayake     $  ceed_use_pointer,r2,offset,err)
118386a4271fSThilina Rathnayake      call ceedoperatorapply(op_diffusion,vec_p1,vec_ap1,
118486a4271fSThilina Rathnayake     $  ceed_request_immediate,err)                ! r2 = A_ceed*h1
118586a4271fSThilina Rathnayake      call dssum         (r2,nx1,ny1,nz1)
118686a4271fSThilina Rathnayake      call xmask1        (r2,h2,nelt)
118786a4271fSThilina Rathnayake
118886a4271fSThilina RathnayakeC     Set up algebraic RHS with Nek5000
118986a4271fSThilina Rathnayake      call axhm1         (pap,r3,h1,h1,h2,'bp3')   ! r3 = A_nek5k*h1
119086a4271fSThilina Rathnayake      call dssum         (r3,nx1,ny1,nz1)
119186a4271fSThilina Rathnayake      call xmask1        (r3,h2,nelt)
119286a4271fSThilina Rathnayake
119386a4271fSThilina Rathnayake      call nekgsync()
119486a4271fSThilina Rathnayake
119586a4271fSThilina RathnayakeC     Solve true RHS
119686a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "libCEED true RHS"
119786a4271fSThilina Rathnayake      tstart = dnekclock()
119886a4271fSThilina Rathnayake      call cggos(u1,r1,h1,h2,vmult,binvm1,tol,ceed,op_diffusion,
119986a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp3')
120086a4271fSThilina Rathnayake      tstop  = dnekclock()
120186a4271fSThilina Rathnayake
120286a4271fSThilina RathnayakeC     Output
120386a4271fSThilina Rathnayake      telaps = (tstop-tstart)
120486a4271fSThilina Rathnayake      maxits = maxit
120586a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
120686a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
120786a4271fSThilina Rathnayake
120886a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
120986a4271fSThilina Rathnayake        if (maxit>=100) then
121086a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
121186a4271fSThilina Rathnayake        endif
121286a4271fSThilina Rathnayake        if (dabs(er1)>1e-3) then
121386a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
121486a4271fSThilina Rathnayake        endif
121586a4271fSThilina Rathnayake      endif
121686a4271fSThilina Rathnayake
121786a4271fSThilina Rathnayake      nx      = nx1-1
1218e2b2c771Svaleria      nnode   = nelgt            ! nnodes
1219e2b2c771Svaleria      nnode   = nnode*(nx**ldim) ! nnodes
1220e2b2c771Svaleria      nppp    = nnode/np         ! nnodes/proc
122186a4271fSThilina Rathnayake
1222*05939c60Sjeremylt      dofps   = nnode/telaps     ! DOF/sec - scalar form
122386a4271fSThilina Rathnayake      titers  = telaps/maxits    ! time per iteration
122486a4271fSThilina Rathnayake      tppp_s  = titers/nppp      ! time per iteraton per local point
122586a4271fSThilina Rathnayake
122686a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
1227*05939c60Sjeremylt     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s
122886a4271fSThilina Rathnayake
122986a4271fSThilina RathnayakeC     Solve libCEED algebraic RHS
123086a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "libCEED algebraic RHS"
123186a4271fSThilina Rathnayake      maxit = 100
123286a4271fSThilina Rathnayake      tstart = dnekclock()
123386a4271fSThilina Rathnayake      call cggos(u1,r2,h1,h2,vmult,binvm1,tol,ceed,op_diffusion,
123486a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp3')
123586a4271fSThilina Rathnayake      tstop  = dnekclock()
123686a4271fSThilina Rathnayake
123786a4271fSThilina RathnayakeC     Output
123886a4271fSThilina Rathnayake      telaps = (tstop-tstart)
123986a4271fSThilina Rathnayake      maxits = maxit
124086a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
124186a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
124286a4271fSThilina Rathnayake
124386a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
124486a4271fSThilina Rathnayake        if (maxit>=100) then
124586a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
124686a4271fSThilina Rathnayake        endif
124786a4271fSThilina Rathnayake        if (dabs(er1)>1e-9) then
124886a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
124986a4271fSThilina Rathnayake        endif
125086a4271fSThilina Rathnayake      endif
125186a4271fSThilina Rathnayake
125286a4271fSThilina Rathnayake      nx      = nx1-1
1253e2b2c771Svaleria      nnode   = nelgt            ! nnodes
1254e2b2c771Svaleria      nnode   = nnode*(nx**ldim) ! nnodes
1255e2b2c771Svaleria      nppp    = nnode/np         ! nnodes/proc
125686a4271fSThilina Rathnayake
1257*05939c60Sjeremylt      dofps   = nnode/telaps     ! DOF/sec - scalar form
125886a4271fSThilina Rathnayake      titers  = telaps/maxits    ! time per iteration
125986a4271fSThilina Rathnayake      tppp_s  = titers/nppp      ! time per iteraton per local point
126086a4271fSThilina Rathnayake
126186a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
1262*05939c60Sjeremylt     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s
126386a4271fSThilina Rathnayake
126486a4271fSThilina RathnayakeC     Solve Nek5000 algebraic RHS
126586a4271fSThilina Rathnayake      if (nid.eq.0) write (6,*) "Nek5000 algebraic RHS"
126686a4271fSThilina Rathnayake      maxit = 100
126786a4271fSThilina Rathnayake      tstart = dnekclock()
126886a4271fSThilina Rathnayake      call cggos(u1,r3,h1,h2,vmult,binvm1,tol,ceed,op_diffusion,
126986a4271fSThilina Rathnayake     $  vec_p1,vec_ap1,maxit,'bp3')
127086a4271fSThilina Rathnayake      tstop  = dnekclock()
127186a4271fSThilina Rathnayake
127286a4271fSThilina RathnayakeC     Output
127386a4271fSThilina Rathnayake      telaps = (tstop-tstart)
127486a4271fSThilina Rathnayake      maxits = maxit
127586a4271fSThilina Rathnayake      er1 = glrdif(u1,e1,n)
127686a4271fSThilina Rathnayake      if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit
127786a4271fSThilina Rathnayake
127886a4271fSThilina Rathnayake      if (test.eq.1.and.nid.eq.0) then
127986a4271fSThilina Rathnayake        if (maxit>=100) then
128086a4271fSThilina Rathnayake          write(6,*) "UNCONVERGED CG"
128186a4271fSThilina Rathnayake        endif
128286a4271fSThilina Rathnayake        if (dabs(er1)>1e-9) then
128386a4271fSThilina Rathnayake          write(6,*) "ERROR IS TOO LARGE"
128486a4271fSThilina Rathnayake        endif
128586a4271fSThilina Rathnayake      endif
128686a4271fSThilina Rathnayake
128786a4271fSThilina Rathnayake      nx     = nx1-1
1288e2b2c771Svaleria      nnode   = nelgt           ! nnodes
1289e2b2c771Svaleria      nnode   = nnode*(nx**ldim) ! nnodes
1290e2b2c771Svaleria      nppp   = nnode/np         ! nnodes/proc
129186a4271fSThilina Rathnayake
1292e2b2c771Svaleria      nodepss = nnode/telaps     ! DOF/sec - scalar form
129386a4271fSThilina Rathnayake      titers = telaps/maxits   ! time per iteration
129486a4271fSThilina Rathnayake      tppp_s = titers/nppp     ! time per iteraton per local point
129586a4271fSThilina Rathnayake
129686a4271fSThilina Rathnayake      if (nid.eq.0) write(6,1) 'case scalar:'
1297e2b2c771Svaleria     $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,nodepss,titers,tppp_s
129886a4271fSThilina Rathnayake
129986a4271fSThilina Rathnayake    1 format(a12,i7,i3,i7,i10,i14,i10,i4,1p4e13.5)
130086a4271fSThilina Rathnayake    3 format(i3,i9,e12.4,1x,a8,i9)
130186a4271fSThilina Rathnayake
130286a4271fSThilina RathnayakeC     Destroy ceed handles
130386a4271fSThilina Rathnayake      call ceedvectordestroy(vec_p1,err)
130486a4271fSThilina Rathnayake      call ceedvectordestroy(vec_ap1,err)
130586a4271fSThilina Rathnayake      call ceedvectordestroy(vec_rhs,err)
130686a4271fSThilina Rathnayake      call ceedvectordestroy(vec_qdata,err)
130786a4271fSThilina Rathnayake      call ceedvectordestroy(vec_coords,err)
130886a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctu,err)
130986a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctx,err)
131086a4271fSThilina Rathnayake      call ceedelemrestrictiondestroy(erstrctw,err)
131186a4271fSThilina Rathnayake      call ceedbasisdestroy(basisu,err)
131286a4271fSThilina Rathnayake      call ceedbasisdestroy(basisx,err)
131386a4271fSThilina Rathnayake      call ceedqfunctiondestroy(qf_setup,err)
131486a4271fSThilina Rathnayake      call ceedqfunctiondestroy(qf_diffusion,err)
131586a4271fSThilina Rathnayake      call ceedoperatordestroy(op_setup,err)
131686a4271fSThilina Rathnayake      call ceedoperatordestroy(op_diffusion,err)
131786a4271fSThilina Rathnayake      call ceeddestroy(ceed,err)
131886a4271fSThilina Rathnayake
131986a4271fSThilina Rathnayake      return
132086a4271fSThilina Rathnayake      end
132186a4271fSThilina RathnayakeC-----------------------------------------------------------------------
132286a4271fSThilina Rathnayake      subroutine cggos(u1,r1,h1,h2,rmult,binv,tin,ceed,ceed_op,vec_p1,
132386a4271fSThilina Rathnayake     $  vec_ap1,maxit,bpname)
132486a4271fSThilina RathnayakeC     Scalar conjugate gradient iteration for solution of uncoupled
132586a4271fSThilina RathnayakeC     Helmholtz equations
132686a4271fSThilina RathnayakeC     Input: r1,h1,h2,rmult,binv,tin,ceed,ceed_op,vec_p1,vec_ap1,bpname
132786a4271fSThilina RathnayakeC     Output: u1,maxit
132886a4271fSThilina Rathnayake      include 'SIZE'
132986a4271fSThilina Rathnayake      include 'TOTAL'
133086a4271fSThilina Rathnayake      include 'DOMAIN'
133186a4271fSThilina Rathnayake      include 'FDMH1'
133286a4271fSThilina Rathnayake      character*3 bpname
133386a4271fSThilina Rathnayake
133486a4271fSThilina RathnayakeC     INPUT:  rhs1 - rhs
133586a4271fSThilina RathnayakeC             h1   - exact solution
133686a4271fSThilina Rathnayake
133786a4271fSThilina Rathnayake      parameter (lt=lx1*ly1*lz1*lelt)
133886a4271fSThilina Rathnayake      parameter (ld=lxd*lyd*lzd*lelt)
133986a4271fSThilina Rathnayake      real*8 u1(lt),r1(lt),h1(lt),h2(lt)
134086a4271fSThilina Rathnayake      real*8 rmult(1),binv(1)
134186a4271fSThilina Rathnayake      integer ceed,ceed_op,vec_ap1,vec_p1
134286a4271fSThilina Rathnayake      common /scrcg/ dpc(lt),p1(lt),z1(lt)
134386a4271fSThilina Rathnayake      common /scrca/ wv(4),wk(4),rpp1(4),rpp2(4),alph(4),beta(4),pap(4)
134486a4271fSThilina Rathnayake
134586a4271fSThilina Rathnayake      real*8 ap1(lt)
134686a4271fSThilina Rathnayake      equivalence (ap1,z1)
134786a4271fSThilina Rathnayake
134886a4271fSThilina Rathnayake      vol   = volfld(ifield)
134986a4271fSThilina Rathnayake      nel   = nelfld(ifield)
135086a4271fSThilina Rathnayake      nxyz  = lx1*ly1*lz1
135186a4271fSThilina Rathnayake      n     = nxyz*nel
135286a4271fSThilina Rathnayake      nx    = nx1-1                  ! Polynomial order (just for i/o)
135386a4271fSThilina Rathnayake
135486a4271fSThilina Rathnayake      tol=tin
135586a4271fSThilina Rathnayake
135686a4271fSThilina Rathnayake      if(bpname.ne.'bp1') then
135786a4271fSThilina Rathnayake        call setprecn_bp3(dpc,h1,h2) ! Set up diagional pre-conidtioner
135886a4271fSThilina Rathnayake      else
135986a4271fSThilina Rathnayake        call setprecn_bp1(dpc,h1,h2) ! Set up diagional pre-conidtioner
136086a4271fSThilina Rathnayake      endif
136186a4271fSThilina Rathnayake
136286a4271fSThilina Rathnayake      call rzero         (u1,n)      ! Initialize solution
136386a4271fSThilina Rathnayake
136486a4271fSThilina Rathnayake      wv(1)=0
136586a4271fSThilina Rathnayake      do i=1,n
136686a4271fSThilina Rathnayake         s=rmult(i)                  !      -1
136786a4271fSThilina Rathnayake         p1(i)=dpc(i)*r1(i)          ! p = M  r      T
136886a4271fSThilina Rathnayake         wv(1)=wv(1)+s*p1(i)*r1(i)   !              r p
136986a4271fSThilina Rathnayake      enddo
137086a4271fSThilina Rathnayake      call gop(wv(1),wk,'+  ',1)
137186a4271fSThilina Rathnayake      rpp1(1) = wv  (1)
137286a4271fSThilina Rathnayake
137386a4271fSThilina Rathnayake      do 1000 iter=1,maxit
137486a4271fSThilina Rathnayake         call axhm1_ceed (pap,ap1,p1,h1,h2,ceed,ceed_op,
137586a4271fSThilina Rathnayake     $     vec_ap1,vec_p1)
137686a4271fSThilina Rathnayake         call dssum    (ap1,nx1,ny1,nz1)
137786a4271fSThilina Rathnayake         if (bpname.ne.'bp1') call xmask1(ap1,h2,nel)
137886a4271fSThilina Rathnayake
137986a4271fSThilina Rathnayake         call gop      (pap,wk,'+  ',1)
138086a4271fSThilina Rathnayake         alph(1) = rpp1(1)/pap(1)
138186a4271fSThilina Rathnayake
138286a4271fSThilina Rathnayake         do i=1,n
138386a4271fSThilina Rathnayake            u1(i)=u1(i)+alph(1)* p1(i)
138486a4271fSThilina Rathnayake            r1(i)=r1(i)-alph(1)*ap1(i)
138586a4271fSThilina Rathnayake         enddo
138686a4271fSThilina Rathnayake
138786a4271fSThilina RathnayakeC        tolerance check here
138886a4271fSThilina Rathnayake         call rzero(wv,2)
138986a4271fSThilina Rathnayake         do i=1,n
139086a4271fSThilina Rathnayake            wv(1)=wv(1)+r1(i)*r1(i)            ! L2 error estimate
139186a4271fSThilina Rathnayake            z1(i)=dpc(i)*r1(i)                 ! z = M  r
139286a4271fSThilina Rathnayake            wv(2)=wv(2)+rmult(i)*z1(i)*r1(i)   ! r z
139386a4271fSThilina Rathnayake         enddo
139486a4271fSThilina Rathnayake         call gop(wv,wk,'+  ',2)
139586a4271fSThilina Rathnayake
139686a4271fSThilina RathnayakeC        if (nio.eq.0) write(6,1) ifield,istep,iter,nx,(wv(k),k=1,1)
139786a4271fSThilina Rathnayake  1     format(i2,i9,i5,i4,1p1e12.4,' cggos')
139886a4271fSThilina Rathnayake
139986a4271fSThilina Rathnayake         enorm=sqrt(wv(1))
140086a4271fSThilina Rathnayake         if (enorm.lt.tol) then
140186a4271fSThilina Rathnayake            ifin = iter
140286a4271fSThilina Rathnayake            if (nio.eq.0) write(6,3000) istep,ifin,enorm,tol
140386a4271fSThilina Rathnayake            goto 9999
140486a4271fSThilina Rathnayake         endif
140586a4271fSThilina RathnayakeC        if (nio.eq.0) write(6,2) iter,enorm,alph(1),pap(1),'alpha'
140686a4271fSThilina Rathnayake 2      format(i5,1p3e12.4,2x,a5)
140786a4271fSThilina Rathnayake
140886a4271fSThilina Rathnayake         rpp2(1)=rpp1(1)
140986a4271fSThilina Rathnayake         rpp1(1)=wv  (2)
141086a4271fSThilina Rathnayake         beta1  =rpp1(1)/rpp2(1)
141186a4271fSThilina Rathnayake         do i=1,n
141286a4271fSThilina Rathnayake            p1(i)=z1(i) + beta1*p1(i)
141386a4271fSThilina Rathnayake         enddo
141486a4271fSThilina Rathnayake
141586a4271fSThilina Rathnayake 1000 continue
141686a4271fSThilina Rathnayake
141786a4271fSThilina Rathnayake      rbnorm=sqrt(wv(1))
141886a4271fSThilina Rathnayake      if (nio.eq.0) write (6,3001) istep,iter,rbnorm,tol
141986a4271fSThilina Rathnayake      iter = iter-1
142086a4271fSThilina Rathnayake
142186a4271fSThilina Rathnayake 9999 continue
142286a4271fSThilina Rathnayake
142386a4271fSThilina Rathnayake      maxit=iter
142486a4271fSThilina Rathnayake
142586a4271fSThilina Rathnayake 3000 format(i12,1x,'cggo scalar:',i6,1p5e13.4)
142686a4271fSThilina Rathnayake 3001 format(2i6,' Unconverged cggo scalar: rbnorm =',1p2e13.6)
142786a4271fSThilina Rathnayake
142886a4271fSThilina Rathnayake      return
142986a4271fSThilina Rathnayake      end
143086a4271fSThilina RathnayakeC-----------------------------------------------------------------------
143186a4271fSThilina Rathnayake      subroutine axhm1_ceed(pap,ap1,p1,h1,h2,ceed,ceed_op,
143286a4271fSThilina Rathnayake     $  vec_ap1,vec_p1)
143386a4271fSThilina RathnayakeC     Vector conjugate gradient matvec for solution of uncoupled
143486a4271fSThilina RathnayakeC     Helmholtz equations
143586a4271fSThilina RathnayakeC     Input: pap,p1,h1,h2,bpname,ceed,ceed_op,vec_ap1,vec_p1
143686a4271fSThilina RathnayakeC     Output: ap1
143786a4271fSThilina Rathnayake      include 'SIZE'
143886a4271fSThilina Rathnayake      include 'TOTAL'
143986a4271fSThilina Rathnayake      include 'ceedf.h'
144086a4271fSThilina Rathnayake
144186a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2))
144286a4271fSThilina Rathnayake      real*8       gf(lg,lx,lelt)             ! Equivalence new gf() data
144386a4271fSThilina Rathnayake      equivalence (gf,g1m1)                   ! layout to g1m1...g6m1
144486a4271fSThilina Rathnayake
144586a4271fSThilina Rathnayake      real*8   pap(3)
144686a4271fSThilina Rathnayake      real*8   ap1(lx,lelt)
144786a4271fSThilina Rathnayake      real*8    p1(lx,lelt)
144886a4271fSThilina Rathnayake      real*8    h1(lx,lelt),h2(lx,lelt)
144986a4271fSThilina Rathnayake      integer ceed,ceed_op,vec_ap1,vec_p1,err
145086a4271fSThilina Rathnayake      integer i,e
145186a4271fSThilina Rathnayake      integer*8 offset
145286a4271fSThilina Rathnayake
145386a4271fSThilina Rathnayake      offset=0
145486a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_p1,ceed_mem_host,ceed_use_pointer,
145586a4271fSThilina Rathnayake     $  p1,offset,err)
145686a4271fSThilina Rathnayake      call ceedvectorsetarray(vec_ap1,ceed_mem_host,ceed_use_pointer,
145786a4271fSThilina Rathnayake     $  ap1,offset,err)
145886a4271fSThilina Rathnayake
145986a4271fSThilina Rathnayake      call ceedoperatorapply(ceed_op,vec_p1,vec_ap1,
146086a4271fSThilina Rathnayake     $  ceed_request_immediate,err)
146186a4271fSThilina Rathnayake
146286a4271fSThilina Rathnayake      call ceedvectorsyncarray(vec_ap1,ceed_mem_host,err)
146386a4271fSThilina Rathnayake
146486a4271fSThilina Rathnayake      pap(1)=0.
146586a4271fSThilina Rathnayake
146686a4271fSThilina Rathnayake      do e=1,nelt
146786a4271fSThilina Rathnayake         do i=1,lx
146886a4271fSThilina Rathnayake           pap(1)=pap(1)+ap1(i,e)*p1(i,e)
146986a4271fSThilina Rathnayake         enddo
147086a4271fSThilina Rathnayake      enddo
147186a4271fSThilina Rathnayake
147286a4271fSThilina Rathnayake      return
147386a4271fSThilina Rathnayake      end
147486a4271fSThilina RathnayakeC-----------------------------------------------------------------------
147586a4271fSThilina Rathnayake      subroutine ax_e_bp1(w,u,g,h1,h2,b,ju,us,ut)
147686a4271fSThilina RathnayakeC     Local matrix-vector for solution of BP3 (stiffness matrix)
147786a4271fSThilina RathnayakeC     Input: u,g,h1,h2,b,ju,us,ut   Output: w
147886a4271fSThilina Rathnayake      include 'SIZE'
147986a4271fSThilina Rathnayake      include 'TOTAL'
148086a4271fSThilina Rathnayake
148186a4271fSThilina Rathnayake      parameter (lxyz=lx1*ly1*lz1,lg=3+3*(ldim-2))
148286a4271fSThilina Rathnayake      real*8 w(lxyz),u(lxyz),g(lg,lxyz),h1(lxyz),h2(lxyz),b(lxyz)
148386a4271fSThilina Rathnayake      real*8 ju(lxyz),us(lxyz),ut(lxyz)
148486a4271fSThilina Rathnayake
148586a4271fSThilina Rathnayake      nxq = nx1+1 ! Number of quadrature points
148686a4271fSThilina Rathnayake
148786a4271fSThilina Rathnayake      lxyzq = nxq**ldim
148886a4271fSThilina Rathnayake
148986a4271fSThilina Rathnayake      call intp_rstd (ju,u,lx1,nxq,if3d,0) ! 0 --> Fwd interpolation
149086a4271fSThilina Rathnayake      do i=1,lxyzq
149186a4271fSThilina Rathnayake         ju(i)=ju(i)*h2(i) !! h2 must be on the fine grid, w/ quad wts
149286a4271fSThilina Rathnayake      enddo
149386a4271fSThilina Rathnayake      call intp_rstd (w,ju,lx1,nxq,if3d,1) ! 1 --> ju-->u
149486a4271fSThilina Rathnayake
149586a4271fSThilina Rathnayake      return
149686a4271fSThilina Rathnayake      end
149786a4271fSThilina RathnayakeC-----------------------------------------------------------------------
149886a4271fSThilina Rathnayake      subroutine axhm1_bp1(pap,ap1,p1,h1,h2)
149986a4271fSThilina RathnayakeC     Vector conjugate gradient matvec for solution of BP1 (mass matrix)
150086a4271fSThilina RathnayakeC     Input: pap,p1,h1,h2           Output: ap1
150186a4271fSThilina Rathnayake      include 'SIZE'
150286a4271fSThilina Rathnayake      include 'TOTAL'
150386a4271fSThilina Rathnayake
150486a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2))
150586a4271fSThilina Rathnayake      real*8         gf(lg,lx,lelt)             ! Equivalence new gf() data
150686a4271fSThilina Rathnayake      equivalence (gf,g1m1)                     ! layout to g1m1...g6m1
150786a4271fSThilina Rathnayake
150886a4271fSThilina Rathnayake      real*8 pap(3)
150986a4271fSThilina Rathnayake      real*8 ap1(lx,lelt)
151086a4271fSThilina Rathnayake      real*8  p1(lx,lelt)
151186a4271fSThilina Rathnayake      real*8  h1(lx,lelt),h2(lx,lelt)
151286a4271fSThilina Rathnayake
151386a4271fSThilina Rathnayake      real*8 ur(lx),us(lx),ut(lx)
151486a4271fSThilina Rathnayake      common /ctmp1/ ur,us,ut
151586a4271fSThilina Rathnayake
151686a4271fSThilina Rathnayake      integer e
151786a4271fSThilina Rathnayake
151886a4271fSThilina Rathnayake      pap(1)=0.
151986a4271fSThilina Rathnayake
152086a4271fSThilina Rathnayake      k=1
152186a4271fSThilina Rathnayake      nxq = nx1+1
152286a4271fSThilina Rathnayake
152386a4271fSThilina Rathnayake      do e=1,nelt
152486a4271fSThilina Rathnayake
152586a4271fSThilina Rathnayake         call ax_e_bp1(ap1(1,e),p1(1,e),gf(1,1,e),h1(1,e),h2(k,1)
152686a4271fSThilina Rathnayake     $                                          ,bm1(1,1,1,e),ur,us,ut)
152786a4271fSThilina Rathnayake         do i=1,lx
152886a4271fSThilina Rathnayake           pap(1)=pap(1)+ap1(i,e)*p1(i,e)
152986a4271fSThilina Rathnayake         enddo
153086a4271fSThilina Rathnayake         k=k+nxq*nxq*nxq
153186a4271fSThilina Rathnayake
153286a4271fSThilina Rathnayake      enddo
153386a4271fSThilina Rathnayake
153486a4271fSThilina Rathnayake      return
153586a4271fSThilina Rathnayake      end
153686a4271fSThilina RathnayakeC-----------------------------------------------------------------------
153786a4271fSThilina Rathnayake      subroutine ax_e_bp3(w,u,g,ur,us,ut,wk)
153886a4271fSThilina RathnayakeC     Local matrix-vector for solution of BP3 (stiffness matrix)
153986a4271fSThilina RathnayakeC     Input: u,g,ur,us,ut,wk        Output: w
154086a4271fSThilina Rathnayake      include 'SIZE'
154186a4271fSThilina Rathnayake      include 'TOTAL'
154286a4271fSThilina Rathnayake
154386a4271fSThilina Rathnayake      parameter (lzq=lx1+1,lxyz=lx1*lx1*lx1,lxyzq=lzq*lzq*lzq)
154486a4271fSThilina Rathnayake
154586a4271fSThilina Rathnayake      common /ctmp0/ tmp(lxyzq)
154686a4271fSThilina Rathnayake      common /dxmfine/ dxmq(lzq,lzq),dxtmq(lzq,lzq)
154786a4271fSThilina Rathnayake
154886a4271fSThilina Rathnayake      real*8 ur(lxyzq),us(lxyzq),ut(lxyzq),wk(lxyzq)
154986a4271fSThilina Rathnayake      real*8 w(lxyz),u(lxyz),g(2*ldim,lxyzq)
155086a4271fSThilina Rathnayake
155186a4271fSThilina Rathnayake      n = lzq-1
155286a4271fSThilina Rathnayake
155386a4271fSThilina Rathnayake      call intp_rstd  (wk,u,lx1,lzq,if3d,0) ! 0 --> Fwd interpolation
155486a4271fSThilina Rathnayake      call loc_grad3  (ur,us,ut,wk,n,dxmq,dxtmq)
155586a4271fSThilina Rathnayake
155686a4271fSThilina Rathnayake      do i=1,lxyzq
155786a4271fSThilina Rathnayake         wr = g(1,i)*ur(i) + g(2,i)*us(i) + g(3,i)*ut(i)
155886a4271fSThilina Rathnayake         ws = g(2,i)*ur(i) + g(4,i)*us(i) + g(5,i)*ut(i)
155986a4271fSThilina Rathnayake         wt = g(3,i)*ur(i) + g(5,i)*us(i) + g(6,i)*ut(i)
156086a4271fSThilina Rathnayake         ur(i) = wr
156186a4271fSThilina Rathnayake         us(i) = ws
156286a4271fSThilina Rathnayake         ut(i) = wt
156386a4271fSThilina Rathnayake      enddo
156486a4271fSThilina Rathnayake
156586a4271fSThilina Rathnayake      call loc_grad3t (wk,ur,us,ut,n,dxmq,dxtmq,tmp)
156686a4271fSThilina Rathnayake      call intp_rstd  (w,wk,lx1,lzq,if3d,1) ! 1 --> ju-->u
156786a4271fSThilina Rathnayake
156886a4271fSThilina Rathnayake      return
156986a4271fSThilina Rathnayake      end
157086a4271fSThilina RathnayakeC-----------------------------------------------------------------------
157186a4271fSThilina Rathnayake      subroutine axhm1_bp3(pap,ap1,p1,h1,h2)
157286a4271fSThilina RathnayakeC     Vector conjugate gradient matvec for solution of BP3 (stiffness matrix)
157386a4271fSThilina RathnayakeC     Input: pap,p1,h1,h2           Output: ap1
157486a4271fSThilina Rathnayake      include 'SIZE'
157586a4271fSThilina Rathnayake      include 'TOTAL'
157686a4271fSThilina Rathnayake
157786a4271fSThilina Rathnayake      parameter (lzq=lx1+1)
157886a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2),lq=lzq**ldim)
157986a4271fSThilina Rathnayake      common /bpgfactors/ gf(lg,lq,lelt),bmq(lq,lelt),w3mq(lq)
158086a4271fSThilina Rathnayake
158186a4271fSThilina Rathnayake      real*8 pap(3)
158286a4271fSThilina Rathnayake      real*8 ap1(lx,lelt)
158386a4271fSThilina Rathnayake      real*8  p1(lx,lelt)
158486a4271fSThilina Rathnayake      real*8  h1(lx,lelt),h2(lx,lelt)
158586a4271fSThilina Rathnayake
158686a4271fSThilina Rathnayake      common /ctmp1/ ur,us,ut,wk
158786a4271fSThilina Rathnayake      real*8 ur(lq),us(lq),ut(lq),wk(lq)
158886a4271fSThilina Rathnayake
158986a4271fSThilina Rathnayake      integer e
159086a4271fSThilina Rathnayake
159186a4271fSThilina Rathnayake      pap(1)=0.
159286a4271fSThilina Rathnayake
159386a4271fSThilina Rathnayake      do e=1,nelt
159486a4271fSThilina Rathnayake
159586a4271fSThilina Rathnayake         call ax_e_bp3(ap1(1,e),p1(1,e),gf(1,1,e),ur,us,ut,wk)
159686a4271fSThilina Rathnayake         do i=1,lx
159786a4271fSThilina Rathnayake           pap(1)=pap(1)+p1(i,e)*ap1(i,e)
159886a4271fSThilina Rathnayake         enddo
159986a4271fSThilina Rathnayake
160086a4271fSThilina Rathnayake      enddo
160186a4271fSThilina Rathnayake
160286a4271fSThilina Rathnayake      return
160386a4271fSThilina Rathnayake      end
160486a4271fSThilina RathnayakeC-----------------------------------------------------------------------
160586a4271fSThilina Rathnayake      subroutine axhm1(pap,ap1,p1,h1,h2,bpname)
160686a4271fSThilina RathnayakeC     Vector conjugate gradient matvec for solution of uncoupled
160786a4271fSThilina RathnayakeC     Helmholtz equations
160886a4271fSThilina RathnayakeC     Input: pap,p1,h1,h2,bpname    Output: ap1
160986a4271fSThilina Rathnayake      include 'SIZE'
161086a4271fSThilina Rathnayake      include 'TOTAL'
161186a4271fSThilina Rathnayake
161286a4271fSThilina Rathnayake      parameter (lx=lx1*ly1*lz1)
161386a4271fSThilina Rathnayake
161486a4271fSThilina Rathnayake      real*8 pap(3),ap1(lx,lelt),p1(lx,lelt)
161586a4271fSThilina Rathnayake      real*8 h1(lx,lelt),h2(lx,lelt)
161686a4271fSThilina Rathnayake
161786a4271fSThilina Rathnayake      character*3 bpname
161886a4271fSThilina Rathnayake
161986a4271fSThilina Rathnayake      if (bpname.eq.'bp1') then
162086a4271fSThilina Rathnayake         call axhm1_bp1(pap,ap1,p1,h1,h2)
162186a4271fSThilina Rathnayake
162286a4271fSThilina Rathnayake      elseif (bpname.eq.'bp3') then
162386a4271fSThilina Rathnayake         call axhm1_bp3(pap,ap1,p1,h1,h2)
162486a4271fSThilina Rathnayake
162586a4271fSThilina Rathnayake      else
162686a4271fSThilina Rathnayake         write(6,*) bpname,' axhm1 bpname error'
162786a4271fSThilina Rathnayake         stop
162886a4271fSThilina Rathnayake
162986a4271fSThilina Rathnayake      endif
163086a4271fSThilina Rathnayake
163186a4271fSThilina Rathnayake      return
163286a4271fSThilina Rathnayake      end
163386a4271fSThilina RathnayakeC-----------------------------------------------------------------------
163486a4271fSThilina Rathnayake      subroutine get_bp(bp)
163586a4271fSThilina RathnayakeC     Get BP to run
163686a4271fSThilina RathnayakeC     Input:                        Output: bp
163786a4271fSThilina Rathnayake      integer i,bp
163886a4271fSThilina Rathnayake      character*64 bpval
163986a4271fSThilina Rathnayake
164086a4271fSThilina Rathnayake      bp=0
164186a4271fSThilina Rathnayake      if(iargc().ge.1) then
164286a4271fSThilina Rathnayake        call getarg(1,bpval)
164386a4271fSThilina Rathnayake      endif
164486a4271fSThilina Rathnayake      if(bpval.eq."bp1") then
164586a4271fSThilina Rathnayake        bp=1
164686a4271fSThilina Rathnayake      elseif(bpval.eq."bp3") then
164786a4271fSThilina Rathnayake        bp=3
164886a4271fSThilina Rathnayake      endif
164986a4271fSThilina Rathnayake
165086a4271fSThilina Rathnayake      return
165186a4271fSThilina Rathnayake      end
165286a4271fSThilina RathnayakeC-----------------------------------------------------------------------
165386a4271fSThilina Rathnayake      subroutine get_spec(spec)
165486a4271fSThilina RathnayakeC     Get CEED backend specification
165586a4271fSThilina RathnayakeC     Input:                        Output: spec
165686a4271fSThilina Rathnayake      integer i
165786a4271fSThilina Rathnayake      character*64 spec
165886a4271fSThilina Rathnayake
165986a4271fSThilina Rathnayake      spec = '/cpu/self'
166086a4271fSThilina Rathnayake      if(iargc().ge.2) then
166186a4271fSThilina Rathnayake        call getarg(2,spec)
166286a4271fSThilina Rathnayake      endif
166386a4271fSThilina Rathnayake
166486a4271fSThilina Rathnayake      return
166586a4271fSThilina Rathnayake      end
166686a4271fSThilina RathnayakeC-----------------------------------------------------------------------
166786a4271fSThilina Rathnayake      subroutine get_test(test)
166886a4271fSThilina RathnayakeC     Get test mode flag
166986a4271fSThilina RathnayakeC     Input:                        Output: test
167086a4271fSThilina Rathnayake      integer i,test
167186a4271fSThilina Rathnayake      character*64 testval
167286a4271fSThilina Rathnayake
167386a4271fSThilina Rathnayake      test=0
167486a4271fSThilina Rathnayake      if(iargc().ge.3) then
167586a4271fSThilina Rathnayake        call getarg(3,testval)
167686a4271fSThilina Rathnayake      endif
167786a4271fSThilina Rathnayake      if(testval.eq."test") then
167886a4271fSThilina Rathnayake        test=1
167986a4271fSThilina Rathnayake      endif
168086a4271fSThilina Rathnayake
168186a4271fSThilina Rathnayake      return
168286a4271fSThilina Rathnayake      end
168386a4271fSThilina RathnayakeC-----------------------------------------------------------------------
1684