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 4215910d16Sjeremylt integer stridesutet(3),stridesuhex(3) 4315910d16Sjeremylt integer erestrictxtet,erestrictutet,erestrictuitet,& 4415910d16Sjeremylt& erestrictxhex,erestrictuhex,erestrictuihex 45250756a7Sjeremylt integer bxtet,butet,bxhex,buhex 46250756a7Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 47250756a7Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 48250756a7Sjeremylt integer qdatatet,qdatahex,x,u,v 49250756a7Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 50250756a7Sjeremylt integer row,col,offset 51250756a7Sjeremylt parameter(nelemtet=6) 52250756a7Sjeremylt parameter(ptet=6) 53250756a7Sjeremylt parameter(qtet=4) 54250756a7Sjeremylt parameter(nelemhex=6) 55250756a7Sjeremylt parameter(phex=3) 56250756a7Sjeremylt parameter(qhex=4) 57250756a7Sjeremylt parameter(d=2) 58250756a7Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 59250756a7Sjeremylt parameter(nx=3) 60250756a7Sjeremylt parameter(ny=3) 61250756a7Sjeremylt parameter(nxtet=3) 62250756a7Sjeremylt parameter(nytet=1) 63250756a7Sjeremylt parameter(nxhex=3) 64250756a7Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 65250756a7Sjeremylt parameter(nqptstet=nelemtet*qtet) 66250756a7Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 67250756a7Sjeremylt parameter(nqpts=nqptstet+nqptshex) 68250756a7Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 69250756a7Sjeremylt real*8 arrx(d*ndofs) 70250756a7Sjeremylt integer*8 voffset,xoffset 71250756a7Sjeremylt 72250756a7Sjeremylt real*8 qref(d*qtet) 73250756a7Sjeremylt real*8 qweight(qtet) 74250756a7Sjeremylt real*8 interp(ptet*qtet) 75250756a7Sjeremylt real*8 grad(d*ptet*qtet) 76250756a7Sjeremylt 77250756a7Sjeremylt real*8 hv(ndofs) 78250756a7Sjeremylt real*8 total 79250756a7Sjeremylt 80250756a7Sjeremylt character arg*32 81250756a7Sjeremylt 82250756a7Sjeremylt external setup,mass 83250756a7Sjeremylt 84250756a7Sjeremylt call getarg(1,arg) 85250756a7Sjeremylt 86250756a7Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 87250756a7Sjeremylt 88250756a7Sjeremylt! DoF Coordinates 89250756a7Sjeremylt do i=0,ny*2 90250756a7Sjeremylt do j=0,nx*2 91250756a7Sjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 92250756a7Sjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 93250756a7Sjeremylt enddo 94250756a7Sjeremylt enddo 95250756a7Sjeremylt 96250756a7Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 97250756a7Sjeremylt xoffset=0 98250756a7Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 99250756a7Sjeremylt 100250756a7Sjeremylt! Qdata Vectors 101250756a7Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 102250756a7Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 103250756a7Sjeremylt 104250756a7Sjeremylt! Tet Elements 105250756a7Sjeremylt do i=0,2 106250756a7Sjeremylt col=mod(i,nx) 107250756a7Sjeremylt row=i/nx 108250756a7Sjeremylt offset=col*2+row*(nx*2+1)*2 109250756a7Sjeremylt 110250756a7Sjeremylt indxtet(i*2*ptet+1)=2+offset 111250756a7Sjeremylt indxtet(i*2*ptet+2)=9+offset 112250756a7Sjeremylt indxtet(i*2*ptet+3)=16+offset 113250756a7Sjeremylt indxtet(i*2*ptet+4)=1+offset 114250756a7Sjeremylt indxtet(i*2*ptet+5)=8+offset 115250756a7Sjeremylt indxtet(i*2*ptet+6)=0+offset 116250756a7Sjeremylt 117250756a7Sjeremylt indxtet(i*2*ptet+7)=14+offset 118250756a7Sjeremylt indxtet(i*2*ptet+8)=7+offset 119250756a7Sjeremylt indxtet(i*2*ptet+9)=0+offset 120250756a7Sjeremylt indxtet(i*2*ptet+10)=15+offset 121250756a7Sjeremylt indxtet(i*2*ptet+11)=8+offset 122250756a7Sjeremylt indxtet(i*2*ptet+12)=16+offset 123250756a7Sjeremylt enddo 124250756a7Sjeremylt 125250756a7Sjeremylt! -- Restrictions 126*d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,d,ndofs,d*ndofs,& 127a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 128250756a7Sjeremylt 129*d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,1,1,ndofs,& 130a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 1317509a596Sjeremylt stridesutet=[1,qtet,qtet] 132*d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemtet,qtet,1,nqptstet,& 133*d979a051Sjeremylt & stridesutet,erestrictuitet,err) 134250756a7Sjeremylt 135250756a7Sjeremylt! -- Bases 136250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 137250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 138250756a7Sjeremylt & qweight,bxtet,err) 139250756a7Sjeremylt call buildmats(qref,qweight,interp,grad) 140250756a7Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 141250756a7Sjeremylt & qweight,butet,err) 142250756a7Sjeremylt 143250756a7Sjeremylt! -- QFunctions 144250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 145250756a7Sjeremylt &SOURCE_DIR& 146250756a7Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 147250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 148250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 149250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 150250756a7Sjeremylt 151250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 152250756a7Sjeremylt &SOURCE_DIR& 153250756a7Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 154250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 155250756a7Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 156250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 157250756a7Sjeremylt 158250756a7Sjeremylt! -- Operators 159250756a7Sjeremylt! ---- Setup Tet 160250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 161250756a7Sjeremylt & ceed_qfunction_none,op_setuptet,err) 16215910d16Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',& 16315910d16Sjeremylt & ceed_elemrestriction_none,bxtet,ceed_vector_none,err) 164250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 165a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 166250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 167a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 168250756a7Sjeremylt! ---- Mass Tet 169250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 170250756a7Sjeremylt & ceed_qfunction_none,op_masstet,err) 171250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 172a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 173250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 174a8d32208Sjeremylt & butet,ceed_vector_active,err) 175250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 176a8d32208Sjeremylt & butet,ceed_vector_active,err) 177250756a7Sjeremylt 178250756a7Sjeremylt! Hex Elements 179250756a7Sjeremylt do i=0,nelemhex-1 180250756a7Sjeremylt col=mod(i,nx) 181250756a7Sjeremylt row=i/nx 182250756a7Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 183250756a7Sjeremylt do j=0,phex-1 184250756a7Sjeremylt do k=0,phex-1 185250756a7Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 186250756a7Sjeremylt enddo 187250756a7Sjeremylt enddo 188250756a7Sjeremylt enddo 189250756a7Sjeremylt 190250756a7Sjeremylt! -- Restrictions 191*d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,d,ndofs,d*ndofs,& 192250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 193250756a7Sjeremylt 194*d979a051Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,1,1,ndofs,& 195250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 1967509a596Sjeremylt stridesuhex=[1,qhex*qhex,qhex*qhex] 1977509a596Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelemhex,qhex*qhex,& 198*d979a051Sjeremylt & 1,nqptshex,stridesuhex,erestrictuihex,err) 199250756a7Sjeremylt 200250756a7Sjeremylt! -- Bases 201250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 202250756a7Sjeremylt & bxhex,err) 203250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 204250756a7Sjeremylt & buhex,err) 205250756a7Sjeremylt 206250756a7Sjeremylt! -- QFunctions 207250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 208250756a7Sjeremylt &SOURCE_DIR& 209872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 210250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 211250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 212250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 213250756a7Sjeremylt 214250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 215250756a7Sjeremylt &SOURCE_DIR& 216872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 217250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 218250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 219250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 220250756a7Sjeremylt 221250756a7Sjeremylt! -- Operators 222250756a7Sjeremylt! ---- Setup Hex 223250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 224250756a7Sjeremylt & ceed_qfunction_none,op_setuphex,& 225250756a7Sjeremylt & err) 22615910d16Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',& 22715910d16Sjeremylt & ceed_elemrestriction_none,bxhex,ceed_vector_none,err) 228250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 229a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 230250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 231a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 232250756a7Sjeremylt! ---- Mass Hex 233250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 234250756a7Sjeremylt & ceed_qfunction_none,op_masshex,& 235250756a7Sjeremylt & err) 236250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 237a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 238250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 239a8d32208Sjeremylt & buhex,ceed_vector_active,err) 240250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 241a8d32208Sjeremylt & buhex,ceed_vector_active,err) 242250756a7Sjeremylt 243250756a7Sjeremylt! Composite Operators 244250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 245250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 246250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 247250756a7Sjeremylt 248250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 249250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 250250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 251250756a7Sjeremylt 252250756a7Sjeremylt! Apply Setup Operator 253250756a7Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 254250756a7Sjeremylt & ceed_request_immediate,err) 255250756a7Sjeremylt 256250756a7Sjeremylt! Apply Mass Operator 257250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 258250756a7Sjeremylt call ceedvectorsetvalue(u,1.d0,err) 259250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 260250756a7Sjeremylt call ceedvectorsetvalue(v,0.d0,err) 261250756a7Sjeremylt 262250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 263250756a7Sjeremylt 264250756a7Sjeremylt! Check Output 265250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 266250756a7Sjeremylt total=0. 267250756a7Sjeremylt do i=1,ndofs 268250756a7Sjeremylt total=total+hv(voffset+i) 269250756a7Sjeremylt enddo 270250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 271250756a7Sjeremylt! LCOV_EXCL_START 272250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 273250756a7Sjeremylt! LCOV_EXCL_STOP 274250756a7Sjeremylt endif 275250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 276250756a7Sjeremylt 277250756a7Sjeremylt call ceedvectorsetvalue(v,1.d0,err) 278250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 279250756a7Sjeremylt 280250756a7Sjeremylt! Check Output 281250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 282250756a7Sjeremylt total=-ndofs 283250756a7Sjeremylt do i=1,ndofs 284250756a7Sjeremylt total=total+hv(voffset+i) 285250756a7Sjeremylt enddo 286250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 287250756a7Sjeremylt! LCOV_EXCL_START 288250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 289250756a7Sjeremylt! LCOV_EXCL_STOP 290250756a7Sjeremylt endif 291250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 292250756a7Sjeremylt 293250756a7Sjeremylt! Cleanup 294250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 295250756a7Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 296250756a7Sjeremylt call ceedoperatordestroy(op_setuptet,err) 297250756a7Sjeremylt call ceedoperatordestroy(op_masstet,err) 298250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 299250756a7Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 300250756a7Sjeremylt call ceedoperatordestroy(op_setuphex,err) 301250756a7Sjeremylt call ceedoperatordestroy(op_masshex,err) 302250756a7Sjeremylt call ceedoperatordestroy(op_setup,err) 303250756a7Sjeremylt call ceedoperatordestroy(op_mass,err) 304250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 305250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 306250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 307250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 308250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 309250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 310250756a7Sjeremylt call ceedbasisdestroy(butet,err) 311250756a7Sjeremylt call ceedbasisdestroy(bxtet,err) 312250756a7Sjeremylt call ceedbasisdestroy(buhex,err) 313250756a7Sjeremylt call ceedbasisdestroy(bxhex,err) 314250756a7Sjeremylt call ceedvectordestroy(x,err) 315250756a7Sjeremylt call ceedvectordestroy(u,err) 316250756a7Sjeremylt call ceedvectordestroy(v,err) 317250756a7Sjeremylt call ceedvectordestroy(qdatatet,err) 318250756a7Sjeremylt call ceedvectordestroy(qdatahex,err) 319250756a7Sjeremylt call ceeddestroy(ceed,err) 320250756a7Sjeremylt end 321250756a7Sjeremylt!----------------------------------------------------------------------- 322