Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
scalar_scheme.f90
Go to the documentation of this file.
1! Copyright (c) 2022-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!
34
36 use gather_scatter, only : gs_t
37 use checkpoint, only : chkp_t
39 use num_types, only : rp
40 use field, only : field_t
41 use field_list, only : field_list_t
42 use space, only : space_t
43 use dofmap, only : dofmap_t
44 use krylov, only : ksp_t, krylov_solver_factory, ksp_max_iter, ksp_monitor_t
45 use coefs, only : coef_t
46 use bc_list, only : bc_list_t
47 use bc, only : bc_t
48 use precon, only : pc_t, precon_factory
49 use mesh, only : mesh_t
52 use registry, only : neko_registry
55 use json_module, only : json_file
66 use time_state, only : time_state_t
68 use scalar_ic, only : set_scalar_ic
70 implicit none
71
73 type, abstract :: scalar_scheme_t
75 character(len=:), allocatable :: name
77 type(field_t), pointer :: u
79 type(field_t), pointer :: v
81 type(field_t), pointer :: w
83 type(field_t), pointer :: s
85 type(field_series_t) :: slag
87 type(space_t), pointer :: xh
89 type(dofmap_t), pointer :: dm_xh
91 type(gs_t), pointer :: gs_xh
93 type(coef_t), pointer :: c_xh
95 type(field_t), pointer :: f_xh => null()
99 class(ksp_t), allocatable :: ksp
101 integer :: ksp_maxiter
103 integer :: projection_dim
104
105 integer :: projection_activ_step
107 class(pc_t), allocatable :: pc
109 type(bc_list_t) :: bcs
111 type(json_file), pointer :: params => null()
113 type(mesh_t), pointer :: msh => null()
115 type(chkp_t), pointer :: chkp => null()
117 character(len=:), allocatable :: nut_field_name
119 character(len=:), allocatable :: alphat_field_name
121 type(field_t), pointer :: rho => null()
123 type(field_t), pointer :: lambda => null()
125 type(field_t), pointer :: cp => null()
127 type(field_t), pointer :: lambda_tot => null()
129 real(kind=rp) :: pr_turb
131 type(field_list_t) :: material_properties
132 procedure(user_material_properties_intf), nopass, pointer :: &
133 user_material_properties => null()
135 logical :: freeze = .false.
137 logical :: svv_enabled = .false.
139 type(svv_t), allocatable :: svv
140 contains
142 procedure, pass(this) :: scheme_init => scalar_scheme_init
144 procedure, pass(this) :: scheme_free => scalar_scheme_free
146 procedure, pass(this) :: validate => scalar_scheme_validate
148 procedure, pass(this) :: set_initial_condition => &
151 procedure, pass(this) :: register_checkpoint => &
154 procedure, pass(this) :: set_material_properties => &
157 procedure, pass(this) :: update_material_properties => &
160 procedure(scalar_scheme_init_intrf), pass(this), deferred :: init
162 procedure(scalar_scheme_free_intrf), pass(this), deferred :: free
164 procedure(scalar_scheme_step_intrf), pass(this), deferred :: step
166 procedure(scalar_scheme_restart_intrf), pass(this), deferred :: restart
167 end type scalar_scheme_t
168
170 abstract interface
171 subroutine scalar_scheme_init_intrf(this, msh, coef, gs, params, &
172 numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
173 import scalar_scheme_t
174 import json_file
175 import coef_t
176 import gs_t
177 import mesh_t
178 import user_t
179 import field_series_t, field_t
181 import rp
182 import chkp_t
183 class(scalar_scheme_t), target, intent(inout) :: this
184 type(mesh_t), target, intent(in) :: msh
185 type(coef_t), target, intent(in) :: coef
186 type(gs_t), target, intent(inout) :: gs
187 type(json_file), target, intent(inout) :: params
188 type(json_file), target, intent(inout) :: numerics_params
189 type(user_t), target, intent(in) :: user
190 type(chkp_t), target, intent(inout) :: chkp
191 type(field_series_t), target, intent(in) :: ulag, vlag, wlag
192 type(time_scheme_controller_t), target, intent(in) :: time_scheme
193 type(field_t), target, intent(in) :: rho
194 end subroutine scalar_scheme_init_intrf
195 end interface
196
198 abstract interface
199 subroutine scalar_scheme_restart_intrf(this, chkp)
200 import scalar_scheme_t
201 import chkp_t
202 import rp
203 class(scalar_scheme_t), target, intent(inout) :: this
204 type(chkp_t), intent(inout) :: chkp
205 end subroutine scalar_scheme_restart_intrf
206 end interface
207
209 abstract interface
211 import scalar_scheme_t
212 class(scalar_scheme_t), intent(inout) :: this
213 end subroutine scalar_scheme_free_intrf
214 end interface
215
217 abstract interface
218 subroutine scalar_scheme_step_intrf(this, time, ext_bdf, dt_controller, &
219 ksp_results)
220 import scalar_scheme_t
221 import time_state_t
224 import ksp_monitor_t
225 class(scalar_scheme_t), intent(inout) :: this
226 type(time_state_t), intent(in) :: time
227 type(time_scheme_controller_t), intent(in) :: ext_bdf
228 type(time_step_controller_t), intent(in) :: dt_controller
229 type(ksp_monitor_t), intent(inout) :: ksp_results
230 end subroutine scalar_scheme_step_intrf
231 end interface
232
233 ! ========================================================================== !
234 ! Helper functions and types for scalar_scheme_t
235 ! ========================================================================== !
236
239 class(scalar_scheme_t), allocatable :: scalar
240 contains
242 procedure, pass(this) :: init => scalar_scheme_wrapper_init
244 procedure, pass(this) :: free => scalar_scheme_wrapper_free
247 procedure, pass(this) :: move_from => &
250 procedure, pass(this) :: is_allocated => &
253
254
255 interface
256
269 module subroutine scalar_scheme_factory(object, msh, coef, gs, params, &
270 numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
271 class(scalar_scheme_t), allocatable, intent(inout) :: object
272 type(mesh_t), target, intent(in) :: msh
273 type(coef_t), target, intent(in) :: coef
274 type(gs_t), target, intent(inout) :: gs
275 type(json_file), target, intent(inout) :: params
276 type(json_file), target, intent(inout) :: numerics_params
277 type(user_t), target, intent(in) :: user
278 type(chkp_t), target, intent(inout) :: chkp
279 type(field_series_t), target, intent(in) :: ulag, vlag, wlag
280 type(time_scheme_controller_t), target, intent(in) :: time_scheme
281 type(field_t), target, intent(in) :: rho
282 end subroutine scalar_scheme_factory
283 end interface
284
285 interface
286
289 module subroutine scalar_scheme_allocator(object, type_name)
290 class(scalar_scheme_t), allocatable, intent(inout) :: object
291 character(len=*), intent(in):: type_name
292 end subroutine scalar_scheme_allocator
293 end interface
294
295 !
296 ! Machinery for injecting user-defined types
297 !
298
302 abstract interface
303 subroutine scalar_scheme_allocate(obj)
304 import scalar_scheme_t
305 class(scalar_scheme_t), allocatable, intent(inout) :: obj
306 end subroutine scalar_scheme_allocate
307 end interface
308
309 interface
310
311 module subroutine register_scalar_scheme(type_name, allocator)
312 character(len=*), intent(in) :: type_name
313 procedure(scalar_scheme_allocate), pointer, intent(in) :: allocator
314 end subroutine register_scalar_scheme
315 end interface
316
317 ! A name-allocator pair for user-defined types. A helper type to define a
318 ! registry of custom allocators.
319 type scalar_scheme_allocator_entry
320 character(len=NEKO_TYPENAME_LEN) :: type_name
321 procedure(scalar_scheme_allocate), pointer, nopass :: allocator
322 end type scalar_scheme_allocator_entry
323
325 type(scalar_scheme_allocator_entry), allocatable, private :: &
326 scalar_scheme_registry(:)
327
329 integer, private :: scalar_scheme_registry_size = 0
330
331contains
332
341 subroutine scalar_scheme_init(this, msh, c_Xh, gs_Xh, params, scheme, user, &
342 rho)
343 class(scalar_scheme_t), target, intent(inout) :: this
344 type(mesh_t), target, intent(in) :: msh
345 type(coef_t), target, intent(in) :: c_Xh
346 type(gs_t), target, intent(inout) :: gs_Xh
347 type(json_file), target, intent(inout) :: params
348 character(len=*), intent(in) :: scheme
349 type(user_t), target, intent(in) :: user
350 type(field_t), target, intent(in) :: rho
351 ! IO buffer for log output
352 character(len=LOG_SIZE) :: log_buf
353 ! Variables for retrieving json parameters
354 logical :: logical_val
355 real(kind=rp) :: real_val, solver_abstol
356 integer :: integer_val, ierr
357 character(len=:), allocatable :: solver_type, solver_precon
358 type(json_file) :: precon_params
359 type(json_file) :: json_subdict
360 logical :: nut_dependency
361
362 this%u => neko_registry%get_field('u')
363 this%v => neko_registry%get_field('v')
364 this%w => neko_registry%get_field('w')
365 this%rho => rho
366
367 ! Assign a name
368 ! Note that the keyword is added by `scalars_t`, so there is always a
369 ! default.
370 call json_get(params, 'name', this%name)
371
372 ! Set the freeze flag
373 call json_get_or_default(params, 'freeze', this%freeze, .false.)
374
375 call neko_log%section('Scalar')
376 call json_get(params, 'solver.type', solver_type)
377 call json_get(params, 'solver.preconditioner.type', &
378 solver_precon)
379 call json_get(params, 'solver.preconditioner', precon_params)
380 call json_get_or_lookup(params, 'solver.absolute_tolerance', &
381 solver_abstol)
382
383 call json_get_or_lookup_or_default(params, &
384 'solver.projection_space_size', &
385 this%projection_dim, 0)
386 call json_get_or_lookup_or_default(params, &
387 'solver.projection_hold_steps', &
388 this%projection_activ_step, 5)
389
390
391 write(log_buf, '(A, A)') 'Type : ', trim(scheme)
392 call neko_log%message(log_buf)
393 write(log_buf, '(A, A)') 'Name : ', trim(this%name)
394 call neko_log%message(log_buf)
395 call neko_log%message('Ksp scalar : ('// trim(solver_type) // &
396 ', ' // trim(solver_precon) // ')')
397 write(log_buf, '(A,ES13.6)') ' `-abs tol :', solver_abstol
398 call neko_log%message(log_buf)
399
400 this%Xh => this%u%Xh
401 this%dm_Xh => this%u%dof
402 if (associated(this%params)) then
403 deallocate(this%params)
404 end if
405 allocate(this%params)
406 this%params = params
407 this%msh => msh
408
409 call neko_registry%add_field(this%dm_Xh, this%name, &
410 ignore_existing = .true.)
411
412 this%s => neko_registry%get_field(this%name)
413
414 call this%slag%init(this%s, 2)
415
416 this%gs_Xh => gs_xh
417 this%c_Xh => c_xh
418
419 !
420 ! Material properties
421 !
422 call this%set_material_properties(params, user)
423
424 !
425 ! Spectral vanishing viscosity
426 !
427 if (params%valid_path('svv')) then
428 call json_get_or_default(params, 'svv.enabled', this%svv_enabled, &
429 .false.)
430 if (this%svv_enabled) then
431 allocate(this%svv)
432 call this%svv%init(params, this%c_Xh, this%rho)
433 end if
434 end if
435
436
437 !
438 ! Turbulence modelling
439 !
440 this%alphat_field_name = ""
441 this%nut_field_name = ""
442 if (params%valid_path('alphat')) then
443 call json_get(this%params, 'alphat', json_subdict)
444 call json_get(json_subdict, 'nut_dependency', nut_dependency)
445 if (nut_dependency) then
446 call json_get_or_lookup(json_subdict, 'Pr_t', this%pr_turb)
447 call json_get(json_subdict, 'nut_field', this%nut_field_name)
448 else
449 call json_get(json_subdict, 'alphat_field', this%alphat_field_name)
450 end if
451 end if
452
453 !
454 ! Setup right-hand side field.
455 !
456 allocate(this%f_Xh)
457 call this%f_Xh%init(this%dm_Xh, fld_name = "scalar_rhs")
458
459 ! Initialize the source term
460 call this%source_term%init(this%f_Xh, this%c_Xh, user, this%name)
461 call this%source_term%add(params, 'source_terms')
462
463 ! todo parameter file ksp tol should be added
464 call json_get_or_lookup_or_default(params, &
465 'solver.max_iterations', &
466 integer_val, ksp_max_iter)
467 call json_get_or_default(params, &
468 'solver.monitor', &
469 logical_val, .false.)
470 call scalar_scheme_solver_factory(this%ksp, this%dm_Xh%size(), &
471 solver_type, integer_val, solver_abstol, logical_val)
472 call scalar_scheme_precon_factory(this%pc, this%ksp, &
473 this%c_Xh, this%bcs, &
474 solver_precon, precon_params)
475
476 call neko_log%end_section()
477
478 end subroutine scalar_scheme_init
479
483 subroutine scalar_scheme_set_initial_condition(this, user, scalar_index)
484 class(scalar_scheme_t), intent(inout) :: this
485 type(user_t), intent(in) :: user
486 integer, intent(in) :: scalar_index
487 character(len=:), allocatable :: ic_type
488 type(json_file) :: ic_params
489
490 call json_get(this%params, 'initial_condition.type', ic_type)
491 call json_get(this%params, 'initial_condition', ic_params)
492
493 if (trim(ic_type) .ne. 'user') then
494 call set_scalar_ic(this%s, this%c_Xh, this%gs_Xh, ic_type, &
495 ic_params, scalar_index)
496 else
497 call set_scalar_ic(this%name, this%s, this%c_Xh, this%gs_Xh, &
498 user%initial_conditions)
499 end if
500
501 call ic_params%destroy()
502 deallocate(ic_type)
503
504 end subroutine scalar_scheme_set_initial_condition
505
508 subroutine scalar_scheme_register_checkpoint(this, chkp)
509 class(scalar_scheme_t), target, intent(inout) :: this
510 type(chkp_t), intent(inout) :: chkp
511 type(checkpoint_payload_t), pointer :: payload
512
513 payload => chkp%add_payload("scalars/" // trim(this%name))
514 call payload%add_field(this%s)
515 call payload%add_series(this%slag)
516
517 end subroutine scalar_scheme_register_checkpoint
518
519
521 subroutine scalar_scheme_free(this)
522 class(scalar_scheme_t), intent(inout) :: this
523 class(bc_t), pointer :: bc
524 integer :: i
525
526 bc => null()
527
528 if (allocated(this%svv)) then
529 call this%svv%free()
530 deallocate(this%svv)
531 end if
532 this%svv_enabled = .false.
533
534 nullify(this%Xh)
535 nullify(this%dm_Xh)
536 nullify(this%gs_Xh)
537 nullify(this%c_Xh)
538 if (associated(this%params)) then
539 deallocate(this%params)
540 nullify(this%params)
541 end if
542
543 if (allocated(this%ksp)) then
544 call this%ksp%free()
545 deallocate(this%ksp)
546 end if
547
548 if (allocated(this%pc)) then
549 call this%pc%free()
550 deallocate(this%pc)
551 end if
552
553 if (allocated(this%name)) then
554 deallocate(this%name)
555 end if
556
557 call this%source_term%free()
558
559 if (associated(this%f_Xh)) then
560 call this%f_Xh%free()
561 deallocate(this%f_Xh)
562 end if
563
564 do i = 1, this%bcs%size()
565 bc => this%bcs%get(i)
566 if (associated(bc)) then
567 call bc%free()
568 deallocate(bc)
569 end if
570 end do
571
572 call this%bcs%free()
573 call this%slag%free()
574 call this%material_properties%free()
575
576 if (allocated(this%nut_field_name)) then
577 deallocate(this%nut_field_name)
578 end if
579
580 if (allocated(this%alphat_field_name)) then
581 deallocate(this%alphat_field_name)
582 end if
583
584 nullify(this%cp)
585 nullify(this%lambda)
586 nullify(this%lambda_tot)
587 nullify(bc)
588
589 end subroutine scalar_scheme_free
590
593 subroutine scalar_scheme_validate(this)
594 class(scalar_scheme_t), target, intent(inout) :: this
595
596 if ( (.not. allocated(this%u%x)) .or. &
597 (.not. allocated(this%v%x)) .or. &
598 (.not. allocated(this%w%x)) .or. &
599 (.not. allocated(this%s%x))) then
600 call neko_error('Fields are not allocated')
601 end if
602
603 if (.not. allocated(this%ksp)) then
604 call neko_error('No Krylov solver for velocity defined')
605 end if
606
607 if (.not. associated(this%Xh)) then
608 call neko_error('No function space defined')
609 end if
610
611 if (.not. associated(this%dm_Xh)) then
612 call neko_error('No dofmap defined')
613 end if
614
615 if (.not. associated(this%c_Xh)) then
616 call neko_error('No coefficients defined')
617 end if
618
619 if (.not. associated(this%f_Xh)) then
620 call neko_error('No rhs allocated')
621 end if
622
623 if (.not. associated(this%params)) then
624 call neko_error('No parameters defined')
625 end if
626
627 if (.not. associated(this%rho)) then
628 call neko_error('No density field defined')
629 end if
630
631 end subroutine scalar_scheme_validate
632
635 subroutine scalar_scheme_solver_factory(ksp, n, solver, max_iter, &
636 abstol, monitor)
637 class(ksp_t), allocatable, target, intent(inout) :: ksp
638 integer, intent(in), value :: n
639 integer, intent(in) :: max_iter
640 character(len=*), intent(in) :: solver
641 real(kind=rp) :: abstol
642 logical, intent(in) :: monitor
643
644 call krylov_solver_factory(ksp, n, solver, max_iter, &
645 abstol, monitor = monitor)
646
647 end subroutine scalar_scheme_solver_factory
648
650 subroutine scalar_scheme_precon_factory(pc, ksp, coef, bclst, &
651 pctype, json)
652 class(pc_t), allocatable, target, intent(inout) :: pc
653 class(ksp_t), target, intent(inout) :: ksp
654 type(coef_t), target, intent(in) :: coef
655 type(bc_list_t), target, intent(inout) :: bclst
656 character(len=*) :: pctype
657 type(json_file), intent(inout) :: json
658
659 call precon_factory(pc, pctype, coef, bclst, json)
660
661 call ksp%set_pc(pc)
662
663 end subroutine scalar_scheme_precon_factory
664
669 subroutine scalar_scheme_update_material_properties(this, time)
670 class(scalar_scheme_t), intent(inout) :: this
671 type(time_state_t), intent(in) :: time
672 type(field_t), pointer :: nut, alphat
673 integer :: index
674 ! Factor to transform nu_t to lambda_t
675 type(field_t), pointer :: lambda_factor
676
677 call this%user_material_properties(this%name, this%material_properties, &
678 time)
679
680 ! factor = rho * cp / pr_turb
681 if (len_trim(this%nut_field_name) .gt. 0 &
682 .and. len_trim(this%alphat_field_name) .eq. 0 ) then
683 nut => neko_registry%get_field(this%nut_field_name)
684
685 ! lambda_tot = lambda + rho * cp * nut / pr_turb
686 call neko_scratch_registry%request_field(lambda_factor, index, .false.)
687 call field_cmult2(lambda_factor, nut, 1.0_rp / this%pr_turb)
688 call field_col2(lambda_factor, this%cp)
689 call field_col2(lambda_factor, this%rho)
690 call field_add3(this%lambda_tot, this%lambda, lambda_factor)
691 call neko_scratch_registry%relinquish_field(index)
692
693 else if (len_trim(this%alphat_field_name) .gt. 0 &
694 .and. len_trim(this%nut_field_name) .eq. 0 ) then
695 alphat => neko_registry%get_field(this%alphat_field_name)
696
697 ! lambda_tot = lambda + rho * cp * alphat
698 call neko_scratch_registry%request_field(lambda_factor, index, .false.)
699 call field_col3(lambda_factor, this%cp, alphat)
700 call field_col2(lambda_factor, this%rho)
701 call field_add3(this%lambda_tot, this%lambda, lambda_factor)
702 call neko_scratch_registry%relinquish_field(index)
703
704 else if (len_trim(this%alphat_field_name) .gt. 0 &
705 .and. len_trim(this%nut_field_name) .gt. 0 ) then
706 call neko_error("Conflicting definition of eddy diffusivity " // &
707 "for the scalar equation")
708 end if
709
710 ! Since cp is a fields and we use the %x(1,1,1,1) of the
711 ! host array data to pass constant material properties
712 ! to some routines, we need to make sure that the host
713 ! values are also filled
714 if (neko_bcknd_device .eq. 1) then
715 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
716 device_to_host, sync = .false.)
717 end if
718
719 end subroutine scalar_scheme_update_material_properties
720
724 subroutine scalar_scheme_set_material_properties(this, params, user)
725 class(scalar_scheme_t), intent(inout) :: this
726 type(json_file), intent(inout) :: params
727 type(user_t), target, intent(in) :: user
728 character(len=LOG_SIZE) :: log_buf
729 ! A local pointer that is needed to make Intel happy
730 procedure(user_material_properties_intf), pointer :: dummy_mp_ptr
731 real(kind=rp) :: const_cp, const_lambda
732 ! Dummy time state set to 0
733 type(time_state_t) :: time
734
735 dummy_mp_ptr => dummy_user_material_properties
736
737 ! Fill lambda field with the physical value
738
739 call neko_registry%add_field(this%dm_Xh, this%name // "_lambda")
740 call neko_registry%add_field(this%dm_Xh, this%name // "_lambda_tot")
741 call neko_registry%add_field(this%dm_Xh, this%name // "_cp")
742 this%lambda => neko_registry%get_field(this%name // "_lambda")
743 this%lambda_tot => neko_registry%get_field(this%name // "_lambda_tot")
744 this%cp => neko_registry%get_field(this%name // "_cp")
745
746 call this%material_properties%init(2)
747 call this%material_properties%assign(1, this%cp)
748 call this%material_properties%assign(2, this%lambda)
749
750 if (.not. associated(user%material_properties, dummy_mp_ptr)) then
751
752 write(log_buf, '(A)') "Material properties must be set in the user " // &
753 "file!"
754 call neko_log%message(log_buf)
755 this%user_material_properties => user%material_properties
756
757 call user%material_properties(this%name, this%material_properties, time)
758 else
759 this%user_material_properties => dummy_user_material_properties
760 if (params%valid_path('Pe') .and. &
761 (params%valid_path('lambda') .or. &
762 params%valid_path('cp'))) then
763 call neko_error("To set the material properties for the scalar, " // &
764 "either provide Pe OR lambda and cp in the case file.")
765 ! Non-dimensional case
766 else if (params%valid_path('Pe')) then
767 write(log_buf, '(A)') 'Non-dimensional scalar material properties' //&
768 ' input.'
769 call neko_log%message(log_buf, lvl = neko_log_verbose)
770 write(log_buf, '(A)') 'Specific heat capacity will be set to 1, '
771 call neko_log%message(log_buf, lvl = neko_log_verbose)
772 write(log_buf, '(A)') 'conductivity to 1/Pe. Assumes density is 1.'
773 call neko_log%message(log_buf, lvl = neko_log_verbose)
774
775 ! Read Pe into lambda for further manipulation.
776 call json_get_or_lookup(params, 'Pe', const_lambda)
777 write(log_buf, '(A,ES13.6)') 'Pe :', const_lambda
778 call neko_log%message(log_buf)
779
780 ! Set cp and rho to 1 since the setup is non-dimensional.
781 const_cp = 1.0_rp
782 ! Invert the Pe to get conductivity
783 const_lambda = 1.0_rp/const_lambda
784 ! Dimensional case
785 else
786 call json_get_or_lookup(params, 'lambda', const_lambda)
787 call json_get_or_lookup(params, 'cp', const_cp)
788 end if
789 end if
790 ! We need to fill the fields based on the parsed const values
791 ! if the user routine is not used.
792 if (associated(user%material_properties, dummy_mp_ptr)) then
793 ! Fill mu and rho field with the physical value
794 call field_cfill(this%lambda, const_lambda)
795 call field_cfill(this%cp, const_cp)
796
797 write(log_buf, '(A,ES13.6)') 'lambda :', const_lambda
798 call neko_log%message(log_buf)
799 write(log_buf, '(A,ES13.6)') 'cp :', const_cp
800 call neko_log%message(log_buf)
801 end if
802
803 ! Copy over material property to the total one
804 call field_copy(this%lambda_tot, this%lambda)
805
806 ! Since cp is a field and we use the %x(1,1,1,1) of the
807 ! host array data to pass constant material properties
808 ! to some routines, we need to make sure that the host
809 ! values are also filled
810 if (neko_bcknd_device .eq. 1) then
811 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
812 device_to_host, sync = .false.)
813 end if
814 end subroutine scalar_scheme_set_material_properties
815
816 ! ========================================================================== !
817 ! Scalar scheme wrapper type methods
818
820 subroutine scalar_scheme_wrapper_init(this, msh, coef, gs, params, &
821 numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
822 class(scalar_scheme_wrapper_t), intent(inout) :: this
823 type(mesh_t), target, intent(in) :: msh
824 type(coef_t), target, intent(in) :: coef
825 type(gs_t), target, intent(inout) :: gs
826 type(json_file), target, intent(inout) :: params
827 type(json_file), target, intent(inout) :: numerics_params
828 type(user_t), target, intent(in) :: user
829 type(chkp_t), target, intent(inout) :: chkp
830 type(field_series_t), target, intent(in) :: ulag, vlag, wlag
831 type(time_scheme_controller_t), target, intent(in) :: time_scheme
832 type(field_t), target, intent(in) :: rho
833
834 call this%free()
835 call scalar_scheme_factory(this%scalar, msh, coef, gs, params, &
836 numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
837
838 end subroutine scalar_scheme_wrapper_init
839
841 subroutine scalar_scheme_wrapper_free(this)
842 class(scalar_scheme_wrapper_t), intent(inout) :: this
843
844 if (allocated(this%scalar)) then
845 call this%scalar%free()
846 deallocate(this%scalar)
847 end if
848
849 end subroutine scalar_scheme_wrapper_free
850
855 subroutine scalar_scheme_wrapper_move_from(this, other)
856 class(scalar_scheme_wrapper_t), intent(inout) :: this
857 class(scalar_scheme_wrapper_t), intent(inout) :: other
858
859 ! Move the pointer
860 call move_alloc(other%scalar, this%scalar)
861
862 end subroutine scalar_scheme_wrapper_move_from
863
866 function scalar_scheme_wrapper_is_allocated(this) result(is_alloc)
867 class(scalar_scheme_wrapper_t), intent(in) :: this
868 logical :: is_alloc
869 is_alloc = allocated(this%scalar)
870 end function scalar_scheme_wrapper_is_allocated
871
872end module scalar_scheme
Copy data between host and device (or device and device)
Definition device.F90:72
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.
Abstract interface to dealocate a scalar formulation.
Abstract interface to initialize a scalar formulation.
Abstract interface to restart a scalar formulation.
Abstract interface to compute a time-step.
Abstract interface for setting material properties.
Defines a list of bc_t.
Definition bc_list.f90:34
Defines a boundary condition.
Definition bc.f90:34
Format-independent checkpoint payloads.
Defines format-independent checkpoint registration and restart state.
Coefficients.
Definition coef.f90:34
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public device_to_host
Definition device.F90:48
Defines a mapping of the degrees of freedom.
Definition dofmap.f90:35
subroutine, public field_col2(a, b, n)
Vector multiplication .
subroutine, public field_cmult2(a, b, c, n)
Multiplication by constant c .
subroutine, public field_cfill(a, c, n)
Set all elements to a constant c .
subroutine, public field_col3(a, b, c, n)
Vector multiplication with 3 vectors .
subroutine, public field_copy(a, b, n)
Copy a vector .
subroutine, public field_add3(a, b, c, n)
Vector addition .
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
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
integer, parameter, public ksp_max_iter
Maximum number of iters.
Definition krylov.f90:52
Logging routines.
Definition log.f90:34
integer, parameter, public neko_log_verbose
Verbose.
Definition log.f90:54
type(log_t), public neko_log
Global log stream.
Definition log.f90:92
integer, parameter, public log_size
Definition log.f90:46
Defines a mesh.
Definition mesh.f90:34
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Krylov preconditioner.
Definition precon.f90:34
Defines a registry for storing solution fields.
Definition registry.f90:34
type(registry_t), target, public neko_registry
Global field registry.
Definition registry.f90:158
Scalar initial condition.
Definition scalar_ic.f90:34
Contains the scalar_scheme_t type.
subroutine scalar_scheme_init(this, msh, c_xh, gs_xh, params, scheme, user, rho)
Initialize all related components of the current scheme.
logical function scalar_scheme_wrapper_is_allocated(this)
Return allocation status.
subroutine scalar_scheme_wrapper_free(this)
Destructor. Just deallocates the pointer.
subroutine scalar_scheme_free(this)
Deallocate a scalar formulation.
subroutine scalar_scheme_validate(this)
Validate that all fields, solvers etc necessary for performing time-stepping are defined.
subroutine scalar_scheme_update_material_properties(this, time)
Call user material properties routine and update the values of lambda if necessary.
subroutine scalar_scheme_register_checkpoint(this, chkp)
Register this scalar scheme with the checkpoint.
subroutine scalar_scheme_set_material_properties(this, params, user)
Set lamdba and cp.
subroutine scalar_scheme_wrapper_init(this, msh, coef, gs, params, numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
Constructor. Initializes the object.
subroutine scalar_scheme_wrapper_move_from(this, other)
Move assignment operator for the wrapper, needed for storing schemes in lists and arrays.
subroutine scalar_scheme_set_initial_condition(this, user, scalar_index)
Set the initial condition.
Implements the scalar_source_term_t type.
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.
Implements the source_term_t type and a wrapper source_term_wrapper_t.
Defines a function space.
Definition space.f90:34
Data and filter construction for spectral vanishing viscosity.
Compound scheme for the advection and diffusion operators in a transport equation.
Base class for time integration schemes.
Module with things related to the simulation time.
Implements type time_step_controller.
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
subroutine, public dummy_user_material_properties(scheme_name, properties, time)
Utilities.
Definition utils.f90:35
integer, parameter, public neko_typename_len
Definition utils.f90:44
Base type for a boundary condition.
Definition bc.f90:73
A list of allocatable `bc_t`. Follows the standard interface of lists.
Definition bc_list.f90:49
Collection of live simulation data registered for checkpointing.
A named collection of live fields to checkpoint together.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:136
field_list_t, To be able to group fields together
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
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:44
Base type for a scalar advection-diffusion solver.
A helper type that is needed to have an array of polymorphic objects.
Wrapper contaning and executing the scalar source terms.
The function space for the SEM solution fields.
Definition space.f90:64
Spectral vanishing viscosity configuration and coefficients.
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.
A type collecting all the overridable user routines and flag to suppress type injection from custom m...