12ebaca42Sjeremylt!----------------------------------------------------------------------- 22ebaca42Sjeremylt! 32ebaca42Sjeremylt! Header with common subroutine 42ebaca42Sjeremylt! 52ebaca42Sjeremylt include 't320-basis-f.h' 6752c3701SJeremy L Thompson! 7752c3701SJeremy L Thompson! Header with QFunctions 8752c3701SJeremy L Thompson! 9752c3701SJeremy L Thompson include 't510-operator-f.h' 102ebaca42Sjeremylt!----------------------------------------------------------------------- 112ebaca42Sjeremylt program test 121f9a83abSJed Brown implicit none 13ec3da8bcSJed Brown include 'ceed/fortran.h' 142ebaca42Sjeremylt 152ebaca42Sjeremylt integer ceed,err,i,j,k 1615910d16Sjeremylt integer stridesutet(3),stridesuhex(3) 1715910d16Sjeremylt integer erestrictxtet,erestrictutet,erestrictuitet,& 1815910d16Sjeremylt& erestrictxhex,erestrictuhex,erestrictuihex 192ebaca42Sjeremylt integer bxtet,butet,bxhex,buhex 202ebaca42Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 212ebaca42Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 222ebaca42Sjeremylt integer qdatatet,qdatahex,x 232ebaca42Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 242ebaca42Sjeremylt integer row,col,offset 252ebaca42Sjeremylt parameter(nelemtet=6) 262ebaca42Sjeremylt parameter(ptet=6) 272ebaca42Sjeremylt parameter(qtet=4) 282ebaca42Sjeremylt parameter(nelemhex=6) 292ebaca42Sjeremylt parameter(phex=3) 302ebaca42Sjeremylt parameter(qhex=4) 312ebaca42Sjeremylt parameter(d=2) 322ebaca42Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 332ebaca42Sjeremylt parameter(nx=3) 342ebaca42Sjeremylt parameter(ny=3) 352ebaca42Sjeremylt parameter(nxtet=3) 362ebaca42Sjeremylt parameter(nytet=1) 372ebaca42Sjeremylt parameter(nxhex=3) 382ebaca42Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 392ebaca42Sjeremylt parameter(nqptstet=nelemtet*qtet) 402ebaca42Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 412ebaca42Sjeremylt parameter(nqpts=nqptstet+nqptshex) 422ebaca42Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 432ebaca42Sjeremylt 442ebaca42Sjeremylt real*8 qref(d*qtet) 452ebaca42Sjeremylt real*8 qweight(qtet) 462ebaca42Sjeremylt real*8 interp(ptet*qtet) 472ebaca42Sjeremylt real*8 grad(d*ptet*qtet) 482ebaca42Sjeremylt 492ebaca42Sjeremylt character arg*32 502ebaca42Sjeremylt 51f1a4e9feSjeremylt! LCOV_EXCL_START 522ebaca42Sjeremylt external setup,mass 53f1a4e9feSjeremylt! LCOV_EXCL_STOP 542ebaca42Sjeremylt 552ebaca42Sjeremylt call getarg(1,arg) 562ebaca42Sjeremylt 572ebaca42Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 582ebaca42Sjeremylt 592ebaca42Sjeremylt! DoF Coordinates 602ebaca42Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 612ebaca42Sjeremylt 622ebaca42Sjeremylt! Qdata Vectors 632ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 642ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 652ebaca42Sjeremylt 662ebaca42Sjeremylt! Tet Elements 672ebaca42Sjeremylt do i=0,2 682ebaca42Sjeremylt col=mod(i,nx) 692ebaca42Sjeremylt row=i/nx 702ebaca42Sjeremylt offset=col*2+row*(nx*2+1)*2 712ebaca42Sjeremylt 722ebaca42Sjeremylt indxtet(i*2*ptet+1)=2+offset 732ebaca42Sjeremylt indxtet(i*2*ptet+2)=9+offset 742ebaca42Sjeremylt indxtet(i*2*ptet+3)=16+offset 752ebaca42Sjeremylt indxtet(i*2*ptet+4)=1+offset 762ebaca42Sjeremylt indxtet(i*2*ptet+5)=8+offset 772ebaca42Sjeremylt indxtet(i*2*ptet+6)=0+offset 782ebaca42Sjeremylt 792ebaca42Sjeremylt indxtet(i*2*ptet+7)=14+offset 802ebaca42Sjeremylt indxtet(i*2*ptet+8)=7+offset 812ebaca42Sjeremylt indxtet(i*2*ptet+9)=0+offset 822ebaca42Sjeremylt indxtet(i*2*ptet+10)=15+offset 832ebaca42Sjeremylt indxtet(i*2*ptet+11)=8+offset 842ebaca42Sjeremylt indxtet(i*2*ptet+12)=16+offset 852ebaca42Sjeremylt enddo 862ebaca42Sjeremylt 872ebaca42Sjeremylt! -- Restrictions 88d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,& 89a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 902ebaca42Sjeremylt 91d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,& 92a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 937509a596Sjeremylt stridesutet=[1,qtet,qtet] 94d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,& 95d979a051Sjeremylt & stridesutet,erestrictuitet,err) 962ebaca42Sjeremylt 972ebaca42Sjeremylt! -- Bases 982ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 992ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 1002ebaca42Sjeremylt & qweight,bxtet,err) 1012ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 1022ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 1032ebaca42Sjeremylt & qweight,butet,err) 1042ebaca42Sjeremylt 1052ebaca42Sjeremylt! -- QFunctions 1062ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 1072ebaca42Sjeremylt &SOURCE_DIR& 108872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 109a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err) 1102ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 1112ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 1122ebaca42Sjeremylt 1132ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 1142ebaca42Sjeremylt &SOURCE_DIR& 115872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 1162ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 1172ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 1182ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 1192ebaca42Sjeremylt 1202ebaca42Sjeremylt! -- Operators 1212ebaca42Sjeremylt! ---- Setup Tet 1222ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 1232ebaca42Sjeremylt & ceed_qfunction_none,op_setuptet,err) 124ea6b5821SJeremy L Thompson call ceedoperatorsetname(op_setuptet,'triangle elements',err) 125a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_setuptet,'weight',& 12615910d16Sjeremylt & ceed_elemrestriction_none,bxtet,ceed_vector_none,err) 1272ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 128a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 1292ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 130356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 1312ebaca42Sjeremylt! ---- Mass Tet 1322ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 1332ebaca42Sjeremylt & ceed_qfunction_none,op_masstet,err) 134ea6b5821SJeremy L Thompson call ceedoperatorsetname(op_masstet,'triangle elements',err) 1352ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 136356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 1372ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 138a8d32208Sjeremylt & butet,ceed_vector_active,err) 1392ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 140a8d32208Sjeremylt & butet,ceed_vector_active,err) 1412ebaca42Sjeremylt 1422ebaca42Sjeremylt! Hex Elements 1432ebaca42Sjeremylt do i=0,nelemhex-1 1442ebaca42Sjeremylt col=mod(i,nx) 1452ebaca42Sjeremylt row=i/nx 1462ebaca42Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 1472ebaca42Sjeremylt do j=0,phex-1 1482ebaca42Sjeremylt do k=0,phex-1 1492ebaca42Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 1502ebaca42Sjeremylt enddo 1512ebaca42Sjeremylt enddo 1522ebaca42Sjeremylt enddo 1532ebaca42Sjeremylt 1542ebaca42Sjeremylt! -- Restrictions 155d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,& 1562ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 1572ebaca42Sjeremylt 158d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,& 1592ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 1607509a596Sjeremylt stridesuhex=[1,qhex*qhex,qhex*qhex] 1617509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 162d979a051Sjeremylt & 1,nqptshex,stridesuhex,erestrictuihex,err) 1632ebaca42Sjeremylt 1642ebaca42Sjeremylt! -- Bases 1652ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 1662ebaca42Sjeremylt & bxhex,err) 1672ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 1682ebaca42Sjeremylt & buhex,err) 1692ebaca42Sjeremylt 1702ebaca42Sjeremylt! -- QFunctions 1712ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 1722ebaca42Sjeremylt &SOURCE_DIR& 1732ebaca42Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 174a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_setuphex,'weight',1,ceed_eval_weight,err) 1752ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 1762ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 1772ebaca42Sjeremylt 1782ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 1792ebaca42Sjeremylt &SOURCE_DIR& 1802ebaca42Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 1812ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 1822ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 1832ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 1842ebaca42Sjeremylt 1852ebaca42Sjeremylt! -- Operators 1862ebaca42Sjeremylt! ---- Setup Hex 1872ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 1882ebaca42Sjeremylt & ceed_qfunction_none,op_setuphex,err) 1894fee36f0SJeremy L Thompson call ceedoperatorsetname(op_setuphex,'quadrilateral elements',err) 190a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_setuphex,'weight',& 19115910d16Sjeremylt & ceed_elemrestriction_none,bxhex,ceed_vector_none,err) 1922ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 193a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 1942ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 195356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 1962ebaca42Sjeremylt! ---- Mass Hex 1972ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 1982ebaca42Sjeremylt & ceed_qfunction_none,op_masshex,err) 1994fee36f0SJeremy L Thompson call ceedoperatorsetname(op_masshex,'quadrilateral elements',err) 2002ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 201356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 2022ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 203a8d32208Sjeremylt & buhex,ceed_vector_active,err) 2042ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 205a8d32208Sjeremylt & buhex,ceed_vector_active,err) 2062ebaca42Sjeremylt 2072ebaca42Sjeremylt! Composite Operators 208ed094490SJeremy L Thompson call ceedoperatorcreatecomposite(ceed,op_setup,err) 209ea6b5821SJeremy L Thompson call ceedoperatorsetname(op_setup,'setup',err) 210ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_setup,op_setuptet,err) 211ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_setup,op_setuphex,err) 2122ebaca42Sjeremylt 213ed094490SJeremy L Thompson call ceedoperatorcreatecomposite(ceed,op_mass,err) 214ea6b5821SJeremy L Thompson call ceedoperatorsetname(op_mass,'mass',err) 215*5a526491SJeremy L Thompson call ceedoperatorsetnumviewtabs(op_mass,1,err) 216ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_mass,op_masstet,err) 217ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_mass,op_masshex,err) 2182ebaca42Sjeremylt 2192ebaca42Sjeremylt! View 2202ebaca42Sjeremylt call ceedoperatorview(op_setup,err) 2212ebaca42Sjeremylt call ceedoperatorview(op_mass,err) 2222ebaca42Sjeremylt 2232ebaca42Sjeremylt! Cleanup 2242ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 2252ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 2262ebaca42Sjeremylt call ceedoperatordestroy(op_setuptet,err) 2272ebaca42Sjeremylt call ceedoperatordestroy(op_masstet,err) 2282ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 2292ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 2302ebaca42Sjeremylt call ceedoperatordestroy(op_setuphex,err) 2312ebaca42Sjeremylt call ceedoperatordestroy(op_masshex,err) 2322ebaca42Sjeremylt call ceedoperatordestroy(op_setup,err) 2332ebaca42Sjeremylt call ceedoperatordestroy(op_mass,err) 2342ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 2352ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 2362ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 2372ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 2382ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 2392ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 2402ebaca42Sjeremylt call ceedbasisdestroy(butet,err) 2412ebaca42Sjeremylt call ceedbasisdestroy(bxtet,err) 2422ebaca42Sjeremylt call ceedbasisdestroy(buhex,err) 2432ebaca42Sjeremylt call ceedbasisdestroy(bxhex,err) 2442ebaca42Sjeremylt call ceedvectordestroy(x,err) 2452ebaca42Sjeremylt call ceedvectordestroy(qdatatet,err) 2462ebaca42Sjeremylt call ceedvectordestroy(qdatahex,err) 2472ebaca42Sjeremylt call ceeddestroy(ceed,err) 2482ebaca42Sjeremylt end 2492ebaca42Sjeremylt!----------------------------------------------------------------------- 250