Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_volflow.f90
Go to the documentation of this file.
1! Copyright (c) 2008-2020, UCHICAGO ARGONNE, LLC.
2! Copyright (c) 2025-2026, The Neko Authors
3!
4! The UChicago Argonne, LLC as Operator of Argonne National
5! Laboratory holds copyright in the Software. The copyright holder
6! reserves all rights except those expressly granted to licensees,
7! and U.S. Government license rights.
8!
9! Redistribution and use in source and binary forms, with or without
10! modification, are permitted provided that the following conditions
11! are met:
12!
13! 1. Redistributions of source code must retain the above copyright
14! notice, this list of conditions and the disclaimer below.
15!
16! 2. Redistributions in binary form must reproduce the above copyright
17! notice, this list of conditions and the disclaimer (as noted below)
18! in the documentation and/or other materials provided with the
19! distribution.
20!
21! 3. Neither the name of ANL nor the names of its contributors
22! may be used to endorse or promote products derived from this software
23! without specific prior written permission.
24!
25! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
29! UCHICAGO ARGONNE, LLC, THE U.S. DEPARTMENT OF
30! ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
32! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37!
38! Additional BSD Notice
39! ---------------------
40! 1. This notice is required to be provided under our contract with
41! the U.S. Department of Energy (DOE). This work was produced at
42! Argonne National Laboratory under Contract
43! No. DE-AC02-06CH11357 with the DOE.
44!
45! 2. Neither the United States Government nor UCHICAGO ARGONNE,
46! LLC nor any of their employees, makes any warranty,
47! express or implied, or assumes any liability or responsibility for the
48! accuracy, completeness, or usefulness of any information, apparatus,
49! product, or process disclosed, or represents that its use would not
50! infringe privately-owned rights.
51!
52! 3. Also, reference herein to any specific commercial products, process,
53! or services by trade name, trademark, manufacturer or otherwise does
54! not necessarily constitute or imply its endorsement, recommendation,
55! or favoring by the United States Government or UCHICAGO ARGONNE LLC.
56! The views and opinions of authors expressed
57! herein do not necessarily state or reflect those of the United States
58! Government or UCHICAGO ARGONNE, LLC, and shall
59! not be used for advertising or product endorsement purposes.
60!
62 use operators, only : opgrad, cdtp, rotate_cyc
63 use num_types, only : rp
64 use mathops, only : opchsign
65 use krylov, only : ksp_t, ksp_monitor_t
66 use precon, only : pc_t
67 use dofmap, only : dofmap_t
68 use field, only : field_t
69 use coefs, only : coef_t
70 use time_state, only : time_state_t
72 use math, only : copy, glsc2, glmin, glmax, add2, abscmp
77 use gather_scatter, only : gs_t, gs_op_add
78 use json_module, only : json_file
83 use ax_product, only : ax_t
85 use mpi_f08, only : mpi_allreduce, mpi_in_place, mpi_sum
86 use logger, only : log_size, neko_log
87 implicit none
88 private
89
91 type, public :: fluid_volflow_t
92 integer :: flow_dir
93 logical :: avflow
94 logical :: log = .true.
95 real(kind=rp) :: flow_rate
96 real(kind=rp) :: dtlag = 0d0
97 real(kind=rp) :: bdlag = 0d0
98 type(field_t) :: u_vol, v_vol, w_vol, p_vol
99 real(kind=rp) :: domain_length, base_flow
100 contains
101 procedure, pass(this) :: init => fluid_vol_flow_init
102 procedure, pass(this) :: free => fluid_vol_flow_free
103 procedure, pass(this) :: adjust => fluid_vol_flow
104 procedure, private, pass(this) :: compute => fluid_vol_flow_compute
105 end type fluid_volflow_t
106
107contains
108
109 subroutine fluid_vol_flow_init(this, dm_Xh, params)
110 class(fluid_volflow_t), intent(inout) :: this
111 type(dofmap_t), target, intent(in) :: dm_Xh
112 type(json_file), intent(inout) :: params
113 logical average, log_output
114 integer :: direction
115 real(kind=rp) :: rate
116
117 call this%free()
118
119 !Initialize vol_flow (if there is a forced volume flow)
120 call json_get_or_lookup(params, 'case.fluid.flow_rate_force.direction', &
121 direction)
122 call json_get_or_lookup(params, 'case.fluid.flow_rate_force.value', rate)
123 call json_get(params, 'case.fluid.flow_rate_force.use_averaged_flow',&
124 average)
125 call json_get_or_default(params, 'case.fluid.flow_rate_force.log', &
126 log_output, .true.)
127
128 this%flow_dir = direction
129 this%avflow = average
130 this%log = log_output
131 this%flow_rate = rate
132
133 if (this%flow_dir .ne. 0) then
134 call this%u_vol%init(dm_xh, 'u_vol')
135 call this%v_vol%init(dm_xh, 'v_vol')
136 call this%w_vol%init(dm_xh, 'w_vol')
137 call this%p_vol%init(dm_xh, 'p_vol')
138 end if
139
140 end subroutine fluid_vol_flow_init
141
142 subroutine fluid_vol_flow_free(this)
143 class(fluid_volflow_t), intent(inout) :: this
144
145 call this%u_vol%free()
146 call this%v_vol%free()
147 call this%w_vol%free()
148 call this%p_vol%free()
149
150 end subroutine fluid_vol_flow_free
151
155 subroutine fluid_vol_flow_compute(this, u_res, v_res, w_res, p_res, &
156 ext_bdf, gs_Xh, c_Xh, rho, mu, bd, dt, &
157 dp_projector, vel_projector, &
158 Ax_vel, Ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, &
159 vel_max_iter)
160 class(fluid_volflow_t), intent(inout) :: this
161 type(field_t), intent(inout) :: u_res, v_res, w_res, p_res
162 type(coef_t), intent(inout) :: c_Xh
163 type(gs_t), intent(inout) :: gs_Xh
164 type(time_scheme_controller_t), intent(in) :: ext_bdf
165 type(scalar_bc_projector_t), intent(inout) :: dp_projector
166 class(vector_bc_projector_t), intent(inout) :: vel_projector
167 class(ax_t), intent(in) :: Ax_vel
168 class(ax_t), intent(in) :: Ax_prs
169 class(ksp_t), intent(inout) :: ksp_prs, ksp_vel
170 class(pc_t), intent(inout) :: pc_prs, pc_vel
171 real(kind=rp), intent(in) :: bd
172 real(kind=rp), intent(in) :: rho, dt
173 type(field_t) :: mu
174 integer, intent(in) :: vel_max_iter, prs_max_iter
175 integer :: n, i
176 real(kind=rp) :: xlmin, xlmax
177 real(kind=rp) :: ylmin, ylmax
178 real(kind=rp) :: zlmin, zlmax
179 type(ksp_monitor_t) :: ksp_results(4)
180 type(field_t), pointer :: ta1, ta2, ta3
181 integer :: temp_indices(3)
182
183 call neko_scratch_registry%request_field(ta1, temp_indices(1), .false.)
184 call neko_scratch_registry%request_field(ta2, temp_indices(2), .false.)
185 call neko_scratch_registry%request_field(ta3, temp_indices(3), .false.)
186
187
188 associate(msh => c_xh%msh, p_vol => this%p_vol, &
189 u_vol => this%u_vol, v_vol => this%v_vol, w_vol => this%w_vol)
190
191 n = c_xh%dof%size()
192 xlmin = glmin(c_xh%dof%x, n)
193 xlmax = glmax(c_xh%dof%x, n)
194 ylmin = glmin(c_xh%dof%y, n) ! for Y!
195 ylmax = glmax(c_xh%dof%y, n)
196 zlmin = glmin(c_xh%dof%z, n) ! for Z!
197 zlmax = glmax(c_xh%dof%z, n)
198 if (this%flow_dir .eq. 1) then
199 this%domain_length = xlmax - xlmin
200 end if
201 if (this%flow_dir .eq. 2) then
202 this%domain_length = ylmax - ylmin
203 end if
204 if (this%flow_dir .eq. 3) then
205 this%domain_length = zlmax - zlmin
206 end if
207
208 if (neko_bcknd_device .eq. 1) then
209 call device_cfill(c_xh%h1_d, 1.0_rp/rho, n)
210 call device_rzero(c_xh%h2_d, n)
211 else
212 !OCL NORECURRENCE, NOVREC, NOALIAS
213 !DIR$ CONCURRENT
214 !DIR$ IVDEP
215 !GCC$ ivdep
216 !$omp parallel do
217 do i = 1, n
218 c_xh%h1(i,1,1,1) = 1.0_rp / rho
219 c_xh%h2(i,1,1,1) = 0.0_rp
220 end do
221 !$omp end parallel do
222 end if
223 c_xh%ifh2 = .false.
224
225 ! Compute pressure
226
227 if (this%flow_dir .eq. 1) then
228 call cdtp(p_res%x, c_xh%h1, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
229 end if
230
231 if (this%flow_dir .eq. 2) then
232 call cdtp(p_res%x, c_xh%h1, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
233 end if
234
235 if (this%flow_dir .eq. 3) then
236 call cdtp(p_res%x, c_xh%h1, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
237 end if
238
239 call gs_xh%op(p_res, gs_op_add)
240 call dp_projector%apply(p_res%x, n)
241 call pc_prs%update()
242 ksp_results(1) = ksp_prs%solve(ax_prs, p_vol, p_res%x, n, &
243 c_xh, dp_projector, gs_xh, prs_max_iter)
244
245 ! Compute velocity
246
247 call opgrad(u_res%x, v_res%x, w_res%x, p_vol%x, c_xh)
248
249 if (neko_bcknd_device .eq. 1) then
250 call device_opchsign(u_res%x_d, v_res%x_d, w_res%x_d, msh%gdim, n)
251 call device_copy(ta1%x_d, c_xh%B_d, n)
252 call device_copy(ta2%x_d, c_xh%B_d, n)
253 call device_copy(ta3%x_d, c_xh%B_d, n)
254 else
255 call opchsign(u_res%x, v_res%x, w_res%x, msh%gdim, n)
256 call copy(ta1%x, c_xh%B, n)
257 call copy(ta2%x, c_xh%B, n)
258 call copy(ta3%x, c_xh%B, n)
259 end if
260 call vel_projector%apply(ta1%x, ta2%x, ta3%x, n)
261
262 ! add forcing
263
264 if (neko_bcknd_device .eq. 1) then
265 if (this%flow_dir .eq. 1) then
266 call device_add2(u_res%x_d, ta1%x_d, n)
267 else if (this%flow_dir .eq. 2) then
268 call device_add2(v_res%x_d, ta2%x_d, n)
269 else if (this%flow_dir .eq. 3) then
270 call device_add2(w_res%x_d, ta3%x_d, n)
271 end if
272 else
273 if (this%flow_dir .eq. 1) then
274 call add2(u_res%x, ta1%x, n)
275 else if (this%flow_dir .eq. 2) then
276 call add2(v_res%x, ta2%x, n)
277 else if (this%flow_dir .eq. 3) then
278 call add2(w_res%x, ta3%x, n)
279 end if
280 end if
281
282 if (neko_bcknd_device .eq. 1) then
283 call device_copy(c_xh%h1_d, mu%x_d, n)
284 call device_cfill(c_xh%h2_d, rho * (bd / dt), n)
285 else
286 call copy(c_xh%h1, mu%x, n)
287 c_xh%h2 = rho * (bd / dt)
288 end if
289 c_xh%ifh2 = .true.
290
291 call rotate_cyc(u_res, v_res, w_res, 1, c_xh)
292 call gs_xh%op(u_res%x, v_res%x, w_res%x, n, gs_op_add)
293 call rotate_cyc(u_res, v_res, w_res, 0, c_xh)
294
295 call vel_projector%apply(u_res%x, v_res%x, w_res%x, n)
296 call pc_vel%update()
297
298 ksp_results(2:4) = ksp_vel%solve_coupled(ax_vel, &
299 u_vol, v_vol, w_vol, &
300 u_res%x, v_res%x, w_res%x, &
301 n, c_xh, &
302 vel_projector, &
303 gs_xh, vel_max_iter)
304
305 if (neko_bcknd_device .eq. 1) then
306 if (this%flow_dir .eq. 1) then
307 this%base_flow = &
308 device_glsc2(u_vol%x_d, c_xh%B_d, n) / this%domain_length
309 end if
310
311 if (this%flow_dir .eq. 2) then
312 this%base_flow = &
313 device_glsc2(v_vol%x_d, c_xh%B_d, n) / this%domain_length
314 end if
315
316 if (this%flow_dir .eq. 3) then
317 this%base_flow = &
318 device_glsc2(w_vol%x_d, c_xh%B_d, n) / this%domain_length
319 end if
320 else
321 if (this%flow_dir .eq. 1) then
322 this%base_flow = glsc2(u_vol%x, c_xh%B, n) / this%domain_length
323 end if
324
325 if (this%flow_dir .eq. 2) then
326 this%base_flow = glsc2(v_vol%x, c_xh%B, n) / this%domain_length
327 end if
328
329 if (this%flow_dir .eq. 3) then
330 this%base_flow = glsc2(w_vol%x, c_xh%B, n) / this%domain_length
331 end if
332 end if
333 end associate
334
335 call neko_scratch_registry%relinquish_field(temp_indices)
336 end subroutine fluid_vol_flow_compute
337
347 subroutine fluid_vol_flow(this, u, v, w, p, u_res, v_res, w_res, p_res, &
348 c_Xh, gs_Xh, ext_bdf, rho, mu, dt, time, &
349 dp_projector, vel_projector, &
350 Ax_vel, Ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, &
351 vel_max_iter)
352
353 class(fluid_volflow_t), intent(inout) :: this
354 type(field_t), intent(inout) :: u, v, w, p
355 type(field_t), intent(inout) :: u_res, v_res, w_res, p_res
356 type(coef_t), intent(inout) :: c_Xh
357 type(gs_t), intent(inout) :: gs_Xh
358 type(time_scheme_controller_t), intent(in) :: ext_bdf
359 type(time_state_t), intent(in) :: time
360 real(kind=rp), intent(in) :: rho, dt
361 type(field_t) :: mu
362 type(scalar_bc_projector_t), intent(inout) :: dp_projector
363 class(vector_bc_projector_t), intent(inout) :: vel_projector
364 class(ax_t), intent(in) :: Ax_vel
365 class(ax_t), intent(in) :: Ax_prs
366 class(ksp_t), intent(inout) :: ksp_prs, ksp_vel
367 class(pc_t), intent(inout) :: pc_prs, pc_vel
368 integer, intent(in) :: prs_max_iter, vel_max_iter
369 real(kind=rp) :: ifcomp, flow_rate, xsec
370 real(kind=rp) :: current_flow, delta_flow, scale
371 integer :: n, ierr, i
372 character(len=5) :: flow_dir_label
373 character(len=12) :: step_str
374
375 character(len=200) :: log_buf
376
377 associate(u_vol => this%u_vol, v_vol => this%v_vol, &
378 w_vol => this%w_vol, p_vol => this%p_vol)
379
380 n = c_xh%dof%size()
381
382 ! If either dt or the backwards difference coefficient change,
383 ! then recompute base flow solution corresponding to unit forcing:
384
385 ifcomp = 0.0_rp
386
387 if ((.not. abscmp(dt, this%dtlag)) .or. &
388 (.not. abscmp(ext_bdf%diffusion_coeffs%x(1), this%bdlag))) then
389 ifcomp = 1.0_rp
390 end if
391
392 this%dtlag = dt
393 this%bdlag = ext_bdf%diffusion_coeffs%x(1)
394
395 call mpi_allreduce(mpi_in_place, ifcomp, 1, &
396 mpi_real_precision, mpi_sum, neko_comm, ierr)
397
398 if (ifcomp .gt. 0d0) then
399 call this%compute(u_res, v_res, w_res, p_res, &
400 ext_bdf, gs_xh, c_xh, rho, mu, ext_bdf%diffusion_coeffs%x(1), dt, &
401 dp_projector, vel_projector, &
402 ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, &
403 vel_max_iter)
404 end if
405
406 if (neko_bcknd_device .eq. 1) then
407 if (this%flow_dir .eq. 1) then
408 current_flow = &
409 device_glsc2(u%x_d, c_xh%B_d, n) / this%domain_length ! for X
410 else if (this%flow_dir .eq. 2) then
411 current_flow = &
412 device_glsc2(v%x_d, c_xh%B_d, n) / this%domain_length ! for Y
413 else if (this%flow_dir .eq. 3) then
414 current_flow = &
415 device_glsc2(w%x_d, c_xh%B_d, n) / this%domain_length ! for Z
416 end if
417 else
418 if (this%flow_dir .eq. 1) then
419 current_flow = glsc2(u%x, c_xh%B, n) / this%domain_length ! for X
420 else if (this%flow_dir .eq. 2) then
421 current_flow = glsc2(v%x, c_xh%B, n) / this%domain_length ! for Y
422 else if (this%flow_dir .eq. 3) then
423 current_flow = glsc2(w%x, c_xh%B, n) / this%domain_length ! for Z
424 end if
425 end if
426
427 if (this%avflow) then
428 xsec = c_xh%volume / this%domain_length
429 flow_rate = this%flow_rate*xsec
430 else
431 flow_rate = this%flow_rate
432 end if
433
434 delta_flow = flow_rate - current_flow
435 scale = delta_flow / this%base_flow
436
437 if (this%log .and. pe_rank .eq. 0) then
438 if (this%flow_dir .eq. 1) then
439 flow_dir_label = ' x'
440 else if (this%flow_dir .eq. 2) then
441 flow_dir_label = ' y'
442 else if (this%flow_dir .eq. 3) then
443 flow_dir_label = ' z'
444 end if
445 write(step_str, '(I12)') time%tstep
446 step_str = adjustl(step_str)
447 write(log_buf, '(A,A3,A5,1X,5A18)') &
448 'Flow rate ', ' | ', 'Dir.:', 'Time:', 'Scale:', 'Rate:', &
449 'Current:', 'Base:'
450 call neko_log%message(log_buf)
451 write(log_buf, '(A12,A3,A5,1X,5E18.9)') step_str, ' | ', &
452 flow_dir_label, time%t, scale, flow_rate, current_flow, &
453 this%base_flow
454 call neko_log%message(log_buf)
455 end if
456
457 if (neko_bcknd_device .eq. 1) then
458 call device_add2s2(u%x_d, u_vol%x_d, scale, n)
459 call device_add2s2(v%x_d, v_vol%x_d, scale, n)
460 call device_add2s2(w%x_d, w_vol%x_d, scale, n)
461 call device_add2s2(p%x_d, p_vol%x_d, scale, n)
462 else
463 !OCL NORECURRENCE, NOVREC, NOALIAS
464 !DIR$ CONCURRENT
465 !DIR$ IVDEP
466 !GCC$ ivdep
467 !$omp parallel do
468 do i = 1, n
469 u%x(i,1,1,1) = u%x(i,1,1,1) + scale * u_vol%x(i,1,1,1)
470 v%x(i,1,1,1) = v%x(i,1,1,1) + scale * v_vol%x(i,1,1,1)
471 w%x(i,1,1,1) = w%x(i,1,1,1) + scale * w_vol%x(i,1,1,1)
472 p%x(i,1,1,1) = p%x(i,1,1,1) + scale * p_vol%x(i,1,1,1)
473 end do
474 !$omp end parallel do
475 end if
476 end associate
477
478 end subroutine fluid_vol_flow
479
480end module fluid_volflow
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Apply cyclic boundary condition to a vector field.
Defines a Matrix-vector product.
Definition ax.f90:34
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_datatype), public mpi_real_precision
MPI type for working precision of REAL types.
Definition comm.F90:54
integer, public pe_rank
MPI rank.
Definition comm.F90:59
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:46
subroutine, public device_add2s2(a_d, b_d, c1, n, strm)
Vector addition with scalar multiplication (multiplication on first argument)
subroutine, public device_add2(a_d, b_d, n, strm)
Vector addition .
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_copy(a_d, b_d, n, strm)
Copy a vector .
real(kind=rp) function, public device_glsc2(a_d, b_d, n, strm)
Weighted inner product .
subroutine, public device_cfill(a_d, c, n, strm)
Set all elements to a constant c .
subroutine, public device_opchsign(a1_d, a2_d, a3_d, gdim, n)
Defines a mapping of the degrees of freedom.
Definition dofmap.f90:35
Defines a field.
Definition field.f90:34
subroutine fluid_vol_flow_compute(this, u_res, v_res, w_res, p_res, ext_bdf, gs_xh, c_xh, rho, mu, bd, dt, dp_projector, vel_projector, ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
Compute flow adjustment.
subroutine fluid_vol_flow(this, u, v, w, p, u_res, v_res, w_res, p_res, c_xh, gs_xh, ext_bdf, rho, mu, dt, time, dp_projector, vel_projector, ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
Adjust flow volume.
subroutine fluid_vol_flow_init(this, dm_xh, params)
subroutine fluid_vol_flow_free(this)
Gather-scatter.
Utilities for retrieving parameters from the case files.
Implements the base abstract type for Krylov solvers plus helper types.
Definition krylov.f90:34
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:80
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
real(kind=rp) function, public glsc2(a, b, n)
Weighted inner product .
Definition math.f90:1269
subroutine, public add2(a, b, n)
Vector addition .
Definition math.f90:903
real(kind=rp) function, public glmax(a, n)
Max of a vector of length n.
Definition math.f90:653
subroutine, public copy(a, b, n)
Copy a vector .
Definition math.f90:294
real(kind=rp) function, public glmin(a, n)
Min of a vector of length n.
Definition math.f90:691
Collection of vector field operations operating on and . Note that in general the indices and ....
Definition mathops.f90:67
subroutine, public opchsign(a1, a2, a3, gdim, n)
for and .
Definition mathops.f90:78
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Operators.
Definition operators.f90:34
subroutine, public opgrad(ux, uy, uz, u, coef, es, ee)
Compute the weak gradient of a scalar field, i.e. the gradient multiplied by the mass matrix.
subroutine, public cdtp(dtx, x, dr, ds, dt, coef, es, ee)
Apply D^T to a scalar field, where D is the derivative matrix.
Krylov preconditioner.
Definition precon.f90:34
Implements scalar_projector_t.
Defines a registry for storing and requesting temporary objects This can be used when you have a func...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Compound scheme for the advection and diffusion operators in a transport equation.
Module with things related to the simulation time.
Implements boundary condition projectors for vector fields. Two types concrete types are provided: se...
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
Gather-scatter kernel.
Type for storing initial and final residuals in a Krylov solver.
Definition krylov.f90:57
Base abstract type for a canonical Krylov method, solving .
Definition krylov.f90:74
Defines a canonical Krylov preconditioner.
Definition precon.f90:40
Projector for scalar boundary conditions.
Implements the logic to compute the time coefficients for the advection and diffusion operators in a ...
A struct that contains all info about the time, expand as needed.
Abstract type for resolving vector boundary conditions.