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