1*3bd813ffSjeremylt!----------------------------------------------------------------------- 2*3bd813ffSjeremylt subroutine setup_mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,& 3*3bd813ffSjeremylt& u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,& 4*3bd813ffSjeremylt& v16,ierr) 5*3bd813ffSjeremylt real*8 ctx 6*3bd813ffSjeremylt real*8 u1(1) 7*3bd813ffSjeremylt real*8 u2(1) 8*3bd813ffSjeremylt real*8 v1(1) 9*3bd813ffSjeremylt integer q,ierr 10*3bd813ffSjeremylt 11*3bd813ffSjeremylt do i=1,q 12*3bd813ffSjeremylt v1(i)=u2(i)*(u1(i+q*0)*u1(i+q*3)-u1(i+q*1)*u1(i+q*2)) 13*3bd813ffSjeremylt enddo 14*3bd813ffSjeremylt 15*3bd813ffSjeremylt ierr=0 16*3bd813ffSjeremylt end 17*3bd813ffSjeremylt!----------------------------------------------------------------------- 18*3bd813ffSjeremylt subroutine apply(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 19*3bd813ffSjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 20*3bd813ffSjeremylt real*8 ctx 21*3bd813ffSjeremylt real*8 u1(1) 22*3bd813ffSjeremylt real*8 u2(1) 23*3bd813ffSjeremylt real*8 v1(1) 24*3bd813ffSjeremylt integer q,ierr 25*3bd813ffSjeremylt 26*3bd813ffSjeremylt do i=1,q 27*3bd813ffSjeremylt! mass 28*3bd813ffSjeremylt v1(i) = u1(i)*u2(i) 29*3bd813ffSjeremylt enddo 30*3bd813ffSjeremylt 31*3bd813ffSjeremylt ierr=0 32*3bd813ffSjeremylt end 33*3bd813ffSjeremylt!----------------------------------------------------------------------- 34*3bd813ffSjeremylt program test 35*3bd813ffSjeremylt 36*3bd813ffSjeremylt include 'ceedf.h' 37*3bd813ffSjeremylt 38*3bd813ffSjeremylt integer ceed,err,i 39*3bd813ffSjeremylt integer erestrictxi,erestrictui,erestrictqi 40*3bd813ffSjeremylt integer bx,bu 41*3bd813ffSjeremylt integer qf_setup_mass,qf_apply 42*3bd813ffSjeremylt integer op_setup_mass,op_apply,op_inv 43*3bd813ffSjeremylt integer qdata_mass,x,u,v 44*3bd813ffSjeremylt integer nelem,p,q,d 45*3bd813ffSjeremylt parameter(nelem=1) 46*3bd813ffSjeremylt parameter(p=4) 47*3bd813ffSjeremylt parameter(q=5) 48*3bd813ffSjeremylt parameter(d=2) 49*3bd813ffSjeremylt integer ndofs,nqpts 50*3bd813ffSjeremylt parameter(ndofs=p*p) 51*3bd813ffSjeremylt parameter(nqpts=nelem*q*q) 52*3bd813ffSjeremylt real*8 arrx(d*nelem*2*2),uu(ndofs) 53*3bd813ffSjeremylt integer*8 xoffset,uoffset 54*3bd813ffSjeremylt 55*3bd813ffSjeremylt character arg*32 56*3bd813ffSjeremylt 57*3bd813ffSjeremylt external setup_mass,apply 58*3bd813ffSjeremylt 59*3bd813ffSjeremylt call getarg(1,arg) 60*3bd813ffSjeremylt 61*3bd813ffSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 62*3bd813ffSjeremylt 63*3bd813ffSjeremylt! DoF Coordinates 64*3bd813ffSjeremylt do i=0,1 65*3bd813ffSjeremylt do j=0,1 66*3bd813ffSjeremylt arrx(i+1+j*2+0*4)=i 67*3bd813ffSjeremylt arrx(i+1+j*2+1*4)=j 68*3bd813ffSjeremylt enddo 69*3bd813ffSjeremylt enddo 70*3bd813ffSjeremylt call ceedvectorcreate(ceed,d*nelem*2*2,x,err) 71*3bd813ffSjeremylt xoffset=0 72*3bd813ffSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 73*3bd813ffSjeremylt 74*3bd813ffSjeremylt! Qdata Vector 75*3bd813ffSjeremylt call ceedvectorcreate(ceed,nqpts,qdata_mass,err) 76*3bd813ffSjeremylt 77*3bd813ffSjeremylt! Restrictions 78*3bd813ffSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelem,2*2,nelem*2*2,d,& 79*3bd813ffSjeremylt & erestrictxi,err) 80*3bd813ffSjeremylt 81*3bd813ffSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelem,p*p,ndofs,1,& 82*3bd813ffSjeremylt & erestrictui,err) 83*3bd813ffSjeremylt 84*3bd813ffSjeremylt call ceedelemrestrictioncreateidentity(ceed,nelem,q*q,nqpts,1,& 85*3bd813ffSjeremylt & erestrictqi,err) 86*3bd813ffSjeremylt 87*3bd813ffSjeremylt! Bases 88*3bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,2,q,ceed_gauss,bx,err) 89*3bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,p,q,ceed_gauss,bu,err) 90*3bd813ffSjeremylt 91*3bd813ffSjeremylt! QFunction - setup mass 92*3bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup_mass,& 93*3bd813ffSjeremylt &SOURCE_DIR& 94*3bd813ffSjeremylt &//'t540-operator.h:setup_mass'//char(0),qf_setup_mass,err) 95*3bd813ffSjeremylt call ceedqfunctionaddinput(qf_setup_mass,'dx',d*d,ceed_eval_grad,err) 96*3bd813ffSjeremylt call ceedqfunctionaddinput(qf_setup_mass,'_weight',1,ceed_eval_weight,err) 97*3bd813ffSjeremylt call ceedqfunctionaddoutput(qf_setup_mass,'qdata',1,ceed_eval_none,err) 98*3bd813ffSjeremylt 99*3bd813ffSjeremylt! Operator - setup mass 100*3bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_setup_mass,ceed_qfunction_none,& 101*3bd813ffSjeremylt & ceed_qfunction_none,op_setup_mass,err) 102*3bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'dx',erestrictxi,& 103*3bd813ffSjeremylt & ceed_notranspose,bx,ceed_vector_active,err) 104*3bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'_weight',erestrictxi,& 105*3bd813ffSjeremylt & ceed_notranspose,bx,ceed_vector_none,err) 106*3bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'qdata',erestrictqi,& 107*3bd813ffSjeremylt & ceed_notranspose,ceed_basis_collocated,ceed_vector_active,err) 108*3bd813ffSjeremylt 109*3bd813ffSjeremylt! Apply Setup Operators 110*3bd813ffSjeremylt call ceedoperatorapply(op_setup_mass,x,qdata_mass,& 111*3bd813ffSjeremylt & ceed_request_immediate,err) 112*3bd813ffSjeremylt 113*3bd813ffSjeremylt! QFunction - apply 114*3bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,apply,& 115*3bd813ffSjeremylt &SOURCE_DIR& 116*3bd813ffSjeremylt &//'t540-operator.h:apply'//char(0),qf_apply,err) 117*3bd813ffSjeremylt call ceedqfunctionaddinput(qf_apply,'u',1,ceed_eval_interp,err) 118*3bd813ffSjeremylt call ceedqfunctionaddinput(qf_apply,'qdata_mass',1,ceed_eval_none,err) 119*3bd813ffSjeremylt call ceedqfunctionaddoutput(qf_apply,'v',1,ceed_eval_interp,err) 120*3bd813ffSjeremylt 121*3bd813ffSjeremylt! Operator - apply 122*3bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_apply,ceed_qfunction_none,& 123*3bd813ffSjeremylt & ceed_qfunction_none,op_apply,err) 124*3bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'u',erestrictui,& 125*3bd813ffSjeremylt & ceed_notranspose,bu,ceed_vector_active,err) 126*3bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'qdata_mass',erestrictqi,& 127*3bd813ffSjeremylt & ceed_notranspose,ceed_basis_collocated,qdata_mass,err) 128*3bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'v',erestrictui,& 129*3bd813ffSjeremylt & ceed_notranspose,bu,ceed_vector_active,err) 130*3bd813ffSjeremylt 131*3bd813ffSjeremylt! Apply original operator 132*3bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 133*3bd813ffSjeremylt call ceedvectorsetvalue(u,1.d0,err) 134*3bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 135*3bd813ffSjeremylt call ceedvectorsetvalue(v,0.d0,err) 136*3bd813ffSjeremylt call ceedoperatorapply(op_apply,u,v,ceed_request_immediate,err) 137*3bd813ffSjeremylt 138*3bd813ffSjeremylt! Create FDM element inverse 139*3bd813ffSjeremylt call ceedoperatorcreatefdmelementinverse(op_apply,op_inv,& 140*3bd813ffSjeremylt & ceed_request_immediate,err) 141*3bd813ffSjeremylt 142*3bd813ffSjeremylt! Apply FDM element inverse 143*3bd813ffSjeremylt call ceedoperatorapply(op_inv,v,u,ceed_request_immediate,err) 144*3bd813ffSjeremylt 145*3bd813ffSjeremylt! Check Output 146*3bd813ffSjeremylt call ceedvectorgetarrayread(u,ceed_mem_host,uu,uoffset,err) 147*3bd813ffSjeremylt do i=1,ndofs 148*3bd813ffSjeremylt if (abs(uu(uoffset+i)-1.0)>1.0d-14) then 149*3bd813ffSjeremylt! LCOV_EXCL_START 150*3bd813ffSjeremylt write(*,*) '[',i,'] Error in inverse: ',uu(uoffset+i),' != 1.0' 151*3bd813ffSjeremylt! LCOV_EXCL_STOP 152*3bd813ffSjeremylt endif 153*3bd813ffSjeremylt enddo 154*3bd813ffSjeremylt call ceedvectorrestorearrayread(u,uu,uoffset,err) 155*3bd813ffSjeremylt 156*3bd813ffSjeremylt! Cleanup 157*3bd813ffSjeremylt call ceedqfunctiondestroy(qf_setup_mass,err) 158*3bd813ffSjeremylt call ceedqfunctiondestroy(qf_apply,err) 159*3bd813ffSjeremylt call ceedoperatordestroy(op_setup_mass,err) 160*3bd813ffSjeremylt call ceedoperatordestroy(op_apply,err) 161*3bd813ffSjeremylt call ceedoperatordestroy(op_inv,err) 162*3bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictxi,err) 163*3bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictui,err) 164*3bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictqi,err) 165*3bd813ffSjeremylt call ceedbasisdestroy(bu,err) 166*3bd813ffSjeremylt call ceedbasisdestroy(bx,err) 167*3bd813ffSjeremylt call ceedvectordestroy(x,err) 168*3bd813ffSjeremylt call ceedvectordestroy(u,err) 169*3bd813ffSjeremylt call ceedvectordestroy(v,err) 170*3bd813ffSjeremylt call ceedvectordestroy(qdata_mass,err) 171*3bd813ffSjeremylt call ceeddestroy(ceed,err) 172*3bd813ffSjeremylt end 173*3bd813ffSjeremylt!----------------------------------------------------------------------- 174