1*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 2*b7ec98d8SJeremy L Thompson! 3*b7ec98d8SJeremy L Thompson! Header with common subroutine 4*b7ec98d8SJeremy L Thompson! 5*b7ec98d8SJeremy L Thompson include 't320-basis-f.h' 6*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 7*b7ec98d8SJeremy L Thompson subroutine setup_mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,& 8*b7ec98d8SJeremy L Thompson& u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,& 9*b7ec98d8SJeremy L Thompson& v16,ierr) 10*b7ec98d8SJeremy L Thompson real*8 ctx 11*b7ec98d8SJeremy L Thompson real*8 u1(1) 12*b7ec98d8SJeremy L Thompson real*8 u2(1) 13*b7ec98d8SJeremy L Thompson real*8 v1(1) 14*b7ec98d8SJeremy L Thompson integer q,ierr 15*b7ec98d8SJeremy L Thompson 16*b7ec98d8SJeremy L Thompson do i=1,q 17*b7ec98d8SJeremy L Thompson v1(i)=u2(i)*(u1(i+q*0)*u1(i+q*3)-u1(i+q*1)*u1(i+q*2)) 18*b7ec98d8SJeremy L Thompson enddo 19*b7ec98d8SJeremy L Thompson 20*b7ec98d8SJeremy L Thompson ierr=0 21*b7ec98d8SJeremy L Thompson end 22*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 23*b7ec98d8SJeremy L Thompson subroutine setup_diff(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,& 24*b7ec98d8SJeremy L Thompson& u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,& 25*b7ec98d8SJeremy L Thompson& v16,ierr) 26*b7ec98d8SJeremy L Thompson real*8 ctx 27*b7ec98d8SJeremy L Thompson real*8 u1(1) 28*b7ec98d8SJeremy L Thompson real*8 u2(1) 29*b7ec98d8SJeremy L Thompson real*8 v1(1) 30*b7ec98d8SJeremy L Thompson real*8 w 31*b7ec98d8SJeremy L Thompson integer q,ierr 32*b7ec98d8SJeremy L Thompson 33*b7ec98d8SJeremy L Thompson do i=1,q 34*b7ec98d8SJeremy L Thompson w=u2(i)/(u1(i+q*0)*u1(i+q*3)-u1(i+q*1)*u1(i+q*2)) 35*b7ec98d8SJeremy L Thompson v1(i+q*0)=w*(u1(i+q*2)*u1(i+q*2)+u1(i+q*3)*u1(i+q*3)) 36*b7ec98d8SJeremy L Thompson v1(i+q*1)=w*(u1(i+q*0)*u1(i+q*0)+u1(i+q*1)*u1(i+q*1)) 37*b7ec98d8SJeremy L Thompson v1(i+q*2)=-w*(u1(i+q*0)*u1(i+q*2)+u1(i+q*2)*u1(i+q*3)) 38*b7ec98d8SJeremy L Thompson enddo 39*b7ec98d8SJeremy L Thompson 40*b7ec98d8SJeremy L Thompson ierr=0 41*b7ec98d8SJeremy L Thompson end 42*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 43*b7ec98d8SJeremy L Thompson subroutine apply(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 44*b7ec98d8SJeremy L Thompson& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 45*b7ec98d8SJeremy L Thompson real*8 ctx 46*b7ec98d8SJeremy L Thompson real*8 u1(1) 47*b7ec98d8SJeremy L Thompson real*8 u2(1) 48*b7ec98d8SJeremy L Thompson real*8 u3(1) 49*b7ec98d8SJeremy L Thompson real*8 u4(1) 50*b7ec98d8SJeremy L Thompson real*8 v1(1) 51*b7ec98d8SJeremy L Thompson real*8 v2(1) 52*b7ec98d8SJeremy L Thompson real*8 du0,du1 53*b7ec98d8SJeremy L Thompson integer q,ierr 54*b7ec98d8SJeremy L Thompson 55*b7ec98d8SJeremy L Thompson do i=1,q 56*b7ec98d8SJeremy L Thompson! mass 57*b7ec98d8SJeremy L Thompson v1(i) = u2(i)*u4(i) 58*b7ec98d8SJeremy L Thompson! diff 59*b7ec98d8SJeremy L Thompson du0=u1(i+q*0) 60*b7ec98d8SJeremy L Thompson du1=u1(i+q*1) 61*b7ec98d8SJeremy L Thompson v2(i+q*0)=u3(i+q*0)*du0+u3(i+q*2)*du1 62*b7ec98d8SJeremy L Thompson v2(i+q*1)=u3(i+q*2)*du0+u3(i+q*1)*du1 63*b7ec98d8SJeremy L Thompson enddo 64*b7ec98d8SJeremy L Thompson 65*b7ec98d8SJeremy L Thompson ierr=0 66*b7ec98d8SJeremy L Thompson end 67*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 68*b7ec98d8SJeremy L Thompson program test 69*b7ec98d8SJeremy L Thompson 70*b7ec98d8SJeremy L Thompson include 'ceedf.h' 71*b7ec98d8SJeremy L Thompson 72*b7ec98d8SJeremy L Thompson integer ceed,err,i 73*b7ec98d8SJeremy L Thompson integer erestrictx,erestrictu,erestrictxi,erestrictui,erestrictqi 74*b7ec98d8SJeremy L Thompson integer bx,bu 75*b7ec98d8SJeremy L Thompson integer qf_setup_mass,qf_setup_diff,qf_apply 76*b7ec98d8SJeremy L Thompson integer op_setup_mass,op_setup_diff,op_apply 77*b7ec98d8SJeremy L Thompson integer qdata_mass,qdata_diff,x,a,u,v 78*b7ec98d8SJeremy L Thompson integer nelem,p,q,d 79*b7ec98d8SJeremy L Thompson integer row,col,offset 80*b7ec98d8SJeremy L Thompson parameter(nelem=12) 81*b7ec98d8SJeremy L Thompson parameter(p=6) 82*b7ec98d8SJeremy L Thompson parameter(q=4) 83*b7ec98d8SJeremy L Thompson parameter(d=2) 84*b7ec98d8SJeremy L Thompson integer ndofs,nqpts,nx,ny 85*b7ec98d8SJeremy L Thompson parameter(nx=3) 86*b7ec98d8SJeremy L Thompson parameter(ny=2) 87*b7ec98d8SJeremy L Thompson parameter(ndofs=(nx*2+1)*(ny*2+1)) 88*b7ec98d8SJeremy L Thompson parameter(nqpts=nelem*q*q) 89*b7ec98d8SJeremy L Thompson integer indx(nelem*p*p) 90*b7ec98d8SJeremy L Thompson real*8 arrx(d*ndofs),aa(nqpts),uu(ndofs),vv(ndofs),atrue(ndofs) 91*b7ec98d8SJeremy L Thompson integer*8 xoffset,aoffset,uoffset,voffset 92*b7ec98d8SJeremy L Thompson 93*b7ec98d8SJeremy L Thompson real*8 qref(d*q) 94*b7ec98d8SJeremy L Thompson real*8 qweight(q) 95*b7ec98d8SJeremy L Thompson real*8 interp(p*q) 96*b7ec98d8SJeremy L Thompson real*8 grad(d*p*q) 97*b7ec98d8SJeremy L Thompson 98*b7ec98d8SJeremy L Thompson character arg*32 99*b7ec98d8SJeremy L Thompson 100*b7ec98d8SJeremy L Thompson external setup_mass,setup_diff,apply,apply_lin 101*b7ec98d8SJeremy L Thompson 102*b7ec98d8SJeremy L Thompson call getarg(1,arg) 103*b7ec98d8SJeremy L Thompson 104*b7ec98d8SJeremy L Thompson call ceedinit(trim(arg)//char(0),ceed,err) 105*b7ec98d8SJeremy L Thompson 106*b7ec98d8SJeremy L Thompson! DoF Coordinates 107*b7ec98d8SJeremy L Thompson do i=0,ndofs-1 108*b7ec98d8SJeremy L Thompson arrx(i+1)=mod(i,(nx*2+1)) 109*b7ec98d8SJeremy L Thompson arrx(i+1)=arrx(i+1)*(1.d0/(nx*2.d0)) 110*b7ec98d8SJeremy L Thompson val=(i/(nx*2+1)) 111*b7ec98d8SJeremy L Thompson arrx(i+1+ndofs)=val*(1.d0/(ny*2.d0)) 112*b7ec98d8SJeremy L Thompson enddo 113*b7ec98d8SJeremy L Thompson call ceedvectorcreate(ceed,d*ndofs,x,err) 114*b7ec98d8SJeremy L Thompson xoffset=0 115*b7ec98d8SJeremy L Thompson call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 116*b7ec98d8SJeremy L Thompson 117*b7ec98d8SJeremy L Thompson! Qdata Vector 118*b7ec98d8SJeremy L Thompson call ceedvectorcreate(ceed,nqpts,qdata_mass,err) 119*b7ec98d8SJeremy L Thompson call ceedvectorcreate(ceed,nqpts*d*(d+1)/2,qdata_diff,err) 120*b7ec98d8SJeremy L Thompson 121*b7ec98d8SJeremy L Thompson! Element Setup 122*b7ec98d8SJeremy L Thompson do i=0,5 123*b7ec98d8SJeremy L Thompson col=mod(i,nx) 124*b7ec98d8SJeremy L Thompson row=i/nx 125*b7ec98d8SJeremy L Thompson offset=col*2+row*(nx*2+1)*2 126*b7ec98d8SJeremy L Thompson 127*b7ec98d8SJeremy L Thompson indx(i*2*p+1)=2+offset 128*b7ec98d8SJeremy L Thompson indx(i*2*p+2)=9+offset 129*b7ec98d8SJeremy L Thompson indx(i*2*p+3)=16+offset 130*b7ec98d8SJeremy L Thompson indx(i*2*p+4)=1+offset 131*b7ec98d8SJeremy L Thompson indx(i*2*p+5)=8+offset 132*b7ec98d8SJeremy L Thompson indx(i*2*p+6)=0+offset 133*b7ec98d8SJeremy L Thompson 134*b7ec98d8SJeremy L Thompson indx(i*2*p+7)=14+offset 135*b7ec98d8SJeremy L Thompson indx(i*2*p+8)=7+offset 136*b7ec98d8SJeremy L Thompson indx(i*2*p+9)=0+offset 137*b7ec98d8SJeremy L Thompson indx(i*2*p+10)=15+offset 138*b7ec98d8SJeremy L Thompson indx(i*2*p+11)=8+offset 139*b7ec98d8SJeremy L Thompson indx(i*2*p+12)=16+offset 140*b7ec98d8SJeremy L Thompson enddo 141*b7ec98d8SJeremy L Thompson 142*b7ec98d8SJeremy L Thompson! Restrictions 143*b7ec98d8SJeremy L Thompson call ceedelemrestrictioncreate(ceed,nelem,p,ndofs,d,ceed_mem_host,& 144*b7ec98d8SJeremy L Thompson & ceed_use_pointer,indx,erestrictx,err) 145*b7ec98d8SJeremy L Thompson call ceedelemrestrictioncreateidentity(ceed,nelem,p,nelem*p,d,& 146*b7ec98d8SJeremy L Thompson & erestrictxi,err) 147*b7ec98d8SJeremy L Thompson 148*b7ec98d8SJeremy L Thompson call ceedelemrestrictioncreate(ceed,nelem,p,ndofs,1,ceed_mem_host,& 149*b7ec98d8SJeremy L Thompson & ceed_use_pointer,indx,erestrictu,err) 150*b7ec98d8SJeremy L Thompson call ceedelemrestrictioncreateidentity(ceed,nelem,q,nqpts,1,& 151*b7ec98d8SJeremy L Thompson & erestrictui,err) 152*b7ec98d8SJeremy L Thompson 153*b7ec98d8SJeremy L Thompson call ceedelemrestrictioncreateidentity(ceed,nelem,q,nqpts,d*(d+1)/2,& 154*b7ec98d8SJeremy L Thompson & erestrictqi,err) 155*b7ec98d8SJeremy L Thompson 156*b7ec98d8SJeremy L Thompson! Bases 157*b7ec98d8SJeremy L Thompson call buildmats(qref,qweight,interp,grad) 158*b7ec98d8SJeremy L Thompson call ceedbasiscreateh1(ceed,ceed_triangle,d,p,q,interp,grad,qref,qweight,& 159*b7ec98d8SJeremy L Thompson & bx,err) 160*b7ec98d8SJeremy L Thompson call buildmats(qref,qweight,interp,grad) 161*b7ec98d8SJeremy L Thompson call ceedbasiscreateh1(ceed,ceed_triangle,1,p,q,interp,grad,qref,qweight,& 162*b7ec98d8SJeremy L Thompson & bu,err) 163*b7ec98d8SJeremy L Thompson 164*b7ec98d8SJeremy L Thompson! QFunction - setup mass 165*b7ec98d8SJeremy L Thompson call ceedqfunctioncreateinterior(ceed,1,setup_mass,& 166*b7ec98d8SJeremy L Thompson &SOURCE_DIR& 167*b7ec98d8SJeremy L Thompson &//'t532-operator.h:setup_mass'//char(0),qf_setup_mass,err) 168*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_setup_mass,'dx',d*d,ceed_eval_grad,err) 169*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_setup_mass,'_weight',1,ceed_eval_weight,err) 170*b7ec98d8SJeremy L Thompson call ceedqfunctionaddoutput(qf_setup_mass,'qdata',1,ceed_eval_none,err) 171*b7ec98d8SJeremy L Thompson 172*b7ec98d8SJeremy L Thompson! Operator - setup mass 173*b7ec98d8SJeremy L Thompson call ceedoperatorcreate(ceed,qf_setup_mass,ceed_null,ceed_null,& 174*b7ec98d8SJeremy L Thompson & op_setup_mass,err) 175*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_mass,'dx',erestrictx,& 176*b7ec98d8SJeremy L Thompson & ceed_notranspose,bx,ceed_vector_active,err) 177*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_mass,'_weight',erestrictxi,& 178*b7ec98d8SJeremy L Thompson & ceed_notranspose,bx,ceed_vector_none,err) 179*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_mass,'qdata',erestrictui,& 180*b7ec98d8SJeremy L Thompson & ceed_notranspose,ceed_basis_collocated,ceed_vector_active,err) 181*b7ec98d8SJeremy L Thompson 182*b7ec98d8SJeremy L Thompson! QFunction - setup diff 183*b7ec98d8SJeremy L Thompson call ceedqfunctioncreateinterior(ceed,1,setup_diff,& 184*b7ec98d8SJeremy L Thompson &SOURCE_DIR& 185*b7ec98d8SJeremy L Thompson &//'t532-operator.h:setup_diff'//char(0),qf_setup_diff,err) 186*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_setup_diff,'dx',d*d,ceed_eval_grad,err) 187*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_setup_diff,'_weight',1,ceed_eval_weight,err) 188*b7ec98d8SJeremy L Thompson call ceedqfunctionaddoutput(qf_setup_diff,'qdata',& 189*b7ec98d8SJeremy L Thompson & d*(d+1)/2,ceed_eval_none,err) 190*b7ec98d8SJeremy L Thompson 191*b7ec98d8SJeremy L Thompson! Operator - setup diff 192*b7ec98d8SJeremy L Thompson call ceedoperatorcreate(ceed,qf_setup_diff,ceed_null,ceed_null,& 193*b7ec98d8SJeremy L Thompson & op_setup_diff,err) 194*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_diff,'dx',erestrictx,& 195*b7ec98d8SJeremy L Thompson & ceed_notranspose,bx,ceed_vector_active,err) 196*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_diff,'_weight',erestrictxi,& 197*b7ec98d8SJeremy L Thompson & ceed_notranspose,bx,ceed_vector_none,err) 198*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_setup_diff,'qdata',erestrictqi,& 199*b7ec98d8SJeremy L Thompson & ceed_notranspose,ceed_basis_collocated,ceed_vector_active,err) 200*b7ec98d8SJeremy L Thompson 201*b7ec98d8SJeremy L Thompson! Apply Setup Operators 202*b7ec98d8SJeremy L Thompson call ceedoperatorapply(op_setup_mass,x,qdata_mass,& 203*b7ec98d8SJeremy L Thompson & ceed_request_immediate,err) 204*b7ec98d8SJeremy L Thompson call ceedoperatorapply(op_setup_diff,x,qdata_diff,& 205*b7ec98d8SJeremy L Thompson & ceed_request_immediate,err) 206*b7ec98d8SJeremy L Thompson 207*b7ec98d8SJeremy L Thompson! QFunction - apply 208*b7ec98d8SJeremy L Thompson call ceedqfunctioncreateinterior(ceed,1,apply,& 209*b7ec98d8SJeremy L Thompson &SOURCE_DIR& 210*b7ec98d8SJeremy L Thompson &//'t532-operator.h:apply'//char(0),qf_apply,err) 211*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_apply,'du',d,ceed_eval_grad,err) 212*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_apply,'qdata_mass',1,ceed_eval_none,err) 213*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_apply,'qdata_diff',& 214*b7ec98d8SJeremy L Thompson & d*(d+1)/2,ceed_eval_none,err) 215*b7ec98d8SJeremy L Thompson call ceedqfunctionaddinput(qf_apply,'u',1,ceed_eval_interp,err) 216*b7ec98d8SJeremy L Thompson call ceedqfunctionaddoutput(qf_apply,'v',1,ceed_eval_interp,err) 217*b7ec98d8SJeremy L Thompson call ceedqfunctionaddoutput(qf_apply,'dv',d,ceed_eval_grad,err) 218*b7ec98d8SJeremy L Thompson 219*b7ec98d8SJeremy L Thompson! Operator - apply 220*b7ec98d8SJeremy L Thompson call ceedoperatorcreate(ceed,qf_apply,ceed_null,ceed_null,op_apply,& 221*b7ec98d8SJeremy L Thompson & err) 222*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'du',erestrictu,& 223*b7ec98d8SJeremy L Thompson & ceed_notranspose,bu,ceed_vector_active,err) 224*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'qdata_mass',erestrictui,& 225*b7ec98d8SJeremy L Thompson & ceed_notranspose,ceed_basis_collocated,qdata_mass,err) 226*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'qdata_diff',erestrictqi,& 227*b7ec98d8SJeremy L Thompson & ceed_notranspose,ceed_basis_collocated,qdata_diff,err) 228*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'u',erestrictu,& 229*b7ec98d8SJeremy L Thompson & ceed_notranspose,bu,ceed_vector_active,err) 230*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'v',erestrictu,& 231*b7ec98d8SJeremy L Thompson & ceed_notranspose,bu,ceed_vector_active,err) 232*b7ec98d8SJeremy L Thompson call ceedoperatorsetfield(op_apply,'dv',erestrictu,& 233*b7ec98d8SJeremy L Thompson & ceed_notranspose,bu,ceed_vector_active,err) 234*b7ec98d8SJeremy L Thompson 235*b7ec98d8SJeremy L Thompson! Assemble Diagonal 236*b7ec98d8SJeremy L Thompson call ceedoperatorassemblelineardiagonal(op_apply,a,& 237*b7ec98d8SJeremy L Thompson & ceed_request_immediate,err) 238*b7ec98d8SJeremy L Thompson 239*b7ec98d8SJeremy L Thompson! Manually assemble diagonal 240*b7ec98d8SJeremy L Thompson call ceedvectorcreate(ceed,ndofs,u,err) 241*b7ec98d8SJeremy L Thompson call ceedvectorsetvalue(u,0.d0,err) 242*b7ec98d8SJeremy L Thompson call ceedvectorcreate(ceed,ndofs,v,err) 243*b7ec98d8SJeremy L Thompson do i=1,ndofs 244*b7ec98d8SJeremy L Thompson call ceedvectorgetarray(u,ceed_mem_host,uu,uoffset,err) 245*b7ec98d8SJeremy L Thompson uu(i+uoffset)=1.d0 246*b7ec98d8SJeremy L Thompson if (i>1) then 247*b7ec98d8SJeremy L Thompson uu(i-1+uoffset)=0.d0 248*b7ec98d8SJeremy L Thompson endif 249*b7ec98d8SJeremy L Thompson call ceedvectorrestorearray(u,uu,uoffset,err) 250*b7ec98d8SJeremy L Thompson 251*b7ec98d8SJeremy L Thompson call ceedoperatorapply(op_apply,u,v,ceed_request_immediate,err) 252*b7ec98d8SJeremy L Thompson 253*b7ec98d8SJeremy L Thompson call ceedvectorgetarrayread(v,ceed_mem_host,vv,voffset,err) 254*b7ec98d8SJeremy L Thompson atrue(i)=vv(voffset+i) 255*b7ec98d8SJeremy L Thompson call ceedvectorrestorearrayread(v,vv,voffset,err) 256*b7ec98d8SJeremy L Thompson enddo 257*b7ec98d8SJeremy L Thompson 258*b7ec98d8SJeremy L Thompson! Check Output 259*b7ec98d8SJeremy L Thompson call ceedvectorgetarrayread(a,ceed_mem_host,aa,aoffset,err) 260*b7ec98d8SJeremy L Thompson do i=1,ndofs 261*b7ec98d8SJeremy L Thompson if (abs(aa(aoffset+i)-atrue(i))>1.0d-14) then 262*b7ec98d8SJeremy L Thompson! LCOV_EXCL_START 263*b7ec98d8SJeremy L Thompson write(*,*) '[',i,'] Error in assembly: ',aa(aoffset+i),' != ',& 264*b7ec98d8SJeremy L Thompson & atrue(i) 265*b7ec98d8SJeremy L Thompson! LCOV_EXCL_STOP 266*b7ec98d8SJeremy L Thompson endif 267*b7ec98d8SJeremy L Thompson enddo 268*b7ec98d8SJeremy L Thompson call ceedvectorrestorearrayread(a,aa,aoffset,err) 269*b7ec98d8SJeremy L Thompson 270*b7ec98d8SJeremy L Thompson! Cleanup 271*b7ec98d8SJeremy L Thompson call ceedqfunctiondestroy(qf_setup_mass,err) 272*b7ec98d8SJeremy L Thompson call ceedqfunctiondestroy(qf_setup_diff,err) 273*b7ec98d8SJeremy L Thompson call ceedqfunctiondestroy(qf_apply,err) 274*b7ec98d8SJeremy L Thompson call ceedoperatordestroy(op_setup_mass,err) 275*b7ec98d8SJeremy L Thompson call ceedoperatordestroy(op_setup_diff,err) 276*b7ec98d8SJeremy L Thompson call ceedoperatordestroy(op_apply,err) 277*b7ec98d8SJeremy L Thompson call ceedelemrestrictiondestroy(erestrictu,err) 278*b7ec98d8SJeremy L Thompson call ceedelemrestrictiondestroy(erestrictx,err) 279*b7ec98d8SJeremy L Thompson call ceedelemrestrictiondestroy(erestrictxi,err) 280*b7ec98d8SJeremy L Thompson call ceedelemrestrictiondestroy(erestrictui,err) 281*b7ec98d8SJeremy L Thompson call ceedelemrestrictiondestroy(erestrictqi,err) 282*b7ec98d8SJeremy L Thompson call ceedbasisdestroy(bu,err) 283*b7ec98d8SJeremy L Thompson call ceedbasisdestroy(bx,err) 284*b7ec98d8SJeremy L Thompson call ceedvectordestroy(x,err) 285*b7ec98d8SJeremy L Thompson call ceedvectordestroy(a,err) 286*b7ec98d8SJeremy L Thompson call ceedvectordestroy(u,err) 287*b7ec98d8SJeremy L Thompson call ceedvectordestroy(v,err) 288*b7ec98d8SJeremy L Thompson call ceedvectordestroy(qdata_mass,err) 289*b7ec98d8SJeremy L Thompson call ceedvectordestroy(qdata_diff,err) 290*b7ec98d8SJeremy L Thompson call ceeddestroy(ceed,err) 291*b7ec98d8SJeremy L Thompson end 292*b7ec98d8SJeremy L Thompson!----------------------------------------------------------------------- 293