xref: /libCEED/tests/t506-operator-f.f90 (revision cae8d85a30f02658c824de00fa1168767325977c)
15b3ccac8Sjeremylt!-----------------------------------------------------------------------
25b3ccac8Sjeremylt      subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
35b3ccac8Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
45b3ccac8Sjeremylt      real*8 ctx
55b3ccac8Sjeremylt      real*8 u1(1)
65b3ccac8Sjeremylt      real*8 u2(1)
75b3ccac8Sjeremylt      real*8 v1(1)
85b3ccac8Sjeremylt      integer q,ierr
95b3ccac8Sjeremylt
105b3ccac8Sjeremylt      do i=1,q
115b3ccac8Sjeremylt        v1(i)=u1(i)*u2(i)
125b3ccac8Sjeremylt      enddo
135b3ccac8Sjeremylt
145b3ccac8Sjeremylt      ierr=0
155b3ccac8Sjeremylt      end
165b3ccac8Sjeremylt!-----------------------------------------------------------------------
175b3ccac8Sjeremylt      subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,&
185b3ccac8Sjeremylt&           u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr)
195b3ccac8Sjeremylt      real*8 ctx
205b3ccac8Sjeremylt      real*8 u1(1)
215b3ccac8Sjeremylt      real*8 u2(1)
225b3ccac8Sjeremylt      real*8 v1(1)
235b3ccac8Sjeremylt      integer q,ierr
245b3ccac8Sjeremylt
255b3ccac8Sjeremylt      do i=1,q
265b3ccac8Sjeremylt        v1(i)=u2(i)*u1(i)
275b3ccac8Sjeremylt        v1(q+i)=u2(q+i)*u1(i)
285b3ccac8Sjeremylt      enddo
295b3ccac8Sjeremylt
305b3ccac8Sjeremylt      ierr=0
315b3ccac8Sjeremylt      end
325b3ccac8Sjeremylt!-----------------------------------------------------------------------
335b3ccac8Sjeremylt      program test
345b3ccac8Sjeremylt
355b3ccac8Sjeremylt      include 'ceedf.h'
365b3ccac8Sjeremylt
375b3ccac8Sjeremylt      integer ceed,err,i,j
385b3ccac8Sjeremylt      integer imode
395b3ccac8Sjeremylt      parameter(imode=ceed_noninterlaced)
405b3ccac8Sjeremylt      integer imodeu
415b3ccac8Sjeremylt      parameter(imodeu=ceed_interlaced)
425b3ccac8Sjeremylt      integer stridesu_small(3),stridesu_large(3)
435b3ccac8Sjeremylt      integer erestrictx,erestrictu
445b3ccac8Sjeremylt      integer erestrictui_small,erestrictui_large
455b3ccac8Sjeremylt      integer bx_small,bu_small,bx_large,bu_large
465b3ccac8Sjeremylt      integer qf_setup,qf_mass
475b3ccac8Sjeremylt      integer op_setup_small,op_mass_small,op_setup_large,op_mass_large
485b3ccac8Sjeremylt      integer qdata_small,qdata_large,x,u,v
495b3ccac8Sjeremylt      integer nelem,p,q,scale
505b3ccac8Sjeremylt      parameter(nelem=15)
515b3ccac8Sjeremylt      parameter(p=5)
525b3ccac8Sjeremylt      parameter(q=8)
535b3ccac8Sjeremylt      parameter(scale=3)
545b3ccac8Sjeremylt      integer nx,nu
555b3ccac8Sjeremylt      parameter(nx=nelem+1)
565b3ccac8Sjeremylt      parameter(nu=nelem*(p-1)+1)
575b3ccac8Sjeremylt      integer indx(nelem*2)
585b3ccac8Sjeremylt      integer indu(nelem*p)
595b3ccac8Sjeremylt      real*8 arrx(nx)
605b3ccac8Sjeremylt      integer*8 voffset,xoffset
615b3ccac8Sjeremylt
625b3ccac8Sjeremylt      real*8 hu(nu*2),hv(nu*2)
635b3ccac8Sjeremylt      real*8 total1,total2
645b3ccac8Sjeremylt
655b3ccac8Sjeremylt      character arg*32
665b3ccac8Sjeremylt
675b3ccac8Sjeremylt      external setup,mass
685b3ccac8Sjeremylt
695b3ccac8Sjeremylt      call getarg(1,arg)
705b3ccac8Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
715b3ccac8Sjeremylt
725b3ccac8Sjeremylt      do i=0,nx-1
735b3ccac8Sjeremylt        arrx(i+1)=i/(nx-1.d0)
745b3ccac8Sjeremylt      enddo
755b3ccac8Sjeremylt      do i=0,nelem-1
765b3ccac8Sjeremylt        indx(2*i+1)=i
775b3ccac8Sjeremylt        indx(2*i+2)=i+1
785b3ccac8Sjeremylt      enddo
795b3ccac8Sjeremylt
805b3ccac8Sjeremylt      call ceedelemrestrictioncreate(ceed,imode,nelem,2,nx,1,ceed_mem_host,&
815b3ccac8Sjeremylt     & ceed_use_pointer,indx,erestrictx,err)
825b3ccac8Sjeremylt
835b3ccac8Sjeremylt      do i=0,nelem-1
845b3ccac8Sjeremylt        do j=0,p-1
855b3ccac8Sjeremylt          indu(p*i+j+1)=i*(p-1)+j
865b3ccac8Sjeremylt        enddo
875b3ccac8Sjeremylt      enddo
885b3ccac8Sjeremylt
895b3ccac8Sjeremylt      call ceedelemrestrictioncreate(ceed,imodeu,nelem,p,nu,2,ceed_mem_host,&
905b3ccac8Sjeremylt     & ceed_use_pointer,indu,erestrictu,err)
915b3ccac8Sjeremylt      stridesu_small=[1,q,q]
925b3ccac8Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,q,q*nelem,1,&
935b3ccac8Sjeremylt     & stridesu_small,erestrictui_small,err)
945b3ccac8Sjeremylt      stridesu_large=[1,q*scale,q*scale]
955b3ccac8Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,q*scale,q*nelem*scale,&
965b3ccac8Sjeremylt     & 1,stridesu_large,erestrictui_large,err)
975b3ccac8Sjeremylt
985b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q,ceed_gauss,bx_small,err)
995b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q,ceed_gauss,bu_small,err)
1005b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q*scale,&
1015b3ccac8Sjeremylt     & ceed_gauss,bx_large,err)
1025b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q*scale,&
1035b3ccac8Sjeremylt     & ceed_gauss,bu_large,err)
1045b3ccac8Sjeremylt
1055b3ccac8Sjeremylt! Common QFunctions
1065b3ccac8Sjeremylt
1075b3ccac8Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
1085b3ccac8Sjeremylt     &SOURCE_DIR&
1095b3ccac8Sjeremylt     &//'t502-operator.h:setup'//char(0),qf_setup,err)
1105b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_setup,'_weight',1,ceed_eval_weight,err)
1115b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_setup,'x',1,ceed_eval_grad,err)
1125b3ccac8Sjeremylt      call ceedqfunctionaddoutput(qf_setup,'rho',1,ceed_eval_none,err)
1135b3ccac8Sjeremylt
1145b3ccac8Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
1155b3ccac8Sjeremylt     &SOURCE_DIR&
1165b3ccac8Sjeremylt     &//'t502-operator.h:mass'//char(0),qf_mass,err)
1175b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_mass,'rho',1,ceed_eval_none,err)
1185b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_mass,'u',2,ceed_eval_interp,err)
1195b3ccac8Sjeremylt      call ceedqfunctionaddoutput(qf_mass,'v',2,ceed_eval_interp,err)
1205b3ccac8Sjeremylt
1215b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nx,x,err)
1225b3ccac8Sjeremylt      xoffset=0
1235b3ccac8Sjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
1245b3ccac8Sjeremylt
1255b3ccac8Sjeremylt! Small operator
1265b3ccac8Sjeremylt
1275b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,&
1285b3ccac8Sjeremylt     & ceed_qfunction_none,op_setup_small,err)
1295b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,&
1305b3ccac8Sjeremylt     & ceed_qfunction_none,op_mass_small,err)
1315b3ccac8Sjeremylt
1325b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nelem*q,qdata_small,err)
1335b3ccac8Sjeremylt
1345b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_small,'_weight',&
1355b3ccac8Sjeremylt     & ceed_elemrestriction_none,bx_small,ceed_vector_none,err)
1365b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_small,'x',erestrictx,&
1375b3ccac8Sjeremylt     & bx_small,ceed_vector_active,err)
1385b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_small,'rho',erestrictui_small,&
1395b3ccac8Sjeremylt     & ceed_basis_collocated,ceed_vector_active,err)
1405b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'rho',erestrictui_small,&
1415b3ccac8Sjeremylt     & ceed_basis_collocated,qdata_small,err)
1425b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'u',erestrictu,&
1435b3ccac8Sjeremylt     & bu_small,ceed_vector_active,err)
1445b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'v',erestrictu,&
1455b3ccac8Sjeremylt     & bu_small,ceed_vector_active,err)
1465b3ccac8Sjeremylt
1475b3ccac8Sjeremylt! Large operator
1485b3ccac8Sjeremylt
1495b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,&
1505b3ccac8Sjeremylt     & ceed_qfunction_none,op_setup_large,err)
1515b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,&
1525b3ccac8Sjeremylt     & ceed_qfunction_none,op_mass_large,err)
1535b3ccac8Sjeremylt
1545b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nelem*q*scale,qdata_large,err)
1555b3ccac8Sjeremylt
1565b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_large,'_weight',&
1575b3ccac8Sjeremylt     & ceed_elemrestriction_none,bx_large,ceed_vector_none,err)
1585b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_large,'x',erestrictx,&
1595b3ccac8Sjeremylt     & bx_large,ceed_vector_active,err)
1605b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_large,'rho',erestrictui_large,&
1615b3ccac8Sjeremylt     & ceed_basis_collocated,ceed_vector_active,err)
1625b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'rho',erestrictui_large,&
1635b3ccac8Sjeremylt     & ceed_basis_collocated,qdata_large,err)
1645b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'u',erestrictu,&
1655b3ccac8Sjeremylt     & bu_large,ceed_vector_active,err)
1665b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'v',erestrictu,&
1675b3ccac8Sjeremylt     & bu_large,ceed_vector_active,err)
1685b3ccac8Sjeremylt
1695b3ccac8Sjeremylt! Setup U, V
1705b3ccac8Sjeremylt
1715b3ccac8Sjeremylt      call ceedvectorcreate(ceed,2*nu,u,err)
1725b3ccac8Sjeremylt      call ceedvectorgetarray(u,ceed_mem_host,hu,voffset,err)
1735b3ccac8Sjeremylt      do i=1,nu
1745b3ccac8Sjeremylt        hu(voffset+2*i-1)=1.
1755b3ccac8Sjeremylt        hu(voffset+2*i)=2.
1765b3ccac8Sjeremylt      enddo
1775b3ccac8Sjeremylt      call ceedvectorrestorearray(u,hu,voffset,err)
1785b3ccac8Sjeremylt      call ceedvectorcreate(ceed,2*nu,v,err)
1795b3ccac8Sjeremylt
1805b3ccac8Sjeremylt! Small apply
1815b3ccac8Sjeremylt
1825b3ccac8Sjeremylt      call ceedoperatorapply(op_setup_small,x,qdata_small,&
1835b3ccac8Sjeremylt     & ceed_request_immediate,err)
1845b3ccac8Sjeremylt      call ceedoperatorapply(op_mass_small,u,v,ceed_request_immediate,err)
1855b3ccac8Sjeremylt
1865b3ccac8Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
1875b3ccac8Sjeremylt      total1=0.
1885b3ccac8Sjeremylt      total2=0.
1895b3ccac8Sjeremylt      do i=1,nu
1905b3ccac8Sjeremylt        total1=total1+hv(voffset+2*i-1)
1915b3ccac8Sjeremylt        total2=total2+hv(voffset+2*i)
1925b3ccac8Sjeremylt      enddo
1935b3ccac8Sjeremylt      if (abs(total1-1.)>1.0d-10) then
194*cae8d85aSjeremylt! LCOV_EXCL_START
1955b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total1,' != True Area: 1.0'
196*cae8d85aSjeremylt! LCOV_EXCL_STOP
1975b3ccac8Sjeremylt      endif
1985b3ccac8Sjeremylt      if (abs(total2-2.)>1.0d-10) then
199*cae8d85aSjeremylt! LCOV_EXCL_START
2005b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total2,' != True Area: 2.0'
201*cae8d85aSjeremylt! LCOV_EXCL_STOP
2025b3ccac8Sjeremylt      endif
2035b3ccac8Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
2045b3ccac8Sjeremylt
2055b3ccac8Sjeremylt! Large apply
2065b3ccac8Sjeremylt
2075b3ccac8Sjeremylt      call ceedoperatorapply(op_setup_large,x,qdata_large,&
2085b3ccac8Sjeremylt     & ceed_request_immediate,err)
2095b3ccac8Sjeremylt      call ceedoperatorapply(op_mass_large,u,v,ceed_request_immediate,err)
2105b3ccac8Sjeremylt
2115b3ccac8Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
2125b3ccac8Sjeremylt      total1=0.
2135b3ccac8Sjeremylt      total2=0.
2145b3ccac8Sjeremylt      do i=1,nu
2155b3ccac8Sjeremylt        total1=total1+hv(voffset+2*i-1)
2165b3ccac8Sjeremylt        total2=total2+hv(voffset+2*i)
2175b3ccac8Sjeremylt      enddo
2185b3ccac8Sjeremylt      if (abs(total1-1.)>1.0d-10) then
219*cae8d85aSjeremylt! LCOV_EXCL_START
2205b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total1,' != True Area: 1.0'
221*cae8d85aSjeremylt! LCOV_EXCL_STOP
2225b3ccac8Sjeremylt      endif
2235b3ccac8Sjeremylt      if (abs(total2-2.)>1.0d-10) then
224*cae8d85aSjeremylt! LCOV_EXCL_START
2255b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total2,' != True Area: 2.0'
226*cae8d85aSjeremylt! LCOV_EXCL_STOP
2275b3ccac8Sjeremylt      endif
2285b3ccac8Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
2295b3ccac8Sjeremylt
2305b3ccac8Sjeremylt      call ceedvectordestroy(qdata_small,err)
2315b3ccac8Sjeremylt      call ceedvectordestroy(qdata_large,err)
2325b3ccac8Sjeremylt      call ceedvectordestroy(x,err)
2335b3ccac8Sjeremylt      call ceedvectordestroy(u,err)
2345b3ccac8Sjeremylt      call ceedvectordestroy(v,err)
2355b3ccac8Sjeremylt      call ceedoperatordestroy(op_mass_small,err)
2365b3ccac8Sjeremylt      call ceedoperatordestroy(op_setup_small,err)
2375b3ccac8Sjeremylt      call ceedoperatordestroy(op_mass_large,err)
2385b3ccac8Sjeremylt      call ceedoperatordestroy(op_setup_large,err)
2395b3ccac8Sjeremylt      call ceedqfunctiondestroy(qf_mass,err)
2405b3ccac8Sjeremylt      call ceedqfunctiondestroy(qf_setup,err)
2415b3ccac8Sjeremylt      call ceedbasisdestroy(bu_small,err)
2425b3ccac8Sjeremylt      call ceedbasisdestroy(bx_small,err)
2435b3ccac8Sjeremylt      call ceedbasisdestroy(bu_large,err)
2445b3ccac8Sjeremylt      call ceedbasisdestroy(bx_large,err)
2455b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictu,err)
2465b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictx,err)
2475b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictui_small,err)
2485b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictui_large,err)
2495b3ccac8Sjeremylt      call ceeddestroy(ceed,err)
2505b3ccac8Sjeremylt      end
2515b3ccac8Sjeremylt!-----------------------------------------------------------------------
2525b3ccac8Sjeremylt
253