xref: /libCEED/tests/t506-operator-f.f90 (revision d9b786505a4dfcb66b2fcd9e3b61dd507168515d)
15b3ccac8Sjeremylt!-----------------------------------------------------------------------
2752c3701SJeremy L Thompson!
3752c3701SJeremy L Thompson! Header with QFunctions
4752c3701SJeremy L Thompson!
5752c3701SJeremy L Thompson      include 't502-operator-f.h'
65b3ccac8Sjeremylt!-----------------------------------------------------------------------
75b3ccac8Sjeremylt      program test
81f9a83abSJed Brown      implicit none
9ec3da8bcSJed Brown      include 'ceed/fortran.h'
105b3ccac8Sjeremylt
115b3ccac8Sjeremylt      integer ceed,err,i,j
125b3ccac8Sjeremylt      integer stridesu_small(3),stridesu_large(3)
135b3ccac8Sjeremylt      integer erestrictx,erestrictu
145b3ccac8Sjeremylt      integer erestrictui_small,erestrictui_large
155b3ccac8Sjeremylt      integer bx_small,bu_small,bx_large,bu_large
165b3ccac8Sjeremylt      integer qf_setup,qf_mass
175b3ccac8Sjeremylt      integer op_setup_small,op_mass_small,op_setup_large,op_mass_large
185b3ccac8Sjeremylt      integer qdata_small,qdata_large,x,u,v
195b3ccac8Sjeremylt      integer nelem,p,q,scale
205b3ccac8Sjeremylt      parameter(nelem=15)
215b3ccac8Sjeremylt      parameter(p=5)
225b3ccac8Sjeremylt      parameter(q=8)
235b3ccac8Sjeremylt      parameter(scale=3)
245b3ccac8Sjeremylt      integer nx,nu
255b3ccac8Sjeremylt      parameter(nx=nelem+1)
265b3ccac8Sjeremylt      parameter(nu=nelem*(p-1)+1)
275b3ccac8Sjeremylt      integer indx(nelem*2)
285b3ccac8Sjeremylt      integer indu(nelem*p)
295b3ccac8Sjeremylt      real*8 arrx(nx)
305b3ccac8Sjeremylt      integer*8 voffset,xoffset
315b3ccac8Sjeremylt
325b3ccac8Sjeremylt      real*8 hu(nu*2),hv(nu*2)
335b3ccac8Sjeremylt      real*8 total1,total2
345b3ccac8Sjeremylt
355b3ccac8Sjeremylt      character arg*32
365b3ccac8Sjeremylt
375b3ccac8Sjeremylt      external setup,mass
385b3ccac8Sjeremylt
395b3ccac8Sjeremylt      call getarg(1,arg)
405b3ccac8Sjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
415b3ccac8Sjeremylt
425b3ccac8Sjeremylt      do i=0,nx-1
435b3ccac8Sjeremylt        arrx(i+1)=i/(nx-1.d0)
445b3ccac8Sjeremylt      enddo
455b3ccac8Sjeremylt      do i=0,nelem-1
465b3ccac8Sjeremylt        indx(2*i+1)=i
475b3ccac8Sjeremylt        indx(2*i+2)=i+1
485b3ccac8Sjeremylt      enddo
495b3ccac8Sjeremylt
50d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelem,2,1,1,nx,ceed_mem_host,&
515b3ccac8Sjeremylt     & ceed_use_pointer,indx,erestrictx,err)
525b3ccac8Sjeremylt
535b3ccac8Sjeremylt      do i=0,nelem-1
545b3ccac8Sjeremylt        do j=0,p-1
55d979a051Sjeremylt          indu(p*i+j+1)=2*(i*(p-1)+j)
565b3ccac8Sjeremylt        enddo
575b3ccac8Sjeremylt      enddo
585b3ccac8Sjeremylt
59d979a051Sjeremylt      call ceedelemrestrictioncreate(ceed,nelem,p,2,1,2*nu,ceed_mem_host,&
605b3ccac8Sjeremylt     & ceed_use_pointer,indu,erestrictu,err)
615b3ccac8Sjeremylt      stridesu_small=[1,q,q]
62d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,q,1,q*nelem,&
635b3ccac8Sjeremylt     & stridesu_small,erestrictui_small,err)
645b3ccac8Sjeremylt      stridesu_large=[1,q*scale,q*scale]
65d979a051Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,q*scale,1,&
66d979a051Sjeremylt     & q*nelem*scale,stridesu_large,erestrictui_large,err)
675b3ccac8Sjeremylt
685b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q,ceed_gauss,bx_small,err)
695b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q,ceed_gauss,bu_small,err)
705b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q*scale,&
715b3ccac8Sjeremylt     & ceed_gauss,bx_large,err)
725b3ccac8Sjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q*scale,&
735b3ccac8Sjeremylt     & ceed_gauss,bu_large,err)
745b3ccac8Sjeremylt
755b3ccac8Sjeremylt! Common QFunctions
765b3ccac8Sjeremylt
775b3ccac8Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup,&
785b3ccac8Sjeremylt     &SOURCE_DIR&
795b3ccac8Sjeremylt     &//'t502-operator.h:setup'//char(0),qf_setup,err)
80a61c78d6SJeremy L Thompson      call ceedqfunctionaddinput(qf_setup,'weight',1,ceed_eval_weight,err)
815b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_setup,'x',1,ceed_eval_grad,err)
825b3ccac8Sjeremylt      call ceedqfunctionaddoutput(qf_setup,'rho',1,ceed_eval_none,err)
835b3ccac8Sjeremylt
845b3ccac8Sjeremylt      call ceedqfunctioncreateinterior(ceed,1,mass,&
855b3ccac8Sjeremylt     &SOURCE_DIR&
865b3ccac8Sjeremylt     &//'t502-operator.h:mass'//char(0),qf_mass,err)
875b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_mass,'rho',1,ceed_eval_none,err)
885b3ccac8Sjeremylt      call ceedqfunctionaddinput(qf_mass,'u',2,ceed_eval_interp,err)
895b3ccac8Sjeremylt      call ceedqfunctionaddoutput(qf_mass,'v',2,ceed_eval_interp,err)
905b3ccac8Sjeremylt
915b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nx,x,err)
925b3ccac8Sjeremylt      xoffset=0
935b3ccac8Sjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
945b3ccac8Sjeremylt
955b3ccac8Sjeremylt! Small operator
965b3ccac8Sjeremylt
975b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,&
985b3ccac8Sjeremylt     & ceed_qfunction_none,op_setup_small,err)
995b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,&
1005b3ccac8Sjeremylt     & ceed_qfunction_none,op_mass_small,err)
1015b3ccac8Sjeremylt
1025b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nelem*q,qdata_small,err)
1035b3ccac8Sjeremylt
104a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setup_small,'weight',&
1055b3ccac8Sjeremylt     & ceed_elemrestriction_none,bx_small,ceed_vector_none,err)
1065b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_small,'x',erestrictx,&
1075b3ccac8Sjeremylt     & bx_small,ceed_vector_active,err)
1085b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_small,'rho',erestrictui_small,&
109*356036faSJeremy L Thompson     ceed_basis_none,ceed_vector_active,err)
1105b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'rho',erestrictui_small,&
111*356036faSJeremy L Thompson     ceed_basis_none,qdata_small,err)
1125b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'u',erestrictu,&
1135b3ccac8Sjeremylt     & bu_small,ceed_vector_active,err)
1145b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_small,'v',erestrictu,&
1155b3ccac8Sjeremylt     & bu_small,ceed_vector_active,err)
1165b3ccac8Sjeremylt
1175b3ccac8Sjeremylt! Large operator
1185b3ccac8Sjeremylt
1195b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,&
1205b3ccac8Sjeremylt     & ceed_qfunction_none,op_setup_large,err)
1215b3ccac8Sjeremylt      call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,&
1225b3ccac8Sjeremylt     & ceed_qfunction_none,op_mass_large,err)
1235b3ccac8Sjeremylt
1245b3ccac8Sjeremylt      call ceedvectorcreate(ceed,nelem*q*scale,qdata_large,err)
1255b3ccac8Sjeremylt
126a61c78d6SJeremy L Thompson      call ceedoperatorsetfield(op_setup_large,'weight',&
1275b3ccac8Sjeremylt     & ceed_elemrestriction_none,bx_large,ceed_vector_none,err)
1285b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_large,'x',erestrictx,&
1295b3ccac8Sjeremylt     & bx_large,ceed_vector_active,err)
1305b3ccac8Sjeremylt      call ceedoperatorsetfield(op_setup_large,'rho',erestrictui_large,&
131*356036faSJeremy L Thompson     ceed_basis_none,ceed_vector_active,err)
1325b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'rho',erestrictui_large,&
133*356036faSJeremy L Thompson     ceed_basis_none,qdata_large,err)
1345b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'u',erestrictu,&
1355b3ccac8Sjeremylt     & bu_large,ceed_vector_active,err)
1365b3ccac8Sjeremylt      call ceedoperatorsetfield(op_mass_large,'v',erestrictu,&
1375b3ccac8Sjeremylt     & bu_large,ceed_vector_active,err)
1385b3ccac8Sjeremylt
1395b3ccac8Sjeremylt! Setup U, V
1405b3ccac8Sjeremylt
1415b3ccac8Sjeremylt      call ceedvectorcreate(ceed,2*nu,u,err)
1429c774eddSJeremy L Thompson      call ceedvectorgetarraywrite(u,ceed_mem_host,hu,voffset,err)
1435b3ccac8Sjeremylt      do i=1,nu
1445b3ccac8Sjeremylt        hu(voffset+2*i-1)=1.
1455b3ccac8Sjeremylt        hu(voffset+2*i)=2.
1465b3ccac8Sjeremylt      enddo
1475b3ccac8Sjeremylt      call ceedvectorrestorearray(u,hu,voffset,err)
1485b3ccac8Sjeremylt      call ceedvectorcreate(ceed,2*nu,v,err)
1495b3ccac8Sjeremylt
1505b3ccac8Sjeremylt! Small apply
1515b3ccac8Sjeremylt
1525b3ccac8Sjeremylt      call ceedoperatorapply(op_setup_small,x,qdata_small,&
1535b3ccac8Sjeremylt     & ceed_request_immediate,err)
1545b3ccac8Sjeremylt      call ceedoperatorapply(op_mass_small,u,v,ceed_request_immediate,err)
1555b3ccac8Sjeremylt
1565b3ccac8Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
1575b3ccac8Sjeremylt      total1=0.
1585b3ccac8Sjeremylt      total2=0.
1595b3ccac8Sjeremylt      do i=1,nu
1605b3ccac8Sjeremylt        total1=total1+hv(voffset+2*i-1)
1615b3ccac8Sjeremylt        total2=total2+hv(voffset+2*i)
1625b3ccac8Sjeremylt      enddo
1635b3ccac8Sjeremylt      if (abs(total1-1.)>1.0d-10) then
164cae8d85aSjeremylt! LCOV_EXCL_START
1655b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total1,' != True Area: 1.0'
166cae8d85aSjeremylt! LCOV_EXCL_STOP
1675b3ccac8Sjeremylt      endif
1685b3ccac8Sjeremylt      if (abs(total2-2.)>1.0d-10) then
169cae8d85aSjeremylt! LCOV_EXCL_START
1705b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total2,' != True Area: 2.0'
171cae8d85aSjeremylt! LCOV_EXCL_STOP
1725b3ccac8Sjeremylt      endif
1735b3ccac8Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
1745b3ccac8Sjeremylt
1755b3ccac8Sjeremylt! Large apply
1765b3ccac8Sjeremylt
1775b3ccac8Sjeremylt      call ceedoperatorapply(op_setup_large,x,qdata_large,&
1785b3ccac8Sjeremylt     & ceed_request_immediate,err)
1795b3ccac8Sjeremylt      call ceedoperatorapply(op_mass_large,u,v,ceed_request_immediate,err)
1805b3ccac8Sjeremylt
1815b3ccac8Sjeremylt      call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err)
1825b3ccac8Sjeremylt      total1=0.
1835b3ccac8Sjeremylt      total2=0.
1845b3ccac8Sjeremylt      do i=1,nu
1855b3ccac8Sjeremylt        total1=total1+hv(voffset+2*i-1)
1865b3ccac8Sjeremylt        total2=total2+hv(voffset+2*i)
1875b3ccac8Sjeremylt      enddo
1885b3ccac8Sjeremylt      if (abs(total1-1.)>1.0d-10) then
189cae8d85aSjeremylt! LCOV_EXCL_START
1905b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total1,' != True Area: 1.0'
191cae8d85aSjeremylt! LCOV_EXCL_STOP
1925b3ccac8Sjeremylt      endif
1935b3ccac8Sjeremylt      if (abs(total2-2.)>1.0d-10) then
194cae8d85aSjeremylt! LCOV_EXCL_START
1955b3ccac8Sjeremylt        write(*,*) 'Computed Area: ',total2,' != True Area: 2.0'
196cae8d85aSjeremylt! LCOV_EXCL_STOP
1975b3ccac8Sjeremylt      endif
1985b3ccac8Sjeremylt      call ceedvectorrestorearrayread(v,hv,voffset,err)
1995b3ccac8Sjeremylt
2005b3ccac8Sjeremylt      call ceedvectordestroy(qdata_small,err)
2015b3ccac8Sjeremylt      call ceedvectordestroy(qdata_large,err)
2025b3ccac8Sjeremylt      call ceedvectordestroy(x,err)
2035b3ccac8Sjeremylt      call ceedvectordestroy(u,err)
2045b3ccac8Sjeremylt      call ceedvectordestroy(v,err)
2055b3ccac8Sjeremylt      call ceedoperatordestroy(op_mass_small,err)
2065b3ccac8Sjeremylt      call ceedoperatordestroy(op_setup_small,err)
2075b3ccac8Sjeremylt      call ceedoperatordestroy(op_mass_large,err)
2085b3ccac8Sjeremylt      call ceedoperatordestroy(op_setup_large,err)
2095b3ccac8Sjeremylt      call ceedqfunctiondestroy(qf_mass,err)
2105b3ccac8Sjeremylt      call ceedqfunctiondestroy(qf_setup,err)
2115b3ccac8Sjeremylt      call ceedbasisdestroy(bu_small,err)
2125b3ccac8Sjeremylt      call ceedbasisdestroy(bx_small,err)
2135b3ccac8Sjeremylt      call ceedbasisdestroy(bu_large,err)
2145b3ccac8Sjeremylt      call ceedbasisdestroy(bx_large,err)
2155b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictu,err)
2165b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictx,err)
2175b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictui_small,err)
2185b3ccac8Sjeremylt      call ceedelemrestrictiondestroy(erestrictui_large,err)
2195b3ccac8Sjeremylt      call ceeddestroy(ceed,err)
2205b3ccac8Sjeremylt      end
2215b3ccac8Sjeremylt!-----------------------------------------------------------------------
2225b3ccac8Sjeremylt
223