xref: /libCEED/tests/t523-operator-f.f90 (revision 7509a596beda7c1d002d2274a17375b09541fdb6)
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
4661dbc9d2Sjeremylt      integer imode
4761dbc9d2Sjeremylt      parameter(imode=ceed_noninterlaced)
48*7509a596Sjeremylt      integer stridesxtet(3),stridesutet(3),stridesxhex(3),stridesuhex(3)
492ebaca42Sjeremylt      integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,&
502ebaca42Sjeremylt&             erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex
512ebaca42Sjeremylt      integer bxtet,butet,bxhex,buhex
522ebaca42Sjeremylt      integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex
532ebaca42Sjeremylt      integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass
542ebaca42Sjeremylt      integer qdatatet,qdatahex,x
552ebaca42Sjeremylt      integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d
562ebaca42Sjeremylt      integer row,col,offset
572ebaca42Sjeremylt      parameter(nelemtet=6)
582ebaca42Sjeremylt      parameter(ptet=6)
592ebaca42Sjeremylt      parameter(qtet=4)
602ebaca42Sjeremylt      parameter(nelemhex=6)
612ebaca42Sjeremylt      parameter(phex=3)
622ebaca42Sjeremylt      parameter(qhex=4)
632ebaca42Sjeremylt      parameter(d=2)
642ebaca42Sjeremylt      integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex
652ebaca42Sjeremylt      parameter(nx=3)
662ebaca42Sjeremylt      parameter(ny=3)
672ebaca42Sjeremylt      parameter(nxtet=3)
682ebaca42Sjeremylt      parameter(nytet=1)
692ebaca42Sjeremylt      parameter(nxhex=3)
702ebaca42Sjeremylt      parameter(ndofs=(nx*2+1)*(ny*2+1))
712ebaca42Sjeremylt      parameter(nqptstet=nelemtet*qtet)
722ebaca42Sjeremylt      parameter(nqptshex=nelemhex*qhex*qhex)
732ebaca42Sjeremylt      parameter(nqpts=nqptstet+nqptshex)
742ebaca42Sjeremylt      integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex)
752ebaca42Sjeremylt
762ebaca42Sjeremylt      real*8 qref(d*qtet)
772ebaca42Sjeremylt      real*8 qweight(qtet)
782ebaca42Sjeremylt      real*8 interp(ptet*qtet)
792ebaca42Sjeremylt      real*8 grad(d*ptet*qtet)
802ebaca42Sjeremylt
812ebaca42Sjeremylt      character arg*32
822ebaca42Sjeremylt
83f1a4e9feSjeremylt! LCOV_EXCL_START
842ebaca42Sjeremylt      external setup,mass
85f1a4e9feSjeremylt! LCOV_EXCL_STOP
862ebaca42Sjeremylt
872ebaca42Sjeremylt      call getarg(1,arg)
882ebaca42Sjeremylt
892ebaca42Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
902ebaca42Sjeremylt
912ebaca42Sjeremylt! DoF Coordinates
922ebaca42Sjeremylt      call ceedvectorcreate(ceed,d*ndofs,x,err)
932ebaca42Sjeremylt
942ebaca42Sjeremylt! Qdata Vectors
952ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptstet,qdatatet,err)
962ebaca42Sjeremylt      call ceedvectorcreate(ceed,nqptshex,qdatahex,err)
972ebaca42Sjeremylt
982ebaca42Sjeremylt! Tet Elements
992ebaca42Sjeremylt      do i=0,2
1002ebaca42Sjeremylt        col=mod(i,nx)
1012ebaca42Sjeremylt        row=i/nx
1022ebaca42Sjeremylt        offset=col*2+row*(nx*2+1)*2
1032ebaca42Sjeremylt
1042ebaca42Sjeremylt        indxtet(i*2*ptet+1)=2+offset
1052ebaca42Sjeremylt        indxtet(i*2*ptet+2)=9+offset
1062ebaca42Sjeremylt        indxtet(i*2*ptet+3)=16+offset
1072ebaca42Sjeremylt        indxtet(i*2*ptet+4)=1+offset
1082ebaca42Sjeremylt        indxtet(i*2*ptet+5)=8+offset
1092ebaca42Sjeremylt        indxtet(i*2*ptet+6)=0+offset
1102ebaca42Sjeremylt
1112ebaca42Sjeremylt        indxtet(i*2*ptet+7)=14+offset
1122ebaca42Sjeremylt        indxtet(i*2*ptet+8)=7+offset
1132ebaca42Sjeremylt        indxtet(i*2*ptet+9)=0+offset
1142ebaca42Sjeremylt        indxtet(i*2*ptet+10)=15+offset
1152ebaca42Sjeremylt        indxtet(i*2*ptet+11)=8+offset
1162ebaca42Sjeremylt        indxtet(i*2*ptet+12)=16+offset
1172ebaca42Sjeremylt      enddo
1182ebaca42Sjeremylt
1192ebaca42Sjeremylt! -- Restrictions
12061dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,d,&
121a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err)
122*7509a596Sjeremylt      stridesxtet=[1,ptet,ptet*d]
123*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,ptet,&
124*7509a596Sjeremylt     & nelemtet*ptet,d,stridesxtet,erestrictxitet,err)
1252ebaca42Sjeremylt
12661dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,1,&
127a8d32208Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err)
128*7509a596Sjeremylt      stridesutet=[1,qtet,qtet]
129*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,nqptstet,&
130*7509a596Sjeremylt     & 1,stridesutet,erestrictuitet,err)
1312ebaca42Sjeremylt
1322ebaca42Sjeremylt! -- Bases
1332ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1342ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,&
1352ebaca42Sjeremylt     & qweight,bxtet,err)
1362ebaca42Sjeremylt      call buildmats(qref,qweight,interp,grad)
1372ebaca42Sjeremylt      call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,&
1382ebaca42Sjeremylt     & qweight,butet,err)
1392ebaca42Sjeremylt
1402ebaca42Sjeremylt! -- QFunctions
1412ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1422ebaca42Sjeremylt     &SOURCE_DIR&
143872c4ebbSjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuptet,err)
1442ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err)
1452ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err)
1462ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err)
1472ebaca42Sjeremylt
1482ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1492ebaca42Sjeremylt     &SOURCE_DIR&
150872c4ebbSjeremylt     &//'t510-operator.h:mass'//char(0),qf_masstet,err)
1512ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err)
1522ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err)
1532ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err)
1542ebaca42Sjeremylt
1552ebaca42Sjeremylt! -- Operators
1562ebaca42Sjeremylt! ---- Setup Tet
1572ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,&
1582ebaca42Sjeremylt     & ceed_qfunction_none,op_setuptet,err)
1592ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,&
160a8d32208Sjeremylt     & bxtet,ceed_vector_none,err)
1612ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,&
162a8d32208Sjeremylt     & bxtet,ceed_vector_active,err)
1632ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,&
164a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1652ebaca42Sjeremylt! ---- Mass Tet
1662ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,&
1672ebaca42Sjeremylt     & ceed_qfunction_none,op_masstet,err)
1682ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,&
169a8d32208Sjeremylt     & ceed_basis_collocated,qdatatet,err)
1702ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'u',erestrictutet,&
171a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1722ebaca42Sjeremylt      call ceedoperatorsetfield(op_masstet,'v',erestrictutet,&
173a8d32208Sjeremylt     & butet,ceed_vector_active,err)
1742ebaca42Sjeremylt
1752ebaca42Sjeremylt! Hex Elements
1762ebaca42Sjeremylt      do i=0,nelemhex-1
1772ebaca42Sjeremylt        col=mod(i,nx)
1782ebaca42Sjeremylt        row=i/nx
1792ebaca42Sjeremylt        offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2
1802ebaca42Sjeremylt        do j=0,phex-1
1812ebaca42Sjeremylt          do k=0,phex-1
1822ebaca42Sjeremylt            indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j
1832ebaca42Sjeremylt          enddo
1842ebaca42Sjeremylt        enddo
1852ebaca42Sjeremylt      enddo
1862ebaca42Sjeremylt
1872ebaca42Sjeremylt! -- Restrictions
18861dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,d,&
1892ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err)
190*7509a596Sjeremylt      stridesxhex=[1,phex*phex,phex*phex*d]
191*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,phex*phex,&
192*7509a596Sjeremylt     & nelemhex*phex*phex,d,stridesxhex,erestrictxihex,err)
1932ebaca42Sjeremylt
19461dbc9d2Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,1,&
1952ebaca42Sjeremylt     & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err)
196*7509a596Sjeremylt      stridesuhex=[1,qhex*qhex,qhex*qhex]
197*7509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,&
198*7509a596Sjeremylt     & nqptshex,1,stridesuhex,erestrictuihex,err)
1992ebaca42Sjeremylt
2002ebaca42Sjeremylt! -- Bases
2012ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,&
2022ebaca42Sjeremylt     & bxhex,err)
2032ebaca42Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,&
2042ebaca42Sjeremylt     & buhex,err)
2052ebaca42Sjeremylt
2062ebaca42Sjeremylt! -- QFunctions
2072ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
2082ebaca42Sjeremylt     &SOURCE_DIR&
2092ebaca42Sjeremylt     &//'t510-operator.h:setup'//char(0),qf_setuphex,err)
2102ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err)
2112ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err)
2122ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err)
2132ebaca42Sjeremylt
2142ebaca42Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
2152ebaca42Sjeremylt     &SOURCE_DIR&
2162ebaca42Sjeremylt     &//'t510-operator.h:mass'//char(0),qf_masshex,err)
2172ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err)
2182ebaca42Sjeremylt      call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err)
2192ebaca42Sjeremylt      call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err)
2202ebaca42Sjeremylt
2212ebaca42Sjeremylt! -- Operators
2222ebaca42Sjeremylt! ---- Setup Hex
2232ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,&
2242ebaca42Sjeremylt     & ceed_qfunction_none,op_setuphex,err)
2252ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,&
226a8d32208Sjeremylt     & bxhex,ceed_vector_none,err)
2272ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,&
228a8d32208Sjeremylt     & bxhex,ceed_vector_active,err)
2292ebaca42Sjeremylt      call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,&
230a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2312ebaca42Sjeremylt! ---- Mass Hex
2322ebaca42Sjeremylt      call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,&
2332ebaca42Sjeremylt     & ceed_qfunction_none,op_masshex,err)
2342ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,&
235a8d32208Sjeremylt     & ceed_basis_collocated,qdatahex,err)
2362ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,&
237a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2382ebaca42Sjeremylt      call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,&
239a8d32208Sjeremylt     & buhex,ceed_vector_active,err)
2402ebaca42Sjeremylt
2412ebaca42Sjeremylt! Composite Operators
2422ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_setup,err)
2432ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err)
2442ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err)
2452ebaca42Sjeremylt
2462ebaca42Sjeremylt      call ceedcompositeoperatorcreate(ceed,op_mass,err)
2472ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masstet,err)
2482ebaca42Sjeremylt      call ceedcompositeoperatoraddsub(op_mass,op_masshex,err)
2492ebaca42Sjeremylt
2502ebaca42Sjeremylt! View
2512ebaca42Sjeremylt      call ceedoperatorview(op_setup,err)
2522ebaca42Sjeremylt      call ceedoperatorview(op_mass,err)
2532ebaca42Sjeremylt
2542ebaca42Sjeremylt! Cleanup
2552ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuptet,err)
2562ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masstet,err)
2572ebaca42Sjeremylt      call ceedoperatordestroy(op_setuptet,err)
2582ebaca42Sjeremylt      call ceedoperatordestroy(op_masstet,err)
2592ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_setuphex,err)
2602ebaca42Sjeremylt      call ceedqfunctiondestroy(qf_masshex,err)
2612ebaca42Sjeremylt      call ceedoperatordestroy(op_setuphex,err)
2622ebaca42Sjeremylt      call ceedoperatordestroy(op_masshex,err)
2632ebaca42Sjeremylt      call ceedoperatordestroy(op_setup,err)
2642ebaca42Sjeremylt      call ceedoperatordestroy(op_mass,err)
2652ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictutet,err)
2662ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxtet,err)
2672ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuitet,err)
2682ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxitet,err)
2692ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuhex,err)
2702ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxhex,err)
2712ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictuihex,err)
2722ebaca42Sjeremylt      call ceedelemrestrictiondestroy(erestrictxihex,err)
2732ebaca42Sjeremylt      call ceedbasisdestroy(butet,err)
2742ebaca42Sjeremylt      call ceedbasisdestroy(bxtet,err)
2752ebaca42Sjeremylt      call ceedbasisdestroy(buhex,err)
2762ebaca42Sjeremylt      call ceedbasisdestroy(bxhex,err)
2772ebaca42Sjeremylt      call ceedvectordestroy(x,err)
2782ebaca42Sjeremylt      call ceedvectordestroy(qdatatet,err)
2792ebaca42Sjeremylt      call ceedvectordestroy(qdatahex,err)
2802ebaca42Sjeremylt      call ceeddestroy(ceed,err)
2812ebaca42Sjeremylt      end
2822ebaca42Sjeremylt!-----------------------------------------------------------------------
283