- boundary conditions for AMR are non-trivial; before and after
restrictions and prolongations we need to apply copying around all
blocks, even those on diagonals; only then we will assure the machine
precision of 90 and 180 degree rotation symmetry;
- all steps, copying, prolongation, and restriction, scan all blocks,
even those which do not need update; this can be probably improved by
introducing, for example, boundary update dependent on the refinement
level;
- the subroutine flux_rk2() updates one dimensional fluxes using the
2nd order Runge-Kutta method, and then calculates the averaged flux,
which is used to update the block variables;
- instead of calculating all fluxes at once in update_flux(), select
the direction as a subroutine argument and calculate only the flux
along this direction;
- directional fluxes are needed for the directional RK integration of
the numerical fluxes;
- update subroutines flux_euler(), flux_rk2(), and flux_rk3() to use
new update_flux() subroutine;
- now the satellite changes positions and velocity accordind to Keplers
laws; correct Keplerian orbit has been implemented in
shape_binaries();
- correct initialization of the satellite in init_binaries();
- now a more efficient boundary prolongation works correctly both for
the uni- and multiprocessor runs;
- the only difference now, however, since we are using a constant
interpolation for the prolongation, is that the criterion for the
refinement does not oscilate so much, but keeps the block at higher
level until the fields are completely smooth; thus, the possibility
of using linear interpolation should be reinvestigated;
- the implemented method removes the necessity of repeating the
prolongated boundary update twice;
- this subroutine takes the input array and expands it to match the
size of the boundary of the current block; the expansion is done with
the constant interpolation;
- this subroutine is required to reduce the amount of data transfered
between processors;
- the new version reduces the data transfer between processors by a big
factor when we restrict neighbors data in order to update the current
block boundary; this commit implements this optimization for the
blocks belonging to different processors;
- this subroutines restricts the data from neighbor in order to update
the current block boundary; this function does the same as
bnd_rest(), but passes only the subdomain which is used for
restriction;
- this subroutine does exactly the same as bnd_copy, i.e. copies domain
from a neighbor at the same level to the boundary of the current
block, but instead of passing the whola array U it passes only the
part of the domain which will update the boundary;
- separate the boundaries for different level differences between the
updated block and its neighbor in order to prepare this subroutine
for sending only minimum required subvolume of variables between
processors;
- this subroutine reads the number of processors and the maximum level
from the first restart file; these two parameters are required
before restoring the data for a job restart if we want to restart it
with a different number of processors or with a different maximum
level;
- a new module COORDS handles the mesh variables which needed to be
separated from the MESH module since they are used in PROBLEM module,
which is required by MESH module; this created a circular dependency;
by introducing a new COORDS module we removed that problem;
- now, if we want to restart a job and use more processors than we used
while creating restart files, all processors read and recreate meta
block structure, but only N previously used processors will read data
block; as soon as the job is restarted, we call redistribute_blocks()
in order to get equal number of data blocks on each processor;