80 integer,
allocatable :: imin(:)
81 integer,
allocatable :: imax(:)
82 integer,
allocatable :: ri(:, :)
83 integer,
allocatable :: ri_pos(:,:,:)
84 integer,
allocatable :: ri_neg(:,:,:)
87 integer,
public,
parameter :: &
95 type(stencil_t),
public :: stencil
96 type(mesh_t),
pointer :: mesh => null()
97 integer,
allocatable :: nn(:)
98 integer,
public :: np = 0
100 real(real64),
allocatable,
public :: w(:,:)
102 logical,
public :: const_w = .
true.
104 type(accel_mem_t),
public :: buff_weights
105 type(accel_mem_t),
public :: buff_half_weights
107 integer :: symmetry = op_general
109 character(len=40) :: label
112 integer,
public :: nri = 0
113 integer,
allocatable,
public :: ri(:,:)
114 integer,
allocatable,
public :: rimap(:)
115 integer,
allocatable,
public :: rimap_inv(:)
118 integer :: npairs = 0
119 real(real64),
allocatable :: wpair(:)
120 real(real64) :: wcenter
121 integer,
allocatable :: ri_pos(:,:,:)
122 integer,
allocatable :: ri_neg(:,:,:)
123 integer :: max_allocated_ri_pair = 0
125 integer :: ninner = 0
126 integer :: nouter = 0
128 type(nl_operator_index_t) :: inner
129 type(nl_operator_index_t) :: outer
131 type(accel_kernel_t) :: kernel
132 type(accel_mem_t) :: buff_imin
133 type(accel_mem_t) :: buff_imax
134 type(accel_mem_t) :: buff_ri
135 type(accel_mem_t) :: buff_map
136 type(accel_mem_t) :: buff_all
137 type(accel_mem_t) :: buff_inner
138 type(accel_mem_t) :: buff_outer
139 type(accel_mem_t) :: buff_stencil
140 type(accel_mem_t) :: buff_ip_to_xyz
141 type(accel_mem_t) :: buff_xyz_to_ip
144 type(nl_operator_t),
public,
pointer :: coarser => null()
148 integer,
parameter :: &
154 integer,
parameter :: &
164 integer,
intent(in) :: opid, type
168 integer :: dfunction_global = -1
169 integer :: zfunction_global = -1
170 integer :: function_accel
171 logical :: use_symmetries = .false.
268 character(len=*),
intent(in) :: label
269 integer,
optional,
intent(in) :: symm
274 op%symmetry = op_general
275 if (use_symmetries)
then
300 opo%symmetry = opi%symmetry
302 safe_allocate_source_a(opo%nn, opi%nn)
303 safe_allocate_source_a(opo%w, opi%w)
305 opo%const_w = opi%const_w
308 assert(
allocated(opi%ri))
310 safe_allocate_source_a(opo%ri, opi%ri)
311 safe_allocate_source_a(opo%rimap, opi%rimap)
312 safe_allocate_source_a(opo%rimap_inv, opi%rimap_inv)
314 opo%npairs = opi%npairs
315 if (opi%symmetry /= op_general)
then
316 opo%wcenter = opi%wcenter
317 safe_allocate_source_a(opo%wpair, opi%wpair)
318 safe_allocate_source_a(opo%ri_pos, opi%ri_pos)
319 safe_allocate_source_a(opo%ri_neg, opi%ri_neg)
322 if (opi%mesh%parallel_in_domains)
then
323 opo%inner%nri = opi%inner%nri
324 safe_allocate_source_a(opo%inner%imin, opi%inner%imin)
325 safe_allocate_source_a(opo%inner%imax, opi%inner%imax)
326 safe_allocate_source_a(opo%inner%ri, opi%inner%ri)
328 opo%outer%nri = opi%outer%nri
329 safe_allocate_source_a(opo%outer%imin, opi%outer%imin)
330 safe_allocate_source_a(opo%outer%imax, opi%outer%imax)
331 safe_allocate_source_a(opo%outer%ri, opi%outer%ri)
333 if (opi%symmetry /= op_general)
then
334 safe_allocate_source_a(opo%inner%ri_pos, opi%inner%ri_pos)
335 safe_allocate_source_a(opo%inner%ri_neg, opi%inner%ri_neg)
336 safe_allocate_source_a(opo%outer%ri_pos, opi%outer%ri_pos)
337 safe_allocate_source_a(opo%outer%ri_neg, opi%outer%ri_neg)
365 class(
space_t),
intent(in) :: space
366 type(
mesh_t),
target,
intent(in) :: mesh
368 integer,
intent(in) :: np
369 logical,
optional,
intent(in) :: const_w
370 logical,
optional,
intent(in) :: regenerate
372 integer :: ii, jj, p1(space%dim), time, current
373 integer,
allocatable :: st1(:), st2(:), st1r(:)
374 integer :: ir, maxp, iinner, iouter
375 logical :: change, force_change
376 character(len=200) :: flags
377 integer,
allocatable :: inner_points(:), outer_points(:), all_points(:)
381 if (mesh%parallel_in_domains .and. .not. const_w)
then
396 safe_allocate(op%w(1:op%stencil%size, 1))
397 message(1) =
'Debug: nl_operator_build: working with constant weights.'
400 safe_allocate(op%w(1:op%stencil%size, 1:op%np))
401 message(1) =
'Debug: nl_operator_build: working with non-constant weights.'
409 safe_allocate(st1(1:op%stencil%size))
410 safe_allocate(st1r(1:op%stencil%size))
411 safe_allocate(st2(1:op%stencil%size))
420 do jj = 1, op%stencil%size
427 st1(1:op%stencil%size) = st1(1:op%stencil%size) - ii
429 change = any(st1 /= st2)
433 force_change = any(st1 + ii > mesh%np) .and. all(st2 + ii - 1 <= mesh%np)
436 if (change .or. force_change)
then
441 if (time == 1) op%nri = op%nri + 1
445 current = current + 1
446 op%ri(1:op%stencil%size, current) = st1(1:op%stencil%size)
450 if (time == 2) op%rimap(ii) = current
456 safe_deallocate_a(op%ri)
457 safe_deallocate_a(op%rimap)
458 safe_deallocate_a(op%rimap_inv)
460 safe_allocate(op%ri(1:op%stencil%size, 1:op%nri))
461 safe_allocate(op%rimap(1:op%np))
462 safe_allocate(op%rimap_inv(1:op%nri + 1))
469 if (mesh%use_curvilinear)
then
470 safe_allocate(op%nn(1:op%nri))
472 op%nn = op%stencil%size
481 op%rimap_inv(op%rimap(jj) + 1) = jj
483 op%rimap_inv(op%nri + 1) = op%np
485 safe_deallocate_a(st1)
486 safe_deallocate_a(st1r)
487 safe_deallocate_a(st2)
489 if (op%mesh%parallel_in_domains)
then
496 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
499 op%inner%nri = op%inner%nri + 1
500 assert(op%inner%nri <= op%nri)
503 op%outer%nri = op%outer%nri + 1
504 assert(op%outer%nri <= op%nri)
508 assert(op%inner%nri + op%outer%nri == op%nri)
511 safe_deallocate_a(op%inner%imin)
512 safe_deallocate_a(op%inner%imax)
513 safe_deallocate_a(op%inner%ri)
514 safe_deallocate_a(op%outer%imin)
515 safe_deallocate_a(op%outer%imax)
516 safe_deallocate_a(op%outer%ri)
518 safe_allocate(op%inner%imin(1:op%inner%nri + 1))
519 safe_allocate(op%inner%imax(1:op%inner%nri))
520 safe_allocate(op%inner%ri(1:op%stencil%size, 1:op%inner%nri))
522 safe_allocate(op%outer%imin(1:op%outer%nri + 1))
523 safe_allocate(op%outer%imax(1:op%outer%nri))
524 safe_allocate(op%outer%ri(1:op%stencil%size, 1:op%outer%nri))
530 maxp = op%rimap_inv(ir + 1) + maxval(op%ri(1:op%stencil%size, ir))
534 op%inner%imin(iinner) = op%rimap_inv(ir)
535 op%inner%imax(iinner) = op%rimap_inv(ir + 1)
536 op%inner%ri(1:op%stencil%size, iinner) = op%ri(1:op%stencil%size, ir)
540 op%outer%imin(iouter) = op%rimap_inv(ir)
541 op%outer%imax(iouter) = op%rimap_inv(ir + 1)
542 op%outer%ri(1:op%stencil%size, iouter) = op%ri(1:op%stencil%size, ir)
547 do ir = 1, op%inner%nri
548 do ii = op%inner%imin(ir) + 1, op%inner%imax(ir)
549 assert(all(ii + op%inner%ri(1:op%stencil%size, ir) <= mesh%np))
557 write(flags,
'(i5)') op%stencil%size
558 flags=
'-DNDIM=3 -DSTENCIL_SIZE='//trim(adjustl(flags))
560 if (op%mesh%parallel_in_domains) flags =
'-DINDIRECT '//trim(flags)
562 select case (function_accel)
573 select case (function_accel)
585 if (op%mesh%parallel_in_domains)
then
587 safe_allocate(inner_points(1:op%mesh%np))
588 safe_allocate(outer_points(1:op%mesh%np))
589 safe_allocate(all_points(1:op%mesh%np))
594 do ii = 1, op%mesh%np
595 all_points(ii) = ii - 1
596 maxp = ii + maxval(op%ri(1:op%stencil%size, op%rimap(ii)))
597 if (maxp <= op%mesh%np)
then
598 op%ninner = op%ninner + 1
599 inner_points(op%ninner) = ii - 1
601 op%nouter = op%nouter + 1
602 outer_points(op%nouter) = ii - 1
615 safe_deallocate_a(inner_points)
616 safe_deallocate_a(outer_points)
617 safe_deallocate_a(all_points)
631 integer :: istencil, idir
635 write(
message(1),
'(3a)')
'Debug info: Finite difference weights for ', trim(this%label),
'.'
636 write(
message(2),
'(a)')
' Spacing:'
637 do idir = 1, this%mesh%box%dim
638 write(
message(2),
'(a,f16.8)') trim(
message(2)), this%mesh%spacing(idir)
642 do istencil = 1, this%stencil%size
643 select case(this%mesh%box%dim)
645 write(
message(1),
'(a,i3,1i4,f25.10)')
' ', istencil, this%stencil%points(1:1, istencil), this%w(istencil, 1)
647 write(
message(1),
'(a,i3,2i4,f25.10)')
' ', istencil, this%stencil%points(1:2, istencil), this%w(istencil, 1)
649 write(
message(1),
'(a,i3,3i4,f25.10)')
' ', istencil, this%stencil%points(1:3, istencil), this%w(istencil, 1)
668 safe_deallocate_a(op%inner%imin)
669 safe_deallocate_a(op%inner%imax)
670 safe_deallocate_a(op%inner%ri)
671 safe_deallocate_a(op%outer%imin)
672 safe_deallocate_a(op%outer%imax)
673 safe_deallocate_a(op%outer%ri)
675 safe_deallocate_a(op%w)
677 safe_deallocate_a(op%ri)
678 safe_deallocate_a(op%rimap)
679 safe_deallocate_a(op%rimap_inv)
680 safe_deallocate_a(op%nn)
682 safe_deallocate_a(op%wpair)
683 safe_deallocate_a(op%ri_pos)
684 safe_deallocate_a(op%ri_neg)
686 safe_deallocate_a(op%inner%ri_pos)
687 safe_deallocate_a(op%inner%ri_neg)
688 safe_deallocate_a(op%outer%ri_pos)
689 safe_deallocate_a(op%outer%ri_neg)
702 select case (function_accel)
709 if (op%mesh%parallel_in_domains)
then
731 integer,
intent(in) :: is
732 integer,
intent(in) :: ip
734 res = ip + op%ri(is, op%rimap(ip))
745 if (accel_is_enabled() .and. op%const_w)
then
746 call accel_create_buffer(op%buff_weights, accel_mem_read_only, type_float, op%stencil%size)
747 call accel_create_buffer(op%buff_half_weights, accel_mem_read_only, type_float, op%stencil%size)
762 if (accel_is_enabled() .and. op%const_w)
then
763 call accel_write_buffer(op%buff_weights, op%stencil%size, op%w(:, 1))
764 call accel_write_buffer(op%buff_half_weights, op%stencil%size, -m_half*op%w(:, 1))
779 ii = op%rimap_inv(jj + 1) + maxval(op%ri(1:op%stencil%size, jj))
780 np_bc = max(np_bc, ii)
790 type(space_t),
intent(in) :: space
791 class(mesh_t),
intent(in) :: mesh
794 real(real64),
parameter :: tol = 1.0e-14_real64
795 real(real64) :: max_weight, new_w(op%stencil%size)
796 integer :: new_points(space%dim, op%stencil%size)
798 if (.not. op%const_w)
return
802 max_weight = maxval(abs(op%w(:, 1)))
804 do ip = 1, op%stencil%size
805 if (abs(op%w(ip, 1)) > tol * max_weight)
then
807 new_w(size) = op%w(ip, 1)
808 new_points(:,size) = op%stencil%points(:, ip)
813 op%stencil%size =
size
814 safe_deallocate_a(op%stencil%points)
815 safe_allocate(op%stencil%points(space%dim, op%stencil%size))
816 op%stencil%points(:, :) = new_points(:, 1:size)
817 safe_deallocate_a(op%w)
820 op%w(1:
size, 1) = new_w(1:size)
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)
subroutine, public accel_release_buffer(this, async)
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
integer pure function, public accel_max_workgroup_size()
This module implements batches of mesh functions.
Module implementing boundary conditions in Octopus.
real(real64), parameter, public m_zero
real(real64), parameter, public m_half
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_copy(opo, opi)
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, 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.
subroutine, public stencil_end(this)
subroutine, public stencil_copy(input, output)
type(type_t), public type_float
type(type_t), public type_integer
Describes mesh distribution to nodes.
index type for non-local operators
data type for non local operators