Neko  0.8.1
A portable framework for high-order spectral element flow simulations
opr_xsmm.F90
Go to the documentation of this file.
1 ! Copyright (c) 2008-2020, UCHICAGO ARGONNE, LLC.
2 !
3 ! The UChicago Argonne, LLC as Operator of Argonne National
4 ! Laboratory holds copyright in the Software. The copyright holder
5 ! reserves all rights except those expressly granted to licensees,
6 ! and U.S. Government license rights.
7 !
8 ! Redistribution and use in source and binary forms, with or without
9 ! modification, are permitted provided that the following conditions
10 ! are met:
11 !
12 ! 1. Redistributions of source code must retain the above copyright
13 ! notice, this list of conditions and the disclaimer below.
14 !
15 ! 2. Redistributions in binary form must reproduce the above copyright
16 ! notice, this list of conditions and the disclaimer (as noted below)
17 ! in the documentation and/or other materials provided with the
18 ! distribution.
19 !
20 ! 3. Neither the name of ANL nor the names of its contributors
21 ! may be used to endorse or promote products derived from this software
22 ! without specific prior written permission.
23 !
24 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 ! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 ! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 ! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
28 ! UCHICAGO ARGONNE, LLC, THE U.S. DEPARTMENT OF
29 ! ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31 ! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 !
37 ! Additional BSD Notice
38 ! ---------------------
39 ! 1. This notice is required to be provided under our contract with
40 ! the U.S. Department of Energy (DOE). This work was produced at
41 ! Argonne National Laboratory under Contract
42 ! No. DE-AC02-06CH11357 with the DOE.
43 !
44 ! 2. Neither the United States Government nor UCHICAGO ARGONNE,
45 ! LLC nor any of their employees, makes any warranty,
46 ! express or implied, or assumes any liability or responsibility for the
47 ! accuracy, completeness, or usefulness of any information, apparatus,
48 ! product, or process disclosed, or represents that its use would not
49 ! infringe privately-owned rights.
50 !
51 ! 3. Also, reference herein to any specific commercial products, process,
52 ! or services by trade name, trademark, manufacturer or otherwise does
53 ! not necessarily constitute or imply its endorsement, recommendation,
54 ! or favoring by the United States Government or UCHICAGO ARGONNE LLC.
55 ! The views and opinions of authors expressed
56 ! herein do not necessarily state or reflect those of the United States
57 ! Government or UCHICAGO ARGONNE, LLC, and shall
58 ! not be used for advertising or product endorsement purposes.
59 !
61 module opr_xsmm
62  use num_types, only : rp
63  use mxm_wrapper
64  use space, only : space_t
65  use coefs, only : coef_t
66  use math
67  use mesh, only : mesh_t
68  use field, only : field_t
69  use gather_scatter
70  use mathops
71 #ifdef HAVE_LIBXSMM
72  use libxsmm, libxsmm_mmcall => libxsmm_dmmcall_abc
73 #endif
74  implicit none
75  private
76 
78 
79 #ifdef HAVE_LIBXSMM
80  type(libxsmm_dmmfunction), private :: lgrad_xmm1
81  type(libxsmm_dmmfunction), private :: lgrad_xmm2
82  type(libxsmm_dmmfunction), private :: lgrad_xmm3
83 #endif
84 
85 contains
86 
87  subroutine opr_xsmm_dudxyz(du, u, dr, ds, dt, coef)
88  type(coef_t), intent(in), target :: coef
89  real(kind=rp), dimension(coef%Xh%lx,coef%Xh%ly,coef%Xh%lz,coef%msh%nelv), intent(inout) :: du
90  real(kind=rp), dimension(coef%Xh%lx,coef%Xh%ly,coef%Xh%lz,coef%msh%nelv), intent(in) :: u, dr, ds, dt
91  real(kind=rp) :: drst(coef%Xh%lx,coef%Xh%ly,coef%Xh%lz)
92  type(space_t), pointer :: xh
93  type(mesh_t), pointer :: msh
94  integer :: e, k, lxy, lyz, lxyz
95 #ifdef HAVE_LIBXSMM
96  type(libxsmm_dmmfunction), save :: dudxyz_xmm1
97  type(libxsmm_dmmfunction), save :: dudxyz_xmm2
98  type(libxsmm_dmmfunction), save :: dudxyz_xmm3
99  logical, save :: dudxyz_xsmm_init = .false.
100 
101  xh => coef%Xh
102  msh => coef%msh
103  lxy = xh%lx*xh%ly
104  lyz = xh%ly*xh%lz
105  lxyz = xh%lx*xh%ly*xh%lz
106 
107  if (.not. dudxyz_xsmm_init) then
108  call libxsmm_dispatch(dudxyz_xmm1, xh%lx, xh%ly*xh%lz, xh%lx, &
109  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
110  call libxsmm_dispatch(dudxyz_xmm2, xh%lx, xh%ly, xh%ly, &
111  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
112  call libxsmm_dispatch(dudxyz_xmm3, xh%lx*xh%ly, xh%lz, xh%lz, &
113  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
114  dudxyz_xsmm_init = .true.
115  end if
116 
117  do e=1,msh%nelv
118  if (msh%gdim .eq. 2) then
119  call mxm(xh%dx, xh%lx, u(1,1,1,e), xh%lx, du(1,1,1,e), lyz)
120  call col2(du(1,1,1,e), dr(1,1,1,e), lxyz)
121  call mxm(u(1,1,1,e), xh%lx, xh%dyt, xh%ly, drst, xh%ly)
122  call addcol3(du(1,1,1,e), drst, ds(1,1,1,e),lxyz)
123  else
124  call libxsmm_mmcall(dudxyz_xmm1, xh%dx, u(1,1,1,e), du(1,1,1,e))
125  call col2(du(1,1,1,e), dr(1,1,1,e), lxyz)
126  do k=1,xh%lz
127  call libxsmm_mmcall(dudxyz_xmm2, u(1,1,k,e), xh%dyt, drst(1,1,k))
128  end do
129  call addcol3(du(1,1,1,e), drst, ds(1,1,1,e), lxyz)
130  call libxsmm_mmcall(dudxyz_xmm3, u(1,1,1,e), xh%dzt, drst)
131  call addcol3(du(1,1,1,e), drst, dt(1,1,1,e), lxyz)
132  end if
133  end do
134  call col2(du, coef%jacinv, coef%dof%n_dofs)
135 
136 #endif
137  end subroutine opr_xsmm_dudxyz
138 
139  subroutine opr_xsmm_opgrad(ux, uy, uz, u, coef)
140  type(coef_t), intent(in) :: coef
141  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(inout) :: ux
142  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(inout) :: uy
143  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(inout) :: uz
144  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(in) :: u
145  real(kind=rp) :: ur(coef%Xh%lxyz)
146  real(kind=rp) :: us(coef%Xh%lxyz)
147  real(kind=rp) :: ut(coef%Xh%lxyz)
148  logical, save :: lgrad_xsmm_init = .false.
149  integer, save :: init_size = 0
150  integer :: e, i, n
151  n = coef%Xh%lx - 1
152 
153 #ifdef HAVE_LIBXSMM
154  if ((.not. lgrad_xsmm_init) .or. &
155  (init_size .gt. 0 .and. init_size .ne. n)) then
156  call libxsmm_dispatch(lgrad_xmm1, (n+1), (n+1)**2, (n+1), &
157  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
158  call libxsmm_dispatch(lgrad_xmm2, (n+1), (n+1), (n+1), &
159  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
160  call libxsmm_dispatch(lgrad_xmm3, (n+1)**2, (n+1), (n+1), &
161  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
162  lgrad_xsmm_init = .true.
163  init_size = n
164  end if
165 #endif
166 
167  do e=1,coef%msh%nelv
168  if(coef%msh%gdim .eq. 3) then
169  call local_grad3_xsmm(ur, us, ut, u(1,e), n, coef%Xh%dx, coef%Xh%dxt)
170  do i=1,coef%Xh%lxyz
171  ux(i,e) = coef%Xh%w3(i,1,1)*(ur(i)*coef%drdx(i,1,1,e) &
172  + us(i)*coef%dsdx(i,1,1,e) &
173  + ut(i)*coef%dtdx(i,1,1,e) )
174  uy(i,e) = coef%Xh%w3(i,1,1)*(ur(i)*coef%drdy(i,1,1,e) &
175  + us(i)*coef%dsdy(i,1,1,e) &
176  + ut(i)*coef%dtdy(i,1,1,e) )
177  uz(i,e) = coef%Xh%w3(i,1,1)*(ur(i)*coef%drdz(i,1,1,e) &
178  + us(i)*coef%dsdz(i,1,1,e) &
179  + ut(i)*coef%dtdz(i,1,1,e) )
180  end do
181  else
182 
183  call local_grad2(ur, us, u(1,e), n, coef%Xh%dx, coef%Xh%dyt)
184 
185  do i=1,coef%Xh%lxyz
186  ux(i,e) = coef%Xh%w3(i,1,1)*(ur(i)*coef%drdx(i,1,1,e) &
187  + us(i)*coef%dsdx(i,1,1,e) )
188  uy(i,e) = coef%Xh%w3(i,1,1)*(ur(i)*coef%drdy(i,1,1,e) &
189  + us(i)*coef%dsdy(i,1,1,e) )
190  end do
191  endif
192  end do
193  end subroutine opr_xsmm_opgrad
194 
195  subroutine local_grad3_xsmm(ur, us, ut, u, n, D, Dt)
196  integer, intent(in) :: n
197  real(kind=rp), intent(inout) :: ur(0:n, 0:n, 0:n)
198  real(kind=rp), intent(inout) :: us(0:n, 0:n, 0:n)
199  real(kind=rp), intent(inout) :: ut(0:n, 0:n, 0:n)
200  real(kind=rp), intent(in) :: u(0:n, 0:n, 0:n)
201  real(kind=rp), intent(in) :: d(0:n, 0:n)
202  real(kind=rp), intent(in) :: dt(0:n, 0:n)
203  integer :: m1, m2, k
204 
205  m1 = n + 1
206  m2 = m1*m1
207 #ifdef HAVE_LIBXSMM
208  call libxsmm_mmcall(lgrad_xmm1, d, u, ur)
209  do k=0,n
210  call libxsmm_mmcall(lgrad_xmm2, u(0,0,k), dt, us(0,0,k))
211  end do
212  call libxsmm_mmcall(lgrad_xmm3, u, dt, ut)
213 #endif
214 
215  end subroutine local_grad3_xsmm
216 
217  subroutine local_grad2(ur, us, u, n, D, Dt)
218  integer, intent(in) :: n
219  real(kind=rp), intent(inout) :: ur(0:n, 0:n)
220  real(kind=rp), intent(inout) :: us(0:n, 0:n)
221  real(kind=rp), intent(in) :: u(0:n, 0:n)
222  real(kind=rp), intent(in) :: d(0:n, 0:n)
223  real(kind=rp), intent(in) :: dt(0:n, 0:n)
224  integer :: m1, m2, k
225 
226  m1 = n + 1
227 
228  call mxm(d ,m1,u,m1,ur,m1)
229  call mxm(u,m1,dt,m1,us,m1)
230 
231  end subroutine local_grad2
232 
233  subroutine opr_xsmm_cdtp(dtx,x,dr,ds,dt, coef)
234  type(coef_t), intent(in) :: coef
235  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(inout) :: dtx
236  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(inout) :: x
237  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(in) :: dr
238  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(in) :: ds
239  real(kind=rp), dimension(coef%Xh%lxyz,coef%msh%nelv), intent(in) :: dt
240  real(kind=rp) :: wx(coef%Xh%lxyz)
241  real(kind=rp) :: ta1(coef%Xh%lxyz)
242  real(kind=rp) :: ta2(coef%Xh%lxyz)
243  real(kind=rp) :: ta3(coef%Xh%lxyz)
244  integer :: e, i1, i2, n1, n2, iz
245  type(space_t), pointer :: xh
246 #ifdef HAVE_LIBXSMM
247  type(libxsmm_dmmfunction), save :: cdtp_xmm1
248  type(libxsmm_dmmfunction), save :: cdtp_xmm2
249  type(libxsmm_dmmfunction), save :: cdtp_xmm3
250  logical, save :: cdtp_xsmm_init = .false.
251 
252  xh => coef%Xh
253  n1 = xh%lx*xh%ly
254  n2 = xh%lx*xh%ly
255 
256  if (.not. cdtp_xsmm_init) then
257  call libxsmm_dispatch(cdtp_xmm1, xh%lx, xh%ly*xh%lz, xh%lx, &
258  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
259  call libxsmm_dispatch(cdtp_xmm2, xh%lx, xh%ly, xh%ly, &
260  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
261  call libxsmm_dispatch(cdtp_xmm3, xh%lx*xh%ly, xh%lz, xh%lz, &
262  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
263  cdtp_xsmm_init = .true.
264  end if
265 
266  do e=1,coef%msh%nelv
267  call col3(wx, coef%B(1,1,1,e), x(1,e), xh%lxyz)
268  call invcol2(wx, coef%jac(1,1,1,e), xh%lxyz)
269  call col3(ta1, wx, dr(1,e), xh%lxyz)
270  call libxsmm_mmcall(cdtp_xmm1, xh%dxt, ta1, dtx(1,e))
271  call col3 (ta1, wx, ds(1,e), xh%lxyz)
272  i1 = 1
273  i2 = 1
274  do iz=1,xh%lz
275  call libxsmm_mmcall(cdtp_xmm2, ta1(i2), xh%dy, ta2(i1))
276  i1 = i1 + n1
277  i2 = i2 + n2
278  end do
279  call add2(dtx(1,e), ta2, xh%lxyz)
280  call col3(ta1, wx, dt(1,e), xh%lxyz)
281  call libxsmm_mmcall(cdtp_xmm3, ta1, xh%dz, ta2)
282  call add2 (dtx(1,e), ta2, xh%lxyz)
283  end do
284 #endif
285  end subroutine opr_xsmm_cdtp
286 
287  subroutine opr_xsmm_conv1(du,u, vx, vy, vz, Xh, coef, nelv, gdim)
288  type(space_t), intent(in) :: xh
289  type(coef_t), intent(in) :: coef
290  integer, intent(in) :: nelv, gdim
291  real(kind=rp), intent(inout) :: du(xh%lxyz,nelv)
292  real(kind=rp), intent(inout), dimension(Xh%lx,Xh%ly,Xh%lz,nelv) :: u
293  real(kind=rp), intent(inout), dimension(Xh%lx,Xh%ly,Xh%lz,nelv) :: vx
294  real(kind=rp), intent(inout), dimension(Xh%lx,Xh%ly,Xh%lz,nelv) :: vy
295  real(kind=rp), intent(inout), dimension(Xh%lx,Xh%ly,Xh%lz,nelv) :: vz
296  ! Store the inverse jacobian to speed this operation up
297  real(kind=rp), dimension(Xh%lx,Xh%ly,Xh%lz) :: dudr, duds, dudt
298  integer :: ie, iz, i
299 #ifdef HAVE_LIBXSMM
300  type(libxsmm_dmmfunction), save :: conv1_xmm1
301  type(libxsmm_dmmfunction), save :: conv1_xmm2
302  type(libxsmm_dmmfunction), save :: conv1_xmm3
303  logical, save :: conv1_xsmm_init = .false.
304 
305  if (.not. conv1_xsmm_init) then
306  call libxsmm_dispatch(conv1_xmm1, xh%lx, xh%ly*xh%lx, xh%lx, &
307  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
308  call libxsmm_dispatch(conv1_xmm2, xh%lx, xh%ly, xh%ly, &
309  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
310  call libxsmm_dispatch(conv1_xmm3, xh%lx*xh%ly, xh%lz, xh%lz, &
311  alpha=1d0, beta=0d0, prefetch=libxsmm_prefetch_auto)
312  conv1_xsmm_init = .true.
313  end if
314 
315  ! Compute vel.grad(u)
316  do ie=1,nelv
317  if (gdim .eq. 3) then
318  call libxsmm_mmcall(conv1_xmm1, xh%dx, u(1,1,1,ie), dudr)
319  do iz=1,xh%lz
320  call libxsmm_mmcall(conv1_xmm2, u(1,1,iz,ie), xh%dyt, duds(1,1,iz))
321  end do
322  call libxsmm_mmcall(conv1_xmm3, u(1,1,1,ie), xh%dzt, dudt)
323  do i=1,xh%lxyz
324  du(i,ie) = coef%jacinv(i,1,1,ie)*( &
325  vx(i,1,1,ie)*( &
326  coef%drdx(i,1,1,ie)*dudr(i,1,1) &
327  + coef%dsdx(i,1,1,ie)*duds(i,1,1) &
328  + coef%dtdx(i,1,1,ie)*dudt(i,1,1)) &
329  + vy(i,1,1,ie)*( &
330  coef%drdy(i,1,1,ie)*dudr(i,1,1) &
331  + coef%dsdy(i,1,1,ie)*duds(i,1,1) &
332  + coef%dtdy(i,1,1,ie)*dudt(i,1,1)) &
333  + vz(i,1,1,ie)*( &
334  coef%drdz(i,1,1,ie)*dudr(i,1,1) &
335  + coef%dsdz(i,1,1,ie)*duds(i,1,1) &
336  + coef%dtdz(i,1,1,ie)*dudt(i,1,1)))
337  end do
338  else
339  ! 2D
340  call mxm(xh%dx, xh%lx, u(1,1,1,ie), xh%lx, dudr, xh%lyz)
341  call mxm(u(1,1,1,ie), xh%lx, xh%dyt, xh%ly, duds, xh%ly)
342  do i=1,xh%lxyz
343  du(i,ie) = coef%jacinv(i,1,1,ie)*( &
344  vx(i,1,1,ie)*( &
345  coef%drdx(i,1,1,ie)*dudr(i,1,1) &
346  + coef%dsdx(i,1,1,ie)*duds(i,1,1)) &
347  + vy(i,1,1,ie)*( &
348  coef%drdy(i,1,1,ie)*dudr(i,1,1) &
349  + coef%dsdy(i,1,1,ie)*duds(i,1,1)))
350  end do
351  endif
352  end do
353 
354 #endif
355 
356  end subroutine opr_xsmm_conv1
357 
358  subroutine opr_xsmm_curl(w1, w2, w3, u1, u2, u3, work1, work2, c_Xh)
359  type(field_t), intent(inout) :: w1
360  type(field_t), intent(inout) :: w2
361  type(field_t), intent(inout) :: w3
362  type(field_t), intent(inout) :: u1
363  type(field_t), intent(inout) :: u2
364  type(field_t), intent(inout) :: u3
365  type(field_t), intent(inout) :: work1
366  type(field_t), intent(inout) :: work2
367  type(coef_t), intent(in) :: c_xh
368  integer :: gdim, n
369 
370  n = w1%dof%size()
371  gdim = c_xh%msh%gdim
372 
373  ! this%work1=dw/dy ; this%work2=dv/dz
374  call opr_xsmm_dudxyz(work1%x, u3%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
375  if (gdim .eq. 3) then
376  call opr_xsmm_dudxyz(work2%x, u2%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
377  call sub3(w1%x, work1%x, work2%x, n)
378  else
379  call copy(w1%x, work1%x, n)
380  endif
381  ! this%work1=du/dz ; this%work2=dw/dx
382  if (gdim .eq. 3) then
383  call opr_xsmm_dudxyz(work1%x, u1%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
384  call opr_xsmm_dudxyz(work2%x, u3%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
385  call sub3(w2%x, work1%x, work2%x, n)
386  else
387  call rzero (work1%x, n)
388  call opr_xsmm_dudxyz(work2%x, u3%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
389  call sub3(w2%x, work1%x, work2%x, n)
390  endif
391  ! this%work1=dv/dx ; this%work2=du/dy
392  call opr_xsmm_dudxyz(work1%x, u2%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
393  call opr_xsmm_dudxyz(work2%x, u1%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
394  call sub3(w3%x, work1%x, work2%x, n)
395  !! BC dependent, Needs to change if cyclic
396 
397  call opcolv(w1%x,w2%x,w3%x,c_xh%B, gdim, n)
398  call c_xh%gs_h%op(w1, gs_op_add)
399  call c_xh%gs_h%op(w2, gs_op_add)
400  call c_xh%gs_h%op(w3, gs_op_add)
401  call opcolv(w1%x, w2%x, w3%x, c_xh%Binv, gdim, n)
402 
403  end subroutine opr_xsmm_curl
404 
405 
406 
407 end module opr_xsmm
Coefficients.
Definition: coef.f90:34
Defines a field.
Definition: field.f90:34
Gather-scatter.
Definition: math.f90:60
subroutine, public invcol2(a, b, n)
Vector division .
Definition: math.f90:631
subroutine, public sub3(a, b, c, n)
Vector subtraction .
Definition: math.f90:558
subroutine, public add2(a, b, n)
Vector addition .
Definition: math.f90:503
subroutine, public addcol3(a, b, c, n)
Returns .
Definition: math.f90:717
subroutine, public col2(a, b, n)
Vector multiplication .
Definition: math.f90:645
subroutine, public copy(a, b, n)
Copy a vector .
Definition: math.f90:211
subroutine, public col3(a, b, c, n)
Vector multiplication with 3 vectors .
Definition: math.f90:658
subroutine, public rzero(a, n)
Zero a real vector.
Definition: math.f90:167
Collection of vector field operations operating on and . Note that in general the indices and ....
Definition: mathops.f90:65
subroutine opcolv(a1, a2, a3, c, gdim, n)
Definition: mathops.f90:94
Defines a mesh.
Definition: mesh.f90:34
Wrapper for all matrix-matrix product implementations.
Definition: mxm_wrapper.F90:2
subroutine, public mxm(a, n1, b, n2, c, n3)
Compute matrix-matrix product for contiguously packed matrices A,B, and C.
Definition: mxm_wrapper.F90:29
integer, parameter, public rp
Global precision used in computations.
Definition: num_types.f90:12
Operators libxsmm backend.
Definition: opr_xsmm.F90:61
subroutine local_grad3_xsmm(ur, us, ut, u, n, D, Dt)
Definition: opr_xsmm.F90:196
subroutine, public opr_xsmm_cdtp(dtx, x, dr, ds, dt, coef)
Definition: opr_xsmm.F90:234
subroutine, public opr_xsmm_dudxyz(du, u, dr, ds, dt, coef)
Definition: opr_xsmm.F90:88
subroutine, public opr_xsmm_opgrad(ux, uy, uz, u, coef)
Definition: opr_xsmm.F90:140
subroutine, public opr_xsmm_curl(w1, w2, w3, u1, u2, u3, work1, work2, c_Xh)
Definition: opr_xsmm.F90:359
subroutine local_grad2(ur, us, u, n, D, Dt)
Definition: opr_xsmm.F90:218
subroutine, public opr_xsmm_conv1(du, u, vx, vy, vz, Xh, coef, nelv, gdim)
Definition: opr_xsmm.F90:288
Defines a function space.
Definition: space.f90:34
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition: coef.f90:54
The function space for the SEM solution fields.
Definition: space.f90:62