xref: /libCEED/tests/t523-operator-f.f90 (revision ec3da8bcb94d9f0073544b37b5081a06981a86f7)
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
13*ec3da8bcSJed 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)
1092ebaca42Sjeremylt      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)
12415910d16Sjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',&
12515910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
1262ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
127a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
1282ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
129a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1302ebaca42Sjeremylt! ---- Mass Tet
1312ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
1322ebaca42Sjeremylt     & ceed_qfunction_none,op_masstet,err)
1332ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
134a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1352ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
136a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1372ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
138a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1392ebaca42Sjeremylt
1402ebaca42Sjeremylt! Hex Elements
1412ebaca42Sjeremylt      do i=0,nelemhex-1
1422ebaca42Sjeremylt        col=mod(i,nx)
1432ebaca42Sjeremylt        row=i/nx
1442ebaca42Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
1452ebaca42Sjeremylt        do j=0,phex-1
1462ebaca42Sjeremylt          do k=0,phex-1
1472ebaca42Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
1482ebaca42Sjeremylt          enddo
1492ebaca42Sjeremylt        enddo
1502ebaca42Sjeremylt      enddo
1512ebaca42Sjeremylt
1522ebaca42Sjeremylt! -- Restrictions
153d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,&
1542ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
1552ebaca42Sjeremylt
156d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
1572ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1587509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
1597509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
160d979a051Sjeremylt     & 1,nqptshex,stridesuhex,erestrictuihex,err)
1612ebaca42Sjeremylt
1622ebaca42Sjeremylt! -- Bases
1632ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
1642ebaca42Sjeremylt     & bxhex,err)
1652ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
1662ebaca42Sjeremylt     & buhex,err)
1672ebaca42Sjeremylt
1682ebaca42Sjeremylt! -- QFunctions
1692ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1702ebaca42Sjeremylt     &SOURCE_DIR&
1712ebaca42Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
1722ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
1732ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
1742ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
1752ebaca42Sjeremylt
1762ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1772ebaca42Sjeremylt     &SOURCE_DIR&
1782ebaca42Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
1792ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
1802ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
1812ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
1822ebaca42Sjeremylt
1832ebaca42Sjeremylt! -- Operators
1842ebaca42Sjeremylt! ---- Setup Hex
1852ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
1862ebaca42Sjeremylt     & ceed_qfunction_none,op_setuphex,err)
18715910d16Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',&
18815910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
1892ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
190a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
1912ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
192a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
1932ebaca42Sjeremylt! ---- Mass Hex
1942ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
1952ebaca42Sjeremylt     & ceed_qfunction_none,op_masshex,err)
1962ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
197a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
1982ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
199a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2002ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
201a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2022ebaca42Sjeremylt
2032ebaca42Sjeremylt! Composite Operators
2042ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
2052ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
2062ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
2072ebaca42Sjeremylt
2082ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_mass,err)
2092ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masstet,err)
2102ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masshex,err)
2112ebaca42Sjeremylt
2122ebaca42Sjeremylt! View
2132ebaca42Sjeremylt      call ceedoperatorview(op_setup,err)
2142ebaca42Sjeremylt      call ceedoperatorview(op_mass,err)
2152ebaca42Sjeremylt
2162ebaca42Sjeremylt! Cleanup
2172ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
2182ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
2192ebaca42Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
2202ebaca42Sjeremylt      call ceedoperatordestroy(op_masstet,err)
2212ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
2222ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
2232ebaca42Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
2242ebaca42Sjeremylt      call ceedoperatordestroy(op_masshex,err)
2252ebaca42Sjeremylt      call ceedoperatordestroy(op_setup,err)
2262ebaca42Sjeremylt      call ceedoperatordestroy(op_mass,err)
2272ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
2282ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
2292ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
2302ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
2312ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
2322ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
2332ebaca42Sjeremylt      call ceedbasisdestroy(butet,err)
2342ebaca42Sjeremylt      call ceedbasisdestroy(bxtet,err)
2352ebaca42Sjeremylt      call ceedbasisdestroy(buhex,err)
2362ebaca42Sjeremylt      call ceedbasisdestroy(bxhex,err)
2372ebaca42Sjeremylt      call ceedvectordestroy(x,err)
2382ebaca42Sjeremylt      call ceedvectordestroy(qdatatet,err)
2392ebaca42Sjeremylt      call ceedvectordestroy(qdatahex,err)
2402ebaca42Sjeremylt      call ceeddestroy(ceed,err)
2412ebaca42Sjeremylt      end
2422ebaca42Sjeremylt!-----------------------------------------------------------------------
243