xref: /libCEED/tests/t523-operator-f.f90 (revision d979a0510f6353f9b8b50621433d53955a3f350a)
12ebaca42Sjeremylt!-----------------------------------------------------------------------
22ebaca42Sjeremylt!
32ebaca42Sjeremylt! Header with common subroutine
42ebaca42Sjeremylt!
52ebaca42Sjeremylt      include 't320-basis-f.h'
62ebaca42Sjeremylt!-----------------------------------------------------------------------
72ebaca42Sjeremylt      subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
82ebaca42Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
9f1a4e9feSjeremylt! LCOV_EXCL_START
102ebaca42Sjeremylt      real*8 ctx
112ebaca42Sjeremylt      real*8 u1(1)
122ebaca42Sjeremylt      real*8 u2(1)
132ebaca42Sjeremylt      real*8 v1(1)
142ebaca42Sjeremylt      integer q,ierr
152ebaca42Sjeremylt
162ebaca42Sjeremylt      do i=1,q
172ebaca42Sjeremylt        v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2))
182ebaca42Sjeremylt      enddo
192ebaca42Sjeremylt
202ebaca42Sjeremylt      ierr=0
212ebaca42Sjeremylt      end
22f1a4e9feSjeremylt! LCOV_EXCL_STOP
232ebaca42Sjeremylt!-----------------------------------------------------------------------
242ebaca42Sjeremylt      subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
252ebaca42Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
26f1a4e9feSjeremylt! LCOV_EXCL_START
272ebaca42Sjeremylt      real*8 ctx
282ebaca42Sjeremylt      real*8 u1(1)
292ebaca42Sjeremylt      real*8 u2(1)
302ebaca42Sjeremylt      real*8 v1(1)
312ebaca42Sjeremylt      integer q,ierr
322ebaca42Sjeremylt
332ebaca42Sjeremylt      do i=1,q
342ebaca42Sjeremylt        v1(i)=u2(i)*u1(i)
352ebaca42Sjeremylt      enddo
362ebaca42Sjeremylt
372ebaca42Sjeremylt      ierr=0
382ebaca42Sjeremylt      end
39f1a4e9feSjeremylt! LCOV_EXCL_STOP
402ebaca42Sjeremylt!-----------------------------------------------------------------------
412ebaca42Sjeremylt      program test
422ebaca42Sjeremylt
432ebaca42Sjeremylt      include 'ceedf.h'
442ebaca42Sjeremylt
452ebaca42Sjeremylt      integer ceed,err,i,j,k
4615910d16Sjeremylt      integer stridesutet(3),stridesuhex(3)
4715910d16Sjeremylt      integer erestrictxtet,erestrictutet,erestrictuitet,&
4815910d16Sjeremylt&             erestrictxhex,erestrictuhex,erestrictuihex
492ebaca42Sjeremylt      integer bxtet,butet,bxhex,buhex
502ebaca42Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
512ebaca42Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
522ebaca42Sjeremylt      integer qdatatet,qdatahex,x
532ebaca42Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
542ebaca42Sjeremylt      integer row,col,offset
552ebaca42Sjeremylt      parameter(nelemtet=6)
562ebaca42Sjeremylt      parameter(ptet=6)
572ebaca42Sjeremylt      parameter(qtet=4)
582ebaca42Sjeremylt      parameter(nelemhex=6)
592ebaca42Sjeremylt      parameter(phex=3)
602ebaca42Sjeremylt      parameter(qhex=4)
612ebaca42Sjeremylt      parameter(d=2)
622ebaca42Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
632ebaca42Sjeremylt      parameter(nx=3)
642ebaca42Sjeremylt      parameter(ny=3)
652ebaca42Sjeremylt      parameter(nxtet=3)
662ebaca42Sjeremylt      parameter(nytet=1)
672ebaca42Sjeremylt      parameter(nxhex=3)
682ebaca42Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
692ebaca42Sjeremylt      parameter(nqptstet=nelemtet*qtet)
702ebaca42Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
712ebaca42Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
722ebaca42Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
732ebaca42Sjeremylt
742ebaca42Sjeremylt      real*8 qref(d*qtet)
752ebaca42Sjeremylt      real*8 qweight(qtet)
762ebaca42Sjeremylt      real*8 interp(ptet*qtet)
772ebaca42Sjeremylt      real*8 grad(d*ptet*qtet)
782ebaca42Sjeremylt
792ebaca42Sjeremylt      character arg*32
802ebaca42Sjeremylt
81f1a4e9feSjeremylt! LCOV_EXCL_START
822ebaca42Sjeremylt      external setup,mass
83f1a4e9feSjeremylt! LCOV_EXCL_STOP
842ebaca42Sjeremylt
852ebaca42Sjeremylt      call getarg(1,arg)
862ebaca42Sjeremylt
872ebaca42Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
882ebaca42Sjeremylt
892ebaca42Sjeremylt! DoF Coordinates
902ebaca42Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
912ebaca42Sjeremylt
922ebaca42Sjeremylt! Qdata Vectors
932ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
942ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
952ebaca42Sjeremylt
962ebaca42Sjeremylt! Tet Elements
972ebaca42Sjeremylt      do i=0,2
982ebaca42Sjeremylt        col=mod(i,nx)
992ebaca42Sjeremylt        row=i/nx
1002ebaca42Sjeremylt        offset=col*2+row*(nx*2+1)*2
1012ebaca42Sjeremylt
1022ebaca42Sjeremylt        indxtet(i*2*ptet+1)=2+offset
1032ebaca42Sjeremylt        indxtet(i*2*ptet+2)=9+offset
1042ebaca42Sjeremylt        indxtet(i*2*ptet+3)=16+offset
1052ebaca42Sjeremylt        indxtet(i*2*ptet+4)=1+offset
1062ebaca42Sjeremylt        indxtet(i*2*ptet+5)=8+offset
1072ebaca42Sjeremylt        indxtet(i*2*ptet+6)=0+offset
1082ebaca42Sjeremylt
1092ebaca42Sjeremylt        indxtet(i*2*ptet+7)=14+offset
1102ebaca42Sjeremylt        indxtet(i*2*ptet+8)=7+offset
1112ebaca42Sjeremylt        indxtet(i*2*ptet+9)=0+offset
1122ebaca42Sjeremylt        indxtet(i*2*ptet+10)=15+offset
1132ebaca42Sjeremylt        indxtet(i*2*ptet+11)=8+offset
1142ebaca42Sjeremylt        indxtet(i*2*ptet+12)=16+offset
1152ebaca42Sjeremylt      enddo
1162ebaca42Sjeremylt
1172ebaca42Sjeremylt! -- Restrictions
118*d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,&
119a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
1202ebaca42Sjeremylt
121*d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,&
122a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
1237509a596Sjeremylt      stridesutet=[1,qtet,qtet]
124*d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,&
125*d979a051Sjeremylt     & stridesutet,erestrictuitet,err)
1262ebaca42Sjeremylt
1272ebaca42Sjeremylt! -- Bases
1282ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1292ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
1302ebaca42Sjeremylt     & qweight,bxtet,err)
1312ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1322ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
1332ebaca42Sjeremylt     & qweight,butet,err)
1342ebaca42Sjeremylt
1352ebaca42Sjeremylt! -- QFunctions
1362ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1372ebaca42Sjeremylt     &SOURCE_DIR&
138872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
1392ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
1402ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
1412ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
1422ebaca42Sjeremylt
1432ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1442ebaca42Sjeremylt     &SOURCE_DIR&
145872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
1462ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
1472ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
1482ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
1492ebaca42Sjeremylt
1502ebaca42Sjeremylt! -- Operators
1512ebaca42Sjeremylt! ---- Setup Tet
1522ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
1532ebaca42Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
15415910d16Sjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',&
15515910d16Sjeremylt     & ceed_elemrestriction_none,bxtet,ceed_vector_none,err)
1562ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
157a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
1582ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
159a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1602ebaca42Sjeremylt! ---- Mass Tet
1612ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
1622ebaca42Sjeremylt     & ceed_qfunction_none,op_masstet,err)
1632ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
164a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1652ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
166a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1672ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
168a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1692ebaca42Sjeremylt
1702ebaca42Sjeremylt! Hex Elements
1712ebaca42Sjeremylt      do i=0,nelemhex-1
1722ebaca42Sjeremylt        col=mod(i,nx)
1732ebaca42Sjeremylt        row=i/nx
1742ebaca42Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
1752ebaca42Sjeremylt        do j=0,phex-1
1762ebaca42Sjeremylt          do k=0,phex-1
1772ebaca42Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
1782ebaca42Sjeremylt          enddo
1792ebaca42Sjeremylt        enddo
1802ebaca42Sjeremylt      enddo
1812ebaca42Sjeremylt
1822ebaca42Sjeremylt! -- Restrictions
183*d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,&
1842ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
1852ebaca42Sjeremylt
186*d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,&
1872ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
1887509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
1897509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
190*d979a051Sjeremylt     & 1,nqptshex,stridesuhex,erestrictuihex,err)
1912ebaca42Sjeremylt
1922ebaca42Sjeremylt! -- Bases
1932ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
1942ebaca42Sjeremylt     & bxhex,err)
1952ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
1962ebaca42Sjeremylt     & buhex,err)
1972ebaca42Sjeremylt
1982ebaca42Sjeremylt! -- QFunctions
1992ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
2002ebaca42Sjeremylt     &SOURCE_DIR&
2012ebaca42Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
2022ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
2032ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
2042ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
2052ebaca42Sjeremylt
2062ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
2072ebaca42Sjeremylt     &SOURCE_DIR&
2082ebaca42Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
2092ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
2102ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
2112ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
2122ebaca42Sjeremylt
2132ebaca42Sjeremylt! -- Operators
2142ebaca42Sjeremylt! ---- Setup Hex
2152ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
2162ebaca42Sjeremylt     & ceed_qfunction_none,op_setuphex,err)
21715910d16Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',&
21815910d16Sjeremylt     & ceed_elemrestriction_none,bxhex,ceed_vector_none,err)
2192ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
220a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
2212ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
222a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2232ebaca42Sjeremylt! ---- Mass Hex
2242ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
2252ebaca42Sjeremylt     & ceed_qfunction_none,op_masshex,err)
2262ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
227a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2282ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
229a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2302ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
231a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2322ebaca42Sjeremylt
2332ebaca42Sjeremylt! Composite Operators
2342ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
2352ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
2362ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
2372ebaca42Sjeremylt
2382ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_mass,err)
2392ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masstet,err)
2402ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masshex,err)
2412ebaca42Sjeremylt
2422ebaca42Sjeremylt! View
2432ebaca42Sjeremylt      call ceedoperatorview(op_setup,err)
2442ebaca42Sjeremylt      call ceedoperatorview(op_mass,err)
2452ebaca42Sjeremylt
2462ebaca42Sjeremylt! Cleanup
2472ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
2482ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
2492ebaca42Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
2502ebaca42Sjeremylt      call ceedoperatordestroy(op_masstet,err)
2512ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
2522ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
2532ebaca42Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
2542ebaca42Sjeremylt      call ceedoperatordestroy(op_masshex,err)
2552ebaca42Sjeremylt      call ceedoperatordestroy(op_setup,err)
2562ebaca42Sjeremylt      call ceedoperatordestroy(op_mass,err)
2572ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
2582ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
2592ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
2602ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
2612ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
2622ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
2632ebaca42Sjeremylt      call ceedbasisdestroy(butet,err)
2642ebaca42Sjeremylt      call ceedbasisdestroy(bxtet,err)
2652ebaca42Sjeremylt      call ceedbasisdestroy(buhex,err)
2662ebaca42Sjeremylt      call ceedbasisdestroy(bxhex,err)
2672ebaca42Sjeremylt      call ceedvectordestroy(x,err)
2682ebaca42Sjeremylt      call ceedvectordestroy(qdatatet,err)
2692ebaca42Sjeremylt      call ceedvectordestroy(qdatahex,err)
2702ebaca42Sjeremylt      call ceeddestroy(ceed,err)
2712ebaca42Sjeremylt      end
2722ebaca42Sjeremylt!-----------------------------------------------------------------------
273