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 47b6faaefaSjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictqditet,& 48b6faaefaSjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictqdihex 49b6faaefaSjeremylt integer bxtet,butet,bxhex,buhex 50b6faaefaSjeremylt integer qf_setuptet,qf_difftet,qf_setuphex,qf_diffhex 51b6faaefaSjeremylt integer op_setuptet,op_difftet,op_setuphex,op_diffhex,op_setup,op_diff 52b6faaefaSjeremylt integer qdatatet,qdatahex,x,u,v 53b6faaefaSjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 54b6faaefaSjeremylt integer row,col,offset 55b6faaefaSjeremylt parameter(nelemtet=6) 56b6faaefaSjeremylt parameter(ptet=6) 57b6faaefaSjeremylt parameter(qtet=4) 58b6faaefaSjeremylt parameter(nelemhex=6) 59b6faaefaSjeremylt parameter(phex=3) 60b6faaefaSjeremylt parameter(qhex=4) 61b6faaefaSjeremylt parameter(d=2) 62b6faaefaSjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 63b6faaefaSjeremylt parameter(nx=3) 64b6faaefaSjeremylt parameter(ny=3) 65b6faaefaSjeremylt parameter(nxtet=3) 66b6faaefaSjeremylt parameter(nytet=1) 67b6faaefaSjeremylt parameter(nxhex=3) 68b6faaefaSjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 69b6faaefaSjeremylt parameter(nqptstet=nelemtet*qtet) 70b6faaefaSjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 71b6faaefaSjeremylt parameter(nqpts=nqptstet+nqptshex) 72b6faaefaSjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 73b6faaefaSjeremylt real*8 arrx(d*ndofs) 74b6faaefaSjeremylt integer*8 voffset,xoffset 75b6faaefaSjeremylt 76b6faaefaSjeremylt real*8 qref(d*qtet) 77b6faaefaSjeremylt real*8 qweight(qtet) 78b6faaefaSjeremylt real*8 interp(ptet*qtet) 79b6faaefaSjeremylt real*8 grad(d*ptet*qtet) 80b6faaefaSjeremylt 81b6faaefaSjeremylt real*8 hv(ndofs) 82b6faaefaSjeremylt real*8 total 83b6faaefaSjeremylt 84b6faaefaSjeremylt character arg*32 85b6faaefaSjeremylt 86b6faaefaSjeremylt external setup,diff 87b6faaefaSjeremylt 88b6faaefaSjeremylt call getarg(1,arg) 89b6faaefaSjeremylt 90b6faaefaSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 91b6faaefaSjeremylt 92b6faaefaSjeremylt! DoF Coordinates 93b6faaefaSjeremylt do i=0,ny*2 94b6faaefaSjeremylt do j=0,nx*2 95b6faaefaSjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 96b6faaefaSjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 97b6faaefaSjeremylt enddo 98b6faaefaSjeremylt enddo 99b6faaefaSjeremylt 100b6faaefaSjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 101b6faaefaSjeremylt xoffset=0 102b6faaefaSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 103b6faaefaSjeremylt 104b6faaefaSjeremylt! Qdata Vectors 105b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptstet*d*(d+1)/2,qdatatet,err) 106b6faaefaSjeremylt call ceedvectorcreate(ceed,nqptshex*d*(d+1)/2,qdatahex,err) 107b6faaefaSjeremylt 108b6faaefaSjeremylt! Tet Elements 109b6faaefaSjeremylt do i=0,2 110b6faaefaSjeremylt col=mod(i,nx) 111b6faaefaSjeremylt row=i/nx 112b6faaefaSjeremylt offset=col*2+row*(nx*2+1)*2 113b6faaefaSjeremylt 114b6faaefaSjeremylt indxtet(i*2*ptet+1)=2+offset 115b6faaefaSjeremylt indxtet(i*2*ptet+2)=9+offset 116b6faaefaSjeremylt indxtet(i*2*ptet+3)=16+offset 117b6faaefaSjeremylt indxtet(i*2*ptet+4)=1+offset 118b6faaefaSjeremylt indxtet(i*2*ptet+5)=8+offset 119b6faaefaSjeremylt indxtet(i*2*ptet+6)=0+offset 120b6faaefaSjeremylt 121b6faaefaSjeremylt indxtet(i*2*ptet+7)=14+offset 122b6faaefaSjeremylt indxtet(i*2*ptet+8)=7+offset 123b6faaefaSjeremylt indxtet(i*2*ptet+9)=0+offset 124b6faaefaSjeremylt indxtet(i*2*ptet+10)=15+offset 125b6faaefaSjeremylt indxtet(i*2*ptet+11)=8+offset 126b6faaefaSjeremylt indxtet(i*2*ptet+12)=16+offset 127b6faaefaSjeremylt enddo 128b6faaefaSjeremylt 129b6faaefaSjeremylt! -- Restrictions 130b6faaefaSjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,ndofs,d,ceed_mem_host,& 131b6faaefaSjeremylt & ceed_use_pointer,indxtet,erestrictxtet,err) 132b6faaefaSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemtet,ptet,nelemtet*ptet,& 133b6faaefaSjeremylt & d,erestrictxitet,err) 134b6faaefaSjeremylt 135b6faaefaSjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,ndofs,1,ceed_mem_host,& 136b6faaefaSjeremylt & ceed_use_pointer,indxtet,erestrictutet,err) 137b6faaefaSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemtet,qtet,nqptstet,& 138b6faaefaSjeremylt & d*(d+1)/2,erestrictqditet,err) 139b6faaefaSjeremylt 140b6faaefaSjeremylt! -- Bases 141b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 142b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 143b6faaefaSjeremylt & qweight,bxtet,err) 144b6faaefaSjeremylt call buildmats(qref,qweight,interp,grad) 145b6faaefaSjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 146b6faaefaSjeremylt & qweight,butet,err) 147b6faaefaSjeremylt 148b6faaefaSjeremylt! -- QFunctions 149b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 150b6faaefaSjeremylt &SOURCE_DIR& 151*a05f9790Sjeremylt &//'t522-operator.h:setup'//char(0),qf_setuptet,err) 152b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 153b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 154b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',d*(d+1)/2,ceed_eval_none,& 155b6faaefaSjeremylt & err) 156b6faaefaSjeremylt 157b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 158b6faaefaSjeremylt &SOURCE_DIR& 159*a05f9790Sjeremylt &//'t522-operator.h:diff'//char(0),qf_difftet,err) 160b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'rho',d*(d+1)/2,ceed_eval_none,err) 161b6faaefaSjeremylt call ceedqfunctionaddinput(qf_difftet,'u',d,ceed_eval_grad,err) 162b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_difftet,'v',d,ceed_eval_grad,err) 163b6faaefaSjeremylt 164b6faaefaSjeremylt! -- Operators 165b6faaefaSjeremylt! ---- Setup Tet 166b6faaefaSjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_null,ceed_null,op_setuptet,& 167b6faaefaSjeremylt & err) 168b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 169b6faaefaSjeremylt & ceed_notranspose,bxtet,ceed_vector_none,err) 170b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 171b6faaefaSjeremylt & ceed_notranspose,bxtet,ceed_vector_active,err) 172b6faaefaSjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictqditet,& 173b6faaefaSjeremylt & ceed_notranspose,ceed_basis_collocated,qdatatet,err) 174b6faaefaSjeremylt! ---- diff Tet 175b6faaefaSjeremylt call ceedoperatorcreate(ceed,qf_difftet,ceed_null,ceed_null,op_difftet,& 176b6faaefaSjeremylt & err) 177b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'rho',erestrictqditet,& 178b6faaefaSjeremylt & ceed_notranspose,ceed_basis_collocated,qdatatet,err) 179b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'u',erestrictutet,& 180b6faaefaSjeremylt & ceed_notranspose,butet,ceed_vector_active,err) 181b6faaefaSjeremylt call ceedoperatorsetfield(op_difftet,'v',erestrictutet,& 182b6faaefaSjeremylt & ceed_notranspose,butet,ceed_vector_active,err) 183b6faaefaSjeremylt 184b6faaefaSjeremylt! Hex Elements 185b6faaefaSjeremylt do i=0,nelemhex-1 186b6faaefaSjeremylt col=mod(i,nx) 187b6faaefaSjeremylt row=i/nx 188b6faaefaSjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 189b6faaefaSjeremylt do j=0,phex-1 190b6faaefaSjeremylt do k=0,phex-1 191b6faaefaSjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 192b6faaefaSjeremylt enddo 193b6faaefaSjeremylt enddo 194b6faaefaSjeremylt enddo 195b6faaefaSjeremylt 196b6faaefaSjeremylt! -- Restrictions 197b6faaefaSjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,ndofs,d,& 198b6faaefaSjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 199b6faaefaSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemhex,phex*phex,& 200b6faaefaSjeremylt & nelemhex*phex*phex,d,erestrictxihex,err) 201b6faaefaSjeremylt 202b6faaefaSjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,ndofs,1,& 203b6faaefaSjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 204b6faaefaSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemhex,qhex*qhex,nqptshex,& 205b6faaefaSjeremylt & d*(d+1)/2,erestrictqdihex,err) 206b6faaefaSjeremylt 207b6faaefaSjeremylt! -- Bases 208b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 209b6faaefaSjeremylt & bxhex,err) 210b6faaefaSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 211b6faaefaSjeremylt & buhex,err) 212b6faaefaSjeremylt 213b6faaefaSjeremylt! -- QFunctions 214b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 215b6faaefaSjeremylt &SOURCE_DIR& 216b6faaefaSjeremylt &//'t521-operator.h:setup'//char(0),qf_setuphex,err) 217b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 218b6faaefaSjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 219b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',d*(d+1)/2,ceed_eval_none,& 220b6faaefaSjeremylt & err) 221b6faaefaSjeremylt 222b6faaefaSjeremylt call ceedqfunctioncreateinterior(ceed,1,diff,& 223b6faaefaSjeremylt &SOURCE_DIR& 224b6faaefaSjeremylt &//'t521-operator.h:diff'//char(0),qf_diffhex,err) 225b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'rho',d*(d+1)/2,ceed_eval_none,err) 226b6faaefaSjeremylt call ceedqfunctionaddinput(qf_diffhex,'u',d,ceed_eval_grad,err) 227b6faaefaSjeremylt call ceedqfunctionaddoutput(qf_diffhex,'v',d,ceed_eval_grad,err) 228b6faaefaSjeremylt 229b6faaefaSjeremylt! -- Operators 230b6faaefaSjeremylt! ---- Setup Hex 231b6faaefaSjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_null,ceed_null,op_setuphex,& 232b6faaefaSjeremylt & err) 233b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 234b6faaefaSjeremylt & ceed_notranspose,bxhex,ceed_vector_none,err) 235b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 236b6faaefaSjeremylt & ceed_notranspose,bxhex,ceed_vector_active,err) 237b6faaefaSjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictqdihex,& 238b6faaefaSjeremylt & ceed_notranspose,ceed_basis_collocated,qdatahex,err) 239b6faaefaSjeremylt! ---- diff Hex 240b6faaefaSjeremylt call ceedoperatorcreate(ceed,qf_diffhex,ceed_null,ceed_null,op_diffhex,& 241b6faaefaSjeremylt & err) 242b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'rho',erestrictqdihex,& 243b6faaefaSjeremylt & ceed_notranspose,ceed_basis_collocated,qdatahex,err) 244b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'u',erestrictuhex,& 245b6faaefaSjeremylt & ceed_notranspose,buhex,ceed_vector_active,err) 246b6faaefaSjeremylt call ceedoperatorsetfield(op_diffhex,'v',erestrictuhex,& 247b6faaefaSjeremylt & ceed_notranspose,buhex,ceed_vector_active,err) 248b6faaefaSjeremylt 249b6faaefaSjeremylt! Composite Operators 250b6faaefaSjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 251b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 252b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 253b6faaefaSjeremylt 254b6faaefaSjeremylt call ceedcompositeoperatorcreate(ceed,op_diff,err) 255b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_diff,op_difftet,err) 256b6faaefaSjeremylt call ceedcompositeoperatoraddsub(op_diff,op_diffhex,err) 257b6faaefaSjeremylt 258b6faaefaSjeremylt! Apply Setup Operator 259b6faaefaSjeremylt call ceedoperatorapply(op_setup,x,ceed_null,ceed_request_immediate,err) 260b6faaefaSjeremylt 261b6faaefaSjeremylt! Apply diff Operator 262b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 263b6faaefaSjeremylt call ceedvectorsetvalue(u,1.d0,err) 264b6faaefaSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 265b6faaefaSjeremylt 266b6faaefaSjeremylt call ceedoperatorapply(op_diff,u,v,ceed_request_immediate,err) 267b6faaefaSjeremylt 268b6faaefaSjeremylt! Check Output 269b6faaefaSjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 270b6faaefaSjeremylt do i=1,ndofs 271b6faaefaSjeremylt if (abs(hv(voffset+i))>1.0d-14) then 272b6faaefaSjeremylt! LCOV_EXCL_START 273b6faaefaSjeremylt write(*,*) 'Computed: ',total,' != True: 0.0' 274b6faaefaSjeremylt! LCOV_EXCL_STOP 275b6faaefaSjeremylt endif 276b6faaefaSjeremylt enddo 277b6faaefaSjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 278b6faaefaSjeremylt 279b6faaefaSjeremylt! Cleanup 280b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 281b6faaefaSjeremylt call ceedqfunctiondestroy(qf_difftet,err) 282b6faaefaSjeremylt call ceedoperatordestroy(op_setuptet,err) 283b6faaefaSjeremylt call ceedoperatordestroy(op_difftet,err) 284b6faaefaSjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 285b6faaefaSjeremylt call ceedqfunctiondestroy(qf_diffhex,err) 286b6faaefaSjeremylt call ceedoperatordestroy(op_setuphex,err) 287b6faaefaSjeremylt call ceedoperatordestroy(op_diffhex,err) 288b6faaefaSjeremylt call ceedoperatordestroy(op_setup,err) 289b6faaefaSjeremylt call ceedoperatordestroy(op_diff,err) 290b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 291b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 292b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqditet,err) 293b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 294b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 295b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 296b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictqdihex,err) 297b6faaefaSjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 298b6faaefaSjeremylt call ceedbasisdestroy(butet,err) 299b6faaefaSjeremylt call ceedbasisdestroy(bxtet,err) 300b6faaefaSjeremylt call ceedbasisdestroy(buhex,err) 301b6faaefaSjeremylt call ceedbasisdestroy(bxhex,err) 302b6faaefaSjeremylt call ceedvectordestroy(x,err) 303b6faaefaSjeremylt call ceedvectordestroy(u,err) 304b6faaefaSjeremylt call ceedvectordestroy(v,err) 305b6faaefaSjeremylt call ceedvectordestroy(qdatatet,err) 306b6faaefaSjeremylt call ceedvectordestroy(qdatahex,err) 307b6faaefaSjeremylt call ceeddestroy(ceed,err) 308b6faaefaSjeremylt end 309b6faaefaSjeremylt!----------------------------------------------------------------------- 310