1250756a7Sjeremylt!----------------------------------------------------------------------- 2250756a7Sjeremylt! 3250756a7Sjeremylt! Header with common subroutine 4250756a7Sjeremylt! 5250756a7Sjeremylt include 't320-basis-f.h' 6250756a7Sjeremylt!----------------------------------------------------------------------- 7250756a7Sjeremylt subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 8250756a7Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9250756a7Sjeremylt real*8 ctx 10250756a7Sjeremylt real*8 u1(1) 11250756a7Sjeremylt real*8 u2(1) 12250756a7Sjeremylt real*8 v1(1) 13250756a7Sjeremylt integer q,ierr 14250756a7Sjeremylt 15250756a7Sjeremylt do i=1,q 16250756a7Sjeremylt v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2)) 17250756a7Sjeremylt enddo 18250756a7Sjeremylt 19250756a7Sjeremylt ierr=0 20250756a7Sjeremylt end 21250756a7Sjeremylt!----------------------------------------------------------------------- 22250756a7Sjeremylt subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 23250756a7Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 24250756a7Sjeremylt real*8 ctx 25250756a7Sjeremylt real*8 u1(1) 26250756a7Sjeremylt real*8 u2(1) 27250756a7Sjeremylt real*8 v1(1) 28250756a7Sjeremylt integer q,ierr 29250756a7Sjeremylt 30250756a7Sjeremylt do i=1,q 31250756a7Sjeremylt v1(i)=u2(i)*u1(i) 32250756a7Sjeremylt enddo 33250756a7Sjeremylt 34250756a7Sjeremylt ierr=0 35250756a7Sjeremylt end 36250756a7Sjeremylt!----------------------------------------------------------------------- 37250756a7Sjeremylt program test 38250756a7Sjeremylt 39250756a7Sjeremylt include 'ceedf.h' 40250756a7Sjeremylt 41250756a7Sjeremylt integer ceed,err,i,j,k 4261dbc9d2Sjeremylt integer imode 4361dbc9d2Sjeremylt parameter(imode=ceed_noninterlaced) 44*7509a596Sjeremylt integer stridesxtet(3),stridesutet(3),stridesxhex(3),stridesuhex(3) 45250756a7Sjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,& 46250756a7Sjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex 47250756a7Sjeremylt integer bxtet,butet,bxhex,buhex 48250756a7Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 49250756a7Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 50250756a7Sjeremylt integer qdatatet,qdatahex,x,u,v 51250756a7Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 52250756a7Sjeremylt integer row,col,offset 53250756a7Sjeremylt parameter(nelemtet=6) 54250756a7Sjeremylt parameter(ptet=6) 55250756a7Sjeremylt parameter(qtet=4) 56250756a7Sjeremylt parameter(nelemhex=6) 57250756a7Sjeremylt parameter(phex=3) 58250756a7Sjeremylt parameter(qhex=4) 59250756a7Sjeremylt parameter(d=2) 60250756a7Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 61250756a7Sjeremylt parameter(nx=3) 62250756a7Sjeremylt parameter(ny=3) 63250756a7Sjeremylt parameter(nxtet=3) 64250756a7Sjeremylt parameter(nytet=1) 65250756a7Sjeremylt parameter(nxhex=3) 66250756a7Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 67250756a7Sjeremylt parameter(nqptstet=nelemtet*qtet) 68250756a7Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 69250756a7Sjeremylt parameter(nqpts=nqptstet+nqptshex) 70250756a7Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 71250756a7Sjeremylt real*8 arrx(d*ndofs) 72250756a7Sjeremylt integer*8 voffset,xoffset 73250756a7Sjeremylt 74250756a7Sjeremylt real*8 qref(d*qtet) 75250756a7Sjeremylt real*8 qweight(qtet) 76250756a7Sjeremylt real*8 interp(ptet*qtet) 77250756a7Sjeremylt real*8 grad(d*ptet*qtet) 78250756a7Sjeremylt 79250756a7Sjeremylt real*8 hv(ndofs) 80250756a7Sjeremylt real*8 total 81250756a7Sjeremylt 82250756a7Sjeremylt character arg*32 83250756a7Sjeremylt 84250756a7Sjeremylt external setup,mass 85250756a7Sjeremylt 86250756a7Sjeremylt call getarg(1,arg) 87250756a7Sjeremylt 88250756a7Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 89250756a7Sjeremylt 90250756a7Sjeremylt! DoF Coordinates 91250756a7Sjeremylt do i=0,ny*2 92250756a7Sjeremylt do j=0,nx*2 93250756a7Sjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 94250756a7Sjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 95250756a7Sjeremylt enddo 96250756a7Sjeremylt enddo 97250756a7Sjeremylt 98250756a7Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 99250756a7Sjeremylt xoffset=0 100250756a7Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 101250756a7Sjeremylt 102250756a7Sjeremylt! Qdata Vectors 103250756a7Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 104250756a7Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 105250756a7Sjeremylt 106250756a7Sjeremylt! Tet Elements 107250756a7Sjeremylt do i=0,2 108250756a7Sjeremylt col=mod(i,nx) 109250756a7Sjeremylt row=i/nx 110250756a7Sjeremylt offset=col*2+row*(nx*2+1)*2 111250756a7Sjeremylt 112250756a7Sjeremylt indxtet(i*2*ptet+1)=2+offset 113250756a7Sjeremylt indxtet(i*2*ptet+2)=9+offset 114250756a7Sjeremylt indxtet(i*2*ptet+3)=16+offset 115250756a7Sjeremylt indxtet(i*2*ptet+4)=1+offset 116250756a7Sjeremylt indxtet(i*2*ptet+5)=8+offset 117250756a7Sjeremylt indxtet(i*2*ptet+6)=0+offset 118250756a7Sjeremylt 119250756a7Sjeremylt indxtet(i*2*ptet+7)=14+offset 120250756a7Sjeremylt indxtet(i*2*ptet+8)=7+offset 121250756a7Sjeremylt indxtet(i*2*ptet+9)=0+offset 122250756a7Sjeremylt indxtet(i*2*ptet+10)=15+offset 123250756a7Sjeremylt indxtet(i*2*ptet+11)=8+offset 124250756a7Sjeremylt indxtet(i*2*ptet+12)=16+offset 125250756a7Sjeremylt enddo 126250756a7Sjeremylt 127250756a7Sjeremylt! -- Restrictions 12861dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,d,& 129a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 130*7509a596Sjeremylt stridesxtet=[1,ptet,ptet*d] 131*7509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,ptet,& 132*7509a596Sjeremylt & nelemtet*ptet,d,stridesxtet,erestrictxitet,err) 133250756a7Sjeremylt 13461dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,1,& 135a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 136*7509a596Sjeremylt stridesutet=[1,qtet,qtet] 137*7509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,nqptstet,& 138*7509a596Sjeremylt & 1,stridesutet,erestrictuitet,err) 139250756a7Sjeremylt 140250756a7Sjeremylt! -- Bases 141250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 142250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 143250756a7Sjeremylt & qweight,bxtet,err) 144250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 145250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 146250756a7Sjeremylt & qweight,butet,err) 147250756a7Sjeremylt 148250756a7Sjeremylt! -- QFunctions 149250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 150250756a7Sjeremylt &SOURCE_DIR& 151250756a7Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 152250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 153250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 154250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 155250756a7Sjeremylt 156250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 157250756a7Sjeremylt &SOURCE_DIR& 158250756a7Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 159250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 160250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 161250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 162250756a7Sjeremylt 163250756a7Sjeremylt! -- Operators 164250756a7Sjeremylt! ---- Setup Tet 165250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 166250756a7Sjeremylt & ceed_qfunction_none,op_setuptet,err) 167250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 168a8d32208Sjeremylt & bxtet,ceed_vector_none,err) 169250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 170a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 171250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 172a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 173250756a7Sjeremylt! ---- Mass Tet 174250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 175250756a7Sjeremylt & ceed_qfunction_none,op_masstet,err) 176250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 177a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 178250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 179a8d32208Sjeremylt & butet,ceed_vector_active,err) 180250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 181a8d32208Sjeremylt & butet,ceed_vector_active,err) 182250756a7Sjeremylt 183250756a7Sjeremylt! Hex Elements 184250756a7Sjeremylt do i=0,nelemhex-1 185250756a7Sjeremylt col=mod(i,nx) 186250756a7Sjeremylt row=i/nx 187250756a7Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 188250756a7Sjeremylt do j=0,phex-1 189250756a7Sjeremylt do k=0,phex-1 190250756a7Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 191250756a7Sjeremylt enddo 192250756a7Sjeremylt enddo 193250756a7Sjeremylt enddo 194250756a7Sjeremylt 195250756a7Sjeremylt! -- Restrictions 19661dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,d,& 197250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 198*7509a596Sjeremylt stridesxhex=[1,phex*phex,phex*phex*d] 199*7509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,phex*phex,& 200*7509a596Sjeremylt & nelemhex*phex*phex,d,stridesxhex,erestrictxihex,err) 201250756a7Sjeremylt 20261dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,1,& 203250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 204*7509a596Sjeremylt stridesuhex=[1,qhex*qhex,qhex*qhex] 205*7509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 206*7509a596Sjeremylt & nqptshex,1,stridesuhex,erestrictuihex,err) 207250756a7Sjeremylt 208250756a7Sjeremylt! -- Bases 209250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 210250756a7Sjeremylt & bxhex,err) 211250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 212250756a7Sjeremylt & buhex,err) 213250756a7Sjeremylt 214250756a7Sjeremylt! -- QFunctions 215250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 216250756a7Sjeremylt &SOURCE_DIR& 217872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 218250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 219250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 220250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 221250756a7Sjeremylt 222250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 223250756a7Sjeremylt &SOURCE_DIR& 224872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 225250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 226250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 227250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 228250756a7Sjeremylt 229250756a7Sjeremylt! -- Operators 230250756a7Sjeremylt! ---- Setup Hex 231250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 232250756a7Sjeremylt & ceed_qfunction_none,op_setuphex,& 233250756a7Sjeremylt & err) 234250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 235a8d32208Sjeremylt & bxhex,ceed_vector_none,err) 236250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 237a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 238250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 239a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 240250756a7Sjeremylt! ---- Mass Hex 241250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 242250756a7Sjeremylt & ceed_qfunction_none,op_masshex,& 243250756a7Sjeremylt & err) 244250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 245a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 246250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 247a8d32208Sjeremylt & buhex,ceed_vector_active,err) 248250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 249a8d32208Sjeremylt & buhex,ceed_vector_active,err) 250250756a7Sjeremylt 251250756a7Sjeremylt! Composite Operators 252250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 253250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 254250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 255250756a7Sjeremylt 256250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 257250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 258250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 259250756a7Sjeremylt 260250756a7Sjeremylt! Apply Setup Operator 261250756a7Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 262250756a7Sjeremylt & ceed_request_immediate,err) 263250756a7Sjeremylt 264250756a7Sjeremylt! Apply Mass Operator 265250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 266250756a7Sjeremylt call ceedvectorsetvalue(u,1.d0,err) 267250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 268250756a7Sjeremylt call ceedvectorsetvalue(v,0.d0,err) 269250756a7Sjeremylt 270250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 271250756a7Sjeremylt 272250756a7Sjeremylt! Check Output 273250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 274250756a7Sjeremylt total=0. 275250756a7Sjeremylt do i=1,ndofs 276250756a7Sjeremylt total=total+hv(voffset+i) 277250756a7Sjeremylt enddo 278250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 279250756a7Sjeremylt! LCOV_EXCL_START 280250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 281250756a7Sjeremylt! LCOV_EXCL_STOP 282250756a7Sjeremylt endif 283250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 284250756a7Sjeremylt 285250756a7Sjeremylt call ceedvectorsetvalue(v,1.d0,err) 286250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 287250756a7Sjeremylt 288250756a7Sjeremylt! Check Output 289250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 290250756a7Sjeremylt total=-ndofs 291250756a7Sjeremylt do i=1,ndofs 292250756a7Sjeremylt total=total+hv(voffset+i) 293250756a7Sjeremylt enddo 294250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 295250756a7Sjeremylt! LCOV_EXCL_START 296250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 297250756a7Sjeremylt! LCOV_EXCL_STOP 298250756a7Sjeremylt endif 299250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 300250756a7Sjeremylt 301250756a7Sjeremylt! Cleanup 302250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 303250756a7Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 304250756a7Sjeremylt call ceedoperatordestroy(op_setuptet,err) 305250756a7Sjeremylt call ceedoperatordestroy(op_masstet,err) 306250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 307250756a7Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 308250756a7Sjeremylt call ceedoperatordestroy(op_setuphex,err) 309250756a7Sjeremylt call ceedoperatordestroy(op_masshex,err) 310250756a7Sjeremylt call ceedoperatordestroy(op_setup,err) 311250756a7Sjeremylt call ceedoperatordestroy(op_mass,err) 312250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 313250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 314250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 315250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 316250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 317250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 318250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 319250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 320250756a7Sjeremylt call ceedbasisdestroy(butet,err) 321250756a7Sjeremylt call ceedbasisdestroy(bxtet,err) 322250756a7Sjeremylt call ceedbasisdestroy(buhex,err) 323250756a7Sjeremylt call ceedbasisdestroy(bxhex,err) 324250756a7Sjeremylt call ceedvectordestroy(x,err) 325250756a7Sjeremylt call ceedvectordestroy(u,err) 326250756a7Sjeremylt call ceedvectordestroy(v,err) 327250756a7Sjeremylt call ceedvectordestroy(qdatatet,err) 328250756a7Sjeremylt call ceedvectordestroy(qdatahex,err) 329250756a7Sjeremylt call ceeddestroy(ceed,err) 330250756a7Sjeremylt end 331250756a7Sjeremylt!----------------------------------------------------------------------- 332