1b6faaefaSjeremylt!----------------------------------------------------------------------- 2b6faaefaSjeremylt! 3b6faaefaSjeremylt! Header with common subroutine 4b6faaefaSjeremylt! 5b6faaefaSjeremylt include 't320-basis-f.h' 6752c3701SJeremy L Thompson! 7752c3701SJeremy L Thompson! Header with QFunctions 8752c3701SJeremy L Thompson! 9752c3701SJeremy L Thompson include 't522-operator-f.h' 10b6faaefaSjeremylt!----------------------------------------------------------------------- 11b6faaefaSjeremylt program test 121f9a83abSJed Brown implicit none 13ec3da8bcSJed Brown include 'ceed/fortran.h' 14b6faaefaSjeremylt 15b6faaefaSjeremylt integer ceed,err,i,j,k 1615910d16Sjeremylt integer stridesqdtet(3),stridesqdhex(3) 1715910d16Sjeremylt integer erestrictxtet,erestrictutet,erestrictqditet,& 1815910d16Sjeremylt& erestrictxhex,erestrictuhex,erestrictqdihex 19b6faaefaSjeremylt integer bxtet,butet,bxhex,buhex 20b6faaefaSjeremylt integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex 21b6faaefaSjeremylt integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff 22b6faaefaSjeremylt integer qdatatet,qdatahex,x,u,v 23b6faaefaSjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 24b6faaefaSjeremylt integer row,col,offset 25b6faaefaSjeremylt parameter(nelemtet=6) 26b6faaefaSjeremylt parameter(ptet=6) 27b6faaefaSjeremylt parameter(qtet=4) 28b6faaefaSjeremylt parameter(nelemhex=6) 29b6faaefaSjeremylt parameter(phex=3) 30b6faaefaSjeremylt parameter(qhex=4) 31b6faaefaSjeremylt parameter(d=2) 32b6faaefaSjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 33b6faaefaSjeremylt parameter(nx=3) 34b6faaefaSjeremylt parameter(ny=3) 35b6faaefaSjeremylt parameter(nxtet=3) 36b6faaefaSjeremylt parameter(nytet=1) 37b6faaefaSjeremylt parameter(nxhex=3) 38b6faaefaSjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 39b6faaefaSjeremylt parameter(nqptstet=nelemtet*qtet) 40b6faaefaSjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 41b6faaefaSjeremylt parameter(nqpts=nqptstet+nqptshex) 42b6faaefaSjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 43b6faaefaSjeremylt real*8 arrx(d*ndofs) 44b6faaefaSjeremylt integer*8 voffset,xoffset 45b6faaefaSjeremylt 46b6faaefaSjeremylt real*8 qref(d*qtet) 47b6faaefaSjeremylt real*8 qweight(qtet) 48b6faaefaSjeremylt real*8 interp(ptet*qtet) 49b6faaefaSjeremylt real*8 grad(d*ptet*qtet) 50b6faaefaSjeremylt 51b6faaefaSjeremylt real*8 hv(ndofs) 52b6faaefaSjeremylt real*8 total 53b6faaefaSjeremylt 54b6faaefaSjeremylt character arg*32 55b6faaefaSjeremylt 56b6faaefaSjeremylt external setup,diff 57b6faaefaSjeremylt 58b6faaefaSjeremylt call getarg(1,arg) 59b6faaefaSjeremylt 60b6faaefaSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 61b6faaefaSjeremylt 62b6faaefaSjeremylt! DoF Coordinates 63b6faaefaSjeremylt do i=0,ny*2 64b6faaefaSjeremylt do j=0,nx*2 65b6faaefaSjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 66b6faaefaSjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 67b6faaefaSjeremylt enddo 68b6faaefaSjeremylt enddo 69b6faaefaSjeremylt 70b6faaefaSjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 71b6faaefaSjeremylt xoffset=0 72b6faaefaSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 73b6faaefaSjeremylt 74b6faaefaSjeremylt! Qdata Vectors 75b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err) 76b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err) 77b6faaefaSjeremylt 78b6faaefaSjeremylt! Tet Elements 79b6faaefaSjeremylt do i=0,2 80b6faaefaSjeremylt col=mod(i,nx) 81b6faaefaSjeremylt row=i/nx 82b6faaefaSjeremylt offset=col*2+row*(nx*2+1)*2 83b6faaefaSjeremylt 84b6faaefaSjeremylt indxtet(i*2*ptet+1)=2+offset 85b6faaefaSjeremylt indxtet(i*2*ptet+2)=9+offset 86b6faaefaSjeremylt indxtet(i*2*ptet+3)=16+offset 87b6faaefaSjeremylt indxtet(i*2*ptet+4)=1+offset 88b6faaefaSjeremylt indxtet(i*2*ptet+5)=8+offset 89b6faaefaSjeremylt indxtet(i*2*ptet+6)=0+offset 90b6faaefaSjeremylt 91b6faaefaSjeremylt indxtet(i*2*ptet+7)=14+offset 92b6faaefaSjeremylt indxtet(i*2*ptet+8)=7+offset 93b6faaefaSjeremylt indxtet(i*2*ptet+9)=0+offset 94b6faaefaSjeremylt indxtet(i*2*ptet+10)=15+offset 95b6faaefaSjeremylt indxtet(i*2*ptet+11)=8+offset 96b6faaefaSjeremylt indxtet(i*2*ptet+12)=16+offset 97b6faaefaSjeremylt enddo 98b6faaefaSjeremylt 99b6faaefaSjeremylt! -- Restrictions 100d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,& 101a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 102b6faaefaSjeremylt 103d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,& 104a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 1057509a596Sjeremylt stridesqdtet=[1,qtet,qtet*d*(d+1)/2] 106d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,d*(d+1)/2,& 107d979a051Sjeremylt & d*(d+1)/2*nqptstet,stridesqdtet,erestrictqditet,err) 108b6faaefaSjeremylt 109b6faaefaSjeremylt! -- Bases 110b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 111b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 112b6faaefaSjeremylt & qweight,bxtet,err) 113b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 114b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 115b6faaefaSjeremylt & qweight,butet,err) 116b6faaefaSjeremylt 117b6faaefaSjeremylt! -- QFunctions 118b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 119b6faaefaSjeremylt &SOURCE_DIR& 120a05f9790Sjeremylt &//'t522-operator.h:setup'//char(0),qf_setuptet,err) 121a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err) 122b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 123b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,& 124b6faaefaSjeremylt & err) 125b6faaefaSjeremylt 126b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 127b6faaefaSjeremylt &SOURCE_DIR& 128a05f9790Sjeremylt &//'t522-operator.h:diff'//char(0),qf_difftet,err) 129b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err) 130b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err) 131b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err) 132b6faaefaSjeremylt 133b6faaefaSjeremylt! -- Operators 134b6faaefaSjeremylt! ---- Setup Tet 135442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 136442e7f0bSjeremylt & ceed_qfunction_none,op_setuptet,err) 137a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_setuptet,'weight',& 13815910d16Sjeremylt & ceed_elemrestriction_none,bxtet,ceed_vector_none,err) 139b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 140a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 141b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,& 142356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 143b6faaefaSjeremylt! ---- diff Tet 144442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_difftet,ceed_qfunction_none,& 145442e7f0bSjeremylt & ceed_qfunction_none,op_difftet,err) 146b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,& 147356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 148b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'u',erestrictutet,& 149a8d32208Sjeremylt & butet,ceed_vector_active,err) 150b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'v',erestrictutet,& 151a8d32208Sjeremylt & butet,ceed_vector_active,err) 152b6faaefaSjeremylt 153b6faaefaSjeremylt! Hex Elements 154b6faaefaSjeremylt do i=0,nelemhex-1 155b6faaefaSjeremylt col=mod(i,nx) 156b6faaefaSjeremylt row=i/nx 157b6faaefaSjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 158b6faaefaSjeremylt do j=0,phex-1 159b6faaefaSjeremylt do k=0,phex-1 160b6faaefaSjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 161b6faaefaSjeremylt enddo 162b6faaefaSjeremylt enddo 163b6faaefaSjeremylt enddo 164b6faaefaSjeremylt 165b6faaefaSjeremylt! -- Restrictions 166d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,& 167d979a051Sjeremylt & d*ndofs,ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 168b6faaefaSjeremylt 169d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,& 170b6faaefaSjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 1717509a596Sjeremylt stridesqdhex=[1,qhex*qhex,qhex*qhex*d*(d+1)/2] 1727509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 173d979a051Sjeremylt & d*(d+1)/2,d*(d+1)/2*nqptshex,stridesqdhex,erestrictqdihex,err) 174b6faaefaSjeremylt 175b6faaefaSjeremylt! -- Bases 176b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 177b6faaefaSjeremylt & bxhex,err) 178b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 179b6faaefaSjeremylt & buhex,err) 180b6faaefaSjeremylt 181b6faaefaSjeremylt! -- QFunctions 182b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 183b6faaefaSjeremylt &SOURCE_DIR& 184872c4ebbSjeremylt &//'t522-operator.h:setup'//char(0),qf_setuphex,err) 185b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 186b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 187b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,& 188b6faaefaSjeremylt & err) 189b6faaefaSjeremylt 190b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 191b6faaefaSjeremylt &SOURCE_DIR& 192872c4ebbSjeremylt &//'t522-operator.h:diff'//char(0),qf_diffhex,err) 193b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err) 194b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err) 195b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err) 196b6faaefaSjeremylt 197b6faaefaSjeremylt! -- Operators 198b6faaefaSjeremylt! ---- Setup Hex 199442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 200442e7f0bSjeremylt & ceed_qfunction_none,op_setuphex,err) 20115910d16Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',& 20215910d16Sjeremylt & ceed_elemrestriction_none,bxhex,ceed_vector_none,err) 203b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 204a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 205b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,& 206356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 207b6faaefaSjeremylt! ---- diff Hex 208442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_diffhex,ceed_qfunction_none,& 209442e7f0bSjeremylt & ceed_qfunction_none,op_diffhex,err) 210b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,& 211356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 212b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,& 213a8d32208Sjeremylt & buhex,ceed_vector_active,err) 214b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,& 215a8d32208Sjeremylt & buhex,ceed_vector_active,err) 216b6faaefaSjeremylt 217b6faaefaSjeremylt! Composite Operators 218*ed094490SJeremy L Thompson call ceedoperatorcreatecomposite(ceed,op_setup,err) 219*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_setup,op_setuptet,err) 220*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_setup,op_setuphex,err) 221b6faaefaSjeremylt 222*ed094490SJeremy L Thompson call ceedoperatorcreatecomposite(ceed,op_diff,err) 223*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_diff,op_difftet,err) 224*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_diff,op_diffhex,err) 225b6faaefaSjeremylt 226b6faaefaSjeremylt! Apply Setup Operator 227e97ff134Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 228e97ff134Sjeremylt & ceed_request_immediate,err) 229b6faaefaSjeremylt 230b6faaefaSjeremylt! Apply diff Operator 231b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 232b6faaefaSjeremylt call ceedvectorsetvalue(u,1.d0,err) 233b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 234b6faaefaSjeremylt 235b6faaefaSjeremylt call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err) 236b6faaefaSjeremylt 237b6faaefaSjeremylt! Check Output 238b6faaefaSjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 239b6faaefaSjeremylt do i=1,ndofs 240b6faaefaSjeremylt if (abs(hv(voffset+i))>1.0d-14) then 241b6faaefaSjeremylt! LCOV_EXCL_START 242b6faaefaSjeremylt write(*,*) 'Computed: ',total,' != True: 0.0' 243b6faaefaSjeremylt! LCOV_EXCL_STOP 244b6faaefaSjeremylt endif 245b6faaefaSjeremylt enddo 246b6faaefaSjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 247b6faaefaSjeremylt 248b6faaefaSjeremylt! Cleanup 249b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 250b6faaefaSjeremylt call ceedqfunctiondestroy(qf_difftet,err) 251b6faaefaSjeremylt call ceedoperatordestroy(op_setuptet,err) 252b6faaefaSjeremylt call ceedoperatordestroy(op_difftet,err) 253b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 254b6faaefaSjeremylt call ceedqfunctiondestroy(qf_diffhex,err) 255b6faaefaSjeremylt call ceedoperatordestroy(op_setuphex,err) 256b6faaefaSjeremylt call ceedoperatordestroy(op_diffhex,err) 257b6faaefaSjeremylt call ceedoperatordestroy(op_setup,err) 258b6faaefaSjeremylt call ceedoperatordestroy(op_diff,err) 259b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 260b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 261b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqditet,err) 262b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 263b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 264b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqdihex,err) 265b6faaefaSjeremylt call ceedbasisdestroy(butet,err) 266b6faaefaSjeremylt call ceedbasisdestroy(bxtet,err) 267b6faaefaSjeremylt call ceedbasisdestroy(buhex,err) 268b6faaefaSjeremylt call ceedbasisdestroy(bxhex,err) 269b6faaefaSjeremylt call ceedvectordestroy(x,err) 270b6faaefaSjeremylt call ceedvectordestroy(u,err) 271b6faaefaSjeremylt call ceedvectordestroy(v,err) 272b6faaefaSjeremylt call ceedvectordestroy(qdatatet,err) 273b6faaefaSjeremylt call ceedvectordestroy(qdatahex,err) 274b6faaefaSjeremylt call ceeddestroy(ceed,err) 275b6faaefaSjeremylt end 276b6faaefaSjeremylt!----------------------------------------------------------------------- 277