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,
public :: 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
797 if (max(abs(op%w(ip, 1)), abs(
partner_weight(ip))) > tol * max_weight)
then
799 new_w(size) = op%w(ip, 1)
800 new_points(:,size) = op%stencil%points(:, ip)
805 op%stencil%size =
size
806 safe_deallocate_a(op%stencil%points)
807 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
808 op%stencil%points(:, :) = new_points(:, 1:size)
809 safe_deallocate_a(op%w)
812 op%w(1:
size, 1) = new_w(1:size)
815 call stencil_init_center(op%stencil)
823 integer,
intent(in) :: ip
829 do jp = 1, op%stencil%size
830 if (all(op%stencil%points(:, jp) + op%stencil%points(:, ip) == 0))
then
839 subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
840 integer,
intent(in) :: size
841 integer,
intent(in) :: ldf
842 integer,
contiguous,
intent(in) :: offsets(:, :)
843 real(real64),
contiguous,
intent(in) :: wre(:)
844 integer,
contiguous,
intent(in) :: ri(:, :)
845 integer,
intent(in) :: nri
846 integer,
intent(out) :: npairs
847 real(real64),
contiguous,
intent(inout) :: wpair(:)
848 integer,
contiguous,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
849 real(real64),
intent(out) :: wcenter
851 logical,
allocatable :: used(:)
852 integer :: i, j, ndim, s
854 integer,
allocatable :: idx(:)
855 real(real64) :: max_mismatch
857 real(real64),
parameter :: tol = 1.0e-11_real64
861 assert(mod(
size,2) == 1)
863 safe_allocate(used(1:size))
866 max_mismatch = m_zero
868 ndim = ubound(offsets, dim=1)
870 safe_allocate(idx(1:size))
871 call robust_sort_by_abs(wre, offsets, idx)
876 if (all(offsets(:, idx(i))==0))
then
877 wcenter = wre(idx(i))
889 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
892 same = abs(wre(idx(i)) - wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
893 if (.not. same) max_mismatch = max(max_mismatch, abs(wre(idx(i)) - wre(idx(j))))
897 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
898 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
900 wpair(npairs) = m_half*(wre(idx(i)) + wre(idx(j)))
908 assert(npairs == size/2)
910 if (max_mismatch > m_zero)
then
911 write(message(1),
'(a,es10.3)')
'Symmetric stencil weights differ between partner points by up to ', max_mismatch
912 message(2) =
'They have been averaged. The stencil weights may be ill-conditioned (try a lower DerivativesOrder).'
913 call messages_warning(2)
916 safe_deallocate_a(idx)
923 integer,
intent(in) :: size
924 integer,
intent(in) :: ldf
925 integer,
contiguous,
intent(in) :: offsets(:, :)
926 real(real64),
contiguous,
intent(in) :: wre(:)
927 integer,
contiguous,
intent(in) :: ri(:, :)
928 integer,
intent(in) :: nri
929 integer,
intent(out) :: npairs
930 real(real64),
contiguous,
intent(inout) :: wpair(:)
931 integer,
contiguous,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
933 logical,
allocatable :: used(:)
934 integer :: i, j, ndim, s
936 integer,
allocatable :: idx(:)
937 real(real64) :: max_mismatch
939 real(real64),
parameter :: tol = 1.0e-11_real64
943 assert(mod(
size,2) == 0)
945 safe_allocate(used(1:size))
948 max_mismatch = m_zero
950 ndim = ubound(offsets, dim=1)
952 safe_allocate(idx(1:size))
953 call robust_sort_by_abs(wre, offsets, idx)
965 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
968 same = abs(wre(idx(i)) + wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
969 if (.not. same) max_mismatch = max(max_mismatch, abs(wre(idx(i)) + wre(idx(j))))
973 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
974 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
976 wpair(npairs) = m_half*(wre(idx(i)) - wre(idx(j)))
984 assert(npairs == size/2)
986 if (max_mismatch > m_zero)
then
987 write(message(1),
'(a,es10.3)')
'Antisymmetric stencil weights differ between partner points by up to ', max_mismatch
988 message(2) =
'They have been averaged. The stencil weights may be ill-conditioned (try a lower DerivativesOrder).'
989 call messages_warning(2)
992 safe_deallocate_a(idx)
999 integer,
optional,
intent(in) :: max_size
1001 integer :: ldf, start, end, ipair
1009 if(
present(max_size))
then
1010 start = op%max_allocated_ri_pair + 1
1012 call reallocate_array(op%ri_pos, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
1013 call reallocate_array(op%ri_neg, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
1014 if (op%mesh%parallel_in_domains)
then
1015 call reallocate_array(op%inner%ri_pos, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
1016 call reallocate_array(op%inner%ri_neg, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
1017 call reallocate_array(op%outer%ri_pos, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
1018 call reallocate_array(op%outer%ri_neg, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
1020 else if (
allocated(op%wpair))
then
1023 end = op%max_allocated_ri_pair
1026 safe_allocate(op%wpair(1:op%stencil%size/2))
1029 if (conf%target_states_block_size > 0)
then
1030 end = log2(conf%target_states_block_size)+1
1035 safe_allocate(op%ri_pos(1:op%stencil%size/2, 1:op%nri, 1:
end))
1036 safe_allocate(op%ri_neg(1:op%stencil%size/2, 1:op%nri, 1:
end))
1037 if (op%mesh%parallel_in_domains)
then
1038 safe_allocate(op%inner%ri_pos(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1039 safe_allocate(op%inner%ri_neg(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1040 safe_allocate(op%outer%ri_pos(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1041 safe_allocate(op%outer%ri_neg(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1044 op%max_allocated_ri_pair =
end
1046 do ldf = start-1,
end-1
1047 select case(op%symmetry)
1049 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%ri, op%nri, &
1050 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1), op%wcenter)
1051 if (op%mesh%parallel_in_domains)
then
1052 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1053 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1), op%wcenter)
1054 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1055 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1), op%wcenter)
1059 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1))
1060 if (op%mesh%parallel_in_domains)
then
1061 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1062 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1))
1063 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1064 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1))
1069 if (.not.
present(max_size))
then
1070 write(message(1),
'(3a)')
'Debug info: Sorted weights for ', trim(op%label),
'.'
1071 call messages_info(1, debug_only=.
true.)
1073 do ipair = 1, op%npairs
1074 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)
1075 call messages_info(1, debug_only=.
true.)
1084 integer,
allocatable,
intent(inout) :: ri(:,:,:)
1085 integer,
intent(in) :: stencil_size, nri
1086 integer,
intent(in) :: old_size, new_size
1088 integer,
allocatable :: tmp(:,:,:)
1090 safe_allocate_source_a(tmp, ri)
1091 safe_deallocate_a(ri)
1092 safe_allocate(ri(1:stencil_size, 1:nri, 1:new_size))
1093 ri(:,:,1:old_size) = tmp
1094 safe_deallocate_a(tmp)
1099#include "nl_operator_inc.F90"
1102#include "complex.F90"
1103#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
real(real64) function partner_weight(ip)
Weight of the point with the opposite offset (the point itself for general operators)
Describes mesh distribution to nodes.
index type for non-local operators
data type for non local operators