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()
97 call neko_registry%free()
104 bind(c, name="neko_case_allocate")
105 integer(c_intptr_t),
intent(inout) :: case_iptr
106 type(case_t),
pointer :: C
111 case_iptr = transfer(cp, 0_c_intptr_t)
119 bind(c, name="neko_case_init")
120 type(c_ptr),
intent(in) :: case_json
121 integer(c_int),
value :: case_len
122 integer(c_intptr_t),
intent(inout) :: case_iptr
123 type(json_file) :: json_case
124 type(case_t),
pointer :: C
129 cp = transfer(case_iptr, c_null_ptr)
130 if (c_associated(cp))
then
131 call c_f_pointer(cp, c)
135 case_iptr = transfer(cp, 0_c_intptr_t)
140 if (c_associated(case_json))
then
142 character(kind=c_char,len=case_len+1),
pointer :: s
143 character(len=:),
allocatable :: fcase_json
144 call c_f_pointer(case_json, s)
145 fcase_json = s(1:case_len)
146 call json_case%load_from_string(fcase_json)
147 deallocate(fcase_json)
155 call c%init(json_case)
160 call neko_simcomps%init(c)
168 integer(c_intptr_t),
intent(inout) :: case_iptr
169 type(case_t),
pointer :: C
172 cp = transfer(case_iptr, c_null_ptr)
173 if (c_associated(cp))
then
174 call c_f_pointer(cp, c)
177 call neko_error(
'Invalid Neko case')
186 bind(c, name="neko_case_time")
187 integer(c_intptr_t),
intent(inout) :: case_iptr
188 real(kind=c_rp) :: time
189 type(case_t),
pointer :: c
192 cptr = transfer(case_iptr, c_null_ptr)
193 if (c_associated(cptr))
then
194 call c_f_pointer(cptr, c)
197 call neko_error(
'Invalid Neko case')
206 bind(c, name="neko_case_end_time")
207 integer(c_intptr_t),
intent(inout) :: case_iptr
208 real(kind=c_rp) :: end_time
209 type(case_t),
pointer :: c
212 cptr = transfer(case_iptr, c_null_ptr)
213 if (c_associated(cptr))
then
214 call c_f_pointer(cptr, c)
215 end_time = c%time%end_time
217 call neko_error(
'Invalid Neko case')
226 bind(c, name="neko_case_tstep")
227 integer(c_intptr_t),
intent(inout) :: case_iptr
228 type(case_t),
pointer :: c
230 integer(c_int) :: tstep
232 cptr = transfer(case_iptr, c_null_ptr)
233 if (c_associated(cptr))
then
234 call c_f_pointer(cptr, c)
237 call neko_error(
'Invalid Neko case')
245 integer(c_intptr_t),
intent(inout) :: case_iptr
246 type(case_t),
pointer :: C
249 cp = transfer(case_iptr, c_null_ptr)
250 if (c_associated(cp))
then
251 call c_f_pointer(cp, c)
254 call neko_error(
'Invalid Neko case')
262 bind(c, name="neko_step")
264 integer(c_intptr_t),
intent(inout) :: case_iptr
265 type(case_t),
pointer :: C
267 type(json_file) :: dt_params
269 real(kind=dp),
save :: step_loop_start = 0.0_dp
271 cptr = transfer(case_iptr, c_null_ptr)
272 if (c_associated(cptr))
then
273 call c_f_pointer(cptr, c)
275 if (.not.
allocated(dt_controller))
then
276 allocate(dt_controller)
277 call json_get(c%params,
'case.time', dt_params)
278 call dt_controller%init(dt_params)
281 if (c%time%tstep .eq. 0)
then
282 call simulation_init(c, dt_controller)
284 step_loop_start = mpi_wtime()
287 if (.not. c%time%is_done())
then
288 call simulation_step(c, dt_controller, step_loop_start)
291 if (c%time%is_done())
then
292 call simulation_finalize(c)
293 if (
allocated(dt_controller))
then
294 deallocate(dt_controller)
299 call neko_error(
'Invalid Neko case')
309 bind(c, name="neko_output_ctrl_execute")
310 integer(c_intptr_t),
intent(inout) :: case_iptr
311 logical(kind=c_bool),
value :: force_output
312 logical :: f_force_output
313 type(case_t),
pointer :: C
315 type(time_state_t) :: f_time
317 cp = transfer(case_iptr, c_null_ptr)
318 if (c_associated(cp))
then
319 call c_f_pointer(cp, c)
321 call neko_error(
'Invalid Neko case')
324 f_force_output = transfer(force_output, f_force_output)
325 call c%output_controller%execute(c%time, f_force_output)
332 bind(c, name=
'neko_field')
333 character(kind=c_char),
dimension(*),
intent(in) :: field_name
334 character(len=8192) :: name
335 type(field_t),
pointer ::
field
336 type(c_ptr) :: field_ptr
341 if (field_name(len+1) .eq. c_null_char)
exit
343 name(len:len) = field_name(len)
346 field => neko_registry%get_field(trim(name(1:len)))
348 field_ptr = c_loc(
field%x)
355 bind(c, name=
'neko_field_order')
356 character(kind=c_char),
dimension(*),
intent(in) :: field_name
357 character(len=8192) :: name
358 type(field_t),
pointer ::
field
359 integer(c_int) :: field_lx
364 if (field_name(len+1) .eq. c_null_char)
exit
366 name(len:len) = field_name(len)
369 field => neko_registry%get_field(trim(name(1:len)))
371 field_lx =
field%Xh%lx
378 bind(c, name=
'neko_field_nelements')
379 character(kind=c_char),
dimension(*),
intent(in) :: field_name
380 character(len=8192) :: name
381 type(field_t),
pointer ::
field
382 integer(c_int) :: field_nelv
387 if (field_name(len+1) .eq. c_null_char)
exit
389 name(len:len) = field_name(len)
392 field => neko_registry%get_field(trim(name(1:len)))
394 field_nelv =
field%msh%nelv
401 bind(c, name=
'neko_field_size')
402 character(kind=c_char),
dimension(*),
intent(in) :: field_name
403 character(len=8192) :: name
404 type(field_t),
pointer ::
field
405 integer(c_int) :: field_size
410 if (field_name(len+1) .eq. c_null_char)
exit
412 name(len:len) = field_name(len)
415 field => neko_registry%get_field(trim(name(1:len)))
417 field_size =
field%dof%size()
428 bind(c, name=
'neko_field_dofmap')
429 character(kind=c_char),
dimension(*),
intent(in) :: field_name
430 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
431 character(len=8192) :: name
432 type(field_t),
pointer :: field
437 if (field_name(len+1) .eq. c_null_char)
exit
439 name(len:len) = field_name(len)
442 field => neko_registry%get_field(trim(name(1:len)))
455 x_ptr, y_ptr, z_ptr, size) bind(c, name='neko_case_fluid_dofmap')
456 integer(c_intptr_t),
intent(inout) :: case_iptr
457 type(case_t),
pointer :: C
459 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
460 integer,
intent(inout) :: size
462 cptr = transfer(case_iptr, c_null_ptr)
463 if (c_associated(cptr))
then
464 call c_f_pointer(cptr, c)
466 size = c%fluid%dm_Xh%size()
468 call neko_error(
'Invalid Neko case')
475 type(dofmap_t),
target,
intent(in) :: dm
476 type(c_ptr),
intent(inout) :: dof_ptr, x_ptr, y_ptr, z_ptr
478 dof_ptr = c_loc(dm%dof)
499 dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz) &
500 bind(c, name=
'neko_field_space')
501 character(kind=c_char),
dimension(*),
intent(in) :: field_name
502 integer,
intent(inout) :: lx
503 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
504 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
505 character(len=8192) :: name
506 type(field_t),
pointer :: field
511 if (field_name(len+1) .eq. c_null_char)
exit
513 name(len:len) = field_name(len)
516 field => neko_registry%get_field(trim(name(1:len)))
518 wx, wy, wz, dx, dy, dz)
536 dr_inv, ds_inv, dt_inv, wx, wy, wz, dx, dy, dz) &
537 bind(c, name=
'neko_case_fluid_space')
538 integer(c_intptr_t),
intent(inout) :: case_iptr
539 type(case_t),
pointer :: C
541 integer,
intent(inout) :: lx
542 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
543 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
546 cptr = transfer(case_iptr, c_null_ptr)
547 if (c_associated(cptr))
then
548 call c_f_pointer(cptr, c)
550 wx, wy, wz, dx, dy, dz)
552 call neko_error(
'Invalid Neko case')
559 wx, wy, wz, dx, dy, dz)
560 type(space_t),
target,
intent(in) :: Xh
561 integer,
intent(inout) :: lx
562 type(c_ptr),
intent(inout) :: zg, dr_inv, ds_inv, dt_inv
563 type(c_ptr),
intent(inout) :: wx, wy, wz, dx, dy, dz
567 dr_inv = c_loc(xh%dr_inv)
568 ds_inv = c_loc(xh%ds_inv)
569 dt_inv = c_loc(xh%dt_inv)
582 mult, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, &
583 drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, &
584 jac, B, area, nx, ny, nz) bind(c, name='neko_case_fluid_coef')
585 integer(c_intptr_t),
intent(inout) :: case_iptr
586 type(case_t),
pointer :: C
588 type(c_ptr),
intent(inout) :: G11, G22, G33, G12, G13, G23
589 type(c_ptr),
intent(inout) :: mult
590 type(c_ptr),
intent(inout) :: dxdr, dydr, dzdr
591 type(c_ptr),
intent(inout) :: dxds, dyds, dzds
592 type(c_ptr),
intent(inout) :: dxdt, dydt, dzdt
593 type(c_ptr),
intent(inout) :: drdx, drdy, drdz
594 type(c_ptr),
intent(inout) :: dsdx, dsdy, dsdz
595 type(c_ptr),
intent(inout) :: dtdx, dtdy, dtdz
596 type(c_ptr),
intent(inout) :: jac, B, area, nx, ny, nz
599 cptr = transfer(case_iptr, c_null_ptr)
600 if (c_associated(cptr))
then
601 call c_f_pointer(cptr, c)
602 g11 = c_loc(c%fluid%c_Xh%G11)
603 g22 = c_loc(c%fluid%c_Xh%G22)
604 g33 = c_loc(c%fluid%c_Xh%G33)
605 g12 = c_loc(c%fluid%c_Xh%G12)
606 g13 = c_loc(c%fluid%c_Xh%G13)
607 g23 = c_loc(c%fluid%c_Xh%G23)
608 mult = c_loc(c%fluid%c_Xh%mult)
609 dxdr = c_loc(c%fluid%c_Xh%dxdr)
610 dydr = c_loc(c%fluid%c_Xh%dydr)
611 dzdr = c_loc(c%fluid%c_Xh%dzdr)
612 dxds = c_loc(c%fluid%c_Xh%dxds)
613 dyds = c_loc(c%fluid%c_Xh%dyds)
614 dzds = c_loc(c%fluid%c_Xh%dzds)
615 dxdt = c_loc(c%fluid%c_Xh%dxdt)
616 dydt = c_loc(c%fluid%c_Xh%dydt)
617 dzdt = c_loc(c%fluid%c_Xh%dzdt)
618 drdx = c_loc(c%fluid%c_Xh%drdx)
619 drdy = c_loc(c%fluid%c_Xh%drdy)
620 drdz = c_loc(c%fluid%c_Xh%drdz)
621 dsdx = c_loc(c%fluid%c_Xh%dsdx)
622 dsdy = c_loc(c%fluid%c_Xh%dsdy)
623 dsdz = c_loc(c%fluid%c_Xh%dsdz)
624 dtdx = c_loc(c%fluid%c_Xh%dtdx)
625 dtdy = c_loc(c%fluid%c_Xh%dtdy)
626 dtdz = c_loc(c%fluid%c_Xh%dtdz)
627 jac = c_loc(c%fluid%c_Xh%jac)
628 b = c_loc(c%fluid%c_Xh%B)
629 area = c_loc(c%fluid%c_Xh%area)
630 nx = c_loc(c%fluid%c_Xh%nx)
631 ny = c_loc(c%fluid%c_Xh%ny)
632 nz = c_loc(c%fluid%c_Xh%nz)
634 call neko_error(
'Invalid Neko case')
648 compute_cb, dirichlet_cb, material_cb, source_cb) &
649 bind(c, name=
'neko_user_setup')
650 integer(c_intptr_t),
intent(inout) :: case_iptr
651 type(c_funptr),
value :: initial_cb, preprocess_cb, compute_cb
652 type(c_funptr),
value :: dirichlet_cb, material_cb, source_cb
653 type(case_t),
pointer :: C
656 cptr = transfer(case_iptr, c_null_ptr)
657 if (c_associated(cptr))
then
658 call c_f_pointer(cptr, c)
659 call neko_api_user_cb_register(c%user, initial_cb, preprocess_cb, &
660 compute_cb, dirichlet_cb, material_cb, source_cb)
662 call neko_error(
'Invalid Neko case')
670 bind(c, name=
'neko_cb_field_by_name')
671 character(kind=c_char),
dimension(*),
intent(in) :: field_name
672 character(len=8192) :: name
673 type(field_t),
pointer ::
field
674 type(c_ptr) :: field_ptr
679 if (field_name(len+1) .eq. c_null_char)
exit
681 name(len:len) = field_name(len)
684 field => neko_api_user_cb_get_field(trim(name(1:len)))
686 field_ptr = c_loc(
field%x)
693 result(field_ptr) bind(c, name=
'neko_cb_field_by_index')
694 integer,
intent(in) :: field_idx
695 type(field_t),
pointer ::
field
696 type(c_ptr) :: field_ptr
698 field => neko_api_user_cb_get_field(field_idx)
700 field_ptr = c_loc(
field%x)
708 result(same_name) bind(c, name=
'neko_cb_field_name_at_index')
709 integer,
intent(in) :: field_idx
710 character(kind=c_char),
dimension(*),
intent(in) :: field_name
711 character(len=8192) :: name
712 type(field_t),
pointer :: f1, f2
713 type(c_ptr) :: field_ptr
715 logical(c_bool) :: same_name
719 if (field_name(len+1) .eq. c_null_char)
exit
721 name(len:len) = field_name(len)
724 f1 => neko_api_user_cb_get_field(field_idx)
725 f2 => neko_api_user_cb_get_field(trim(name(1:len)))
727 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.
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_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.