171 subroutine af_stencil_allocate_coeff(stencil, nc, use_f, n_sparse)
172 type(
stencil_t),
intent(inout) :: stencil
174 integer,
intent(in) :: nc
177 logical,
intent(in),
optional :: use_f
179 integer,
intent(in),
optional :: n_sparse
180 logical :: allocate_f
183 allocate_f = .false.;
if (
present(use_f)) allocate_f = use_f
184 if (stencil%shape < 1 .or. stencil%shape > num_shapes) &
185 error stop
"Unknown stencil shape"
187 n_coeff = af_stencil_sizes(stencil%shape)
189 select case (stencil%stype)
190 case (stencil_constant)
191 if (.not.
allocated(stencil%c))
then
192 allocate(stencil%c(n_coeff))
193 else if (
size(stencil%c) /= n_coeff)
then
194 deallocate(stencil%c)
195 allocate(stencil%c(n_coeff))
199 if (
allocated(stencil%v))
deallocate(stencil%v)
200 if (
allocated(stencil%f))
deallocate(stencil%f, stencil%bc_correction)
201 if (
allocated(stencil%sparse_v)) &
202 deallocate(stencil%sparse_v, stencil%sparse_ix)
203 case (stencil_variable)
204 if (.not.
allocated(stencil%v))
then
205 allocate(stencil%v(n_coeff, dtimes(nc)))
206 else if (
size(stencil%v, 1) /= n_coeff)
then
207 deallocate(stencil%v)
208 allocate(stencil%v(n_coeff, dtimes(nc)))
211 if (allocate_f .and. .not.
allocated(stencil%f))
then
212 allocate(stencil%f(dtimes(nc)))
213 allocate(stencil%bc_correction(dtimes(nc)))
214 else if (.not. allocate_f .and.
allocated(stencil%f))
then
215 deallocate(stencil%f, stencil%bc_correction)
219 if (
allocated(stencil%c))
deallocate(stencil%c)
220 if (
allocated(stencil%sparse_v)) &
221 deallocate(stencil%sparse_v, stencil%sparse_ix)
222 case (stencil_sparse)
223 if (.not.
present(n_sparse)) error stop
"n_sparse required"
225 if (.not.
allocated(stencil%sparse_v))
then
226 allocate(stencil%sparse_ix(ndim, n_sparse))
227 allocate(stencil%sparse_v(n_coeff, n_sparse))
228 else if (any(
size(stencil%sparse_v) /= [n_coeff, n_sparse]))
then
229 deallocate(stencil%sparse_v)
230 deallocate(stencil%sparse_ix)
231 allocate(stencil%sparse_ix(ndim, n_sparse))
232 allocate(stencil%sparse_v(n_coeff, n_sparse))
236 if (
allocated(stencil%c))
deallocate(stencil%c)
237 if (
allocated(stencil%v))
deallocate(stencil%v)
238 if (
allocated(stencil%f))
deallocate(stencil%f, stencil%bc_correction)
240 error stop
"Unknow stencil%stype"
367 subroutine stencil_apply_357(box, stencil, iv, i_out)
368 type(box_t),
intent(inout) :: box
369 type(stencil_t),
intent(in) :: stencil
370 integer,
intent(in) :: iv
371 integer,
intent(in) :: i_out
372 real(dp) :: c(2*NDIM+1)
375 real(dp) :: rfac(2, box%n_cell), c_cyl(2*NDIM+1)
376 real(dp) :: cc_cyl(2*NDIM+1, box%n_cell)
379 if (iv == i_out) error stop
"Cannot have iv == i_out"
380 if (stencil%stype == stencil_sparse) error stop
"sparse not implemented"
382 associate(cc => box%cc, nc => box%n_cell)
385 if (stencil%stype == stencil_constant)
then
389 c(1) * cc(i, iv) + c(2) * cc(i-1, iv) + c(3) * cc(i+1, iv)
393 c = stencil%v(:, ijk)
395 c(1) * cc(i, iv) + c(2) * cc(i-1, iv) + c(3) * cc(i+1, iv)
399 if (stencil%cylindrical_gradient)
then
402 call af_cyl_flux_factors(box, rfac)
404 if (stencil%stype == stencil_constant)
then
409 cc_cyl(2:3, i) = rfac(1:2, i) * c(2:3)
410 cc_cyl(1, i) = c(1) - (cc_cyl(2, i) - c(2)) &
411 - (cc_cyl(3, i) - c(3))
412 cc_cyl(4:, i) = c(4:)
417 cc_cyl(1, i) * cc(i, j, iv) + &
418 cc_cyl(2, i) * cc(i-1, j, iv) + &
419 cc_cyl(3, i) * cc(i+1, j, iv) + &
420 cc_cyl(4, i) * cc(i, j-1, iv) + &
421 cc_cyl(5, i) * cc(i, j+1, iv)
426 c = stencil%v(:, ijk)
427 c_cyl(2:3) = rfac(1:2, i) * c(2:3)
428 c_cyl(1) = c(1) - (c_cyl(2) - c(2)) - (c_cyl(3) - c(3))
431 c_cyl(1) * cc(i, j, iv) + &
432 c_cyl(2) * cc(i-1, j, iv) + &
433 c_cyl(3) * cc(i+1, j, iv) + &
434 c_cyl(4) * cc(i, j-1, iv) + &
435 c_cyl(5) * cc(i, j+1, iv)
440 if (stencil%stype == stencil_constant)
then
444 c(1) * cc(i, j, iv) + &
445 c(2) * cc(i-1, j, iv) + &
446 c(3) * cc(i+1, j, iv) + &
447 c(4) * cc(i, j-1, iv) + &
448 c(5) * cc(i, j+1, iv)
452 c = stencil%v(:, ijk)
454 c(1) * cc(i, j, iv) + &
455 c(2) * cc(i-1, j, iv) + &
456 c(3) * cc(i+1, j, iv) + &
457 c(4) * cc(i, j-1, iv) + &
458 c(5) * cc(i, j+1, iv)
463 if (stencil%stype == stencil_constant)
then
466 cc(i, j, k, i_out) = &
467 c(1) * cc(i, j, k, iv) + &
468 c(2) * cc(i-1, j, k, iv) + &
469 c(3) * cc(i+1, j, k, iv) + &
470 c(4) * cc(i, j-1, k, iv) + &
471 c(5) * cc(i, j+1, k, iv) + &
472 c(6) * cc(i, j, k-1, iv) + &
473 c(7) * cc(i, j, k+1, iv)
477 c = stencil%v(:, ijk)
478 cc(i, j, k, i_out) = &
479 c(1) * cc(i, j, k, iv) + &
480 c(2) * cc(i-1, j, k, iv) + &
481 c(3) * cc(i+1, j, k, iv) + &
482 c(4) * cc(i, j-1, k, iv) + &
483 c(5) * cc(i, j+1, k, iv) + &
484 c(6) * cc(i, j, k-1, iv) + &
485 c(7) * cc(i, j, k+1, iv)
490 if (
allocated(stencil%bc_correction))
then
491 cc(dtimes(1:nc), i_out) = cc(dtimes(1:nc), i_out) - &
492 stencil%bc_correction
582 subroutine stencil_prolong_234(box_p, box_c, stencil, iv, iv_to, add)
583 type(box_t),
intent(in) :: box_p
584 type(box_t),
intent(inout) :: box_c
585 type(stencil_t),
intent(in) :: stencil
586 integer,
intent(in) :: iv
587 integer,
intent(in) :: iv_to
588 logical,
intent(in) :: add
590 integer :: nc, ix_offset(NDIM), IJK
591 integer :: IJK_(c1), IJK_(c2)
592 real(dp) :: c(NDIM+1)
595 ix_offset = af_get_child_offset(box_c)
596 if (stencil%stype == stencil_sparse) error stop
"sparse not implemented"
597 if (.not. add) box_c%cc(dtimes(1:nc), iv_to) = 0
602 if (stencil%stype == stencil_constant)
then
605 i_c1 = ix_offset(1) + ishft(i+1, -1)
606 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
607 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
608 c(1) * box_p%cc(i_c1, iv) + &
609 c(2) * box_p%cc(i_c2, iv)
613 c = stencil%v(:, ijk)
614 i_c1 = ix_offset(1) + ishft(i+1, -1)
615 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
616 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
617 c(1) * box_p%cc(i_c1, iv) + &
618 c(2) * box_p%cc(i_c2, iv)
622 if (stencil%stype == stencil_constant)
then
625 j_c1 = ix_offset(2) + ishft(j+1, -1)
626 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
628 i_c1 = ix_offset(1) + ishft(i+1, -1)
629 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
630 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
631 c(1) * box_p%cc(i_c1, j_c1, iv) + &
632 c(2) * box_p%cc(i_c2, j_c1, iv) + &
633 c(3) * box_p%cc(i_c1, j_c2, iv)
638 j_c1 = ix_offset(2) + ishft(j+1, -1)
639 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
641 i_c1 = ix_offset(1) + ishft(i+1, -1)
642 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
643 c = stencil%v(:, ijk)
644 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
645 c(1) * box_p%cc(i_c1, j_c1, iv) + &
646 c(2) * box_p%cc(i_c2, j_c1, iv) + &
647 c(3) * box_p%cc(i_c1, j_c2, iv)
652 if (stencil%stype == stencil_constant)
then
655 k_c1 = ix_offset(3) + ishft(k+1, -1)
656 k_c2 = k_c1 + 1 - 2 * iand(k, 1)
658 j_c1 = ix_offset(2) + ishft(j+1, -1)
659 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
661 i_c1 = ix_offset(1) + ishft(i+1, -1)
662 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
663 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
664 c(1) * box_p%cc(i_c1, j_c1, k_c1, iv) + &
665 c(2) * box_p%cc(i_c2, j_c1, k_c1, iv) + &
666 c(3) * box_p%cc(i_c1, j_c2, k_c1, iv) + &
667 c(4) * box_p%cc(i_c1, j_c1, k_c2, iv)
673 k_c1 = ix_offset(3) + ishft(k+1, -1)
674 k_c2 = k_c1 + 1 - 2 * iand(k, 1)
676 j_c1 = ix_offset(2) + ishft(j+1, -1)
677 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
679 i_c1 = ix_offset(1) + ishft(i+1, -1)
680 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
681 c = stencil%v(:, ijk)
682 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
683 c(1) * box_p%cc(i_c1, j_c1, k_c1, iv) + &
684 c(2) * box_p%cc(i_c2, j_c1, k_c1, iv) + &
685 c(3) * box_p%cc(i_c1, j_c2, k_c1, iv) + &
686 c(4) * box_p%cc(i_c1, j_c1, k_c2, iv)
695 subroutine stencil_prolong_248(box_p, box_c, stencil, iv, iv_to, add)
696 type(box_t),
intent(in) :: box_p
697 type(box_t),
intent(inout) :: box_c
698 type(stencil_t),
intent(in) :: stencil
699 integer,
intent(in) :: iv
700 integer,
intent(in) :: iv_to
701 logical,
intent(in) :: add
703 integer :: nc, ix_offset(NDIM), IJK
704 integer :: IJK_(c1), IJK_(c2)
705 real(dp) :: c(2**NDIM)
708 ix_offset = af_get_child_offset(box_c)
709 if (stencil%stype == stencil_sparse) error stop
"sparse not implemented"
710 if (.not. add) box_c%cc(dtimes(1:nc), iv_to) = 0
715 if (stencil%stype == stencil_constant)
then
718 i_c1 = ix_offset(1) + ishft(i+1, -1)
719 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
720 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
721 c(1) * box_p%cc(i_c1, iv) + &
722 c(2) * box_p%cc(i_c2, iv)
726 c = stencil%v(:, ijk)
727 i_c1 = ix_offset(1) + ishft(i+1, -1)
728 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
729 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
730 c(1) * box_p%cc(i_c1, iv) + &
731 c(2) * box_p%cc(i_c2, iv)
735 if (stencil%stype == stencil_constant)
then
738 j_c1 = ix_offset(2) + ishft(j+1, -1)
739 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
741 i_c1 = ix_offset(1) + ishft(i+1, -1)
742 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
743 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
744 c(1) * box_p%cc(i_c1, j_c1, iv) + &
745 c(2) * box_p%cc(i_c2, j_c1, iv) + &
746 c(3) * box_p%cc(i_c1, j_c2, iv) + &
747 c(4) * box_p%cc(i_c2, j_c2, iv)
752 j_c1 = ix_offset(2) + ishft(j+1, -1)
753 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
755 i_c1 = ix_offset(1) + ishft(i+1, -1)
756 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
757 c = stencil%v(:, ijk)
758 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
759 c(1) * box_p%cc(i_c1, j_c1, iv) + &
760 c(2) * box_p%cc(i_c2, j_c1, iv) + &
761 c(3) * box_p%cc(i_c1, j_c2, iv) + &
762 c(4) * box_p%cc(i_c2, j_c2, iv)
767 if (stencil%stype == stencil_constant)
then
770 k_c1 = ix_offset(3) + ishft(k+1, -1)
771 k_c2 = k_c1 + 1 - 2 * iand(k, 1)
773 j_c1 = ix_offset(2) + ishft(j+1, -1)
774 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
776 i_c1 = ix_offset(1) + ishft(i+1, -1)
777 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
778 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
779 c(1) * box_p%cc(i_c1, j_c1, k_c1, iv) + &
780 c(2) * box_p%cc(i_c2, j_c1, k_c1, iv) + &
781 c(3) * box_p%cc(i_c1, j_c2, k_c1, iv) + &
782 c(4) * box_p%cc(i_c2, j_c2, k_c1, iv) + &
783 c(5) * box_p%cc(i_c1, j_c1, k_c2, iv) + &
784 c(6) * box_p%cc(i_c2, j_c1, k_c2, iv) + &
785 c(7) * box_p%cc(i_c1, j_c2, k_c2, iv) + &
786 c(8) * box_p%cc(i_c2, j_c2, k_c2, iv)
792 k_c1 = ix_offset(3) + ishft(k+1, -1)
793 k_c2 = k_c1 + 1 - 2 * iand(k, 1)
795 j_c1 = ix_offset(2) + ishft(j+1, -1)
796 j_c2 = j_c1 + 1 - 2 * iand(j, 1)
798 i_c1 = ix_offset(1) + ishft(i+1, -1)
799 i_c2 = i_c1 + 1 - 2 * iand(i, 1)
800 c = stencil%v(:, ijk)
801 box_c%cc(ijk, iv_to) = box_c%cc(ijk, iv_to) + &
802 c(1) * box_p%cc(i_c1, j_c1, k_c1, iv) + &
803 c(2) * box_p%cc(i_c2, j_c1, k_c1, iv) + &
804 c(3) * box_p%cc(i_c1, j_c2, k_c1, iv) + &
805 c(4) * box_p%cc(i_c2, j_c2, k_c1, iv) + &
806 c(5) * box_p%cc(i_c1, j_c1, k_c2, iv) + &
807 c(6) * box_p%cc(i_c2, j_c1, k_c2, iv) + &
808 c(7) * box_p%cc(i_c1, j_c2, k_c2, iv) + &
809 c(8) * box_p%cc(i_c2, j_c2, k_c2, iv)
838 subroutine stencil_gsrb_357(box, stencil, redblack, iv, i_rhs)
839 type(box_t),
intent(inout) :: box
840 type(stencil_t),
intent(in) :: stencil
841 integer,
intent(in) :: redblack
842 integer,
intent(in) :: iv
843 integer,
intent(in) :: i_rhs
845 real(dp) :: c(2*NDIM+1), inv_c1
846 integer :: IJK, i0, nc
848 real(dp) :: rfac(2, box%n_cell), c_cyl(2*NDIM+1)
849 real(dp) :: cc_cyl(2*NDIM+1, box%n_cell), inv_cc1(box%n_cell)
852 if (stencil%stype == stencil_sparse) error stop
"sparse not implemented"
855 associate(cc => box%cc, nc => box%n_cell)
856 if (
allocated(stencil%bc_correction))
then
857 cc(dtimes(1:nc), i_rhs) = cc(dtimes(1:nc), i_rhs) + &
858 stencil%bc_correction
862 i0 = 2 - iand(redblack, 1)
863 if (stencil%stype == stencil_constant)
then
868 cc(ijk, iv) = (cc(ijk, i_rhs) &
869 - c(2) * cc(i-1, iv) &
870 - c(3) * cc(i+1, iv)) * inv_c1
874 c = stencil%v(:, ijk)
875 cc(ijk, iv) = (cc(ijk, i_rhs) &
876 - c(2) * cc(i-1, iv) &
877 - c(3) * cc(i+1, iv)) / c(1)
881 if (stencil%cylindrical_gradient)
then
884 call af_cyl_flux_factors(box, rfac)
886 if (stencil%stype == stencil_constant)
then
891 cc_cyl(2:3, i) = rfac(1:2, i) * c(2:3)
892 cc_cyl(1, i) = c(1) - (cc_cyl(2, i) - c(2)) &
893 - (cc_cyl(3, i) - c(3))
894 cc_cyl(4:, i) = c(4:)
895 inv_cc1(i) = 1 / cc_cyl(1, i)
899 i0 = 2 - iand(ieor(redblack, j), 1)
901 cc(ijk, iv) = (cc(ijk, i_rhs) &
902 - cc_cyl(2, i) * cc(i-1, j, iv) &
903 - cc_cyl(3, i) * cc(i+1, j, iv) &
904 - cc_cyl(4, i) * cc(i, j-1, iv) &
905 - cc_cyl(5, i) * cc(i, j+1, iv)) * inv_cc1(i)
911 i0 = 2 - iand(ieor(redblack, j), 1)
913 c = stencil%v(:, ijk)
914 c_cyl(2:3) = rfac(1:2, i) * c(2:3)
915 c_cyl(1) = c(1) - (c_cyl(2) - c(2)) - (c_cyl(3) - c(3))
918 cc(ijk, iv) = (cc(ijk, i_rhs) &
919 - c_cyl(2) * cc(i-1, j, iv) &
920 - c_cyl(3) * cc(i+1, j, iv) &
921 - c_cyl(4) * cc(i, j-1, iv) &
922 - c_cyl(5) * cc(i, j+1, iv)) / c_cyl(1)
927 if (stencil%stype == stencil_constant)
then
932 i0 = 2 - iand(ieor(redblack, j), 1)
934 cc(ijk, iv) = (cc(ijk, i_rhs) &
935 - c(2) * cc(i-1, j, iv) &
936 - c(3) * cc(i+1, j, iv) &
937 - c(4) * cc(i, j-1, iv) &
938 - c(5) * cc(i, j+1, iv)) * inv_c1
943 i0 = 2 - iand(ieor(redblack, j), 1)
945 c = stencil%v(:, ijk)
946 cc(ijk, iv) = (cc(ijk, i_rhs) &
947 - c(2) * cc(i-1, j, iv) &
948 - c(3) * cc(i+1, j, iv) &
949 - c(4) * cc(i, j-1, iv) &
950 - c(5) * cc(i, j+1, iv)) / c(1)
956 if (stencil%stype == stencil_constant)
then
962 i0 = 2 - iand(ieor(redblack, k+j), 1)
964 cc(ijk, iv) = (cc(ijk, i_rhs) &
965 - c(2) * cc(i-1, j, k, iv) &
966 - c(3) * cc(i+1, j, k, iv) &
967 - c(4) * cc(i, j-1, k, iv) &
968 - c(5) * cc(i, j+1, k, iv) &
969 - c(6) * cc(i, j, k-1, iv) &
970 - c(7) * cc(i, j, k+1, iv)) * inv_c1
977 i0 = 2 - iand(ieor(redblack, k+j), 1)
979 c = stencil%v(:, ijk)
980 cc(ijk, iv) = (cc(ijk, i_rhs) &
981 - c(2) * cc(i-1, j, k, iv) &
982 - c(3) * cc(i+1, j, k, iv) &
983 - c(4) * cc(i, j-1, k, iv) &
984 - c(5) * cc(i, j+1, k, iv) &
985 - c(6) * cc(i, j, k-1, iv) &
986 - c(7) * cc(i, j, k+1, iv)) / c(1)
993 if (
allocated(stencil%bc_correction))
then
994 cc(dtimes(1:nc), i_rhs) = cc(dtimes(1:nc), i_rhs) - &
995 stencil%bc_correction