xref: /libCEED/tests/t522-operator-f.f90 (revision 7509a596beda7c1d002d2274a17375b09541fdb6)
1b6faaefaSjeremylt!-----------------------------------------------------------------------
2b6faaefaSjeremylt!
3b6faaefaSjeremylt! Header with common subroutine
4b6faaefaSjeremylt!
5b6faaefaSjeremylt      include 't320-basis-f.h'
6b6faaefaSjeremylt!-----------------------------------------------------------------------
7b6faaefaSjeremylt      subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
8b6faaefaSjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
9b6faaefaSjeremylt      real*8 ctx
10b6faaefaSjeremylt      real*8 u1(1)
11b6faaefaSjeremylt      real*8 u2(1)
12b6faaefaSjeremylt      real*8 v1(1)
13b6faaefaSjeremylt      real*8 w
14b6faaefaSjeremylt      integer q,ierr
15b6faaefaSjeremylt
16b6faaefaSjeremylt      do i=1,q
17b6faaefaSjeremylt        w = u1(i)/(u2(i+0*q)*u2(i+3*q)-u2(i+1*q)*u2(i+2*q))
18b6faaefaSjeremylt        v1(i+0*q)=w*(u2(i+2*q)*u2(i+2*q)+u2(i+3*q)*u2(i+3*q))
19b6faaefaSjeremylt        v1(i+1*q)=w*(u2(i+0*q)*u2(i+0*q)+u2(i+1*q)*u2(i+1*q))
20b6faaefaSjeremylt        v1(i+2*q)=w*(u2(i+0*q)*u2(i+2*q)+u2(i+1*q)*u2(i+3*q))
21b6faaefaSjeremylt      enddo
22b6faaefaSjeremylt
23b6faaefaSjeremylt      ierr=0
24b6faaefaSjeremylt      end
25b6faaefaSjeremylt!-----------------------------------------------------------------------
26b6faaefaSjeremylt      subroutine diff(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
27b6faaefaSjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
28b6faaefaSjeremylt      real*8 ctx
29b6faaefaSjeremylt      real*8 u1(1)
30b6faaefaSjeremylt      real*8 u2(1)
31b6faaefaSjeremylt      real*8 v1(1)
32b6faaefaSjeremylt      integer q,ierr
33b6faaefaSjeremylt
34b6faaefaSjeremylt      do i=1,q
35b6faaefaSjeremylt        v1(i+0*q)=u1(i+0*q)*u2(i+0*q)+u1(i+2*q)*u2(i+1*q)
36b6faaefaSjeremylt        v1(i+1*q)=u1(i+2*q)*u2(i+0*q)+u1(i+1*q)*u2(i+1*q)
37b6faaefaSjeremylt      enddo
38b6faaefaSjeremylt
39b6faaefaSjeremylt      ierr=0
40b6faaefaSjeremylt      end
41b6faaefaSjeremylt!-----------------------------------------------------------------------
42b6faaefaSjeremylt      program test
43b6faaefaSjeremylt
44b6faaefaSjeremylt      include 'ceedf.h'
45b6faaefaSjeremylt
46b6faaefaSjeremylt      integer ceed,err,i,j,k
4761dbc9d2Sjeremylt      integer imode
4861dbc9d2Sjeremylt      parameter(imode=ceed_noninterlaced)
49*7509a596Sjeremylt      integer stridesxtet(3),stridesqdtet(3),stridesxhex(3),stridesqdhex(3)
50b6faaefaSjeremylt      integer erestrictxtet,erestrictutet,erestrictxitet,erestrictqditet,&
51b6faaefaSjeremylt&             erestrictxhex,erestrictuhex,erestrictxihex,erestrictqdihex
52b6faaefaSjeremylt      integer bxtet,butet,bxhex,buhex
53b6faaefaSjeremylt      integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex
54b6faaefaSjeremylt      integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff
55b6faaefaSjeremylt      integer qdatatet,qdatahex,x,u,v
56b6faaefaSjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
57b6faaefaSjeremylt      integer row,col,offset
58b6faaefaSjeremylt      parameter(nelemtet=6)
59b6faaefaSjeremylt      parameter(ptet=6)
60b6faaefaSjeremylt      parameter(qtet=4)
61b6faaefaSjeremylt      parameter(nelemhex=6)
62b6faaefaSjeremylt      parameter(phex=3)
63b6faaefaSjeremylt      parameter(qhex=4)
64b6faaefaSjeremylt      parameter(d=2)
65b6faaefaSjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
66b6faaefaSjeremylt      parameter(nx=3)
67b6faaefaSjeremylt      parameter(ny=3)
68b6faaefaSjeremylt      parameter(nxtet=3)
69b6faaefaSjeremylt      parameter(nytet=1)
70b6faaefaSjeremylt      parameter(nxhex=3)
71b6faaefaSjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
72b6faaefaSjeremylt      parameter(nqptstet=nelemtet*qtet)
73b6faaefaSjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
74b6faaefaSjeremylt      parameter(nqpts=nqptstet+nqptshex)
75b6faaefaSjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
76b6faaefaSjeremylt      real*8 arrx(d*ndofs)
77b6faaefaSjeremylt      integer*8 voffset,xoffset
78b6faaefaSjeremylt
79b6faaefaSjeremylt      real*8 qref(d*qtet)
80b6faaefaSjeremylt      real*8 qweight(qtet)
81b6faaefaSjeremylt      real*8 interp(ptet*qtet)
82b6faaefaSjeremylt      real*8 grad(d*ptet*qtet)
83b6faaefaSjeremylt
84b6faaefaSjeremylt      real*8 hv(ndofs)
85b6faaefaSjeremylt      real*8 total
86b6faaefaSjeremylt
87b6faaefaSjeremylt      character arg*32
88b6faaefaSjeremylt
89b6faaefaSjeremylt      external setup,diff
90b6faaefaSjeremylt
91b6faaefaSjeremylt      call getarg(1,arg)
92b6faaefaSjeremylt
93b6faaefaSjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
94b6faaefaSjeremylt
95b6faaefaSjeremylt! DoF Coordinates
96b6faaefaSjeremylt      do i=0,ny*2
97b6faaefaSjeremylt        do j=0,nx*2
98b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny)
99b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx)
100b6faaefaSjeremylt        enddo
101b6faaefaSjeremylt      enddo
102b6faaefaSjeremylt
103b6faaefaSjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
104b6faaefaSjeremylt      xoffset=0
105b6faaefaSjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
106b6faaefaSjeremylt
107b6faaefaSjeremylt! Qdata Vectors
108b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err)
109b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err)
110b6faaefaSjeremylt
111b6faaefaSjeremylt! Tet Elements
112b6faaefaSjeremylt      do i=0,2
113b6faaefaSjeremylt        col=mod(i,nx)
114b6faaefaSjeremylt        row=i/nx
115b6faaefaSjeremylt        offset=col*2+row*(nx*2+1)*2
116b6faaefaSjeremylt
117b6faaefaSjeremylt        indxtet(i*2*ptet+1)=2+offset
118b6faaefaSjeremylt        indxtet(i*2*ptet+2)=9+offset
119b6faaefaSjeremylt        indxtet(i*2*ptet+3)=16+offset
120b6faaefaSjeremylt        indxtet(i*2*ptet+4)=1+offset
121b6faaefaSjeremylt        indxtet(i*2*ptet+5)=8+offset
122b6faaefaSjeremylt        indxtet(i*2*ptet+6)=0+offset
123b6faaefaSjeremylt
124b6faaefaSjeremylt        indxtet(i*2*ptet+7)=14+offset
125b6faaefaSjeremylt        indxtet(i*2*ptet+8)=7+offset
126b6faaefaSjeremylt        indxtet(i*2*ptet+9)=0+offset
127b6faaefaSjeremylt        indxtet(i*2*ptet+10)=15+offset
128b6faaefaSjeremylt        indxtet(i*2*ptet+11)=8+offset
129b6faaefaSjeremylt        indxtet(i*2*ptet+12)=16+offset
130b6faaefaSjeremylt      enddo
131b6faaefaSjeremylt
132b6faaefaSjeremylt! -- Restrictions
13361dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,d,&
134a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
135*7509a596Sjeremylt      stridesxtet=[1,ptet,d*ptet]
136*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,ptet,&
137*7509a596Sjeremylt     & nelemtet*ptet,d,stridesxtet,erestrictxitet,err)
138b6faaefaSjeremylt
13961dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,1,&
140a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
141*7509a596Sjeremylt      stridesqdtet=[1,qtet,qtet*d*(d+1)/2]
142*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,nqptstet,&
143*7509a596Sjeremylt     & d*(d+1)/2,stridesqdtet,erestrictqditet,err)
144b6faaefaSjeremylt
145b6faaefaSjeremylt! -- Bases
146b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
147b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
148b6faaefaSjeremylt     & qweight,bxtet,err)
149b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
150b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
151b6faaefaSjeremylt     & qweight,butet,err)
152b6faaefaSjeremylt
153b6faaefaSjeremylt! -- QFunctions
154b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
155b6faaefaSjeremylt     &SOURCE_DIR&
156a05f9790Sjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuptet,err)
157b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
158b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
159b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,&
160b6faaefaSjeremylt     & err)
161b6faaefaSjeremylt
162b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
163b6faaefaSjeremylt     &SOURCE_DIR&
164a05f9790Sjeremylt     &//'t522-operator.h:diff'//char(0),qf_difftet,err)
165b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err)
166b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err)
167b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err)
168b6faaefaSjeremylt
169b6faaefaSjeremylt! -- Operators
170b6faaefaSjeremylt! ---- Setup Tet
171442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
172442e7f0bSjeremylt     & ceed_qfunction_none,op_setuptet,err)
173b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,&
174a8d32208Sjeremylt     & bxtet,ceed_vector_none,err)
175b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
176a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
177b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,&
178a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
179b6faaefaSjeremylt! ---- diff Tet
180442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_difftet,ceed_qfunction_none,&
181442e7f0bSjeremylt     & ceed_qfunction_none,op_difftet,err)
182b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,&
183a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
184b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'u',erestrictutet,&
185a8d32208Sjeremylt     & butet,ceed_vector_active,err)
186b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'v',erestrictutet,&
187a8d32208Sjeremylt     & butet,ceed_vector_active,err)
188b6faaefaSjeremylt
189b6faaefaSjeremylt! Hex Elements
190b6faaefaSjeremylt      do i=0,nelemhex-1
191b6faaefaSjeremylt        col=mod(i,nx)
192b6faaefaSjeremylt        row=i/nx
193b6faaefaSjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
194b6faaefaSjeremylt        do j=0,phex-1
195b6faaefaSjeremylt          do k=0,phex-1
196b6faaefaSjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
197b6faaefaSjeremylt          enddo
198b6faaefaSjeremylt        enddo
199b6faaefaSjeremylt      enddo
200b6faaefaSjeremylt
201b6faaefaSjeremylt! -- Restrictions
20261dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,d,&
203b6faaefaSjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
204*7509a596Sjeremylt      stridesxhex=[1,phex*phex,phex*phex*d]
205*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,phex*phex,&
206*7509a596Sjeremylt     & nelemhex*phex*phex,d,stridesxhex,erestrictxihex,err)
207b6faaefaSjeremylt
20861dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,1,&
209b6faaefaSjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
210*7509a596Sjeremylt      stridesqdhex=[1,qhex*qhex,qhex*qhex*d*(d+1)/2]
211*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
212*7509a596Sjeremylt     & nqptshex,d*(d+1)/2,stridesqdhex,erestrictqdihex,err)
213b6faaefaSjeremylt
214b6faaefaSjeremylt! -- Bases
215b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
216b6faaefaSjeremylt     & bxhex,err)
217b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
218b6faaefaSjeremylt     & buhex,err)
219b6faaefaSjeremylt
220b6faaefaSjeremylt! -- QFunctions
221b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
222b6faaefaSjeremylt     &SOURCE_DIR&
223872c4ebbSjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuphex,err)
224b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
225b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
226b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,&
227b6faaefaSjeremylt     & err)
228b6faaefaSjeremylt
229b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
230b6faaefaSjeremylt     &SOURCE_DIR&
231872c4ebbSjeremylt     &//'t522-operator.h:diff'//char(0),qf_diffhex,err)
232b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err)
233b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err)
234b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err)
235b6faaefaSjeremylt
236b6faaefaSjeremylt! -- Operators
237b6faaefaSjeremylt! ---- Setup Hex
238442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
239442e7f0bSjeremylt     & ceed_qfunction_none,op_setuphex,err)
240b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,&
241a8d32208Sjeremylt     & bxhex,ceed_vector_none,err)
242b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
243a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
244b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,&
245a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
246b6faaefaSjeremylt! ---- diff Hex
247442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_diffhex,ceed_qfunction_none,&
248442e7f0bSjeremylt     & ceed_qfunction_none,op_diffhex,err)
249b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,&
250a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
251b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,&
252a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
253b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,&
254a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
255b6faaefaSjeremylt
256b6faaefaSjeremylt! Composite Operators
257b6faaefaSjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
258b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
259b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
260b6faaefaSjeremylt
261b6faaefaSjeremylt      call ceedcompositeoperatorcreate(ceed,op_diff,err)
262b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_diff,op_difftet,err)
263b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_diff,op_diffhex,err)
264b6faaefaSjeremylt
265b6faaefaSjeremylt! Apply Setup Operator
266e97ff134Sjeremylt      call ceedoperatorapply(op_setup,x,ceed_vector_none,&
267e97ff134Sjeremylt     & ceed_request_immediate,err)
268b6faaefaSjeremylt
269b6faaefaSjeremylt! Apply diff Operator
270b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
271b6faaefaSjeremylt      call ceedvectorsetvalue(u,1.d0,err)
272b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
273b6faaefaSjeremylt
274b6faaefaSjeremylt      call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err)
275b6faaefaSjeremylt
276b6faaefaSjeremylt! Check Output
277b6faaefaSjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
278b6faaefaSjeremylt      do i=1,ndofs
279b6faaefaSjeremylt      if (abs(hv(voffset+i))>1.0d-14) then
280b6faaefaSjeremylt! LCOV_EXCL_START
281b6faaefaSjeremylt        write(*,*) 'Computed: ',total,' != True: 0.0'
282b6faaefaSjeremylt! LCOV_EXCL_STOP
283b6faaefaSjeremylt      endif
284b6faaefaSjeremylt      enddo
285b6faaefaSjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
286b6faaefaSjeremylt
287b6faaefaSjeremylt! Cleanup
288b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
289b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_difftet,err)
290b6faaefaSjeremylt      call ceedoperatordestroy(op_setuptet,err)
291b6faaefaSjeremylt      call ceedoperatordestroy(op_difftet,err)
292b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
293b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_diffhex,err)
294b6faaefaSjeremylt      call ceedoperatordestroy(op_setuphex,err)
295b6faaefaSjeremylt      call ceedoperatordestroy(op_diffhex,err)
296b6faaefaSjeremylt      call ceedoperatordestroy(op_setup,err)
297b6faaefaSjeremylt      call ceedoperatordestroy(op_diff,err)
298b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
299b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
300b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqditet,err)
301b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxitet,err)
302b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
303b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
304b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqdihex,err)
305b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxihex,err)
306b6faaefaSjeremylt      call ceedbasisdestroy(butet,err)
307b6faaefaSjeremylt      call ceedbasisdestroy(bxtet,err)
308b6faaefaSjeremylt      call ceedbasisdestroy(buhex,err)
309b6faaefaSjeremylt      call ceedbasisdestroy(bxhex,err)
310b6faaefaSjeremylt      call ceedvectordestroy(x,err)
311b6faaefaSjeremylt      call ceedvectordestroy(u,err)
312b6faaefaSjeremylt      call ceedvectordestroy(v,err)
313b6faaefaSjeremylt      call ceedvectordestroy(qdatatet,err)
314b6faaefaSjeremylt      call ceedvectordestroy(qdatahex,err)
315b6faaefaSjeremylt      call ceeddestroy(ceed,err)
316b6faaefaSjeremylt      end
317b6faaefaSjeremylt!-----------------------------------------------------------------------
318