6 program random_refinement_3d
12 integer :: id, iter, boxes_used
13 integer,
parameter :: n_boxes_base = 2
14 integer :: ix_list(3, n_boxes_base)
15 integer :: nb_list(a3_num_neighbors, n_boxes_base)
16 integer,
parameter :: box_size = 8
17 integer,
parameter :: i_phi = 1
18 type(ref_info_t) :: ref_info
19 real(dp) :: dr, sum_phi_t0, sum_phi
20 character(len=40) :: fname
21 integer :: count_rate,t_start,t_end
23 write(*,
'(A)')
'program random_refinement_3d' 25 print *,
"Number of threads", af_get_max_threads()
28 dr = 2 * acos(-1.0_dp) / box_size
38 call a3_set_cc_methods(tree, 1, a3_bc_dirichlet_zero, &
39 prolong=a3_prolong_linear_cons)
43 nb_list(:, :) = af_no_box
46 do id = 1, n_boxes_base
47 ix_list(:, id) = [id, 1, 1]
48 nb_list(a3_neighb_highz, id) = id
49 nb_list(a3_neighb_highy, id) = id
54 nb_list(a3_neighb_lowx, 1) = n_boxes_base
57 call a3_set_base(tree, n_boxes_base, ix_list, nb_list)
58 call a3_print_info(tree)
63 call a3_loop_box(tree, set_init_cond)
68 call a3_gc_tree(tree, i_phi, a3_gc_interp, a3_bc_dirichlet_zero)
70 call a3_tree_sum_cc(tree, i_phi, sum_phi_t0)
72 call system_clock(t_start, count_rate)
78 write(fname,
"(A,I0)")
"random_refinement_3d_", iter
79 call a3_write_silo(tree, trim(fname), dir=
"output", n_cycle=iter)
90 call a3_adjust_refinement(tree, ref_routine, ref_info, ref_buffer=0)
92 call a3_tree_sum_cc(tree, i_phi, sum_phi)
93 write(*,
"(A,E10.2)")
" conservation error: ", sum_phi - sum_phi_t0
94 boxes_used = boxes_used + ref_info%n_add - ref_info%n_rm
95 write(*,
'(4(3x,A,1x,i6))')
"# new boxes", ref_info%n_add, &
96 "# removed boxes", ref_info%n_rm, &
97 "# boxes used ", boxes_used, &
98 " highest level ", tree%highest_lvl
100 call system_clock(t_end, count_rate)
102 write(*,
'(A,i3,1x,A,f8.2,1x,A,/)') &
103 ' Wall-clock time after ',iter, &
104 ' iterations: ', (t_end-t_start) /
real(count_rate, dp), &
107 call a3_print_info(tree)
111 call a3_destroy(tree)
116 subroutine ref_routine(box, cell_flags)
117 type(box3_t),
intent(in) :: box
118 integer,
intent(out) :: cell_flags(box%n_cell, box%n_cell, box%n_cell)
122 call random_number(rr)
124 if (rr < 0.5_dp**3 .and. box%lvl < 5)
then 125 cell_flags = af_do_ref
127 cell_flags = af_rm_ref
130 end subroutine ref_routine
133 subroutine set_init_cond(box)
134 type(box3_t),
intent(inout) :: box
135 integer :: i, j, k, nc
139 do k = 1, nc;
do j = 1, nc;
do i = 1, nc
141 rr = a3_r_cc(box, [i, j, k])
144 box%cc(i, j, k, i_phi) = sin(0.5_dp * rr(1)) * cos(rr(2))
145 end do; end do; end do
146 end subroutine set_init_cond
148 end program random_refinement_3d
Module which contains all Afivo modules, so that a user does not have to include them separately...