Neko 1.99.7
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
precon_fctry.f90
Go to the documentation of this file.
1! Copyright (c) 2021-2024, 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!
33submodule(precon) precon_fctry
34 use identity, only : ident_t
36 use jacobi, only : jacobi_t
37 use sx_jacobi, only : sx_jacobi_t
39 use hsmg, only : hsmg_t
40 use phmg, only : phmg_t
43 implicit none
44
45 ! List of all possible types created by the factory routine
46 character(len=20) :: PC_KNOWN_TYPES(4) = [character(len=20) :: &
47 "jacobi", &
48 "hsmg", &
49 "phmg", &
50 "ident"]
51
52contains
53
55 module subroutine precon_allocator(pc, type_name)
56 class(pc_t), allocatable, intent(inout) :: pc
57 character(len=*), intent(in) :: type_name
58 integer :: i
59
60 if (allocated(pc)) then
61 call precon_destroy(pc)
62 deallocate(pc)
63 end if
64
65 select case (trim(type_name))
66 case ('jacobi')
67 if (neko_bcknd_sx .eq. 1) then
68 allocate(sx_jacobi_t::pc)
69 else if (neko_bcknd_device .eq. 1) then
70 allocate(device_jacobi_t::pc)
71 else
72 allocate(jacobi_t::pc)
73 end if
74 case ('hsmg')
75 allocate(hsmg_t::pc)
76 case ('phmg')
77 allocate(phmg_t::pc)
78 case('ident')
79 if (neko_bcknd_device .eq. 1) then
80 allocate(device_ident_t::pc)
81 else
82 allocate(ident_t::pc)
83 end if
84 case default
85 do i = 1, precon_registry_size
86 if (trim(type_name) .eq. trim(precon_registry(i)%type_name)) then
87 call precon_registry(i)%allocator(pc)
88 return
89 end if
90 end do
91
92 call neko_type_error("preconditioner", type_name, pc_known_types)
93 end select
94
95 end subroutine precon_allocator
96
98 module subroutine precon_destroy(pc)
99 class(pc_t), allocatable, intent(inout) :: pc
100
101 if (allocated(pc)) then
102 select type (pcp => pc)
103 type is (jacobi_t)
104 call pcp%free()
105 type is (sx_jacobi_t)
106 call pcp%free()
107 type is (device_jacobi_t)
108 call pcp%free()
109 type is (hsmg_t)
110 call pcp%free()
111 type is (phmg_t)
112 call pcp%free()
113 end select
114 end if
115
116 end subroutine precon_destroy
117
123 module subroutine register_precon(type_name, allocator)
124 character(len=*), intent(in) :: type_name
125 procedure(precon_allocate), pointer, intent(in) :: allocator
126 type(precon_allocator_entry), allocatable :: temp(:)
127 integer :: i
128
129 do i = 1, size(pc_known_types)
130 if (trim(type_name) .eq. trim(pc_known_types(i))) then
131 call neko_type_registration_error("preconditioner", type_name, &
132 .true.)
133 end if
134 end do
135
136 do i = 1, precon_registry_size
137 if (trim(type_name) .eq. trim(precon_registry(i)%type_name)) then
138 call neko_type_registration_error("preconditioner", type_name, &
139 .false.)
140 end if
141 end do
142
143 if (precon_registry_size .eq. 0) then
144 allocate(precon_registry(1))
145 else
146 allocate(temp(precon_registry_size + 1))
147 temp(1:precon_registry_size) = precon_registry
148 call move_alloc(temp, precon_registry)
149 end if
150
151 precon_registry_size = precon_registry_size + 1
152 precon_registry(precon_registry_size)%type_name = type_name
153 precon_registry(precon_registry_size)%allocator => allocator
154 end subroutine register_precon
155
156end submodule precon_fctry
Identity Krylov preconditioner for accelerators.
Jacobi preconditioner accelerator backend.
Krylov preconditioner.
Definition pc_hsmg.f90:61
Krylov preconditioner (identity)
Jacobi preconditioner.
Definition pc_jacobi.f90:34
Build configurations.
integer, parameter neko_bcknd_sx
integer, parameter neko_bcknd_device
Hybrid ph-multigrid preconditioner.
Definition phmg.f90:34
Krylov preconditioner.
Definition precon.f90:34
Jacobi preconditioner SX-Aurora backend.
Utilities.
Definition utils.f90:35
subroutine, public neko_type_registration_error(base_type, wrong_type, known)
Definition utils.f90:380
subroutine, public neko_type_error(base_type, wrong_type, known_types)
Reports an error allocating a type for a particular base pointer class.
Definition utils.f90:365
Defines a canonical Krylov preconditioner for accelerators.
Defines a jacobi preconditioner.
Defines a canonical Krylov preconditioner.
Defines a jacobi preconditioner.
Definition pc_jacobi.f90:45
Defines a jacobi preconditioner for SX-Aurora.