1b6faaefaSjeremylt!----------------------------------------------------------------------- 2b6faaefaSjeremylt! 3b6faaefaSjeremylt! Header with common subroutine 4b6faaefaSjeremylt! 5b6faaefaSjeremylt include 't320-basis-f.h' 6b6faaefaSjeremylt!----------------------------------------------------------------------- 7b6faaefaSjeremylt subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 8b6faaefaSjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9b6faaefaSjeremylt real*8 ctx 10b6faaefaSjeremylt real*8 u1(1) 11b6faaefaSjeremylt real*8 u2(1) 12b6faaefaSjeremylt real*8 v1(1) 13b6faaefaSjeremylt real*8 w 14b6faaefaSjeremylt integer q,ierr 15b6faaefaSjeremylt 16b6faaefaSjeremylt do i=1,q 17b6faaefaSjeremylt w = u1(i)/(u2(i+0*q)*u2(i+3*q)-u2(i+1*q)*u2(i+2*q)) 18b6faaefaSjeremylt v1(i+0*q)=w*(u2(i+2*q)*u2(i+2*q)+u2(i+3*q)*u2(i+3*q)) 19b6faaefaSjeremylt v1(i+1*q)=w*(u2(i+0*q)*u2(i+0*q)+u2(i+1*q)*u2(i+1*q)) 20b6faaefaSjeremylt v1(i+2*q)=w*(u2(i+0*q)*u2(i+2*q)+u2(i+1*q)*u2(i+3*q)) 21b6faaefaSjeremylt enddo 22b6faaefaSjeremylt 23b6faaefaSjeremylt ierr=0 24b6faaefaSjeremylt end 25b6faaefaSjeremylt!----------------------------------------------------------------------- 26b6faaefaSjeremylt subroutine diff(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 27b6faaefaSjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 28b6faaefaSjeremylt real*8 ctx 29b6faaefaSjeremylt real*8 u1(1) 30b6faaefaSjeremylt real*8 u2(1) 31b6faaefaSjeremylt real*8 v1(1) 32b6faaefaSjeremylt integer q,ierr 33b6faaefaSjeremylt 34b6faaefaSjeremylt do i=1,q 35b6faaefaSjeremylt v1(i+0*q)=u1(i+0*q)*u2(i+0*q)+u1(i+2*q)*u2(i+1*q) 36b6faaefaSjeremylt v1(i+1*q)=u1(i+2*q)*u2(i+0*q)+u1(i+1*q)*u2(i+1*q) 37b6faaefaSjeremylt enddo 38b6faaefaSjeremylt 39b6faaefaSjeremylt ierr=0 40b6faaefaSjeremylt end 41b6faaefaSjeremylt!----------------------------------------------------------------------- 42b6faaefaSjeremylt program test 43b6faaefaSjeremylt 44b6faaefaSjeremylt include 'ceedf.h' 45b6faaefaSjeremylt 46b6faaefaSjeremylt integer ceed,err,i,j,k 47*a8d32208Sjeremylt integer lmode 48*a8d32208Sjeremylt parameter(lmode=ceed_notranspose) 49b6faaefaSjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictqditet,& 50b6faaefaSjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictqdihex 51b6faaefaSjeremylt integer bxtet,butet,bxhex,buhex 52b6faaefaSjeremylt integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex 53b6faaefaSjeremylt integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff 54b6faaefaSjeremylt integer qdatatet,qdatahex,x,u,v 55b6faaefaSjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 56b6faaefaSjeremylt integer row,col,offset 57b6faaefaSjeremylt parameter(nelemtet=6) 58b6faaefaSjeremylt parameter(ptet=6) 59b6faaefaSjeremylt parameter(qtet=4) 60b6faaefaSjeremylt parameter(nelemhex=6) 61b6faaefaSjeremylt parameter(phex=3) 62b6faaefaSjeremylt parameter(qhex=4) 63b6faaefaSjeremylt parameter(d=2) 64b6faaefaSjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 65b6faaefaSjeremylt parameter(nx=3) 66b6faaefaSjeremylt parameter(ny=3) 67b6faaefaSjeremylt parameter(nxtet=3) 68b6faaefaSjeremylt parameter(nytet=1) 69b6faaefaSjeremylt parameter(nxhex=3) 70b6faaefaSjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 71b6faaefaSjeremylt parameter(nqptstet=nelemtet*qtet) 72b6faaefaSjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 73b6faaefaSjeremylt parameter(nqpts=nqptstet+nqptshex) 74b6faaefaSjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 75b6faaefaSjeremylt real*8 arrx(d*ndofs) 76b6faaefaSjeremylt integer*8 voffset,xoffset 77b6faaefaSjeremylt 78b6faaefaSjeremylt real*8 qref(d*qtet) 79b6faaefaSjeremylt real*8 qweight(qtet) 80b6faaefaSjeremylt real*8 interp(ptet*qtet) 81b6faaefaSjeremylt real*8 grad(d*ptet*qtet) 82b6faaefaSjeremylt 83b6faaefaSjeremylt real*8 hv(ndofs) 84b6faaefaSjeremylt real*8 total 85b6faaefaSjeremylt 86b6faaefaSjeremylt character arg*32 87b6faaefaSjeremylt 88b6faaefaSjeremylt external setup,diff 89b6faaefaSjeremylt 90b6faaefaSjeremylt call getarg(1,arg) 91b6faaefaSjeremylt 92b6faaefaSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 93b6faaefaSjeremylt 94b6faaefaSjeremylt! DoF Coordinates 95b6faaefaSjeremylt do i=0,ny*2 96b6faaefaSjeremylt do j=0,nx*2 97b6faaefaSjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 98b6faaefaSjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 99b6faaefaSjeremylt enddo 100b6faaefaSjeremylt enddo 101b6faaefaSjeremylt 102b6faaefaSjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 103b6faaefaSjeremylt xoffset=0 104b6faaefaSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 105b6faaefaSjeremylt 106b6faaefaSjeremylt! Qdata Vectors 107b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err) 108b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err) 109b6faaefaSjeremylt 110b6faaefaSjeremylt! Tet Elements 111b6faaefaSjeremylt do i=0,2 112b6faaefaSjeremylt col=mod(i,nx) 113b6faaefaSjeremylt row=i/nx 114b6faaefaSjeremylt offset=col*2+row*(nx*2+1)*2 115b6faaefaSjeremylt 116b6faaefaSjeremylt indxtet(i*2*ptet+1)=2+offset 117b6faaefaSjeremylt indxtet(i*2*ptet+2)=9+offset 118b6faaefaSjeremylt indxtet(i*2*ptet+3)=16+offset 119b6faaefaSjeremylt indxtet(i*2*ptet+4)=1+offset 120b6faaefaSjeremylt indxtet(i*2*ptet+5)=8+offset 121b6faaefaSjeremylt indxtet(i*2*ptet+6)=0+offset 122b6faaefaSjeremylt 123b6faaefaSjeremylt indxtet(i*2*ptet+7)=14+offset 124b6faaefaSjeremylt indxtet(i*2*ptet+8)=7+offset 125b6faaefaSjeremylt indxtet(i*2*ptet+9)=0+offset 126b6faaefaSjeremylt indxtet(i*2*ptet+10)=15+offset 127b6faaefaSjeremylt indxtet(i*2*ptet+11)=8+offset 128b6faaefaSjeremylt indxtet(i*2*ptet+12)=16+offset 129b6faaefaSjeremylt enddo 130b6faaefaSjeremylt 131b6faaefaSjeremylt! -- Restrictions 132*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,d,& 133*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 134*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,ptet,& 135*a8d32208Sjeremylt & nelemtet*ptet,d,erestrictxitet,err) 136b6faaefaSjeremylt 137*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,1,& 138*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 139*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,qtet,nqptstet,& 140b6faaefaSjeremylt & d*(d+1)/2,erestrictqditet,err) 141b6faaefaSjeremylt 142b6faaefaSjeremylt! -- Bases 143b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 144b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 145b6faaefaSjeremylt & qweight,bxtet,err) 146b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 147b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 148b6faaefaSjeremylt & qweight,butet,err) 149b6faaefaSjeremylt 150b6faaefaSjeremylt! -- QFunctions 151b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 152b6faaefaSjeremylt &SOURCE_DIR& 153a05f9790Sjeremylt &//'t522-operator.h:setup'//char(0),qf_setuptet,err) 154b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 155b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 156b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,& 157b6faaefaSjeremylt & err) 158b6faaefaSjeremylt 159b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 160b6faaefaSjeremylt &SOURCE_DIR& 161a05f9790Sjeremylt &//'t522-operator.h:diff'//char(0),qf_difftet,err) 162b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err) 163b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err) 164b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err) 165b6faaefaSjeremylt 166b6faaefaSjeremylt! -- Operators 167b6faaefaSjeremylt! ---- Setup Tet 168442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 169442e7f0bSjeremylt & ceed_qfunction_none,op_setuptet,err) 170b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 171*a8d32208Sjeremylt & bxtet,ceed_vector_none,err) 172b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 173*a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 174b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,& 175*a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 176b6faaefaSjeremylt! ---- diff Tet 177442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_difftet,ceed_qfunction_none,& 178442e7f0bSjeremylt & ceed_qfunction_none,op_difftet,err) 179b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,& 180*a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 181b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'u',erestrictutet,& 182*a8d32208Sjeremylt & butet,ceed_vector_active,err) 183b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'v',erestrictutet,& 184*a8d32208Sjeremylt & butet,ceed_vector_active,err) 185b6faaefaSjeremylt 186b6faaefaSjeremylt! Hex Elements 187b6faaefaSjeremylt do i=0,nelemhex-1 188b6faaefaSjeremylt col=mod(i,nx) 189b6faaefaSjeremylt row=i/nx 190b6faaefaSjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 191b6faaefaSjeremylt do j=0,phex-1 192b6faaefaSjeremylt do k=0,phex-1 193b6faaefaSjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 194b6faaefaSjeremylt enddo 195b6faaefaSjeremylt enddo 196b6faaefaSjeremylt enddo 197b6faaefaSjeremylt 198b6faaefaSjeremylt! -- Restrictions 199*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,d,& 200b6faaefaSjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 201*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,phex*phex,& 202b6faaefaSjeremylt & nelemhex*phex*phex,d,erestrictxihex,err) 203b6faaefaSjeremylt 204*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,1,& 205b6faaefaSjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 206*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,qhex*qhex,& 207*a8d32208Sjeremylt & nqptshex,d*(d+1)/2,erestrictqdihex,err) 208b6faaefaSjeremylt 209b6faaefaSjeremylt! -- Bases 210b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 211b6faaefaSjeremylt & bxhex,err) 212b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 213b6faaefaSjeremylt & buhex,err) 214b6faaefaSjeremylt 215b6faaefaSjeremylt! -- QFunctions 216b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 217b6faaefaSjeremylt &SOURCE_DIR& 218872c4ebbSjeremylt &//'t522-operator.h:setup'//char(0),qf_setuphex,err) 219b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 220b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 221b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,& 222b6faaefaSjeremylt & err) 223b6faaefaSjeremylt 224b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 225b6faaefaSjeremylt &SOURCE_DIR& 226872c4ebbSjeremylt &//'t522-operator.h:diff'//char(0),qf_diffhex,err) 227b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err) 228b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err) 229b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err) 230b6faaefaSjeremylt 231b6faaefaSjeremylt! -- Operators 232b6faaefaSjeremylt! ---- Setup Hex 233442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 234442e7f0bSjeremylt & ceed_qfunction_none,op_setuphex,err) 235b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 236*a8d32208Sjeremylt & bxhex,ceed_vector_none,err) 237b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 238*a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 239b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,& 240*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 241b6faaefaSjeremylt! ---- diff Hex 242442e7f0bSjeremylt call ceedoperatorcreate(ceed,qf_diffhex,ceed_qfunction_none,& 243442e7f0bSjeremylt & ceed_qfunction_none,op_diffhex,err) 244b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,& 245*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 246b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,& 247*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 248b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,& 249*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 250b6faaefaSjeremylt 251b6faaefaSjeremylt! Composite Operators 252b6faaefaSjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 253b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 254b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 255b6faaefaSjeremylt 256b6faaefaSjeremylt call ceedcompositeoperatorcreate(ceed,op_diff,err) 257b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_diff,op_difftet,err) 258b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_diff,op_diffhex,err) 259b6faaefaSjeremylt 260b6faaefaSjeremylt! Apply Setup Operator 261e97ff134Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 262e97ff134Sjeremylt & ceed_request_immediate,err) 263b6faaefaSjeremylt 264b6faaefaSjeremylt! Apply diff Operator 265b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 266b6faaefaSjeremylt call ceedvectorsetvalue(u,1.d0,err) 267b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 268b6faaefaSjeremylt 269b6faaefaSjeremylt call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err) 270b6faaefaSjeremylt 271b6faaefaSjeremylt! Check Output 272b6faaefaSjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 273b6faaefaSjeremylt do i=1,ndofs 274b6faaefaSjeremylt if (abs(hv(voffset+i))>1.0d-14) then 275b6faaefaSjeremylt! LCOV_EXCL_START 276b6faaefaSjeremylt write(*,*) 'Computed: ',total,' != True: 0.0' 277b6faaefaSjeremylt! LCOV_EXCL_STOP 278b6faaefaSjeremylt endif 279b6faaefaSjeremylt enddo 280b6faaefaSjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 281b6faaefaSjeremylt 282b6faaefaSjeremylt! Cleanup 283b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 284b6faaefaSjeremylt call ceedqfunctiondestroy(qf_difftet,err) 285b6faaefaSjeremylt call ceedoperatordestroy(op_setuptet,err) 286b6faaefaSjeremylt call ceedoperatordestroy(op_difftet,err) 287b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 288b6faaefaSjeremylt call ceedqfunctiondestroy(qf_diffhex,err) 289b6faaefaSjeremylt call ceedoperatordestroy(op_setuphex,err) 290b6faaefaSjeremylt call ceedoperatordestroy(op_diffhex,err) 291b6faaefaSjeremylt call ceedoperatordestroy(op_setup,err) 292b6faaefaSjeremylt call ceedoperatordestroy(op_diff,err) 293b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 294b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 295b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqditet,err) 296b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 297b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 298b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 299b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqdihex,err) 300b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 301b6faaefaSjeremylt call ceedbasisdestroy(butet,err) 302b6faaefaSjeremylt call ceedbasisdestroy(bxtet,err) 303b6faaefaSjeremylt call ceedbasisdestroy(buhex,err) 304b6faaefaSjeremylt call ceedbasisdestroy(bxhex,err) 305b6faaefaSjeremylt call ceedvectordestroy(x,err) 306b6faaefaSjeremylt call ceedvectordestroy(u,err) 307b6faaefaSjeremylt call ceedvectordestroy(v,err) 308b6faaefaSjeremylt call ceedvectordestroy(qdatatet,err) 309b6faaefaSjeremylt call ceedvectordestroy(qdatahex,err) 310b6faaefaSjeremylt call ceeddestroy(ceed,err) 311b6faaefaSjeremylt end 312b6faaefaSjeremylt!----------------------------------------------------------------------- 313