xref: /libCEED/tests/t524-operator-f.f90 (revision 1f9a83abe5ffa9c83e4a126579dd9511999b6f22)
1250756a7Sjeremylt!-----------------------------------------------------------------------
2250756a7Sjeremylt!
3250756a7Sjeremylt! Header with common subroutine
4250756a7Sjeremylt!
5250756a7Sjeremylt      include 't320-basis-f.h'
6250756a7Sjeremylt!-----------------------------------------------------------------------
7250756a7Sjeremylt      subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
8250756a7Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
9250756a7Sjeremylt      real*8 ctx
10250756a7Sjeremylt      real*8 u1(1)
11250756a7Sjeremylt      real*8 u2(1)
12250756a7Sjeremylt      real*8 v1(1)
13250756a7Sjeremylt      integer q,ierr
14250756a7Sjeremylt
15250756a7Sjeremylt      do i=1,q
16250756a7Sjeremylt        v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2))
17250756a7Sjeremylt      enddo
18250756a7Sjeremylt
19250756a7Sjeremylt      ierr=0
20250756a7Sjeremylt      end
21250756a7Sjeremylt!-----------------------------------------------------------------------
22250756a7Sjeremylt      subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
23250756a7Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
24250756a7Sjeremylt      real*8 ctx
25250756a7Sjeremylt      real*8 u1(1)
26250756a7Sjeremylt      real*8 u2(1)
27250756a7Sjeremylt      real*8 v1(1)
28250756a7Sjeremylt      integer q,ierr
29250756a7Sjeremylt
30250756a7Sjeremylt      do i=1,q
31250756a7Sjeremylt        v1(i)=u2(i)*u1(i)
32250756a7Sjeremylt      enddo
33250756a7Sjeremylt
34250756a7Sjeremylt      ierr=0
35250756a7Sjeremylt      end
36250756a7Sjeremylt!-----------------------------------------------------------------------
37250756a7Sjeremylt      program test
38*1f9a83abSJed Brown      implicit none
39250756a7Sjeremylt      include 'ceedf.h'
40250756a7Sjeremylt
41250756a7Sjeremylt      integer ceed,err,i,j,k
4215910d16Sjeremylt      integer stridesutet(3),stridesuhex(3)
4315910d16Sjeremylt      integer erestrictxtet,erestrictutet,erestrictuitet,&
4415910d16Sjeremylt&             erestrictxhex,erestrictuhex,erestrictuihex
45250756a7Sjeremylt      integer bxtet,butet,bxhex,buhex
46250756a7Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
47250756a7Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
48250756a7Sjeremylt      integer qdatatet,qdatahex,x,u,v
49250756a7Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
50250756a7Sjeremylt      integer row,col,offset
51250756a7Sjeremylt      parameter(nelemtet=6)
52250756a7Sjeremylt      parameter(ptet=6)
53250756a7Sjeremylt      parameter(qtet=4)
54250756a7Sjeremylt      parameter(nelemhex=6)
55250756a7Sjeremylt      parameter(phex=3)
56250756a7Sjeremylt      parameter(qhex=4)
57250756a7Sjeremylt      parameter(d=2)
58250756a7Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
59250756a7Sjeremylt      parameter(nx=3)
60250756a7Sjeremylt      parameter(ny=3)
61250756a7Sjeremylt      parameter(nxtet=3)
62250756a7Sjeremylt      parameter(nytet=1)
63250756a7Sjeremylt      parameter(nxhex=3)
64250756a7Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
65250756a7Sjeremylt      parameter(nqptstet=nelemtet*qtet)
66250756a7Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
67250756a7Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
68250756a7Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
69250756a7Sjeremylt      real*8 arrx(d*ndofs)
70250756a7Sjeremylt      integer*8 voffset,xoffset
71250756a7Sjeremylt
72250756a7Sjeremylt      real*8 qref(d*qtet)
73250756a7Sjeremylt      real*8 qweight(qtet)
74250756a7Sjeremylt      real*8 interp(ptet*qtet)
75250756a7Sjeremylt      real*8 grad(d*ptet*qtet)
76250756a7Sjeremylt
77250756a7Sjeremylt      real*8 hv(ndofs)
78250756a7Sjeremylt      real*8 total
79250756a7Sjeremylt
80250756a7Sjeremylt      character arg*32
81250756a7Sjeremylt
82250756a7Sjeremylt      external setup,mass
83250756a7Sjeremylt
84250756a7Sjeremylt      call getarg(1,arg)
85250756a7Sjeremylt
86250756a7Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
87250756a7Sjeremylt
88250756a7Sjeremylt! DoF Coordinates
89250756a7Sjeremylt      do i=0,ny*2
90250756a7Sjeremylt        do j=0,nx*2
91250756a7Sjeremylt          arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny)
92250756a7Sjeremylt          arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx)
93250756a7Sjeremylt        enddo
94250756a7Sjeremylt      enddo
95250756a7Sjeremylt
96250756a7Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
97250756a7Sjeremylt      xoffset=0
98250756a7Sjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
99250756a7Sjeremylt
100250756a7Sjeremylt! Qdata Vectors
101250756a7Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
102250756a7Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
103250756a7Sjeremylt
104250756a7Sjeremylt! Tet Elements
105250756a7Sjeremylt      do i=0,2
106250756a7Sjeremylt        col=mod(i,nx)
107250756a7Sjeremylt        row=i/nx
108250756a7Sjeremylt        offset=col*2+row*(nx*2+1)*2
109250756a7Sjeremylt
110250756a7Sjeremylt        indxtet(i*2*ptet+1)=2+offset
111250756a7Sjeremylt        indxtet(i*2*ptet+2)=9+offset
112250756a7Sjeremylt        indxtet(i*2*ptet+3)=16+offset
113250756a7Sjeremylt        indxtet(i*2*ptet+4)=1+offset
114250756a7Sjeremylt        indxtet(i*2*ptet+5)=8+offset
115250756a7Sjeremylt        indxtet(i*2*ptet+6)=0+offset
116250756a7Sjeremylt
117250756a7Sjeremylt        indxtet(i*2*ptet+7)=14+offset
118250756a7Sjeremylt        indxtet(i*2*ptet+8)=7+offset
119250756a7Sjeremylt        indxtet(i*2*ptet+9)=0+offset
120250756a7Sjeremylt        indxtet(i*2*ptet+10)=15+offset
121250756a7Sjeremylt        indxtet(i*2*ptet+11)=8+offset
122250756a7Sjeremylt        indxtet(i*2*ptet+12)=16+offset
123250756a7Sjeremylt      enddo
124250756a7Sjeremylt
125250756a7Sjeremylt! -- Restrictions
126d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,&
127a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
128250756a7Sjeremylt
129d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,&
130a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
1317509a596Sjeremylt      stridesutet=[1,qtet,qtet]
132d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,&
133d979a051Sjeremylt     & stridesutet,erestrictuitet,err)
134250756a7Sjeremylt
135250756a7Sjeremylt! -- Bases
136250756a7Sjeremylt      call buildmats(qref,qweight,interp,grad)
137250756a7Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
138250756a7Sjeremylt     & qweight,bxtet,err)
139250756a7Sjeremylt      call buildmats(qref,qweight,interp,grad)
140250756a7Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
141250756a7Sjeremylt     & qweight,butet,err)
142250756a7Sjeremylt
143250756a7Sjeremylt! -- QFunctions
144250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
145250756a7Sjeremylt     &SOURCE_DIR&
146250756a7Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
147250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
148250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
149250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
150250756a7Sjeremylt
151250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
152250756a7Sjeremylt     &SOURCE_DIR&
153250756a7Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
154250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
155250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
156250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
157250756a7Sjeremylt
158250756a7Sjeremylt! -- Operators
159250756a7Sjeremylt! ---- Setup Tet
160250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
161250756a7Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
16215910d16Sjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',&
16315910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
164250756a7Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
165a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
166250756a7Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
167a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
168250756a7Sjeremylt! ---- Mass Tet
169250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
170250756a7Sjeremylt     & ceed_qfunction_none,op_masstet,err)
171250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
172a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
173250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
174a8d32208Sjeremylt     & butet,ceed_vector_active,err)
175250756a7Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
176a8d32208Sjeremylt     & butet,ceed_vector_active,err)
177250756a7Sjeremylt
178250756a7Sjeremylt! Hex Elements
179250756a7Sjeremylt      do i=0,nelemhex-1
180250756a7Sjeremylt        col=mod(i,nx)
181250756a7Sjeremylt        row=i/nx
182250756a7Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
183250756a7Sjeremylt        do j=0,phex-1
184250756a7Sjeremylt          do k=0,phex-1
185250756a7Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
186250756a7Sjeremylt          enddo
187250756a7Sjeremylt        enddo
188250756a7Sjeremylt      enddo
189250756a7Sjeremylt
190250756a7Sjeremylt! -- Restrictions
191d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,&
192250756a7Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
193250756a7Sjeremylt
194d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
195250756a7Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1967509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
1977509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
198d979a051Sjeremylt     & 1,nqptshex,stridesuhex,erestrictuihex,err)
199250756a7Sjeremylt
200250756a7Sjeremylt! -- Bases
201250756a7Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
202250756a7Sjeremylt     & bxhex,err)
203250756a7Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
204250756a7Sjeremylt     & buhex,err)
205250756a7Sjeremylt
206250756a7Sjeremylt! -- QFunctions
207250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
208250756a7Sjeremylt     &SOURCE_DIR&
209872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
210250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
211250756a7Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
212250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
213250756a7Sjeremylt
214250756a7Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
215250756a7Sjeremylt     &SOURCE_DIR&
216872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
217250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
218250756a7Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
219250756a7Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
220250756a7Sjeremylt
221250756a7Sjeremylt! -- Operators
222250756a7Sjeremylt! ---- Setup Hex
223250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
224250756a7Sjeremylt     & ceed_qfunction_none,op_setuphex,&
225250756a7Sjeremylt     & err)
22615910d16Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',&
22715910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
228250756a7Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
229a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
230250756a7Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
231a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
232250756a7Sjeremylt! ---- Mass Hex
233250756a7Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
234250756a7Sjeremylt     & ceed_qfunction_none,op_masshex,&
235250756a7Sjeremylt     & err)
236250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
237a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
238250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
239a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
240250756a7Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
241a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
242250756a7Sjeremylt
243250756a7Sjeremylt! Composite Operators
244250756a7Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
245250756a7Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
246250756a7Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
247250756a7Sjeremylt
248250756a7Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_mass,err)
249250756a7Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masstet,err)
250250756a7Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masshex,err)
251250756a7Sjeremylt
252250756a7Sjeremylt! Apply Setup Operator
253250756a7Sjeremylt      call ceedoperatorapply(op_setup,x,ceed_vector_none,&
254250756a7Sjeremylt     & ceed_request_immediate,err)
255250756a7Sjeremylt
256250756a7Sjeremylt! Apply Mass Operator
257250756a7Sjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
258250756a7Sjeremylt      call ceedvectorsetvalue(u,1.d0,err)
259250756a7Sjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
260250756a7Sjeremylt      call ceedvectorsetvalue(v,0.d0,err)
261250756a7Sjeremylt
262250756a7Sjeremylt      call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err)
263250756a7Sjeremylt
264250756a7Sjeremylt! Check Output
265250756a7Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
266250756a7Sjeremylt      total=0.
267250756a7Sjeremylt      do i=1,ndofs
268250756a7Sjeremylt        total=total+hv(voffset+i)
269250756a7Sjeremylt      enddo
270250756a7Sjeremylt      if (abs(total-1.)>1.0d-10) then
271250756a7Sjeremylt! LCOV_EXCL_START
272250756a7Sjeremylt        write(*,*) 'Computed Area: ',total,' != True Area: 1.0'
273250756a7Sjeremylt! LCOV_EXCL_STOP
274250756a7Sjeremylt      endif
275250756a7Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
276250756a7Sjeremylt
277250756a7Sjeremylt      call ceedvectorsetvalue(v,1.d0,err)
278250756a7Sjeremylt      call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err)
279250756a7Sjeremylt
280250756a7Sjeremylt! Check Output
281250756a7Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
282250756a7Sjeremylt      total=-ndofs
283250756a7Sjeremylt      do i=1,ndofs
284250756a7Sjeremylt        total=total+hv(voffset+i)
285250756a7Sjeremylt      enddo
286250756a7Sjeremylt      if (abs(total-1.)>1.0d-10) then
287250756a7Sjeremylt! LCOV_EXCL_START
288250756a7Sjeremylt        write(*,*) 'Computed Area: ',total,' != True Area: 1.0'
289250756a7Sjeremylt! LCOV_EXCL_STOP
290250756a7Sjeremylt      endif
291250756a7Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
292250756a7Sjeremylt
293250756a7Sjeremylt! Cleanup
294250756a7Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
295250756a7Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
296250756a7Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
297250756a7Sjeremylt      call ceedoperatordestroy(op_masstet,err)
298250756a7Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
299250756a7Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
300250756a7Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
301250756a7Sjeremylt      call ceedoperatordestroy(op_masshex,err)
302250756a7Sjeremylt      call ceedoperatordestroy(op_setup,err)
303250756a7Sjeremylt      call ceedoperatordestroy(op_mass,err)
304250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
305250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
306250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
307250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
308250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
309250756a7Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
310250756a7Sjeremylt      call ceedbasisdestroy(butet,err)
311250756a7Sjeremylt      call ceedbasisdestroy(bxtet,err)
312250756a7Sjeremylt      call ceedbasisdestroy(buhex,err)
313250756a7Sjeremylt      call ceedbasisdestroy(bxhex,err)
314250756a7Sjeremylt      call ceedvectordestroy(x,err)
315250756a7Sjeremylt      call ceedvectordestroy(u,err)
316250756a7Sjeremylt      call ceedvectordestroy(v,err)
317250756a7Sjeremylt      call ceedvectordestroy(qdatatet,err)
318250756a7Sjeremylt      call ceedvectordestroy(qdatahex,err)
319250756a7Sjeremylt      call ceeddestroy(ceed,err)
320250756a7Sjeremylt      end
321250756a7Sjeremylt!-----------------------------------------------------------------------
322