xref: /libCEED/tests/t523-operator-f.f90 (revision a8d322087fa8f150327cdc2bf14a171452b711ec)
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
46*a8d32208Sjeremylt      integer lmode
47*a8d32208Sjeremylt      parameter(lmode=ceed_notranspose)
482ebaca42Sjeremylt      integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,&
492ebaca42Sjeremylt&             erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex
502ebaca42Sjeremylt      integer bxtet,butet,bxhex,buhex
512ebaca42Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
522ebaca42Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
532ebaca42Sjeremylt      integer qdatatet,qdatahex,x
542ebaca42Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
552ebaca42Sjeremylt      integer row,col,offset
562ebaca42Sjeremylt      parameter(nelemtet=6)
572ebaca42Sjeremylt      parameter(ptet=6)
582ebaca42Sjeremylt      parameter(qtet=4)
592ebaca42Sjeremylt      parameter(nelemhex=6)
602ebaca42Sjeremylt      parameter(phex=3)
612ebaca42Sjeremylt      parameter(qhex=4)
622ebaca42Sjeremylt      parameter(d=2)
632ebaca42Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
642ebaca42Sjeremylt      parameter(nx=3)
652ebaca42Sjeremylt      parameter(ny=3)
662ebaca42Sjeremylt      parameter(nxtet=3)
672ebaca42Sjeremylt      parameter(nytet=1)
682ebaca42Sjeremylt      parameter(nxhex=3)
692ebaca42Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
702ebaca42Sjeremylt      parameter(nqptstet=nelemtet*qtet)
712ebaca42Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
722ebaca42Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
732ebaca42Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
742ebaca42Sjeremylt
752ebaca42Sjeremylt      real*8 qref(d*qtet)
762ebaca42Sjeremylt      real*8 qweight(qtet)
772ebaca42Sjeremylt      real*8 interp(ptet*qtet)
782ebaca42Sjeremylt      real*8 grad(d*ptet*qtet)
792ebaca42Sjeremylt
802ebaca42Sjeremylt      character arg*32
812ebaca42Sjeremylt
82f1a4e9feSjeremylt! LCOV_EXCL_START
832ebaca42Sjeremylt      external setup,mass
84f1a4e9feSjeremylt! LCOV_EXCL_STOP
852ebaca42Sjeremylt
862ebaca42Sjeremylt      call getarg(1,arg)
872ebaca42Sjeremylt
882ebaca42Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
892ebaca42Sjeremylt
902ebaca42Sjeremylt! DoF Coordinates
912ebaca42Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
922ebaca42Sjeremylt
932ebaca42Sjeremylt! Qdata Vectors
942ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
952ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
962ebaca42Sjeremylt
972ebaca42Sjeremylt! Tet Elements
982ebaca42Sjeremylt      do i=0,2
992ebaca42Sjeremylt        col=mod(i,nx)
1002ebaca42Sjeremylt        row=i/nx
1012ebaca42Sjeremylt        offset=col*2+row*(nx*2+1)*2
1022ebaca42Sjeremylt
1032ebaca42Sjeremylt        indxtet(i*2*ptet+1)=2+offset
1042ebaca42Sjeremylt        indxtet(i*2*ptet+2)=9+offset
1052ebaca42Sjeremylt        indxtet(i*2*ptet+3)=16+offset
1062ebaca42Sjeremylt        indxtet(i*2*ptet+4)=1+offset
1072ebaca42Sjeremylt        indxtet(i*2*ptet+5)=8+offset
1082ebaca42Sjeremylt        indxtet(i*2*ptet+6)=0+offset
1092ebaca42Sjeremylt
1102ebaca42Sjeremylt        indxtet(i*2*ptet+7)=14+offset
1112ebaca42Sjeremylt        indxtet(i*2*ptet+8)=7+offset
1122ebaca42Sjeremylt        indxtet(i*2*ptet+9)=0+offset
1132ebaca42Sjeremylt        indxtet(i*2*ptet+10)=15+offset
1142ebaca42Sjeremylt        indxtet(i*2*ptet+11)=8+offset
1152ebaca42Sjeremylt        indxtet(i*2*ptet+12)=16+offset
1162ebaca42Sjeremylt      enddo
1172ebaca42Sjeremylt
1182ebaca42Sjeremylt! -- Restrictions
119*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,d,&
120*a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
121*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,ptet,&
122*a8d32208Sjeremylt     & nelemtet*ptet,d,erestrictxitet,err)
1232ebaca42Sjeremylt
124*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,1,&
125*a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
126*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,qtet,nqptstet,&
127*a8d32208Sjeremylt     & 1,erestrictuitet,err)
1282ebaca42Sjeremylt
1292ebaca42Sjeremylt! -- Bases
1302ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1312ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
1322ebaca42Sjeremylt     & qweight,bxtet,err)
1332ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1342ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
1352ebaca42Sjeremylt     & qweight,butet,err)
1362ebaca42Sjeremylt
1372ebaca42Sjeremylt! -- QFunctions
1382ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1392ebaca42Sjeremylt     &SOURCE_DIR&
140872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
1412ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
1422ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
1432ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
1442ebaca42Sjeremylt
1452ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1462ebaca42Sjeremylt     &SOURCE_DIR&
147872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
1482ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
1492ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
1502ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
1512ebaca42Sjeremylt
1522ebaca42Sjeremylt! -- Operators
1532ebaca42Sjeremylt! ---- Setup Tet
1542ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
1552ebaca42Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
1562ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,&
157*a8d32208Sjeremylt     & bxtet,ceed_vector_none,err)
1582ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
159*a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
1602ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
161*a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1622ebaca42Sjeremylt! ---- Mass Tet
1632ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
1642ebaca42Sjeremylt     & ceed_qfunction_none,op_masstet,err)
1652ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
166*a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1672ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
168*a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1692ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
170*a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1712ebaca42Sjeremylt
1722ebaca42Sjeremylt! Hex Elements
1732ebaca42Sjeremylt      do i=0,nelemhex-1
1742ebaca42Sjeremylt        col=mod(i,nx)
1752ebaca42Sjeremylt        row=i/nx
1762ebaca42Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
1772ebaca42Sjeremylt        do j=0,phex-1
1782ebaca42Sjeremylt          do k=0,phex-1
1792ebaca42Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
1802ebaca42Sjeremylt          enddo
1812ebaca42Sjeremylt        enddo
1822ebaca42Sjeremylt      enddo
1832ebaca42Sjeremylt
1842ebaca42Sjeremylt! -- Restrictions
185*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,d,&
1862ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
187*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,phex*phex,&
1882ebaca42Sjeremylt     & nelemhex*phex*phex,d,erestrictxihex,err)
1892ebaca42Sjeremylt
190*a8d32208Sjeremylt      call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,1,&
1912ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
192*a8d32208Sjeremylt      call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,qhex*qhex,&
193*a8d32208Sjeremylt     & nqptshex,1,erestrictuihex,err)
1942ebaca42Sjeremylt
1952ebaca42Sjeremylt! -- Bases
1962ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
1972ebaca42Sjeremylt     & bxhex,err)
1982ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
1992ebaca42Sjeremylt     & buhex,err)
2002ebaca42Sjeremylt
2012ebaca42Sjeremylt! -- QFunctions
2022ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
2032ebaca42Sjeremylt     &SOURCE_DIR&
2042ebaca42Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
2052ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
2062ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
2072ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
2082ebaca42Sjeremylt
2092ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
2102ebaca42Sjeremylt     &SOURCE_DIR&
2112ebaca42Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
2122ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
2132ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
2142ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
2152ebaca42Sjeremylt
2162ebaca42Sjeremylt! -- Operators
2172ebaca42Sjeremylt! ---- Setup Hex
2182ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
2192ebaca42Sjeremylt     & ceed_qfunction_none,op_setuphex,err)
2202ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,&
221*a8d32208Sjeremylt     & bxhex,ceed_vector_none,err)
2222ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
223*a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
2242ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
225*a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2262ebaca42Sjeremylt! ---- Mass Hex
2272ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
2282ebaca42Sjeremylt     & ceed_qfunction_none,op_masshex,err)
2292ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
230*a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2312ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
232*a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2332ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
234*a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2352ebaca42Sjeremylt
2362ebaca42Sjeremylt! Composite Operators
2372ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
2382ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
2392ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
2402ebaca42Sjeremylt
2412ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_mass,err)
2422ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masstet,err)
2432ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masshex,err)
2442ebaca42Sjeremylt
2452ebaca42Sjeremylt! View
2462ebaca42Sjeremylt      call ceedoperatorview(op_setup,err)
2472ebaca42Sjeremylt      call ceedoperatorview(op_mass,err)
2482ebaca42Sjeremylt
2492ebaca42Sjeremylt! Cleanup
2502ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
2512ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
2522ebaca42Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
2532ebaca42Sjeremylt      call ceedoperatordestroy(op_masstet,err)
2542ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
2552ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
2562ebaca42Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
2572ebaca42Sjeremylt      call ceedoperatordestroy(op_masshex,err)
2582ebaca42Sjeremylt      call ceedoperatordestroy(op_setup,err)
2592ebaca42Sjeremylt      call ceedoperatordestroy(op_mass,err)
2602ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
2612ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
2622ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
2632ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxitet,err)
2642ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
2652ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
2662ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
2672ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxihex,err)
2682ebaca42Sjeremylt      call ceedbasisdestroy(butet,err)
2692ebaca42Sjeremylt      call ceedbasisdestroy(bxtet,err)
2702ebaca42Sjeremylt      call ceedbasisdestroy(buhex,err)
2712ebaca42Sjeremylt      call ceedbasisdestroy(bxhex,err)
2722ebaca42Sjeremylt      call ceedvectordestroy(x,err)
2732ebaca42Sjeremylt      call ceedvectordestroy(qdatatet,err)
2742ebaca42Sjeremylt      call ceedvectordestroy(qdatahex,err)
2752ebaca42Sjeremylt      call ceeddestroy(ceed,err)
2762ebaca42Sjeremylt      end
2772ebaca42Sjeremylt!-----------------------------------------------------------------------
278