xref: /libCEED/tests/t522-operator-f.f90 (revision 1ad466088344f9c7a89b938b3cea7230e969fe10)
1b6faaefaSjeremylt!-----------------------------------------------------------------------
2b6faaefaSjeremylt!
3b6faaefaSjeremylt! Header with common subroutine
4b6faaefaSjeremylt!
5b6faaefaSjeremylt      include 't320-basis-f.h'
6752c3701SJeremy L Thompson!
7752c3701SJeremy L Thompson! Header with QFunctions
8752c3701SJeremy L Thompson!
9752c3701SJeremy L Thompson      include 't522-operator-f.h'
10b6faaefaSjeremylt!-----------------------------------------------------------------------
11b6faaefaSjeremylt      program test
121f9a83abSJed Brown      implicit none
13ec3da8bcSJed Brown      include 'ceed/fortran.h'
14b6faaefaSjeremylt
15b6faaefaSjeremylt      integer ceed,err,i,j,k
1615910d16Sjeremylt      integer stridesqdtet(3),stridesqdhex(3)
1715910d16Sjeremylt      integer erestrictxtet,erestrictutet,erestrictqditet,&
1815910d16Sjeremylt&             erestrictxhex,erestrictuhex,erestrictqdihex
19b6faaefaSjeremylt      integer bxtet,butet,bxhex,buhex
20b6faaefaSjeremylt      integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex
21b6faaefaSjeremylt      integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff
22b6faaefaSjeremylt      integer qdatatet,qdatahex,x,u,v
23b6faaefaSjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
24b6faaefaSjeremylt      integer row,col,offset
25b6faaefaSjeremylt      parameter(nelemtet=6)
26b6faaefaSjeremylt      parameter(ptet=6)
27b6faaefaSjeremylt      parameter(qtet=4)
28b6faaefaSjeremylt      parameter(nelemhex=6)
29b6faaefaSjeremylt      parameter(phex=3)
30b6faaefaSjeremylt      parameter(qhex=4)
31b6faaefaSjeremylt      parameter(d=2)
32b6faaefaSjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
33b6faaefaSjeremylt      parameter(nx=3)
34b6faaefaSjeremylt      parameter(ny=3)
35b6faaefaSjeremylt      parameter(nxtet=3)
36b6faaefaSjeremylt      parameter(nytet=1)
37b6faaefaSjeremylt      parameter(nxhex=3)
38b6faaefaSjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
39b6faaefaSjeremylt      parameter(nqptstet=nelemtet*qtet)
40b6faaefaSjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
41b6faaefaSjeremylt      parameter(nqpts=nqptstet+nqptshex)
42b6faaefaSjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
43b6faaefaSjeremylt      real*8 arrx(d*ndofs)
44b6faaefaSjeremylt      integer*8 voffset,xoffset
45b6faaefaSjeremylt
46b6faaefaSjeremylt      real*8 qref(d*qtet)
47b6faaefaSjeremylt      real*8 qweight(qtet)
48b6faaefaSjeremylt      real*8 interp(ptet*qtet)
49b6faaefaSjeremylt      real*8 grad(d*ptet*qtet)
50b6faaefaSjeremylt
51b6faaefaSjeremylt      real*8 hv(ndofs)
52b6faaefaSjeremylt      real*8 total
53b6faaefaSjeremylt
54b6faaefaSjeremylt      character arg*32
55b6faaefaSjeremylt
56b6faaefaSjeremylt      external setup,diff
57b6faaefaSjeremylt
58b6faaefaSjeremylt      call getarg(1,arg)
59b6faaefaSjeremylt
60b6faaefaSjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
61b6faaefaSjeremylt
62b6faaefaSjeremylt! DoF Coordinates
63b6faaefaSjeremylt      do i=0,ny*2
64b6faaefaSjeremylt        do j=0,nx*2
65b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny)
66b6faaefaSjeremylt          arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx)
67b6faaefaSjeremylt        enddo
68b6faaefaSjeremylt      enddo
69b6faaefaSjeremylt
70b6faaefaSjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
71b6faaefaSjeremylt      xoffset=0
72b6faaefaSjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
73b6faaefaSjeremylt
74b6faaefaSjeremylt! Qdata Vectors
75b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err)
76b6faaefaSjeremylt      call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err)
77b6faaefaSjeremylt
78b6faaefaSjeremylt! Tet Elements
79b6faaefaSjeremylt      do i=0,2
80b6faaefaSjeremylt        col=mod(i,nx)
81b6faaefaSjeremylt        row=i/nx
82b6faaefaSjeremylt        offset=col*2+row*(nx*2+1)*2
83b6faaefaSjeremylt
84b6faaefaSjeremylt        indxtet(i*2*ptet+1)=2+offset
85b6faaefaSjeremylt        indxtet(i*2*ptet+2)=9+offset
86b6faaefaSjeremylt        indxtet(i*2*ptet+3)=16+offset
87b6faaefaSjeremylt        indxtet(i*2*ptet+4)=1+offset
88b6faaefaSjeremylt        indxtet(i*2*ptet+5)=8+offset
89b6faaefaSjeremylt        indxtet(i*2*ptet+6)=0+offset
90b6faaefaSjeremylt
91b6faaefaSjeremylt        indxtet(i*2*ptet+7)=14+offset
92b6faaefaSjeremylt        indxtet(i*2*ptet+8)=7+offset
93b6faaefaSjeremylt        indxtet(i*2*ptet+9)=0+offset
94b6faaefaSjeremylt        indxtet(i*2*ptet+10)=15+offset
95b6faaefaSjeremylt        indxtet(i*2*ptet+11)=8+offset
96b6faaefaSjeremylt        indxtet(i*2*ptet+12)=16+offset
97b6faaefaSjeremylt      enddo
98b6faaefaSjeremylt
99b6faaefaSjeremylt! -- Restrictions
100d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,&
101a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
102b6faaefaSjeremylt
103d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,&
104a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
1057509a596Sjeremylt      stridesqdtet=[1,qtet,qtet*d*(d+1)/2]
106d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,d*(d+1)/2,&
107d979a051Sjeremylt     & d*(d+1)/2*nqptstet,stridesqdtet,erestrictqditet,err)
108b6faaefaSjeremylt
109b6faaefaSjeremylt! -- Bases
110b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
111b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
112b6faaefaSjeremylt     & qweight,bxtet,err)
113b6faaefaSjeremylt      call buildmats(qref,qweight,interp,grad)
114b6faaefaSjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
115b6faaefaSjeremylt     & qweight,butet,err)
116b6faaefaSjeremylt
117b6faaefaSjeremylt! -- QFunctions
118b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
119b6faaefaSjeremylt     &SOURCE_DIR&
120a05f9790Sjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuptet,err)
121a61c78d6SJeremy L Thompson      call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err)
122b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
123b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,&
124b6faaefaSjeremylt     & err)
125b6faaefaSjeremylt
126b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
127b6faaefaSjeremylt     &SOURCE_DIR&
128a05f9790Sjeremylt     &//'t522-operator.h:diff'//char(0),qf_difftet,err)
129b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err)
130b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err)
131b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err)
132b6faaefaSjeremylt
133b6faaefaSjeremylt! -- Operators
134b6faaefaSjeremylt! ---- Setup Tet
135442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
136442e7f0bSjeremylt     & ceed_qfunction_none,op_setuptet,err)
137a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setuptet,'weight',&
13815910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
139b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
140a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
141b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,&
142356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
143b6faaefaSjeremylt! ---- diff Tet
144442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_difftet,ceed_qfunction_none,&
145442e7f0bSjeremylt     & ceed_qfunction_none,op_difftet,err)
146b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,&
147356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
148b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'u',erestrictutet,&
149a8d32208Sjeremylt     & butet,ceed_vector_active,err)
150b6faaefaSjeremylt      call ceedoperatorsetfield(op_difftet,'v',erestrictutet,&
151a8d32208Sjeremylt     & butet,ceed_vector_active,err)
152b6faaefaSjeremylt
153b6faaefaSjeremylt! Hex Elements
154b6faaefaSjeremylt      do i=0,nelemhex-1
155b6faaefaSjeremylt        col=mod(i,nx)
156b6faaefaSjeremylt        row=i/nx
157b6faaefaSjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
158b6faaefaSjeremylt        do j=0,phex-1
159b6faaefaSjeremylt          do k=0,phex-1
160b6faaefaSjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
161b6faaefaSjeremylt          enddo
162b6faaefaSjeremylt        enddo
163b6faaefaSjeremylt      enddo
164b6faaefaSjeremylt
165b6faaefaSjeremylt! -- Restrictions
166d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,&
167d979a051Sjeremylt     & d*ndofs,ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
168b6faaefaSjeremylt
169d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
170b6faaefaSjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1717509a596Sjeremylt      stridesqdhex=[1,qhex*qhex,qhex*qhex*d*(d+1)/2]
1727509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
173d979a051Sjeremylt     & d*(d+1)/2,d*(d+1)/2*nqptshex,stridesqdhex,erestrictqdihex,err)
174b6faaefaSjeremylt
175b6faaefaSjeremylt! -- Bases
176b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
177b6faaefaSjeremylt     & bxhex,err)
178b6faaefaSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
179b6faaefaSjeremylt     & buhex,err)
180b6faaefaSjeremylt
181b6faaefaSjeremylt! -- QFunctions
182b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
183b6faaefaSjeremylt     &SOURCE_DIR&
184872c4ebbSjeremylt     &//'t522-operator.h:setup'//char(0),qf_setuphex,err)
185b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
186b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
187b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,&
188b6faaefaSjeremylt     & err)
189b6faaefaSjeremylt
190b6faaefaSjeremylt      call ceedqfunctioncreateinterior(ceed,1,diff,&
191b6faaefaSjeremylt     &SOURCE_DIR&
192872c4ebbSjeremylt     &//'t522-operator.h:diff'//char(0),qf_diffhex,err)
193b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err)
194b6faaefaSjeremylt      call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err)
195b6faaefaSjeremylt      call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err)
196b6faaefaSjeremylt
197b6faaefaSjeremylt! -- Operators
198b6faaefaSjeremylt! ---- Setup Hex
199442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
200442e7f0bSjeremylt     & ceed_qfunction_none,op_setuphex,err)
20115910d16Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',&
20215910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
203b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
204a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
205b6faaefaSjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,&
206356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
207b6faaefaSjeremylt! ---- diff Hex
208442e7f0bSjeremylt      call ceedoperatorcreate(ceed,qf_diffhex,ceed_qfunction_none,&
209442e7f0bSjeremylt     & ceed_qfunction_none,op_diffhex,err)
210b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,&
211356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
212b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,&
213a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
214b6faaefaSjeremylt      call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,&
215a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
216b6faaefaSjeremylt
217b6faaefaSjeremylt! Composite Operators
218*ed094490SJeremy L Thompson      call ceedoperatorcreatecomposite(ceed,op_setup,err)
219*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_setup,op_setuptet,err)
220*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_setup,op_setuphex,err)
221b6faaefaSjeremylt
222*ed094490SJeremy L Thompson      call ceedoperatorcreatecomposite(ceed,op_diff,err)
223*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_diff,op_difftet,err)
224*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_diff,op_diffhex,err)
225b6faaefaSjeremylt
226b6faaefaSjeremylt! Apply Setup Operator
227e97ff134Sjeremylt      call ceedoperatorapply(op_setup,x,ceed_vector_none,&
228e97ff134Sjeremylt     & ceed_request_immediate,err)
229b6faaefaSjeremylt
230b6faaefaSjeremylt! Apply diff Operator
231b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
232b6faaefaSjeremylt      call ceedvectorsetvalue(u,1.d0,err)
233b6faaefaSjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
234b6faaefaSjeremylt
235b6faaefaSjeremylt      call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err)
236b6faaefaSjeremylt
237b6faaefaSjeremylt! Check Output
238b6faaefaSjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
239b6faaefaSjeremylt      do i=1,ndofs
240b6faaefaSjeremylt      if (abs(hv(voffset+i))>1.0d-14) then
241b6faaefaSjeremylt! LCOV_EXCL_START
242b6faaefaSjeremylt        write(*,*) 'Computed: ',total,' != True: 0.0'
243b6faaefaSjeremylt! LCOV_EXCL_STOP
244b6faaefaSjeremylt      endif
245b6faaefaSjeremylt      enddo
246b6faaefaSjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
247b6faaefaSjeremylt
248b6faaefaSjeremylt! Cleanup
249b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
250b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_difftet,err)
251b6faaefaSjeremylt      call ceedoperatordestroy(op_setuptet,err)
252b6faaefaSjeremylt      call ceedoperatordestroy(op_difftet,err)
253b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
254b6faaefaSjeremylt      call ceedqfunctiondestroy(qf_diffhex,err)
255b6faaefaSjeremylt      call ceedoperatordestroy(op_setuphex,err)
256b6faaefaSjeremylt      call ceedoperatordestroy(op_diffhex,err)
257b6faaefaSjeremylt      call ceedoperatordestroy(op_setup,err)
258b6faaefaSjeremylt      call ceedoperatordestroy(op_diff,err)
259b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
260b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
261b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqditet,err)
262b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
263b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
264b6faaefaSjeremylt      call ceedelemrestrictiondestroy(erestrictqdihex,err)
265b6faaefaSjeremylt      call ceedbasisdestroy(butet,err)
266b6faaefaSjeremylt      call ceedbasisdestroy(bxtet,err)
267b6faaefaSjeremylt      call ceedbasisdestroy(buhex,err)
268b6faaefaSjeremylt      call ceedbasisdestroy(bxhex,err)
269b6faaefaSjeremylt      call ceedvectordestroy(x,err)
270b6faaefaSjeremylt      call ceedvectordestroy(u,err)
271b6faaefaSjeremylt      call ceedvectordestroy(v,err)
272b6faaefaSjeremylt      call ceedvectordestroy(qdatatet,err)
273b6faaefaSjeremylt      call ceedvectordestroy(qdatahex,err)
274b6faaefaSjeremylt      call ceeddestroy(ceed,err)
275b6faaefaSjeremylt      end
276b6faaefaSjeremylt!-----------------------------------------------------------------------
277