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