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*15910d16Sjeremylt integer stridesutet(3),stridesuhex(3) 45*15910d16Sjeremylt integer erestrictxtet,erestrictutet,erestrictuitet,& 46*15910d16Sjeremylt& erestrictxhex,erestrictuhex,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) 130250756a7Sjeremylt 13161dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemtet,ptet,ndofs,1,& 132a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 1337509a596Sjeremylt stridesutet=[1,qtet,qtet] 1347509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,nqptstet,& 1357509a596Sjeremylt & 1,stridesutet,erestrictuitet,err) 136250756a7Sjeremylt 137250756a7Sjeremylt! -- Bases 138250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 139250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 140250756a7Sjeremylt & qweight,bxtet,err) 141250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 142250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 143250756a7Sjeremylt & qweight,butet,err) 144250756a7Sjeremylt 145250756a7Sjeremylt! -- QFunctions 146250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 147250756a7Sjeremylt &SOURCE_DIR& 148250756a7Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 149250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 150250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 151250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 152250756a7Sjeremylt 153250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 154250756a7Sjeremylt &SOURCE_DIR& 155250756a7Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 156250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 157250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 158250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 159250756a7Sjeremylt 160250756a7Sjeremylt! -- Operators 161250756a7Sjeremylt! ---- Setup Tet 162250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 163250756a7Sjeremylt & ceed_qfunction_none,op_setuptet,err) 164*15910d16Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',& 165*15910d16Sjeremylt & ceed_elemrestriction_none,bxtet,ceed_vector_none,err) 166250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 167a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 168250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 169a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 170250756a7Sjeremylt! ---- Mass Tet 171250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 172250756a7Sjeremylt & ceed_qfunction_none,op_masstet,err) 173250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 174a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 175250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 176a8d32208Sjeremylt & butet,ceed_vector_active,err) 177250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 178a8d32208Sjeremylt & butet,ceed_vector_active,err) 179250756a7Sjeremylt 180250756a7Sjeremylt! Hex Elements 181250756a7Sjeremylt do i=0,nelemhex-1 182250756a7Sjeremylt col=mod(i,nx) 183250756a7Sjeremylt row=i/nx 184250756a7Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 185250756a7Sjeremylt do j=0,phex-1 186250756a7Sjeremylt do k=0,phex-1 187250756a7Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 188250756a7Sjeremylt enddo 189250756a7Sjeremylt enddo 190250756a7Sjeremylt enddo 191250756a7Sjeremylt 192250756a7Sjeremylt! -- Restrictions 19361dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,d,& 194250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 195250756a7Sjeremylt 19661dbc9d2Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelemhex,phex*phex,ndofs,1,& 197250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 1987509a596Sjeremylt stridesuhex=[1,qhex*qhex,qhex*qhex] 1997509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 2007509a596Sjeremylt & nqptshex,1,stridesuhex,erestrictuihex,err) 201250756a7Sjeremylt 202250756a7Sjeremylt! -- Bases 203250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 204250756a7Sjeremylt & bxhex,err) 205250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 206250756a7Sjeremylt & buhex,err) 207250756a7Sjeremylt 208250756a7Sjeremylt! -- QFunctions 209250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 210250756a7Sjeremylt &SOURCE_DIR& 211872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 212250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 213250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 214250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 215250756a7Sjeremylt 216250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 217250756a7Sjeremylt &SOURCE_DIR& 218872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 219250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 220250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 221250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 222250756a7Sjeremylt 223250756a7Sjeremylt! -- Operators 224250756a7Sjeremylt! ---- Setup Hex 225250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 226250756a7Sjeremylt & ceed_qfunction_none,op_setuphex,& 227250756a7Sjeremylt & err) 228*15910d16Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',& 229*15910d16Sjeremylt & ceed_elemrestriction_none,bxhex,ceed_vector_none,err) 230250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 231a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 232250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 233a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 234250756a7Sjeremylt! ---- Mass Hex 235250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 236250756a7Sjeremylt & ceed_qfunction_none,op_masshex,& 237250756a7Sjeremylt & err) 238250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 239a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 240250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 241a8d32208Sjeremylt & buhex,ceed_vector_active,err) 242250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 243a8d32208Sjeremylt & buhex,ceed_vector_active,err) 244250756a7Sjeremylt 245250756a7Sjeremylt! Composite Operators 246250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 247250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 248250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 249250756a7Sjeremylt 250250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 251250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 252250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 253250756a7Sjeremylt 254250756a7Sjeremylt! Apply Setup Operator 255250756a7Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 256250756a7Sjeremylt & ceed_request_immediate,err) 257250756a7Sjeremylt 258250756a7Sjeremylt! Apply Mass Operator 259250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 260250756a7Sjeremylt call ceedvectorsetvalue(u,1.d0,err) 261250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 262250756a7Sjeremylt call ceedvectorsetvalue(v,0.d0,err) 263250756a7Sjeremylt 264250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 265250756a7Sjeremylt 266250756a7Sjeremylt! Check Output 267250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 268250756a7Sjeremylt total=0. 269250756a7Sjeremylt do i=1,ndofs 270250756a7Sjeremylt total=total+hv(voffset+i) 271250756a7Sjeremylt enddo 272250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 273250756a7Sjeremylt! LCOV_EXCL_START 274250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 275250756a7Sjeremylt! LCOV_EXCL_STOP 276250756a7Sjeremylt endif 277250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 278250756a7Sjeremylt 279250756a7Sjeremylt call ceedvectorsetvalue(v,1.d0,err) 280250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 281250756a7Sjeremylt 282250756a7Sjeremylt! Check Output 283250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 284250756a7Sjeremylt total=-ndofs 285250756a7Sjeremylt do i=1,ndofs 286250756a7Sjeremylt total=total+hv(voffset+i) 287250756a7Sjeremylt enddo 288250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 289250756a7Sjeremylt! LCOV_EXCL_START 290250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 291250756a7Sjeremylt! LCOV_EXCL_STOP 292250756a7Sjeremylt endif 293250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 294250756a7Sjeremylt 295250756a7Sjeremylt! Cleanup 296250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 297250756a7Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 298250756a7Sjeremylt call ceedoperatordestroy(op_setuptet,err) 299250756a7Sjeremylt call ceedoperatordestroy(op_masstet,err) 300250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 301250756a7Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 302250756a7Sjeremylt call ceedoperatordestroy(op_setuphex,err) 303250756a7Sjeremylt call ceedoperatordestroy(op_masshex,err) 304250756a7Sjeremylt call ceedoperatordestroy(op_setup,err) 305250756a7Sjeremylt call ceedoperatordestroy(op_mass,err) 306250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 307250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 308250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 309250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 310250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 311250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 312250756a7Sjeremylt call ceedbasisdestroy(butet,err) 313250756a7Sjeremylt call ceedbasisdestroy(bxtet,err) 314250756a7Sjeremylt call ceedbasisdestroy(buhex,err) 315250756a7Sjeremylt call ceedbasisdestroy(bxhex,err) 316250756a7Sjeremylt call ceedvectordestroy(x,err) 317250756a7Sjeremylt call ceedvectordestroy(u,err) 318250756a7Sjeremylt call ceedvectordestroy(v,err) 319250756a7Sjeremylt call ceedvectordestroy(qdatatet,err) 320250756a7Sjeremylt call ceedvectordestroy(qdatahex,err) 321250756a7Sjeremylt call ceeddestroy(ceed,err) 322250756a7Sjeremylt end 323250756a7Sjeremylt!----------------------------------------------------------------------- 324