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