xref: /libCEED/tests/t524-operator-f.f90 (revision 1ad466088344f9c7a89b938b3cea7230e969fe10)
1250756a7Sjeremylt!-----------------------------------------------------------------------
2250756a7Sjeremylt!
3250756a7Sjeremylt! Header with common subroutine
4250756a7Sjeremylt!
5250756a7Sjeremylt      include 't320-basis-f.h'
6752c3701SJeremy L Thompson!
7752c3701SJeremy L Thompson! Header with QFunctions
8752c3701SJeremy L Thompson!
9752c3701SJeremy L Thompson      include 't510-operator-f.h'
10250756a7Sjeremylt!-----------------------------------------------------------------------
11250756a7Sjeremylt      program test
121f9a83abSJed Brown      implicit none
13ec3da8bcSJed Brown      include 'ceed/fortran.h'
14250756a7Sjeremylt
15250756a7Sjeremylt      integer ceed,err,i,j,k
1615910d16Sjeremylt      integer stridesutet(3),stridesuhex(3)
1715910d16Sjeremylt      integer erestrictxtet,erestrictutet,erestrictuitet,&
1815910d16Sjeremylt&             erestrictxhex,erestrictuhex,erestrictuihex
19250756a7Sjeremylt      integer bxtet,butet,bxhex,buhex
20250756a7Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
21250756a7Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
22250756a7Sjeremylt      integer qdatatet,qdatahex,x,u,v
23250756a7Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
24250756a7Sjeremylt      integer row,col,offset
25250756a7Sjeremylt      parameter(nelemtet=6)
26250756a7Sjeremylt      parameter(ptet=6)
27250756a7Sjeremylt      parameter(qtet=4)
28250756a7Sjeremylt      parameter(nelemhex=6)
29250756a7Sjeremylt      parameter(phex=3)
30250756a7Sjeremylt      parameter(qhex=4)
31250756a7Sjeremylt      parameter(d=2)
32250756a7Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
33250756a7Sjeremylt      parameter(nx=3)
34250756a7Sjeremylt      parameter(ny=3)
35250756a7Sjeremylt      parameter(nxtet=3)
36250756a7Sjeremylt      parameter(nytet=1)
37250756a7Sjeremylt      parameter(nxhex=3)
38250756a7Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
39250756a7Sjeremylt      parameter(nqptstet=nelemtet*qtet)
40250756a7Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
41250756a7Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
42250756a7Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
43250756a7Sjeremylt      real*8 arrx(d*ndofs)
44250756a7Sjeremylt      integer*8 voffset,xoffset
45250756a7Sjeremylt
46250756a7Sjeremylt      real*8 qref(d*qtet)
47250756a7Sjeremylt      real*8 qweight(qtet)
48250756a7Sjeremylt      real*8 interp(ptet*qtet)
49250756a7Sjeremylt      real*8 grad(d*ptet*qtet)
50250756a7Sjeremylt
51250756a7Sjeremylt      real*8 hv(ndofs)
52250756a7Sjeremylt      real*8 total
53250756a7Sjeremylt
54250756a7Sjeremylt      character arg*32
55250756a7Sjeremylt
56250756a7Sjeremylt      external setup,mass
57250756a7Sjeremylt
58250756a7Sjeremylt      call getarg(1,arg)
59250756a7Sjeremylt
60250756a7Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
61250756a7Sjeremylt
62250756a7Sjeremylt! DoF Coordinates
63250756a7Sjeremylt      do i=0,ny*2
64250756a7Sjeremylt        do j=0,nx*2
65250756a7Sjeremylt          arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny)
66250756a7Sjeremylt          arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx)
67250756a7Sjeremylt        enddo
68250756a7Sjeremylt      enddo
69250756a7Sjeremylt
70250756a7Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
71250756a7Sjeremylt      xoffset=0
72250756a7Sjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
73250756a7Sjeremylt
74250756a7Sjeremylt! Qdata Vectors
75250756a7Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
76250756a7Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
77250756a7Sjeremylt
78250756a7Sjeremylt! Tet Elements
79250756a7Sjeremylt      do i=0,2
80250756a7Sjeremylt        col=mod(i,nx)
81250756a7Sjeremylt        row=i/nx
82250756a7Sjeremylt        offset=col*2+row*(nx*2+1)*2
83250756a7Sjeremylt
84250756a7Sjeremylt        indxtet(i*2*ptet+1)=2+offset
85250756a7Sjeremylt        indxtet(i*2*ptet+2)=9+offset
86250756a7Sjeremylt        indxtet(i*2*ptet+3)=16+offset
87250756a7Sjeremylt        indxtet(i*2*ptet+4)=1+offset
88250756a7Sjeremylt        indxtet(i*2*ptet+5)=8+offset
89250756a7Sjeremylt        indxtet(i*2*ptet+6)=0+offset
90250756a7Sjeremylt
91250756a7Sjeremylt        indxtet(i*2*ptet+7)=14+offset
92250756a7Sjeremylt        indxtet(i*2*ptet+8)=7+offset
93250756a7Sjeremylt        indxtet(i*2*ptet+9)=0+offset
94250756a7Sjeremylt        indxtet(i*2*ptet+10)=15+offset
95250756a7Sjeremylt        indxtet(i*2*ptet+11)=8+offset
96250756a7Sjeremylt        indxtet(i*2*ptet+12)=16+offset
97250756a7Sjeremylt      enddo
98250756a7Sjeremylt
99250756a7Sjeremylt! -- Restrictions
100d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,&
101a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
102250756a7Sjeremylt
103d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,&
104a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
1057509a596Sjeremylt      stridesutet=[1,qtet,qtet]
106d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,&
107d979a051Sjeremylt     & stridesutet,erestrictuitet,err)
108250756a7Sjeremylt
109250756a7Sjeremylt! -- Bases
110250756a7Sjeremylt      call buildmats(qref,qweight,interp,grad)
111250756a7Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
112250756a7Sjeremylt     & qweight,bxtet,err)
113250756a7Sjeremylt      call buildmats(qref,qweight,interp,grad)
114250756a7Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
115250756a7Sjeremylt     & qweight,butet,err)
116250756a7Sjeremylt
117250756a7Sjeremylt! -- QFunctions
118250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
119250756a7Sjeremylt     &SOURCE_DIR&
120250756a7Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
121a61c78d6SJeremy L Thompson      call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err)
122250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
123250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
124250756a7Sjeremylt
125250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
126250756a7Sjeremylt     &SOURCE_DIR&
127250756a7Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
128250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
129250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
130250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
131250756a7Sjeremylt
132250756a7Sjeremylt! -- Operators
133250756a7Sjeremylt! ---- Setup Tet
134250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
135250756a7Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
136a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setuptet,'weight',&
13715910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
138250756a7Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
139a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
140250756a7Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
141356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
142250756a7Sjeremylt! ---- Mass Tet
143250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
144250756a7Sjeremylt     & ceed_qfunction_none,op_masstet,err)
145250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
146356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
147250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
148a8d32208Sjeremylt     & butet,ceed_vector_active,err)
149250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
150a8d32208Sjeremylt     & butet,ceed_vector_active,err)
151250756a7Sjeremylt
152250756a7Sjeremylt! Hex Elements
153250756a7Sjeremylt      do i=0,nelemhex-1
154250756a7Sjeremylt        col=mod(i,nx)
155250756a7Sjeremylt        row=i/nx
156250756a7Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
157250756a7Sjeremylt        do j=0,phex-1
158250756a7Sjeremylt          do k=0,phex-1
159250756a7Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
160250756a7Sjeremylt          enddo
161250756a7Sjeremylt        enddo
162250756a7Sjeremylt      enddo
163250756a7Sjeremylt
164250756a7Sjeremylt! -- Restrictions
165d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,&
166250756a7Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
167250756a7Sjeremylt
168d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
169250756a7Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1707509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
1717509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
172d979a051Sjeremylt     & 1,nqptshex,stridesuhex,erestrictuihex,err)
173250756a7Sjeremylt
174250756a7Sjeremylt! -- Bases
175250756a7Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
176250756a7Sjeremylt     & bxhex,err)
177250756a7Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
178250756a7Sjeremylt     & buhex,err)
179250756a7Sjeremylt
180250756a7Sjeremylt! -- QFunctions
181250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
182250756a7Sjeremylt     &SOURCE_DIR&
183872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
184250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
185250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
186250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
187250756a7Sjeremylt
188250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
189250756a7Sjeremylt     &SOURCE_DIR&
190872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
191250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
192250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
193250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
194250756a7Sjeremylt
195250756a7Sjeremylt! -- Operators
196250756a7Sjeremylt! ---- Setup Hex
197250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
198250756a7Sjeremylt     & ceed_qfunction_none,op_setuphex,&
199250756a7Sjeremylt     & err)
20015910d16Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',&
20115910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
202250756a7Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
203a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
204250756a7Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
205356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
206250756a7Sjeremylt! ---- Mass Hex
207250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
208250756a7Sjeremylt     & ceed_qfunction_none,op_masshex,&
209250756a7Sjeremylt     & err)
210250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
211356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
212250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
213a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
214250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
215a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
216250756a7Sjeremylt
217250756a7Sjeremylt! 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)
221250756a7Sjeremylt
222*ed094490SJeremy L Thompson      call ceedoperatorcreatecomposite(ceed,op_mass,err)
223*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_mass,op_masstet,err)
224*ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_mass,op_masshex,err)
225250756a7Sjeremylt
226250756a7Sjeremylt! Apply Setup Operator
227250756a7Sjeremylt      call ceedoperatorapply(op_setup,x,ceed_vector_none,&
228250756a7Sjeremylt     & ceed_request_immediate,err)
229250756a7Sjeremylt
230250756a7Sjeremylt! Apply Mass Operator
231250756a7Sjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
232250756a7Sjeremylt      call ceedvectorsetvalue(u,1.d0,err)
233250756a7Sjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
234250756a7Sjeremylt      call ceedvectorsetvalue(v,0.d0,err)
235250756a7Sjeremylt
236250756a7Sjeremylt      call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err)
237250756a7Sjeremylt
238250756a7Sjeremylt! Check Output
239250756a7Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
240250756a7Sjeremylt      total=0.
241250756a7Sjeremylt      do i=1,ndofs
242250756a7Sjeremylt        total=total+hv(voffset+i)
243250756a7Sjeremylt      enddo
244250756a7Sjeremylt      if (abs(total-1.)>1.0d-10) then
245250756a7Sjeremylt! LCOV_EXCL_START
246250756a7Sjeremylt        write(*,*) 'Computed Area: ',total,' != True Area: 1.0'
247250756a7Sjeremylt! LCOV_EXCL_STOP
248250756a7Sjeremylt      endif
249250756a7Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
250250756a7Sjeremylt
251250756a7Sjeremylt      call ceedvectorsetvalue(v,1.d0,err)
252250756a7Sjeremylt      call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err)
253250756a7Sjeremylt
254250756a7Sjeremylt! Check Output
255250756a7Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
256250756a7Sjeremylt      total=-ndofs
257250756a7Sjeremylt      do i=1,ndofs
258250756a7Sjeremylt        total=total+hv(voffset+i)
259250756a7Sjeremylt      enddo
260250756a7Sjeremylt      if (abs(total-1.)>1.0d-10) then
261250756a7Sjeremylt! LCOV_EXCL_START
262250756a7Sjeremylt        write(*,*) 'Computed Area: ',total,' != True Area: 1.0'
263250756a7Sjeremylt! LCOV_EXCL_STOP
264250756a7Sjeremylt      endif
265250756a7Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
266250756a7Sjeremylt
267250756a7Sjeremylt! Cleanup
268250756a7Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
269250756a7Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
270250756a7Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
271250756a7Sjeremylt      call ceedoperatordestroy(op_masstet,err)
272250756a7Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
273250756a7Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
274250756a7Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
275250756a7Sjeremylt      call ceedoperatordestroy(op_masshex,err)
276250756a7Sjeremylt      call ceedoperatordestroy(op_setup,err)
277250756a7Sjeremylt      call ceedoperatordestroy(op_mass,err)
278250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
279250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
280250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
281250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
282250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
283250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
284250756a7Sjeremylt      call ceedbasisdestroy(butet,err)
285250756a7Sjeremylt      call ceedbasisdestroy(bxtet,err)
286250756a7Sjeremylt      call ceedbasisdestroy(buhex,err)
287250756a7Sjeremylt      call ceedbasisdestroy(bxhex,err)
288250756a7Sjeremylt      call ceedvectordestroy(x,err)
289250756a7Sjeremylt      call ceedvectordestroy(u,err)
290250756a7Sjeremylt      call ceedvectordestroy(v,err)
291250756a7Sjeremylt      call ceedvectordestroy(qdatatet,err)
292250756a7Sjeremylt      call ceedvectordestroy(qdatahex,err)
293250756a7Sjeremylt      call ceeddestroy(ceed,err)
294250756a7Sjeremylt      end
295250756a7Sjeremylt!-----------------------------------------------------------------------
296