1*2ebaca42Sjeremylt!----------------------------------------------------------------------- 2*2ebaca42Sjeremylt! 3*2ebaca42Sjeremylt! Header with common subroutine 4*2ebaca42Sjeremylt! 5*2ebaca42Sjeremylt include 't320-basis-f.h' 6*2ebaca42Sjeremylt!----------------------------------------------------------------------- 7*2ebaca42Sjeremylt subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 8*2ebaca42Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9*2ebaca42Sjeremylt real*8 ctx 10*2ebaca42Sjeremylt real*8 u1(1) 11*2ebaca42Sjeremylt real*8 u2(1) 12*2ebaca42Sjeremylt real*8 v1(1) 13*2ebaca42Sjeremylt integer q,ierr 14*2ebaca42Sjeremylt 15*2ebaca42Sjeremylt do i=1,q 16*2ebaca42Sjeremylt v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2)) 17*2ebaca42Sjeremylt enddo 18*2ebaca42Sjeremylt 19*2ebaca42Sjeremylt ierr=0 20*2ebaca42Sjeremylt end 21*2ebaca42Sjeremylt!----------------------------------------------------------------------- 22*2ebaca42Sjeremylt subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 23*2ebaca42Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 24*2ebaca42Sjeremylt real*8 ctx 25*2ebaca42Sjeremylt real*8 u1(1) 26*2ebaca42Sjeremylt real*8 u2(1) 27*2ebaca42Sjeremylt real*8 v1(1) 28*2ebaca42Sjeremylt integer q,ierr 29*2ebaca42Sjeremylt 30*2ebaca42Sjeremylt do i=1,q 31*2ebaca42Sjeremylt v1(i)=u2(i)*u1(i) 32*2ebaca42Sjeremylt enddo 33*2ebaca42Sjeremylt 34*2ebaca42Sjeremylt ierr=0 35*2ebaca42Sjeremylt end 36*2ebaca42Sjeremylt!----------------------------------------------------------------------- 37*2ebaca42Sjeremylt program test 38*2ebaca42Sjeremylt 39*2ebaca42Sjeremylt include 'ceedf.h' 40*2ebaca42Sjeremylt 41*2ebaca42Sjeremylt integer ceed,err,i,j,k 42*2ebaca42Sjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,& 43*2ebaca42Sjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex 44*2ebaca42Sjeremylt integer bxtet,butet,bxhex,buhex 45*2ebaca42Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 46*2ebaca42Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 47*2ebaca42Sjeremylt integer qdatatet,qdatahex,x 48*2ebaca42Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 49*2ebaca42Sjeremylt integer row,col,offset 50*2ebaca42Sjeremylt parameter(nelemtet=6) 51*2ebaca42Sjeremylt parameter(ptet=6) 52*2ebaca42Sjeremylt parameter(qtet=4) 53*2ebaca42Sjeremylt parameter(nelemhex=6) 54*2ebaca42Sjeremylt parameter(phex=3) 55*2ebaca42Sjeremylt parameter(qhex=4) 56*2ebaca42Sjeremylt parameter(d=2) 57*2ebaca42Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 58*2ebaca42Sjeremylt parameter(nx=3) 59*2ebaca42Sjeremylt parameter(ny=3) 60*2ebaca42Sjeremylt parameter(nxtet=3) 61*2ebaca42Sjeremylt parameter(nytet=1) 62*2ebaca42Sjeremylt parameter(nxhex=3) 63*2ebaca42Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 64*2ebaca42Sjeremylt parameter(nqptstet=nelemtet*qtet) 65*2ebaca42Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 66*2ebaca42Sjeremylt parameter(nqpts=nqptstet+nqptshex) 67*2ebaca42Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 68*2ebaca42Sjeremylt 69*2ebaca42Sjeremylt real*8 qref(d*qtet) 70*2ebaca42Sjeremylt real*8 qweight(qtet) 71*2ebaca42Sjeremylt real*8 interp(ptet*qtet) 72*2ebaca42Sjeremylt real*8 grad(d*ptet*qtet) 73*2ebaca42Sjeremylt 74*2ebaca42Sjeremylt character arg*32 75*2ebaca42Sjeremylt 76*2ebaca42Sjeremylt external setup,mass 77*2ebaca42Sjeremylt 78*2ebaca42Sjeremylt call getarg(1,arg) 79*2ebaca42Sjeremylt 80*2ebaca42Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 81*2ebaca42Sjeremylt 82*2ebaca42Sjeremylt! DoF Coordinates 83*2ebaca42Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 84*2ebaca42Sjeremylt 85*2ebaca42Sjeremylt! Qdata Vectors 86*2ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 87*2ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 88*2ebaca42Sjeremylt 89*2ebaca42Sjeremylt! Tet Elements 90*2ebaca42Sjeremylt do i=0,2 91*2ebaca42Sjeremylt col=mod(i,nx) 92*2ebaca42Sjeremylt row=i/nx 93*2ebaca42Sjeremylt offset=col*2+row*(nx*2+1)*2 94*2ebaca42Sjeremylt 95*2ebaca42Sjeremylt indxtet(i*2*ptet+1)=2+offset 96*2ebaca42Sjeremylt indxtet(i*2*ptet+2)=9+offset 97*2ebaca42Sjeremylt indxtet(i*2*ptet+3)=16+offset 98*2ebaca42Sjeremylt indxtet(i*2*ptet+4)=1+offset 99*2ebaca42Sjeremylt indxtet(i*2*ptet+5)=8+offset 100*2ebaca42Sjeremylt indxtet(i*2*ptet+6)=0+offset 101*2ebaca42Sjeremylt 102*2ebaca42Sjeremylt indxtet(i*2*ptet+7)=14+offset 103*2ebaca42Sjeremylt indxtet(i*2*ptet+8)=7+offset 104*2ebaca42Sjeremylt indxtet(i*2*ptet+9)=0+offset 105*2ebaca42Sjeremylt indxtet(i*2*ptet+10)=15+offset 106*2ebaca42Sjeremylt indxtet(i*2*ptet+11)=8+offset 107*2ebaca42Sjeremylt indxtet(i*2*ptet+12)=16+offset 108*2ebaca42Sjeremylt enddo 109*2ebaca42Sjeremylt 110*2ebaca42Sjeremylt! -- Restrictions 111*2ebaca42Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,ndofs,d,ceed_mem_host,& 112*2ebaca42Sjeremylt & ceed_use_pointer,indxtet,erestrictxtet,err) 113*2ebaca42Sjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemtet,ptet,nelemtet*ptet,& 114*2ebaca42Sjeremylt & d,erestrictxitet,err) 115*2ebaca42Sjeremylt 116*2ebaca42Sjeremylt call ceedelemrestrictioncreate(ceed,nelemtet,ptet,ndofs,1,ceed_mem_host,& 117*2ebaca42Sjeremylt & ceed_use_pointer,indxtet,erestrictutet,err) 118*2ebaca42Sjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemtet,qtet,nqptstet,1,& 119*2ebaca42Sjeremylt & erestrictuitet,err) 120*2ebaca42Sjeremylt 121*2ebaca42Sjeremylt! -- Bases 122*2ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 123*2ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 124*2ebaca42Sjeremylt & qweight,bxtet,err) 125*2ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 126*2ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 127*2ebaca42Sjeremylt & qweight,butet,err) 128*2ebaca42Sjeremylt 129*2ebaca42Sjeremylt! -- QFunctions 130*2ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 131*2ebaca42Sjeremylt &SOURCE_DIR& 132*2ebaca42Sjeremylt &//'t520-operator.h:setup'//char(0),qf_setuptet,err) 133*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 134*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 135*2ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 136*2ebaca42Sjeremylt 137*2ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 138*2ebaca42Sjeremylt &SOURCE_DIR& 139*2ebaca42Sjeremylt &//'t520-operator.h:mass'//char(0),qf_masstet,err) 140*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 141*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 142*2ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 143*2ebaca42Sjeremylt 144*2ebaca42Sjeremylt! -- Operators 145*2ebaca42Sjeremylt! ---- Setup Tet 146*2ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 147*2ebaca42Sjeremylt & ceed_qfunction_none,op_setuptet,err) 148*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 149*2ebaca42Sjeremylt & ceed_notranspose,bxtet,ceed_vector_none,err) 150*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 151*2ebaca42Sjeremylt & ceed_notranspose,bxtet,ceed_vector_active,err) 152*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 153*2ebaca42Sjeremylt & ceed_notranspose,ceed_basis_collocated,qdatatet,err) 154*2ebaca42Sjeremylt! ---- Mass Tet 155*2ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 156*2ebaca42Sjeremylt & ceed_qfunction_none,op_masstet,err) 157*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 158*2ebaca42Sjeremylt & ceed_notranspose,ceed_basis_collocated,qdatatet,err) 159*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 160*2ebaca42Sjeremylt & ceed_notranspose,butet,ceed_vector_active,err) 161*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 162*2ebaca42Sjeremylt & ceed_notranspose,butet,ceed_vector_active,err) 163*2ebaca42Sjeremylt 164*2ebaca42Sjeremylt! Hex Elements 165*2ebaca42Sjeremylt do i=0,nelemhex-1 166*2ebaca42Sjeremylt col=mod(i,nx) 167*2ebaca42Sjeremylt row=i/nx 168*2ebaca42Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 169*2ebaca42Sjeremylt do j=0,phex-1 170*2ebaca42Sjeremylt do k=0,phex-1 171*2ebaca42Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 172*2ebaca42Sjeremylt enddo 173*2ebaca42Sjeremylt enddo 174*2ebaca42Sjeremylt enddo 175*2ebaca42Sjeremylt 176*2ebaca42Sjeremylt! -- Restrictions 177*2ebaca42Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,ndofs,d,& 178*2ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 179*2ebaca42Sjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemhex,phex*phex,& 180*2ebaca42Sjeremylt & nelemhex*phex*phex,d,erestrictxihex,err) 181*2ebaca42Sjeremylt 182*2ebaca42Sjeremylt call ceedelemrestrictioncreate(ceed,nelemhex,phex*phex,ndofs,1,& 183*2ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 184*2ebaca42Sjeremylt call ceedelemrestrictioncreateidentity(ceed,nelemhex,qhex*qhex,nqptshex,& 185*2ebaca42Sjeremylt & 1,erestrictuihex,err) 186*2ebaca42Sjeremylt 187*2ebaca42Sjeremylt! -- Bases 188*2ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 189*2ebaca42Sjeremylt & bxhex,err) 190*2ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 191*2ebaca42Sjeremylt & buhex,err) 192*2ebaca42Sjeremylt 193*2ebaca42Sjeremylt! -- QFunctions 194*2ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 195*2ebaca42Sjeremylt &SOURCE_DIR& 196*2ebaca42Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 197*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 198*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 199*2ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 200*2ebaca42Sjeremylt 201*2ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 202*2ebaca42Sjeremylt &SOURCE_DIR& 203*2ebaca42Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 204*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 205*2ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 206*2ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 207*2ebaca42Sjeremylt 208*2ebaca42Sjeremylt! -- Operators 209*2ebaca42Sjeremylt! ---- Setup Hex 210*2ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 211*2ebaca42Sjeremylt & ceed_qfunction_none,op_setuphex,err) 212*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 213*2ebaca42Sjeremylt & ceed_notranspose,bxhex,ceed_vector_none,err) 214*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 215*2ebaca42Sjeremylt & ceed_notranspose,bxhex,ceed_vector_active,err) 216*2ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 217*2ebaca42Sjeremylt & ceed_notranspose,ceed_basis_collocated,qdatahex,err) 218*2ebaca42Sjeremylt! ---- Mass Hex 219*2ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 220*2ebaca42Sjeremylt & ceed_qfunction_none,op_masshex,err) 221*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 222*2ebaca42Sjeremylt & ceed_notranspose,ceed_basis_collocated,qdatahex,err) 223*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 224*2ebaca42Sjeremylt & ceed_notranspose,buhex,ceed_vector_active,err) 225*2ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 226*2ebaca42Sjeremylt & ceed_notranspose,buhex,ceed_vector_active,err) 227*2ebaca42Sjeremylt 228*2ebaca42Sjeremylt! Composite Operators 229*2ebaca42Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 230*2ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 231*2ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 232*2ebaca42Sjeremylt 233*2ebaca42Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 234*2ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 235*2ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 236*2ebaca42Sjeremylt 237*2ebaca42Sjeremylt! View 238*2ebaca42Sjeremylt call ceedoperatorview(op_setup,err) 239*2ebaca42Sjeremylt call ceedoperatorview(op_mass,err) 240*2ebaca42Sjeremylt 241*2ebaca42Sjeremylt! Cleanup 242*2ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 243*2ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 244*2ebaca42Sjeremylt call ceedoperatordestroy(op_setuptet,err) 245*2ebaca42Sjeremylt call ceedoperatordestroy(op_masstet,err) 246*2ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 247*2ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 248*2ebaca42Sjeremylt call ceedoperatordestroy(op_setuphex,err) 249*2ebaca42Sjeremylt call ceedoperatordestroy(op_masshex,err) 250*2ebaca42Sjeremylt call ceedoperatordestroy(op_setup,err) 251*2ebaca42Sjeremylt call ceedoperatordestroy(op_mass,err) 252*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 253*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 254*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 255*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 256*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 257*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 258*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 259*2ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 260*2ebaca42Sjeremylt call ceedbasisdestroy(butet,err) 261*2ebaca42Sjeremylt call ceedbasisdestroy(bxtet,err) 262*2ebaca42Sjeremylt call ceedbasisdestroy(buhex,err) 263*2ebaca42Sjeremylt call ceedbasisdestroy(bxhex,err) 264*2ebaca42Sjeremylt call ceedvectordestroy(x,err) 265*2ebaca42Sjeremylt call ceedvectordestroy(qdatatet,err) 266*2ebaca42Sjeremylt call ceedvectordestroy(qdatahex,err) 267*2ebaca42Sjeremylt call ceeddestroy(ceed,err) 268*2ebaca42Sjeremylt end 269*2ebaca42Sjeremylt!----------------------------------------------------------------------- 270