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