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