/***********************************************************************
*
* ELMER, A Computational Fluid Dynamics Program.
*
* Copyright 1st April 1995 - , Center for Scientific Computing,
* Finland.
*
* All rights reserved. No part of this program may be used,
* reproduced or transmitted in any form or by any means
* without the written permission of CSC.
*
* Address: Center for Scientific Computing
* Tietotie 6, P.O. BOX 405
* 02101 Espoo, Finland
* Tel. +358 0 457 2001
* Telefax: +358 0 457 2302
* EMail: Jari.Jarvinen@csc.fi
************************************************************************/
/***********************************************************************
Program: ELMER Front
Module: ecif_modelMeshManager.h
Language: C++
Date: 13.04.00
Version: 1.00
Author(s): Martti Verho
Revisions:
Abstract: Model mesh manager class. Helper class for hanfling mesh related stuff
************************************************************************/
#ifndef _ECIF_MODEL_MESH_MGR_
#define _ECIF_MODEL_MESH_MGR_
#include "ecif_model.h"
class ModelMeshManager {
friend class Control;
friend class Model;
public:
static void initClass(Model* model);
protected:
ModelMeshManager();
~ModelMeshManager();
int addMeshBoundaryElement(int bndr_tag, meshElementCode elem_code,
int paren1_tag, int parent2_tag, const int* node_ids,
bool& is_added_to_bndr);
int addMeshBoundaryElement(BodyElement* boundary, meshElementCode elem_code,
int ext_parent1_tag, int ext_parent2_tag, const int* node_ids,
bool& is_added_to_bndr);
int addMeshBoundaryElement(BodyElement* boundary, meshElementCode elem_code,
int int_parent1_tag, int int_parent2_tag,
int nof_nodes, const int* int_node_ids,
bool& is_added_to_bndr);
Rc addMeshBulkElement(int ext_id, int material_id,
meshElementCode elem_code, const int* node_ids,
int nof_ngbrs = 0, const int* ngbr_ids = NULL);
Rc addMeshNode(int int_id, int ext_id, Point3& point);
Rc addMeshInputElement(int elem_type,
int ext_elem_id, int parent_tag, int ext_parent_tag,
int* node_ids);
void allocateMeshBodies(int nof_bodies);
void allocateMeshBoundaryElements(int nof_elements);
void allocateMeshBulkElements(int nof_elements, int max_element_id);
void allocateMeshNodes(int nof_nodes, int max_node_id);
void allocateMeshInputElements(int nof_elements, int max_ext_elem_id);
void calcMeshBoundaryNodeNormals();
bool checkMeshElement(meshElementCode elem_code, int* node_ids, bool swap_to_ccw);
bool checkMeshElements(MeshElementTable* table, bool swap_to_ccw);
bool checkMeshElement303(int* node_ids, bool swap_to_ccw);
bool checkMeshElement306(int* node_ids, bool swap_to_ccw);
bool checkMeshElement404(int* node_ids, bool swap_to_ccw);
bool checkMeshElement408(int* node_ids, bool swap_to_ccw);
bool checkMeshElement504(int* node_ids, bool swap_to_ccw);
bool checkMeshElement508(int* node_ids, bool swap_to_ccw);
bool checkMeshElement510(int* node_ids, bool swap_to_ccw);
bool checkMeshElement808(int* node_ids, bool swap_to_ccw);
bool checkMeshElement820(int* node_ids, bool swap_to_ccw);
void checkMeshElementType(int elem_type, bool& is_bulk, bool& is_bndr, bool& is_edge);
void checkMeshInputBoundaryElements();
void classifyMeshCornerElements();
int convertElementCode(meshElementCode element_code);
meshElementCode convertElementType(int element_type);
void convertMeshBulkElementIdsExt2Int();
void correctMeshZeroVelocityElements();
void createMeshBodies();
void createMeshBoundaries(int nof_bulk_bndr_elems, bool* free_bulk_bndr_elems);
void createMeshBoundaryElements(int nof_bulk_bndr_elems,
bool* free_bulk_bndr_elems,
BodyElement*** boundary_table);
void createMeshBodyTables();
//void createMeshBulkElementEdges();
void createMeshElementEdges(MeshElementTable* source, MeshElementTable* target);
void createMeshSubElements(int hlevel, int min_nof_parents);
void findMeshBoundaryBorders();
void findMeshBoundaryParents(int nof_bulk_bndr_elems, bool* free_bulk_bndr_flags);
void findMeshCornerElements();
void findMeshElementEdges(MeshElementTable* source, int& nof_edge_elements);
void findMeshElementNeighbors(MeshElementTable* source);
void findMeshElementNodeParents(MeshElementTable* source, int nof_nodes, int*& nofNodeParents, int**& nodeParentIds);
void findNofBulkBoundaryElements(int& nof_boundary_elements);
int findSelectedMeshBoundaryElement(Renderer* renderer, Point3& ray_start, Point3& ray_dir,
bool try_current_bndr,
int& bndr_id,
int& bd1_id, int& layer1_id,
int& bd2_id, int& layer2_id);
MeshCornerElement* getMeshCornerElement(int index);
void getMeshBoundingBox(RangeVector rv) const;
int getMeshBulkElementIdExt2Int(int ext_id);
int getMeshBulkElementIdInt2Ext(int int_id);
int getMeshInputElementIdExt2Int(int ext_id);
int getMeshInputElementType(int elem_id);
int getMeshNodeIdExt2Int(int ext_id);
int getMeshNodeIdInt2Ext(int int_id);
int getNofActiveMeshingBoundaryPoints();
Rc installMeshInputBulkElements(bool clear_nodes);
Rc installMeshInputBoundaryElements(bool clear_nodes);
Rc installMeshInputElements(bool clear_nodes);
bool isMeshInputBulkElement(int elem_id);
//bool meshBoundaryElementSelected(Renderer* renderer, int fem_id);
//bool meshBoundaryElementSelected(Renderer* renderer, Point3& ray_start, Point3& ray_dir);
//bool meshBulkElementSelected(Renderer* renderer, int fem_id);
void reallocateMeshBoundaryElements(int new_size);
void removeMeshGeometry();
void removeMeshInputElements();
void resetMeshEdgesSelected();
void resetMeshRendered();
void resetMeshSelected();
void selectMeshBoundaryElement(int fem_id);
void selectMeshBoundaryElements();
void selectMeshBoundaryElementsUndo();
void selectMeshBoundaryElementsRedo();
void selectMeshBoundaryElementsAll();
void selectMeshBoundaryElementsByNeighbor();
void selectMeshBoundaryElementsByNormal();
void selectMeshBoundaryElementsByPlane();
void setMeshBodyExt2IntFlag(int external_id);
void setMeshBulkElementParentId(int elem_id, int parent_id);
void setMeshInputElementIsAdded(int elem_id, bool value);
void setMeshInputElementParentTag(int elem_id, int parent_tag);
void setMeshInputElementExtParentTag(int elem_id, int ext_parent_tag);
void setMeshNodes();
void setMeshData(MeshData* mesh_data, MeshInfo* mesh_info, BoundBox* mesh_box);
void setModelData(ModelData* model_data, ModelInfo* model_info);
void unselectMeshBoundaryElement(int fem_id);
protected:
void getMeshRangeVector(RangeVector rv) const;
void normalizeMeshPoints();
void sortMeshBoundaryIndices();
void splitMeshCornerElement(MeshCornerElement* mce);
static Control* theControlCenter;
static Model* model;
MeshInputElement* meshInputElements;
int* meshInputElementsExt2Int;
int meshInputElementsMaxExtId;
int nofMeshInputElements;
int nofMeshInputBoundaryElements;
int nofMeshInputBulkElements;
int nofMeshInputEdgeElements;
int nofMeshInputVertexElements;
int nofAllocMeshInputElements;
// NOTE: These pointers are set by the Model
// Do NOT delete them in this class!!!
//
MeshData* meshData;
MeshInfo* meshInfo;
BoundBox* meshBox;
ModelData* modelData;
ModelInfo* modelInfo;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1