Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
ax.f90
Go to the documentation of this file.
1! Copyright (c) 2020-2026, The Neko Authors
2! All rights reserved.
3!
4! Redistribution and use in source and binary forms, with or without
5! modification, are permitted provided that the following conditions
6! are met:
7!
8! * Redistributions of source code must retain the above copyright
9! notice, this list of conditions and the following disclaimer.
10!
11! * Redistributions in binary form must reproduce the above
12! copyright notice, this list of conditions and the following
13! disclaimer in the documentation and/or other materials provided
14! with the distribution.
15!
16! * Neither the name of the authors nor the names of its
17! contributors may be used to endorse or promote products derived
18! from this software without specific prior written permission.
19!
20! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31! POSSIBILITY OF SUCH DAMAGE.
32!
35 use num_types, only : rp
36 use coefs, only : coef_t
37 use space, only : space_t
38 use mesh, only : mesh_t
39 implicit none
40 private
41
43 type, public, abstract :: ax_t
44 contains
45 procedure(ax_compute), nopass, deferred :: compute
46 procedure(ax_compute_vector), pass(this), deferred :: compute_vector
47 end type ax_t
48
49 interface
50
54 module subroutine ax_helm_allocator(object, type_name)
55 class(ax_t), allocatable, intent(inout) :: object
56 character(len=*), intent(in) :: type_name
57 end subroutine ax_helm_allocator
58 end interface
59
60 !
61 ! Machinery for injecting user-defined types
62 !
63
67 abstract interface
68 subroutine ax_helm_allocate(obj)
69 import ax_t
70 class(ax_t), allocatable, intent(inout) :: obj
71 end subroutine ax_helm_allocate
72 end interface
73
74 interface
75
76 module subroutine register_ax_helm(type_name, allocator)
77 character(len=*), intent(in) :: type_name
78 procedure(ax_helm_allocate), pointer, intent(in) :: allocator
79 end subroutine register_ax_helm
80 end interface
81
83 type ax_helm_allocator_entry
84 character(len=20) :: type_name
85 procedure(ax_helm_allocate), pointer, nopass :: allocator
86 end type ax_helm_allocator_entry
87
89 type(ax_helm_allocator_entry), allocatable :: ax_helm_registry(:)
90
92 integer :: ax_helm_registry_size = 0
93
94 public :: ax_helm_allocator, register_ax_helm, ax_helm_allocate
95
103 abstract interface
104 subroutine ax_compute(w, u, coef, msh, Xh)
105 import space_t
106 import mesh_t
107 import coef_t
108 import ax_t
109 import rp
110 implicit none
111 type(space_t), intent(in) :: Xh
112 type(mesh_t), intent(in) :: msh
113 type(coef_t), intent(in) :: coef
114 real(kind=rp), intent(inout) :: w(xh%lx, xh%ly, xh%lz, msh%nelv)
115 real(kind=rp), intent(in) :: u(xh%lx, xh%ly, xh%lz, msh%nelv)
116 end subroutine ax_compute
117 end interface
118
130 abstract interface
131 subroutine ax_compute_vector(this, au, av, aw, u, v, w, coef, msh, Xh)
132 import space_t
133 import mesh_t
134 import coef_t
135 import ax_t
136 import rp
137 implicit none
138 class(ax_t), intent(in) :: this
139 type(space_t), intent(in) :: Xh
140 type(mesh_t), intent(in) :: msh
141 type(coef_t), intent(in) :: coef
142 real(kind=rp), intent(inout) :: au(xh%lx, xh%ly, xh%lz, msh%nelv)
143 real(kind=rp), intent(inout) :: av(xh%lx, xh%ly, xh%lz, msh%nelv)
144 real(kind=rp), intent(inout) :: aw(xh%lx, xh%ly, xh%lz, msh%nelv)
145 real(kind=rp), intent(in) :: u(xh%lx, xh%ly, xh%lz, msh%nelv)
146 real(kind=rp), intent(in) :: v(xh%lx, xh%ly, xh%lz, msh%nelv)
147 real(kind=rp), intent(in) :: w(xh%lx, xh%ly, xh%lz, msh%nelv)
148 end subroutine ax_compute_vector
149 end interface
150
151end module ax_product
Abstract interface for computing inside a Krylov method, taking 3 components of a vector field in a ...
Definition ax.f90:131
Abstract interface for computing inside a Krylov method.
Definition ax.f90:104
Defines a Matrix-vector product.
Definition ax.f90:34
Coefficients.
Definition coef.f90:34
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Defines a function space.
Definition space.f90:34
Base type for a matrix-vector product providing .
Definition ax.f90:43
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:93
The function space for the SEM solution fields.
Definition space.f90:64