146 type(
case_t),
target,
intent(inout) :: this
148 logical :: scalar = .false.
149 type(
file_t) :: msh_file, bdry_file, part_file
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(:)
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
168 call this%user%init()
171 call this%user%startup(this%params)
174 if (this%params%valid_path(
'case.no_defaults'))
then
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
187 'case.constants', i, json_subdict)
188 call json_get(json_subdict,
'name', string_val)
190 call json_subdict%info(
'value', found = found, var_type = var_type)
192 select case (var_type)
194 call json_get(json_subdict,
'value', integer_val)
198 call json_get(json_subdict,
'value', real_val)
202 call json_get(json_subdict,
'value', real_vals)
208 call neko_error(
'case_init_common: Unsupported constant ' // &
209 'type in case.constants for entry '//trim(string_val)//
'.')
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.')
223 call msh_file%init(string_val)
224 call msh_file%read(this%msh)
232 if (
pe_size .gt. 1 .and. logical_val)
then
233 call neko_log%section(
'Load Balancing')
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)
247 call this%user%mesh_setup(this%msh, this%time)
252 call json_get(this%params,
'case.time', json_subdict)
253 call this%time%init(json_subdict)
263 call json_get(this%params,
'case.fluid.scheme', string_val)
264 call fluid_scheme_base_factory(this%fluid, trim(string_val))
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)
286 if (this%params%valid_path(
'case.scalar'))
then
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
298 allocate(this%scalars)
299 call json_get(this%params,
'case.numerics', numerics_params)
300 if (this%params%valid_path(
'case.scalar'))
then
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)
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)
320 call json_get(this%params,
'case.fluid.initial_condition.type', &
322 call json_get(this%params,
'case.fluid.initial_condition', &
325 call neko_log%section(
"Fluid initial condition ")
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, &
335 call json_get(this%params,
'case.fluid.scheme', string_val)
336 if (trim(string_val) .eq.
'compressible')
then
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)
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)
351 call neko_log%section(
"Scalar initial condition ")
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
358 call json_get(this%params,
'case.scalar.initial_condition.type', &
361 'case.scalar.initial_condition', json_subdict)
363 if (trim(string_val) .ne.
'user')
then
364 if (trim(this%scalars%scalar_fields(1)%scalar%name) .eq. &
367 this%scalars%scalar_fields(1)%scalar%c_Xh, &
368 this%scalars%scalar_fields(1)%scalar%gs_Xh, &
369 string_val, json_subdict, 0)
372 this%scalars%scalar_fields(1)%scalar%c_Xh, &
373 this%scalars%scalar_fields(1)%scalar%gs_Xh, &
374 string_val, json_subdict, 1)
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)
389 call json_get(scalar_params,
'initial_condition.type', string_val)
390 call json_get(scalar_params,
'initial_condition', &
393 if (trim(string_val) .ne.
'user')
then
394 if (trim(this%scalars%scalar_fields(i)%scalar%name) .eq. &
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.
402 if (temperature_found)
then
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)
411 this%scalars%scalar_fields(i)%scalar%c_Xh, &
412 this%scalars%scalar_fields(i)%scalar%gs_Xh, &
413 string_val, json_subdict, i)
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)
430 select type (f => this%fluid)
440 call this%fluid%validate
443 call this%scalars%validate()
450 this%output_directory,
'')
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)//
"/"
457 call execute_command_line(
'mkdir -p '//this%output_directory)
466 logical_val, .false.)
467 if (logical_val)
then
468 call msh_part%init(this%msh,
'MPI_Rank')
470 call part_file%init(trim(this%output_directory)//
'partitions.vtk')
471 call part_file%write(msh_part)
481 if (trim(string_val) .eq.
'double')
then
501 'case.fluid.output_mesh_in_all_files', &
502 logical_val, .false.)
507 tmp_feature, .false.)
508 if (tmp_feature) logical_val = .true.
510 call this%output_controller%init(this%time%end_time)
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)
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)
524 logical_val, .false.)
525 call this%f_out%file_%set_subdivide(logical_val)
527 call json_get(this%params,
'case.fluid.output_control', string_val)
529 if (trim(string_val) .eq.
'org')
then
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
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
544 call this%output_controller%add(this%f_out, real_val, string_val)
546 call neko_log%error(
'Unknown output control type for the fluid: ' // &
553 call json_get(this%params,
'case.output_checkpoints', logical_val)
554 if (logical_val)
then
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', &
563 if (trim(string_val) .eq.
'tsteps' .or. &
564 trim(string_val) .eq.
'nsamples')
then
567 real_val =
real(integer_val, kind=
rp)
568 else if (trim(string_val) .eq.
'simulationtime')
then
571 else if (trim(string_val) .eq.
'never')
then
575 call this%output_controller%add(this%chkp_out, real_val, string_val, &
582 if (this%params%valid_path(
'case.job_timelimit'))
then
583 call json_get(this%params,
'case.job_timelimit', string_val)
589 call scalar_params%destroy()
590 call numerics_params%destroy()
591 call json_subdict%destroy()