pre-refine implemented as mesh specific function

This commit is contained in:
2011-05-20 14:02:05 +00:00
parent 22c45153a8
commit 5b6e145e87
4 changed files with 57 additions and 51 deletions
-51
View File
@@ -296,55 +296,6 @@ h5t_mark_entity (
H5_CORE_API_RETURN (h5priv_insert_idlist (&t->marked_entities, entity_id, -1));
}
/*
When calling this function, we know the number of elements to refine. But
we don't now the number of new vertices we will get. We have to compute
this number or just to guess it.
Let n be the number of elements to refine and l the number of disconnected
areas to be refined.
For triangle grids the upper limit of new vertices is 3n and the lower limit
2n + 1. The exact number is 2n + l.
For tetrahedral grids the upper limit is 6n and the lower limit is 3n+3.
The exact number is 3n + 3l.
To get the real number of vertices to add, we either have to compute the
number of disconnected areas (which is quiet expensive), try to guess it
(which is impossible) or just set a limit. In most cases the number of
disconnected areas will be "small".
For the time being we set the maximum number of disconnected areas to 64.
*/
h5_err_t
h5t_pre_refine (
h5_file_t* const f
) {
H5_CORE_API_ENTER1 (h5_err_t, "f=0x%p", f);
h5t_fdata_t* const t = f->t;
unsigned int num_elems_to_refine = t->marked_entities->num_items;
unsigned int num_elems_to_add = 0;
unsigned int num_vertices_to_add = 0;
switch (t->mesh_type) {
case H5_OID_TETRAHEDRON:
num_vertices_to_add = num_elems_to_refine*3 + 192;
num_elems_to_add = num_elems_to_refine*8;
break;
case H5_OID_TRIANGLE:
num_vertices_to_add = num_elems_to_refine*2 + 64;
num_elems_to_add = num_elems_to_refine*4;
break;
default:
H5_CORE_API_LEAVE (h5_error_internal ());
}
TRY (h5t_begin_store_vertices (f, num_vertices_to_add));
TRY (h5t_begin_store_elems (f, num_elems_to_add));
H5_CORE_API_RETURN (H5_SUCCESS);
}
/*
Refine previously marked elements.
*/
@@ -372,7 +323,6 @@ h5t_post_refine (
H5_CORE_API_RETURN (h5priv_free_idlist (&t->marked_entities));
}
h5_err_t
h5t_begin_refine_elems (
h5_file_t* const f
@@ -388,7 +338,6 @@ h5t_begin_refine_elems (
H5_CORE_API_RETURN (H5_SUCCESS);
}
h5_err_t
h5t_end_refine_elems (
h5_file_t* const f
+8
View File
@@ -3,6 +3,7 @@
struct h5t_store_methods {
h5_err_t (*alloc_elems)(h5_file_t* const, const size_t, const size_t);
h5_err_t (*pre_refine)(h5_file_t* const);
h5_loc_idx_t (*refine_elem)(h5_file_t* const, const h5_loc_idx_t);
h5_err_t (*end_store_elems)(h5_file_t* const);
h5_err_t (*get_direct_children_of_edge)(
@@ -33,6 +34,13 @@ h5tpriv_alloc_elems (
return (*f->t->methods.store->alloc_elems) (f, cur, new);
}
static inline h5_err_t
h5tpriv_pre_refine (
h5_file_t* const f
) {
return f->t->methods.store->pre_refine (f);
}
static inline h5_loc_idx_t
h5tpriv_refine_elem (
h5_file_t * const f,
+33
View File
@@ -127,6 +127,38 @@ bisect_edge (
H5_PRIV_FUNC_RETURN (h5t_store_vertex (f, -1, P)); // return idx of new vertex
}
/*
When calling this function, we know the number of elements to refine. But
we don't now the number of new vertices we will get. We have to compute
this number or just to guess it.
Let n be the number of elements to refine and l the number of disconnected
areas to be refined.
For triangle grids the upper limit of new vertices is 3n and the lower limit
2n + 1. The exact number is 2n + l.
For tetrahedral grids the upper limit is 6n and the lower limit is 3n+3.
The exact number is 3n + 3l.
To get the real number of vertices to add, we either have to compute the
number of disconnected areas (which is quiet expensive), try to guess it
(which is impossible) or just set a limit. In most cases the number of
disconnected areas will be "small".
For the time being we set the maximum number of disconnected areas to 64.
*/
static h5_err_t
pre_refine_tet (
h5_file_t* const f
) {
H5_CORE_API_ENTER1 (h5_err_t, "f=0x%p", f);
unsigned int num_elems_to_refine = f->t->marked_entities->num_items;
TRY (h5t_begin_store_vertices (f, num_elems_to_refine*3 + 192));
TRY (h5t_begin_store_elems (f, num_elems_to_refine*8));
H5_CORE_API_RETURN (H5_SUCCESS);
}
/*!
Refine tetrahedron \c elem_idx
@@ -311,6 +343,7 @@ end_store_elems (
struct h5t_store_methods h5tpriv_tetm_store_methods = {
alloc_tets,
pre_refine_tet,
refine_tet,
end_store_elems,
get_direct_children_of_edge
+16
View File
@@ -120,6 +120,21 @@ bisect_edge (
H5_PRIV_FUNC_RETURN (h5t_store_vertex (f, -1, P));
}
/*
Please read note about number of new vertices in tetrahedral
mesh implementation.
*/
static h5_err_t
pre_refine_triangle (
h5_file_t* const f
) {
H5_CORE_API_ENTER1 (h5_err_t, "f=0x%p", f);
unsigned int num_elems_to_refine = f->t->marked_entities->num_items;
TRY (h5t_begin_store_vertices (f, num_elems_to_refine*2 + 64));
TRY (h5t_begin_store_elems (f, num_elems_to_refine*4));
H5_CORE_API_RETURN (H5_SUCCESS);
}
/*!
Refine triangle \c local_eid
@@ -271,6 +286,7 @@ end_store_elems (
struct h5t_store_methods h5tpriv_trim_store_methods = {
alloc_triangles,
pre_refine_triangle,
refine_triangle,
end_store_elems,
get_direct_children_of_edge