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 34*1f9a83abSJed Brown implicit none 355b3ccac8Sjeremylt include 'ceedf.h' 365b3ccac8Sjeremylt 375b3ccac8Sjeremylt integer ceed,err,i,j 385b3ccac8Sjeremylt integer stridesu_small(3),stridesu_large(3) 395b3ccac8Sjeremylt integer erestrictx,erestrictu 405b3ccac8Sjeremylt integer erestrictui_small,erestrictui_large 415b3ccac8Sjeremylt integer bx_small,bu_small,bx_large,bu_large 425b3ccac8Sjeremylt integer qf_setup,qf_mass 435b3ccac8Sjeremylt integer op_setup_small,op_mass_small,op_setup_large,op_mass_large 445b3ccac8Sjeremylt integer qdata_small,qdata_large,x,u,v 455b3ccac8Sjeremylt integer nelem,p,q,scale 465b3ccac8Sjeremylt parameter(nelem=15) 475b3ccac8Sjeremylt parameter(p=5) 485b3ccac8Sjeremylt parameter(q=8) 495b3ccac8Sjeremylt parameter(scale=3) 505b3ccac8Sjeremylt integer nx,nu 515b3ccac8Sjeremylt parameter(nx=nelem+1) 525b3ccac8Sjeremylt parameter(nu=nelem*(p-1)+1) 535b3ccac8Sjeremylt integer indx(nelem*2) 545b3ccac8Sjeremylt integer indu(nelem*p) 555b3ccac8Sjeremylt real*8 arrx(nx) 565b3ccac8Sjeremylt integer*8 voffset,xoffset 575b3ccac8Sjeremylt 585b3ccac8Sjeremylt real*8 hu(nu*2),hv(nu*2) 595b3ccac8Sjeremylt real*8 total1,total2 605b3ccac8Sjeremylt 615b3ccac8Sjeremylt character arg*32 625b3ccac8Sjeremylt 635b3ccac8Sjeremylt external setup,mass 645b3ccac8Sjeremylt 655b3ccac8Sjeremylt call getarg(1,arg) 665b3ccac8Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 675b3ccac8Sjeremylt 685b3ccac8Sjeremylt do i=0,nx-1 695b3ccac8Sjeremylt arrx(i+1)=i/(nx-1.d0) 705b3ccac8Sjeremylt enddo 715b3ccac8Sjeremylt do i=0,nelem-1 725b3ccac8Sjeremylt indx(2*i+1)=i 735b3ccac8Sjeremylt indx(2*i+2)=i+1 745b3ccac8Sjeremylt enddo 755b3ccac8Sjeremylt 76d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelem,2,1,1,nx,ceed_mem_host,& 775b3ccac8Sjeremylt & ceed_use_pointer,indx,erestrictx,err) 785b3ccac8Sjeremylt 795b3ccac8Sjeremylt do i=0,nelem-1 805b3ccac8Sjeremylt do j=0,p-1 81d979a051Sjeremylt indu(p*i+j+1)=2*(i*(p-1)+j) 825b3ccac8Sjeremylt enddo 835b3ccac8Sjeremylt enddo 845b3ccac8Sjeremylt 85d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelem,p,2,1,2*nu,ceed_mem_host,& 865b3ccac8Sjeremylt & ceed_use_pointer,indu,erestrictu,err) 875b3ccac8Sjeremylt stridesu_small=[1,q,q] 88d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,q,1,q*nelem,& 895b3ccac8Sjeremylt & stridesu_small,erestrictui_small,err) 905b3ccac8Sjeremylt stridesu_large=[1,q*scale,q*scale] 91d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,q*scale,1,& 92d979a051Sjeremylt & q*nelem*scale,stridesu_large,erestrictui_large,err) 935b3ccac8Sjeremylt 945b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q,ceed_gauss,bx_small,err) 955b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q,ceed_gauss,bu_small,err) 965b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q*scale,& 975b3ccac8Sjeremylt & ceed_gauss,bx_large,err) 985b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q*scale,& 995b3ccac8Sjeremylt & ceed_gauss,bu_large,err) 1005b3ccac8Sjeremylt 1015b3ccac8Sjeremylt! Common QFunctions 1025b3ccac8Sjeremylt 1035b3ccac8Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 1045b3ccac8Sjeremylt &SOURCE_DIR& 1055b3ccac8Sjeremylt &//'t502-operator.h:setup'//char(0),qf_setup,err) 1065b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_setup,'_weight',1,ceed_eval_weight,err) 1075b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_setup,'x',1,ceed_eval_grad,err) 1085b3ccac8Sjeremylt call ceedqfunctionaddoutput(qf_setup,'rho',1,ceed_eval_none,err) 1095b3ccac8Sjeremylt 1105b3ccac8Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 1115b3ccac8Sjeremylt &SOURCE_DIR& 1125b3ccac8Sjeremylt &//'t502-operator.h:mass'//char(0),qf_mass,err) 1135b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_mass,'rho',1,ceed_eval_none,err) 1145b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_mass,'u',2,ceed_eval_interp,err) 1155b3ccac8Sjeremylt call ceedqfunctionaddoutput(qf_mass,'v',2,ceed_eval_interp,err) 1165b3ccac8Sjeremylt 1175b3ccac8Sjeremylt call ceedvectorcreate(ceed,nx,x,err) 1185b3ccac8Sjeremylt xoffset=0 1195b3ccac8Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 1205b3ccac8Sjeremylt 1215b3ccac8Sjeremylt! Small operator 1225b3ccac8Sjeremylt 1235b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,& 1245b3ccac8Sjeremylt & ceed_qfunction_none,op_setup_small,err) 1255b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,& 1265b3ccac8Sjeremylt & ceed_qfunction_none,op_mass_small,err) 1275b3ccac8Sjeremylt 1285b3ccac8Sjeremylt call ceedvectorcreate(ceed,nelem*q,qdata_small,err) 1295b3ccac8Sjeremylt 1305b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'_weight',& 1315b3ccac8Sjeremylt & ceed_elemrestriction_none,bx_small,ceed_vector_none,err) 1325b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'x',erestrictx,& 1335b3ccac8Sjeremylt & bx_small,ceed_vector_active,err) 1345b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'rho',erestrictui_small,& 1355b3ccac8Sjeremylt & ceed_basis_collocated,ceed_vector_active,err) 1365b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'rho',erestrictui_small,& 1375b3ccac8Sjeremylt & ceed_basis_collocated,qdata_small,err) 1385b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'u',erestrictu,& 1395b3ccac8Sjeremylt & bu_small,ceed_vector_active,err) 1405b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'v',erestrictu,& 1415b3ccac8Sjeremylt & bu_small,ceed_vector_active,err) 1425b3ccac8Sjeremylt 1435b3ccac8Sjeremylt! Large operator 1445b3ccac8Sjeremylt 1455b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,& 1465b3ccac8Sjeremylt & ceed_qfunction_none,op_setup_large,err) 1475b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,& 1485b3ccac8Sjeremylt & ceed_qfunction_none,op_mass_large,err) 1495b3ccac8Sjeremylt 1505b3ccac8Sjeremylt call ceedvectorcreate(ceed,nelem*q*scale,qdata_large,err) 1515b3ccac8Sjeremylt 1525b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'_weight',& 1535b3ccac8Sjeremylt & ceed_elemrestriction_none,bx_large,ceed_vector_none,err) 1545b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'x',erestrictx,& 1555b3ccac8Sjeremylt & bx_large,ceed_vector_active,err) 1565b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'rho',erestrictui_large,& 1575b3ccac8Sjeremylt & ceed_basis_collocated,ceed_vector_active,err) 1585b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'rho',erestrictui_large,& 1595b3ccac8Sjeremylt & ceed_basis_collocated,qdata_large,err) 1605b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'u',erestrictu,& 1615b3ccac8Sjeremylt & bu_large,ceed_vector_active,err) 1625b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'v',erestrictu,& 1635b3ccac8Sjeremylt & bu_large,ceed_vector_active,err) 1645b3ccac8Sjeremylt 1655b3ccac8Sjeremylt! Setup U, V 1665b3ccac8Sjeremylt 1675b3ccac8Sjeremylt call ceedvectorcreate(ceed,2*nu,u,err) 1685b3ccac8Sjeremylt call ceedvectorgetarray(u,ceed_mem_host,hu,voffset,err) 1695b3ccac8Sjeremylt do i=1,nu 1705b3ccac8Sjeremylt hu(voffset+2*i-1)=1. 1715b3ccac8Sjeremylt hu(voffset+2*i)=2. 1725b3ccac8Sjeremylt enddo 1735b3ccac8Sjeremylt call ceedvectorrestorearray(u,hu,voffset,err) 1745b3ccac8Sjeremylt call ceedvectorcreate(ceed,2*nu,v,err) 1755b3ccac8Sjeremylt 1765b3ccac8Sjeremylt! Small apply 1775b3ccac8Sjeremylt 1785b3ccac8Sjeremylt call ceedoperatorapply(op_setup_small,x,qdata_small,& 1795b3ccac8Sjeremylt & ceed_request_immediate,err) 1805b3ccac8Sjeremylt call ceedoperatorapply(op_mass_small,u,v,ceed_request_immediate,err) 1815b3ccac8Sjeremylt 1825b3ccac8Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 1835b3ccac8Sjeremylt total1=0. 1845b3ccac8Sjeremylt total2=0. 1855b3ccac8Sjeremylt do i=1,nu 1865b3ccac8Sjeremylt total1=total1+hv(voffset+2*i-1) 1875b3ccac8Sjeremylt total2=total2+hv(voffset+2*i) 1885b3ccac8Sjeremylt enddo 1895b3ccac8Sjeremylt if (abs(total1-1.)>1.0d-10) then 190cae8d85aSjeremylt! LCOV_EXCL_START 1915b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total1,' != True Area: 1.0' 192cae8d85aSjeremylt! LCOV_EXCL_STOP 1935b3ccac8Sjeremylt endif 1945b3ccac8Sjeremylt if (abs(total2-2.)>1.0d-10) then 195cae8d85aSjeremylt! LCOV_EXCL_START 1965b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total2,' != True Area: 2.0' 197cae8d85aSjeremylt! LCOV_EXCL_STOP 1985b3ccac8Sjeremylt endif 1995b3ccac8Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 2005b3ccac8Sjeremylt 2015b3ccac8Sjeremylt! Large apply 2025b3ccac8Sjeremylt 2035b3ccac8Sjeremylt call ceedoperatorapply(op_setup_large,x,qdata_large,& 2045b3ccac8Sjeremylt & ceed_request_immediate,err) 2055b3ccac8Sjeremylt call ceedoperatorapply(op_mass_large,u,v,ceed_request_immediate,err) 2065b3ccac8Sjeremylt 2075b3ccac8Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 2085b3ccac8Sjeremylt total1=0. 2095b3ccac8Sjeremylt total2=0. 2105b3ccac8Sjeremylt do i=1,nu 2115b3ccac8Sjeremylt total1=total1+hv(voffset+2*i-1) 2125b3ccac8Sjeremylt total2=total2+hv(voffset+2*i) 2135b3ccac8Sjeremylt enddo 2145b3ccac8Sjeremylt if (abs(total1-1.)>1.0d-10) then 215cae8d85aSjeremylt! LCOV_EXCL_START 2165b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total1,' != True Area: 1.0' 217cae8d85aSjeremylt! LCOV_EXCL_STOP 2185b3ccac8Sjeremylt endif 2195b3ccac8Sjeremylt if (abs(total2-2.)>1.0d-10) then 220cae8d85aSjeremylt! LCOV_EXCL_START 2215b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total2,' != True Area: 2.0' 222cae8d85aSjeremylt! LCOV_EXCL_STOP 2235b3ccac8Sjeremylt endif 2245b3ccac8Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 2255b3ccac8Sjeremylt 2265b3ccac8Sjeremylt call ceedvectordestroy(qdata_small,err) 2275b3ccac8Sjeremylt call ceedvectordestroy(qdata_large,err) 2285b3ccac8Sjeremylt call ceedvectordestroy(x,err) 2295b3ccac8Sjeremylt call ceedvectordestroy(u,err) 2305b3ccac8Sjeremylt call ceedvectordestroy(v,err) 2315b3ccac8Sjeremylt call ceedoperatordestroy(op_mass_small,err) 2325b3ccac8Sjeremylt call ceedoperatordestroy(op_setup_small,err) 2335b3ccac8Sjeremylt call ceedoperatordestroy(op_mass_large,err) 2345b3ccac8Sjeremylt call ceedoperatordestroy(op_setup_large,err) 2355b3ccac8Sjeremylt call ceedqfunctiondestroy(qf_mass,err) 2365b3ccac8Sjeremylt call ceedqfunctiondestroy(qf_setup,err) 2375b3ccac8Sjeremylt call ceedbasisdestroy(bu_small,err) 2385b3ccac8Sjeremylt call ceedbasisdestroy(bx_small,err) 2395b3ccac8Sjeremylt call ceedbasisdestroy(bu_large,err) 2405b3ccac8Sjeremylt call ceedbasisdestroy(bx_large,err) 2415b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictu,err) 2425b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictx,err) 2435b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictui_small,err) 2445b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictui_large,err) 2455b3ccac8Sjeremylt call ceeddestroy(ceed,err) 2465b3ccac8Sjeremylt end 2475b3ccac8Sjeremylt!----------------------------------------------------------------------- 2485b3ccac8Sjeremylt 249