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 42*a8d32208Sjeremylt integer lmode 43*a8d32208Sjeremylt parameter(lmode=ceed_notranspose) 44250756a7Sjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,& 45250756a7Sjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex 46250756a7Sjeremylt integer bxtet,butet,bxhex,buhex 47250756a7Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 48250756a7Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 49250756a7Sjeremylt integer qdatatet,qdatahex,x,u,v 50250756a7Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 51250756a7Sjeremylt integer row,col,offset 52250756a7Sjeremylt parameter(nelemtet=6) 53250756a7Sjeremylt parameter(ptet=6) 54250756a7Sjeremylt parameter(qtet=4) 55250756a7Sjeremylt parameter(nelemhex=6) 56250756a7Sjeremylt parameter(phex=3) 57250756a7Sjeremylt parameter(qhex=4) 58250756a7Sjeremylt parameter(d=2) 59250756a7Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 60250756a7Sjeremylt parameter(nx=3) 61250756a7Sjeremylt parameter(ny=3) 62250756a7Sjeremylt parameter(nxtet=3) 63250756a7Sjeremylt parameter(nytet=1) 64250756a7Sjeremylt parameter(nxhex=3) 65250756a7Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 66250756a7Sjeremylt parameter(nqptstet=nelemtet*qtet) 67250756a7Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 68250756a7Sjeremylt parameter(nqpts=nqptstet+nqptshex) 69250756a7Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 70250756a7Sjeremylt real*8 arrx(d*ndofs) 71250756a7Sjeremylt integer*8 voffset,xoffset 72250756a7Sjeremylt 73250756a7Sjeremylt real*8 qref(d*qtet) 74250756a7Sjeremylt real*8 qweight(qtet) 75250756a7Sjeremylt real*8 interp(ptet*qtet) 76250756a7Sjeremylt real*8 grad(d*ptet*qtet) 77250756a7Sjeremylt 78250756a7Sjeremylt real*8 hv(ndofs) 79250756a7Sjeremylt real*8 total 80250756a7Sjeremylt 81250756a7Sjeremylt character arg*32 82250756a7Sjeremylt 83250756a7Sjeremylt external setup,mass 84250756a7Sjeremylt 85250756a7Sjeremylt call getarg(1,arg) 86250756a7Sjeremylt 87250756a7Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 88250756a7Sjeremylt 89250756a7Sjeremylt! DoF Coordinates 90250756a7Sjeremylt do i=0,ny*2 91250756a7Sjeremylt do j=0,nx*2 92250756a7Sjeremylt arrx(i+j*(ny*2+1)+0*ndofs+1)=1.d0*i/(2*ny) 93250756a7Sjeremylt arrx(i+j*(ny*2+1)+1*ndofs+1)=1.d0*j/(2*nx) 94250756a7Sjeremylt enddo 95250756a7Sjeremylt enddo 96250756a7Sjeremylt 97250756a7Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 98250756a7Sjeremylt xoffset=0 99250756a7Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 100250756a7Sjeremylt 101250756a7Sjeremylt! Qdata Vectors 102250756a7Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 103250756a7Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 104250756a7Sjeremylt 105250756a7Sjeremylt! Tet Elements 106250756a7Sjeremylt do i=0,2 107250756a7Sjeremylt col=mod(i,nx) 108250756a7Sjeremylt row=i/nx 109250756a7Sjeremylt offset=col*2+row*(nx*2+1)*2 110250756a7Sjeremylt 111250756a7Sjeremylt indxtet(i*2*ptet+1)=2+offset 112250756a7Sjeremylt indxtet(i*2*ptet+2)=9+offset 113250756a7Sjeremylt indxtet(i*2*ptet+3)=16+offset 114250756a7Sjeremylt indxtet(i*2*ptet+4)=1+offset 115250756a7Sjeremylt indxtet(i*2*ptet+5)=8+offset 116250756a7Sjeremylt indxtet(i*2*ptet+6)=0+offset 117250756a7Sjeremylt 118250756a7Sjeremylt indxtet(i*2*ptet+7)=14+offset 119250756a7Sjeremylt indxtet(i*2*ptet+8)=7+offset 120250756a7Sjeremylt indxtet(i*2*ptet+9)=0+offset 121250756a7Sjeremylt indxtet(i*2*ptet+10)=15+offset 122250756a7Sjeremylt indxtet(i*2*ptet+11)=8+offset 123250756a7Sjeremylt indxtet(i*2*ptet+12)=16+offset 124250756a7Sjeremylt enddo 125250756a7Sjeremylt 126250756a7Sjeremylt! -- Restrictions 127*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,d,& 128*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 129*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,ptet,& 130*a8d32208Sjeremylt & nelemtet*ptet,d,erestrictxitet,err) 131250756a7Sjeremylt 132*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,1,& 133*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 134*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,qtet,nqptstet,& 135*a8d32208Sjeremylt & 1,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) 164250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 165*a8d32208Sjeremylt & bxtet,ceed_vector_none,err) 166250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 167*a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 168250756a7Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 169*a8d32208Sjeremylt & 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,& 174*a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 175250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 176*a8d32208Sjeremylt & butet,ceed_vector_active,err) 177250756a7Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 178*a8d32208Sjeremylt & 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 193*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,d,& 194250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 195*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,phex*phex,& 196250756a7Sjeremylt & nelemhex*phex*phex,d,erestrictxihex,err) 197250756a7Sjeremylt 198*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,1,& 199250756a7Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 200*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,qhex*qhex,& 201*a8d32208Sjeremylt & nqptshex,1,erestrictuihex,err) 202250756a7Sjeremylt 203250756a7Sjeremylt! -- Bases 204250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 205250756a7Sjeremylt & bxhex,err) 206250756a7Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 207250756a7Sjeremylt & buhex,err) 208250756a7Sjeremylt 209250756a7Sjeremylt! -- QFunctions 210250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 211250756a7Sjeremylt &SOURCE_DIR& 212872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 213250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 214250756a7Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 215250756a7Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 216250756a7Sjeremylt 217250756a7Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 218250756a7Sjeremylt &SOURCE_DIR& 219872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 220250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 221250756a7Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 222250756a7Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 223250756a7Sjeremylt 224250756a7Sjeremylt! -- Operators 225250756a7Sjeremylt! ---- Setup Hex 226250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 227250756a7Sjeremylt & ceed_qfunction_none,op_setuphex,& 228250756a7Sjeremylt & err) 229250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 230*a8d32208Sjeremylt & bxhex,ceed_vector_none,err) 231250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 232*a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 233250756a7Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 234*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 235250756a7Sjeremylt! ---- Mass Hex 236250756a7Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 237250756a7Sjeremylt & ceed_qfunction_none,op_masshex,& 238250756a7Sjeremylt & err) 239250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 240*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 241250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 242*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 243250756a7Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 244*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 245250756a7Sjeremylt 246250756a7Sjeremylt! Composite Operators 247250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 248250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 249250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 250250756a7Sjeremylt 251250756a7Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 252250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 253250756a7Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 254250756a7Sjeremylt 255250756a7Sjeremylt! Apply Setup Operator 256250756a7Sjeremylt call ceedoperatorapply(op_setup,x,ceed_vector_none,& 257250756a7Sjeremylt & ceed_request_immediate,err) 258250756a7Sjeremylt 259250756a7Sjeremylt! Apply Mass Operator 260250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 261250756a7Sjeremylt call ceedvectorsetvalue(u,1.d0,err) 262250756a7Sjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 263250756a7Sjeremylt call ceedvectorsetvalue(v,0.d0,err) 264250756a7Sjeremylt 265250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 266250756a7Sjeremylt 267250756a7Sjeremylt! Check Output 268250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 269250756a7Sjeremylt total=0. 270250756a7Sjeremylt do i=1,ndofs 271250756a7Sjeremylt total=total+hv(voffset+i) 272250756a7Sjeremylt enddo 273250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 274250756a7Sjeremylt! LCOV_EXCL_START 275250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 276250756a7Sjeremylt! LCOV_EXCL_STOP 277250756a7Sjeremylt endif 278250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 279250756a7Sjeremylt 280250756a7Sjeremylt call ceedvectorsetvalue(v,1.d0,err) 281250756a7Sjeremylt call ceedoperatorapplyadd(op_mass,u,v,ceed_request_immediate,err) 282250756a7Sjeremylt 283250756a7Sjeremylt! Check Output 284250756a7Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 285250756a7Sjeremylt total=-ndofs 286250756a7Sjeremylt do i=1,ndofs 287250756a7Sjeremylt total=total+hv(voffset+i) 288250756a7Sjeremylt enddo 289250756a7Sjeremylt if (abs(total-1.)>1.0d-10) then 290250756a7Sjeremylt! LCOV_EXCL_START 291250756a7Sjeremylt write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 292250756a7Sjeremylt! LCOV_EXCL_STOP 293250756a7Sjeremylt endif 294250756a7Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 295250756a7Sjeremylt 296250756a7Sjeremylt! Cleanup 297250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 298250756a7Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 299250756a7Sjeremylt call ceedoperatordestroy(op_setuptet,err) 300250756a7Sjeremylt call ceedoperatordestroy(op_masstet,err) 301250756a7Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 302250756a7Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 303250756a7Sjeremylt call ceedoperatordestroy(op_setuphex,err) 304250756a7Sjeremylt call ceedoperatordestroy(op_masshex,err) 305250756a7Sjeremylt call ceedoperatordestroy(op_setup,err) 306250756a7Sjeremylt call ceedoperatordestroy(op_mass,err) 307250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 308250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 309250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 310250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 311250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 312250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 313250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 314250756a7Sjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 315250756a7Sjeremylt call ceedbasisdestroy(butet,err) 316250756a7Sjeremylt call ceedbasisdestroy(bxtet,err) 317250756a7Sjeremylt call ceedbasisdestroy(buhex,err) 318250756a7Sjeremylt call ceedbasisdestroy(bxhex,err) 319250756a7Sjeremylt call ceedvectordestroy(x,err) 320250756a7Sjeremylt call ceedvectordestroy(u,err) 321250756a7Sjeremylt call ceedvectordestroy(v,err) 322250756a7Sjeremylt call ceedvectordestroy(qdatatet,err) 323250756a7Sjeremylt call ceedvectordestroy(qdatahex,err) 324250756a7Sjeremylt call ceeddestroy(ceed,err) 325250756a7Sjeremylt end 326250756a7Sjeremylt!----------------------------------------------------------------------- 327