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