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
138 type(accel_mem_t) :: buff_stencil
139 type(accel_mem_t) :: buff_ip_to_xyz
140 type(accel_mem_t) :: buff_xyz_to_ip
143 type(accel_mem_t),
public :: buff_wpair
144 type(accel_mem_t),
public :: buff_half_wpair
145 type(accel_mem_t),
public :: buff_ri_pos
146 type(accel_mem_t),
public :: buff_ri_neg
147 type(accel_mem_t),
public :: buff_map_sym
148 integer :: max_allocated_ri_pair_gpu = 0
151 type(nl_operator_t),
public,
pointer :: coarser => null()
155 integer,
parameter :: &
161 integer,
parameter :: &
171 integer,
intent(in) :: opid, type
272 character(len=*),
intent(in) :: label
273 integer,
optional,
intent(in) :: symm
278 op%symmetry = op_general
297 class(
space_t),
intent(in) :: space
298 type(
mesh_t),
target,
intent(in) :: mesh
300 integer,
intent(in) :: np
301 logical,
optional,
intent(in) :: const_w
302 logical,
optional,
intent(in) :: regenerate
304 integer :: ii, jj, p1(space%dim), time, current
305 integer,
allocatable :: st1(:), st2(:), st1r(:)
306 integer :: ir, maxp, iinner, iouter
307 logical :: change, force_change
308 character(len=200) :: flags
309 integer,
allocatable :: inner_points(:), outer_points(:), all_points(:)
313 if (mesh%parallel_in_domains .and. .not. const_w)
then
328 safe_allocate(op%w(1:op%stencil%size, 1))
329 message(1) =
'Debug: nl_operator_build: working with constant weights.'
332 safe_allocate(op%w(1:op%stencil%size, 1:op%np))
333 message(1) =
'Debug: nl_operator_build: working with non-constant weights.'
341 safe_allocate(st1(1:op%stencil%size))
342 safe_allocate(st1r(1:op%stencil%size))
343 safe_allocate(st2(1:op%stencil%size))
352 do jj = 1, op%stencil%size
359 st1(1:op%stencil%size) = st1(1:op%stencil%size) - ii
361 change = any(st1 /= st2)
365 force_change = any(st1 + ii > mesh%np) .and. all(st2 + ii - 1 <= mesh%np)
368 if (change .or. force_change)
then
373 if (time == 1) op%nri = op%nri + 1
377 current = current + 1
378 op%ri(1:op%stencil%size, current) = st1(1:op%stencil%size)
382 if (time == 2) op%rimap(ii) = current
388 safe_deallocate_a(op%ri)
389 safe_deallocate_a(op%rimap)
390 safe_deallocate_a(op%rimap_inv)
392 safe_allocate(op%ri(1:op%stencil%size, 1:op%nri))
393 safe_allocate(op%rimap(1:op%np))
394 safe_allocate(op%rimap_inv(1:op%nri + 1))
401 if (mesh%use_curvilinear)
then
402 safe_allocate(op%nn(1:op%nri))
404 op%nn = op%stencil%size
413 op%rimap_inv(op%rimap(jj) + 1) = jj
415 op%rimap_inv(op%nri + 1) = op%np
417 safe_deallocate_a(st1)
418 safe_deallocate_a(st1r)
419 safe_deallocate_a(st2)
421 if (op%mesh%parallel_in_domains)
then
428 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
431 op%inner%nri = op%inner%nri + 1
432 assert(op%inner%nri <= op%nri)
435 op%outer%nri = op%outer%nri + 1
436 assert(op%outer%nri <= op%nri)
440 assert(op%inner%nri + op%outer%nri == op%nri)
443 safe_deallocate_a(op%inner%imin)
444 safe_deallocate_a(op%inner%imax)
445 safe_deallocate_a(op%inner%ri)
446 safe_deallocate_a(op%outer%imin)
447 safe_deallocate_a(op%outer%imax)
448 safe_deallocate_a(op%outer%ri)
450 safe_allocate(op%inner%imin(1:op%inner%nri + 1))
451 safe_allocate(op%inner%imax(1:op%inner%nri))
452 safe_allocate(op%inner%ri(1:op%stencil%size, 1:op%inner%nri))
454 safe_allocate(op%outer%imin(1:op%outer%nri + 1))
455 safe_allocate(op%outer%imax(1:op%outer%nri))
456 safe_allocate(op%outer%ri(1:op%stencil%size, 1:op%outer%nri))
462 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
466 op%inner%imin(iinner) = op%rimap_inv(ir)
467 op%inner%imax(iinner) = op%rimap_inv(ir + 1)
468 op%inner%ri(1:op%stencil%size, iinner) = op%ri(1:op%stencil%size, ir)
472 op%outer%imin(iouter) = op%rimap_inv(ir)
473 op%outer%imax(iouter) = op%rimap_inv(ir + 1)
474 op%outer%ri(1:op%stencil%size, iouter) = op%ri(1:op%stencil%size, ir)
479 do ir = 1, op%inner%nri
480 do ii = op%inner%imin(ir) + 1, op%inner%imax(ir)
481 assert(all(ii + op%inner%ri(1:op%stencil%size, ir) <= mesh%np))
489 write(flags,
'(i5)') op%stencil%size
490 flags=
'-DNDIM=3 -DSTENCIL_SIZE='//trim(adjustl(flags))
492 if (op%symmetry /= op_general)
then
494 character(len=16) :: npairs_str
495 write(npairs_str,
'(i0)') op%stencil%size/2
496 flags = trim(flags)//
' -DNPAIRS='//trim(adjustl(npairs_str))
500 if (op%mesh%parallel_in_domains) flags =
'-DINDIRECT '//trim(flags)
504 if (op%symmetry /= op_general)
then
509 select case (op%symmetry)
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)
595 call messages_info(2, debug_only=.
true.)
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)
606 call messages_info(1, debug_only=.
true.)
619 if (accel_is_enabled() .and. op%const_w)
then
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)
645 call stencil_end(op%stencil)
656 call accel_free_buffer(op%buff_ri)
659 call accel_free_buffer(op%buff_imin)
660 call accel_free_buffer(op%buff_imax)
663 call accel_free_buffer(op%buff_map)
665 call accel_free_buffer(op%buff_map_sym)
667 if (op%mesh%parallel_in_domains)
then
668 call accel_free_buffer(op%buff_all)
669 call accel_free_buffer(op%buff_inner)
670 call accel_free_buffer(op%buff_outer)
674 call accel_free_buffer(op%buff_map)
675 call accel_free_buffer(op%buff_stencil)
676 call accel_free_buffer(op%buff_xyz_to_ip)
677 call accel_free_buffer(op%buff_ip_to_xyz)
680 call accel_free_buffer(op%buff_weights)
681 call accel_free_buffer(op%buff_half_weights)
684 call accel_free_buffer(op%buff_wpair)
685 call accel_free_buffer(op%buff_half_wpair)
686 if (op%max_allocated_ri_pair_gpu > 0)
then
687 call accel_free_buffer(op%buff_ri_pos)
688 call accel_free_buffer(op%buff_ri_neg)
689 op%max_allocated_ri_pair_gpu = 0
699 integer,
intent(in) :: is
700 integer,
intent(in) :: ip
702 res = ip + op%ri(is, op%rimap(ip))
713 if (accel_is_enabled() .and. op%const_w)
then
714 call accel_create_buffer(op%buff_weights, accel_mem_read_only, type_float, op%stencil%size)
715 call accel_create_buffer(op%buff_half_weights, accel_mem_read_only, type_float, op%stencil%size)
717 call accel_create_buffer(op%buff_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
718 call accel_create_buffer(op%buff_half_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
731 integer(int64) :: buf_size
736 if (accel_is_enabled() .and. op%const_w)
then
737 call accel_write_buffer(op%buff_weights, op%stencil%size, op%w(:, 1))
738 call accel_write_buffer(op%buff_half_weights, op%stencil%size, -m_half*op%w(:, 1))
741 call accel_write_buffer(op%buff_wpair, op%npairs, op%wpair)
742 call accel_write_buffer(op%buff_half_wpair, op%npairs, -m_half*op%wpair)
745 if (op%max_allocated_ri_pair > op%max_allocated_ri_pair_gpu)
then
746 if (op%max_allocated_ri_pair_gpu > 0)
then
747 call accel_free_buffer(op%buff_ri_pos)
748 call accel_free_buffer(op%buff_ri_neg)
750 buf_size = int(op%npairs, int64)*op%nri*op%max_allocated_ri_pair
751 call accel_create_buffer(op%buff_ri_pos, accel_mem_read_only, type_integer, buf_size)
752 call accel_create_buffer(op%buff_ri_neg, accel_mem_read_only, type_integer, buf_size)
753 op%max_allocated_ri_pair_gpu = op%max_allocated_ri_pair
756 if (op%max_allocated_ri_pair > 0)
then
757 call accel_write_buffer(op%buff_ri_pos, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_pos)
758 call accel_write_buffer(op%buff_ri_neg, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_neg)
768 integer pure function nl_operator_np_zero_bc(op) result(np_bc)
775 ii = op%rimap_inv(jj + 1) + maxval(op%ri(1:op%stencil%size, jj))
776 np_bc = max(np_bc, ii)
786 type(space_t),
intent(in) :: space
787 class(mesh_t),
intent(in) :: mesh
790 real(real64),
parameter :: tol = 1.0e-14_real64
791 real(real64) :: max_weight, new_w(op%stencil%size)
792 integer :: new_points(space%dim, op%stencil%size)
794 if (.not. op%const_w)
return
798 max_weight = maxval(abs(op%w(:, 1)))
800 do ip = 1, op%stencil%size
801 if (abs(op%w(ip, 1)) > tol * max_weight)
then
803 new_w(size) = op%w(ip, 1)
804 new_points(:,size) = op%stencil%points(:, ip)
809 op%stencil%size =
size
810 safe_deallocate_a(op%stencil%points)
811 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
812 op%stencil%points(:, :) = new_points(:, 1:size)
813 safe_deallocate_a(op%w)
816 op%w(1:
size, 1) = new_w(1:size)
819 call stencil_init_center(op%stencil)
825 subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
826 integer,
intent(in) :: size
827 integer,
intent(in) :: ldf
828 integer,
intent(in) :: offsets(:, :)
829 real(real64),
intent(in) :: wre(:)
830 integer,
intent(in) :: ri(:, :)
831 integer,
intent(in) :: nri
832 integer,
intent(out) :: npairs
833 real(real64),
intent(inout) :: wpair(:)
834 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
835 real(real64),
intent(out) :: wcenter
837 logical,
allocatable :: used(:)
838 integer :: i, j, ndim, s
840 integer,
allocatable :: idx(:)
842 real(real64),
parameter :: tol = 1.0e-12_real64
846 assert(mod(
size,2) == 1)
848 safe_allocate(used(1:size))
852 ndim = ubound(offsets, dim=1)
854 safe_allocate(idx(1:size))
855 call robust_sort_by_abs(wre, offsets, idx)
860 if (all(offsets(:, idx(i))==0))
then
861 wcenter = wre(idx(i))
871 same = abs(wre(idx(i)) - wre(idx(j))) <= tol
872 if (.not. same) cycle
875 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
879 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
880 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
882 wpair(npairs) = m_half*(wre(idx(i)) + wre(idx(j)))
890 assert(npairs == size/2)
892 safe_deallocate_a(idx)
899 integer,
intent(in) :: size
900 integer,
intent(in) :: ldf
901 integer,
intent(in) :: offsets(:, :)
902 real(real64),
intent(in) :: wre(:)
903 integer,
intent(in) :: ri(:, :)
904 integer,
intent(in) :: nri
905 integer,
intent(out) :: npairs
906 real(real64),
intent(inout) :: wpair(:)
907 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
909 logical,
allocatable :: used(:)
910 integer :: i, j, ndim, s
912 integer,
allocatable :: idx(:)
914 real(real64),
parameter :: tol = 1.0e-12_real64
918 assert(mod(
size,2) == 0)
920 safe_allocate(used(1:size))
924 ndim = ubound(offsets, dim=1)
926 safe_allocate(idx(1:size))
927 call robust_sort_by_abs(wre, offsets, idx)
938 same = abs(wre(idx(i)) + wre(idx(j))) <= tol
939 if (.not. same) cycle
942 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
946 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
947 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
949 wpair(npairs) = m_half*(wre(idx(i)) - wre(idx(j)))
957 assert(npairs == size/2)
959 safe_deallocate_a(idx)
966 integer,
optional,
intent(in) :: max_size
968 integer :: ldf, start, end, ipair
975 assert(conf%target_states_block_size > 0)
977 if(
present(max_size))
then
978 start = op%max_allocated_ri_pair + 1
980 call reallocate_array(op%ri_pos, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
981 call reallocate_array(op%ri_neg, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
982 if (op%mesh%parallel_in_domains)
then
983 call reallocate_array(op%inner%ri_pos, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
984 call reallocate_array(op%inner%ri_neg, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
985 call reallocate_array(op%outer%ri_pos, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
986 call reallocate_array(op%outer%ri_neg, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
990 safe_allocate(op%wpair(1:op%stencil%size/2))
992 end = log2(conf%target_states_block_size)+1
994 safe_allocate(op%ri_pos(1:op%stencil%size/2, 1:op%nri, 1:
end))
995 safe_allocate(op%ri_neg(1:op%stencil%size/2, 1:op%nri, 1:
end))
996 if (op%mesh%parallel_in_domains)
then
997 safe_allocate(op%inner%ri_pos(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
998 safe_allocate(op%inner%ri_neg(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
999 safe_allocate(op%outer%ri_pos(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1000 safe_allocate(op%outer%ri_neg(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1003 op%max_allocated_ri_pair =
end
1005 do ldf = start-1,
end-1
1006 select case(op%symmetry)
1008 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%ri, op%nri, &
1009 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1), op%wcenter)
1010 if (op%mesh%parallel_in_domains)
then
1011 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1012 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1), op%wcenter)
1013 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1014 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1), op%wcenter)
1018 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1))
1019 if (op%mesh%parallel_in_domains)
then
1020 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1021 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1))
1022 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1023 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1))
1028 if (.not.
present(max_size))
then
1029 write(message(1),
'(3a)')
'Debug info: Sorted weights for ', trim(op%label),
'.'
1030 call messages_info(1, debug_only=.
true.)
1032 do ipair = 1, op%npairs
1033 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)
1034 call messages_info(1, debug_only=.
true.)
1043 integer,
allocatable,
intent(inout) :: ri(:,:,:)
1044 integer,
intent(in) :: stencil_size, nri
1045 integer,
intent(in) :: old_size, new_size
1047 integer,
allocatable :: tmp(:,:,:)
1049 safe_allocate_source_a(tmp, ri)
1050 safe_deallocate_a(ri)
1051 safe_allocate(ri(1:stencil_size, 1:nri, 1:new_size))
1052 ri(:,:,1:old_size) = tmp
1053 safe_deallocate_a(tmp)
1058#include "nl_operator_inc.F90"
1061#include "complex.F90"
1062#include "nl_operator_inc.F90"
subroutine, public accel_kernel_build(this, file_name, kernel_name, flags)
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 op_invmap
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, parameter op_nomap
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.
type(type_t), public type_integer
Describes mesh distribution to nodes.
index type for non-local operators
data type for non local operators