2011-11-30 12:41:29 +01:00
|
|
|
#include <assert.h>
|
2010-08-30 08:37:37 +00:00
|
|
|
#include <stdlib.h>
|
2011-11-30 11:08:32 +01:00
|
|
|
|
|
|
|
|
#include <grid.h>
|
|
|
|
|
|
2011-11-30 12:41:29 +01:00
|
|
|
#include "geometry.h"
|
2011-11-30 11:08:32 +01:00
|
|
|
#include "cgridinterface.h"
|
2010-08-30 08:37:37 +00:00
|
|
|
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
|
|
|
|
|
static int *compute_cell_facepos(grid_t *g)
|
|
|
|
|
{
|
|
|
|
|
int i,j,k;
|
|
|
|
|
int *facepos = malloc((g->number_of_cells + 1) * sizeof *facepos);
|
|
|
|
|
int *fcells = g->face_cells;
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
for (i=0; i<g->number_of_cells; ++i) {
|
|
|
|
|
facepos [i] = 0;
|
|
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
for (i=0; i<2*g->number_of_faces; ++i) {
|
|
|
|
|
if (*fcells != -1) {
|
|
|
|
|
(facepos[*fcells])++;
|
|
|
|
|
}
|
|
|
|
|
fcells++;
|
|
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
/* cumsum */
|
|
|
|
|
j=0;
|
|
|
|
|
for (i=0; i<g->number_of_cells; ++i) {
|
|
|
|
|
k = j + facepos[i];
|
|
|
|
|
facepos[i] = j;
|
|
|
|
|
j = k;
|
|
|
|
|
}
|
|
|
|
|
facepos[i] = j;
|
|
|
|
|
|
|
|
|
|
return facepos;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int *compute_cell_faces(grid_t *g)
|
|
|
|
|
{
|
|
|
|
|
int *cfaces = malloc(g->cell_facepos[g->number_of_cells] * sizeof *cfaces);
|
|
|
|
|
int *work = malloc(g->number_of_cells * sizeof *work);
|
|
|
|
|
int *fcells = g->face_cells;
|
|
|
|
|
int i,k,cell;
|
|
|
|
|
for(i=0; i<g->number_of_cells; ++i) {
|
|
|
|
|
work[i] = 0;
|
|
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
for (i=0; i<g->number_of_faces; ++i) {
|
|
|
|
|
for (k=0;k<2; ++k) {
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
if (*fcells != -1) {
|
|
|
|
|
cell = *fcells;
|
|
|
|
|
cfaces[g->cell_facepos[cell] + work[cell]] = i;
|
|
|
|
|
work[cell]++;
|
|
|
|
|
}
|
|
|
|
|
fcells++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
free(work);
|
2010-08-30 08:37:37 +00:00
|
|
|
|
|
|
|
|
return cfaces;
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-30 12:41:29 +01:00
|
|
|
void preprocess (const struct grdecl *in,
|
|
|
|
|
double tol,
|
2011-11-30 11:08:32 +01:00
|
|
|
struct CornerpointGrid *G)
|
2010-08-30 08:37:37 +00:00
|
|
|
{
|
2011-11-30 11:08:32 +01:00
|
|
|
struct processed_grid pg;
|
|
|
|
|
struct UnstructuredGrid *base;
|
|
|
|
|
|
|
|
|
|
base = (struct UnstructuredGrid *) G;
|
|
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
process_grdecl(in, tol, &pg);
|
|
|
|
|
|
2011-11-30 12:41:29 +01:00
|
|
|
/*
|
|
|
|
|
* General grid interface
|
2010-08-30 08:37:37 +00:00
|
|
|
*/
|
2011-11-30 11:08:32 +01:00
|
|
|
base->dimensions = 3;
|
2010-08-30 08:37:37 +00:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
base->number_of_nodes = pg.number_of_nodes;
|
|
|
|
|
base->number_of_faces = pg.number_of_faces;
|
|
|
|
|
base->number_of_cells = pg.number_of_cells;
|
2010-08-30 08:37:37 +00:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
base->node_coordinates = pg.node_coordinates;
|
2010-08-30 08:37:37 +00:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
base->face_nodes = pg.face_nodes;
|
|
|
|
|
base->face_nodepos = pg.face_ptr;
|
|
|
|
|
base->face_cells = pg.face_neighbors;
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
base->face_centroids = NULL;
|
|
|
|
|
base->face_normals = NULL;
|
|
|
|
|
base->face_areas = NULL;
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2010-08-30 08:37:37 +00:00
|
|
|
/* NB: compute_cell_facepos must be called before compute_cell_faces */
|
2011-11-30 11:08:32 +01:00
|
|
|
base->cell_facepos = compute_cell_facepos(base);
|
|
|
|
|
base->cell_faces = compute_cell_faces (base);
|
|
|
|
|
base->cell_centroids = NULL;
|
|
|
|
|
base->cell_volumes = NULL;
|
2010-08-30 08:37:37 +00:00
|
|
|
|
|
|
|
|
|
2011-11-30 12:41:29 +01:00
|
|
|
/*
|
|
|
|
|
* Cornerpoint grid interface
|
2010-08-30 08:37:37 +00:00
|
|
|
*/
|
2011-11-30 11:08:32 +01:00
|
|
|
G->cartdims[0] = pg.dimensions[0];
|
|
|
|
|
G->cartdims[1] = pg.dimensions[1];
|
|
|
|
|
G->cartdims[2] = pg.dimensions[2];
|
2010-08-30 08:37:37 +00:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
#if 0
|
|
|
|
|
base->face_tag = pg.face_tag;
|
|
|
|
|
#else
|
|
|
|
|
free(pg.face_tag);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
G->index_map = pg.local_cell_index;
|
2010-08-30 08:37:37 +00:00
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
|
2011-11-30 11:08:32 +01:00
|
|
|
void free_cornerpoint_grid(struct CornerpointGrid *G)
|
2010-08-30 08:37:37 +00:00
|
|
|
{
|
2011-11-30 11:08:32 +01:00
|
|
|
free(G->grid.face_nodes);
|
|
|
|
|
free(G->grid.face_nodepos);
|
|
|
|
|
free(G->grid.face_cells);
|
|
|
|
|
free(G->grid.cell_facepos);
|
|
|
|
|
free(G->grid.cell_faces);
|
|
|
|
|
|
|
|
|
|
free(G->grid.node_coordinates);
|
|
|
|
|
free(G->grid.face_centroids);
|
|
|
|
|
free(G->grid.face_areas);
|
|
|
|
|
free(G->grid.face_normals);
|
|
|
|
|
free(G->grid.cell_centroids);
|
|
|
|
|
free(G->grid.cell_volumes);
|
|
|
|
|
|
|
|
|
|
free(G->index_map);
|
2010-08-30 08:37:37 +00:00
|
|
|
}
|
2011-11-30 12:41:29 +01:00
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
allocate_geometry(struct CornerpointGrid *g)
|
|
|
|
|
{
|
|
|
|
|
int ok;
|
|
|
|
|
size_t nc, nf, nd;
|
|
|
|
|
|
|
|
|
|
assert (g->grid.dimensions == 3);
|
|
|
|
|
|
|
|
|
|
nc = g->grid.number_of_cells;
|
|
|
|
|
nf = g->grid.number_of_faces;
|
|
|
|
|
nd = 3;
|
|
|
|
|
|
|
|
|
|
g->grid.face_areas = malloc(nf * 1 * sizeof *g->grid.face_areas);
|
|
|
|
|
g->grid.face_centroids = malloc(nf * nd * sizeof *g->grid.face_centroids);
|
|
|
|
|
g->grid.face_normals = malloc(nf * nd * sizeof *g->grid.face_normals);
|
|
|
|
|
|
|
|
|
|
g->grid.cell_volumes = malloc(nc * 1 * sizeof *g->grid.cell_volumes);
|
|
|
|
|
g->grid.cell_centroids = malloc(nc * nd * sizeof *g->grid.cell_centroids);
|
|
|
|
|
|
|
|
|
|
ok = g->grid.face_areas != NULL;
|
|
|
|
|
ok += g->grid.face_centroids != NULL;
|
|
|
|
|
ok += g->grid.face_normals != NULL;
|
|
|
|
|
|
|
|
|
|
ok += g->grid.cell_volumes != NULL;
|
|
|
|
|
ok += g->grid.cell_centroids != NULL;
|
|
|
|
|
|
|
|
|
|
return ok == 5;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void compute_geometry(struct CornerpointGrid *g)
|
|
|
|
|
{
|
|
|
|
|
int ok;
|
|
|
|
|
|
|
|
|
|
ok = allocate_geometry(g);
|
|
|
|
|
|
|
|
|
|
if (ok) {
|
|
|
|
|
compute_face_geometry(nd, g->grid.node_coordinates, nf,
|
|
|
|
|
g->grid.face_nodepos, g->grid.face_nodes,
|
|
|
|
|
g->grid.face_normals, g->grid.face_centroids,
|
|
|
|
|
g->grid.face_areas);
|
|
|
|
|
|
|
|
|
|
compute_cell_geometry(nd, g->grid.node_coordinates,
|
|
|
|
|
g->grid.face_nodepos, g->grid.face_nodes,
|
|
|
|
|
g->grid.face_cells, g->grid.face_normals,
|
|
|
|
|
g->grid.face_centroids, nc,
|
|
|
|
|
g->grid.cell_facepos, g->grid.cell_faces,
|
|
|
|
|
g->grid.cell_centroids, g->grid.cell_volumes);
|
|
|
|
|
}
|
|
|
|
|
}
|