13bd813ffSjeremylt!----------------------------------------------------------------------- 23bd813ffSjeremylt subroutine setup_mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,& 33bd813ffSjeremylt& u14,u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,& 43bd813ffSjeremylt& v16,ierr) 53bd813ffSjeremylt real*8 ctx 63bd813ffSjeremylt real*8 u1(1) 73bd813ffSjeremylt real*8 u2(1) 83bd813ffSjeremylt real*8 v1(1) 93bd813ffSjeremylt integer q,ierr 103bd813ffSjeremylt 113bd813ffSjeremylt do i=1,q 123bd813ffSjeremylt v1(i)=u2(i)*(u1(i+q*0)*u1(i+q*3)-u1(i+q*1)*u1(i+q*2)) 133bd813ffSjeremylt enddo 143bd813ffSjeremylt 153bd813ffSjeremylt ierr=0 163bd813ffSjeremylt end 173bd813ffSjeremylt!----------------------------------------------------------------------- 183bd813ffSjeremylt subroutine apply(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 193bd813ffSjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 203bd813ffSjeremylt real*8 ctx 213bd813ffSjeremylt real*8 u1(1) 223bd813ffSjeremylt real*8 u2(1) 233bd813ffSjeremylt real*8 v1(1) 243bd813ffSjeremylt integer q,ierr 253bd813ffSjeremylt 263bd813ffSjeremylt do i=1,q 273bd813ffSjeremylt! mass 283bd813ffSjeremylt v1(i) = u1(i)*u2(i) 293bd813ffSjeremylt enddo 303bd813ffSjeremylt 313bd813ffSjeremylt ierr=0 323bd813ffSjeremylt end 333bd813ffSjeremylt!----------------------------------------------------------------------- 343bd813ffSjeremylt program test 353bd813ffSjeremylt 363bd813ffSjeremylt include 'ceedf.h' 373bd813ffSjeremylt 383bd813ffSjeremylt integer ceed,err,i 39*a8d32208Sjeremylt integer lmode 40*a8d32208Sjeremylt parameter(lmode=ceed_notranspose) 413bd813ffSjeremylt integer erestrictxi,erestrictui,erestrictqi 423bd813ffSjeremylt integer bx,bu 433bd813ffSjeremylt integer qf_setup_mass,qf_apply 443bd813ffSjeremylt integer op_setup_mass,op_apply,op_inv 453bd813ffSjeremylt integer qdata_mass,x,u,v 463bd813ffSjeremylt integer nelem,p,q,d 473bd813ffSjeremylt parameter(nelem=1) 483bd813ffSjeremylt parameter(p=4) 493bd813ffSjeremylt parameter(q=5) 503bd813ffSjeremylt parameter(d=2) 513bd813ffSjeremylt integer ndofs,nqpts 523bd813ffSjeremylt parameter(ndofs=p*p) 533bd813ffSjeremylt parameter(nqpts=nelem*q*q) 543bd813ffSjeremylt real*8 arrx(d*nelem*2*2),uu(ndofs) 553bd813ffSjeremylt integer*8 xoffset,uoffset 563bd813ffSjeremylt 573bd813ffSjeremylt character arg*32 583bd813ffSjeremylt 593bd813ffSjeremylt external setup_mass,apply 603bd813ffSjeremylt 613bd813ffSjeremylt call getarg(1,arg) 623bd813ffSjeremylt 633bd813ffSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 643bd813ffSjeremylt 653bd813ffSjeremylt! DoF Coordinates 663bd813ffSjeremylt do i=0,1 673bd813ffSjeremylt do j=0,1 683bd813ffSjeremylt arrx(i+1+j*2+0*4)=i 693bd813ffSjeremylt arrx(i+1+j*2+1*4)=j 703bd813ffSjeremylt enddo 713bd813ffSjeremylt enddo 723bd813ffSjeremylt call ceedvectorcreate(ceed,d*nelem*2*2,x,err) 733bd813ffSjeremylt xoffset=0 743bd813ffSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 753bd813ffSjeremylt 763bd813ffSjeremylt! Qdata Vector 773bd813ffSjeremylt call ceedvectorcreate(ceed,nqpts,qdata_mass,err) 783bd813ffSjeremylt 793bd813ffSjeremylt! Restrictions 80*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelem,2*2,nelem*2*2,d,& 813bd813ffSjeremylt & erestrictxi,err) 823bd813ffSjeremylt 83*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelem,p*p,ndofs,1,& 843bd813ffSjeremylt & erestrictui,err) 853bd813ffSjeremylt 86*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelem,q*q,nqpts,1,& 873bd813ffSjeremylt & erestrictqi,err) 883bd813ffSjeremylt 893bd813ffSjeremylt! Bases 903bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,2,q,ceed_gauss,bx,err) 913bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,p,q,ceed_gauss,bu,err) 923bd813ffSjeremylt 933bd813ffSjeremylt! QFunction - setup mass 943bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup_mass,& 953bd813ffSjeremylt &SOURCE_DIR& 963bd813ffSjeremylt &//'t540-operator.h:setup_mass'//char(0),qf_setup_mass,err) 973bd813ffSjeremylt call ceedqfunctionaddinput(qf_setup_mass,'dx',d*d,ceed_eval_grad,err) 983bd813ffSjeremylt call ceedqfunctionaddinput(qf_setup_mass,'_weight',1,ceed_eval_weight,err) 993bd813ffSjeremylt call ceedqfunctionaddoutput(qf_setup_mass,'qdata',1,ceed_eval_none,err) 1003bd813ffSjeremylt 1013bd813ffSjeremylt! Operator - setup mass 1023bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_setup_mass,ceed_qfunction_none,& 1033bd813ffSjeremylt & ceed_qfunction_none,op_setup_mass,err) 1043bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'dx',erestrictxi,& 105*a8d32208Sjeremylt & bx,ceed_vector_active,err) 1063bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'_weight',erestrictxi,& 107*a8d32208Sjeremylt & bx,ceed_vector_none,err) 1083bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'qdata',erestrictqi,& 109*a8d32208Sjeremylt & ceed_basis_collocated,ceed_vector_active,err) 1103bd813ffSjeremylt 1113bd813ffSjeremylt! Apply Setup Operators 1123bd813ffSjeremylt call ceedoperatorapply(op_setup_mass,x,qdata_mass,& 1133bd813ffSjeremylt & ceed_request_immediate,err) 1143bd813ffSjeremylt 1153bd813ffSjeremylt! QFunction - apply 1163bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,apply,& 1173bd813ffSjeremylt &SOURCE_DIR& 1183bd813ffSjeremylt &//'t540-operator.h:apply'//char(0),qf_apply,err) 1193bd813ffSjeremylt call ceedqfunctionaddinput(qf_apply,'u',1,ceed_eval_interp,err) 1203bd813ffSjeremylt call ceedqfunctionaddinput(qf_apply,'qdata_mass',1,ceed_eval_none,err) 1213bd813ffSjeremylt call ceedqfunctionaddoutput(qf_apply,'v',1,ceed_eval_interp,err) 1223bd813ffSjeremylt 1233bd813ffSjeremylt! Operator - apply 1243bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_apply,ceed_qfunction_none,& 1253bd813ffSjeremylt & ceed_qfunction_none,op_apply,err) 1263bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'u',erestrictui,& 127*a8d32208Sjeremylt & bu,ceed_vector_active,err) 1283bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'qdata_mass',erestrictqi,& 129*a8d32208Sjeremylt & ceed_basis_collocated,qdata_mass,err) 1303bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'v',erestrictui,& 131*a8d32208Sjeremylt & bu,ceed_vector_active,err) 1323bd813ffSjeremylt 1333bd813ffSjeremylt! Apply original operator 1343bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 1353bd813ffSjeremylt call ceedvectorsetvalue(u,1.d0,err) 1363bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 1373bd813ffSjeremylt call ceedvectorsetvalue(v,0.d0,err) 1383bd813ffSjeremylt call ceedoperatorapply(op_apply,u,v,ceed_request_immediate,err) 1393bd813ffSjeremylt 1403bd813ffSjeremylt! Create FDM element inverse 1413bd813ffSjeremylt call ceedoperatorcreatefdmelementinverse(op_apply,op_inv,& 1423bd813ffSjeremylt & ceed_request_immediate,err) 1433bd813ffSjeremylt 1443bd813ffSjeremylt! Apply FDM element inverse 1453bd813ffSjeremylt call ceedoperatorapply(op_inv,v,u,ceed_request_immediate,err) 1463bd813ffSjeremylt 1473bd813ffSjeremylt! Check Output 1483bd813ffSjeremylt call ceedvectorgetarrayread(u,ceed_mem_host,uu,uoffset,err) 1493bd813ffSjeremylt do i=1,ndofs 1503bd813ffSjeremylt if (abs(uu(uoffset+i)-1.0)>1.0d-14) then 1513bd813ffSjeremylt! LCOV_EXCL_START 1523bd813ffSjeremylt write(*,*) '[',i,'] Error in inverse: ',uu(uoffset+i),' != 1.0' 1533bd813ffSjeremylt! LCOV_EXCL_STOP 1543bd813ffSjeremylt endif 1553bd813ffSjeremylt enddo 1563bd813ffSjeremylt call ceedvectorrestorearrayread(u,uu,uoffset,err) 1573bd813ffSjeremylt 1583bd813ffSjeremylt! Cleanup 1593bd813ffSjeremylt call ceedqfunctiondestroy(qf_setup_mass,err) 1603bd813ffSjeremylt call ceedqfunctiondestroy(qf_apply,err) 1613bd813ffSjeremylt call ceedoperatordestroy(op_setup_mass,err) 1623bd813ffSjeremylt call ceedoperatordestroy(op_apply,err) 1633bd813ffSjeremylt call ceedoperatordestroy(op_inv,err) 1643bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictxi,err) 1653bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictui,err) 1663bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictqi,err) 1673bd813ffSjeremylt call ceedbasisdestroy(bu,err) 1683bd813ffSjeremylt call ceedbasisdestroy(bx,err) 1693bd813ffSjeremylt call ceedvectordestroy(x,err) 1703bd813ffSjeremylt call ceedvectordestroy(u,err) 1713bd813ffSjeremylt call ceedvectordestroy(v,err) 1723bd813ffSjeremylt call ceedvectordestroy(qdata_mass,err) 1733bd813ffSjeremylt call ceeddestroy(ceed,err) 1743bd813ffSjeremylt end 1753bd813ffSjeremylt!----------------------------------------------------------------------- 176