Re-factor creation and destruction of cell->well mapping out to
separate module. Update callers.
This commit is contained in:
parent
dd0aa25511
commit
aa19c72d49
@ -12,76 +12,6 @@
|
|||||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||||
|
|
||||||
|
|
||||||
/* Release memory resources for cell->well mapping (CSR representation). */
|
|
||||||
/* ---------------------------------------------------------------------- */
|
|
||||||
static void
|
|
||||||
delete_cell_wells(int *cwpos, int *cwells)
|
|
||||||
/* ---------------------------------------------------------------------- */
|
|
||||||
{
|
|
||||||
free(cwells);
|
|
||||||
free(cwpos);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Allocate and create cell->well mapping from well->cell mapping.
|
|
||||||
*
|
|
||||||
* Returns >0 (nnz for CSR representation) and sets CSR pointers
|
|
||||||
* (*cwpos,*cwells) if successful and zero (with *cwpos=*cwells=NULL)
|
|
||||||
* otherwise. */
|
|
||||||
/* ---------------------------------------------------------------------- */
|
|
||||||
static int
|
|
||||||
build_cell_wells(size_t nc, well_t *W, int **cwpos, int **cwells)
|
|
||||||
/* ---------------------------------------------------------------------- */
|
|
||||||
{
|
|
||||||
int ret, w;
|
|
||||||
int *p, *cw, *c, *connpos;
|
|
||||||
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
p = calloc(nc + 1, sizeof *p);
|
|
||||||
cw = NULL;
|
|
||||||
|
|
||||||
if (p != NULL) {
|
|
||||||
connpos = W->well_connpos;
|
|
||||||
|
|
||||||
c = W->well_cells;
|
|
||||||
for (w = 0; w < W->number_of_wells; w++) {
|
|
||||||
for (; c != W->well_cells + connpos[w + 1]; c++) {
|
|
||||||
p[*c + 1] += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= nc; i++) {
|
|
||||||
p[0] += p[i];
|
|
||||||
p[i] = p[0] - p[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
cw = malloc(p[0] * sizeof *cw);
|
|
||||||
|
|
||||||
if (cw != NULL) {
|
|
||||||
ret = p[0]; /* Success */
|
|
||||||
|
|
||||||
p[0] = 0;
|
|
||||||
c = W->well_cells;
|
|
||||||
for (w = 0; w < W->number_of_wells; w++) {
|
|
||||||
for (; c != W->well_cells + connpos[w + 1]; c++) {
|
|
||||||
cw[ p[*c + 1] ++ ] = w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
free(p); p = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*cwpos = p;
|
|
||||||
*cwells = cw;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Release memory resources for each individual well's DOF set (and
|
/* Release memory resources for each individual well's DOF set (and
|
||||||
* the aggregate well DOF set structure). */
|
* the aggregate well DOF set structure). */
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -338,7 +268,10 @@ hybsys_define_globconn(grid_t *G, well_t *W)
|
|||||||
nw = 0;
|
nw = 0;
|
||||||
wia = NULL;
|
wia = NULL;
|
||||||
if (W != NULL) {
|
if (W != NULL) {
|
||||||
ok = build_cell_wells(G->number_of_cells, W, &cwell_pos, &cwells);
|
ok = allocate_cell_wells(G->number_of_cells, W, &cwell_pos, &cwells);
|
||||||
|
if (ok) {
|
||||||
|
derive_cell_wells(G->number_of_cells, W, cwell_pos, cwells);
|
||||||
|
}
|
||||||
nw = ok && W->number_of_wells;
|
nw = ok && W->number_of_wells;
|
||||||
|
|
||||||
if (nw > 0) {
|
if (nw > 0) {
|
||||||
@ -375,7 +308,7 @@ hybsys_define_globconn(grid_t *G, well_t *W)
|
|||||||
}
|
}
|
||||||
|
|
||||||
deallocate_well_dofset(nw, wia);
|
deallocate_well_dofset(nw, wia);
|
||||||
delete_cell_wells(cwell_pos, cwells);
|
deallocate_cell_wells(cwell_pos, cwells);
|
||||||
|
|
||||||
return A;
|
return A;
|
||||||
}
|
}
|
||||||
|
75
well.c
Normal file
75
well.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "well.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Release memory resources for cell->well mapping. */
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
void
|
||||||
|
deallocate_cell_wells(int *cvpos, int *cwells)
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
{
|
||||||
|
free(cwells);
|
||||||
|
free(cwpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Allocate memory resources for cell->well mapping.
|
||||||
|
*
|
||||||
|
* Returns 1 if successful and 0 if not. CSR array pair set to NULL
|
||||||
|
* unless allocation succeeds. */
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
int
|
||||||
|
allocate_cell_wells(int nc, well_t *W, int **cwpos, int **cwells)
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
{
|
||||||
|
int totwconn;
|
||||||
|
|
||||||
|
totwconn = W->well_connpos[W->number_of_wells];
|
||||||
|
|
||||||
|
*cwpos = calloc(nc + 1 , sizeof **cwpos );
|
||||||
|
*cwells = malloc(totwconn * sizeof **cwells);
|
||||||
|
|
||||||
|
if ((*cwpos == NULL) || (*cwells == NULL)) {
|
||||||
|
deallocate_cell_wells(*cwpos, *cwells);
|
||||||
|
|
||||||
|
*cwpos = NULL;
|
||||||
|
*cwells = NULL;
|
||||||
|
|
||||||
|
totwconn = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return totwconn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Derive cell->well mapping from well->cell (connection) mapping. */
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
void
|
||||||
|
derive_cell_wells(int nc, well_t *W, int *cwpos, int *cwells)
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
{
|
||||||
|
int i, w, *c, *connpos;
|
||||||
|
|
||||||
|
connpos = W->well_connpos;
|
||||||
|
|
||||||
|
c = W->well_cells;
|
||||||
|
for (w = 0; w < W->number_of_wells; w++) {
|
||||||
|
for (; c != W->well_cells + connpos[w + 1]; c++) {
|
||||||
|
cwpos[*c + 1] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= nc; i++) {
|
||||||
|
cwpos[0] += cwpos[i];
|
||||||
|
cwpos[i] = cwpos[0] - cwpos[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
cwpos[0] = 0;
|
||||||
|
c = W->well_cells;
|
||||||
|
for (w = 0; w < W->number_of_wells; w++) {
|
||||||
|
for (; c != W->well_cells + connpos[w + 1]; c++) {
|
||||||
|
cwells[ cwpos[*c + 1] ++ ] = w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
well.h
10
well.h
@ -28,4 +28,14 @@ typedef struct {
|
|||||||
WELL_CONNECTION_DATA
|
WELL_CONNECTION_DATA
|
||||||
} well_t;
|
} well_t;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
allocate_cell_wells(int nc, well_t *W, int **cwpos, int **cwells);
|
||||||
|
|
||||||
|
void
|
||||||
|
deallocate_cell_wells(int *cvpos, int *cwells);
|
||||||
|
|
||||||
|
void
|
||||||
|
derive_cell_wells(int nc, well_t *W, int *cwpos, int *cwells);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user