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(:)
314 if (mesh%parallel_in_domains .and. .not. op%const_w)
then
329 safe_allocate(op%w(1:op%stencil%size, 1))
330 message(1) =
'Debug: nl_operator_build: working with constant weights.'
333 safe_allocate(op%w(1:op%stencil%size, 1:op%np))
334 message(1) =
'Debug: nl_operator_build: working with non-constant weights.'
342 safe_allocate(st1(1:op%stencil%size))
343 safe_allocate(st1r(1:op%stencil%size))
344 safe_allocate(st2(1:op%stencil%size))
353 do jj = 1, op%stencil%size
360 st1(1:op%stencil%size) = st1(1:op%stencil%size) - ii
362 change = any(st1 /= st2)
366 force_change = any(st1 + ii > mesh%np) .and. all(st2 + ii - 1 <= mesh%np)
369 if (change .or. force_change)
then
374 if (time == 1) op%nri = op%nri + 1
378 current = current + 1
379 op%ri(1:op%stencil%size, current) = st1(1:op%stencil%size)
383 if (time == 2) op%rimap(ii) = current
389 safe_deallocate_a(op%ri)
390 safe_deallocate_a(op%rimap)
391 safe_deallocate_a(op%rimap_inv)
393 safe_allocate(op%ri(1:op%stencil%size, 1:op%nri))
394 safe_allocate(op%rimap(1:op%np))
395 safe_allocate(op%rimap_inv(1:op%nri + 1))
402 if (mesh%use_curvilinear)
then
403 safe_allocate(op%nn(1:op%nri))
405 op%nn = op%stencil%size
414 op%rimap_inv(op%rimap(jj) + 1) = jj
416 op%rimap_inv(op%nri + 1) = op%np
418 safe_deallocate_a(st1)
419 safe_deallocate_a(st1r)
420 safe_deallocate_a(st2)
422 if (op%mesh%parallel_in_domains)
then
429 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
432 op%inner%nri = op%inner%nri + 1
433 assert(op%inner%nri <= op%nri)
436 op%outer%nri = op%outer%nri + 1
437 assert(op%outer%nri <= op%nri)
441 assert(op%inner%nri + op%outer%nri == op%nri)
444 safe_deallocate_a(op%inner%imin)
445 safe_deallocate_a(op%inner%imax)
446 safe_deallocate_a(op%inner%ri)
447 safe_deallocate_a(op%outer%imin)
448 safe_deallocate_a(op%outer%imax)
449 safe_deallocate_a(op%outer%ri)
451 safe_allocate(op%inner%imin(1:op%inner%nri + 1))
452 safe_allocate(op%inner%imax(1:op%inner%nri))
453 safe_allocate(op%inner%ri(1:op%stencil%size, 1:op%inner%nri))
455 safe_allocate(op%outer%imin(1:op%outer%nri + 1))
456 safe_allocate(op%outer%imax(1:op%outer%nri))
457 safe_allocate(op%outer%ri(1:op%stencil%size, 1:op%outer%nri))
463 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
467 op%inner%imin(iinner) = op%rimap_inv(ir)
468 op%inner%imax(iinner) = op%rimap_inv(ir + 1)
469 op%inner%ri(1:op%stencil%size, iinner) = op%ri(1:op%stencil%size, ir)
473 op%outer%imin(iouter) = op%rimap_inv(ir)
474 op%outer%imax(iouter) = op%rimap_inv(ir + 1)
475 op%outer%ri(1:op%stencil%size, iouter) = op%ri(1:op%stencil%size, ir)
480 do ir = 1, op%inner%nri
481 do ii = op%inner%imin(ir) + 1, op%inner%imax(ir)
482 assert(all(ii + op%inner%ri(1:op%stencil%size, ir) <= mesh%np))
490 write(flags,
'(i5)') op%stencil%size
491 flags=
'-DNDIM=3 -DSTENCIL_SIZE='//trim(adjustl(flags))
493 if (op%symmetry /= op_general)
then
495 character(len=16) :: npairs_str
496 write(npairs_str,
'(i0)') op%stencil%size/2
497 flags = trim(flags)//
' -DNPAIRS='//trim(adjustl(npairs_str))
501 if (op%mesh%parallel_in_domains) flags =
'-DINDIRECT '//trim(flags)
505 if (op%symmetry /= op_general)
then
510 select case (op%symmetry)
536 if (op%symmetry /= op_general)
then
538 call accel_write_buffer(op%buff_map_sym, op%mesh%np, (op%rimap - 1)*(op%stencil%size/2))
541 if (op%mesh%parallel_in_domains)
then
543 safe_allocate(inner_points(1:op%mesh%np))
544 safe_allocate(outer_points(1:op%mesh%np))
545 safe_allocate(all_points(1:op%mesh%np))
550 do ii = 1, op%mesh%np
551 all_points(ii) = ii - 1
552 maxp = ii + maxval(op%ri(1:op%stencil%size, op%rimap(ii)))
553 if (maxp <= op%mesh%np)
then
554 op%ninner = op%ninner + 1
555 inner_points(op%ninner) = ii - 1
557 op%nouter = op%nouter + 1
558 outer_points(op%nouter) = ii - 1
571 safe_deallocate_a(inner_points)
572 safe_deallocate_a(outer_points)
573 safe_deallocate_a(all_points)
587 integer :: istencil, idir
591 write(message(1),
'(3a)')
'Debug info: Finite difference weights for ', trim(this%label),
'.'
592 write(message(2),
'(a)')
' Spacing:'
593 do idir = 1, this%mesh%box%dim
594 write(message(2),
'(a,f16.8)') trim(message(2)), this%mesh%spacing(idir)
596 call messages_info(2, debug_only=.
true.)
598 do istencil = 1, this%stencil%size
599 select case(this%mesh%box%dim)
601 write(message(1),
'(a,i3,1i4,f25.10)')
' ', istencil, this%stencil%points(1:1, istencil), this%w(istencil, 1)
603 write(message(1),
'(a,i3,2i4,f25.10)')
' ', istencil, this%stencil%points(1:2, istencil), this%w(istencil, 1)
605 write(message(1),
'(a,i3,3i4,f25.10)')
' ', istencil, this%stencil%points(1:3, istencil), this%w(istencil, 1)
607 call messages_info(1, debug_only=.
true.)
620 if (accel_is_enabled() .and. op%const_w)
then
624 safe_deallocate_a(op%inner%imin)
625 safe_deallocate_a(op%inner%imax)
626 safe_deallocate_a(op%inner%ri)
627 safe_deallocate_a(op%outer%imin)
628 safe_deallocate_a(op%outer%imax)
629 safe_deallocate_a(op%outer%ri)
631 safe_deallocate_a(op%w)
633 safe_deallocate_a(op%ri)
634 safe_deallocate_a(op%rimap)
635 safe_deallocate_a(op%rimap_inv)
636 safe_deallocate_a(op%nn)
638 safe_deallocate_a(op%wpair)
639 safe_deallocate_a(op%ri_pos)
640 safe_deallocate_a(op%ri_neg)
642 safe_deallocate_a(op%inner%ri_pos)
643 safe_deallocate_a(op%inner%ri_neg)
644 safe_deallocate_a(op%outer%ri_pos)
645 safe_deallocate_a(op%outer%ri_neg)
646 call stencil_end(op%stencil)
657 call accel_free_buffer(op%buff_ri)
660 call accel_free_buffer(op%buff_imin)
661 call accel_free_buffer(op%buff_imax)
664 call accel_free_buffer(op%buff_map)
666 call accel_free_buffer(op%buff_map_sym)
668 if (op%mesh%parallel_in_domains)
then
669 call accel_free_buffer(op%buff_all)
670 call accel_free_buffer(op%buff_inner)
671 call accel_free_buffer(op%buff_outer)
675 call accel_free_buffer(op%buff_map)
676 call accel_free_buffer(op%buff_stencil)
677 call accel_free_buffer(op%buff_xyz_to_ip)
678 call accel_free_buffer(op%buff_ip_to_xyz)
681 call accel_free_buffer(op%buff_weights)
682 call accel_free_buffer(op%buff_half_weights)
685 call accel_free_buffer(op%buff_wpair)
686 call accel_free_buffer(op%buff_half_wpair)
687 if (op%max_allocated_ri_pair_gpu > 0)
then
688 call accel_free_buffer(op%buff_ri_pos)
689 call accel_free_buffer(op%buff_ri_neg)
690 op%max_allocated_ri_pair_gpu = 0
700 integer,
intent(in) :: is
701 integer,
intent(in) :: ip
703 res = ip + op%ri(is, op%rimap(ip))
714 if (accel_is_enabled() .and. op%const_w)
then
715 call accel_create_buffer(op%buff_weights, accel_mem_read_only, type_float, op%stencil%size)
716 call accel_create_buffer(op%buff_half_weights, accel_mem_read_only, type_float, op%stencil%size)
718 call accel_create_buffer(op%buff_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
719 call accel_create_buffer(op%buff_half_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
732 integer(int64) :: buf_size
737 if (accel_is_enabled() .and. op%const_w)
then
738 call accel_write_buffer(op%buff_weights, op%stencil%size, op%w(:, 1))
739 call accel_write_buffer(op%buff_half_weights, op%stencil%size, -m_half*op%w(:, 1))
742 call accel_write_buffer(op%buff_wpair, op%npairs, op%wpair)
743 call accel_write_buffer(op%buff_half_wpair, op%npairs, -m_half*op%wpair)
746 if (op%max_allocated_ri_pair > op%max_allocated_ri_pair_gpu)
then
747 if (op%max_allocated_ri_pair_gpu > 0)
then
748 call accel_free_buffer(op%buff_ri_pos)
749 call accel_free_buffer(op%buff_ri_neg)
751 buf_size = int(op%npairs, int64)*op%nri*op%max_allocated_ri_pair
752 call accel_create_buffer(op%buff_ri_pos, accel_mem_read_only, type_integer, buf_size)
753 call accel_create_buffer(op%buff_ri_neg, accel_mem_read_only, type_integer, buf_size)
754 op%max_allocated_ri_pair_gpu = op%max_allocated_ri_pair
757 if (op%max_allocated_ri_pair > 0)
then
758 call accel_write_buffer(op%buff_ri_pos, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_pos)
759 call accel_write_buffer(op%buff_ri_neg, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_neg)
769 integer pure function nl_operator_np_zero_bc(op) result(np_bc)
776 ii = op%rimap_inv(jj + 1) + maxval(op%ri(1:op%stencil%size, jj))
777 np_bc = max(np_bc, ii)
787 type(space_t),
intent(in) :: space
788 class(mesh_t),
intent(in) :: mesh
791 real(real64),
parameter :: tol = 1.0e-14_real64
792 real(real64) :: max_weight, new_w(op%stencil%size)
793 integer :: new_points(space%dim, op%stencil%size)
795 if (.not. op%const_w)
return
799 max_weight = maxval(abs(op%w(:, 1)))
801 do ip = 1, op%stencil%size
802 if (abs(op%w(ip, 1)) > tol * max_weight)
then
804 new_w(size) = op%w(ip, 1)
805 new_points(:,size) = op%stencil%points(:, ip)
810 op%stencil%size =
size
811 safe_deallocate_a(op%stencil%points)
812 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
813 op%stencil%points(:, :) = new_points(:, 1:size)
814 safe_deallocate_a(op%w)
817 op%w(1:
size, 1) = new_w(1:size)
820 call stencil_init_center(op%stencil)
826 subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
827 integer,
intent(in) :: size
828 integer,
intent(in) :: ldf
829 integer,
intent(in) :: offsets(:, :)
830 real(real64),
intent(in) :: wre(:)
831 integer,
intent(in) :: ri(:, :)
832 integer,
intent(in) :: nri
833 integer,
intent(out) :: npairs
834 real(real64),
intent(inout) :: wpair(:)
835 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
836 real(real64),
intent(out) :: wcenter
838 logical,
allocatable :: used(:)
839 integer :: i, j, ndim, s
841 integer,
allocatable :: idx(:)
843 real(real64),
parameter :: tol = 1.0e-12_real64
847 assert(mod(
size,2) == 1)
849 safe_allocate(used(1:size))
853 ndim = ubound(offsets, dim=1)
855 safe_allocate(idx(1:size))
856 call robust_sort_by_abs(wre, offsets, idx)
861 if (all(offsets(:, idx(i))==0))
then
862 wcenter = wre(idx(i))
872 same = abs(wre(idx(i)) - wre(idx(j))) <= tol
873 if (.not. same) cycle
876 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
880 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
881 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
883 wpair(npairs) = m_half*(wre(idx(i)) + wre(idx(j)))
891 assert(npairs == size/2)
893 safe_deallocate_a(idx)
900 integer,
intent(in) :: size
901 integer,
intent(in) :: ldf
902 integer,
intent(in) :: offsets(:, :)
903 real(real64),
intent(in) :: wre(:)
904 integer,
intent(in) :: ri(:, :)
905 integer,
intent(in) :: nri
906 integer,
intent(out) :: npairs
907 real(real64),
intent(inout) :: wpair(:)
908 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
910 logical,
allocatable :: used(:)
911 integer :: i, j, ndim, s
913 integer,
allocatable :: idx(:)
915 real(real64),
parameter :: tol = 1.0e-12_real64
919 assert(mod(
size,2) == 0)
921 safe_allocate(used(1:size))
925 ndim = ubound(offsets, dim=1)
927 safe_allocate(idx(1:size))
928 call robust_sort_by_abs(wre, offsets, idx)
939 same = abs(wre(idx(i)) + wre(idx(j))) <= tol
940 if (.not. same) cycle
943 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
947 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
948 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
950 wpair(npairs) = m_half*(wre(idx(i)) - wre(idx(j)))
958 assert(npairs == size/2)
960 safe_deallocate_a(idx)
967 integer,
optional,
intent(in) :: max_size
969 integer :: ldf, start, end, ipair
976 assert(conf%target_states_block_size > 0)
978 if(
present(max_size))
then
979 start = op%max_allocated_ri_pair + 1
981 call reallocate_array(op%ri_pos, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
982 call reallocate_array(op%ri_neg, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
983 if (op%mesh%parallel_in_domains)
then
984 call reallocate_array(op%inner%ri_pos, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
985 call reallocate_array(op%inner%ri_neg, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
986 call reallocate_array(op%outer%ri_pos, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
987 call reallocate_array(op%outer%ri_neg, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
991 safe_allocate(op%wpair(1:op%stencil%size/2))
993 end = log2(conf%target_states_block_size)+1
995 safe_allocate(op%ri_pos(1:op%stencil%size/2, 1:op%nri, 1:
end))
996 safe_allocate(op%ri_neg(1:op%stencil%size/2, 1:op%nri, 1:
end))
997 if (op%mesh%parallel_in_domains)
then
998 safe_allocate(op%inner%ri_pos(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
999 safe_allocate(op%inner%ri_neg(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1000 safe_allocate(op%outer%ri_pos(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1001 safe_allocate(op%outer%ri_neg(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1004 op%max_allocated_ri_pair =
end
1006 do ldf = start-1,
end-1
1007 select case(op%symmetry)
1009 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%ri, op%nri, &
1010 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1), op%wcenter)
1011 if (op%mesh%parallel_in_domains)
then
1012 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1013 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1), op%wcenter)
1014 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1015 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1), op%wcenter)
1019 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1))
1020 if (op%mesh%parallel_in_domains)
then
1021 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1022 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1))
1023 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1024 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1))
1029 if (.not.
present(max_size))
then
1030 write(message(1),
'(3a)')
'Debug info: Sorted weights for ', trim(op%label),
'.'
1031 call messages_info(1, debug_only=.
true.)
1033 do ipair = 1, op%npairs
1034 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)
1035 call messages_info(1, debug_only=.
true.)
1044 integer,
allocatable,
intent(inout) :: ri(:,:,:)
1045 integer,
intent(in) :: stencil_size, nri
1046 integer,
intent(in) :: old_size, new_size
1048 integer,
allocatable :: tmp(:,:,:)
1050 safe_allocate_source_a(tmp, ri)
1051 safe_deallocate_a(ri)
1052 safe_allocate(ri(1:stencil_size, 1:nri, 1:new_size))
1053 ri(:,:,1:old_size) = tmp
1054 safe_deallocate_a(tmp)
1059#include "nl_operator_inc.F90"
1062#include "complex.F90"
1063#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