xref: /libCEED/tests/t523-operator-f.f90 (revision 57af422ce4fd2bed083e8288205852f8262d25d3)
12ebaca42Sjeremylt!-----------------------------------------------------------------------
22ebaca42Sjeremylt!
32ebaca42Sjeremylt! Header with common subroutine
42ebaca42Sjeremylt!
52ebaca42Sjeremylt      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'
102ebaca42Sjeremylt!-----------------------------------------------------------------------
112ebaca42Sjeremylt      program test
121f9a83abSJed Brown      implicit none
13ec3da8bcSJed Brown      include 'ceed/fortran.h'
142ebaca42Sjeremylt
152ebaca42Sjeremylt      integer ceed,err,i,j,k
1615910d16Sjeremylt      integer stridesutet(3),stridesuhex(3)
1715910d16Sjeremylt      integer erestrictxtet,erestrictutet,erestrictuitet,&
1815910d16Sjeremylt&             erestrictxhex,erestrictuhex,erestrictuihex
192ebaca42Sjeremylt      integer bxtet,butet,bxhex,buhex
202ebaca42Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
212ebaca42Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
222ebaca42Sjeremylt      integer qdatatet,qdatahex,x
232ebaca42Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
242ebaca42Sjeremylt      integer row,col,offset
252ebaca42Sjeremylt      parameter(nelemtet=6)
262ebaca42Sjeremylt      parameter(ptet=6)
272ebaca42Sjeremylt      parameter(qtet=4)
282ebaca42Sjeremylt      parameter(nelemhex=6)
292ebaca42Sjeremylt      parameter(phex=3)
302ebaca42Sjeremylt      parameter(qhex=4)
312ebaca42Sjeremylt      parameter(d=2)
322ebaca42Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
332ebaca42Sjeremylt      parameter(nx=3)
342ebaca42Sjeremylt      parameter(ny=3)
352ebaca42Sjeremylt      parameter(nxtet=3)
362ebaca42Sjeremylt      parameter(nytet=1)
372ebaca42Sjeremylt      parameter(nxhex=3)
382ebaca42Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
392ebaca42Sjeremylt      parameter(nqptstet=nelemtet*qtet)
402ebaca42Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
412ebaca42Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
422ebaca42Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
432ebaca42Sjeremylt
442ebaca42Sjeremylt      real*8 qref(d*qtet)
452ebaca42Sjeremylt      real*8 qweight(qtet)
462ebaca42Sjeremylt      real*8 interp(ptet*qtet)
472ebaca42Sjeremylt      real*8 grad(d*ptet*qtet)
482ebaca42Sjeremylt
492ebaca42Sjeremylt      character arg*32
502ebaca42Sjeremylt
51f1a4e9feSjeremylt! LCOV_EXCL_START
522ebaca42Sjeremylt      external setup,mass
53f1a4e9feSjeremylt! LCOV_EXCL_STOP
542ebaca42Sjeremylt
552ebaca42Sjeremylt      call getarg(1,arg)
562ebaca42Sjeremylt
572ebaca42Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
582ebaca42Sjeremylt
592ebaca42Sjeremylt! DoF Coordinates
602ebaca42Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
612ebaca42Sjeremylt
622ebaca42Sjeremylt! Qdata Vectors
632ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
642ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
652ebaca42Sjeremylt
662ebaca42Sjeremylt! Tet Elements
672ebaca42Sjeremylt      do i=0,2
682ebaca42Sjeremylt        col=mod(i,nx)
692ebaca42Sjeremylt        row=i/nx
702ebaca42Sjeremylt        offset=col*2+row*(nx*2+1)*2
712ebaca42Sjeremylt
722ebaca42Sjeremylt        indxtet(i*2*ptet+1)=2+offset
732ebaca42Sjeremylt        indxtet(i*2*ptet+2)=9+offset
742ebaca42Sjeremylt        indxtet(i*2*ptet+3)=16+offset
752ebaca42Sjeremylt        indxtet(i*2*ptet+4)=1+offset
762ebaca42Sjeremylt        indxtet(i*2*ptet+5)=8+offset
772ebaca42Sjeremylt        indxtet(i*2*ptet+6)=0+offset
782ebaca42Sjeremylt
792ebaca42Sjeremylt        indxtet(i*2*ptet+7)=14+offset
802ebaca42Sjeremylt        indxtet(i*2*ptet+8)=7+offset
812ebaca42Sjeremylt        indxtet(i*2*ptet+9)=0+offset
822ebaca42Sjeremylt        indxtet(i*2*ptet+10)=15+offset
832ebaca42Sjeremylt        indxtet(i*2*ptet+11)=8+offset
842ebaca42Sjeremylt        indxtet(i*2*ptet+12)=16+offset
852ebaca42Sjeremylt      enddo
862ebaca42Sjeremylt
872ebaca42Sjeremylt! -- Restrictions
88d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,&
89a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
902ebaca42Sjeremylt
91d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,&
92a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
937509a596Sjeremylt      stridesutet=[1,qtet,qtet]
94d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,&
95d979a051Sjeremylt     & stridesutet,erestrictuitet,err)
962ebaca42Sjeremylt
972ebaca42Sjeremylt! -- Bases
982ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
992ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
1002ebaca42Sjeremylt     & qweight,bxtet,err)
1012ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1022ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
1032ebaca42Sjeremylt     & qweight,butet,err)
1042ebaca42Sjeremylt
1052ebaca42Sjeremylt! -- QFunctions
1062ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1072ebaca42Sjeremylt     &SOURCE_DIR&
108872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
109a61c78d6SJeremy L Thompson      call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err)
1102ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
1112ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
1122ebaca42Sjeremylt
1132ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1142ebaca42Sjeremylt     &SOURCE_DIR&
115872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
1162ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
1172ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
1182ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
1192ebaca42Sjeremylt
1202ebaca42Sjeremylt! -- Operators
1212ebaca42Sjeremylt! ---- Setup Tet
1222ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
1232ebaca42Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
124ea6b5821SJeremy L Thompson      call ceedoperatorsetname(op_setuptet,'triangle elements',err)
125a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setuptet,'weight',&
12615910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
1272ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
128a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
1292ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
130356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
1312ebaca42Sjeremylt! ---- Mass Tet
1322ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
1332ebaca42Sjeremylt     & ceed_qfunction_none,op_masstet,err)
134ea6b5821SJeremy L Thompson      call ceedoperatorsetname(op_masstet,'triangle elements',err)
1352ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
136356036faSJeremy L Thompson     ceed_basis_none,qdatatet,err)
1372ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
138a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1392ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
140a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1412ebaca42Sjeremylt
1422ebaca42Sjeremylt! Hex Elements
1432ebaca42Sjeremylt      do i=0,nelemhex-1
1442ebaca42Sjeremylt        col=mod(i,nx)
1452ebaca42Sjeremylt        row=i/nx
1462ebaca42Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
1472ebaca42Sjeremylt        do j=0,phex-1
1482ebaca42Sjeremylt          do k=0,phex-1
1492ebaca42Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
1502ebaca42Sjeremylt          enddo
1512ebaca42Sjeremylt        enddo
1522ebaca42Sjeremylt      enddo
1532ebaca42Sjeremylt
1542ebaca42Sjeremylt! -- Restrictions
155d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,&
1562ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
1572ebaca42Sjeremylt
158d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
1592ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1607509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
1617509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
162d979a051Sjeremylt     & 1,nqptshex,stridesuhex,erestrictuihex,err)
1632ebaca42Sjeremylt
1642ebaca42Sjeremylt! -- Bases
1652ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
1662ebaca42Sjeremylt     & bxhex,err)
1672ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
1682ebaca42Sjeremylt     & buhex,err)
1692ebaca42Sjeremylt
1702ebaca42Sjeremylt! -- QFunctions
1712ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1722ebaca42Sjeremylt     &SOURCE_DIR&
1732ebaca42Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
174a61c78d6SJeremy L Thompson      call ceedqfunctionaddinput(qf_setuphex,'weight',1,ceed_eval_weight,err)
1752ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
1762ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
1772ebaca42Sjeremylt
1782ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1792ebaca42Sjeremylt     &SOURCE_DIR&
1802ebaca42Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
1812ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
1822ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
1832ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
1842ebaca42Sjeremylt
1852ebaca42Sjeremylt! -- Operators
1862ebaca42Sjeremylt! ---- Setup Hex
1872ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
1882ebaca42Sjeremylt     & ceed_qfunction_none,op_setuphex,err)
1894fee36f0SJeremy L Thompson      call ceedoperatorsetname(op_setuphex,'quadrilateral elements',err)
190a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setuphex,'weight',&
19115910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
1922ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
193a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
1942ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
195356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
1962ebaca42Sjeremylt! ---- Mass Hex
1972ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
1982ebaca42Sjeremylt     & ceed_qfunction_none,op_masshex,err)
1994fee36f0SJeremy L Thompson      call ceedoperatorsetname(op_masshex,'quadrilateral elements',err)
2002ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
201356036faSJeremy L Thompson     ceed_basis_none,qdatahex,err)
2022ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
203a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2042ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
205a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2062ebaca42Sjeremylt
2072ebaca42Sjeremylt! Composite Operators
208ed094490SJeremy L Thompson      call ceedoperatorcreatecomposite(ceed,op_setup,err)
209ea6b5821SJeremy L Thompson      call ceedoperatorsetname(op_setup,'setup',err)
210ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_setup,op_setuptet,err)
211ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_setup,op_setuphex,err)
2122ebaca42Sjeremylt
213ed094490SJeremy L Thompson      call ceedoperatorcreatecomposite(ceed,op_mass,err)
214ea6b5821SJeremy L Thompson      call ceedoperatorsetname(op_mass,'mass',err)
215*5a526491SJeremy L Thompson      call ceedoperatorsetnumviewtabs(op_mass,1,err)
216ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_mass,op_masstet,err)
217ed094490SJeremy L Thompson      call ceedoperatorcompositeaddsub(op_mass,op_masshex,err)
2182ebaca42Sjeremylt
2192ebaca42Sjeremylt! View
2202ebaca42Sjeremylt      call ceedoperatorview(op_setup,err)
2212ebaca42Sjeremylt      call ceedoperatorview(op_mass,err)
2222ebaca42Sjeremylt
2232ebaca42Sjeremylt! Cleanup
2242ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
2252ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
2262ebaca42Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
2272ebaca42Sjeremylt      call ceedoperatordestroy(op_masstet,err)
2282ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
2292ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
2302ebaca42Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
2312ebaca42Sjeremylt      call ceedoperatordestroy(op_masshex,err)
2322ebaca42Sjeremylt      call ceedoperatordestroy(op_setup,err)
2332ebaca42Sjeremylt      call ceedoperatordestroy(op_mass,err)
2342ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
2352ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
2362ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
2372ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
2382ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
2392ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
2402ebaca42Sjeremylt      call ceedbasisdestroy(butet,err)
2412ebaca42Sjeremylt      call ceedbasisdestroy(bxtet,err)
2422ebaca42Sjeremylt      call ceedbasisdestroy(buhex,err)
2432ebaca42Sjeremylt      call ceedbasisdestroy(bxhex,err)
2442ebaca42Sjeremylt      call ceedvectordestroy(x,err)
2452ebaca42Sjeremylt      call ceedvectordestroy(qdatatet,err)
2462ebaca42Sjeremylt      call ceedvectordestroy(qdatahex,err)
2472ebaca42Sjeremylt      call ceeddestroy(ceed,err)
2482ebaca42Sjeremylt      end
2492ebaca42Sjeremylt!-----------------------------------------------------------------------
250