79 integer,
allocatable :: imin(:)
80 integer,
allocatable :: imax(:)
81 integer,
allocatable :: ri(:, :)
82 integer,
allocatable :: ri_pos(:,:,:)
83 integer,
allocatable :: ri_neg(:,:,:)
86 integer,
public,
parameter :: &
94 type(stencil_t),
public :: stencil
95 type(mesh_t),
pointer :: mesh => null()
96 integer,
allocatable :: nn(:)
97 integer,
public :: np = 0
99 real(real64),
allocatable,
public :: w(:,:)
101 logical,
public :: const_w = .
true.
103 type(accel_mem_t),
public :: buff_weights
104 type(accel_mem_t),
public :: buff_half_weights
106 integer :: symmetry = op_general
108 character(len=40) :: label
111 integer,
public :: nri = 0
112 integer,
allocatable,
public :: ri(:,:)
113 integer,
allocatable,
public :: rimap(:)
114 integer,
allocatable,
public :: rimap_inv(:)
117 integer :: npairs = 0
118 real(real64),
allocatable :: wpair(:)
119 real(real64) :: wcenter
120 integer,
allocatable :: ri_pos(:,:,:)
121 integer,
allocatable :: ri_neg(:,:,:)
122 integer :: max_allocated_ri_pair = 0
124 integer :: ninner = 0
125 integer :: nouter = 0
127 type(nl_operator_index_t) :: inner
128 type(nl_operator_index_t) :: outer
130 type(accel_kernel_t) :: kernel
131 type(accel_mem_t) :: buff_imin
132 type(accel_mem_t) :: buff_imax
133 type(accel_mem_t) :: buff_ri
134 type(accel_mem_t) :: buff_map
135 type(accel_mem_t) :: buff_all
136 type(accel_mem_t) :: buff_inner
137 type(accel_mem_t) :: buff_outer
140 type(accel_mem_t),
public :: buff_wpair
141 type(accel_mem_t),
public :: buff_half_wpair
142 type(accel_mem_t),
public :: buff_ri_pos
143 type(accel_mem_t),
public :: buff_ri_neg
144 type(accel_mem_t),
public :: buff_map_sym
145 integer :: max_allocated_ri_pair_gpu = 0
148 type(nl_operator_t),
public,
pointer :: coarser => null()
152 integer,
parameter :: &
158 integer,
parameter :: &
167 integer,
intent(in) :: opid, type
171 integer :: dfunction_global = -1
172 integer :: zfunction_global = -1
269 character(len=*),
intent(in) :: label
270 integer,
optional,
intent(in) :: symm
275 op%symmetry = op_general
294 class(
space_t),
intent(in) :: space
295 type(
mesh_t),
target,
intent(in) :: mesh
297 integer,
intent(in) :: np
298 logical,
optional,
intent(in) :: const_w
299 logical,
optional,
intent(in) :: regenerate
301 integer :: ii, jj, p1(space%dim), time, current
302 integer,
allocatable :: st1(:), st2(:), st1r(:)
303 integer :: ir, maxp, iinner, iouter
304 logical :: change, force_change
305 character(len=200) :: flags
306 character(len=32) :: indirect_arg
307 integer,
allocatable :: inner_points(:), outer_points(:), all_points(:)
312 if (mesh%parallel_in_domains .and. .not. op%const_w)
then
326 if (.not. op%const_w) op%symmetry = op_general
330 safe_allocate(op%w(1:op%stencil%size, 1))
331 message(1) =
'Debug: nl_operator_build: working with constant weights.'
334 safe_allocate(op%w(1:op%stencil%size, 1:op%np))
335 message(1) =
'Debug: nl_operator_build: working with non-constant weights.'
343 safe_allocate(st1(1:op%stencil%size))
344 safe_allocate(st1r(1:op%stencil%size))
345 safe_allocate(st2(1:op%stencil%size))
354 do jj = 1, op%stencil%size
361 st1(1:op%stencil%size) = st1(1:op%stencil%size) - ii
363 change = any(st1 /= st2)
367 force_change = any(st1 + ii > mesh%np) .and. all(st2 + ii - 1 <= mesh%np)
370 if (change .or. force_change)
then
375 if (time == 1) op%nri = op%nri + 1
379 current = current + 1
380 op%ri(1:op%stencil%size, current) = st1(1:op%stencil%size)
384 if (time == 2) op%rimap(ii) = current
390 safe_deallocate_a(op%ri)
391 safe_deallocate_a(op%rimap)
392 safe_deallocate_a(op%rimap_inv)
394 safe_allocate(op%ri(1:op%stencil%size, 1:op%nri))
395 safe_allocate(op%rimap(1:op%np))
396 safe_allocate(op%rimap_inv(1:op%nri + 1))
403 if (mesh%use_curvilinear)
then
404 safe_allocate(op%nn(1:op%nri))
406 op%nn = op%stencil%size
415 op%rimap_inv(op%rimap(jj) + 1) = jj
417 op%rimap_inv(op%nri + 1) = op%np
419 safe_deallocate_a(st1)
420 safe_deallocate_a(st1r)
421 safe_deallocate_a(st2)
423 if (op%mesh%parallel_in_domains)
then
430 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
433 op%inner%nri = op%inner%nri + 1
434 assert(op%inner%nri <= op%nri)
437 op%outer%nri = op%outer%nri + 1
438 assert(op%outer%nri <= op%nri)
442 assert(op%inner%nri + op%outer%nri == op%nri)
445 safe_deallocate_a(op%inner%imin)
446 safe_deallocate_a(op%inner%imax)
447 safe_deallocate_a(op%inner%ri)
448 safe_deallocate_a(op%outer%imin)
449 safe_deallocate_a(op%outer%imax)
450 safe_deallocate_a(op%outer%ri)
452 safe_allocate(op%inner%imin(1:op%inner%nri + 1))
453 safe_allocate(op%inner%imax(1:op%inner%nri))
454 safe_allocate(op%inner%ri(1:op%stencil%size, 1:op%inner%nri))
456 safe_allocate(op%outer%imin(1:op%outer%nri + 1))
457 safe_allocate(op%outer%imax(1:op%outer%nri))
458 safe_allocate(op%outer%ri(1:op%stencil%size, 1:op%outer%nri))
464 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
468 op%inner%imin(iinner) = op%rimap_inv(ir)
469 op%inner%imax(iinner) = op%rimap_inv(ir + 1)
470 op%inner%ri(1:op%stencil%size, iinner) = op%ri(1:op%stencil%size, ir)
474 op%outer%imin(iouter) = op%rimap_inv(ir)
475 op%outer%imax(iouter) = op%rimap_inv(ir + 1)
476 op%outer%ri(1:op%stencil%size, iouter) = op%ri(1:op%stencil%size, ir)
481 do ir = 1, op%inner%nri
482 do ii = op%inner%imin(ir) + 1, op%inner%imax(ir)
483 assert(all(ii + op%inner%ri(1:op%stencil%size, ir) <= mesh%np))
491 write(flags,
'(i5)') op%stencil%size
492 flags=
'-DSTENCIL_SIZE='//trim(adjustl(flags))
496 if (op%symmetry /= op_general)
then
501 if (op%mesh%parallel_in_domains)
then
502 indirect_arg =
'Indexing::Indirect'
504 indirect_arg =
'Indexing::Direct'
506 select case (op%symmetry)
509 'operate_map<double, '//trim(indirect_arg)//
'>', flags)
512 'operate_map<double, '//trim(indirect_arg)//
', Symmetry::Symmetric>', flags)
515 'operate_map<double, '//trim(indirect_arg)//
', Symmetry::Antisymmetric>', flags)
535 if (op%symmetry /= op_general)
then
537 call accel_write_buffer(op%buff_map_sym, op%mesh%np, (op%rimap - 1)*(op%stencil%size/2))
540 if (op%mesh%parallel_in_domains)
then
542 safe_allocate(inner_points(1:op%mesh%np))
543 safe_allocate(outer_points(1:op%mesh%np))
544 safe_allocate(all_points(1:op%mesh%np))
549 do ii = 1, op%mesh%np
550 all_points(ii) = ii - 1
551 maxp = ii + maxval(op%ri(1:op%stencil%size, op%rimap(ii)))
552 if (maxp <= op%mesh%np)
then
553 op%ninner = op%ninner + 1
554 inner_points(op%ninner) = ii - 1
556 op%nouter = op%nouter + 1
557 outer_points(op%nouter) = ii - 1
570 safe_deallocate_a(inner_points)
571 safe_deallocate_a(outer_points)
572 safe_deallocate_a(all_points)
586 integer :: istencil, idir
590 write(
message(1),
'(3a)')
'Debug info: Finite difference weights for ', trim(this%label),
'.'
591 write(
message(2),
'(a)')
' Spacing:'
592 do idir = 1, this%mesh%box%dim
593 write(
message(2),
'(a,f16.8)') trim(
message(2)), this%mesh%spacing(idir)
597 do istencil = 1, this%stencil%size
598 select case(this%mesh%box%dim)
600 write(
message(1),
'(a,i3,1i4,f25.10)')
' ', istencil, this%stencil%points(1:1, istencil), this%w(istencil, 1)
602 write(
message(1),
'(a,i3,2i4,f25.10)')
' ', istencil, this%stencil%points(1:2, istencil), this%w(istencil, 1)
604 write(
message(1),
'(a,i3,3i4,f25.10)')
' ', istencil, this%stencil%points(1:3, istencil), this%w(istencil, 1)
623 safe_deallocate_a(op%inner%imin)
624 safe_deallocate_a(op%inner%imax)
625 safe_deallocate_a(op%inner%ri)
626 safe_deallocate_a(op%outer%imin)
627 safe_deallocate_a(op%outer%imax)
628 safe_deallocate_a(op%outer%ri)
630 safe_deallocate_a(op%w)
632 safe_deallocate_a(op%ri)
633 safe_deallocate_a(op%rimap)
634 safe_deallocate_a(op%rimap_inv)
635 safe_deallocate_a(op%nn)
637 safe_deallocate_a(op%wpair)
638 safe_deallocate_a(op%ri_pos)
639 safe_deallocate_a(op%ri_neg)
641 safe_deallocate_a(op%inner%ri_pos)
642 safe_deallocate_a(op%inner%ri_neg)
643 safe_deallocate_a(op%outer%ri_pos)
644 safe_deallocate_a(op%outer%ri_neg)
664 if (op%symmetry /= op_general)
then
667 if (op%mesh%parallel_in_domains)
then
677 if (op%symmetry /= op_general)
then
680 if (op%max_allocated_ri_pair_gpu > 0)
then
683 op%max_allocated_ri_pair_gpu = 0
693 integer,
intent(in) :: is
694 integer,
intent(in) :: ip
696 res = ip + op%ri(is, op%rimap(ip))
707 if (accel_is_enabled() .and. op%const_w)
then
708 call accel_create_buffer(op%buff_weights, accel_mem_read_only, type_float, op%stencil%size)
709 call accel_create_buffer(op%buff_half_weights, accel_mem_read_only, type_float, op%stencil%size)
711 call accel_create_buffer(op%buff_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
712 call accel_create_buffer(op%buff_half_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
725 integer(int64) :: buf_size
730 if (accel_is_enabled() .and. op%const_w)
then
731 call accel_write_buffer(op%buff_weights, op%stencil%size, op%w(:, 1))
732 call accel_write_buffer(op%buff_half_weights, op%stencil%size, -m_half*op%w(:, 1))
735 call accel_write_buffer(op%buff_wpair, op%npairs, op%wpair)
736 call accel_write_buffer(op%buff_half_wpair, op%npairs, -m_half*op%wpair)
739 if (op%max_allocated_ri_pair > op%max_allocated_ri_pair_gpu)
then
740 if (op%max_allocated_ri_pair_gpu > 0)
then
741 call accel_free_buffer(op%buff_ri_pos)
742 call accel_free_buffer(op%buff_ri_neg)
744 buf_size = int(op%npairs, int64)*op%nri*op%max_allocated_ri_pair
745 call accel_create_buffer(op%buff_ri_pos, accel_mem_read_only, type_integer, buf_size)
746 call accel_create_buffer(op%buff_ri_neg, accel_mem_read_only, type_integer, buf_size)
747 op%max_allocated_ri_pair_gpu = op%max_allocated_ri_pair
750 if (op%max_allocated_ri_pair > 0)
then
751 call accel_write_buffer(op%buff_ri_pos, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_pos)
752 call accel_write_buffer(op%buff_ri_neg, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_neg)
762 integer pure function nl_operator_np_zero_bc(op) result(np_bc)
769 ii = op%rimap_inv(jj + 1) + maxval(op%ri(1:op%stencil%size, jj))
770 np_bc = max(np_bc, ii)
780 type(space_t),
intent(in) :: space
781 class(mesh_t),
intent(in) :: mesh
784 real(real64),
parameter :: tol = 1.0e-14_real64
785 real(real64) :: max_weight, new_w(op%stencil%size)
786 integer :: new_points(space%dim, op%stencil%size)
788 if (.not. op%const_w)
return
792 max_weight = maxval(abs(op%w(:, 1)))
794 do ip = 1, op%stencil%size
795 if (abs(op%w(ip, 1)) > tol * max_weight)
then
797 new_w(size) = op%w(ip, 1)
798 new_points(:,size) = op%stencil%points(:, ip)
803 op%stencil%size =
size
804 safe_deallocate_a(op%stencil%points)
805 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
806 op%stencil%points(:, :) = new_points(:, 1:size)
807 safe_deallocate_a(op%w)
810 op%w(1:
size, 1) = new_w(1:size)
813 call stencil_init_center(op%stencil)
819 subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
820 integer,
intent(in) :: size
821 integer,
intent(in) :: ldf
822 integer,
intent(in) :: offsets(:, :)
823 real(real64),
intent(in) :: wre(:)
824 integer,
intent(in) :: ri(:, :)
825 integer,
intent(in) :: nri
826 integer,
intent(out) :: npairs
827 real(real64),
intent(inout) :: wpair(:)
828 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
829 real(real64),
intent(out) :: wcenter
831 logical,
allocatable :: used(:)
832 integer :: i, j, ndim, s
834 integer,
allocatable :: idx(:)
836 real(real64),
parameter :: tol = 1.0e-11_real64
840 assert(mod(
size,2) == 1)
842 safe_allocate(used(1:size))
846 ndim = ubound(offsets, dim=1)
848 safe_allocate(idx(1:size))
849 call robust_sort_by_abs(wre, offsets, idx)
854 if (all(offsets(:, idx(i))==0))
then
855 wcenter = wre(idx(i))
865 same = abs(wre(idx(i)) - wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
866 if (.not. same) cycle
869 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
873 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
874 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
876 wpair(npairs) = m_half*(wre(idx(i)) + wre(idx(j)))
884 assert(npairs == size/2)
886 safe_deallocate_a(idx)
893 integer,
intent(in) :: size
894 integer,
intent(in) :: ldf
895 integer,
intent(in) :: offsets(:, :)
896 real(real64),
intent(in) :: wre(:)
897 integer,
intent(in) :: ri(:, :)
898 integer,
intent(in) :: nri
899 integer,
intent(out) :: npairs
900 real(real64),
intent(inout) :: wpair(:)
901 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
903 logical,
allocatable :: used(:)
904 integer :: i, j, ndim, s
906 integer,
allocatable :: idx(:)
908 real(real64),
parameter :: tol = 1.0e-11_real64
912 assert(mod(
size,2) == 0)
914 safe_allocate(used(1:size))
918 ndim = ubound(offsets, dim=1)
920 safe_allocate(idx(1:size))
921 call robust_sort_by_abs(wre, offsets, idx)
932 same = abs(wre(idx(i)) + wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
933 if (.not. same) cycle
936 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
940 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
941 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
943 wpair(npairs) = m_half*(wre(idx(i)) - wre(idx(j)))
951 assert(npairs == size/2)
953 safe_deallocate_a(idx)
960 integer,
optional,
intent(in) :: max_size
962 integer :: ldf, start, end, ipair
970 if(
present(max_size))
then
971 start = op%max_allocated_ri_pair + 1
973 call reallocate_array(op%ri_pos, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
974 call reallocate_array(op%ri_neg, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
975 if (op%mesh%parallel_in_domains)
then
976 call reallocate_array(op%inner%ri_pos, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
977 call reallocate_array(op%inner%ri_neg, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
978 call reallocate_array(op%outer%ri_pos, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
979 call reallocate_array(op%outer%ri_neg, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
981 else if (
allocated(op%wpair))
then
984 end = op%max_allocated_ri_pair
987 safe_allocate(op%wpair(1:op%stencil%size/2))
990 if (conf%target_states_block_size > 0)
then
991 end = log2(conf%target_states_block_size)+1
996 safe_allocate(op%ri_pos(1:op%stencil%size/2, 1:op%nri, 1:
end))
997 safe_allocate(op%ri_neg(1:op%stencil%size/2, 1:op%nri, 1:
end))
998 if (op%mesh%parallel_in_domains)
then
999 safe_allocate(op%inner%ri_pos(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1000 safe_allocate(op%inner%ri_neg(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1001 safe_allocate(op%outer%ri_pos(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1002 safe_allocate(op%outer%ri_neg(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1005 op%max_allocated_ri_pair =
end
1007 do ldf = start-1,
end-1
1008 select case(op%symmetry)
1010 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%ri, op%nri, &
1011 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1), op%wcenter)
1012 if (op%mesh%parallel_in_domains)
then
1013 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1014 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1), op%wcenter)
1015 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1016 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1), op%wcenter)
1020 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1))
1021 if (op%mesh%parallel_in_domains)
then
1022 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1023 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1))
1024 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1025 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1))
1030 if (.not.
present(max_size))
then
1031 write(message(1),
'(3a)')
'Debug info: Sorted weights for ', trim(op%label),
'.'
1032 call messages_info(1, debug_only=.
true.)
1034 do ipair = 1, op%npairs
1035 write(message(1),
'(a,i3,f25.10,2(1x,i4))')
' ', ipair, op%wpair(ipair), op%ri_pos(ipair,1,1), op%ri_neg(ipair,1,1)
1036 call messages_info(1, debug_only=.
true.)
1045 integer,
allocatable,
intent(inout) :: ri(:,:,:)
1046 integer,
intent(in) :: stencil_size, nri
1047 integer,
intent(in) :: old_size, new_size
1049 integer,
allocatable :: tmp(:,:,:)
1051 safe_allocate_source_a(tmp, ri)
1052 safe_deallocate_a(ri)
1053 safe_allocate(ri(1:stencil_size, 1:nri, 1:new_size))
1054 ri(:,:,1:old_size) = tmp
1055 safe_deallocate_a(tmp)
1060#include "nl_operator_inc.F90"
1063#include "complex.F90"
1064#include "nl_operator_inc.F90"
subroutine, public accel_free_buffer(this, async)
subroutine, public accel_kernel_build(this, file_name, kernel_name, flags)
Compile the program that contains a given kernel.
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
integer pure function, public accel_max_block_size()
This module implements batches of mesh functions.
Module implementing boundary conditions in Octopus.
real(real64), parameter, public m_zero
This module implements the index, used for the mesh points.
This module is intended to contain "only mathematical" functions and procedures.
This module defines the meshes, which are used in Octopus.
integer function, public mesh_local_index_from_coords(mesh, ix)
This function returns the local index of the point for a given vector of integer coordinates.
subroutine, public mesh_local_index_to_coords(mesh, ip, ix)
Given a local point index, this function returns the set of integer coordinates of the point.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
This module defines non-local operators.
subroutine, public dnl_operator_operate_diag(op, fo)
integer, parameter op_map
integer, parameter op_max
integer, parameter op_vec
subroutine, public nl_operator_init(op, label, symm)
initialize an instance of a non-local operator by setting the label
subroutine, public dnl_operator_operate_batch(op, fi, fo, ghost_update, profile, points, factor, async)
subroutine nl_operator_clear_gpu_buffers(op)
subroutine, public nl_operator_build_symmetric_weights(op, max_size)
Builds (or rebuild) the necessary arrays for symmetric and antisymmetric stencils.
subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
Take a list of weights and offsets and build pairs of symmetric points with common weights.
subroutine group_by_pairs_antisym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg)
Take a list of weights and offsets and build pairs of symmetric points with common weights.
subroutine, public dnl_operator_operate(op, fi, fo, ghost_update, profile, points)
subroutine, public nl_operator_update_gpu_buffers(op)
subroutine, public nl_operator_global_init(namespace)
initialize global settings for non-local operators
subroutine, public nl_operator_output_weights(this)
integer, parameter, public op_general
subroutine, public nl_operator_end(op)
integer, parameter, public op_inner
subroutine, public znl_operator_operate(op, fi, fo, ghost_update, profile, points)
subroutine, public nl_operator_remove_zero_weight_points(op, space, mesh)
Removes the zero-weight points for constant weight stencils.
integer, parameter, public op_symmetric
subroutine, public nl_operator_global_end()
integer, parameter, public op_outer
subroutine, public nl_operator_build(space, mesh, op, np, const_w, regenerate)
Creates the nonlocal operators for the stencils used for finite differences.
subroutine, public znl_operator_operate_batch(op, fi, fo, ghost_update, profile, points, factor, async)
integer pure function, public nl_operator_np_zero_bc(op)
integer, parameter, public op_antisymmetric
subroutine, public znl_operator_operate_diag(op, fo)
subroutine reallocate_array(ri, stencil_size, nri, old_size, new_size)
Reallocate an ri array.
integer pure function, public nl_operator_get_index(op, is, ip)
subroutine, public nl_operator_allocate_gpu_buffers(op)
integer, parameter op_min
This module contains interfaces for routines in operate.c.
Some general things and nomenclature:
This module is intended to contain "only mathematical" functions and procedures.
This module defines stencils used in Octopus.
subroutine, public stencil_end(this)
type(type_t), parameter, public type_integer
Describes mesh distribution to nodes.
index type for non-local operators
data type for non local operators