xref: /libCEED/tests/t540-operator-f.f90 (revision d9b786505a4dfcb66b2fcd9e3b61dd507168515d)
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