1!----------------------------------------------------------------------- 2! 3! Header with common subroutine 4! 5 include 't320-basis-f.h' 6!----------------------------------------------------------------------- 7 subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 8& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9 real*8 ctx 10 real*8 u1(1) 11 real*8 u2(1) 12 real*8 v1(1) 13 integer q,ierr 14 15 do i=1,q 16 v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2)) 17 enddo 18 19 ierr=0 20 end 21!----------------------------------------------------------------------- 22 subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 23& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 24 real*8 ctx 25 real*8 u1(1) 26 real*8 u2(1) 27 real*8 v1(1) 28 integer q,ierr 29 30 do i=1,q 31 v1(i)=u2(i)*u1(i) 32 enddo 33 34 ierr=0 35 end 36!----------------------------------------------------------------------- 37 program test 38 39 include 'ceedf.h' 40 41 integer ceed,err,i 42 integer lmode 43 parameter(lmode=ceed_notranspose) 44 integer erestrictx,erestrictu,erestrictxi,erestrictui 45 integer bx,bu 46 integer qf_setup,qf_mass 47 integer op_setup,op_mass 48 integer qdata,x,u,v 49 integer nelem,p,q,d 50 integer val,row,col,offset 51 parameter(nelem=12) 52 parameter(p=6) 53 parameter(q=4) 54 parameter(d=2) 55 integer ndofs,nqpts,nx,ny 56 parameter(nx=3) 57 parameter(ny=2) 58 parameter(ndofs=(nx*2+1)*(ny*2+1)) 59 parameter(nqpts=nelem*q) 60 integer indx(nelem*p) 61 real*8 arrx(d*ndofs) 62 integer*8 voffset,xoffset 63 64 real*8 qref(d*q) 65 real*8 qweight(q) 66 real*8 interp(p*q) 67 real*8 grad(d*p*q) 68 real*8 total 69 70 real*8 hv(ndofs) 71 72 character arg*32 73 74 external setup,mass 75 76 call getarg(1,arg) 77 78 call ceedinit(trim(arg)//char(0),ceed,err) 79 80 do i=0,ndofs-1 81 arrx(i+1)=mod(i,(nx*2+1)) 82 arrx(i+1)=arrx(i+1)*(1.d0/(nx*2.d0)) 83 val=(i/(nx*2+1)) 84 arrx(i+1+ndofs)=val*(1.d0/(ny*2.d0)) 85 enddo 86 do i=0,5 87 col=mod(i,nx) 88 row=i/nx 89 offset=col*2+row*(nx*2+1)*2 90 91 indx(i*2*p+1)=2+offset 92 indx(i*2*p+2)=9+offset 93 indx(i*2*p+3)=16+offset 94 indx(i*2*p+4)=1+offset 95 indx(i*2*p+5)=8+offset 96 indx(i*2*p+6)=0+offset 97 98 indx(i*2*p+7)=14+offset 99 indx(i*2*p+8)=7+offset 100 indx(i*2*p+9)=0+offset 101 indx(i*2*p+10)=15+offset 102 indx(i*2*p+11)=8+offset 103 indx(i*2*p+12)=16+offset 104 enddo 105 106 call ceedelemrestrictioncreate(ceed,lmode,nelem,p,ndofs,d,ceed_mem_host,& 107 & ceed_use_pointer,indx,erestrictx,err) 108 call ceedelemrestrictioncreateidentity(ceed,lmode,nelem,p,nelem*p,d,& 109 & erestrictxi,err) 110 111 call ceedelemrestrictioncreate(ceed,lmode,nelem,p,ndofs,1,ceed_mem_host,& 112 & ceed_use_pointer,indx,erestrictu,err) 113 call ceedelemrestrictioncreateidentity(ceed,lmode,nelem,q,nqpts,1,& 114 & erestrictui,err) 115 116 call buildmats(qref,qweight,interp,grad) 117 call ceedbasiscreateh1(ceed,ceed_triangle,d,p,q,interp,grad,qref,qweight,& 118 & bx,err) 119 call buildmats(qref,qweight,interp,grad) 120 call ceedbasiscreateh1(ceed,ceed_triangle,1,p,q,interp,grad,qref,qweight,& 121 & bu,err) 122 123 call ceedqfunctioncreateinterior(ceed,1,setup,& 124 &SOURCE_DIR& 125 &//'t510-operator.h:setup'//char(0),qf_setup,err) 126 call ceedqfunctionaddinput(qf_setup,'_weight',1,ceed_eval_weight,err) 127 call ceedqfunctionaddinput(qf_setup,'x',d*d,ceed_eval_grad,err) 128 call ceedqfunctionaddoutput(qf_setup,'rho',1,ceed_eval_none,err) 129 130 call ceedqfunctioncreateinterior(ceed,1,mass,& 131 &SOURCE_DIR& 132 &//'t510-operator.h:mass'//char(0),qf_mass,err) 133 call ceedqfunctionaddinput(qf_mass,'rho',1,ceed_eval_none,err) 134 call ceedqfunctionaddinput(qf_mass,'u',1,ceed_eval_interp,err) 135 call ceedqfunctionaddoutput(qf_mass,'v',1,ceed_eval_interp,err) 136 137 call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,& 138 & ceed_qfunction_none,op_setup,err) 139 call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,& 140 & ceed_qfunction_none,op_mass,err) 141 142 call ceedvectorcreate(ceed,d*ndofs,x,err) 143 xoffset=0 144 call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 145 call ceedvectorcreate(ceed,nqpts,qdata,err) 146 147 call ceedoperatorsetfield(op_setup,'_weight',erestrictxi,bx,& 148 & ceed_vector_none,err) 149 call ceedoperatorsetfield(op_setup,'x',erestrictx,bx,& 150 & ceed_vector_active,err) 151 call ceedoperatorsetfield(op_setup,'rho',erestrictui,& 152 & ceed_basis_collocated,ceed_vector_active,err) 153 call ceedoperatorsetfield(op_mass,'rho',erestrictui,& 154 & ceed_basis_collocated,qdata,err) 155 call ceedoperatorsetfield(op_mass,'u',erestrictu,bu,& 156 & ceed_vector_active,err) 157 call ceedoperatorsetfield(op_mass,'v',erestrictu,bu,& 158 & ceed_vector_active,err) 159 160 call ceedoperatorapply(op_setup,x,qdata,ceed_request_immediate,err) 161 162 call ceedvectorcreate(ceed,ndofs,u,err) 163 call ceedvectorsetvalue(u,1.d0,err) 164 call ceedvectorcreate(ceed,ndofs,v,err) 165 call ceedoperatorapply(op_mass,u,v,ceed_request_immediate,err) 166 167 call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 168 total=0. 169 do i=1,ndofs 170 total=total+hv(voffset+i) 171 enddo 172 if (abs(total-1.)>1.0d-10) then 173! LCOV_EXCL_START 174 write(*,*) 'Computed Area: ',total,' != True Area: 1.0' 175! LCOV_EXCL_STOP 176 endif 177 call ceedvectorrestorearrayread(v,hv,voffset,err) 178 179 call ceedvectordestroy(qdata,err) 180 call ceedvectordestroy(x,err) 181 call ceedvectordestroy(u,err) 182 call ceedvectordestroy(v,err) 183 call ceedoperatordestroy(op_mass,err) 184 call ceedoperatordestroy(op_setup,err) 185 call ceedqfunctiondestroy(qf_mass,err) 186 call ceedqfunctiondestroy(qf_setup,err) 187 call ceedbasisdestroy(bu,err) 188 call ceedbasisdestroy(bx,err) 189 call ceedelemrestrictiondestroy(erestrictu,err) 190 call ceedelemrestrictiondestroy(erestrictx,err) 191 call ceedelemrestrictiondestroy(erestrictui,err) 192 call ceedelemrestrictiondestroy(erestrictxi,err) 193 call ceeddestroy(ceed,err) 194 end 195!----------------------------------------------------------------------- 196