13d8e8822SJeremy L ThompsonC Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors 23d8e8822SJeremy L ThompsonC All Rights Reserved. See the top-level COPYRIGHT and NOTICE files for details. 386a4271fSThilina RathnayakeC 43d8e8822SJeremy L ThompsonC SPDX-License-Identifier: (BSD-2-Clause) 586a4271fSThilina RathnayakeC 63d8e8822SJeremy L ThompsonC This file is part of CEED: http://github.com/ceed 786a4271fSThilina Rathnayake 886a4271fSThilina RathnayakeC> @file 986a4271fSThilina RathnayakeC> Mass and diffusion operators examples using Nek5000 10dc8efd83SLeila GhaffariC_TESTARGS(name="BP1") -c {ceed_resource} -e bp1 -n 1 -b 4 -test 11dc8efd83SLeila GhaffariC_TESTARGS(name="BP3") -c {ceed_resource} -e bp3 -n 1 -b 4 -test 1286a4271fSThilina Rathnayake 1386a4271fSThilina RathnayakeC----------------------------------------------------------------------- 1486a4271fSThilina Rathnayake subroutine masssetupf(ctx,q,u1,u2,u3,u4,u5,u6,u7, 1586a4271fSThilina Rathnayake $ u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8, 1686a4271fSThilina Rathnayake $ v9,v10,v11,v12,v13,v14,v15,v16,ierr) 1786a4271fSThilina RathnayakeC Set up mass operator 1886a4271fSThilina RathnayakeC Input: u1,u2,u3,q Output: v1,v2,ierr 1986a4271fSThilina Rathnayake integer q,ierr 2086a4271fSThilina Rathnayake real*8 ctx(1) 2186a4271fSThilina Rathnayake real*8 u1(3*q) 2286a4271fSThilina Rathnayake real*8 u2(9*q) 2386a4271fSThilina Rathnayake real*8 u3(q) 2486a4271fSThilina Rathnayake real*8 v1(q) 2586a4271fSThilina Rathnayake real*8 v2(q) 2686a4271fSThilina Rathnayake real*8 a11,a12,a13,a21,a22,a23,a31,a32,a33 2786a4271fSThilina Rathnayake real*8 g11,g12,g13,g21,g22,g23,g31,g32,g33 2886a4271fSThilina Rathnayake real*8 jacmq 2986a4271fSThilina Rathnayake 30ee07ded2SValeria BarraC Quadrature Point Loop 3186a4271fSThilina Rathnayake do i=1,q 3286a4271fSThilina Rathnayake a11=u2(i+q*0) 3386a4271fSThilina Rathnayake a12=u2(i+q*3) 3486a4271fSThilina Rathnayake a13=u2(i+q*6) 3586a4271fSThilina Rathnayake 3686a4271fSThilina Rathnayake a21=u2(i+q*1) 3786a4271fSThilina Rathnayake a22=u2(i+q*4) 3886a4271fSThilina Rathnayake a23=u2(i+q*7) 3986a4271fSThilina Rathnayake 4086a4271fSThilina Rathnayake a31=u2(i+q*2) 4186a4271fSThilina Rathnayake a32=u2(i+q*5) 4286a4271fSThilina Rathnayake a33=u2(i+q*8) 4386a4271fSThilina Rathnayake 4486a4271fSThilina Rathnayake g11 = (a22*a33-a23*a32) 4586a4271fSThilina Rathnayake g12 = (a13*a32-a33*a12) 4686a4271fSThilina Rathnayake g13 = (a12*a23-a22*a13) 4786a4271fSThilina Rathnayake 4886a4271fSThilina Rathnayake g21 = (a23*a31-a21*a33) 4986a4271fSThilina Rathnayake g22 = (a11*a33-a31*a13) 5086a4271fSThilina Rathnayake g23 = (a13*a21-a23*a11) 5186a4271fSThilina Rathnayake 5286a4271fSThilina Rathnayake g31 = (a21*a32-a22*a31) 5386a4271fSThilina Rathnayake g32 = (a12*a31-a32*a11) 5486a4271fSThilina Rathnayake g33 = (a11*a22-a21*a12) 5586a4271fSThilina Rathnayake 5686a4271fSThilina Rathnayake jacmq = a11*g11+a21*g12+a31*g13 5786a4271fSThilina Rathnayake 5886a4271fSThilina RathnayakeC Rho 5986a4271fSThilina Rathnayake v1(i)=u3(i)*jacmq 6086a4271fSThilina Rathnayake 6186a4271fSThilina RathnayakeC RHS 6286a4271fSThilina Rathnayake v2(i)=u3(i)*jacmq 6386a4271fSThilina Rathnayake $ *dsqrt(u1(i+q*0)*u1(i+q*0) 6486a4271fSThilina Rathnayake $ +u1(i+q*1)*u1(i+q*1) 6586a4271fSThilina Rathnayake $ +u1(i+q*2)*u1(i+q*2)) 6686a4271fSThilina Rathnayake enddo 6786a4271fSThilina Rathnayake 6886a4271fSThilina Rathnayake ierr=0 6986a4271fSThilina Rathnayake end 7086a4271fSThilina RathnayakeC----------------------------------------------------------------------- 7186a4271fSThilina Rathnayake subroutine massf(ctx,q,u1,u2,u3,u4,u5,u6,u7, 7286a4271fSThilina Rathnayake $ u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8, 7386a4271fSThilina Rathnayake $ v9,v10,v11,v12,v13,v14,v15,v16,ierr) 7486a4271fSThilina RathnayakeC Apply mass operator 7586a4271fSThilina RathnayakeC Input: u1,u2,q Output: v1,ierr 7686a4271fSThilina Rathnayake integer q,ierr 7786a4271fSThilina Rathnayake real*8 ctx(1) 7886a4271fSThilina Rathnayake real*8 u1(q) 7986a4271fSThilina Rathnayake real*8 u2(q) 8086a4271fSThilina Rathnayake real*8 v1(q) 8186a4271fSThilina Rathnayake 82ee07ded2SValeria BarraC Quadrature Point Loop 8386a4271fSThilina Rathnayake do i=1,q 8486a4271fSThilina Rathnayake v1(i)=u2(i)*u1(i) 8586a4271fSThilina Rathnayake enddo 8686a4271fSThilina Rathnayake 8786a4271fSThilina Rathnayake ierr=0 8886a4271fSThilina Rathnayake end 8986a4271fSThilina RathnayakeC----------------------------------------------------------------------- 9086a4271fSThilina Rathnayake subroutine diffsetupf(ctx,q,u1,u2,u3,u4,u5,u6,u7, 9186a4271fSThilina Rathnayake $ u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8, 9286a4271fSThilina Rathnayake $ v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9386a4271fSThilina RathnayakeC Set up diffusion operator 9486a4271fSThilina RathnayakeC Input: u1,u2,u3,q Output: v1,v2,ierr 9586a4271fSThilina Rathnayake integer q,ierr 9686a4271fSThilina Rathnayake real*8 ctx(1) 9786a4271fSThilina Rathnayake real*8 u1(3*q) 9886a4271fSThilina Rathnayake real*8 u2(9*q) 9986a4271fSThilina Rathnayake real*8 u3(q) 10086a4271fSThilina Rathnayake real*8 v1(6*q) 10186a4271fSThilina Rathnayake real*8 v2(q) 10286a4271fSThilina Rathnayake real*8 a11,a12,a13,a21,a22,a23,a31,a32,a33 10386a4271fSThilina Rathnayake real*8 g11,g12,g13,g21,g22,g23,g31,g32,g33 10486a4271fSThilina Rathnayake real*8 jacmq,scl 10586a4271fSThilina Rathnayake real*8 c(3),k(3) 10686a4271fSThilina Rathnayake 107ee07ded2SValeria BarraC Quadrature Point Loop 10886a4271fSThilina Rathnayake do i=1,q 10986a4271fSThilina Rathnayake pi = 3.14159265358979323846 11086a4271fSThilina Rathnayake 11186a4271fSThilina Rathnayake c(1)=0. 11286a4271fSThilina Rathnayake c(2)=1. 11386a4271fSThilina Rathnayake c(3)=2. 11486a4271fSThilina Rathnayake k(1)=1. 11586a4271fSThilina Rathnayake k(2)=2. 11686a4271fSThilina Rathnayake k(3)=3. 11786a4271fSThilina Rathnayake 11886a4271fSThilina Rathnayake a11=u2(i+q*0) 11986a4271fSThilina Rathnayake a12=u2(i+q*3) 12086a4271fSThilina Rathnayake a13=u2(i+q*6) 12186a4271fSThilina Rathnayake 12286a4271fSThilina Rathnayake a21=u2(i+q*1) 12386a4271fSThilina Rathnayake a22=u2(i+q*4) 12486a4271fSThilina Rathnayake a23=u2(i+q*7) 12586a4271fSThilina Rathnayake 12686a4271fSThilina Rathnayake a31=u2(i+q*2) 12786a4271fSThilina Rathnayake a32=u2(i+q*5) 12886a4271fSThilina Rathnayake a33=u2(i+q*8) 12986a4271fSThilina Rathnayake 13086a4271fSThilina Rathnayake g11 = (a22*a33-a23*a32) 13186a4271fSThilina Rathnayake g12 = (a13*a32-a33*a12) 13286a4271fSThilina Rathnayake g13 = (a12*a23-a22*a13) 13386a4271fSThilina Rathnayake 13486a4271fSThilina Rathnayake g21 = (a23*a31-a21*a33) 13586a4271fSThilina Rathnayake g22 = (a11*a33-a31*a13) 13686a4271fSThilina Rathnayake g23 = (a13*a21-a23*a11) 13786a4271fSThilina Rathnayake 13886a4271fSThilina Rathnayake g31 = (a21*a32-a22*a31) 13986a4271fSThilina Rathnayake g32 = (a12*a31-a32*a11) 14086a4271fSThilina Rathnayake g33 = (a11*a22-a21*a12) 14186a4271fSThilina Rathnayake 14286a4271fSThilina Rathnayake jacmq = a11*g11+a21*g12+a31*g13 14386a4271fSThilina Rathnayake 14486a4271fSThilina Rathnayake scl = u3(i)/jacmq 14586a4271fSThilina Rathnayake 14686a4271fSThilina RathnayakeC Geometric factors 147288c0443SJeremy L ThompsonC Stored in Voigt convention 148288c0443SJeremy L ThompsonC 0 5 4 149288c0443SJeremy L ThompsonC 5 1 3 150288c0443SJeremy L ThompsonC 4 3 2 15186a4271fSThilina Rathnayake v1(i+0*q) = scl*(g11*g11+g12*g12+g13*g13) ! Grr 152288c0443SJeremy L Thompson v1(i+1*q) = scl*(g21*g21+g22*g22+g23*g23) ! Gss 153288c0443SJeremy L Thompson v1(i+2*q) = scl*(g31*g31+g32*g32+g33*g33) ! Gtt 154288c0443SJeremy L Thompson v1(i+3*q) = scl*(g21*g31+g22*g32+g23*g33) ! Gst 155288c0443SJeremy L Thompson v1(i+4*q) = scl*(g11*g31+g12*g32+g13*g33) ! Grt 156288c0443SJeremy L Thompson v1(i+5*q) = scl*(g11*g21+g12*g22+g13*g23) ! Grs 15786a4271fSThilina Rathnayake 15886a4271fSThilina RathnayakeC RHS 15986a4271fSThilina Rathnayake v2(i) = u3(i)*jacmq*pi*pi 16086a4271fSThilina Rathnayake $ *dsin(pi*(c(1)+k(1)*u1(i+0*q))) 16186a4271fSThilina Rathnayake $ *dsin(pi*(c(2)+k(2)*u1(i+1*q))) 16286a4271fSThilina Rathnayake $ *dsin(pi*(c(3)+k(3)*u1(i+2*q))) 16386a4271fSThilina Rathnayake $ *(k(1)*k(1)+k(2)*k(2)+k(3)*k(3)) 16486a4271fSThilina Rathnayake 16586a4271fSThilina Rathnayake enddo 16686a4271fSThilina Rathnayake 16786a4271fSThilina Rathnayake ierr=0 16886a4271fSThilina Rathnayake end 16986a4271fSThilina RathnayakeC----------------------------------------------------------------------- 17086a4271fSThilina Rathnayake subroutine diffusionf(ctx,q,u1,u2,u3,u4,u5,u6,u7, 17186a4271fSThilina Rathnayake $ u8,u9,u10,u11,u12,u13,u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8, 17286a4271fSThilina Rathnayake $ v9,v10,v11,v12,v13,v14,v15,v16,ierr) 17386a4271fSThilina RathnayakeC Apply diffusion operator 17486a4271fSThilina RathnayakeC Input: u1,u2,q Output: v1,ierr 17586a4271fSThilina Rathnayake integer q,ierr 17686a4271fSThilina Rathnayake real*8 ctx(1) 17786a4271fSThilina Rathnayake real*8 u1(3*q) 17886a4271fSThilina Rathnayake real*8 u2(6*q) 17986a4271fSThilina Rathnayake real*8 v1(3*q) 18086a4271fSThilina Rathnayake 181ee07ded2SValeria BarraC Quadrature Point Loop 18286a4271fSThilina Rathnayake do i=1,q 18386a4271fSThilina Rathnayake v1(i+0*q)= 184288c0443SJeremy L Thompson $ u2(i+0*q)*u1(i)+u2(i+5*q)*u1(i+q)+u2(i+4*q)*u1(i+2*q) 18586a4271fSThilina Rathnayake v1(i+1*q)= 186288c0443SJeremy L Thompson $ u2(i+5*q)*u1(i)+u2(i+1*q)*u1(i+q)+u2(i+3*q)*u1(i+2*q) 18786a4271fSThilina Rathnayake v1(i+2*q)= 188288c0443SJeremy L Thompson $ u2(i+4*q)*u1(i)+u2(i+3*q)*u1(i+q)+u2(i+2*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' 702ec3da8bcSJed Brown include 'ceed/fortran.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 72034d77899SValeria Barra integer p,q,ncompx,ncompu,enode,lnode 72186a4271fSThilina Rathnayake integer vec_p1,vec_ap1,vec_qdata,vec_coords,vec_rhs 7227509a596Sjeremylt integer stridesu(3),stridesx(3),stridesw(3) 72386a4271fSThilina Rathnayake integer erstrctu,erstrctx,erstrctw 72486a4271fSThilina Rathnayake integer basisu,basisx 72586a4271fSThilina Rathnayake integer qf_mass,qf_setup 72686a4271fSThilina Rathnayake integer op_mass,op_setup 72786a4271fSThilina Rathnayake real*8 x,y,z 72886a4271fSThilina Rathnayake integer*8 offset 72986a4271fSThilina Rathnayake 73086a4271fSThilina Rathnayake external massf,masssetupf 73186a4271fSThilina Rathnayake 73286a4271fSThilina Rathnayake ifield = 1 73386a4271fSThilina Rathnayake nxq = nx1+1 73486a4271fSThilina Rathnayake n = nx1*ny1*nz1*nelt 73586a4271fSThilina Rathnayake 73686a4271fSThilina Rathnayake ifsync = .false. 73786a4271fSThilina Rathnayake 73886a4271fSThilina RathnayakeC Set up coordinates 73986a4271fSThilina Rathnayake ii=0 74086a4271fSThilina Rathnayake do j=0,nelt-1 74186a4271fSThilina Rathnayake do i=1,lx 74286a4271fSThilina Rathnayake ii=ii+1 74386a4271fSThilina Rathnayake x = xm1(ii,1,1,1) 74486a4271fSThilina Rathnayake y = ym1(ii,1,1,1) 74586a4271fSThilina Rathnayake z = zm1(ii,1,1,1) 74686a4271fSThilina Rathnayake coords(i+0*lx+3*j*lx)=x 74786a4271fSThilina Rathnayake coords(i+1*lx+3*j*lx)=y 74886a4271fSThilina Rathnayake coords(i+2*lx+3*j*lx)=z 74986a4271fSThilina Rathnayake enddo 75086a4271fSThilina Rathnayake enddo 75186a4271fSThilina Rathnayake 75286a4271fSThilina RathnayakeC Init ceed library 75386a4271fSThilina Rathnayake call get_spec(spec) 75486a4271fSThilina Rathnayake call ceedinit(trim(spec)//char(0),ceed,err) 75586a4271fSThilina Rathnayake 75686a4271fSThilina Rathnayake call get_test(test) 75786a4271fSThilina Rathnayake 75886a4271fSThilina RathnayakeC Set up Nek geometry data 75986a4271fSThilina Rathnayake call geodatq (gf,bmq,w3mq,nxq) ! Set up gf() arrays 76086a4271fSThilina Rathnayake call set_h2_as_rhoJac_GL(h2,bmq,nxq) 76186a4271fSThilina Rathnayake 76286a4271fSThilina RathnayakeC Set up true soln 76386a4271fSThilina Rathnayake call dist_fld_h1 (e1) 76486a4271fSThilina Rathnayake call copy (h1,e1,n) ! Save exact soln in h1 76586a4271fSThilina Rathnayake 76686a4271fSThilina RathnayakeC Set up solver parameters 76786a4271fSThilina Rathnayake tol = 1e-10 76886a4271fSThilina Rathnayake param(22) = tol 76986a4271fSThilina Rathnayake maxit = 100 77086a4271fSThilina Rathnayake 77186a4271fSThilina Rathnayake call nekgsync() 77286a4271fSThilina Rathnayake 77386a4271fSThilina RathnayakeC Create ceed basis for mesh and computation 77486a4271fSThilina Rathnayake p=nx1 77586a4271fSThilina Rathnayake q=p+1 77634d77899SValeria Barra ncompu=1 77734d77899SValeria Barra ncompx=ldim 77886a4271fSThilina Rathnayake call ceedbasiscreatetensorh1lagrange(ceed,ndim,ndim,p,q, 77986a4271fSThilina Rathnayake $ ceed_gauss,basisx,err) 78034d77899SValeria Barra call ceedbasiscreatetensorh1lagrange(ceed,ndim,ncompu,p,q, 78186a4271fSThilina Rathnayake $ ceed_gauss,basisu,err) 78286a4271fSThilina Rathnayake 78386a4271fSThilina RathnayakeC Create ceed element restrictions for mesh and computation 784e2b2c771Svaleria enode=p**ldim 78534d77899SValeria Barra lnode=enode*nelt*ncompu 7867509a596Sjeremylt stridesx=[1,enode,enode*ldim] 787d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,enode,ldim, 788d979a051Sjeremylt $ ldim*lnode,stridesx,erstrctx,err) 7897509a596Sjeremylt stridesu=[1,enode,enode*ncompu] 790d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,enode,ncompu, 791d979a051Sjeremylt $ ncompu*lnode,stridesu,erstrctu,err) 7927509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,q**ldim, 793d979a051Sjeremylt $ 1,nelt*q**ldim,ceed_strides_backend,erstrctw,err) 79486a4271fSThilina Rathnayake 79586a4271fSThilina RathnayakeC Create ceed vectors 796e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_p1,err) 797e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_ap1,err) 798e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_rhs,err) 79986a4271fSThilina Rathnayake call ceedvectorcreate(ceed,ldim*lx*nelt,vec_coords,err) 80086a4271fSThilina Rathnayake call ceedvectorcreate(ceed,nelt*q**ldim,vec_qdata,err) 80186a4271fSThilina Rathnayake 80286a4271fSThilina Rathnayake offset=0 80386a4271fSThilina Rathnayake call ceedvectorsetarray(vec_coords,ceed_mem_host, 80486a4271fSThilina Rathnayake $ ceed_use_pointer,coords,offset,err) 80586a4271fSThilina Rathnayake 80686a4271fSThilina RathnayakeC Create ceed qfunctions for masssetupf and massf 80786a4271fSThilina Rathnayake call ceedqfunctioncreateinterior(ceed,1,masssetupf, 8082d50dd3dSjeremylt $ EXAMPLE_DIR 8092d50dd3dSjeremylt $ //'bps/bps.h:masssetupf',qf_setup,err) 81034d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'x',ncompx, 81186a4271fSThilina Rathnayake $ ceed_eval_interp,err) 81234d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'dx',ncompx*ldim, 81386a4271fSThilina Rathnayake $ ceed_eval_grad,err) 81434d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'weight',ncompu, 81586a4271fSThilina Rathnayake $ ceed_eval_weight,err) 816a2fa7910SValeria Barra call ceedqfunctionaddoutput(qf_setup,'qdata',ncompu, 81786a4271fSThilina Rathnayake $ ceed_eval_none,err) 81834d77899SValeria Barra call ceedqfunctionaddoutput(qf_setup,'rhs',ncompu, 81986a4271fSThilina Rathnayake $ ceed_eval_interp,err) 82086a4271fSThilina Rathnayake 82186a4271fSThilina Rathnayake call ceedqfunctioncreateinterior(ceed,1,massf, 8222d50dd3dSjeremylt $ EXAMPLE_DIR 8232d50dd3dSjeremylt $ //'bps/bps.h:massf',qf_mass,err) 82434d77899SValeria Barra call ceedqfunctionaddinput(qf_mass,'u',ncompu, 82586a4271fSThilina Rathnayake $ ceed_eval_interp,err) 826a2fa7910SValeria Barra call ceedqfunctionaddinput(qf_mass,'qdata',ncompu, 82786a4271fSThilina Rathnayake $ ceed_eval_none,err) 82834d77899SValeria Barra call ceedqfunctionaddoutput(qf_mass,'v',ncompu, 82986a4271fSThilina Rathnayake $ ceed_eval_interp,err) 83086a4271fSThilina Rathnayake 83186a4271fSThilina RathnayakeC Create ceed operators 83286a4271fSThilina Rathnayake call ceedoperatorcreate(ceed,qf_setup, 833442e7f0bSjeremylt $ ceed_qfunction_none,ceed_qfunction_none,op_setup,err) 83486a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'x',erstrctx, 835a8d32208Sjeremylt $ basisx,ceed_vector_active,err) 83686a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'dx',erstrctx, 837a8d32208Sjeremylt $ basisx,ceed_vector_active,err) 83815910d16Sjeremylt call ceedoperatorsetfield(op_setup,'weight', 83915910d16Sjeremylt $ ceed_elemrestriction_none,basisx,ceed_vector_none,err) 840a2fa7910SValeria Barra call ceedoperatorsetfield(op_setup,'qdata',erstrctw, 841*356036faSJeremy L Thompson $ CEED_BASIS_NONE,ceed_vector_active,err) 84286a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'rhs',erstrctu, 843a8d32208Sjeremylt $ basisu,vec_rhs,err) 84486a4271fSThilina Rathnayake 84586a4271fSThilina Rathnayake call ceedoperatorcreate(ceed,qf_mass, 846442e7f0bSjeremylt $ ceed_qfunction_none,ceed_qfunction_none,op_mass,err) 84786a4271fSThilina Rathnayake call ceedoperatorsetfield(op_mass,'u',erstrctu, 848a8d32208Sjeremylt $ basisu,ceed_vector_active,err) 849a2fa7910SValeria Barra call ceedoperatorsetfield(op_mass,'qdata',erstrctw, 850*356036faSJeremy L Thompson $ CEED_BASIS_NONE,vec_qdata,err) 85186a4271fSThilina Rathnayake call ceedoperatorsetfield(op_mass,'v',erstrctu, 852a8d32208Sjeremylt $ basisu,ceed_vector_active,err) 85386a4271fSThilina Rathnayake 85486a4271fSThilina RathnayakeC Compute setup data 85586a4271fSThilina Rathnayake call ceedvectorsetarray(vec_rhs,ceed_mem_host, 85686a4271fSThilina Rathnayake $ ceed_use_pointer,r1,offset,err) 85786a4271fSThilina Rathnayake call ceedoperatorapply(op_setup,vec_coords,vec_qdata, 85886a4271fSThilina Rathnayake $ ceed_request_immediate,err) 85986a4271fSThilina Rathnayake 86086a4271fSThilina RathnayakeC Set up true RHS 86186a4271fSThilina Rathnayake call dssum (r1,nx1,ny1,nz1) ! r1 86286a4271fSThilina Rathnayake 86386a4271fSThilina RathnayakeC Set up algebraic RHS with libCEED 86486a4271fSThilina Rathnayake call ceedvectorsetarray(vec_p1,ceed_mem_host, 86586a4271fSThilina Rathnayake $ ceed_use_pointer,h1,offset,err) 86686a4271fSThilina Rathnayake call ceedvectorsetarray(vec_ap1,ceed_mem_host, 86786a4271fSThilina Rathnayake $ ceed_use_pointer,r2,offset,err) 86886a4271fSThilina Rathnayake call ceedoperatorapply(op_mass,vec_p1,vec_ap1, 86986a4271fSThilina Rathnayake $ ceed_request_immediate,err) ! r2 = A_ceed*h1 87086a4271fSThilina Rathnayake call dssum (r2,nx1,ny1,nz1) 87186a4271fSThilina Rathnayake 87286a4271fSThilina RathnayakeC Set up algebraic RHS with Nek5000 87386a4271fSThilina Rathnayake call axhm1 (pap,r3,h1,h1,h2,'bp1') ! r3 = A_nek5k*h1 87486a4271fSThilina Rathnayake call dssum (r3,nx1,ny1,nz1) 87586a4271fSThilina Rathnayake 87686a4271fSThilina Rathnayake call nekgsync() 87786a4271fSThilina Rathnayake 87886a4271fSThilina RathnayakeC Solve true RHS 87986a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "libCEED true RHS" 88086a4271fSThilina Rathnayake tstart = dnekclock() 88186a4271fSThilina Rathnayake call cggos(u1,r1,h1,h2,vmult,binvm1,tol,ceed,op_mass, 88286a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp1') 88386a4271fSThilina Rathnayake tstop = dnekclock() 88486a4271fSThilina Rathnayake 88586a4271fSThilina RathnayakeC Output 88686a4271fSThilina Rathnayake telaps = (tstop-tstart) 88786a4271fSThilina Rathnayake maxits = maxit 88886a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 88986a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 89086a4271fSThilina Rathnayake 89186a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 89286a4271fSThilina Rathnayake if (maxit>=100) then 89386a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 89486a4271fSThilina Rathnayake endif 89586a4271fSThilina Rathnayake if (dabs(er1)>5e-3) then 89686a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 89786a4271fSThilina Rathnayake endif 89886a4271fSThilina Rathnayake endif 89986a4271fSThilina Rathnayake 90086a4271fSThilina Rathnayake nx = nx1-1 901e2b2c771Svaleria nnode = nelgt ! nnodes 902e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 903e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 90486a4271fSThilina Rathnayake 90505939c60Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 90686a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 90786a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 90886a4271fSThilina Rathnayake 90986a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 91005939c60Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 91186a4271fSThilina Rathnayake 91286a4271fSThilina RathnayakeC Solve libCEED algebraic RHS 91386a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "libCEED algebraic RHS" 91486a4271fSThilina Rathnayake maxit = 100 91586a4271fSThilina Rathnayake tstart = dnekclock() 91686a4271fSThilina Rathnayake call cggos(u1,r2,h1,h2,vmult,binvm1,tol,ceed,op_mass, 91786a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp1') 91886a4271fSThilina Rathnayake tstop = dnekclock() 91986a4271fSThilina Rathnayake 92086a4271fSThilina RathnayakeC Output 92186a4271fSThilina Rathnayake telaps = (tstop-tstart) 92286a4271fSThilina Rathnayake maxits = maxit 92386a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 92486a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 92586a4271fSThilina Rathnayake 92686a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 92786a4271fSThilina Rathnayake if (maxit>=100) then 92886a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 92986a4271fSThilina Rathnayake endif 93086a4271fSThilina Rathnayake if (dabs(er1)>1e-5) then 93186a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 93286a4271fSThilina Rathnayake endif 93386a4271fSThilina Rathnayake endif 93486a4271fSThilina Rathnayake 93586a4271fSThilina Rathnayake nx = nx1-1 936e2b2c771Svaleria nnode = nelgt ! nnodes 937e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 938e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 93986a4271fSThilina Rathnayake 94005939c60Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 94186a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 94286a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 94386a4271fSThilina Rathnayake 94486a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 94505939c60Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 94686a4271fSThilina Rathnayake 94786a4271fSThilina RathnayakeC Solve Nek5000 algebraic RHS 94886a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "Nek5000 algebraic RHS" 94986a4271fSThilina Rathnayake maxit = 100 95086a4271fSThilina Rathnayake tstart = dnekclock() 95186a4271fSThilina Rathnayake call cggos(u1,r3,h1,h2,vmult,binvm1,tol,ceed,op_mass, 95286a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp1') 95386a4271fSThilina Rathnayake tstop = dnekclock() 95486a4271fSThilina Rathnayake 95586a4271fSThilina RathnayakeC Output 95686a4271fSThilina Rathnayake telaps = (tstop-tstart) 95786a4271fSThilina Rathnayake maxits = maxit 95886a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 95986a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 96086a4271fSThilina Rathnayake 96186a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 96286a4271fSThilina Rathnayake if (maxit>=100) then 96386a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 96486a4271fSThilina Rathnayake endif 96586a4271fSThilina Rathnayake if (dabs(er1)>1e-5) then 96686a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 96786a4271fSThilina Rathnayake endif 96886a4271fSThilina Rathnayake endif 96986a4271fSThilina Rathnayake 97086a4271fSThilina Rathnayake nx = nx1-1 971e2b2c771Svaleria nnode = nelgt ! nnodes 972e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 973e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 97486a4271fSThilina Rathnayake 97505939c60Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 97686a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 97786a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 97886a4271fSThilina Rathnayake 97986a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 98005939c60Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 98186a4271fSThilina Rathnayake 98286a4271fSThilina Rathnayake 1 format(a12,i7,i3,i7,i10,i14,i10,i4,1p4e13.5) 98386a4271fSThilina Rathnayake 3 format(i3,i9,e12.4,1x,a8,i9) 98486a4271fSThilina Rathnayake 98586a4271fSThilina RathnayakeC Destroy ceed handles 98686a4271fSThilina Rathnayake call ceedvectordestroy(vec_p1,err) 98786a4271fSThilina Rathnayake call ceedvectordestroy(vec_ap1,err) 98886a4271fSThilina Rathnayake call ceedvectordestroy(vec_rhs,err) 98986a4271fSThilina Rathnayake call ceedvectordestroy(vec_qdata,err) 99086a4271fSThilina Rathnayake call ceedvectordestroy(vec_coords,err) 99186a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctu,err) 99286a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctx,err) 99386a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctw,err) 99486a4271fSThilina Rathnayake call ceedbasisdestroy(basisu,err) 99586a4271fSThilina Rathnayake call ceedbasisdestroy(basisx,err) 99686a4271fSThilina Rathnayake call ceedqfunctiondestroy(qf_setup,err) 99786a4271fSThilina Rathnayake call ceedqfunctiondestroy(qf_mass,err) 99886a4271fSThilina Rathnayake call ceedoperatordestroy(op_setup,err) 99986a4271fSThilina Rathnayake call ceedoperatordestroy(op_mass,err) 100086a4271fSThilina Rathnayake call ceeddestroy(ceed,err) 100186a4271fSThilina Rathnayake 100286a4271fSThilina Rathnayake return 100386a4271fSThilina Rathnayake end 100486a4271fSThilina RathnayakeC----------------------------------------------------------------------- 100586a4271fSThilina Rathnayake subroutine bp3 100686a4271fSThilina RathnayakeC Solution to BP3 using libCEED 100786a4271fSThilina Rathnayake include 'SIZE' 100886a4271fSThilina Rathnayake include 'TOTAL' 100986a4271fSThilina Rathnayake include 'CTIMER' ! ifsync 101086a4271fSThilina Rathnayake include 'FDMH1' 1011ec3da8bcSJed Brown include 'ceed/fortran.h' 101286a4271fSThilina Rathnayake 101386a4271fSThilina Rathnayake parameter (lzq=lx1+1) 101486a4271fSThilina Rathnayake parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2),lq=lzq**ldim) 101586a4271fSThilina Rathnayake common /bpgfactors/ gf(lg*lq,lelt),bmq(lq,lelt),w3mq(lq) 101686a4271fSThilina Rathnayake 101786a4271fSThilina Rathnayake parameter (lt=lx1*ly1*lz1*lelt) 101886a4271fSThilina Rathnayake parameter (ld=lxd*lyd*lzd*lelt) 101986a4271fSThilina Rathnayake common /vcrns/ u1(lt),r1(lt),r2(lt),r3(lt) 102086a4271fSThilina Rathnayake common /vcrny/ e1(lt) 102186a4271fSThilina Rathnayake common /vcrvh/ h1(lt),h2(ld),pap(3) 102286a4271fSThilina Rathnayake real*8 coords(ldim*lx*lelt) 102386a4271fSThilina Rathnayake 102486a4271fSThilina Rathnayake logical ifh3 1025e2b2c771Svaleria integer*8 nnode 102686a4271fSThilina Rathnayake integer ceed,err,test 102786a4271fSThilina Rathnayake character*64 spec 102886a4271fSThilina Rathnayake 102934d77899SValeria Barra integer p,q,ncompx,ncompu,enode,lnode 103086a4271fSThilina Rathnayake integer vec_p1,vec_ap1,vec_qdata,vec_coords,vec_rhs 10317509a596Sjeremylt integer stridesu(3),stridesx(3),stridesw(3) 103286a4271fSThilina Rathnayake integer erstrctu,erstrctx,erstrctw 103386a4271fSThilina Rathnayake integer basisu,basisx 103486a4271fSThilina Rathnayake integer qf_diffusion,qf_setup 103586a4271fSThilina Rathnayake integer op_diffusion,op_setup 103686a4271fSThilina Rathnayake integer ii,i,ngeo 103786a4271fSThilina Rathnayake real*8 x,y,z 103886a4271fSThilina Rathnayake integer*8 offset 103986a4271fSThilina Rathnayake 104086a4271fSThilina Rathnayake external diffusionf,diffsetupf 104186a4271fSThilina Rathnayake 104286a4271fSThilina Rathnayake ifield = 1 104386a4271fSThilina Rathnayake nxq = nx1+1 104486a4271fSThilina Rathnayake n = nx1*ny1*nz1*nelt 104586a4271fSThilina Rathnayake 104686a4271fSThilina Rathnayake ifsync = .false. 104786a4271fSThilina Rathnayake 104886a4271fSThilina RathnayakeC Set up coordinates and mask 104986a4271fSThilina Rathnayake ii=0 105086a4271fSThilina Rathnayake do j=0,nelt-1 105186a4271fSThilina Rathnayake do i=1,lx 105286a4271fSThilina Rathnayake ii=ii+1 105386a4271fSThilina Rathnayake x = xm1(ii,1,1,1) 105486a4271fSThilina Rathnayake y = ym1(ii,1,1,1) 105586a4271fSThilina Rathnayake z = zm1(ii,1,1,1) 105686a4271fSThilina Rathnayake coords(i+0*lx+3*j*lx)=x 105786a4271fSThilina Rathnayake coords(i+1*lx+3*j*lx)=y 105886a4271fSThilina Rathnayake coords(i+2*lx+3*j*lx)=z 105986a4271fSThilina Rathnayake if ( x.eq.0.or.x.eq.1 106086a4271fSThilina Rathnayake $ .or.y.eq.0.or.y.eq.1 106186a4271fSThilina Rathnayake $ .or.z.eq.0.or.z.eq.1 ) then 106286a4271fSThilina Rathnayake h2(ii)=0. 106386a4271fSThilina Rathnayake else 106486a4271fSThilina Rathnayake h2(ii)=1. 106586a4271fSThilina Rathnayake endif 106686a4271fSThilina Rathnayake enddo 106786a4271fSThilina Rathnayake enddo 106886a4271fSThilina Rathnayake 106986a4271fSThilina RathnayakeC Init ceed library 107086a4271fSThilina Rathnayake call get_spec(spec) 107186a4271fSThilina Rathnayake call ceedinit(trim(spec)//char(0),ceed,err) 107286a4271fSThilina Rathnayake 107386a4271fSThilina Rathnayake call get_test(test) 107486a4271fSThilina Rathnayake 107586a4271fSThilina RathnayakeC Set up Nek geometry data 107686a4271fSThilina Rathnayake call geodatq (gf,bmq,w3mq,nxq) ! Set up gf() arrays 107786a4271fSThilina Rathnayake 107886a4271fSThilina RathnayakeC Set up true soln 107986a4271fSThilina Rathnayake call sin_fld_h1 (e1) 108086a4271fSThilina Rathnayake call xmask1 (e1,h2,nelt) 108186a4271fSThilina Rathnayake call copy (h1,e1,n) ! Save exact soln in h1 108286a4271fSThilina Rathnayake 108386a4271fSThilina RathnayakeC Set up solver parameters 108486a4271fSThilina Rathnayake tol = 1e-10 108586a4271fSThilina Rathnayake param(22) = tol 108686a4271fSThilina Rathnayake maxit = 100 108786a4271fSThilina Rathnayake 108886a4271fSThilina Rathnayake call nekgsync() 108986a4271fSThilina Rathnayake 109086a4271fSThilina RathnayakeC Create ceed basis for mesh and computation 109186a4271fSThilina Rathnayake p=nx1 109286a4271fSThilina Rathnayake q=p+1 109334d77899SValeria Barra ncompu=1 109434d77899SValeria Barra ncompx=ldim 109534d77899SValeria Barra call ceedbasiscreatetensorh1lagrange(ceed,ldim,ncompx,p,q, 109686a4271fSThilina Rathnayake $ ceed_gauss,basisx,err) 109734d77899SValeria Barra call ceedbasiscreatetensorh1lagrange(ceed,ldim,ncompu,p,q, 109886a4271fSThilina Rathnayake $ ceed_gauss,basisu,err) 109986a4271fSThilina Rathnayake 110086a4271fSThilina RathnayakeC Create ceed element restrictions for mesh and computation 1101e2b2c771Svaleria enode=p**ldim 110234d77899SValeria Barra lnode=enode*nelt*ncompu 110386a4271fSThilina Rathnayake ngeo=(ldim*(ldim+1))/2 11047509a596Sjeremylt stridesx=[1,enode,enode*ldim] 1105d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,enode,ldim, 1106d979a051Sjeremylt $ ldim*lnode,stridesx,erstrctx,err) 11077509a596Sjeremylt stridesu=[1,enode,enode*ncompu] 1108d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,enode,ncompu, 1109d979a051Sjeremylt $ ncompu*lnode,stridesu,erstrctu,err) 11107509a596Sjeremylt stridesw=[1,q**ldim,ngeo*q**ldim] 11117509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelt,q**ldim, 1112d979a051Sjeremylt $ ngeo,nelt*q**ldim*ngeo,stridesw,erstrctw,err) 111386a4271fSThilina Rathnayake 111486a4271fSThilina RathnayakeC Create ceed vectors 1115e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_p1,err) 1116e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_ap1,err) 1117e2b2c771Svaleria call ceedvectorcreate(ceed,lnode,vec_rhs,err) 111886a4271fSThilina Rathnayake call ceedvectorcreate(ceed,ldim*lx*nelt,vec_coords,err) 111986a4271fSThilina Rathnayake call ceedvectorcreate(ceed,nelt*ngeo*q**ldim,vec_qdata,err) 112086a4271fSThilina Rathnayake 112186a4271fSThilina Rathnayake offset=0 112286a4271fSThilina Rathnayake call ceedvectorsetarray(vec_coords,ceed_mem_host, 112386a4271fSThilina Rathnayake $ ceed_use_pointer,coords,offset,err) 112486a4271fSThilina Rathnayake 112586a4271fSThilina RathnayakeC Create ceed qfunctions for diffsetupf and diffusionf 112686a4271fSThilina Rathnayake call ceedqfunctioncreateinterior(ceed,1,diffsetupf, 11272d50dd3dSjeremylt $ EXAMPLE_DIR 11282d50dd3dSjeremylt $ //'bps/bps.h:diffsetupf'//char(0),qf_setup,err) 112934d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'x',ncompx, 113086a4271fSThilina Rathnayake $ ceed_eval_interp,err) 113134d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'dx',ncompx*ldim, 113286a4271fSThilina Rathnayake $ ceed_eval_grad,err) 113334d77899SValeria Barra call ceedqfunctionaddinput(qf_setup,'weight',ncompu, 113486a4271fSThilina Rathnayake $ ceed_eval_weight,err) 1135a2fa7910SValeria Barra call ceedqfunctionaddoutput(qf_setup,'qdata',ngeo, 113686a4271fSThilina Rathnayake $ ceed_eval_none,err) 113734d77899SValeria Barra call ceedqfunctionaddoutput(qf_setup,'rhs',ncompu, 113886a4271fSThilina Rathnayake $ ceed_eval_interp,err) 113986a4271fSThilina Rathnayake 114086a4271fSThilina Rathnayake call ceedqfunctioncreateinterior(ceed,1,diffusionf, 11412d50dd3dSjeremylt $ EXAMPLE_DIR 11422d50dd3dSjeremylt $ //'bps/bps.h:diffusionf'//char(0),qf_diffusion,err) 114334d77899SValeria Barra call ceedqfunctionaddinput(qf_diffusion,'u',ncompu*ldim, 114486a4271fSThilina Rathnayake $ ceed_eval_grad,err) 1145a2fa7910SValeria Barra call ceedqfunctionaddinput(qf_diffusion,'qdata',ngeo, 114686a4271fSThilina Rathnayake $ ceed_eval_none,err) 114734d77899SValeria Barra call ceedqfunctionaddoutput(qf_diffusion,'v',ncompu*ldim, 114886a4271fSThilina Rathnayake $ ceed_eval_grad,err) 114986a4271fSThilina Rathnayake 115086a4271fSThilina RathnayakeC Create ceed operators 115186a4271fSThilina Rathnayake call ceedoperatorcreate(ceed,qf_setup, 1152442e7f0bSjeremylt $ ceed_qfunction_none,ceed_qfunction_none,op_setup,err) 115386a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'x',erstrctx, 1154a8d32208Sjeremylt $ basisx,ceed_vector_active,err) 115586a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'dx',erstrctx, 1156a8d32208Sjeremylt $ basisx,ceed_vector_active,err) 115715910d16Sjeremylt call ceedoperatorsetfield(op_setup,'weight', 115815910d16Sjeremylt $ ceed_elemrestriction_none,basisx,ceed_vector_none,err) 1159a2fa7910SValeria Barra call ceedoperatorsetfield(op_setup,'qdata',erstrctw, 1160*356036faSJeremy L Thompson $ CEED_BASIS_NONE,ceed_vector_active,err) 116186a4271fSThilina Rathnayake call ceedoperatorsetfield(op_setup,'rhs',erstrctu, 1162a8d32208Sjeremylt $ basisu,vec_rhs,err) 116386a4271fSThilina Rathnayake 116486a4271fSThilina Rathnayake call ceedoperatorcreate(ceed,qf_diffusion, 116561dbc9d2Sjeremylt $ ceed_qfunction_none,ceed_qfunction_none,op_diffusion,err) 116686a4271fSThilina Rathnayake call ceedoperatorsetfield(op_diffusion,'u',erstrctu, 1167a8d32208Sjeremylt $ basisu,ceed_vector_active,err) 1168a2fa7910SValeria Barra call ceedoperatorsetfield(op_diffusion,'qdata',erstrctw, 1169*356036faSJeremy L Thompson $ CEED_BASIS_NONE,vec_qdata,err) 117086a4271fSThilina Rathnayake call ceedoperatorsetfield(op_diffusion,'v',erstrctu, 1171a8d32208Sjeremylt $ basisu,ceed_vector_active,err) 117286a4271fSThilina Rathnayake 117386a4271fSThilina RathnayakeC Compute setup data 117486a4271fSThilina Rathnayake call ceedvectorsetarray(vec_rhs,ceed_mem_host, 117586a4271fSThilina Rathnayake $ ceed_use_pointer,r1,offset,err) 117686a4271fSThilina Rathnayake call ceedoperatorapply(op_setup,vec_coords,vec_qdata, 117786a4271fSThilina Rathnayake $ ceed_request_immediate,err) 117886a4271fSThilina Rathnayake 117986a4271fSThilina RathnayakeC Set up true RHS 118086a4271fSThilina Rathnayake call dssum (r1,nx1,ny1,nz1) ! r1 118186a4271fSThilina Rathnayake call xmask1 (r1,h2,nelt) 118286a4271fSThilina Rathnayake 118386a4271fSThilina RathnayakeC Set up algebraic RHS with libCEED 118486a4271fSThilina Rathnayake call ceedvectorsetarray(vec_p1,ceed_mem_host, 118586a4271fSThilina Rathnayake $ ceed_use_pointer,h1,offset,err) 118686a4271fSThilina Rathnayake call ceedvectorsetarray(vec_ap1,ceed_mem_host, 118786a4271fSThilina Rathnayake $ ceed_use_pointer,r2,offset,err) 118886a4271fSThilina Rathnayake call ceedoperatorapply(op_diffusion,vec_p1,vec_ap1, 118986a4271fSThilina Rathnayake $ ceed_request_immediate,err) ! r2 = A_ceed*h1 119086a4271fSThilina Rathnayake call dssum (r2,nx1,ny1,nz1) 119186a4271fSThilina Rathnayake call xmask1 (r2,h2,nelt) 119286a4271fSThilina Rathnayake 119386a4271fSThilina RathnayakeC Set up algebraic RHS with Nek5000 119486a4271fSThilina Rathnayake call axhm1 (pap,r3,h1,h1,h2,'bp3') ! r3 = A_nek5k*h1 119586a4271fSThilina Rathnayake call dssum (r3,nx1,ny1,nz1) 119686a4271fSThilina Rathnayake call xmask1 (r3,h2,nelt) 119786a4271fSThilina Rathnayake 119886a4271fSThilina Rathnayake call nekgsync() 119986a4271fSThilina Rathnayake 120086a4271fSThilina RathnayakeC Solve true RHS 120186a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "libCEED true RHS" 120286a4271fSThilina Rathnayake tstart = dnekclock() 120386a4271fSThilina Rathnayake call cggos(u1,r1,h1,h2,vmult,binvm1,tol,ceed,op_diffusion, 120486a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp3') 120586a4271fSThilina Rathnayake tstop = dnekclock() 120686a4271fSThilina Rathnayake 120786a4271fSThilina RathnayakeC Output 120886a4271fSThilina Rathnayake telaps = (tstop-tstart) 120986a4271fSThilina Rathnayake maxits = maxit 121086a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 121186a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 121286a4271fSThilina Rathnayake 121386a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 121486a4271fSThilina Rathnayake if (maxit>=100) then 121586a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 121686a4271fSThilina Rathnayake endif 121786a4271fSThilina Rathnayake if (dabs(er1)>1e-3) then 121886a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 121986a4271fSThilina Rathnayake endif 122086a4271fSThilina Rathnayake endif 122186a4271fSThilina Rathnayake 122286a4271fSThilina Rathnayake nx = nx1-1 1223e2b2c771Svaleria nnode = nelgt ! nnodes 1224e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 1225e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 122686a4271fSThilina Rathnayake 122705939c60Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 122886a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 122986a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 123086a4271fSThilina Rathnayake 123186a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 123205939c60Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 123386a4271fSThilina Rathnayake 123486a4271fSThilina RathnayakeC Solve libCEED algebraic RHS 123586a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "libCEED algebraic RHS" 123686a4271fSThilina Rathnayake maxit = 100 123786a4271fSThilina Rathnayake tstart = dnekclock() 123886a4271fSThilina Rathnayake call cggos(u1,r2,h1,h2,vmult,binvm1,tol,ceed,op_diffusion, 123986a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp3') 124086a4271fSThilina Rathnayake tstop = dnekclock() 124186a4271fSThilina Rathnayake 124286a4271fSThilina RathnayakeC Output 124386a4271fSThilina Rathnayake telaps = (tstop-tstart) 124486a4271fSThilina Rathnayake maxits = maxit 124586a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 124686a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 124786a4271fSThilina Rathnayake 124886a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 124986a4271fSThilina Rathnayake if (maxit>=100) then 125086a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 125186a4271fSThilina Rathnayake endif 125286a4271fSThilina Rathnayake if (dabs(er1)>1e-9) then 125386a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 125486a4271fSThilina Rathnayake endif 125586a4271fSThilina Rathnayake endif 125686a4271fSThilina Rathnayake 125786a4271fSThilina Rathnayake nx = nx1-1 1258e2b2c771Svaleria nnode = nelgt ! nnodes 1259e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 1260e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 126186a4271fSThilina Rathnayake 126205939c60Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 126386a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 126486a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 126586a4271fSThilina Rathnayake 126686a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 126705939c60Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 126886a4271fSThilina Rathnayake 126986a4271fSThilina RathnayakeC Solve Nek5000 algebraic RHS 127086a4271fSThilina Rathnayake if (nid.eq.0) write (6,*) "Nek5000 algebraic RHS" 127186a4271fSThilina Rathnayake maxit = 100 127286a4271fSThilina Rathnayake tstart = dnekclock() 127386a4271fSThilina Rathnayake call cggos(u1,r3,h1,h2,vmult,binvm1,tol,ceed,op_diffusion, 127486a4271fSThilina Rathnayake $ vec_p1,vec_ap1,maxit,'bp3') 127586a4271fSThilina Rathnayake tstop = dnekclock() 127686a4271fSThilina Rathnayake 127786a4271fSThilina RathnayakeC Output 127886a4271fSThilina Rathnayake telaps = (tstop-tstart) 127986a4271fSThilina Rathnayake maxits = maxit 128086a4271fSThilina Rathnayake er1 = glrdif(u1,e1,n) 128186a4271fSThilina Rathnayake if (nid.eq.0) write(6,3) lx1,nelgv,er1,' error ',maxit 128286a4271fSThilina Rathnayake 128386a4271fSThilina Rathnayake if (test.eq.1.and.nid.eq.0) then 128486a4271fSThilina Rathnayake if (maxit>=100) then 128586a4271fSThilina Rathnayake write(6,*) "UNCONVERGED CG" 128686a4271fSThilina Rathnayake endif 128786a4271fSThilina Rathnayake if (dabs(er1)>1e-9) then 128886a4271fSThilina Rathnayake write(6,*) "ERROR IS TOO LARGE" 128986a4271fSThilina Rathnayake endif 129086a4271fSThilina Rathnayake endif 129186a4271fSThilina Rathnayake 129286a4271fSThilina Rathnayake nx = nx1-1 1293e2b2c771Svaleria nnode = nelgt ! nnodes 1294e2b2c771Svaleria nnode = nnode*(nx**ldim) ! nnodes 1295e2b2c771Svaleria nppp = nnode/np ! nnodes/proc 129686a4271fSThilina Rathnayake 129761dbc9d2Sjeremylt dofps = nnode/telaps ! DOF/sec - scalar form 129886a4271fSThilina Rathnayake titers = telaps/maxits ! time per iteration 129986a4271fSThilina Rathnayake tppp_s = titers/nppp ! time per iteraton per local point 130086a4271fSThilina Rathnayake 130186a4271fSThilina Rathnayake if (nid.eq.0) write(6,1) 'case scalar:' 130261dbc9d2Sjeremylt $ ,np,nx,nelt,nelgt,nnode,nppp,maxits,telaps,dofps,titers,tppp_s 130386a4271fSThilina Rathnayake 130486a4271fSThilina Rathnayake 1 format(a12,i7,i3,i7,i10,i14,i10,i4,1p4e13.5) 130586a4271fSThilina Rathnayake 3 format(i3,i9,e12.4,1x,a8,i9) 130686a4271fSThilina Rathnayake 130786a4271fSThilina RathnayakeC Destroy ceed handles 130886a4271fSThilina Rathnayake call ceedvectordestroy(vec_p1,err) 130986a4271fSThilina Rathnayake call ceedvectordestroy(vec_ap1,err) 131086a4271fSThilina Rathnayake call ceedvectordestroy(vec_rhs,err) 131186a4271fSThilina Rathnayake call ceedvectordestroy(vec_qdata,err) 131286a4271fSThilina Rathnayake call ceedvectordestroy(vec_coords,err) 131386a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctu,err) 131486a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctx,err) 131586a4271fSThilina Rathnayake call ceedelemrestrictiondestroy(erstrctw,err) 131686a4271fSThilina Rathnayake call ceedbasisdestroy(basisu,err) 131786a4271fSThilina Rathnayake call ceedbasisdestroy(basisx,err) 131886a4271fSThilina Rathnayake call ceedqfunctiondestroy(qf_setup,err) 131986a4271fSThilina Rathnayake call ceedqfunctiondestroy(qf_diffusion,err) 132086a4271fSThilina Rathnayake call ceedoperatordestroy(op_setup,err) 132186a4271fSThilina Rathnayake call ceedoperatordestroy(op_diffusion,err) 132286a4271fSThilina Rathnayake call ceeddestroy(ceed,err) 132386a4271fSThilina Rathnayake 132486a4271fSThilina Rathnayake return 132586a4271fSThilina Rathnayake end 132686a4271fSThilina RathnayakeC----------------------------------------------------------------------- 132786a4271fSThilina Rathnayake subroutine cggos(u1,r1,h1,h2,rmult,binv,tin,ceed,ceed_op,vec_p1, 132886a4271fSThilina Rathnayake $ vec_ap1,maxit,bpname) 132986a4271fSThilina RathnayakeC Scalar conjugate gradient iteration for solution of uncoupled 133086a4271fSThilina RathnayakeC Helmholtz equations 133186a4271fSThilina RathnayakeC Input: r1,h1,h2,rmult,binv,tin,ceed,ceed_op,vec_p1,vec_ap1,bpname 133286a4271fSThilina RathnayakeC Output: u1,maxit 133386a4271fSThilina Rathnayake include 'SIZE' 133486a4271fSThilina Rathnayake include 'TOTAL' 133586a4271fSThilina Rathnayake include 'DOMAIN' 133686a4271fSThilina Rathnayake include 'FDMH1' 133786a4271fSThilina Rathnayake character*3 bpname 133886a4271fSThilina Rathnayake 133986a4271fSThilina RathnayakeC INPUT: rhs1 - rhs 134086a4271fSThilina RathnayakeC h1 - exact solution 134186a4271fSThilina Rathnayake 134286a4271fSThilina Rathnayake parameter (lt=lx1*ly1*lz1*lelt) 134386a4271fSThilina Rathnayake parameter (ld=lxd*lyd*lzd*lelt) 134486a4271fSThilina Rathnayake real*8 u1(lt),r1(lt),h1(lt),h2(lt) 134586a4271fSThilina Rathnayake real*8 rmult(1),binv(1) 134686a4271fSThilina Rathnayake integer ceed,ceed_op,vec_ap1,vec_p1 134786a4271fSThilina Rathnayake common /scrcg/ dpc(lt),p1(lt),z1(lt) 134886a4271fSThilina Rathnayake common /scrca/ wv(4),wk(4),rpp1(4),rpp2(4),alph(4),beta(4),pap(4) 134986a4271fSThilina Rathnayake 135086a4271fSThilina Rathnayake real*8 ap1(lt) 135186a4271fSThilina Rathnayake equivalence (ap1,z1) 135286a4271fSThilina Rathnayake 135386a4271fSThilina Rathnayake vol = volfld(ifield) 135486a4271fSThilina Rathnayake nel = nelfld(ifield) 135586a4271fSThilina Rathnayake nxyz = lx1*ly1*lz1 135686a4271fSThilina Rathnayake n = nxyz*nel 135786a4271fSThilina Rathnayake nx = nx1-1 ! Polynomial order (just for i/o) 135886a4271fSThilina Rathnayake 135986a4271fSThilina Rathnayake tol=tin 136086a4271fSThilina Rathnayake 136186a4271fSThilina Rathnayake if(bpname.ne.'bp1') then 136286a4271fSThilina Rathnayake call setprecn_bp3(dpc,h1,h2) ! Set up diagional pre-conidtioner 136386a4271fSThilina Rathnayake else 136486a4271fSThilina Rathnayake call setprecn_bp1(dpc,h1,h2) ! Set up diagional pre-conidtioner 136586a4271fSThilina Rathnayake endif 136686a4271fSThilina Rathnayake 136786a4271fSThilina Rathnayake call rzero (u1,n) ! Initialize solution 136886a4271fSThilina Rathnayake 136986a4271fSThilina Rathnayake wv(1)=0 137086a4271fSThilina Rathnayake do i=1,n 137186a4271fSThilina Rathnayake s=rmult(i) ! -1 137286a4271fSThilina Rathnayake p1(i)=dpc(i)*r1(i) ! p = M r T 137386a4271fSThilina Rathnayake wv(1)=wv(1)+s*p1(i)*r1(i) ! r p 137486a4271fSThilina Rathnayake enddo 137586a4271fSThilina Rathnayake call gop(wv(1),wk,'+ ',1) 137686a4271fSThilina Rathnayake rpp1(1) = wv (1) 137786a4271fSThilina Rathnayake 137886a4271fSThilina Rathnayake do 1000 iter=1,maxit 137986a4271fSThilina Rathnayake call axhm1_ceed (pap,ap1,p1,h1,h2,ceed,ceed_op, 138086a4271fSThilina Rathnayake $ vec_ap1,vec_p1) 138186a4271fSThilina Rathnayake call dssum (ap1,nx1,ny1,nz1) 138286a4271fSThilina Rathnayake if (bpname.ne.'bp1') call xmask1(ap1,h2,nel) 138386a4271fSThilina Rathnayake 138486a4271fSThilina Rathnayake call gop (pap,wk,'+ ',1) 138586a4271fSThilina Rathnayake alph(1) = rpp1(1)/pap(1) 138686a4271fSThilina Rathnayake 138786a4271fSThilina Rathnayake do i=1,n 138886a4271fSThilina Rathnayake u1(i)=u1(i)+alph(1)* p1(i) 138986a4271fSThilina Rathnayake r1(i)=r1(i)-alph(1)*ap1(i) 139086a4271fSThilina Rathnayake enddo 139186a4271fSThilina Rathnayake 139286a4271fSThilina RathnayakeC tolerance check here 139386a4271fSThilina Rathnayake call rzero(wv,2) 139486a4271fSThilina Rathnayake do i=1,n 139586a4271fSThilina Rathnayake wv(1)=wv(1)+r1(i)*r1(i) ! L2 error estimate 139686a4271fSThilina Rathnayake z1(i)=dpc(i)*r1(i) ! z = M r 139786a4271fSThilina Rathnayake wv(2)=wv(2)+rmult(i)*z1(i)*r1(i) ! r z 139886a4271fSThilina Rathnayake enddo 139986a4271fSThilina Rathnayake call gop(wv,wk,'+ ',2) 140086a4271fSThilina Rathnayake 140186a4271fSThilina RathnayakeC if (nio.eq.0) write(6,1) ifield,istep,iter,nx,(wv(k),k=1,1) 140286a4271fSThilina Rathnayake 1 format(i2,i9,i5,i4,1p1e12.4,' cggos') 140386a4271fSThilina Rathnayake 140486a4271fSThilina Rathnayake enorm=sqrt(wv(1)) 140586a4271fSThilina Rathnayake if (enorm.lt.tol) then 140686a4271fSThilina Rathnayake ifin = iter 140786a4271fSThilina Rathnayake if (nio.eq.0) write(6,3000) istep,ifin,enorm,tol 140886a4271fSThilina Rathnayake goto 9999 140986a4271fSThilina Rathnayake endif 141086a4271fSThilina RathnayakeC if (nio.eq.0) write(6,2) iter,enorm,alph(1),pap(1),'alpha' 141186a4271fSThilina Rathnayake 2 format(i5,1p3e12.4,2x,a5) 141286a4271fSThilina Rathnayake 141386a4271fSThilina Rathnayake rpp2(1)=rpp1(1) 141486a4271fSThilina Rathnayake rpp1(1)=wv (2) 141586a4271fSThilina Rathnayake beta1 =rpp1(1)/rpp2(1) 141686a4271fSThilina Rathnayake do i=1,n 141786a4271fSThilina Rathnayake p1(i)=z1(i) + beta1*p1(i) 141886a4271fSThilina Rathnayake enddo 141986a4271fSThilina Rathnayake 142086a4271fSThilina Rathnayake 1000 continue 142186a4271fSThilina Rathnayake 142286a4271fSThilina Rathnayake rbnorm=sqrt(wv(1)) 142386a4271fSThilina Rathnayake if (nio.eq.0) write (6,3001) istep,iter,rbnorm,tol 142486a4271fSThilina Rathnayake iter = iter-1 142586a4271fSThilina Rathnayake 142686a4271fSThilina Rathnayake 9999 continue 142786a4271fSThilina Rathnayake 142886a4271fSThilina Rathnayake maxit=iter 142986a4271fSThilina Rathnayake 143086a4271fSThilina Rathnayake 3000 format(i12,1x,'cggo scalar:',i6,1p5e13.4) 143186a4271fSThilina Rathnayake 3001 format(2i6,' Unconverged cggo scalar: rbnorm =',1p2e13.6) 143286a4271fSThilina Rathnayake 143386a4271fSThilina Rathnayake return 143486a4271fSThilina Rathnayake end 143586a4271fSThilina RathnayakeC----------------------------------------------------------------------- 143686a4271fSThilina Rathnayake subroutine axhm1_ceed(pap,ap1,p1,h1,h2,ceed,ceed_op, 143786a4271fSThilina Rathnayake $ vec_ap1,vec_p1) 143886a4271fSThilina RathnayakeC Vector conjugate gradient matvec for solution of uncoupled 143986a4271fSThilina RathnayakeC Helmholtz equations 144086a4271fSThilina RathnayakeC Input: pap,p1,h1,h2,bpname,ceed,ceed_op,vec_ap1,vec_p1 144186a4271fSThilina RathnayakeC Output: ap1 144286a4271fSThilina Rathnayake include 'SIZE' 144386a4271fSThilina Rathnayake include 'TOTAL' 1444ec3da8bcSJed Brown include 'ceed/fortran.h' 144586a4271fSThilina Rathnayake 144686a4271fSThilina Rathnayake parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2)) 144786a4271fSThilina Rathnayake real*8 gf(lg,lx,lelt) ! Equivalence new gf() data 144886a4271fSThilina Rathnayake equivalence (gf,g1m1) ! layout to g1m1...g6m1 144986a4271fSThilina Rathnayake 145086a4271fSThilina Rathnayake real*8 pap(3) 145186a4271fSThilina Rathnayake real*8 ap1(lx,lelt) 145286a4271fSThilina Rathnayake real*8 p1(lx,lelt) 145386a4271fSThilina Rathnayake real*8 h1(lx,lelt),h2(lx,lelt) 145486a4271fSThilina Rathnayake integer ceed,ceed_op,vec_ap1,vec_p1,err 145586a4271fSThilina Rathnayake integer i,e 145686a4271fSThilina Rathnayake integer*8 offset 145786a4271fSThilina Rathnayake 145886a4271fSThilina Rathnayake offset=0 145986a4271fSThilina Rathnayake call ceedvectorsetarray(vec_p1,ceed_mem_host,ceed_use_pointer, 146086a4271fSThilina Rathnayake $ p1,offset,err) 146186a4271fSThilina Rathnayake call ceedvectorsetarray(vec_ap1,ceed_mem_host,ceed_use_pointer, 146286a4271fSThilina Rathnayake $ ap1,offset,err) 146386a4271fSThilina Rathnayake 146486a4271fSThilina Rathnayake call ceedoperatorapply(ceed_op,vec_p1,vec_ap1, 146586a4271fSThilina Rathnayake $ ceed_request_immediate,err) 146686a4271fSThilina Rathnayake 14676a6c615bSJeremy L Thompson call ceedvectortakearray(vec_p1,ceed_mem_host,0,offset,err) 14686a6c615bSJeremy L Thompson call ceedvectortakearray(vec_ap1,ceed_mem_host,0,offset,err) 146986a4271fSThilina Rathnayake 147086a4271fSThilina Rathnayake pap(1)=0. 147186a4271fSThilina Rathnayake 147286a4271fSThilina Rathnayake do e=1,nelt 147386a4271fSThilina Rathnayake do i=1,lx 147486a4271fSThilina Rathnayake pap(1)=pap(1)+ap1(i,e)*p1(i,e) 147586a4271fSThilina Rathnayake enddo 147686a4271fSThilina Rathnayake enddo 147786a4271fSThilina Rathnayake 147886a4271fSThilina Rathnayake return 147986a4271fSThilina Rathnayake end 148086a4271fSThilina RathnayakeC----------------------------------------------------------------------- 148186a4271fSThilina Rathnayake subroutine ax_e_bp1(w,u,g,h1,h2,b,ju,us,ut) 148286a4271fSThilina RathnayakeC Local matrix-vector for solution of BP3 (stiffness matrix) 148386a4271fSThilina RathnayakeC Input: u,g,h1,h2,b,ju,us,ut Output: w 148486a4271fSThilina Rathnayake include 'SIZE' 148586a4271fSThilina Rathnayake include 'TOTAL' 148686a4271fSThilina Rathnayake 148786a4271fSThilina Rathnayake parameter (lxyz=lx1*ly1*lz1,lg=3+3*(ldim-2)) 148886a4271fSThilina Rathnayake real*8 w(lxyz),u(lxyz),g(lg,lxyz),h1(lxyz),h2(lxyz),b(lxyz) 148986a4271fSThilina Rathnayake real*8 ju(lxyz),us(lxyz),ut(lxyz) 149086a4271fSThilina Rathnayake 149186a4271fSThilina Rathnayake nxq = nx1+1 ! Number of quadrature points 149286a4271fSThilina Rathnayake 149386a4271fSThilina Rathnayake lxyzq = nxq**ldim 149486a4271fSThilina Rathnayake 149586a4271fSThilina Rathnayake call intp_rstd (ju,u,lx1,nxq,if3d,0) ! 0 --> Fwd interpolation 149686a4271fSThilina Rathnayake do i=1,lxyzq 149786a4271fSThilina Rathnayake ju(i)=ju(i)*h2(i) !! h2 must be on the fine grid, w/ quad wts 149886a4271fSThilina Rathnayake enddo 149986a4271fSThilina Rathnayake call intp_rstd (w,ju,lx1,nxq,if3d,1) ! 1 --> ju-->u 150086a4271fSThilina Rathnayake 150186a4271fSThilina Rathnayake return 150286a4271fSThilina Rathnayake end 150386a4271fSThilina RathnayakeC----------------------------------------------------------------------- 150486a4271fSThilina Rathnayake subroutine axhm1_bp1(pap,ap1,p1,h1,h2) 150586a4271fSThilina RathnayakeC Vector conjugate gradient matvec for solution of BP1 (mass matrix) 150686a4271fSThilina RathnayakeC Input: pap,p1,h1,h2 Output: ap1 150786a4271fSThilina Rathnayake include 'SIZE' 150886a4271fSThilina Rathnayake include 'TOTAL' 150986a4271fSThilina Rathnayake 151086a4271fSThilina Rathnayake parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2)) 151186a4271fSThilina Rathnayake real*8 gf(lg,lx,lelt) ! Equivalence new gf() data 151286a4271fSThilina Rathnayake equivalence (gf,g1m1) ! layout to g1m1...g6m1 151386a4271fSThilina Rathnayake 151486a4271fSThilina Rathnayake real*8 pap(3) 151586a4271fSThilina Rathnayake real*8 ap1(lx,lelt) 151686a4271fSThilina Rathnayake real*8 p1(lx,lelt) 151786a4271fSThilina Rathnayake real*8 h1(lx,lelt),h2(lx,lelt) 151886a4271fSThilina Rathnayake 151986a4271fSThilina Rathnayake real*8 ur(lx),us(lx),ut(lx) 152086a4271fSThilina Rathnayake common /ctmp1/ ur,us,ut 152186a4271fSThilina Rathnayake 152286a4271fSThilina Rathnayake integer e 152386a4271fSThilina Rathnayake 152486a4271fSThilina Rathnayake pap(1)=0. 152586a4271fSThilina Rathnayake 152686a4271fSThilina Rathnayake k=1 152786a4271fSThilina Rathnayake nxq = nx1+1 152886a4271fSThilina Rathnayake 152986a4271fSThilina Rathnayake do e=1,nelt 153086a4271fSThilina Rathnayake 153186a4271fSThilina Rathnayake call ax_e_bp1(ap1(1,e),p1(1,e),gf(1,1,e),h1(1,e),h2(k,1) 153286a4271fSThilina Rathnayake $ ,bm1(1,1,1,e),ur,us,ut) 153386a4271fSThilina Rathnayake do i=1,lx 153486a4271fSThilina Rathnayake pap(1)=pap(1)+ap1(i,e)*p1(i,e) 153586a4271fSThilina Rathnayake enddo 153686a4271fSThilina Rathnayake k=k+nxq*nxq*nxq 153786a4271fSThilina Rathnayake 153886a4271fSThilina Rathnayake enddo 153986a4271fSThilina Rathnayake 154086a4271fSThilina Rathnayake return 154186a4271fSThilina Rathnayake end 154286a4271fSThilina RathnayakeC----------------------------------------------------------------------- 154386a4271fSThilina Rathnayake subroutine ax_e_bp3(w,u,g,ur,us,ut,wk) 154486a4271fSThilina RathnayakeC Local matrix-vector for solution of BP3 (stiffness matrix) 154586a4271fSThilina RathnayakeC Input: u,g,ur,us,ut,wk Output: w 154686a4271fSThilina Rathnayake include 'SIZE' 154786a4271fSThilina Rathnayake include 'TOTAL' 154886a4271fSThilina Rathnayake 154986a4271fSThilina Rathnayake parameter (lzq=lx1+1,lxyz=lx1*lx1*lx1,lxyzq=lzq*lzq*lzq) 155086a4271fSThilina Rathnayake 155186a4271fSThilina Rathnayake common /ctmp0/ tmp(lxyzq) 155286a4271fSThilina Rathnayake common /dxmfine/ dxmq(lzq,lzq),dxtmq(lzq,lzq) 155386a4271fSThilina Rathnayake 155486a4271fSThilina Rathnayake real*8 ur(lxyzq),us(lxyzq),ut(lxyzq),wk(lxyzq) 155586a4271fSThilina Rathnayake real*8 w(lxyz),u(lxyz),g(2*ldim,lxyzq) 155686a4271fSThilina Rathnayake 155786a4271fSThilina Rathnayake n = lzq-1 155886a4271fSThilina Rathnayake 155986a4271fSThilina Rathnayake call intp_rstd (wk,u,lx1,lzq,if3d,0) ! 0 --> Fwd interpolation 156086a4271fSThilina Rathnayake call loc_grad3 (ur,us,ut,wk,n,dxmq,dxtmq) 156186a4271fSThilina Rathnayake 156286a4271fSThilina Rathnayake do i=1,lxyzq 156386a4271fSThilina Rathnayake wr = g(1,i)*ur(i) + g(2,i)*us(i) + g(3,i)*ut(i) 156486a4271fSThilina Rathnayake ws = g(2,i)*ur(i) + g(4,i)*us(i) + g(5,i)*ut(i) 156586a4271fSThilina Rathnayake wt = g(3,i)*ur(i) + g(5,i)*us(i) + g(6,i)*ut(i) 156686a4271fSThilina Rathnayake ur(i) = wr 156786a4271fSThilina Rathnayake us(i) = ws 156886a4271fSThilina Rathnayake ut(i) = wt 156986a4271fSThilina Rathnayake enddo 157086a4271fSThilina Rathnayake 157186a4271fSThilina Rathnayake call loc_grad3t (wk,ur,us,ut,n,dxmq,dxtmq,tmp) 157286a4271fSThilina Rathnayake call intp_rstd (w,wk,lx1,lzq,if3d,1) ! 1 --> ju-->u 157386a4271fSThilina Rathnayake 157486a4271fSThilina Rathnayake return 157586a4271fSThilina Rathnayake end 157686a4271fSThilina RathnayakeC----------------------------------------------------------------------- 157786a4271fSThilina Rathnayake subroutine axhm1_bp3(pap,ap1,p1,h1,h2) 157886a4271fSThilina RathnayakeC Vector conjugate gradient matvec for solution of BP3 (stiffness matrix) 157986a4271fSThilina RathnayakeC Input: pap,p1,h1,h2 Output: ap1 158086a4271fSThilina Rathnayake include 'SIZE' 158186a4271fSThilina Rathnayake include 'TOTAL' 158286a4271fSThilina Rathnayake 158386a4271fSThilina Rathnayake parameter (lzq=lx1+1) 158486a4271fSThilina Rathnayake parameter (lx=lx1*ly1*lz1,lg=3+3*(ldim-2),lq=lzq**ldim) 158586a4271fSThilina Rathnayake common /bpgfactors/ gf(lg,lq,lelt),bmq(lq,lelt),w3mq(lq) 158686a4271fSThilina Rathnayake 158786a4271fSThilina Rathnayake real*8 pap(3) 158886a4271fSThilina Rathnayake real*8 ap1(lx,lelt) 158986a4271fSThilina Rathnayake real*8 p1(lx,lelt) 159086a4271fSThilina Rathnayake real*8 h1(lx,lelt),h2(lx,lelt) 159186a4271fSThilina Rathnayake 159286a4271fSThilina Rathnayake common /ctmp1/ ur,us,ut,wk 159386a4271fSThilina Rathnayake real*8 ur(lq),us(lq),ut(lq),wk(lq) 159486a4271fSThilina Rathnayake 159586a4271fSThilina Rathnayake integer e 159686a4271fSThilina Rathnayake 159786a4271fSThilina Rathnayake pap(1)=0. 159886a4271fSThilina Rathnayake 159986a4271fSThilina Rathnayake do e=1,nelt 160086a4271fSThilina Rathnayake 160186a4271fSThilina Rathnayake call ax_e_bp3(ap1(1,e),p1(1,e),gf(1,1,e),ur,us,ut,wk) 160286a4271fSThilina Rathnayake do i=1,lx 160386a4271fSThilina Rathnayake pap(1)=pap(1)+p1(i,e)*ap1(i,e) 160486a4271fSThilina Rathnayake enddo 160586a4271fSThilina Rathnayake 160686a4271fSThilina Rathnayake enddo 160786a4271fSThilina Rathnayake 160886a4271fSThilina Rathnayake return 160986a4271fSThilina Rathnayake end 161086a4271fSThilina RathnayakeC----------------------------------------------------------------------- 161186a4271fSThilina Rathnayake subroutine axhm1(pap,ap1,p1,h1,h2,bpname) 161286a4271fSThilina RathnayakeC Vector conjugate gradient matvec for solution of uncoupled 161386a4271fSThilina RathnayakeC Helmholtz equations 161486a4271fSThilina RathnayakeC Input: pap,p1,h1,h2,bpname Output: ap1 161586a4271fSThilina Rathnayake include 'SIZE' 161686a4271fSThilina Rathnayake include 'TOTAL' 161786a4271fSThilina Rathnayake 161886a4271fSThilina Rathnayake parameter (lx=lx1*ly1*lz1) 161986a4271fSThilina Rathnayake 162086a4271fSThilina Rathnayake real*8 pap(3),ap1(lx,lelt),p1(lx,lelt) 162186a4271fSThilina Rathnayake real*8 h1(lx,lelt),h2(lx,lelt) 162286a4271fSThilina Rathnayake 162386a4271fSThilina Rathnayake character*3 bpname 162486a4271fSThilina Rathnayake 162586a4271fSThilina Rathnayake if (bpname.eq.'bp1') then 162686a4271fSThilina Rathnayake call axhm1_bp1(pap,ap1,p1,h1,h2) 162786a4271fSThilina Rathnayake 162886a4271fSThilina Rathnayake elseif (bpname.eq.'bp3') then 162986a4271fSThilina Rathnayake call axhm1_bp3(pap,ap1,p1,h1,h2) 163086a4271fSThilina Rathnayake 163186a4271fSThilina Rathnayake else 163286a4271fSThilina Rathnayake write(6,*) bpname,' axhm1 bpname error' 163386a4271fSThilina Rathnayake stop 163486a4271fSThilina Rathnayake 163586a4271fSThilina Rathnayake endif 163686a4271fSThilina Rathnayake 163786a4271fSThilina Rathnayake return 163886a4271fSThilina Rathnayake end 163986a4271fSThilina RathnayakeC----------------------------------------------------------------------- 164086a4271fSThilina Rathnayake subroutine get_bp(bp) 164186a4271fSThilina RathnayakeC Get BP to run 164286a4271fSThilina RathnayakeC Input: Output: bp 164386a4271fSThilina Rathnayake integer i,bp 164486a4271fSThilina Rathnayake character*64 bpval 164586a4271fSThilina Rathnayake 164686a4271fSThilina Rathnayake bp=0 164786a4271fSThilina Rathnayake if(iargc().ge.1) then 164886a4271fSThilina Rathnayake call getarg(1,bpval) 164986a4271fSThilina Rathnayake endif 165086a4271fSThilina Rathnayake if(bpval.eq."bp1") then 165186a4271fSThilina Rathnayake bp=1 165286a4271fSThilina Rathnayake elseif(bpval.eq."bp3") then 165386a4271fSThilina Rathnayake bp=3 165486a4271fSThilina Rathnayake endif 165586a4271fSThilina Rathnayake 165686a4271fSThilina Rathnayake return 165786a4271fSThilina Rathnayake end 165886a4271fSThilina RathnayakeC----------------------------------------------------------------------- 165986a4271fSThilina Rathnayake subroutine get_spec(spec) 166086a4271fSThilina RathnayakeC Get CEED backend specification 166186a4271fSThilina RathnayakeC Input: Output: spec 166286a4271fSThilina Rathnayake integer i 166386a4271fSThilina Rathnayake character*64 spec 166486a4271fSThilina Rathnayake 166586a4271fSThilina Rathnayake spec = '/cpu/self' 166686a4271fSThilina Rathnayake if(iargc().ge.2) then 166786a4271fSThilina Rathnayake call getarg(2,spec) 166886a4271fSThilina Rathnayake endif 166986a4271fSThilina Rathnayake 167086a4271fSThilina Rathnayake return 167186a4271fSThilina Rathnayake end 167286a4271fSThilina RathnayakeC----------------------------------------------------------------------- 167386a4271fSThilina Rathnayake subroutine get_test(test) 167486a4271fSThilina RathnayakeC Get test mode flag 167586a4271fSThilina RathnayakeC Input: Output: test 167686a4271fSThilina Rathnayake integer i,test 167786a4271fSThilina Rathnayake character*64 testval 167886a4271fSThilina Rathnayake 167986a4271fSThilina Rathnayake test=0 168086a4271fSThilina Rathnayake if(iargc().ge.3) then 168186a4271fSThilina Rathnayake call getarg(3,testval) 168286a4271fSThilina Rathnayake endif 168386a4271fSThilina Rathnayake if(testval.eq."test") then 168486a4271fSThilina Rathnayake test=1 168586a4271fSThilina Rathnayake endif 168686a4271fSThilina Rathnayake 168786a4271fSThilina Rathnayake return 168886a4271fSThilina Rathnayake end 168986a4271fSThilina RathnayakeC----------------------------------------------------------------------- 169061dbc9d2Sjeremylt 1691