xref: /libCEED/tests/t522-operator-f.f90 (revision a8d322087fa8f150327cdc2bf14a171452b711ec)
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
47*a8d32208Sjeremylt      integer lmode
48*a8d32208Sjeremylt      parameter(lmode=ceed_notranspose)
49b6faaefaSjeremylt      integer erestrictxtet,erestrictutet,erestrictxitet,erestrictqditet,&
50b6faaefaSjeremylt&             erestrictxhex,erestrictuhex,erestrictxihex,erestrictqdihex
51b6faaefaSjeremylt      integer bxtet,butet,bxhex,buhex
52b6faaefaSjeremylt      integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex
53b6faaefaSjeremylt      integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff
54b6faaefaSjeremylt      integer qdatatet,qdatahex,x,u,v
55b6faaefaSjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
56b6faaefaSjeremylt      integer row,col,offset
57b6faaefaSjeremylt      parameter(nelemtet=6)
58b6faaefaSjeremylt      parameter(ptet=6)
59b6faaefaSjeremylt      parameter(qtet=4)
60b6faaefaSjeremylt      parameter(nelemhex=6)
61b6faaefaSjeremylt      parameter(phex=3)
62b6faaefaSjeremylt      parameter(qhex=4)
63b6faaefaSjeremylt      parameter(d=2)
64b6faaefaSjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
65b6faaefaSjeremylt      parameter(nx=3)
66b6faaefaSjeremylt      parameter(ny=3)
67b6faaefaSjeremylt      parameter(nxtet=3)
68b6faaefaSjeremylt      parameter(nytet=1)
69b6faaefaSjeremylt      parameter(nxhex=3)
70b6faaefaSjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
71b6faaefaSjeremylt      parameter(nqptstet=nelemtet*qtet)
72b6faaefaSjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
73b6faaefaSjeremylt      parameter(nqpts=nqptstet+nqptshex)
74b6faaefaSjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
75b6faaefaSjeremylt      real*8 arrx(d*ndofs)
76b6faaefaSjeremylt      integer*8 voffset,xoffset
77b6faaefaSjeremylt
78b6faaefaSjeremylt      real*8 qref(d*qtet)
79b6faaefaSjeremylt      real*8 qweight(qtet)
80b6faaefaSjeremylt      real*8 interp(ptet*qtet)
81b6faaefaSjeremylt      real*8 grad(d*ptet*qtet)
82b6faaefaSjeremylt
83b6faaefaSjeremylt      real*8 hv(ndofs)
84b6faaefaSjeremylt      real*8 total
85b6faaefaSjeremylt
86b6faaefaSjeremylt      character arg*32
87b6faaefaSjeremylt
88b6faaefaSjeremylt      external setup,diff
89b6faaefaSjeremylt
90b6faaefaSjeremylt      call getarg(1,arg)
91b6faaefaSjeremylt
92b6faaefaSjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
93b6faaefaSjeremylt
94b6faaefaSjeremylt! DoF Coordinates
95b6faaefaSjeremylt      do i=0,ny*2
96b6faaefaSjeremylt        do j=0,nx*2
97b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny)
98b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx)
99b6faaefaSjeremylt        enddo
100b6faaefaSjeremylt      enddo
101b6faaefaSjeremylt
102b6faaefaSjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
103b6faaefaSjeremylt      xoffset=0
104b6faaefaSjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
105b6faaefaSjeremylt
106b6faaefaSjeremylt! Qdata Vectors
107b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err)
108b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err)
109b6faaefaSjeremylt
110b6faaefaSjeremylt! Tet Elements
111b6faaefaSjeremylt      do i=0,2
112b6faaefaSjeremylt        col=mod(i,nx)
113b6faaefaSjeremylt        row=i/nx
114b6faaefaSjeremylt        offset=col*2+row*(nx*2+1)*2
115b6faaefaSjeremylt
116b6faaefaSjeremylt        indxtet(i*2*ptet+1)=2+offset
117b6faaefaSjeremylt        indxtet(i*2*ptet+2)=9+offset
118b6faaefaSjeremylt        indxtet(i*2*ptet+3)=16+offset
119b6faaefaSjeremylt        indxtet(i*2*ptet+4)=1+offset
120b6faaefaSjeremylt        indxtet(i*2*ptet+5)=8+offset
121b6faaefaSjeremylt        indxtet(i*2*ptet+6)=0+offset
122b6faaefaSjeremylt
123b6faaefaSjeremylt        indxtet(i*2*ptet+7)=14+offset
124b6faaefaSjeremylt        indxtet(i*2*ptet+8)=7+offset
125b6faaefaSjeremylt        indxtet(i*2*ptet+9)=0+offset
126b6faaefaSjeremylt        indxtet(i*2*ptet+10)=15+offset
127b6faaefaSjeremylt        indxtet(i*2*ptet+11)=8+offset
128b6faaefaSjeremylt        indxtet(i*2*ptet+12)=16+offset
129b6faaefaSjeremylt      enddo
130b6faaefaSjeremylt
131b6faaefaSjeremylt! -- Restrictions
132*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,d,&
133*a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
134*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,ptet,&
135*a8d32208Sjeremylt     & nelemtet*ptet,d,erestrictxitet,err)
136b6faaefaSjeremylt
137*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,1,&
138*a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
139*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,qtet,nqptstet,&
140b6faaefaSjeremylt     & d*(d+1)/2,erestrictqditet,err)
141b6faaefaSjeremylt
142b6faaefaSjeremylt! -- Bases
143b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
144b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
145b6faaefaSjeremylt     & qweight,bxtet,err)
146b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
147b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
148b6faaefaSjeremylt     & qweight,butet,err)
149b6faaefaSjeremylt
150b6faaefaSjeremylt! -- QFunctions
151b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
152b6faaefaSjeremylt     &SOURCE_DIR&
153a05f9790Sjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuptet,err)
154b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
155b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
156b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,&
157b6faaefaSjeremylt     & err)
158b6faaefaSjeremylt
159b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
160b6faaefaSjeremylt     &SOURCE_DIR&
161a05f9790Sjeremylt     &//'t522-operator.h:diff'//char(0),qf_difftet,err)
162b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err)
163b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err)
164b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err)
165b6faaefaSjeremylt
166b6faaefaSjeremylt! -- Operators
167b6faaefaSjeremylt! ---- Setup Tet
168442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
169442e7f0bSjeremylt     & ceed_qfunction_none,op_setuptet,err)
170b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,&
171*a8d32208Sjeremylt     & bxtet,ceed_vector_none,err)
172b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
173*a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
174b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,&
175*a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
176b6faaefaSjeremylt! ---- diff Tet
177442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_difftet,ceed_qfunction_none,&
178442e7f0bSjeremylt     & ceed_qfunction_none,op_difftet,err)
179b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,&
180*a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
181b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'u',erestrictutet,&
182*a8d32208Sjeremylt     & butet,ceed_vector_active,err)
183b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'v',erestrictutet,&
184*a8d32208Sjeremylt     & butet,ceed_vector_active,err)
185b6faaefaSjeremylt
186b6faaefaSjeremylt! Hex Elements
187b6faaefaSjeremylt      do i=0,nelemhex-1
188b6faaefaSjeremylt        col=mod(i,nx)
189b6faaefaSjeremylt        row=i/nx
190b6faaefaSjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
191b6faaefaSjeremylt        do j=0,phex-1
192b6faaefaSjeremylt          do k=0,phex-1
193b6faaefaSjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
194b6faaefaSjeremylt          enddo
195b6faaefaSjeremylt        enddo
196b6faaefaSjeremylt      enddo
197b6faaefaSjeremylt
198b6faaefaSjeremylt! -- Restrictions
199*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,d,&
200b6faaefaSjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
201*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,phex*phex,&
202b6faaefaSjeremylt     & nelemhex*phex*phex,d,erestrictxihex,err)
203b6faaefaSjeremylt
204*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,1,&
205b6faaefaSjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
206*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,qhex*qhex,&
207*a8d32208Sjeremylt     & nqptshex,d*(d+1)/2,erestrictqdihex,err)
208b6faaefaSjeremylt
209b6faaefaSjeremylt! -- Bases
210b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
211b6faaefaSjeremylt     & bxhex,err)
212b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
213b6faaefaSjeremylt     & buhex,err)
214b6faaefaSjeremylt
215b6faaefaSjeremylt! -- QFunctions
216b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
217b6faaefaSjeremylt     &SOURCE_DIR&
218872c4ebbSjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuphex,err)
219b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
220b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
221b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,&
222b6faaefaSjeremylt     & err)
223b6faaefaSjeremylt
224b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
225b6faaefaSjeremylt     &SOURCE_DIR&
226872c4ebbSjeremylt     &//'t522-operator.h:diff'//char(0),qf_diffhex,err)
227b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err)
228b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err)
229b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err)
230b6faaefaSjeremylt
231b6faaefaSjeremylt! -- Operators
232b6faaefaSjeremylt! ---- Setup Hex
233442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
234442e7f0bSjeremylt     & ceed_qfunction_none,op_setuphex,err)
235b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,&
236*a8d32208Sjeremylt     & bxhex,ceed_vector_none,err)
237b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
238*a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
239b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,&
240*a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
241b6faaefaSjeremylt! ---- diff Hex
242442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_diffhex,ceed_qfunction_none,&
243442e7f0bSjeremylt     & ceed_qfunction_none,op_diffhex,err)
244b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,&
245*a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
246b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,&
247*a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
248b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,&
249*a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
250b6faaefaSjeremylt
251b6faaefaSjeremylt! Composite Operators
252b6faaefaSjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
253b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
254b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
255b6faaefaSjeremylt
256b6faaefaSjeremylt      call ceedcompositeoperatorcreate(ceed,op_diff,err)
257b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_diff,op_difftet,err)
258b6faaefaSjeremylt      call ceedcompositeoperatoraddsub(op_diff,op_diffhex,err)
259b6faaefaSjeremylt
260b6faaefaSjeremylt! Apply Setup Operator
261e97ff134Sjeremylt      call ceedoperatorapply(op_setup,x,ceed_vector_none,&
262e97ff134Sjeremylt     & ceed_request_immediate,err)
263b6faaefaSjeremylt
264b6faaefaSjeremylt! Apply diff Operator
265b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
266b6faaefaSjeremylt      call ceedvectorsetvalue(u,1.d0,err)
267b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
268b6faaefaSjeremylt
269b6faaefaSjeremylt      call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err)
270b6faaefaSjeremylt
271b6faaefaSjeremylt! Check Output
272b6faaefaSjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
273b6faaefaSjeremylt      do i=1,ndofs
274b6faaefaSjeremylt      if (abs(hv(voffset+i))>1.0d-14) then
275b6faaefaSjeremylt! LCOV_EXCL_START
276b6faaefaSjeremylt        write(*,*) 'Computed: ',total,' != True: 0.0'
277b6faaefaSjeremylt! LCOV_EXCL_STOP
278b6faaefaSjeremylt      endif
279b6faaefaSjeremylt      enddo
280b6faaefaSjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
281b6faaefaSjeremylt
282b6faaefaSjeremylt! Cleanup
283b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
284b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_difftet,err)
285b6faaefaSjeremylt      call ceedoperatordestroy(op_setuptet,err)
286b6faaefaSjeremylt      call ceedoperatordestroy(op_difftet,err)
287b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
288b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_diffhex,err)
289b6faaefaSjeremylt      call ceedoperatordestroy(op_setuphex,err)
290b6faaefaSjeremylt      call ceedoperatordestroy(op_diffhex,err)
291b6faaefaSjeremylt      call ceedoperatordestroy(op_setup,err)
292b6faaefaSjeremylt      call ceedoperatordestroy(op_diff,err)
293b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
294b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
295b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqditet,err)
296b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxitet,err)
297b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
298b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
299b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqdihex,err)
300b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxihex,err)
301b6faaefaSjeremylt      call ceedbasisdestroy(butet,err)
302b6faaefaSjeremylt      call ceedbasisdestroy(bxtet,err)
303b6faaefaSjeremylt      call ceedbasisdestroy(buhex,err)
304b6faaefaSjeremylt      call ceedbasisdestroy(bxhex,err)
305b6faaefaSjeremylt      call ceedvectordestroy(x,err)
306b6faaefaSjeremylt      call ceedvectordestroy(u,err)
307b6faaefaSjeremylt      call ceedvectordestroy(v,err)
308b6faaefaSjeremylt      call ceedvectordestroy(qdatatet,err)
309b6faaefaSjeremylt      call ceedvectordestroy(qdatahex,err)
310b6faaefaSjeremylt      call ceeddestroy(ceed,err)
311b6faaefaSjeremylt      end
312b6faaefaSjeremylt!-----------------------------------------------------------------------
313