13bd813ffSjeremylt!----------------------------------------------------------------------- 2752c3701SJeremy L Thompson! 3752c3701SJeremy L Thompson! Header with QFunctions 4752c3701SJeremy L Thompson! 5752c3701SJeremy L Thompson include 't540-operator-f.h' 63bd813ffSjeremylt!----------------------------------------------------------------------- 73bd813ffSjeremylt program test 81f9a83abSJed Brown implicit none 9ec3da8bcSJed Brown include 'ceed/fortran.h' 103bd813ffSjeremylt 111f9a83abSJed Brown integer ceed,err,i,j 127509a596Sjeremylt integer stridesx(3),stridesu(3),stridesq(3) 133bd813ffSjeremylt integer erestrictxi,erestrictui,erestrictqi 143bd813ffSjeremylt integer bx,bu 153bd813ffSjeremylt integer qf_setup_mass,qf_apply 163bd813ffSjeremylt integer op_setup_mass,op_apply,op_inv 173bd813ffSjeremylt integer qdata_mass,x,u,v 183bd813ffSjeremylt integer nelem,p,q,d 193bd813ffSjeremylt parameter(nelem=1) 203bd813ffSjeremylt parameter(p=4) 213bd813ffSjeremylt parameter(q=5) 223bd813ffSjeremylt parameter(d=2) 233bd813ffSjeremylt integer ndofs,nqpts 243bd813ffSjeremylt parameter(ndofs=p*p) 253bd813ffSjeremylt parameter(nqpts=nelem*q*q) 263bd813ffSjeremylt real*8 arrx(d*nelem*2*2),uu(ndofs) 273bd813ffSjeremylt integer*8 xoffset,uoffset 283bd813ffSjeremylt 293bd813ffSjeremylt character arg*32 303bd813ffSjeremylt 313bd813ffSjeremylt external setup_mass,apply 323bd813ffSjeremylt 333bd813ffSjeremylt call getarg(1,arg) 343bd813ffSjeremylt 353bd813ffSjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 363bd813ffSjeremylt 373bd813ffSjeremylt! DoF Coordinates 383bd813ffSjeremylt do i=0,1 393bd813ffSjeremylt do j=0,1 403bd813ffSjeremylt arrx(i+1+j*2+0*4)=i 413bd813ffSjeremylt arrx(i+1+j*2+1*4)=j 423bd813ffSjeremylt enddo 433bd813ffSjeremylt enddo 443bd813ffSjeremylt call ceedvectorcreate(ceed,d*nelem*2*2,x,err) 453bd813ffSjeremylt xoffset=0 463bd813ffSjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 473bd813ffSjeremylt 483bd813ffSjeremylt! Qdata Vector 493bd813ffSjeremylt call ceedvectorcreate(ceed,nqpts,qdata_mass,err) 503bd813ffSjeremylt 513bd813ffSjeremylt! Restrictions 527509a596Sjeremylt stridesx=[1,2*2,2*2*d] 53d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,2*2,d,d*nelem*2*2,& 547509a596Sjeremylt & stridesx,erestrictxi,err) 553bd813ffSjeremylt 567509a596Sjeremylt stridesu=[1,p*p,p*p] 57d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,p*p,1,ndofs,& 587509a596Sjeremylt & stridesu,erestrictui,err) 593bd813ffSjeremylt 607509a596Sjeremylt stridesq=[1,q*q,q*q] 61d979a051Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,q*q,1,nqpts,& 627509a596Sjeremylt & stridesq,erestrictqi,err) 633bd813ffSjeremylt 643bd813ffSjeremylt! Bases 653bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,2,q,ceed_gauss,bx,err) 663bd813ffSjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,p,q,ceed_gauss,bu,err) 673bd813ffSjeremylt 683bd813ffSjeremylt! QFunction - setup mass 693bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,setup_mass,& 703bd813ffSjeremylt &SOURCE_DIR& 713bd813ffSjeremylt &//'t540-operator.h:setup_mass'//char(0),qf_setup_mass,err) 723bd813ffSjeremylt call ceedqfunctionaddinput(qf_setup_mass,'dx',d*d,ceed_eval_grad,err) 73a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_setup_mass,'weight',1,ceed_eval_weight,err) 743bd813ffSjeremylt call ceedqfunctionaddoutput(qf_setup_mass,'qdata',1,ceed_eval_none,err) 753bd813ffSjeremylt 763bd813ffSjeremylt! Operator - setup mass 773bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_setup_mass,ceed_qfunction_none,& 783bd813ffSjeremylt & ceed_qfunction_none,op_setup_mass,err) 793bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'dx',erestrictxi,& 80a8d32208Sjeremylt & bx,ceed_vector_active,err) 81a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_setup_mass,'weight',& 8215910d16Sjeremylt & ceed_elemrestriction_none,bx,ceed_vector_none,err) 833bd813ffSjeremylt call ceedoperatorsetfield(op_setup_mass,'qdata',erestrictqi,& 84*356036faSJeremy L Thompson ceed_basis_none,ceed_vector_active,err) 853bd813ffSjeremylt 863bd813ffSjeremylt! Apply Setup Operators 873bd813ffSjeremylt call ceedoperatorapply(op_setup_mass,x,qdata_mass,& 883bd813ffSjeremylt & ceed_request_immediate,err) 893bd813ffSjeremylt 903bd813ffSjeremylt! QFunction - apply 913bd813ffSjeremylt call ceedqfunctioncreateinterior(ceed,1,apply,& 923bd813ffSjeremylt &SOURCE_DIR& 933bd813ffSjeremylt &//'t540-operator.h:apply'//char(0),qf_apply,err) 943bd813ffSjeremylt call ceedqfunctionaddinput(qf_apply,'u',1,ceed_eval_interp,err) 95a61c78d6SJeremy L Thompson call ceedqfunctionaddinput(qf_apply,'mass qdata',1,ceed_eval_none,err) 963bd813ffSjeremylt call ceedqfunctionaddoutput(qf_apply,'v',1,ceed_eval_interp,err) 973bd813ffSjeremylt 983bd813ffSjeremylt! Operator - apply 993bd813ffSjeremylt call ceedoperatorcreate(ceed,qf_apply,ceed_qfunction_none,& 1003bd813ffSjeremylt & ceed_qfunction_none,op_apply,err) 1013bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'u',erestrictui,& 102a8d32208Sjeremylt & bu,ceed_vector_active,err) 103a61c78d6SJeremy L Thompson call ceedoperatorsetfield(op_apply,'mass qdata',erestrictqi,& 104*356036faSJeremy L Thompson ceed_basis_none,qdata_mass,err) 1053bd813ffSjeremylt call ceedoperatorsetfield(op_apply,'v',erestrictui,& 106a8d32208Sjeremylt & bu,ceed_vector_active,err) 1073bd813ffSjeremylt 1083bd813ffSjeremylt! Apply original operator 1093bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,u,err) 1103bd813ffSjeremylt call ceedvectorsetvalue(u,1.d0,err) 1113bd813ffSjeremylt call ceedvectorcreate(ceed,ndofs,v,err) 1123bd813ffSjeremylt call ceedvectorsetvalue(v,0.d0,err) 1133bd813ffSjeremylt call ceedoperatorapply(op_apply,u,v,ceed_request_immediate,err) 1143bd813ffSjeremylt 1153bd813ffSjeremylt! Create FDM element inverse 1163bd813ffSjeremylt call ceedoperatorcreatefdmelementinverse(op_apply,op_inv,& 1173bd813ffSjeremylt & ceed_request_immediate,err) 1183bd813ffSjeremylt 1193bd813ffSjeremylt! Apply FDM element inverse 1203bd813ffSjeremylt call ceedoperatorapply(op_inv,v,u,ceed_request_immediate,err) 1213bd813ffSjeremylt 1223bd813ffSjeremylt! Check Output 1233bd813ffSjeremylt call ceedvectorgetarrayread(u,ceed_mem_host,uu,uoffset,err) 1243bd813ffSjeremylt do i=1,ndofs 1254596745bSJed Brown if (abs(uu(uoffset+i)-1.0)>5.0d-14) then 1263bd813ffSjeremylt! LCOV_EXCL_START 1273bd813ffSjeremylt write(*,*) '[',i,'] Error in inverse: ',uu(uoffset+i),' != 1.0' 1283bd813ffSjeremylt! LCOV_EXCL_STOP 1293bd813ffSjeremylt endif 1303bd813ffSjeremylt enddo 1313bd813ffSjeremylt call ceedvectorrestorearrayread(u,uu,uoffset,err) 1323bd813ffSjeremylt 1333bd813ffSjeremylt! Cleanup 1343bd813ffSjeremylt call ceedqfunctiondestroy(qf_setup_mass,err) 1353bd813ffSjeremylt call ceedqfunctiondestroy(qf_apply,err) 1363bd813ffSjeremylt call ceedoperatordestroy(op_setup_mass,err) 1373bd813ffSjeremylt call ceedoperatordestroy(op_apply,err) 1383bd813ffSjeremylt call ceedoperatordestroy(op_inv,err) 1393bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictxi,err) 1403bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictui,err) 1413bd813ffSjeremylt call ceedelemrestrictiondestroy(erestrictqi,err) 1423bd813ffSjeremylt call ceedbasisdestroy(bu,err) 1433bd813ffSjeremylt call ceedbasisdestroy(bx,err) 1443bd813ffSjeremylt call ceedvectordestroy(x,err) 1453bd813ffSjeremylt call ceedvectordestroy(u,err) 1463bd813ffSjeremylt call ceedvectordestroy(v,err) 1473bd813ffSjeremylt call ceedvectordestroy(qdata_mass,err) 1483bd813ffSjeremylt call ceeddestroy(ceed,err) 1493bd813ffSjeremylt end 1503bd813ffSjeremylt!----------------------------------------------------------------------- 151