Stabilize and wire BSSN-EScalar C path
This commit is contained in:
@@ -1,14 +1,50 @@
|
||||
|
||||
#include "Parallel.h"
|
||||
#include "fmisc.h"
|
||||
#include "prolongrestrict.h"
|
||||
#include "misc.h"
|
||||
#include "parameters.h"
|
||||
|
||||
int Parallel::partition1(int &nx, int split_size, int min_width, int cpusize, int shape) // special for 1 diemnsion
|
||||
{
|
||||
nx = Mymax(1, shape / min_width);
|
||||
nx = Mymin(cpusize, nx);
|
||||
#include "Parallel.h"
|
||||
#include "fmisc.h"
|
||||
#include "prolongrestrict.h"
|
||||
#include "misc.h"
|
||||
#include "parameters.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
enum { MAX_DATA_PACKER_VARS = 64 };
|
||||
|
||||
int expand_var_list_pack_info(MyList<var> *src_list, MyList<var> *dst_list,
|
||||
int *src_sgfn, int *dst_sgfn, double **src_soa)
|
||||
{
|
||||
int count = 0;
|
||||
MyList<var> *src_it = src_list;
|
||||
MyList<var> *dst_it = dst_list;
|
||||
|
||||
while (src_it && dst_it)
|
||||
{
|
||||
if (count >= MAX_DATA_PACKER_VARS)
|
||||
{
|
||||
cout << "Parallel::data_packer: too many variables in communication list." << endl;
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
src_sgfn[count] = src_it->data->sgfn;
|
||||
dst_sgfn[count] = dst_it->data->sgfn;
|
||||
src_soa[count] = src_it->data->SoA;
|
||||
count++;
|
||||
src_it = src_it->next;
|
||||
dst_it = dst_it->next;
|
||||
}
|
||||
|
||||
if (src_it || dst_it)
|
||||
{
|
||||
cout << "error in short data packer, var lists does not match." << endl;
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
int Parallel::partition1(int &nx, int split_size, int min_width, int cpusize, int shape) // special for 1 diemnsion
|
||||
{
|
||||
nx = Mymax(1, shape / min_width);
|
||||
nx = Mymin(cpusize, nx);
|
||||
|
||||
return nx;
|
||||
}
|
||||
@@ -3711,11 +3747,11 @@ void Parallel::build_gstl(MyList<Parallel::gridseg> *srci, MyList<Parallel::grid
|
||||
}
|
||||
// PACK: prepare target data in 'data'
|
||||
// UNPACK: copy target data from 'data' to corresponding numerical grids
|
||||
int Parallel::data_packer(double *data, MyList<Parallel::gridseg> *src, MyList<Parallel::gridseg> *dst, int rank_in, int dir,
|
||||
MyList<var> *VarLists /* source */, MyList<var> *VarListd /* target */, int Symmetry)
|
||||
{
|
||||
int myrank;
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||
int Parallel::data_packer(double *data, MyList<Parallel::gridseg> *src, MyList<Parallel::gridseg> *dst, int rank_in, int dir,
|
||||
MyList<var> *VarLists /* source */, MyList<var> *VarListd /* target */, int Symmetry)
|
||||
{
|
||||
int myrank;
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||
|
||||
int DIM = dim;
|
||||
|
||||
@@ -3725,86 +3761,89 @@ int Parallel::data_packer(double *data, MyList<Parallel::gridseg> *src, MyList<P
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
int size_out = 0;
|
||||
|
||||
if (!src || !dst)
|
||||
return size_out;
|
||||
|
||||
MyList<var> *varls, *varld;
|
||||
|
||||
varls = VarLists;
|
||||
varld = VarListd;
|
||||
while (varls && varld)
|
||||
{
|
||||
varls = varls->next;
|
||||
varld = varld->next;
|
||||
}
|
||||
|
||||
if (varls || varld)
|
||||
{
|
||||
cout << "error in short data packer, var lists does not match." << endl;
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
int type; /* 1 copy, 2 restrict, 3 prolong */
|
||||
if (src->data->Bg->lev == dst->data->Bg->lev)
|
||||
type = 1;
|
||||
else if (src->data->Bg->lev > dst->data->Bg->lev)
|
||||
type = 2;
|
||||
else
|
||||
type = 3;
|
||||
|
||||
while (src && dst)
|
||||
{
|
||||
if ((dir == PACK && dst->data->Bg->rank == rank_in && src->data->Bg->rank == myrank) ||
|
||||
(dir == UNPACK && src->data->Bg->rank == rank_in && dst->data->Bg->rank == myrank))
|
||||
{
|
||||
varls = VarLists;
|
||||
varld = VarListd;
|
||||
while (varls && varld)
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
if (dir == PACK)
|
||||
switch (type)
|
||||
{
|
||||
// attention must be paied to the difference between src's llb,uub and dst's llb,uub
|
||||
case 1:
|
||||
f_copy(DIM, dst->data->llb, dst->data->uub, dst->data->shape, data + size_out,
|
||||
src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape, src->data->Bg->fgfs[varls->data->sgfn],
|
||||
dst->data->llb, dst->data->uub);
|
||||
break;
|
||||
case 2:
|
||||
f_restrict3(DIM, dst->data->llb, dst->data->uub, dst->data->shape, data + size_out,
|
||||
src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape, src->data->Bg->fgfs[varls->data->sgfn],
|
||||
dst->data->llb, dst->data->uub, varls->data->SoA, Symmetry);
|
||||
break;
|
||||
case 3:
|
||||
f_prolong3(DIM, src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape, src->data->Bg->fgfs[varls->data->sgfn],
|
||||
dst->data->llb, dst->data->uub, dst->data->shape, data + size_out,
|
||||
dst->data->llb, dst->data->uub, varls->data->SoA, Symmetry);
|
||||
}
|
||||
if (dir == UNPACK) // from target data to corresponding grid
|
||||
f_copy(DIM, dst->data->Bg->bbox, dst->data->Bg->bbox + dim, dst->data->Bg->shape, dst->data->Bg->fgfs[varld->data->sgfn],
|
||||
dst->data->llb, dst->data->uub, dst->data->shape, data + size_out,
|
||||
dst->data->llb, dst->data->uub);
|
||||
}
|
||||
size_out += dst->data->shape[0] * dst->data->shape[1] * dst->data->shape[2];
|
||||
varls = varls->next;
|
||||
varld = varld->next;
|
||||
}
|
||||
}
|
||||
dst = dst->next;
|
||||
src = src->next;
|
||||
}
|
||||
|
||||
int size_out = 0;
|
||||
|
||||
if (!src || !dst)
|
||||
return size_out;
|
||||
|
||||
int src_sgfn[MAX_DATA_PACKER_VARS];
|
||||
int dst_sgfn[MAX_DATA_PACKER_VARS];
|
||||
double *src_soa[MAX_DATA_PACKER_VARS];
|
||||
const int var_count = expand_var_list_pack_info(VarLists, VarListd, src_sgfn, dst_sgfn, src_soa);
|
||||
|
||||
int type; /* 1 copy, 2 restrict, 3 prolong */
|
||||
if (src->data->Bg->lev == dst->data->Bg->lev)
|
||||
type = 1;
|
||||
else if (src->data->Bg->lev > dst->data->Bg->lev)
|
||||
type = 2;
|
||||
else
|
||||
type = 3;
|
||||
|
||||
while (src && dst)
|
||||
{
|
||||
const bool rank_match =
|
||||
(dir == PACK && dst->data->Bg->rank == rank_in && src->data->Bg->rank == myrank) ||
|
||||
(dir == UNPACK && src->data->Bg->rank == rank_in && dst->data->Bg->rank == myrank);
|
||||
|
||||
if (rank_match)
|
||||
{
|
||||
const int segment_size = dst->data->shape[0] * dst->data->shape[1] * dst->data->shape[2];
|
||||
int offset = size_out;
|
||||
|
||||
if (data)
|
||||
{
|
||||
if (dir == PACK)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case 1:
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_copy(DIM, dst->data->llb, dst->data->uub, dst->data->shape, data + offset,
|
||||
src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape,
|
||||
src->data->Bg->fgfs[src_sgfn[iv]], dst->data->llb, dst->data->uub);
|
||||
break;
|
||||
case 2:
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_restrict3(DIM, dst->data->llb, dst->data->uub, dst->data->shape, data + offset,
|
||||
src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape,
|
||||
src->data->Bg->fgfs[src_sgfn[iv]], dst->data->llb, dst->data->uub,
|
||||
src_soa[iv], Symmetry);
|
||||
break;
|
||||
case 3:
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_prolong3(DIM, src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape,
|
||||
src->data->Bg->fgfs[src_sgfn[iv]], dst->data->llb, dst->data->uub,
|
||||
dst->data->shape, data + offset, dst->data->llb, dst->data->uub,
|
||||
src_soa[iv], Symmetry);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_copy(DIM, dst->data->Bg->bbox, dst->data->Bg->bbox + dim, dst->data->Bg->shape,
|
||||
dst->data->Bg->fgfs[dst_sgfn[iv]], dst->data->llb, dst->data->uub,
|
||||
dst->data->shape, data + offset, dst->data->llb, dst->data->uub);
|
||||
}
|
||||
}
|
||||
|
||||
size_out = offset + ((!data) ? segment_size * var_count : 0);
|
||||
if (data)
|
||||
size_out = offset;
|
||||
}
|
||||
dst = dst->next;
|
||||
src = src->next;
|
||||
}
|
||||
|
||||
return size_out;
|
||||
}
|
||||
int Parallel::data_packermix(double *data, MyList<Parallel::gridseg> *src, MyList<Parallel::gridseg> *dst, int rank_in, int dir,
|
||||
MyList<var> *VarLists /* source */, MyList<var> *VarListd /* target */, int Symmetry)
|
||||
{
|
||||
int myrank;
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||
int Parallel::data_packermix(double *data, MyList<Parallel::gridseg> *src, MyList<Parallel::gridseg> *dst, int rank_in, int dir,
|
||||
MyList<var> *VarLists /* source */, MyList<var> *VarListd /* target */, int Symmetry)
|
||||
{
|
||||
int myrank;
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||
|
||||
int DIM = dim;
|
||||
|
||||
@@ -3814,33 +3853,22 @@ int Parallel::data_packermix(double *data, MyList<Parallel::gridseg> *src, MyLis
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
int size_out = 0;
|
||||
|
||||
if (!src || !dst)
|
||||
return size_out;
|
||||
|
||||
MyList<var> *varls, *varld;
|
||||
|
||||
varls = VarLists;
|
||||
varld = VarListd;
|
||||
while (varls && varld)
|
||||
{
|
||||
varls = varls->next;
|
||||
varld = varld->next;
|
||||
}
|
||||
|
||||
if (varls || varld)
|
||||
{
|
||||
cout << "error in short data packer, var lists does not match." << endl;
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
int type; /* 1 copy, 2 restrict, 3 prolong */
|
||||
if (src->data->Bg->lev == dst->data->Bg->lev)
|
||||
type = 1;
|
||||
else if (src->data->Bg->lev > dst->data->Bg->lev)
|
||||
type = 2;
|
||||
else
|
||||
int size_out = 0;
|
||||
|
||||
if (!src || !dst)
|
||||
return size_out;
|
||||
|
||||
int src_sgfn[MAX_DATA_PACKER_VARS];
|
||||
int dst_sgfn[MAX_DATA_PACKER_VARS];
|
||||
double *src_soa[MAX_DATA_PACKER_VARS];
|
||||
const int var_count = expand_var_list_pack_info(VarLists, VarListd, src_sgfn, dst_sgfn, src_soa);
|
||||
|
||||
int type; /* 1 copy, 2 restrict, 3 prolong */
|
||||
if (src->data->Bg->lev == dst->data->Bg->lev)
|
||||
type = 1;
|
||||
else if (src->data->Bg->lev > dst->data->Bg->lev)
|
||||
type = 2;
|
||||
else
|
||||
type = 3;
|
||||
|
||||
if (type != 3)
|
||||
@@ -3848,37 +3876,48 @@ int Parallel::data_packermix(double *data, MyList<Parallel::gridseg> *src, MyLis
|
||||
cout << "Parallel::data_packermix: error type " << type << " for data_packermix." << endl;
|
||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||
}
|
||||
|
||||
while (src && dst)
|
||||
{
|
||||
if ((dir == PACK && dst->data->Bg->rank == rank_in && src->data->Bg->rank == myrank) ||
|
||||
(dir == UNPACK && src->data->Bg->rank == rank_in && dst->data->Bg->rank == myrank))
|
||||
{
|
||||
varls = VarLists;
|
||||
varld = VarListd;
|
||||
while (varls && varld)
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
if (dir == PACK)
|
||||
f_prolongcopy3(DIM, src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape, src->data->Bg->fgfs[varls->data->sgfn],
|
||||
dst->data->llb, dst->data->uub, src->data->shape, data + size_out,
|
||||
src->data->llb, src->data->uub, varls->data->SoA, Symmetry);
|
||||
if (dir == UNPACK) // from target data to corresponding grid
|
||||
f_prolongmix3(DIM, dst->data->Bg->bbox, dst->data->Bg->bbox + dim, dst->data->Bg->shape, dst->data->Bg->fgfs[varld->data->sgfn],
|
||||
src->data->llb, src->data->uub, src->data->shape, data + size_out,
|
||||
dst->data->llb, dst->data->uub, varls->data->SoA, Symmetry, dst->data->illb, dst->data->iuub);
|
||||
}
|
||||
// the symmetry problem should be dealt in prolongcopy3,
|
||||
// so we always have ghost_width for both sides
|
||||
size_out += (src->data->shape[0] + 2 * ghost_width) * (src->data->shape[1] + 2 * ghost_width) * (src->data->shape[2] + 2 * ghost_width);
|
||||
varls = varls->next;
|
||||
varld = varld->next;
|
||||
}
|
||||
}
|
||||
dst = dst->next;
|
||||
src = src->next;
|
||||
}
|
||||
|
||||
while (src && dst)
|
||||
{
|
||||
const bool rank_match =
|
||||
(dir == PACK && dst->data->Bg->rank == rank_in && src->data->Bg->rank == myrank) ||
|
||||
(dir == UNPACK && src->data->Bg->rank == rank_in && dst->data->Bg->rank == myrank);
|
||||
|
||||
if (rank_match)
|
||||
{
|
||||
const int segment_size =
|
||||
(src->data->shape[0] + 2 * ghost_width) *
|
||||
(src->data->shape[1] + 2 * ghost_width) *
|
||||
(src->data->shape[2] + 2 * ghost_width);
|
||||
int offset = size_out;
|
||||
|
||||
if (data)
|
||||
{
|
||||
if (dir == PACK)
|
||||
{
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_prolongcopy3(DIM, src->data->Bg->bbox, src->data->Bg->bbox + dim, src->data->Bg->shape,
|
||||
src->data->Bg->fgfs[src_sgfn[iv]], dst->data->llb, dst->data->uub,
|
||||
src->data->shape, data + offset, src->data->llb, src->data->uub,
|
||||
src_soa[iv], Symmetry);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int iv = 0; iv < var_count; iv++, offset += segment_size)
|
||||
f_prolongmix3(DIM, dst->data->Bg->bbox, dst->data->Bg->bbox + dim, dst->data->Bg->shape,
|
||||
dst->data->Bg->fgfs[dst_sgfn[iv]], src->data->llb, src->data->uub,
|
||||
src->data->shape, data + offset, dst->data->llb, dst->data->uub,
|
||||
src_soa[iv], Symmetry, dst->data->illb, dst->data->iuub);
|
||||
}
|
||||
}
|
||||
|
||||
size_out = offset + ((!data) ? segment_size * var_count : 0);
|
||||
if (data)
|
||||
size_out = offset;
|
||||
}
|
||||
dst = dst->next;
|
||||
src = src->next;
|
||||
}
|
||||
|
||||
return size_out;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user