xref: /libCEED/tests/t401-qfunction-f.f90 (revision 91dfd1cde504855b06db4052ed3242027f67af19)
1!-----------------------------------------------------------------------
2!
3! Header with QFunctions
4!
5      include 't401-qfunction-f.h'
6!-----------------------------------------------------------------------
7      program test
8      implicit none
9      include 'ceedf.h'
10
11      integer ceed,err
12      integer qdata,w,u,v
13      integer qf_setup,qf_mass
14      integer q,i
15      parameter(q=8)
16      real*8 ww(q)
17      real*8 uu(q)
18      real*8 vv(q)
19      real*8 vvv(q)
20      integer ctxsize
21      parameter(ctxsize=5)
22      real*8 ctx(5)
23      real*8 x
24      character arg*32
25      integer*8 uoffset,voffset,woffset
26
27      external setup,mass
28
29      ctx=(/1.d0,2.d0,3.d0,4.d0,5.d0/)
30
31      call getarg(1,arg)
32      call ceedinit(trim(arg)//char(0),ceed,err)
33
34      call ceedqfunctioncreateinterior(ceed,1,setup,&
35     &SOURCE_DIR&
36     &//'t401-qfunction.h:setup'//char(0),qf_setup,err)
37      call ceedqfunctionaddinput(qf_setup,'w', 1,ceed_eval_weight,err)
38      call ceedqfunctionaddoutput(qf_setup,'qdata',1,ceed_eval_none,err)
39
40      call ceedqfunctioncreateinterior(ceed,1,mass,&
41     &SOURCE_DIR&
42     &//'t401-qfunction.h:mass'//char(0),qf_mass,err)
43      call ceedqfunctionaddinput(qf_mass,'qdata',1,ceed_eval_none,err)
44      call ceedqfunctionaddinput(qf_mass,'u',1,ceed_eval_interp,err)
45      call ceedqfunctionaddoutput(qf_mass,'v',1,ceed_eval_interp,err)
46
47      call ceedqfunctionsetcontext(qf_mass,ctx,ctxsize,err)
48
49      do i=0,q-1
50        x=2.0*i/(q-1)-1
51        ww(i+1)=1-x*x
52        uu(i+1)=2+3*x+5*x*x
53        vvv(i+1)=ww(i+1)*uu(i+1)
54      enddo
55
56      call ceedvectorcreate(ceed,q,w,err)
57      woffset=0
58      call ceedvectorsetarray(w,ceed_mem_host,ceed_use_pointer,ww,woffset,err)
59      call ceedvectorcreate(ceed,q,u,err)
60      uoffset=0
61      call ceedvectorsetarray(u,ceed_mem_host,ceed_use_pointer,uu,uoffset,err)
62      call ceedvectorcreate(ceed,q,v,err)
63      call ceedvectorsetvalue(v,0.d0,err)
64      call ceedvectorcreate(ceed,q,qdata,err)
65      call ceedvectorsetvalue(qdata,0.d0,err)
66
67      call ceedqfunctionapply(qf_setup,q,w,ceed_null,ceed_null,ceed_null,&
68             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
69             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
70             &qdata,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
71             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
72             &ceed_null,ceed_null,ceed_null,ceed_null,err)
73
74      call ceedqfunctionapply(qf_mass,q,u,qdata,ceed_null,ceed_null,&
75             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
76             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
77             &v,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
78             &ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,ceed_null,&
79             &ceed_null,ceed_null,ceed_null,ceed_null,err)
80
81      call ceedvectorgetarrayread(v,ceed_mem_host,vv,voffset,err)
82      do i=1,q
83        if (abs(vv(i+voffset)-ctx(5)*vvv(i)) > 1.0D-14) then
84! LCOV_EXCL_START
85          write(*,*) 'v(i)=',vv(i+voffset),', 5*vv(i)=',ctx(5)*vvv(i)
86! LCOV_EXCL_STOP
87        endif
88      enddo
89      call ceedvectorrestorearrayread(v,vv,voffset,err)
90
91      call ceedvectordestroy(u,err)
92      call ceedvectordestroy(v,err)
93      call ceedvectordestroy(w,err)
94      call ceedvectordestroy(qdata,err)
95      call ceedqfunctiondestroy(qf_setup,err)
96      call ceedqfunctiondestroy(qf_mass,err)
97      call ceeddestroy(ceed,err)
98      end
99!-----------------------------------------------------------------------
100