Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
case.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!
34module case
35 use num_types, only : rp, sp, dp
36 use fluid_pnpn, only : fluid_pnpn_t
38 use fluid_scheme_base, only: fluid_scheme_base_t, fluid_scheme_base_factory
40 use chkp_output, only : chkp_output_t
41 use mesh_field, only : mesh_fld_t
43 use redist, only : redist_mesh
45 use flow_ic, only : set_flow_ic
46 use scalar_ic, only : set_scalar_ic
47 use file, only : file_t
48 use utils, only : neko_error
49 use mesh, only : mesh_t
50 use math, only : neko_eps
51 use checkpoint, only: chkp_t
53 use logger, only : neko_log, neko_log_quiet
55 use user_intf, only : user_t
56 use scalar_pnpn, only : scalar_pnpn_t
58 use time_state, only : time_state_t
59 use json_module, only : json_file
64 use scalars, only : scalars_t
65 use comm, only : neko_comm, pe_rank, pe_size
66 use mpi_f08, only : mpi_bcast, mpi_character, mpi_integer
68 use vector, only : vector_t
69
70 implicit none
71 private
72
73 type, public :: case_t
74 type(mesh_t) :: msh
75 type(json_file) :: params
76 character(len=:), allocatable :: output_directory
78 type(fluid_output_t) :: f_out
79 type(time_state_t) :: time
80 type(chkp_output_t) :: chkp_out
81 type(chkp_t) :: chkp
82 type(user_t) :: user
83 class(fluid_scheme_base_t), allocatable :: fluid
84 type(scalars_t), allocatable :: scalars
85 contains
86 procedure, private, pass(this) :: case_init_from_file
87 procedure, private, pass(this) :: case_init_from_json
88 procedure, pass(this) :: free => case_free
90 end type case_t
91
92contains
93
95 subroutine case_init_from_file(this, case_file)
96 class(case_t), target, intent(inout) :: this
97 character(len=*), intent(in) :: case_file
98 integer :: ierr, integer_val
99 character(len=:), allocatable :: json_buffer
100 logical :: exist
101
102 ! Check if the file exists
103 inquire(file = trim(case_file), exist = exist)
104 if (.not. exist) then
105 call neko_error('The case file '//trim(case_file)//' does not exist.')
106 end if
107
108 call neko_log%section('Case')
109 call neko_log%message('Reading case file ' // trim(case_file), &
111
112 call this%params%initialize()
113 if (pe_rank .eq. 0) then
114 call this%params%load_file(filename = trim(case_file))
115 call this%params%print_to_string(json_buffer)
116 integer_val = len(json_buffer)
117 end if
118
119 call mpi_bcast(integer_val, 1, mpi_integer, 0, neko_comm, ierr)
120 if (pe_rank .ne. 0) allocate(character(len = integer_val) :: json_buffer)
121 call mpi_bcast(json_buffer, integer_val, mpi_character, 0, neko_comm, ierr)
122 call this%params%load_from_string(json_buffer)
123
124 deallocate(json_buffer)
125
126 call case_init_common(this)
127
128 end subroutine case_init_from_file
129
131 subroutine case_init_from_json(this, case_json)
132 class(case_t), target, intent(inout) :: this
133 type(json_file), intent(in) :: case_json
134
135 call neko_log%section('Case')
136 call neko_log%message('Creating case from JSON object', neko_log_quiet)
137
138 this%params = case_json
139
140 call case_init_common(this)
141
142 end subroutine case_init_from_json
143
145 subroutine case_init_common(this)
146 type(case_t), target, intent(inout) :: this
147 integer :: lx = 0
148 logical :: scalar = .false.
149 type(file_t) :: msh_file, bdry_file, part_file
150 type(mesh_fld_t) :: msh_part, parts
151 logical :: found, logical_val
152 logical :: temperature_found = .false.
153 integer :: integer_val, var_type
154 real(kind=rp) :: real_val
155 real(kind=rp), allocatable :: real_vals(:)
156 type(vector_t), pointer :: vec
157 character(len = :), allocatable :: string_val, name, file_format
158 integer :: output_dir_len
159 integer :: precision, layout
160 type(json_file) :: scalar_params, numerics_params
161 type(json_file) :: json_subdict
162 integer :: n_scalars, i
163 logical :: tmp_feature
164
165 !
166 ! Setup user defined functions
167 !
168 call this%user%init()
169
170 ! Run user startup routine
171 call this%user%startup(this%params)
172
173 ! Check if default value fill-in is allowed
174 if (this%params%valid_path('case.no_defaults')) then
175 call json_get(this%params, 'case.no_defaults', json_no_defaults)
176 end if
177
178
179 !
180 ! Populate const registry with global data from the case file
181 !
182 if (this%params%valid_path('case.constants')) then
183 call this%params%info('case.constants', &
184 n_children = integer_val)
185 do i = 1, integer_val
186 call json_extract_item(this%params, &
187 'case.constants', i, json_subdict)
188 call json_get(json_subdict, 'name', string_val)
189
190 call json_subdict%info('value', found = found, var_type = var_type)
191
192 select case (var_type)
193 case (5) ! integer
194 call json_get(json_subdict, 'value', integer_val)
195 call neko_const_registry%add_integer_scalar(integer_val, &
196 trim(string_val))
197 case (6) ! real
198 call json_get(json_subdict, 'value', real_val)
199 call neko_const_registry%add_real_scalar(real_val, &
200 trim(string_val))
201 case (3) ! array
202 call json_get(json_subdict, 'value', real_vals)
203 call neko_const_registry%add_vector(size(real_vals), &
204 trim(string_val))
205 vec => neko_const_registry%get_vector(trim(string_val))
206 vec%x = real_vals
207 case default
208 call neko_error('case_init_common: Unsupported constant ' // &
209 'type in case.constants for entry '//trim(string_val)//'.')
210 end select
211 end do
212 end if
213
214 !
215 ! Load mesh
216 !
217 call json_get_or_default(this%params, 'case.mesh_file', string_val, &
218 'no mesh')
219 if (trim(string_val) .eq. 'no mesh') then
220 call neko_error('The mesh_file keyword could not be found in the .' // &
221 'case file. Often caused by incorrectly formatted json.')
222 end if
223 call msh_file%init(string_val)
224 call msh_file%read(this%msh)
225
226 !
227 ! Load Balancing
228 !
229 call json_get_or_default(this%params, 'case.load_balancing', logical_val,&
230 .false.)
231
232 if (pe_size .gt. 1 .and. logical_val) then
233 call neko_log%section('Load Balancing')
234 call parmetis_partmeshkway(this%msh, parts)
235 call redist_mesh(this%msh, parts)
236
237 ! store the balanced mesh (for e.g. restarts)
238 string_val = trim(string_val(1:scan(trim(string_val), &
239 '.', back = .true.) - 1)) // '_lb.nmsh'
240 call msh_file%init(string_val)
241 call msh_file%write(this%msh)
242
243 call neko_log%end_section()
244 end if
245
246 ! Run user mesh motion routine
247 call this%user%mesh_setup(this%msh, this%time)
248
249 !
250 ! Time control
251 !
252 call json_get(this%params, 'case.time', json_subdict)
253 call this%time%init(json_subdict)
254
255 !
256 ! Initialize point_zones registry
257 !
258 call neko_point_zone_registry%init(this%params, this%msh)
259
260 !
261 ! Setup fluid scheme
262 !
263 call json_get(this%params, 'case.fluid.scheme', string_val)
264 call fluid_scheme_base_factory(this%fluid, trim(string_val))
265
266 call json_get_or_lookup(this%params, 'case.numerics.polynomial_order', lx)
267 lx = lx + 1 ! add 1 to get number of gll points
268 ! Set time lags in chkp
269 call this%chkp%init()
270 this%chkp%tlag => this%time%tlag
271 this%chkp%dtlag => this%time%dtlag
272 call this%fluid%init(this%msh, lx, this%params, this%user, this%chkp)
273
274
275 !
276 ! Setup scratch registry
277 !
278 call neko_scratch_registry%set_dofmap(this%fluid%dm_Xh)
279
280 !
281 ! Setup scalar scheme
282 !
283 ! @todo no scalar factory for now, probably not needed
284 scalar = .false.
285 n_scalars = 0
286 if (this%params%valid_path('case.scalar')) then
287 call json_get_or_default(this%params, 'case.scalar.enabled', scalar, &
288 .true.)
289 n_scalars = 1
290 else if (this%params%valid_path('case.scalars')) then
291 call this%params%info('case.scalars', n_children = n_scalars)
292 if (n_scalars > 0) then
293 scalar = .true.
294 end if
295 end if
296
297 if (scalar) then
298 allocate(this%scalars)
299 call json_get(this%params, 'case.numerics', numerics_params)
300 if (this%params%valid_path('case.scalar')) then
301 ! For backward compatibility
302 call json_get(this%params, 'case.scalar', scalar_params)
303 call this%scalars%init(this%msh, this%fluid%c_Xh, this%fluid%gs_Xh, &
304 scalar_params, numerics_params, this%user, this%chkp, &
305 this%fluid%ulag, this%fluid%vlag, this%fluid%wlag, &
306 this%fluid%ext_bdf, this%fluid%rho)
307 else
308 ! Multiple scalars
309 call json_get(this%params, 'case.scalars', json_subdict)
310 call this%scalars%init(n_scalars, this%msh, this%fluid%c_Xh, &
311 this%fluid%gs_Xh, json_subdict, numerics_params, this%user, &
312 this%chkp, this%fluid%ulag, this%fluid%vlag, this%fluid%wlag, &
313 this%fluid%ext_bdf, this%fluid%rho)
314 end if
315 end if
316
317 !
318 ! Setup initial conditions
319 !
320 call json_get(this%params, 'case.fluid.initial_condition.type', &
321 string_val)
322 call json_get(this%params, 'case.fluid.initial_condition', &
323 json_subdict)
324
325 call neko_log%section("Fluid initial condition ")
326
327 if (this%params%valid_path('case.restart_file')) then
328 call neko_log%message("Restart file specified, " // &
329 "initial conditions ignored")
330 else if (trim(string_val) .ne. 'user') then
331 call set_flow_ic(this%fluid%u, this%fluid%v, this%fluid%w, &
332 this%fluid%p, this%fluid%c_Xh, this%fluid%gs_Xh, string_val, &
333 json_subdict)
334 else
335 call json_get(this%params, 'case.fluid.scheme', string_val)
336 if (trim(string_val) .eq. 'compressible') then
337 call set_flow_ic(this%fluid%rho, &
338 this%fluid%u, this%fluid%v, this%fluid%w, this%fluid%p, &
339 this%fluid%c_Xh, this%fluid%gs_Xh, &
340 this%user%initial_conditions, this%fluid%name)
341 else
342 call set_flow_ic(this%fluid%u, this%fluid%v, this%fluid%w, &
343 this%fluid%p, this%fluid%c_Xh, this%fluid%gs_Xh, &
344 this%user%initial_conditions, this%fluid%name)
345 end if
346 end if
347
348 call neko_log%end_section()
349
350 if (scalar) then
351 call neko_log%section("Scalar initial condition ")
352
353 if (this%params%valid_path('case.restart_file')) then
354 call neko_log%message("Restart file specified, " // &
355 "initial conditions ignored")
356 else if (this%params%valid_path('case.scalar')) then
357 ! For backward compatibility with single scalar
358 call json_get(this%params, 'case.scalar.initial_condition.type', &
359 string_val)
360 call json_get(this%params, &
361 'case.scalar.initial_condition', json_subdict)
362
363 if (trim(string_val) .ne. 'user') then
364 if (trim(this%scalars%scalar_fields(1)%scalar%name) .eq. &
365 'temperature') then
366 call set_scalar_ic(this%scalars%scalar_fields(1)%scalar%s, &
367 this%scalars%scalar_fields(1)%scalar%c_Xh, &
368 this%scalars%scalar_fields(1)%scalar%gs_Xh, &
369 string_val, json_subdict, 0)
370 else
371 call set_scalar_ic(this%scalars%scalar_fields(1)%scalar%s, &
372 this%scalars%scalar_fields(1)%scalar%c_Xh, &
373 this%scalars%scalar_fields(1)%scalar%gs_Xh, &
374 string_val, json_subdict, 1)
375 end if
376 else
377 call set_scalar_ic(this%scalars%scalar_fields(1)%scalar%name, &
378 this%scalars%scalar_fields(1)%scalar%s, &
379 this%scalars%scalar_fields(1)%scalar%c_Xh, &
380 this%scalars%scalar_fields(1)%scalar%gs_Xh, &
381 this%user%initial_conditions)
382 end if
383
384 else
385 ! Handle multiple scalars
386 do i = 1, n_scalars
387 call json_extract_item(this%params, 'case.scalars', i, &
388 scalar_params)
389 call json_get(scalar_params, 'initial_condition.type', string_val)
390 call json_get(scalar_params, 'initial_condition', &
391 json_subdict)
392
393 if (trim(string_val) .ne. 'user') then
394 if (trim(this%scalars%scalar_fields(i)%scalar%name) .eq. &
395 'temperature') then
396 call set_scalar_ic(this%scalars%scalar_fields(i)%scalar%s, &
397 this%scalars%scalar_fields(i)%scalar%c_Xh, &
398 this%scalars%scalar_fields(i)%scalar%gs_Xh, &
399 string_val, json_subdict, 0)
400 temperature_found = .true.
401 else
402 if (temperature_found) then
403 ! if temperature is found, other scalars start from index 1
404 call set_scalar_ic(this%scalars%scalar_fields(i)%scalar%s, &
405 this%scalars%scalar_fields(i)%scalar%c_Xh, &
406 this%scalars%scalar_fields(i)%scalar%gs_Xh, &
407 string_val, json_subdict, i - 1)
408 else
409 ! if temperature is not found, other scalars start from index 0
410 call set_scalar_ic(this%scalars%scalar_fields(i)%scalar%s, &
411 this%scalars%scalar_fields(i)%scalar%c_Xh, &
412 this%scalars%scalar_fields(i)%scalar%gs_Xh, &
413 string_val, json_subdict, i)
414 end if
415 end if
416 else
417 call set_scalar_ic(this%scalars%scalar_fields(i)%scalar%name,&
418 this%scalars%scalar_fields(i)%scalar%s, &
419 this%scalars%scalar_fields(i)%scalar%c_Xh, &
420 this%scalars%scalar_fields(i)%scalar%gs_Xh, &
421 this%user%initial_conditions)
422 end if
423 end do
424 end if
425
426 call neko_log%end_section()
427 end if
428
429 ! Add initial conditions to BDF scheme (if present)
430 select type (f => this%fluid)
431 type is (fluid_pnpn_t)
432 call f%ulag%set(f%u)
433 call f%vlag%set(f%v)
434 call f%wlag%set(f%w)
435 end select
436
437 !
438 ! Validate that the case is properly setup for time-stepping
439 !
440 call this%fluid%validate
441
442 if (scalar) then
443 call this%scalars%validate()
444 end if
445
446 !
447 ! Get and process output directory
448 !
449 call json_get_or_default(this%params, 'case.output_directory',&
450 this%output_directory, '')
451
452 output_dir_len = len(trim(this%output_directory))
453 if (output_dir_len .gt. 0) then
454 if (this%output_directory(output_dir_len:output_dir_len) .ne. "/") then
455 this%output_directory = trim(this%output_directory)//"/"
456 if (pe_rank .eq. 0) then
457 call execute_command_line('mkdir -p '//this%output_directory)
458 end if
459 end if
460 end if
461
462 !
463 ! Save mesh partitions (if requested)
464 !
465 call json_get_or_default(this%params, 'case.output_partitions',&
466 logical_val, .false.)
467 if (logical_val) then
468 call msh_part%init(this%msh, 'MPI_Rank')
469 msh_part%data = pe_rank
470 call part_file%init(trim(this%output_directory)//'partitions.vtk')
471 call part_file%write(msh_part)
472 call msh_part%free()
473 end if
474
475 !
476 ! Setup output precision of the field files
477 !
478 call json_get_or_default(this%params, 'case.output_precision', string_val,&
479 'single')
480
481 if (trim(string_val) .eq. 'double') then
482 precision = dp
483 else
484 precision = sp
485 end if
486
487 !
488 ! Setup output layout of the field bp file
489 !
490 call json_get_or_lookup_or_default(this%params, 'case.output_layout', &
491 layout, 1)
492
493 !
494 ! Setup output_controller
495 !
496 call json_get_or_default(this%params, 'case.fluid.output_filename', &
497 name, "field")
498 call json_get_or_default(this%params, 'case.fluid.output_format', &
499 file_format, 'fld')
500 call json_get_or_default(this%params, &
501 'case.fluid.output_mesh_in_all_files', &
502 logical_val, .false.)
503
504 ! Kind of hacky for the moment to ensure we don't miss
505 ! saving the mesh for ALE.
506 call json_get_or_default(this%params, 'case.fluid.ale.enabled', &
507 tmp_feature, .false.)
508 if (tmp_feature) logical_val = .true.
509
510 call this%output_controller%init(this%time%end_time)
511 if (scalar) then
512 call this%f_out%init(precision, this%fluid, this%scalars, name = name, &
513 path = trim(this%output_directory), &
514 fmt = trim(file_format), layout = layout, &
515 always_write_mesh = logical_val)
516 else
517 call this%f_out%init(precision, this%fluid, name = name, &
518 path = trim(this%output_directory), &
519 fmt = trim(file_format), layout = layout, &
520 always_write_mesh = logical_val)
521 end if
522
523 call json_get_or_default(this%params, 'case.fluid.output_subdivide', &
524 logical_val, .false.)
525 call this%f_out%file_%set_subdivide(logical_val)
526
527 call json_get(this%params, 'case.fluid.output_control', string_val)
528
529 if (trim(string_val) .eq. 'org') then
530 ! yes, it should be real_val below for type compatibility
531 call json_get_or_lookup(this%params, 'case.nsamples', integer_val)
532 real_val = real(integer_val, kind=rp)
533 call this%output_controller%add(this%f_out, real_val, 'nsamples')
534 else if (trim(string_val) .eq. 'never') then
535 call this%output_controller%add(this%f_out, 0.0_rp, 'never')
536 else if (trim(string_val) .eq. 'tsteps' .or. &
537 trim(string_val) .eq. 'nsamples') then
538 call json_get_or_lookup(this%params, 'case.fluid.output_value', &
539 integer_val)
540 real_val = real(integer_val, kind=rp)
541 call this%output_controller%add(this%f_out, real_val, string_val)
542 else if (trim(string_val) .eq. 'simulationtime') then
543 call json_get_or_lookup(this%params, 'case.fluid.output_value', real_val)
544 call this%output_controller%add(this%f_out, real_val, string_val)
545 else
546 call neko_log%error('Unknown output control type for the fluid: ' // &
547 trim(string_val))
548 end if
549
550 !
551 ! Save checkpoints (if nothing specified, default to saving at end of sim)
552 !
553 call json_get(this%params, 'case.output_checkpoints', logical_val)
554 if (logical_val) then
555 call json_get_or_default(this%params, 'case.checkpoint_filename', &
556 name, "fluid")
557 call json_get_or_default(this%params, 'case.checkpoint_format', &
558 string_val, "chkp")
559 call this%chkp_out%init(this%chkp, name = name,&
560 path = this%output_directory, fmt = trim(string_val))
561 call json_get(this%params, 'case.checkpoint_control', &
562 string_val)
563 if (trim(string_val) .eq. 'tsteps' .or. &
564 trim(string_val) .eq. 'nsamples') then
565 call json_get_or_lookup(this%params, 'case.checkpoint_value', &
566 integer_val)
567 real_val = real(integer_val, kind=rp)
568 else if (trim(string_val) .eq. 'simulationtime') then
569 call json_get_or_lookup(this%params, 'case.checkpoint_value', &
570 real_val)
571 else if (trim(string_val) .eq. 'never') then
572 real_val = 0.0_rp
573 end if
574
575 call this%output_controller%add(this%chkp_out, real_val, string_val, &
576 neko_eps)
577 end if
578
579 !
580 ! Setup joblimit
581 !
582 if (this%params%valid_path('case.job_timelimit')) then
583 call json_get(this%params, 'case.job_timelimit', string_val)
584 call jobctrl_set_time_limit(string_val)
585 end if
586
587 call neko_log%end_section()
588
589 call scalar_params%destroy()
590 call numerics_params%destroy()
591 call json_subdict%destroy()
592
593 end subroutine case_init_common
594
596 subroutine case_free(this)
597 class(case_t), intent(inout) :: this
598
599 if (allocated(this%fluid)) then
600 call this%fluid%free()
601 deallocate(this%fluid)
602 end if
603
604 if (allocated(this%scalars)) then
605 call this%scalars%free()
606 deallocate(this%scalars)
607 end if
608
609 call this%msh%free()
610
611 call this%f_out%free()
612
613 call this%output_controller%free()
614
615 if (allocated(this%output_directory)) then
616 deallocate(this%output_directory)
617 end if
618
619 end subroutine case_free
620
621end module case
double real
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.
Defines a simulation case.
Definition case.f90:34
subroutine case_init_from_file(this, case_file)
Initialize a case from an input file case_file.
Definition case.f90:96
subroutine case_free(this)
Deallocate a case.
Definition case.f90:597
subroutine case_init_from_json(this, case_json)
Initialize a case from a JSON object describing a case.
Definition case.f90:132
subroutine case_init_common(this)
Initialize a case from its (loaded) params object.
Definition case.f90:146
Defines a checkpoint.
Defines an output for a checkpoint.
Definition comm.F90:1
integer, public pe_size
MPI size of communicator.
Definition comm.F90:59
integer, public pe_rank
MPI rank.
Definition comm.F90:56
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:43
Module for file I/O operations.
Definition file.f90:34
Initial flow condition.
Definition flow_ic.f90:34
Defines an output for a fluid.
Modular version of the Classic Nek5000 Pn/Pn formulation for fluids.
Job control.
Definition jobctrl.f90:34
Utilities for retrieving parameters from the case files.
logical, public json_no_defaults
If true, the json_get_or_default routines will not add missing parameters.
Logging routines.
Definition log.f90:34
integer, parameter, public neko_log_quiet
Always logged.
Definition log.f90:81
type(log_t), public neko_log
Global log stream.
Definition log.f90:79
Definition math.f90:60
real(kind=rp), parameter, public neko_eps
Machine epsilon .
Definition math.f90:69
Defines a mesh field.
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public dp
Definition num_types.f90:9
integer, parameter, public sp
Definition num_types.f90:8
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Implements output_controller_t
Interface to ParMETIS.
Definition parmetis.F90:34
subroutine, public parmetis_partmeshkway(msh, parts, weights, nprts)
Compute a k-way partitioning of a mesh msh.
Definition parmetis.F90:112
type(point_zone_registry_t), target, public neko_point_zone_registry
Global point_zone registry.
Redistribution routines.
Definition redist.f90:34
subroutine, public redist_mesh(msh, parts)
Redistribute a mesh msh according to new partitions.
Definition redist.f90:59
Defines a registry for storing solution fields.
Definition registry.f90:34
type(registry_t), target, public neko_registry
Global field registry.
Definition registry.f90:144
type(registry_t), target, public neko_const_registry
This registry is used to store user-defined scalars and vectors, provided under the constants section...
Definition registry.f90:150
Scalar initial condition.
Definition scalar_ic.f90:34
Contains the scalar_pnpn_t type.
Contains the scalar_scheme_t type.
Contains the scalars_t type that manages multiple scalar fields.
Definition scalars.f90:35
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.
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34
A wrapper around a polymorphic generic_file_t that handles its init. This is essentially a factory fo...
Definition file.f90:56
Base type of all fluid formulations.
Centralized controller for a list of outputs.
Base type for a scalar advection-diffusion solver.
Type to manage multiple scalar transport equations.
Definition scalars.f90:61
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...