xref: /libCEED/tests/t540-operator-f.f90 (revision 4596745bac6c596d2aa60995217db69e8d85f7a3)
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
397509a596Sjeremylt      integer stridesx(3),stridesu(3),stridesq(3)
403bd813ffSjeremylt      integer erestrictxi,erestrictui,erestrictqi
413bd813ffSjeremylt      integer bx,bu
423bd813ffSjeremylt      integer qf_setup_mass,qf_apply
433bd813ffSjeremylt      integer op_setup_mass,op_apply,op_inv
443bd813ffSjeremylt      integer qdata_mass,x,u,v
453bd813ffSjeremylt      integer nelem,p,q,d
463bd813ffSjeremylt      parameter(nelem=1)
473bd813ffSjeremylt      parameter(p=4)
483bd813ffSjeremylt      parameter(q=5)
493bd813ffSjeremylt      parameter(d=2)
503bd813ffSjeremylt      integer ndofs,nqpts
513bd813ffSjeremylt      parameter(ndofs=p*p)
523bd813ffSjeremylt      parameter(nqpts=nelem*q*q)
533bd813ffSjeremylt      real*8 arrx(d*nelem*2*2),uu(ndofs)
543bd813ffSjeremylt      integer*8 xoffset,uoffset
553bd813ffSjeremylt
563bd813ffSjeremylt      character arg*32
573bd813ffSjeremylt
583bd813ffSjeremylt      external setup_mass,apply
593bd813ffSjeremylt
603bd813ffSjeremylt      call getarg(1,arg)
613bd813ffSjeremylt
623bd813ffSjeremylt      call ceedinit(trim(arg)//char(0),ceed,err)
633bd813ffSjeremylt
643bd813ffSjeremylt! DoF Coordinates
653bd813ffSjeremylt      do i=0,1
663bd813ffSjeremylt      do j=0,1
673bd813ffSjeremylt        arrx(i+1+j*2+0*4)=i
683bd813ffSjeremylt        arrx(i+1+j*2+1*4)=j
693bd813ffSjeremylt      enddo
703bd813ffSjeremylt      enddo
713bd813ffSjeremylt      call ceedvectorcreate(ceed,d*nelem*2*2,x,err)
723bd813ffSjeremylt      xoffset=0
733bd813ffSjeremylt      call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err)
743bd813ffSjeremylt
753bd813ffSjeremylt! Qdata Vector
763bd813ffSjeremylt      call ceedvectorcreate(ceed,nqpts,qdata_mass,err)
773bd813ffSjeremylt
783bd813ffSjeremylt! Restrictions
797509a596Sjeremylt      stridesx=[1,2*2,2*2*d]
807509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,2*2,nelem*2*2,d,&
817509a596Sjeremylt     & stridesx,erestrictxi,err)
823bd813ffSjeremylt
837509a596Sjeremylt      stridesu=[1,p*p,p*p]
847509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,p*p,ndofs,1,&
857509a596Sjeremylt     & stridesu,erestrictui,err)
863bd813ffSjeremylt
877509a596Sjeremylt      stridesq=[1,q*q,q*q]
887509a596Sjeremylt      call ceedelemrestrictioncreatestrided(ceed,nelem,q*q,nqpts,1,&
897509a596Sjeremylt     & stridesq,erestrictqi,err)
903bd813ffSjeremylt
913bd813ffSjeremylt! Bases
923bd813ffSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,d,2,q,ceed_gauss,bx,err)
933bd813ffSjeremylt      call ceedbasiscreatetensorh1lagrange(ceed,d,1,p,q,ceed_gauss,bu,err)
943bd813ffSjeremylt
953bd813ffSjeremylt! QFunction - setup mass
963bd813ffSjeremylt      call ceedqfunctioncreateinterior(ceed,1,setup_mass,&
973bd813ffSjeremylt     &SOURCE_DIR&
983bd813ffSjeremylt     &//'t540-operator.h:setup_mass'//char(0),qf_setup_mass,err)
993bd813ffSjeremylt      call ceedqfunctionaddinput(qf_setup_mass,'dx',d*d,ceed_eval_grad,err)
1003bd813ffSjeremylt      call ceedqfunctionaddinput(qf_setup_mass,'_weight',1,ceed_eval_weight,err)
1013bd813ffSjeremylt      call ceedqfunctionaddoutput(qf_setup_mass,'qdata',1,ceed_eval_none,err)
1023bd813ffSjeremylt
1033bd813ffSjeremylt! Operator - setup mass
1043bd813ffSjeremylt      call ceedoperatorcreate(ceed,qf_setup_mass,ceed_qfunction_none,&
1053bd813ffSjeremylt     & ceed_qfunction_none,op_setup_mass,err)
1063bd813ffSjeremylt      call ceedoperatorsetfield(op_setup_mass,'dx',erestrictxi,&
107a8d32208Sjeremylt     & bx,ceed_vector_active,err)
10815910d16Sjeremylt      call ceedoperatorsetfield(op_setup_mass,'_weight',&
10915910d16Sjeremylt     & ceed_elemrestriction_none,bx,ceed_vector_none,err)
1103bd813ffSjeremylt      call ceedoperatorsetfield(op_setup_mass,'qdata',erestrictqi,&
111a8d32208Sjeremylt     & ceed_basis_collocated,ceed_vector_active,err)
1123bd813ffSjeremylt
1133bd813ffSjeremylt! Apply Setup Operators
1143bd813ffSjeremylt      call ceedoperatorapply(op_setup_mass,x,qdata_mass,&
1153bd813ffSjeremylt     & ceed_request_immediate,err)
1163bd813ffSjeremylt
1173bd813ffSjeremylt! QFunction - apply
1183bd813ffSjeremylt      call ceedqfunctioncreateinterior(ceed,1,apply,&
1193bd813ffSjeremylt     &SOURCE_DIR&
1203bd813ffSjeremylt     &//'t540-operator.h:apply'//char(0),qf_apply,err)
1213bd813ffSjeremylt      call ceedqfunctionaddinput(qf_apply,'u',1,ceed_eval_interp,err)
1223bd813ffSjeremylt      call ceedqfunctionaddinput(qf_apply,'qdata_mass',1,ceed_eval_none,err)
1233bd813ffSjeremylt      call ceedqfunctionaddoutput(qf_apply,'v',1,ceed_eval_interp,err)
1243bd813ffSjeremylt
1253bd813ffSjeremylt! Operator - apply
1263bd813ffSjeremylt      call ceedoperatorcreate(ceed,qf_apply,ceed_qfunction_none,&
1273bd813ffSjeremylt     & ceed_qfunction_none,op_apply,err)
1283bd813ffSjeremylt      call ceedoperatorsetfield(op_apply,'u',erestrictui,&
129a8d32208Sjeremylt     & bu,ceed_vector_active,err)
1303bd813ffSjeremylt      call ceedoperatorsetfield(op_apply,'qdata_mass',erestrictqi,&
131a8d32208Sjeremylt     & ceed_basis_collocated,qdata_mass,err)
1323bd813ffSjeremylt      call ceedoperatorsetfield(op_apply,'v',erestrictui,&
133a8d32208Sjeremylt     & bu,ceed_vector_active,err)
1343bd813ffSjeremylt
1353bd813ffSjeremylt! Apply original operator
1363bd813ffSjeremylt      call ceedvectorcreate(ceed,ndofs,u,err)
1373bd813ffSjeremylt      call ceedvectorsetvalue(u,1.d0,err)
1383bd813ffSjeremylt      call ceedvectorcreate(ceed,ndofs,v,err)
1393bd813ffSjeremylt      call ceedvectorsetvalue(v,0.d0,err)
1403bd813ffSjeremylt      call ceedoperatorapply(op_apply,u,v,ceed_request_immediate,err)
1413bd813ffSjeremylt
1423bd813ffSjeremylt! Create FDM element inverse
1433bd813ffSjeremylt      call ceedoperatorcreatefdmelementinverse(op_apply,op_inv,&
1443bd813ffSjeremylt     & ceed_request_immediate,err)
1453bd813ffSjeremylt
1463bd813ffSjeremylt! Apply FDM element inverse
1473bd813ffSjeremylt      call ceedoperatorapply(op_inv,v,u,ceed_request_immediate,err)
1483bd813ffSjeremylt
1493bd813ffSjeremylt! Check Output
1503bd813ffSjeremylt      call ceedvectorgetarrayread(u,ceed_mem_host,uu,uoffset,err)
1513bd813ffSjeremylt      do i=1,ndofs
152*4596745bSJed Brown        if (abs(uu(uoffset+i)-1.0)>5.0d-14) then
1533bd813ffSjeremylt! LCOV_EXCL_START
1543bd813ffSjeremylt          write(*,*) '[',i,'] Error in inverse: ',uu(uoffset+i),' != 1.0'
1553bd813ffSjeremylt! LCOV_EXCL_STOP
1563bd813ffSjeremylt        endif
1573bd813ffSjeremylt      enddo
1583bd813ffSjeremylt      call ceedvectorrestorearrayread(u,uu,uoffset,err)
1593bd813ffSjeremylt
1603bd813ffSjeremylt! Cleanup
1613bd813ffSjeremylt      call ceedqfunctiondestroy(qf_setup_mass,err)
1623bd813ffSjeremylt      call ceedqfunctiondestroy(qf_apply,err)
1633bd813ffSjeremylt      call ceedoperatordestroy(op_setup_mass,err)
1643bd813ffSjeremylt      call ceedoperatordestroy(op_apply,err)
1653bd813ffSjeremylt      call ceedoperatordestroy(op_inv,err)
1663bd813ffSjeremylt      call ceedelemrestrictiondestroy(erestrictxi,err)
1673bd813ffSjeremylt      call ceedelemrestrictiondestroy(erestrictui,err)
1683bd813ffSjeremylt      call ceedelemrestrictiondestroy(erestrictqi,err)
1693bd813ffSjeremylt      call ceedbasisdestroy(bu,err)
1703bd813ffSjeremylt      call ceedbasisdestroy(bx,err)
1713bd813ffSjeremylt      call ceedvectordestroy(x,err)
1723bd813ffSjeremylt      call ceedvectordestroy(u,err)
1733bd813ffSjeremylt      call ceedvectordestroy(v,err)
1743bd813ffSjeremylt      call ceedvectordestroy(qdata_mass,err)
1753bd813ffSjeremylt      call ceeddestroy(ceed,err)
1763bd813ffSjeremylt      end
1773bd813ffSjeremylt!-----------------------------------------------------------------------
178