1250756a7Sjeremylt!----------------------------------------------------------------------- 2250756a7Sjeremylt! 3250756a7Sjeremylt! Header with common subroutine 4250756a7Sjeremylt! 5250756a7Sjeremylt 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' 10250756a7Sjeremylt!----------------------------------------------------------------------- 11250756a7Sjeremylt program test 121f9a83abSJed Brown implicit none 13ec3da8bcSJed Brown include 'ceed/fortran.h' 14250756a7Sjeremylt 15250756a7Sjeremylt integer ceed,err,i,j,k 1615910d16Sjeremylt integer stridesutet(3),stridesuhex(3) 1715910d16Sjeremylt integer erestrictxtet,erestrictutet,erestrictuitet,& 1815910d16Sjeremylt& erestrictxhex,erestrictuhex,erestrictuihex 19250756a7Sjeremylt integer bxtet,butet,bxhex,buhex 20250756a7Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 21250756a7Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 22250756a7Sjeremylt integer qdatatet,qdatahex,x,u,v 23250756a7Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 24250756a7Sjeremylt integer row,col,offset 25250756a7Sjeremylt parameter(nelemtet=6) 26250756a7Sjeremylt parameter(ptet=6) 27250756a7Sjeremylt parameter(qtet=4) 28250756a7Sjeremylt parameter(nelemhex=6) 29250756a7Sjeremylt parameter(phex=3) 30250756a7Sjeremylt parameter(qhex=4) 31250756a7Sjeremylt parameter(d=2) 32250756a7Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 33250756a7Sjeremylt parameter(nx=3) 34250756a7Sjeremylt parameter(ny=3) 35250756a7Sjeremylt parameter(nxtet=3) 36250756a7Sjeremylt parameter(nytet=1) 37250756a7Sjeremylt parameter(nxhex=3) 38250756a7Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 39250756a7Sjeremylt parameter(nqptstet=nelemtet*qtet) 40250756a7Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 41250756a7Sjeremylt parameter(nqpts=nqptstet+nqptshex) 42250756a7Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 43250756a7Sjeremylt real*8 arrx(d*ndofs) 44250756a7Sjeremylt integer*8 voffset,xoffset 45250756a7Sjeremylt 46250756a7Sjeremylt real*8 qref(d*qtet) 47250756a7Sjeremylt real*8 qweight(qtet) 48250756a7Sjeremylt real*8 interp(ptet*qtet) 49250756a7Sjeremylt real*8 grad(d*ptet*qtet) 50250756a7Sjeremylt 51250756a7Sjeremylt real*8 hv(ndofs) 52250756a7Sjeremylt real*8 total 53250756a7Sjeremylt 54250756a7Sjeremylt character arg*32 55250756a7Sjeremylt 56250756a7Sjeremylt external setup,mass 57250756a7Sjeremylt 58250756a7Sjeremylt call getarg(1,arg) 59250756a7Sjeremylt 60250756a7Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 61250756a7Sjeremylt 62250756a7Sjeremylt! DoF Coordinates 63250756a7Sjeremylt do i=0,ny*2 64250756a7Sjeremylt do j=0,nx*2 65250756a7Sjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 66250756a7Sjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 67250756a7Sjeremylt enddo 68250756a7Sjeremylt enddo 69250756a7Sjeremylt 70250756a7Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 71250756a7Sjeremylt xoffset=0 72250756a7Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 73250756a7Sjeremylt 74250756a7Sjeremylt! Qdata Vectors 75250756a7Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 76250756a7Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 77250756a7Sjeremylt 78250756a7Sjeremylt! Tet Elements 79250756a7Sjeremylt do i=0,2 80250756a7Sjeremylt col=mod(i,nx) 81250756a7Sjeremylt row=i/nx 82250756a7Sjeremylt offset=col*2+row*(nx*2+1)*2 83250756a7Sjeremylt 84250756a7Sjeremylt indxtet(i*2*ptet+1)=2+offset 85250756a7Sjeremylt indxtet(i*2*ptet+2)=9+offset 86250756a7Sjeremylt indxtet(i*2*ptet+3)=16+offset 87250756a7Sjeremylt indxtet(i*2*ptet+4)=1+offset 88250756a7Sjeremylt indxtet(i*2*ptet+5)=8+offset 89250756a7Sjeremylt indxtet(i*2*ptet+6)=0+offset 90250756a7Sjeremylt 91250756a7Sjeremylt indxtet(i*2*ptet+7)=14+offset 92250756a7Sjeremylt indxtet(i*2*ptet+8)=7+offset 93250756a7Sjeremylt indxtet(i*2*ptet+9)=0+offset 94250756a7Sjeremylt indxtet(i*2*ptet+10)=15+offset 95250756a7Sjeremylt indxtet(i*2*ptet+11)=8+offset 96250756a7Sjeremylt indxtet(i*2*ptet+12)=16+offset 97250756a7Sjeremylt enddo 98250756a7Sjeremylt 99250756a7Sjeremylt! -- Restrictions 100d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,& 101a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 102250756a7Sjeremylt 103d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,& 104a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 1057509a596Sjeremylt stridesutet=[1,qtet,qtet] 106d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,& 107d979a051Sjeremylt & stridesutet,erestrictuitet,err) 108250756a7Sjeremylt 109250756a7Sjeremylt! -- Bases 110250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 111250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 112250756a7Sjeremylt & qweight,bxtet,err) 113250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 114250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 115250756a7Sjeremylt & qweight,butet,err) 116250756a7Sjeremylt 117250756a7Sjeremylt! -- QFunctions 118250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 119250756a7Sjeremylt &SOURCE_DIR& 120250756a7Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 121a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_setuptet,'weight',1,ceed_eval_weight,err) 122250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 123250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 124250756a7Sjeremylt 125250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 126250756a7Sjeremylt &SOURCE_DIR& 127250756a7Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 128250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 129250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 130250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 131250756a7Sjeremylt 132250756a7Sjeremylt! -- Operators 133250756a7Sjeremylt! ---- Setup Tet 134250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 135250756a7Sjeremylt & ceed_qfunction_none,op_setuptet,err) 136a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_setuptet,'weight',& 13715910d16Sjeremylt & ceed_elemrestriction_none,bxtet,ceed_vector_none,err) 138250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 139a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 140250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 141356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 142250756a7Sjeremylt! ---- Mass Tet 143250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 144250756a7Sjeremylt & ceed_qfunction_none,op_masstet,err) 145250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 146356036faSJeremy L Thompson ceed_basis_none,qdatatet,err) 147250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 148a8d32208Sjeremylt & butet,ceed_vector_active,err) 149250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 150a8d32208Sjeremylt & butet,ceed_vector_active,err) 151250756a7Sjeremylt 152250756a7Sjeremylt! Hex Elements 153250756a7Sjeremylt do i=0,nelemhex-1 154250756a7Sjeremylt col=mod(i,nx) 155250756a7Sjeremylt row=i/nx 156250756a7Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 157250756a7Sjeremylt do j=0,phex-1 158250756a7Sjeremylt do k=0,phex-1 159250756a7Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 160250756a7Sjeremylt enddo 161250756a7Sjeremylt enddo 162250756a7Sjeremylt enddo 163250756a7Sjeremylt 164250756a7Sjeremylt! -- Restrictions 165d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,& 166250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 167250756a7Sjeremylt 168d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,& 169250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 1707509a596Sjeremylt stridesuhex=[1,qhex*qhex,qhex*qhex] 1717509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 172d979a051Sjeremylt & 1,nqptshex,stridesuhex,erestrictuihex,err) 173250756a7Sjeremylt 174250756a7Sjeremylt! -- Bases 175250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 176250756a7Sjeremylt & bxhex,err) 177250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 178250756a7Sjeremylt & buhex,err) 179250756a7Sjeremylt 180250756a7Sjeremylt! -- QFunctions 181250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 182250756a7Sjeremylt &SOURCE_DIR& 183872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 184250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 185250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 186250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 187250756a7Sjeremylt 188250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 189250756a7Sjeremylt &SOURCE_DIR& 190872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 191250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 192250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 193250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 194250756a7Sjeremylt 195250756a7Sjeremylt! -- Operators 196250756a7Sjeremylt! ---- Setup Hex 197250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 198250756a7Sjeremylt & ceed_qfunction_none,op_setuphex,& 199250756a7Sjeremylt & err) 20015910d16Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',& 20115910d16Sjeremylt & ceed_elemrestriction_none,bxhex,ceed_vector_none,err) 202250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 203a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 204250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 205356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 206250756a7Sjeremylt! ---- Mass Hex 207250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 208250756a7Sjeremylt & ceed_qfunction_none,op_masshex,& 209250756a7Sjeremylt & err) 210250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 211356036faSJeremy L Thompson ceed_basis_none,qdatahex,err) 212250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 213a8d32208Sjeremylt & buhex,ceed_vector_active,err) 214250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 215a8d32208Sjeremylt & buhex,ceed_vector_active,err) 216250756a7Sjeremylt 217250756a7Sjeremylt! 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) 221250756a7Sjeremylt 222*ed094490SJeremy L Thompson call ceedoperatorcreatecomposite(ceed,op_mass,err) 223*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_mass,op_masstet,err) 224*ed094490SJeremy L Thompson call ceedoperatorcompositeaddsub(op_mass,op_masshex,err) 225250756a7Sjeremylt 226250756a7Sjeremylt! Apply Setup Operator 227250756a7Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 228250756a7Sjeremylt & ceed_request_immediate,err) 229250756a7Sjeremylt 230250756a7Sjeremylt! Apply Mass Operator 231250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 232250756a7Sjeremylt call ceedvectorsetvalue(u,1.d0,err) 233250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 234250756a7Sjeremylt call ceedvectorsetvalue(v,0.d0,err) 235250756a7Sjeremylt 236250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 237250756a7Sjeremylt 238250756a7Sjeremylt! Check Output 239250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 240250756a7Sjeremylt total=0. 241250756a7Sjeremylt do i=1,ndofs 242250756a7Sjeremylt total=total+hv(voffset+i) 243250756a7Sjeremylt enddo 244250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 245250756a7Sjeremylt! LCOV_EXCL_START 246250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 247250756a7Sjeremylt! LCOV_EXCL_STOP 248250756a7Sjeremylt endif 249250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 250250756a7Sjeremylt 251250756a7Sjeremylt call ceedvectorsetvalue(v,1.d0,err) 252250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 253250756a7Sjeremylt 254250756a7Sjeremylt! Check Output 255250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 256250756a7Sjeremylt total=-ndofs 257250756a7Sjeremylt do i=1,ndofs 258250756a7Sjeremylt total=total+hv(voffset+i) 259250756a7Sjeremylt enddo 260250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 261250756a7Sjeremylt! LCOV_EXCL_START 262250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 263250756a7Sjeremylt! LCOV_EXCL_STOP 264250756a7Sjeremylt endif 265250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 266250756a7Sjeremylt 267250756a7Sjeremylt! Cleanup 268250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 269250756a7Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 270250756a7Sjeremylt call ceedoperatordestroy(op_setuptet,err) 271250756a7Sjeremylt call ceedoperatordestroy(op_masstet,err) 272250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 273250756a7Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 274250756a7Sjeremylt call ceedoperatordestroy(op_setuphex,err) 275250756a7Sjeremylt call ceedoperatordestroy(op_masshex,err) 276250756a7Sjeremylt call ceedoperatordestroy(op_setup,err) 277250756a7Sjeremylt call ceedoperatordestroy(op_mass,err) 278250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 279250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 280250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 281250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 282250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 283250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 284250756a7Sjeremylt call ceedbasisdestroy(butet,err) 285250756a7Sjeremylt call ceedbasisdestroy(bxtet,err) 286250756a7Sjeremylt call ceedbasisdestroy(buhex,err) 287250756a7Sjeremylt call ceedbasisdestroy(bxhex,err) 288250756a7Sjeremylt call ceedvectordestroy(x,err) 289250756a7Sjeremylt call ceedvectordestroy(u,err) 290250756a7Sjeremylt call ceedvectordestroy(v,err) 291250756a7Sjeremylt call ceedvectordestroy(qdatatet,err) 292250756a7Sjeremylt call ceedvectordestroy(qdatahex,err) 293250756a7Sjeremylt call ceeddestroy(ceed,err) 294250756a7Sjeremylt end 295250756a7Sjeremylt!----------------------------------------------------------------------- 296