38 use,
intrinsic :: iso_c_binding
74 logical :: initialized
76 call mpi_initialized(initialized)
78 if (.not.initialized)
then
79 call neko_warning(
'Neko has not been initialised')
82 call neko_log%newline()
90 call neko_registry%init()
91 call neko_const_registry%init()
98 call neko_registry%free()
105 call neko_scratch_registry%init()
112 call neko_scratch_registry%free()
119 bind(c, name="neko_case_allocate")
120 integer(c_intptr_t),
intent(inout) :: case_iptr
121 type(case_t),
pointer :: C
126 case_iptr = transfer(cp, 0_c_intptr_t)
134 bind(c, name="neko_case_init")
135 type(c_ptr),
intent(in) :: case_json
136 integer(c_int),
value :: case_len
137 integer(c_intptr_t),
intent(inout) :: case_iptr
138 type(json_file) :: json_case
139 type(case_t),
pointer :: C
144 cp = transfer(case_iptr, c_null_ptr)
145 if (c_associated(cp))
then
146 call c_f_pointer(cp, c)
150 case_iptr = transfer(cp, 0_c_intptr_t)
155 if (c_associated(case_json))
then
157 character(kind=c_char,len=case_len+1),
pointer :: s
158 character(len=:),
allocatable :: fcase_json
159 call c_f_pointer(case_json, s)
160 fcase_json = s(1:case_len)
161 call json_case%load_from_string(fcase_json)
162 deallocate(fcase_json)
170 call c%init(json_case)
175 call neko_simcomps%init(c)
183 integer(c_intptr_t),
intent(inout) :: case_iptr
184 type(case_t),
pointer :: C
187 cp = transfer(case_iptr, c_null_ptr)
188 if (c_associated(cp))
then
189 call c_f_pointer(cp, c)
192 call neko_error(
'Invalid Neko case')
201 bind(c, name="neko_case_time")
202 integer(c_intptr_t),
intent(inout) :: case_iptr
203 real(kind=c_rp) :: time
204 type(case_t),
pointer :: c
207 cptr = transfer(case_iptr, c_null_ptr)
208 if (c_associated(cptr))
then
209 call c_f_pointer(cptr, c)
212 call neko_error(
'Invalid Neko case')
221 bind(c, name="neko_case_end_time")
222 integer(c_intptr_t),
intent(inout) :: case_iptr
223 real(kind=c_rp) :: end_time
224 type(case_t),
pointer :: c
227 cptr = transfer(case_iptr, c_null_ptr)
228 if (c_associated(cptr))
then
229 call c_f_pointer(cptr, c)
230 end_time = c%time%end_time
232 call neko_error(
'Invalid Neko case')
241 bind(c, name="neko_case_tstep")
242 integer(c_intptr_t),
intent(inout) :: case_iptr
243 type(case_t),
pointer :: c
245 integer(c_int) :: tstep
247 cptr = transfer(case_iptr, c_null_ptr)
248 if (c_associated(cptr))
then
249 call c_f_pointer(cptr, c)
252 call neko_error(
'Invalid Neko case')
260 integer(c_intptr_t),
intent(inout) :: case_iptr
261 type(case_t),
pointer :: C
264 cp = transfer(case_iptr, c_null_ptr)
265 if (c_associated(cp))
then
266 call c_f_pointer(cp, c)
269 call neko_error(
'Invalid Neko case')
277 bind(c, name="neko_step")
279 integer(c_intptr_t),
intent(inout) :: case_iptr
280 type(case_t),
pointer :: C
282 type(json_file) :: dt_params
284 real(kind=dp),
save :: step_loop_start = 0.0_dp
286 cptr = transfer(case_iptr, c_null_ptr)
287 if (c_associated(cptr))
then
288 call c_f_pointer(cptr, c)
290 if (.not.
allocated(dt_controller))
then
291 allocate(dt_controller)
292 call json_get(c%params,
'case.time', dt_params)
293 call dt_controller%init(dt_params)
296 if (c%time%tstep .eq. 0)
then
297 call simulation_init(c, dt_controller)
299 step_loop_start = mpi_wtime()
302 if (.not. c%time%is_done())
then
303 call simulation_step(c, dt_controller, step_loop_start)
306 if (c%time%is_done())
then
307 call simulation_finalize(c)
308 if (
allocated(dt_controller))
then
309 deallocate(dt_controller)
314 call neko_error(
'Invalid Neko case')
324 bind(c, name="neko_output_ctrl_execute")
325 integer(c_intptr_t),
intent(inout) :: case_iptr
326 logical(kind=c_bool),
value :: force_output
327 logical :: f_force_output
328 type(case_t),
pointer :: C
330 type(time_state_t) :: f_time
332 cp = transfer(case_iptr, c_null_ptr)
333 if (c_associated(cp))
then
334 call c_f_pointer(cp, c)
336 call neko_error(
'Invalid Neko case')
339 f_force_output = transfer(force_output, f_force_output)
340 call c%output_controller%execute(c%time, f_force_output)
347 bind(c, name=
'neko_field')
348 character(kind=c_char),
dimension(*),
intent(in) :: field_name
349 character(len=8192) :: name
350 type(field_t),
pointer ::
field
351 type(c_ptr) :: field_ptr
356 if (field_name(len+1) .eq. c_null_char)
exit
358 name(len:len) = field_name(len)
361 field => neko_registry%get_field(trim(name(1:len)))
363 field_ptr = c_loc(
field%x)
370 bind(c, name=
'neko_field_order')
371 character(kind=c_char),
dimension(*),
intent(in) :: field_name
372 character(len=8192) :: name
373 type(field_t),
pointer ::
field
374 integer(c_int) :: field_lx
379 if (field_name(len+1) .eq. c_null_char)
exit
381 name(len:len) = field_name(len)
384 field => neko_registry%get_field(trim(name(1:len)))
386 field_lx =
field%Xh%lx
393 bind(c, name=
'neko_field_nelements')
394 character(kind=c_char),
dimension(*),
intent(in) :: field_name
395 character(len=8192) :: name
396 type(field_t),
pointer ::
field
397 integer(c_int) :: field_nelv
402 if (field_name(len+1) .eq. c_null_char)
exit
404 name(len:len) = field_name(len)
407 field => neko_registry%get_field(trim(name(1:len)))
409 field_nelv =
field%msh%nelv
416 bind(c, name=
'neko_field_size')
417 character(kind=c_char),
dimension(*),
intent(in) :: field_name
418 character(len=8192) :: name
419 type(field_t),
pointer ::
field
420 integer(c_int) :: field_size
425 if (field_name(len+1) .eq. c_null_char)
exit
427 name(len:len) = field_name(len)
430 field => neko_registry%get_field(trim(name(1:len)))
432 field_size =
field%dof%size()
443 bind(c, name=
'neko_field_dofmap')
444 character(kind=c_char),
dimension(*),
intent(in) :: field_name
445 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
446 character(len=8192) :: name
447 type(field_t),
pointer :: field
452 if (field_name(len+1) .eq. c_null_char)
exit
454 name(len:len) = field_name(len)
457 field => neko_registry%get_field(trim(name(1:len)))
470 x_ptr, y_ptr, z_ptr, size) bind(c, name='neko_case_fluid_dofmap')
471 integer(c_intptr_t),
intent(inout) :: case_iptr
472 type(case_t),
pointer :: C
474 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
475 integer,
intent(inout) :: size
477 cptr = transfer(case_iptr, c_null_ptr)
478 if (c_associated(cptr))
then
479 call c_f_pointer(cptr, c)
481 size = c%fluid%dm_Xh%size()
483 call neko_error(
'Invalid Neko case')
490 type(dofmap_t),
target,
intent(in) :: dm
491 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
493 dof_ptr = c_loc(dm%dof)
514 dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz) &
515 bind(c, name=
'neko_field_space')
516 character(kind=c_char),
dimension(*),
intent(in) :: field_name
517 integer,
intent(inout) :: lx
518 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
519 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
520 character(len=8192) :: name
521 type(field_t),
pointer :: field
526 if (field_name(len+1) .eq. c_null_char)
exit
528 name(len:len) = field_name(len)
531 field => neko_registry%get_field(trim(name(1:len)))
533 wx, wy, wz, dx, dy, dz)
551 dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz) &
552 bind(c, name=
'neko_case_fluid_space')
553 integer(c_intptr_t),
intent(inout) :: case_iptr
554 type(case_t),
pointer :: C
556 integer,
intent(inout) :: lx
557 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
558 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
561 cptr = transfer(case_iptr, c_null_ptr)
562 if (c_associated(cptr))
then
563 call c_f_pointer(cptr, c)
565 wx, wy, wz, dx, dy, dz)
567 call neko_error(
'Invalid Neko case')
574 wx, wy, wz, dx, dy, dz)
575 type(space_t),
target,
intent(in) :: Xh
576 integer,
intent(inout) :: lx
577 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
578 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
582 dr_inv = c_loc(xh%dr_inv)
583 ds_inv = c_loc(xh%ds_inv)
584 dt_inv = c_loc(xh%dt_inv)
597 mult, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, &
598 drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, &
599 jac, B, area, nx, ny, nz) bind(c, name='neko_case_fluid_coef')
600 integer(c_intptr_t),
intent(inout) :: case_iptr
601 type(case_t),
pointer :: C
603 type(c_ptr),
intent(inout) :: G11, G22, G33, G12, G13, G23
604 type(c_ptr),
intent(inout) :: mult
605 type(c_ptr),
intent(inout) :: dxdr, dydr, dzdr
606 type(c_ptr),
intent(inout) :: dxds, dyds, dzds
607 type(c_ptr),
intent(inout) :: dxdt, dydt, dzdt
608 type(c_ptr),
intent(inout) :: drdx, drdy, drdz
609 type(c_ptr),
intent(inout) :: dsdx, dsdy, dsdz
610 type(c_ptr),
intent(inout) :: dtdx, dtdy, dtdz
611 type(c_ptr),
intent(inout) :: jac, B, area, nx, ny, nz
614 cptr = transfer(case_iptr, c_null_ptr)
615 if (c_associated(cptr))
then
616 call c_f_pointer(cptr, c)
617 g11 = c_loc(c%fluid%c_Xh%G11)
618 g22 = c_loc(c%fluid%c_Xh%G22)
619 g33 = c_loc(c%fluid%c_Xh%G33)
620 g12 = c_loc(c%fluid%c_Xh%G12)
621 g13 = c_loc(c%fluid%c_Xh%G13)
622 g23 = c_loc(c%fluid%c_Xh%G23)
623 mult = c_loc(c%fluid%c_Xh%mult)
624 dxdr = c_loc(c%fluid%c_Xh%dxdr)
625 dydr = c_loc(c%fluid%c_Xh%dydr)
626 dzdr = c_loc(c%fluid%c_Xh%dzdr)
627 dxds = c_loc(c%fluid%c_Xh%dxds)
628 dyds = c_loc(c%fluid%c_Xh%dyds)
629 dzds = c_loc(c%fluid%c_Xh%dzds)
630 dxdt = c_loc(c%fluid%c_Xh%dxdt)
631 dydt = c_loc(c%fluid%c_Xh%dydt)
632 dzdt = c_loc(c%fluid%c_Xh%dzdt)
633 drdx = c_loc(c%fluid%c_Xh%drdx)
634 drdy = c_loc(c%fluid%c_Xh%drdy)
635 drdz = c_loc(c%fluid%c_Xh%drdz)
636 dsdx = c_loc(c%fluid%c_Xh%dsdx)
637 dsdy = c_loc(c%fluid%c_Xh%dsdy)
638 dsdz = c_loc(c%fluid%c_Xh%dsdz)
639 dtdx = c_loc(c%fluid%c_Xh%dtdx)
640 dtdy = c_loc(c%fluid%c_Xh%dtdy)
641 dtdz = c_loc(c%fluid%c_Xh%dtdz)
642 jac = c_loc(c%fluid%c_Xh%jac)
643 b = c_loc(c%fluid%c_Xh%B)
644 area = c_loc(c%fluid%c_Xh%area)
645 nx = c_loc(c%fluid%c_Xh%nx)
646 ny = c_loc(c%fluid%c_Xh%ny)
647 nz = c_loc(c%fluid%c_Xh%nz)
649 call neko_error(
'Invalid Neko case')
663 compute_cb, dirichlet_cb, material_cb, source_cb) &
664 bind(c, name=
'neko_user_setup')
665 integer(c_intptr_t),
intent(inout) :: case_iptr
666 type(c_funptr),
value :: initial_cb, preprocess_cb, compute_cb
667 type(c_funptr),
value :: dirichlet_cb, material_cb, source_cb
668 type(case_t),
pointer :: C
671 cptr = transfer(case_iptr, c_null_ptr)
672 if (c_associated(cptr))
then
673 call c_f_pointer(cptr, c)
674 call neko_api_user_cb_register(c%user, initial_cb, preprocess_cb, &
675 compute_cb, dirichlet_cb, material_cb, source_cb)
677 call neko_error(
'Invalid Neko case')
685 bind(c, name=
'neko_cb_field_by_name')
686 character(kind=c_char),
dimension(*),
intent(in) :: field_name
687 character(len=8192) :: name
688 type(field_t),
pointer ::
field
689 type(c_ptr) :: field_ptr
694 if (field_name(len+1) .eq. c_null_char)
exit
696 name(len:len) = field_name(len)
699 field => neko_api_user_cb_get_field(trim(name(1:len)))
701 field_ptr = c_loc(
field%x)
708 result(field_ptr) bind(c, name=
'neko_cb_field_by_index')
709 integer,
intent(in) :: field_idx
710 type(field_t),
pointer ::
field
711 type(c_ptr) :: field_ptr
713 field => neko_api_user_cb_get_field(field_idx)
715 field_ptr = c_loc(
field%x)
723 result(same_name) bind(c, name=
'neko_cb_field_name_at_index')
724 integer,
intent(in) :: field_idx
725 character(kind=c_char),
dimension(*),
intent(in) :: field_name
726 character(len=8192) :: name
727 type(field_t),
pointer :: f1, f2
728 type(c_ptr) :: field_ptr
730 logical(c_bool) :: same_name
734 if (field_name(len+1) .eq. c_null_char)
exit
736 name(len:len) = field_name(len)
739 f1 => neko_api_user_cb_get_field(field_idx)
740 f2 => neko_api_user_cb_get_field(trim(name(1:len)))
742 same_name = trim(f1%name) .eq. trim(f2%name)
subroutine, public neko_api_user_cb_register(user, initial_cb, preprocess_cb, compute_cb, dirichlet_cb, material_cb, source_cb)
Register callbacks.
subroutine neko_api_wrap_dofmap(dm, dof_ptr, x_ptr, y_ptr, z_ptr)
Helper function to assign pointers to a dofmap's data.
subroutine neko_api_finalize()
Finalize Neko.
subroutine neko_api_wrap_space(xh, lx, zg, dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz)
Helper function to assign pointers to a space's data.
subroutine neko_api_user_setup(case_iptr, initial_cb, preprocess_cb, compute_cb, dirichlet_cb, material_cb, source_cb)
Setup user-provided callbacks.
subroutine neko_api_step(case_iptr)
Compute a time-step for a neko case.
integer(c_int) function neko_api_field_nelements(field_name)
Retrive the number of elements in a field.
subroutine neko_api_device_finalize()
Finalize Neko device layer.
subroutine neko_api_job_info()
Display job information.
subroutine neko_api_registry_init()
Initialise a Neko field registry.
subroutine neko_api_field_space(field_name, lx, zg, dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz)
Retrive the space associated with a field.
subroutine neko_api_case_free(case_iptr)
Destroy a Neko case.
subroutine neko_api_case_allocate(case_iptr)
Allocate memory for a Neko case.
subroutine neko_api_output_ctrl_execute(case_iptr, force_output)
Execute the Case's output controller.
subroutine neko_api_case_init(case_json, case_len, case_iptr)
Initalise a Neko case.
subroutine neko_api_field_dofmap(field_name, dof_ptr, x_ptr, y_ptr, z_ptr)
Retrive the dofmap associated with a field.
subroutine neko_api_case_fluid_space(case_iptr, lx, zg, dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz)
Retrive the space associated with a case's fluid solver.
real(kind=c_rp) function neko_api_case_end_time(case_iptr)
Retrive the end time of a case.
type(c_ptr) function neko_api_user_cb_field_by_index(field_idx)
Retrive a pointer to a user callback field.
logical(c_bool) function neko_api_user_cb_field_name_at_index(field_idx, field_name)
Check if the user callback field at a given index has a given name.
subroutine neko_api_scratch_registry_init()
Initialise a Neko scratch registry.
type(c_ptr) function neko_api_field(field_name)
Retrive a pointer to a flow field.
integer(c_int) function neko_api_field_size(field_name)
Retrive the total number of degrees of freedom of a field.
subroutine neko_api_scratch_registry_free()
Destroy a Neko scratch registry.
subroutine neko_api_solve(case_iptr)
Solve a neko case.
subroutine neko_api_case_fluid_coef(case_iptr, g11, g22, g33, g12, g13, g23, mult, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, jac, b, area, nx, ny, nz)
Retrive the coefficient associated with a case's fluid solver.
subroutine neko_api_registry_free()
Destroy a Neko field registry.
type(c_ptr) function neko_api_user_cb_field_by_name(field_name)
Retrive a pointer to a user callback field.
subroutine neko_api_case_fluid_dofmap(case_iptr, dof_ptr, x_ptr, y_ptr, z_ptr, size)
Retrive the dofmap associated with a case's fluid solver.
integer(c_int) function neko_api_field_order(field_name)
Retrive the order of a field.
subroutine neko_api_device_init()
Initialise Neko device layer.
real(kind=c_rp) function neko_api_case_time(case_iptr)
Retrive the current time of a case.
integer(c_int) function neko_api_case_tstep(case_iptr)
Retrive the time-step of a case.
subroutine neko_api_init()
Initialise Neko.
Implements type time_step_controller.
void neko_solve(int **case_iptr)
Provides a tool to set time step dt.