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), pass(this), deferred :: compute
46 procedure(ax_compute_vector), pass(this), deferred :: compute_vector
47 procedure, pass(this) :: free => ax_free
48 end type ax_t
49
50 interface
51
55 module subroutine ax_helm_allocator(object, type_name)
56 class(ax_t), allocatable, intent(inout) :: object
57 character(len=*), intent(in) :: type_name
58 end subroutine ax_helm_allocator
59 end interface
60
61 !
62 ! Machinery for injecting user-defined types
63 !
64
68 abstract interface
69 subroutine ax_helm_allocate(obj)
70 import ax_t
71 class(ax_t), allocatable, intent(inout) :: obj
72 end subroutine ax_helm_allocate
73 end interface
74
75 interface
76
77 module subroutine register_ax_helm(type_name, allocator)
78 character(len=*), intent(in) :: type_name
79 procedure(ax_helm_allocate), pointer, intent(in) :: allocator
80 end subroutine register_ax_helm
81 end interface
82
84 type ax_helm_allocator_entry
85 character(len=20) :: type_name
86 procedure(ax_helm_allocate), pointer, nopass :: allocator
87 end type ax_helm_allocator_entry
88
90 type(ax_helm_allocator_entry), allocatable :: ax_helm_registry(:)
91
93 integer :: ax_helm_registry_size = 0
94
95 public :: ax_helm_allocator, register_ax_helm, ax_helm_allocate
96
104 abstract interface
105 subroutine ax_compute(this, w, u, coef, msh, Xh)
106 import space_t
107 import mesh_t
108 import coef_t
109 import ax_t
110 import rp
111 implicit none
112 class(ax_t), intent(in) :: this
113 type(space_t), intent(in) :: Xh
114 type(mesh_t), intent(in) :: msh
115 type(coef_t), intent(in) :: coef
116 real(kind=rp), intent(inout) :: w(xh%lx, xh%ly, xh%lz, msh%nelv)
117 real(kind=rp), intent(in) :: u(xh%lx, xh%ly, xh%lz, msh%nelv)
118 end subroutine ax_compute
119 end interface
120
132 abstract interface
133 subroutine ax_compute_vector(this, au, av, aw, u, v, w, coef, msh, Xh)
134 import space_t
135 import mesh_t
136 import coef_t
137 import ax_t
138 import rp
139 implicit none
140 class(ax_t), intent(in) :: this
141 type(space_t), intent(in) :: Xh
142 type(mesh_t), intent(in) :: msh
143 type(coef_t), intent(in) :: coef
144 real(kind=rp), intent(inout) :: au(xh%lx, xh%ly, xh%lz, msh%nelv)
145 real(kind=rp), intent(inout) :: av(xh%lx, xh%ly, xh%lz, msh%nelv)
146 real(kind=rp), intent(inout) :: aw(xh%lx, xh%ly, xh%lz, msh%nelv)
147 real(kind=rp), intent(in) :: u(xh%lx, xh%ly, xh%lz, msh%nelv)
148 real(kind=rp), intent(in) :: v(xh%lx, xh%ly, xh%lz, msh%nelv)
149 real(kind=rp), intent(in) :: w(xh%lx, xh%ly, xh%lz, msh%nelv)
150 end subroutine ax_compute_vector
151 end interface
152
153contains
154
160 subroutine ax_free(this)
161 class(ax_t), intent(inout) :: this
162 end subroutine ax_free
163
164end module ax_product
Abstract interface for computing inside a Krylov method, taking 3 components of a vector field in a ...
Definition ax.f90:133
Abstract interface for computing inside a Krylov method.
Definition ax.f90:105
Defines a Matrix-vector product.
Definition ax.f90:34
subroutine ax_free(this)
Release resources held by a matrix-vector product.
Definition ax.f90:161
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