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
273 character(len=*),
intent(in) :: label
274 integer,
optional,
intent(in) :: symm
279 op%symmetry = op_general
298 class(
space_t),
intent(in) :: space
299 type(
mesh_t),
target,
intent(in) :: mesh
301 integer,
intent(in) :: np
302 logical,
optional,
intent(in) :: const_w
303 logical,
optional,
intent(in) :: regenerate
305 integer :: ii, jj, p1(space%dim), time, current
306 integer,
allocatable :: st1(:), st2(:), st1r(:)
307 integer :: ir, maxp, iinner, iouter
308 logical :: change, force_change
309 character(len=200) :: flags
310 integer,
allocatable :: inner_points(:), outer_points(:), all_points(:)
315 if (mesh%parallel_in_domains .and. .not. op%const_w)
then
329 if (.not. op%const_w) op%symmetry = op_general
333 safe_allocate(op%w(1:op%stencil%size, 1))
334 message(1) =
'Debug: nl_operator_build: working with constant weights.'
337 safe_allocate(op%w(1:op%stencil%size, 1:op%np))
338 message(1) =
'Debug: nl_operator_build: working with non-constant weights.'
346 safe_allocate(st1(1:op%stencil%size))
347 safe_allocate(st1r(1:op%stencil%size))
348 safe_allocate(st2(1:op%stencil%size))
357 do jj = 1, op%stencil%size
364 st1(1:op%stencil%size) = st1(1:op%stencil%size) - ii
366 change = any(st1 /= st2)
370 force_change = any(st1 + ii > mesh%np) .and. all(st2 + ii - 1 <= mesh%np)
373 if (change .or. force_change)
then
378 if (time == 1) op%nri = op%nri + 1
382 current = current + 1
383 op%ri(1:op%stencil%size, current) = st1(1:op%stencil%size)
387 if (time == 2) op%rimap(ii) = current
393 safe_deallocate_a(op%ri)
394 safe_deallocate_a(op%rimap)
395 safe_deallocate_a(op%rimap_inv)
397 safe_allocate(op%ri(1:op%stencil%size, 1:op%nri))
398 safe_allocate(op%rimap(1:op%np))
399 safe_allocate(op%rimap_inv(1:op%nri + 1))
406 if (mesh%use_curvilinear)
then
407 safe_allocate(op%nn(1:op%nri))
409 op%nn = op%stencil%size
418 op%rimap_inv(op%rimap(jj) + 1) = jj
420 op%rimap_inv(op%nri + 1) = op%np
422 safe_deallocate_a(st1)
423 safe_deallocate_a(st1r)
424 safe_deallocate_a(st2)
426 if (op%mesh%parallel_in_domains)
then
433 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
436 op%inner%nri = op%inner%nri + 1
437 assert(op%inner%nri <= op%nri)
440 op%outer%nri = op%outer%nri + 1
441 assert(op%outer%nri <= op%nri)
445 assert(op%inner%nri + op%outer%nri == op%nri)
448 safe_deallocate_a(op%inner%imin)
449 safe_deallocate_a(op%inner%imax)
450 safe_deallocate_a(op%inner%ri)
451 safe_deallocate_a(op%outer%imin)
452 safe_deallocate_a(op%outer%imax)
453 safe_deallocate_a(op%outer%ri)
455 safe_allocate(op%inner%imin(1:op%inner%nri + 1))
456 safe_allocate(op%inner%imax(1:op%inner%nri))
457 safe_allocate(op%inner%ri(1:op%stencil%size, 1:op%inner%nri))
459 safe_allocate(op%outer%imin(1:op%outer%nri + 1))
460 safe_allocate(op%outer%imax(1:op%outer%nri))
461 safe_allocate(op%outer%ri(1:op%stencil%size, 1:op%outer%nri))
467 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
471 op%inner%imin(iinner) = op%rimap_inv(ir)
472 op%inner%imax(iinner) = op%rimap_inv(ir + 1)
473 op%inner%ri(1:op%stencil%size, iinner) = op%ri(1:op%stencil%size, ir)
477 op%outer%imin(iouter) = op%rimap_inv(ir)
478 op%outer%imax(iouter) = op%rimap_inv(ir + 1)
479 op%outer%ri(1:op%stencil%size, iouter) = op%ri(1:op%stencil%size, ir)
484 do ir = 1, op%inner%nri
485 do ii = op%inner%imin(ir) + 1, op%inner%imax(ir)
486 assert(all(ii + op%inner%ri(1:op%stencil%size, ir) <= mesh%np))
494 write(flags,
'(i5)') op%stencil%size
495 flags=
'-DNDIM=3 -DSTENCIL_SIZE='//trim(adjustl(flags))
497 if (op%symmetry /= op_general)
then
499 character(len=16) :: npairs_str
500 write(npairs_str,
'(i0)') op%stencil%size/2
501 flags = trim(flags)//
' -DNPAIRS='//trim(adjustl(npairs_str))
505 if (op%mesh%parallel_in_domains) flags =
'-DINDIRECT '//trim(flags)
509 if (op%symmetry /= op_general)
then
514 select case (op%symmetry)
540 if (op%symmetry /= op_general)
then
542 call accel_write_buffer(op%buff_map_sym, op%mesh%np, (op%rimap - 1)*(op%stencil%size/2))
545 if (op%mesh%parallel_in_domains)
then
547 safe_allocate(inner_points(1:op%mesh%np))
548 safe_allocate(outer_points(1:op%mesh%np))
549 safe_allocate(all_points(1:op%mesh%np))
554 do ii = 1, op%mesh%np
555 all_points(ii) = ii - 1
556 maxp = ii + maxval(op%ri(1:op%stencil%size, op%rimap(ii)))
557 if (maxp <= op%mesh%np)
then
558 op%ninner = op%ninner + 1
559 inner_points(op%ninner) = ii - 1
561 op%nouter = op%nouter + 1
562 outer_points(op%nouter) = ii - 1
575 safe_deallocate_a(inner_points)
576 safe_deallocate_a(outer_points)
577 safe_deallocate_a(all_points)
591 integer :: istencil, idir
595 write(message(1),
'(3a)')
'Debug info: Finite difference weights for ', trim(this%label),
'.'
596 write(message(2),
'(a)')
' Spacing:'
597 do idir = 1, this%mesh%box%dim
598 write(message(2),
'(a,f16.8)') trim(message(2)), this%mesh%spacing(idir)
600 call messages_info(2, debug_only=.
true.)
602 do istencil = 1, this%stencil%size
603 select case(this%mesh%box%dim)
605 write(message(1),
'(a,i3,1i4,f25.10)')
' ', istencil, this%stencil%points(1:1, istencil), this%w(istencil, 1)
607 write(message(1),
'(a,i3,2i4,f25.10)')
' ', istencil, this%stencil%points(1:2, istencil), this%w(istencil, 1)
609 write(message(1),
'(a,i3,3i4,f25.10)')
' ', istencil, this%stencil%points(1:3, istencil), this%w(istencil, 1)
611 call messages_info(1, debug_only=.
true.)
624 if (accel_is_enabled() .and. op%const_w)
then
628 safe_deallocate_a(op%inner%imin)
629 safe_deallocate_a(op%inner%imax)
630 safe_deallocate_a(op%inner%ri)
631 safe_deallocate_a(op%outer%imin)
632 safe_deallocate_a(op%outer%imax)
633 safe_deallocate_a(op%outer%ri)
635 safe_deallocate_a(op%w)
637 safe_deallocate_a(op%ri)
638 safe_deallocate_a(op%rimap)
639 safe_deallocate_a(op%rimap_inv)
640 safe_deallocate_a(op%nn)
642 safe_deallocate_a(op%wpair)
643 safe_deallocate_a(op%ri_pos)
644 safe_deallocate_a(op%ri_neg)
646 safe_deallocate_a(op%inner%ri_pos)
647 safe_deallocate_a(op%inner%ri_neg)
648 safe_deallocate_a(op%outer%ri_pos)
649 safe_deallocate_a(op%outer%ri_neg)
650 call stencil_end(op%stencil)
661 call accel_free_buffer(op%buff_ri)
664 call accel_free_buffer(op%buff_imin)
665 call accel_free_buffer(op%buff_imax)
668 call accel_free_buffer(op%buff_map)
670 call accel_free_buffer(op%buff_map_sym)
672 if (op%mesh%parallel_in_domains)
then
673 call accel_free_buffer(op%buff_all)
674 call accel_free_buffer(op%buff_inner)
675 call accel_free_buffer(op%buff_outer)
679 call accel_free_buffer(op%buff_map)
680 call accel_free_buffer(op%buff_stencil)
681 call accel_free_buffer(op%buff_xyz_to_ip)
682 call accel_free_buffer(op%buff_ip_to_xyz)
685 call accel_free_buffer(op%buff_weights)
686 call accel_free_buffer(op%buff_half_weights)
689 call accel_free_buffer(op%buff_wpair)
690 call accel_free_buffer(op%buff_half_wpair)
691 if (op%max_allocated_ri_pair_gpu > 0)
then
692 call accel_free_buffer(op%buff_ri_pos)
693 call accel_free_buffer(op%buff_ri_neg)
694 op%max_allocated_ri_pair_gpu = 0
704 integer,
intent(in) :: is
705 integer,
intent(in) :: ip
707 res = ip + op%ri(is, op%rimap(ip))
718 if (accel_is_enabled() .and. op%const_w)
then
719 call accel_create_buffer(op%buff_weights, accel_mem_read_only, type_float, op%stencil%size)
720 call accel_create_buffer(op%buff_half_weights, accel_mem_read_only, type_float, op%stencil%size)
722 call accel_create_buffer(op%buff_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
723 call accel_create_buffer(op%buff_half_wpair, accel_mem_read_only, type_float, op%stencil%size/2)
736 integer(int64) :: buf_size
741 if (accel_is_enabled() .and. op%const_w)
then
742 call accel_write_buffer(op%buff_weights, op%stencil%size, op%w(:, 1))
743 call accel_write_buffer(op%buff_half_weights, op%stencil%size, -m_half*op%w(:, 1))
746 call accel_write_buffer(op%buff_wpair, op%npairs, op%wpair)
747 call accel_write_buffer(op%buff_half_wpair, op%npairs, -m_half*op%wpair)
750 if (op%max_allocated_ri_pair > op%max_allocated_ri_pair_gpu)
then
751 if (op%max_allocated_ri_pair_gpu > 0)
then
752 call accel_free_buffer(op%buff_ri_pos)
753 call accel_free_buffer(op%buff_ri_neg)
755 buf_size = int(op%npairs, int64)*op%nri*op%max_allocated_ri_pair
756 call accel_create_buffer(op%buff_ri_pos, accel_mem_read_only, type_integer, buf_size)
757 call accel_create_buffer(op%buff_ri_neg, accel_mem_read_only, type_integer, buf_size)
758 op%max_allocated_ri_pair_gpu = op%max_allocated_ri_pair
761 if (op%max_allocated_ri_pair > 0)
then
762 call accel_write_buffer(op%buff_ri_pos, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_pos)
763 call accel_write_buffer(op%buff_ri_neg, op%npairs, op%nri, op%max_allocated_ri_pair, op%ri_neg)
773 integer pure function nl_operator_np_zero_bc(op) result(np_bc)
780 ii = op%rimap_inv(jj + 1) + maxval(op%ri(1:op%stencil%size, jj))
781 np_bc = max(np_bc, ii)
791 type(space_t),
intent(in) :: space
792 class(mesh_t),
intent(in) :: mesh
795 real(real64),
parameter :: tol = 1.0e-14_real64
796 real(real64) :: max_weight, new_w(op%stencil%size)
797 integer :: new_points(space%dim, op%stencil%size)
799 if (.not. op%const_w)
return
803 max_weight = maxval(abs(op%w(:, 1)))
805 do ip = 1, op%stencil%size
806 if (abs(op%w(ip, 1)) > tol * max_weight)
then
808 new_w(size) = op%w(ip, 1)
809 new_points(:,size) = op%stencil%points(:, ip)
814 op%stencil%size =
size
815 safe_deallocate_a(op%stencil%points)
816 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
817 op%stencil%points(:, :) = new_points(:, 1:size)
818 safe_deallocate_a(op%w)
821 op%w(1:
size, 1) = new_w(1:size)
824 call stencil_init_center(op%stencil)
830 subroutine group_by_pairs_sym(size, ldf, offsets, wre, ri, nri, npairs, wpair, pair_pos, pair_neg, wcenter)
831 integer,
intent(in) :: size
832 integer,
intent(in) :: ldf
833 integer,
intent(in) :: offsets(:, :)
834 real(real64),
intent(in) :: wre(:)
835 integer,
intent(in) :: ri(:, :)
836 integer,
intent(in) :: nri
837 integer,
intent(out) :: npairs
838 real(real64),
intent(inout) :: wpair(:)
839 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
840 real(real64),
intent(out) :: wcenter
842 logical,
allocatable :: used(:)
843 integer :: i, j, ndim, s
845 integer,
allocatable :: idx(:)
847 real(real64),
parameter :: tol = 1.0e-11_real64
851 assert(mod(
size,2) == 1)
853 safe_allocate(used(1:size))
857 ndim = ubound(offsets, dim=1)
859 safe_allocate(idx(1:size))
860 call robust_sort_by_abs(wre, offsets, idx)
865 if (all(offsets(:, idx(i))==0))
then
866 wcenter = wre(idx(i))
876 same = abs(wre(idx(i)) - wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
877 if (.not. same) cycle
880 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
884 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
885 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
887 wpair(npairs) = m_half*(wre(idx(i)) + wre(idx(j)))
895 assert(npairs == size/2)
897 safe_deallocate_a(idx)
904 integer,
intent(in) :: size
905 integer,
intent(in) :: ldf
906 integer,
intent(in) :: offsets(:, :)
907 real(real64),
intent(in) :: wre(:)
908 integer,
intent(in) :: ri(:, :)
909 integer,
intent(in) :: nri
910 integer,
intent(out) :: npairs
911 real(real64),
intent(inout) :: wpair(:)
912 integer,
intent(inout) :: pair_pos(:,:), pair_neg(:,:)
914 logical,
allocatable :: used(:)
915 integer :: i, j, ndim, s
917 integer,
allocatable :: idx(:)
919 real(real64),
parameter :: tol = 1.0e-11_real64
923 assert(mod(
size,2) == 0)
925 safe_allocate(used(1:size))
929 ndim = ubound(offsets, dim=1)
931 safe_allocate(idx(1:size))
932 call robust_sort_by_abs(wre, offsets, idx)
943 same = abs(wre(idx(i)) + wre(idx(j))) <= tol*max(m_one, abs(wre(idx(i))))
944 if (.not. same) cycle
947 if (any(offsets(:,idx(j))+offsets(:, idx(i)) /= 0)) cycle
951 pair_pos(npairs, s) = ri(idx(i), s) * 2**ldf
952 pair_neg(npairs, s) = ri(idx(j), s) * 2**ldf
954 wpair(npairs) = m_half*(wre(idx(i)) - wre(idx(j)))
962 assert(npairs == size/2)
964 safe_deallocate_a(idx)
971 integer,
optional,
intent(in) :: max_size
973 integer :: ldf, start, end, ipair
981 if(
present(max_size))
then
982 start = op%max_allocated_ri_pair + 1
984 call reallocate_array(op%ri_pos, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
985 call reallocate_array(op%ri_neg, op%stencil%size/2, op%nri, op%max_allocated_ri_pair,
end)
986 if (op%mesh%parallel_in_domains)
then
987 call reallocate_array(op%inner%ri_pos, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
988 call reallocate_array(op%inner%ri_neg, op%stencil%size/2, op%inner%nri, op%max_allocated_ri_pair,
end)
989 call reallocate_array(op%outer%ri_pos, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
990 call reallocate_array(op%outer%ri_neg, op%stencil%size/2, op%outer%nri, op%max_allocated_ri_pair,
end)
992 else if (
allocated(op%wpair))
then
995 end = op%max_allocated_ri_pair
998 safe_allocate(op%wpair(1:op%stencil%size/2))
1001 if (conf%target_states_block_size > 0)
then
1002 end = log2(conf%target_states_block_size)+1
1007 safe_allocate(op%ri_pos(1:op%stencil%size/2, 1:op%nri, 1:
end))
1008 safe_allocate(op%ri_neg(1:op%stencil%size/2, 1:op%nri, 1:
end))
1009 if (op%mesh%parallel_in_domains)
then
1010 safe_allocate(op%inner%ri_pos(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1011 safe_allocate(op%inner%ri_neg(1:op%stencil%size/2, 1:op%inner%nri, 1:
end))
1012 safe_allocate(op%outer%ri_pos(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1013 safe_allocate(op%outer%ri_neg(1:op%stencil%size/2, 1:op%outer%nri, 1:
end))
1016 op%max_allocated_ri_pair =
end
1018 do ldf = start-1,
end-1
1019 select case(op%symmetry)
1021 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%ri, op%nri, &
1022 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1), op%wcenter)
1023 if (op%mesh%parallel_in_domains)
then
1024 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1025 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1), op%wcenter)
1026 call group_by_pairs_sym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1027 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1), op%wcenter)
1031 op%npairs, op%wpair, op%ri_pos(:,:,ldf+1), op%ri_neg(:,:,ldf+1))
1032 if (op%mesh%parallel_in_domains)
then
1033 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%inner%ri, op%inner%nri, &
1034 op%npairs, op%wpair, op%inner%ri_pos(:,:,ldf+1), op%inner%ri_neg(:,:,ldf+1))
1035 call group_by_pairs_antisym(op%stencil%size, ldf, op%stencil%points, op%w(:,1), op%outer%ri, op%outer%nri, &
1036 op%npairs, op%wpair, op%outer%ri_pos(:,:,ldf+1), op%outer%ri_neg(:,:,ldf+1))
1041 if (.not.
present(max_size))
then
1042 write(message(1),
'(3a)')
'Debug info: Sorted weights for ', trim(op%label),
'.'
1043 call messages_info(1, debug_only=.
true.)
1045 do ipair = 1, op%npairs
1046 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)
1047 call messages_info(1, debug_only=.
true.)
1056 integer,
allocatable,
intent(inout) :: ri(:,:,:)
1057 integer,
intent(in) :: stencil_size, nri
1058 integer,
intent(in) :: old_size, new_size
1060 integer,
allocatable :: tmp(:,:,:)
1062 safe_allocate_source_a(tmp, ri)
1063 safe_deallocate_a(ri)
1064 safe_allocate(ri(1:stencil_size, 1:nri, 1:new_size))
1065 ri(:,:,1:old_size) = tmp
1066 safe_deallocate_a(tmp)
1071#include "nl_operator_inc.F90"
1074#include "complex.F90"
1075#include "nl_operator_inc.F90"
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 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), parameter, public type_integer
Describes mesh distribution to nodes.
index type for non-local operators
data type for non local operators