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