コード例 #1
0
ファイル: grid_output.cpp プロジェクト: dmarce1/octotiger
std::size_t grid::save(FILE* fp) const {
	std::size_t cnt = 0;
	auto foo = std::fwrite;
	{
		static hpx::mutex mtx;
		std::lock_guard < hpx::mutex > lock(mtx);
		cnt += foo(&scaling_factor, sizeof(real), 1, fp) * sizeof(real);
		cnt += foo(&max_level, sizeof(integer), 1, fp) * sizeof(integer);
		cnt += foo(&Acons, sizeof(real), 1, fp) * sizeof(real);
		cnt += foo(&Bcons, sizeof(integer), 1, fp) * sizeof(integer);
	}
	cnt += foo(&is_leaf, sizeof(bool), 1, fp) * sizeof(bool);
	cnt += foo(&is_root, sizeof(bool), 1, fp) * sizeof(bool);
	for (integer f = 0; f != NF; ++f) {
		for (integer i = H_BW; i < H_NX - H_BW; ++i) {
			for (integer j = H_BW; j < H_NX - H_BW; ++j) {
				const integer iii = hindex(i, j, H_BW);
				cnt += foo(&(U[f][iii]), sizeof(real), INX, fp) * sizeof(real);
			}
		}
	}
	for (integer i = 0; i < G_NX; ++i) {
		for (integer j = 0; j < G_NX; ++j) {
			for (integer k = 0; k < G_NX; ++k) {
				const integer iii = gindex(i, j, k);
				cnt += foo(&(G[iii][0]), sizeof(real), NGF, fp) * sizeof(real);
			}
		}
	}
	cnt += foo(U_out.data(), sizeof(real), U_out.size(), fp) * sizeof(real);
	return cnt;
}
コード例 #2
0
ファイル: grid_output.cpp プロジェクト: dmarce1/octotiger
grid::output_list_type grid::get_output_list(bool analytic) const {
	auto& V = TLS_V();
	compute_primitives();
	output_list_type rc;
	const integer vertex_order[8] = { 0, 1, 3, 2, 4, 5, 7, 6 };

	std::set<node_point>& node_list = rc.nodes;
	std::vector<zone_int_type>& zone_list = rc.zones;
	std::array < std::vector<real>, NF + NGF + NPF > &data = rc.data;
	std::array < std::vector<real>, NF > &A = rc.analytic;

	for (integer field = 0; field != NF + NGF + NPF; ++field) {
		data[field].reserve(INX * INX * INX);
		if (analytic) {
			A[field].reserve(INX * INX * INX);
		}
	}
	const integer this_bw = H_BW;
	zone_list.reserve(std::pow(H_NX - 2 * this_bw, NDIM) * NCHILD);
	for (integer i = this_bw; i != H_NX - this_bw; ++i) {
		for (integer j = this_bw; j != H_NX - this_bw; ++j) {
			for (integer k = this_bw; k != H_NX - this_bw; ++k) {
				const integer iii = hindex(i, j, k);
				const integer iiig = gindex(i - H_BW, j - H_BW, k - H_BW);
#ifdef EQ_ONLY
				if (!(std::abs(X[ZDIM][iii]) < dx) && !(std::abs(X[YDIM][iii]) < dx)) {
					continue;
				}
#endif
				for (integer ci = 0; ci != NVERTEX; ++ci) {
					const integer vi = vertex_order[ci];
					const integer xi = (vi >> 0) & 1;
					const integer yi = (vi >> 1) & 1;

					const integer zi = (vi >> 2) & 1;
					node_point this_x;
					this_x.pt[XDIM] = X[XDIM][iii] + (real(xi) - HALF) * dx;
					this_x.pt[YDIM] = X[YDIM][iii] + (real(yi) - HALF) * dx;
					this_x.pt[ZDIM] = X[ZDIM][iii] + (real(zi) - HALF) * dx;
					auto iter = node_list.find(this_x);
					integer index;
					if (iter != node_list.end()) {
						index = iter->index;
					} else {
						index = node_list.size();
						this_x.index = index;
						node_list.insert(this_x);
					}
					zone_list.push_back(index);
				}
				if (analytic) {
					for (integer field = 0; field != NF; ++field) {
						A[field].push_back(Ua[field][iii]);
					}
				}
				for (integer field = 0; field != NF; ++field) {
					data[field].push_back(U[field][iii]);
				}
				for (integer field = 0; field != NGF; ++field) {
					data[field + NF].push_back(G[iiig][field]);
				}
				data[NGF + NF + 0].push_back(V[vx_i][iii]);
				data[NGF + NF + 1].push_back(V[vy_i][iii]);
				data[NGF + NF + 2].push_back(V[vz_i][iii]);
				if (V[egas_i][iii] * V[rho_i][iii] < de_switch2 * U[egas_i][iii]) {
					data[NGF + NF + 3].push_back(std::pow(V[tau_i][iii], fgamma) / V[rho_i][iii]);
				} else {
					data[NGF + NF + 3].push_back(V[egas_i][iii]);
				}
				data[NGF + NF + 4].push_back(V[zz_i][iii]);
			}
		}
	}

	return rc;
}
コード例 #3
0
ファイル: gridder2d.c プロジェクト: dkriegner/xrayutilities
/*--------------------------------------------------------------------------*/
int fuzzygridder2d(double *x, double *y, double *data, unsigned int n,
                   unsigned int nx, unsigned int ny,
                   double xmin, double xmax, double ymin, double ymax,
                   double *odata, double *norm, double wx, double wy,
                   int flags)
{
    double *gnorm;
    unsigned int offset, offsetx1, offsetx2, offsety1, offsety2;
    unsigned int ntot = nx * ny;  /* total number of points on the grid */
    unsigned int noutofbounds = 0;  /* number of points out of bounds */

    double fractionx, fractiony, dwx, dwy;  /* variables for the fuzzy part */
    double dx = delta(xmin, xmax, nx);
    double dy = delta(ymin, ymax, ny);

    unsigned int i, j, k;  /* loop indices */

    /* initialize data if requested */
    if (!(flags & NO_DATA_INIT)) {
        set_array(odata, ntot, 0.);
    }

    /* check if normalization array is passed */
    if (norm == NULL) {
        gnorm = malloc(sizeof(double) * (nx * ny));
        if (gnorm == NULL) {
            fprintf(stderr, "XU.FuzzyGridder2D(c): Cannot allocate memory for"
                            " normalization buffer!\n");
            return -1;
        }
        /* initialize memory for norm */
        set_array(gnorm, nx * ny, 0.);
    }
    else {
        if (flags & VERBOSE) {
            fprintf(stdout, "XU.FuzzyGridder2D(c): use user provided buffer "
                            "for normalization data\n");
        }
        gnorm = norm;
    }

    /* calculate the fuzzy spread in number of bin sizes */
    dwx = wx / dx;
    dwy = wy / dy;
    if (flags & VERBOSE) {
        fprintf(stdout, "XU.FuzzyGridder2D(c): fuzzyness: %f %f %f %f\n",
                wx, wy, dwx, dwy);
    }
    /* the master loop over all data points */
    for (i = 0; i < n; i++) {
        /* if data point is nan ignore it */
        if (!isnan(data[i])) {
            /* if the x and y values are outside the grids boundaries
             * continue with the next point */
            if ((x[i] < xmin) || (x[i] > xmax)) {
                noutofbounds++;
                continue;
            }
            if ((y[i] < ymin) || (y[i] > ymax)) {
                noutofbounds++;
                continue;
            }
            /* compute the linear offset and distribute the data to the bins */
            if ((x[i] - wx / 2.) <= xmin) {
                offsetx1 = 0;
            }
            else {
                offsetx1 = gindex(x[i] - wx / 2., xmin, dx);
            }
            offsetx2 = gindex(x[i] + wx / 2., xmin, dx);
            offsetx2 = offsetx2 < nx ? offsetx2 : nx - 1;
            if ((y[i] - wy / 2.) <= ymin) {
                offsety1 = 0;
            }
            else {
                offsety1 = gindex(y[i] - wy / 2., ymin, dy);
            }
            offsety2 = gindex(y[i] + wy / 2., ymin, dy);
            offsety2 = offsety2 < ny ? offsety2 : ny - 1;

            for(j = offsetx1; j <= offsetx2; j++) {
                if (offsetx1 == offsetx2) {
                    fractionx = 1.;
                }
                else if (j == offsetx1) {
                    fractionx = (j + 1 - (x[i] - wx / 2. - xmin + dx / 2.) / dx) / dwx;
                }
                else if (j == offsetx2) {
                    fractionx = ((x[i] + wx / 2. - xmin + dx / 2.) / dx - j) / dwx;
                }
                else {
                    fractionx = 1 / dwx;
                }

                for(k = offsety1; k <= offsety2; k++) {
                    if (offsety1 == offsety2) {
                        fractiony = 1.;
                    }
                    else if (k == offsety1) {
                        fractiony = (k + 1 - (y[i] - wy / 2. - ymin + dy / 2.) / dy) / dwy;
                    }
                    else if (k == offsety2) {
                        fractiony = ((y[i] + wy / 2. - ymin + dy / 2.) / dy - k) / dwy;
                    }
                    else {
                        fractiony = 1 / dwy;
                    }

                    offset = j * ny + k;
                    odata[offset] += data[i]*fractionx*fractiony;
                    gnorm[offset] += fractionx*fractiony;
                }
            }
        }
    }

    /* perform normalization */
    if (!(flags & NO_NORMALIZATION)) {
        if (flags & VERBOSE)
            fprintf(stdout, "XU.FuzzyGridder2D(c): perform normalization\n");

        for (i = 0; i < nx * ny; i++) {
            if (gnorm[i] > 1.e-16) {
                odata[i] = odata[i] / gnorm[i];
            }
        }
    }

    /* free the norm buffer if it has been locally allocated */
    if (norm == NULL) {
        free(gnorm);
    }

    /* warn the user in case more than half the data points where out
     * of the gridding area */
    if (noutofbounds > n / 2) {
        fprintf(stdout,"XU.FuzzyGridder2D(c): more than half of the datapoints"
                        " out of the data range, consider regridding with"
                        " extended range!\n");
    }

    return 0;
}
コード例 #4
0
ファイル: gridder2d.c プロジェクト: dkriegner/xrayutilities
/*--------------------------------------------------------------------------*/
int gridder2d(double *x, double *y, double *data, unsigned int n,
              unsigned int nx, unsigned int ny,
              double xmin, double xmax, double ymin, double ymax,
              double *odata, double *norm, int flags)
{
    double *gnorm;
    unsigned int offset;
    unsigned int ntot = nx * ny;  /* total number of points on the grid */
    unsigned int noutofbounds = 0;  /* number of points out of bounds */

    double dx = delta(xmin, xmax, nx);
    double dy = delta(ymin, ymax, ny);

    unsigned int i;  /* loop index */

    /* initialize data if requested */
    if (!(flags & NO_DATA_INIT)) {
        set_array(odata, ntot, 0.);
    }

    /* check if normalization array is passed */
    if (norm == NULL) {
        gnorm = malloc(sizeof(double) * (nx * ny));
        if (gnorm == NULL) {
            fprintf(stderr, "XU.Gridder2D(c): Cannot allocate memory for "
                            "normalization buffer!\n");
            return -1;
        }
        /* initialize memory for norm */
        set_array(gnorm, nx * ny, 0.);
    }
    else {
        if (flags & VERBOSE) {
            fprintf(stdout, "XU.Gridder2D(c): use user provided buffer for "
                            "normalization data\n");
        }
        gnorm = norm;
    }

    /* the master loop over all data points */
    for (i = 0; i < n; i++) {
        /* if data point is nan ignore it */
        if (!isnan(data[i])) {
            /* if the x and y values are outside the grids boundaries
             * continue with the next point */
            if ((x[i] < xmin) || (x[i] > xmax)) {
                noutofbounds++;
                continue;
            }
            if ((y[i] < ymin) || (y[i] > ymax)) {
                noutofbounds++;
                continue;
            }
            /* compute the linear offset and set the data */
            offset = gindex(x[i], xmin, dx) * ny + gindex(y[i], ymin, dy);

            odata[offset] += data[i];
            gnorm[offset] += 1.;
        }
    }

    /* perform normalization */
    if (!(flags & NO_NORMALIZATION)) {
        if (flags & VERBOSE)
            fprintf(stdout, "XU.Gridder2D(c): perform normalization ...\n");

        for (i = 0; i < nx * ny; i++) {
            if (gnorm[i] > 1.e-16) {
                odata[i] = odata[i] / gnorm[i];
            }
        }
    }

    /* free the norm buffer if it has been locally allocated */
    if (norm == NULL) {
        free(gnorm);
    }

    /* warn the user in case more than half the data points where out
     * of the gridding area */
    if (noutofbounds > n / 2) {
        fprintf(stdout,"XU.Gridder2D(c): more than half of the datapoints out "
                        "of the data range, consider regridding with extended "
                        "range!\n");
    }

    return 0;
}