#ifndef PARALLEL_H #define PARALLEL_H #include #include #include #include #include #include #include #include using namespace std; #include "Parallel_bam.h" #include "var.h" #include "MPatch.h" #include "Block.h" #include "MyList.h" #include "macrodef.h" //need dim; ghost_width; CONTRACT namespace Parallel { struct gridseg { double llb[dim]; double uub[dim]; int shape[dim]; double illb[dim], iuub[dim]; // only use for OutBdLow2Hi Block *Bg; }; int partition1(int &nx, int split_size, int min_width, int cpusize, int shape); // special for 1 diemnsion int partition2(int *nxy, int split_size, int *min_width, int cpusize, int *shape); // special for 2 diemnsions int partition3(int *nxyz, int split_size, int *min_width, int cpusize, int *shape); MyList *distribute(MyList *PatchLIST, int cpusize, int ingfsi, int fngfs, bool periodic, int nodes = 0); // produce corresponding Blocks void KillBlocks(MyList *PatchLIST); void setfunction(MyList *BlL, var *vn, double func(double x, double y, double z)); void setfunction(int rank, MyList *BlL, var *vn, double func(double x, double y, double z)); void writefile(double time, int nx, int ny, int nz, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax, char *filename, double *data_out); void writefile(double time, int nx, int ny, double xmin, double xmax, double ymin, double ymax, char *filename, double *datain); void getarrayindex(int DIM, int *shape, int *index, int n); int getarraylocation(int DIM, int *shape, int *index); void copy(int DIM, double *llbout, double *uubout, int *Dshape, double *DD, double *llbin, double *uubin, int *shape, double *datain, double *llb, double *uub); void Dump_CPU_Data(MyList *BlL, MyList *DumpList, char *tag, double time, double dT); void Dump_Data(MyList *PL, MyList *DumpList, char *tag, double time, double dT); void Dump_Data(Patch *PP, MyList *DumpList, char *tag, double time, double dT, int grd); double *Collect_Data(Patch *PP, var *VP); void d2Dump_Data(MyList *PL, MyList *DumpList, char *tag, double time, double dT); void d2Dump_Data(Patch *PP, MyList *DumpList, char *tag, double time, double dT, int grd); void Dump_Data0(Patch *PP, MyList *DumpList, char *tag, double time, double dT); double global_interp(int DIM, int *ext, double **CoX, double *datain, double *poX, int ordn, double *SoA, int Symmetry); double global_interp(int DIM, int *ext, double **CoX, double *datain, double *poX, int ordn); double Lagrangian_Int(double x, int npts, double *xpts, double *funcvals); double LagrangePoly(double x, int pt, int npts, double *xpts); MyList *build_complete_gsl(Patch *Pat); MyList *build_complete_gsl(MyList *PatL); MyList *build_complete_gsl_virtual(MyList *PatL); MyList *build_complete_gsl_virtual2(MyList *PatL); // - buffer MyList *build_owned_gsl0(Patch *Pat, int rank_in); // - ghost without extension, special for Sync usage MyList *build_owned_gsl1(Patch *Pat, int rank_in); // - ghost, similar to build_owned_gsl0 but extend one point on left side for vertex grid MyList *build_owned_gsl2(Patch *Pat, int rank_in); // - buffer - ghost MyList *build_owned_gsl3(Patch *Pat, int rank_in, int Symmetry); // - ghost - BD ghost MyList *build_owned_gsl4(Patch *Pat, int rank_in, int Symmetry); // - buffer - ghost - BD ghost MyList *build_owned_gsl5(Patch *Pat, int rank_in); // similar to build_owned_gsl2 but no extension MyList *build_owned_gsl(MyList *PatL, int rank_in, int type, int Symmetry); void build_gstl(MyList *srci, MyList *dsti, MyList **out_src, MyList **out_dst); int data_packer(double *data, MyList *src, MyList *dst, int rank_in, int dir, MyList *VarLists, MyList *VarListd, int Symmetry); void transfer(MyList **src, MyList **dst, MyList *VarList1 /* source */, MyList *VarList2 /*target */, int Symmetry); int data_packermix(double *data, MyList *src, MyList *dst, int rank_in, int dir, MyList *VarLists, MyList *VarListd, int Symmetry); void transfermix(MyList **src, MyList **dst, MyList *VarList1 /* source */, MyList *VarList2 /*target */, int Symmetry); void Sync(Patch *Pat, MyList *VarList, int Symmetry); void Sync(MyList *PatL, MyList *VarList, int Symmetry); void OutBdLow2Hi(Patch *Patc, Patch *Patf, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void OutBdLow2Hi(MyList *PatcL, MyList *PatfL, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void OutBdLow2Himix(Patch *Patc, Patch *Patf, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void OutBdLow2Himix(MyList *PatcL, MyList *PatfL, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void Prolong(Patch *Patc, Patch *Patf, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void Prolongint(Patch *Patc, Patch *Patf, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void Restrict(MyList *PatcL, MyList *PatfL, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); void Restrict_after(MyList *PatcL, MyList *PatfL, MyList *VarList1 /* source */, MyList *VarList2 /* target */, int Symmetry); // for -ghost - BDghost MyList *build_PhysBD_gsl(Patch *Pat); MyList *build_ghost_gsl(MyList *PatL); MyList *build_ghost_gsl(Patch *Pat); MyList *build_buffer_gsl(Patch *Pat); MyList *build_buffer_gsl(MyList *PatL); MyList *gsl_subtract(MyList *A, MyList *B); MyList *gs_subtract(MyList *A, MyList *B); MyList *gsl_and(MyList *A, MyList *B); MyList *gs_and(MyList *A, MyList *B); MyList *clone_gsl(MyList *p, bool first_only); MyList *build_bulk_gsl(Patch *Pat); // similar to build_owned_gsl0 but does not care rank issue MyList *build_bulk_gsl(Block *bp, Patch *Pat); void build_PhysBD_gstl(Patch *Pat, MyList *srci, MyList *dsti, MyList **out_src, MyList **out_dst); void PeriodicBD(Patch *Pat, MyList *VarList, int Symmetry); double L2Norm(Patch *Pat, var *vf); void checkgsl(MyList *pp, bool first_only); void checkvarl(MyList *pp, bool first_only); MyList *divide_gsl(MyList *p, Patch *Pat); MyList *divide_gs(MyList *p, Patch *Pat); void prepare_inter_time_level(Patch *Pat, MyList *VarList1 /* source (t+dt) */, MyList *VarList2 /* source (t) */, MyList *VarList3 /* target (t+a*dt) */, int tindex); void prepare_inter_time_level(Patch *Pat, MyList *VarList1 /* source (t+dt) */, MyList *VarList2 /* source (t) */, MyList *VarList3 /* source (t-dt) */, MyList *VarList4 /* target (t+a*dt) */, int tindex); void prepare_inter_time_level(MyList *PatL, MyList *VarList1 /* source (t+dt) */, MyList *VarList2 /* source (t) */, MyList *VarList3 /* target (t+a*dt) */, int tindex); void prepare_inter_time_level(MyList *Pat, MyList *VarList1 /* source (t+dt) */, MyList *VarList2 /* source (t) */, MyList *VarList3 /* source (t-dt) */, MyList *VarList4 /* target (t+a*dt) */, int tindex); void merge_gsl(MyList *&A, const double ratio); bool merge_gs(MyList *D, MyList *B, MyList *&C, const double ratio); // Add ghost region to tangent plane // we assume the grids have the same resolution void add_ghost_touch(MyList *&A); void cut_gsl(MyList *&A); bool cut_gs(MyList *D, MyList *B, MyList *&C); MyList *gs_subtract_virtual(MyList *A, MyList *B); void fill_level_data(MyList *PatLd, MyList *PatLs, MyList *PatcL, MyList *OldList, MyList *StateList, MyList *FutureList, MyList *tmList, int Symmetry, bool BB, bool CC); bool PatList_Interp_Points(MyList *PatL, MyList *VarList, int NN, double **XX, double *Shellf, int Symmetry); void aligncheck(double *bbox0, double *bboxl, int lev, double *DH0, int *shape); bool point_locat_gsl(double *pox, MyList *gsl); void checkpatchlist(MyList *PatL, bool buflog); double L2Norm(Patch *Pat, var *vf, MPI_Comm Comm_here); bool PatList_Interp_Points(MyList *PatL, MyList *VarList, int NN, double **XX, double *Shellf, int Symmetry, MPI_Comm Comm_here); #if (PSTR == 1 || PSTR == 2 || PSTR == 3) MyList *distribute(MyList *PatchLIST, int cpusize, int ingfsi, int fngfsi, bool periodic, int start_rank, int end_rank, int nodes = 0); #endif } #endif /*PARALLEL_H */