From 8260b59942279605b296d5e98a66a731758555a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Tue, 18 Oct 2011 23:19:53 +0200 Subject: [PATCH] Grab copy of 'compr_quant' module. --- src/compr_quant_general.c | 133 ++++++++++++++++++++++++++++++++++++++ src/compr_quant_general.h | 70 ++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 src/compr_quant_general.c create mode 100644 src/compr_quant_general.h diff --git a/src/compr_quant_general.c b/src/compr_quant_general.c new file mode 100644 index 00000000..93d12a75 --- /dev/null +++ b/src/compr_quant_general.c @@ -0,0 +1,133 @@ +/* + Copyright 2010 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + +#include + +#include "sparse_sys.h" +#include "compr_quant.h" + + +void +compr_quantities_deallocate(struct compr_quantities *cq) +{ + if (cq != NULL) { + free(cq->Ac); + } + + free(cq); +} + + +struct compr_quantities * +compr_quantities_allocate(size_t nc, size_t nf, int np) +{ + size_t alloc_sz, np2; + struct compr_quantities *cq; + + cq = malloc(1 * sizeof *cq); + + if (cq != NULL) { + np2 = np * np; + + alloc_sz = np2 * nc; /* Ac */ + alloc_sz += np2 * nc; /* dAc */ + alloc_sz += np2 * nf; /* Af */ + alloc_sz += np * nf; /* phasemobf */ + alloc_sz += 1 * nc; /* voldiscr */ + + cq->Ac = malloc(alloc_sz * sizeof *cq->Ac); + + if (cq->Ac == NULL) { + compr_quantities_deallocate(cq); + cq = NULL; + } else { + cq->dAc = cq->Ac + (np2 * nc); + cq->Af = cq->dAc + (np2 * nc); + cq->phasemobf = cq->Af + (np2 * nf); + cq->voldiscr = cq->phasemobf + (np * nf); + + cq->nphases = np; + + vector_zero(alloc_sz, cq->Ac); + } + } + + return cq; +} + + +/* ---------------------------------------------------------------------- */ +/* Compute B \ (V') == zeta(cellNo) .* faceFlux2CellFlux(fflux) */ +/* ---------------------------------------------------------------------- */ +void +compr_flux_term(grid_t *G, + const double *fflux, + const double *zeta, + double *Biv) +/* ---------------------------------------------------------------------- */ +{ + int c, i, f; + double s; + + for (c = i = 0; c < G->number_of_cells; c++) { + for (; i < G->cell_facepos[c + 1]; i++) { + f = G->cell_faces[i]; + s = 2.0*(c == G->face_cells[2*f + 0]) - 1.0; + + Biv[i] = zeta[c] * s * fflux[f]; + } + } +} + + +/* ---------------------------------------------------------------------- */ +/* Compute P == ct .* pv ./ dt */ +/* ---------------------------------------------------------------------- */ +void +compr_accum_term(size_t nc, + double dt, + const double *porevol, + const double *totcompr, + double *P) +/* ---------------------------------------------------------------------- */ +{ + size_t c; + + for (c = 0; c < nc; c++) { + P[c] = totcompr[c] * porevol[c] / dt; + } +} + + +/* ---------------------------------------------------------------------- */ +/* Add pressure accumulation term (P*p_0) to cell sources */ +/* ---------------------------------------------------------------------- */ +void +compr_src_add_press_accum(size_t nc, + const double *p0, + const double *P, + double *src) +/* ---------------------------------------------------------------------- */ +{ + size_t c; + + for (c = 0; c < nc; c++) { + src[c] += P[c] * p0[c]; + } +} diff --git a/src/compr_quant_general.h b/src/compr_quant_general.h new file mode 100644 index 00000000..b3531176 --- /dev/null +++ b/src/compr_quant_general.h @@ -0,0 +1,70 @@ +/* + Copyright 2010 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + +#ifndef OPM_COMPR_QUANT_HEADER_INCLUDED +#define OPM_COMPR_QUANT_HEADER_INCLUDED + +#include + +#include "grid.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct compr_quantities { + int nphases; /* Number of phases/components */ + + double *Ac; /* RB^{-1} per cell */ + double *dAc; /* d/dp (RB^{-1}) per cell */ + double *Af; /* RB^{-1} per face */ + double *phasemobf; /* Phase mobility per face */ + double *voldiscr; /* Volume discrepancy per cell */ +}; + +struct compr_quantities * +compr_quantities_allocate(size_t nc, size_t nf, int np); + +void +compr_quantities_deallocate(struct compr_quantities *cq); + +void +compr_flux_term(grid_t *G, + const double *fflux, + const double *zeta, + double *Biv); + +void +compr_accum_term(size_t nc, + double dt, + const double *porevol, + const double *totcompr, + double *P); + +void +compr_src_add_press_accum(size_t nc, + const double *p0, + const double *P, + double *src); + +#ifdef __cplusplus +} +#endif + +#endif /* OPM_COMPR_QUANT_HEADER_INCLUDED */