1a7bd39daSjeremylt!----------------------------------------------------------------------- 2a7bd39daSjeremylt subroutine eval(dimn,x,rslt) 3a7bd39daSjeremylt integer dimn 4a7bd39daSjeremylt real*8 x(3) 5a7bd39daSjeremylt real*8 rslt 6a7bd39daSjeremylt 7a7bd39daSjeremylt rslt=tanh(x(1)+0.1) 8a7bd39daSjeremylt if (dimn>1) then 9a7bd39daSjeremylt rslt=rslt+atan(x(2)+0.2) 10a7bd39daSjeremylt endif 11a7bd39daSjeremylt if (dimn>2) then 12a7bd39daSjeremylt rslt=rslt+exp(-(x(3)+0.3)*(x(3)+0.3)) 13a7bd39daSjeremylt endif 14a7bd39daSjeremylt 15a7bd39daSjeremylt end 16a7bd39daSjeremylt!----------------------------------------------------------------------- 17a7bd39daSjeremylt program test 181f9a83abSJed Brown implicit none 19ec3da8bcSJed Brown include 'ceed/fortran.h' 20a7bd39daSjeremylt 21a7bd39daSjeremylt integer ceed,err 22a7bd39daSjeremylt integer x,xq,u,uq,ones,gtposeones 23a7bd39daSjeremylt integer bxl,bug 24a7bd39daSjeremylt integer dimn,d 25a7bd39daSjeremylt integer i 26a7bd39daSjeremylt integer p 27a7bd39daSjeremylt integer q 28a7bd39daSjeremylt parameter(p=8) 2952bfb9bbSJeremy L Thompson parameter(q=10) 30a7bd39daSjeremylt integer maxdim 31a7bd39daSjeremylt parameter(maxdim=3) 32a7bd39daSjeremylt integer qdimnmax 33a7bd39daSjeremylt parameter(qdimnmax=q**maxdim) 34a7bd39daSjeremylt integer pdimnmax 35a7bd39daSjeremylt parameter(pdimnmax=p**maxdim) 36a7bd39daSjeremylt integer xdimmax 37a7bd39daSjeremylt parameter(xdimmax=2**maxdim) 38a7bd39daSjeremylt integer pdimn,qdimn,xdim 39a7bd39daSjeremylt 40a7bd39daSjeremylt real*8 xx(xdimmax*maxdim) 41a7bd39daSjeremylt real*8 xxx(maxdim) 42a7bd39daSjeremylt real*8 xxq(pdimnmax*maxdim) 43a7bd39daSjeremylt real*8 uuq(qdimnmax*maxdim) 44a7bd39daSjeremylt real*8 uu(pdimnmax) 45a7bd39daSjeremylt real*8 ggtposeones(pdimnmax) 46a7bd39daSjeremylt real*8 sum1 47a7bd39daSjeremylt real*8 sum2 48a7bd39daSjeremylt integer dimxqdimn 49a7bd39daSjeremylt integer*8 uoffset,xoffset,offset1,offset2,offset3 50a7bd39daSjeremylt 51a7bd39daSjeremylt character arg*32 52a7bd39daSjeremylt 53a7bd39daSjeremylt call getarg(1,arg) 54a7bd39daSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 55a7bd39daSjeremylt 56a7bd39daSjeremylt do dimn=1,maxdim 57a7bd39daSjeremylt qdimn=q**dimn 58a7bd39daSjeremylt pdimn=p**dimn 59a7bd39daSjeremylt xdim=2**dimn 60a7bd39daSjeremylt dimxqdimn=dimn*qdimn 61a7bd39daSjeremylt sum1=0 62a7bd39daSjeremylt sum2=0 63a7bd39daSjeremylt 64a7bd39daSjeremylt do d=0,dimn-1 65a7bd39daSjeremylt do i=1,xdim 66*3c9d155aSZach Atkins if ((mod(i-1,2**(d+1))/(2**(d))).ne.0) then 67a7bd39daSjeremylt xx(d*xdim+i)=1 68a7bd39daSjeremylt else 69a7bd39daSjeremylt xx(d*xdim+i)=-1 70a7bd39daSjeremylt endif 71a7bd39daSjeremylt enddo 72a7bd39daSjeremylt enddo 73a7bd39daSjeremylt 74a7bd39daSjeremylt call ceedvectorcreate(ceed,xdim*dimn,x,err) 75a7bd39daSjeremylt xoffset=0 76a7bd39daSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,xx,xoffset,err) 77a7bd39daSjeremylt call ceedvectorcreate(ceed,pdimn*dimn,xq,err) 78a7bd39daSjeremylt call ceedvectorsetvalue(xq,0.d0,err) 79a7bd39daSjeremylt call ceedvectorcreate(ceed,pdimn,u,err) 80a7bd39daSjeremylt call ceedvectorcreate(ceed,qdimn*dimn,uq,err) 81a7bd39daSjeremylt call ceedvectorsetvalue(uq,0.d0,err) 82a7bd39daSjeremylt call ceedvectorcreate(ceed,qdimn*dimn,ones,err) 83a7bd39daSjeremylt call ceedvectorsetvalue(ones,1.d0,err) 84a7bd39daSjeremylt call ceedvectorcreate(ceed,pdimn,gtposeones,err) 85a7bd39daSjeremylt call ceedvectorsetvalue(gtposeones,0.d0,err) 86a7bd39daSjeremylt 87a7bd39daSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,dimn,dimn,2,p,& 88a7bd39daSjeremylt & ceed_gauss_lobatto,bxl,err) 89a7bd39daSjeremylt call ceedbasisapply(bxl,1,ceed_notranspose,ceed_eval_interp,x,xq,err) 90a7bd39daSjeremylt 91a7bd39daSjeremylt call ceedvectorgetarrayread(xq,ceed_mem_host,xxq,offset1,err) 92a7bd39daSjeremylt do i=1,pdimn 93a7bd39daSjeremylt do d=0,dimn-1 94a7bd39daSjeremylt xxx(d+1)=xxq(d*pdimn+i+offset1) 95a7bd39daSjeremylt enddo 96a7bd39daSjeremylt call eval(dimn,xxx,uu(i)) 97a7bd39daSjeremylt enddo 98a7bd39daSjeremylt call ceedvectorrestorearrayread(xq,xxq,offset1,err) 99a7bd39daSjeremylt uoffset=0 100a7bd39daSjeremylt call ceedvectorsetarray(u,ceed_mem_host,ceed_use_pointer,uu,uoffset,err) 101a7bd39daSjeremylt 102a7bd39daSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,dimn,1,p,q,ceed_gauss,bug,err) 103a7bd39daSjeremylt 104a7bd39daSjeremylt call ceedbasisapply(bug,1,ceed_notranspose,ceed_eval_grad,u,uq,err) 105a7bd39daSjeremylt call ceedbasisapply(bug,1,ceed_transpose,ceed_eval_grad,ones,& 106a7bd39daSjeremylt & gtposeones,err) 107a7bd39daSjeremylt 108a7bd39daSjeremylt call ceedvectorgetarrayread(gtposeones,ceed_mem_host,ggtposeones,& 109a7bd39daSjeremylt & offset1,err) 110a7bd39daSjeremylt call ceedvectorgetarrayread(u,ceed_mem_host,uu,offset2,err) 111a7bd39daSjeremylt call ceedvectorgetarrayread(uq,ceed_mem_host,uuq,offset3,err) 112a7bd39daSjeremylt do i=1,pdimn 113a7bd39daSjeremylt sum1=sum1+ggtposeones(i+offset1)*uu(i+offset2) 114a7bd39daSjeremylt enddo 115a7bd39daSjeremylt do i=1,dimxqdimn 116a7bd39daSjeremylt sum2=sum2+uuq(i+offset3) 117a7bd39daSjeremylt enddo 118a7bd39daSjeremylt call ceedvectorrestorearrayread(gtposeones,ggtposeones,offset1,err) 119a7bd39daSjeremylt call ceedvectorrestorearrayread(u,uu,offset2,err) 120a7bd39daSjeremylt call ceedvectorrestorearrayread(uq,uuq,offset3,err) 121a7bd39daSjeremylt if(abs(sum1-sum2) > 1.0D-10) then 122a2546046Sjeremylt! LCOV_EXCL_START 123a7bd39daSjeremylt write(*,'(A,I1,A,F12.6,A,F12.6)')'[',dimn,'] Error: ',sum1, ' != ',& 124a7bd39daSjeremylt & sum2 125de996c55Sjeremylt! LCOV_EXCL_STOP 126a7bd39daSjeremylt endif 127a7bd39daSjeremylt 128a7bd39daSjeremylt call ceedvectordestroy(x,err) 129a7bd39daSjeremylt call ceedvectordestroy(xq,err) 130a7bd39daSjeremylt call ceedvectordestroy(u,err) 131a7bd39daSjeremylt call ceedvectordestroy(uq,err) 132a7bd39daSjeremylt call ceedvectordestroy(ones,err) 133a7bd39daSjeremylt call ceedvectordestroy(gtposeones,err) 134a7bd39daSjeremylt call ceedbasisdestroy(bxl,err) 135a7bd39daSjeremylt call ceedbasisdestroy(bug,err) 136a7bd39daSjeremylt enddo 137a7bd39daSjeremylt 138a7bd39daSjeremylt call ceeddestroy(ceed,err) 139a7bd39daSjeremylt end 140a7bd39daSjeremylt!----------------------------------------------------------------------- 141