xref: /libCEED/tests/t314-basis-f.f90 (revision d9b786505a4dfcb66b2fcd9e3b61dd507168515d)
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