Geometria.hpp
Ir a la documentación de este archivo.
1 // Clase base para generar una geometria //
3 // Revisión: 1 de Junio del 2006 //
4 // //
5 // //
6 // Análisis y Diseño y Programación: //
7 // //
8 // Nombre: Antonio Carrillo Ledesma //
9 // E-mail: acl@www.mmc.geofisica.unam.mx //
10 // Página: http://www.mmc.geofisica.unam.mx/acl //
11 // //
12 // //
13 // Este programa es software libre. Puede redistribuirlo y/o modificarlo //
14 // bajo los términos de la Licencia Pública General de GNU según es //
15 // publicada por la Free Software Foundation, bien de la versión 2 de //
16 // dicha Licencia o bien (según su elección) de cualquier versión //
17 // posterior. //
18 // //
19 // Este programa se distribuye con la esperanza de que sea útil, pero SIN //
20 // NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL implícita o sin //
21 // garantizar la CONVENIENCIA PARA UN PROPÓSITO PARTICULAR. Véase la //
22 // Licencia Pública General de GNU para más detalles. //
23 // //
24 // Debería haber recibido una copia de la Licencia Pública General junto //
25 // con este programa. Si no ha sido así, escriba a la Free Software //
26 // Foundation, Inc., en 675 Mass Ave, Cambridge, MA 02139, EEUU. //
27 // //
28 // //
30 
31 
32 #ifndef __Geometria__
33 #define __Geometria__
34 
35 
36 // Tolerancia para saber si dos nodos son iguales
37 #define TOLERANCIA_NODO 1e-14
38 
39 
40 // Tipo de nodo
41 #define CONOCIDO -1
42 #define DESCONOCIDO 0
43 
44 #include "Definiciones.hpp"
45 #include "MatrizTamanoVariable.hpp"
46 #include "MatrizDensa.hpp"
47 #include "MatrizInt.hpp"
48 #include "VectorInt.hpp"
49 #include <stdlib.h>
50 
51 
52 
54 
59 class Geometria
60 {
61 
62 protected:
63 
66 
69 
72 
74 
77 
80 
83 
85  int N_N;
86 
88  int N_E;
89 
91  int DIM;
92 
94  int NNE;
95 
97  int NMESN;
98 
99 
100 public:
101 
103  Geometria(void)
104  {
105  EL = NULL;
106  ND = NULL;
107  NN = NULL;
108  TN = NULL;
109  EE = NULL;
110  }
111 
114  {
115  delete EL;
116  delete ND;
117  delete NN;
118  delete TN;
119  delete EE;
120  }
121 
123  virtual void generaGeometria(void) = 0;
124 
126 
127  inline int retornaParticion(int i)
128  {
129  return Particion[i];
130  }
131 
133 
134  inline int retornaNumeroNodos(void)
135  {
136  return N_N;
137  }
138 
140 
141  inline int retornaNumeroElementos(void)
142  {
143  return N_E;
144  }
145 
147 
148  inline int retornaNodosElemento(void)
149  {
150  return NNE;
151  }
152 
154 
155  inline int retornaDimension(void)
156  {
157  return DIM;
158  }
159 
161 
164  inline ldouble retornaValorNodo(int nodo, int Xi)
165  {
166 
167  if (Xi == 0) // Coordenada X
168  {
169  int ix = nodo % (Particion.retorna(0) +1);
170  return ND->retorna(Xi,ix);
171  }
172  else if (Xi == 1) // Coordenada Y
173  {
174  while (nodo >= ((Particion.retorna(0) +1) *(Particion.retorna(1) +1))) nodo -= ((Particion.retorna(0) +1) *(Particion.retorna(1) +1));
175  int iy = nodo / (Particion.retorna(0) +1);
176  return ND->retorna(Xi,iy);
177  }
178  // Coordenada Z
179  int iz = nodo / ((Particion.retorna(0) +1) *(Particion.retorna(1) +1));
180  return ND->retorna(Xi,iz);
181  }
182 
184 
186  inline void retornaValorNodo(int nodo, ldouble *coord)
187  {
188  for (int i = 0; i < DIM; i++)
189  {
190  coord[i] = retornaValorNodo(nodo, i);
191  }
192  }
193 
194  //~ /// Establece el valor de la coordenada especificada del nodo
195  //~ /** @param nodo Número de nodo
196  //~ @param xi Número de coordenada a cambiar
197  //~ @param val Valor de la coordenada*/
198  //~ inline void estableceValorNodo(int nodo, int xi, ldouble val)
199  //~ { ND->asigna(xi,nodo,val); }
200 
202 
205  inline int retornaNumeroNodo(int elemento, int nodo)
206  {
207  return EL->retorna(elemento,nodo);
208  }
209 
211 
212  inline int numeroElementosSoporteNodo(void)
213  {
214  return NMESN;
215  }
216 
218  inline void inicializaNumeracionNodos(void)
219  {
220  NN->inicializa(0);
221  }
222 
224 
225  inline int retornaNumeracionNodo(int nodo)
226  {
227  return NN->retorna(nodo);
228  }
229 
231 
233  inline void estableceNumeroNodo(int nodo, int n)
234  {
235  NN->asigna(nodo,n);
236  }
237 
239 
240  void visualizaElementosContienenNodo(int nd);
241 
243 
247  int retornaElementosContienenNodo(int nd, int *el, int nel);
248 
250 
251  void visualizaNodosElemento(int ne);
252 
254 
256 
258  void numeraNodos(void);
259 
261 
264  int retornaNodosConocidos(int *nds, int nnds);
265 
267 
268  int retornaNumeroNodosConocidos(void);
269 
271 
276  int regresaNodosSatisfagan(ldouble val, int ind, int *arr, int narr);
277 
279 
282  void marcaNodosSatisfagan(ldouble val, int ind, int mc);
283 
285 
293  int regresaNodosSatisfagan(ldouble val, int ind, int *arr, int narr, int ind1, ldouble exc1, ldouble exc2);
294 
296 
302  void marcaNodosSatisfagan(ldouble val, int ind, int mc, int ind1, ldouble exc1, ldouble exc2);
303 
305 
307  inline void marcaNodo(int nd, int mc)
308  {
309  estableceNumeroNodo(nd, mc);
310  numeraNodos();
311  }
312 
314 
317  void retornaNodosElemento(int ne, int *nd, int nnd)
318  {
319  EL->retorna(ne-1,nd,NNE);
320  for (int i = NNE; i < nnd; i++) nd[i] = -1;
321  }
322 
324 
325  inline void errorSolicitudMemoria(const char *cad)
326  {
327  printf("\nError falta de memoria en: %s\n",cad);
328  exit(1);
329  }
330 
332 
334  {
335  return Dominio;
336  }
337 
339 
341  inline int retornaTipoNodo(int nd)
342  {
343  return TN->retorna(nd);
344  }
345 
347  inline void visualizaTipoNodos(void)
348  {
349  TN->visualiza();
350  }
351 
352 
354  void generaSoporteNodos(void);
355 
358  {
359  EE->visualiza();
360  }
361 
363  inline void liberaSoporteNodos(void)
364  {
365  delete EE;
366  EE = NULL;
367  }
368 
370  virtual void visualizaCoordenadasDominio(void) = 0;
371 
373  void visualizaElementos(void);
374 
376  void visualizaNodos(void);
377 
378 
380 
381  void grabaGeometria(const char *arch)
382  {}
383 
385 
386  void leeGeometria(const char *arch)
387  {}
388 
389 
390  void visualiza(void)
391  {
394  visualizaNodos();
395  }
396 };
397 
398 #endif
399 
400 
401 
402 //~ /// Establece el numero de nodo del elemento
403 //~ inline void establece_Numero_nodo(int elemento, int nodo, int nd)
404 //~ {
405 //~ EL->asigna(elemento,nodo,nd);
406 //~ }
407 
MatrizDensa coordenadasDominio(void)
Retrona las coordenadas del dominio.
Definition: Geometria.hpp:333
int retorna(const int ren, const int col)
Retorna el valor del renglon y columna solicitado.
Definition: MatrizInt.hpp:111
void estableceNumeroNodo(int nodo, int n)
Establece la numeracion de los nodos.
Definition: Geometria.hpp:233
int NNE
Numero de nodos por elemento.
Definition: Geometria.hpp:94
void visualizaTipoNodos(void)
Visualiza el tipo de nodo dentro del dominio positivo es desconocido, negativo es conocido...
Definition: Geometria.hpp:347
ldouble retornaValorNodo(int nodo, int Xi)
Retorna la coordenada especificada del nodo.
Definition: Geometria.hpp:164
void visualizaNodosElemento(int ne)
Visualiza a los nodos del elemento NE.
Definition: Geometria.cpp:95
ldouble retorna(const int ren, const int col)
Retorna valor almacenado en el renglon y la columna indicada.
Definition: MatrizTamanoVariable.hpp:119
MatrizDensa Dominio
Dominio de la geometria.
Definition: Geometria.hpp:65
int retornaParticion(int i)
Retorna partición del dominio.
Definition: Geometria.hpp:127
void inicializaNumeracionNodos(void)
Inicializa la numeración de nodos.
Definition: Geometria.hpp:218
int NMESN
Numero máximo de elementos que son soporte de un nodo.
Definition: Geometria.hpp:97
void visualizaNodos(void)
Visualiza las coordenadas de los nodos.
Definition: Geometria.cpp:401
Clase para el trabajar con matrices con etradas enteras.
Definition: MatrizInt.hpp:43
void marcaNodo(int nd, int mc)
Marca el nodo nd con el valor mc.
Definition: Geometria.hpp:307
~Geometria()
Destructor de la clase.
Definition: Geometria.hpp:113
virtual void generaGeometria(void)=0
Genera la geometria.
int DIM
Dimension a trabajar.
Definition: Geometria.hpp:91
Clase para el trabajar con matrices densas de punto flotante.
Definition: MatrizDensa.hpp:44
Clase para el trabajar con matrices de tamaño variable.
Definition: MatrizTamanoVariable.hpp:44
void numeraNodos(void)
Numera nodos, (< 0) conocido, (>=0) desconocido.
Definition: Geometria.cpp:117
void visualizaSoporteNodos(void)
Visualiza el soporte de cada nodo.
Definition: Geometria.hpp:357
void visualiza(void)
Visualiza la matriz.
Definition: MatrizInt.cpp:167
void generaSoporteNodos(void)
Genera arreglo de soporte de cada nodo.
Definition: Geometria.cpp:309
void errorSolicitudMemoria(const char *cad)
Aviso de error al solicitar memoria.
Definition: Geometria.hpp:325
void visualizaElementos(void)
Visualiza los nodos de los elementos.
Definition: Geometria.cpp:383
Clase para el trabajar con vectores con valores enteros.
Definition: VectorInt.hpp:46
void asigna(const int col, const int val)
Asigna el valor val a la columna col.
Definition: VectorInt.hpp:202
int retornaElementosContienenNodo(int nd, int *el, int nel)
Regresa un arreglo EL de los elementos que contienen al nodo ND.
Definition: Geometria.cpp:78
Clase base para generar una geometria.
Definition: Geometria.hpp:59
VectorInt * NN
Puntero a un VectorInt que contiene a la numeracion de nodos.
Definition: Geometria.hpp:76
VectorInt * TN
Puntero a un VectorInt que contiene el tipo de nodo.
Definition: Geometria.hpp:79
int retornaNumeroNodosDesconocidos(void)
Regresa el numero de nodos desconocidos.
Definition: Geometria.cpp:105
int retornaDimension(void)
Retorna la dimensión de la geometría
Definition: Geometria.hpp:155
void visualiza(void)
Definition: Geometria.hpp:390
MatrizInt * EL
Puntero a una MatrizInt que contiene a los nodos de los elementos.
Definition: Geometria.hpp:71
MatrizTamanoVariable * ND
Definition: Geometria.hpp:73
void visualiza(int nl=0, int num=0)
Visualiza el vector.
Definition: VectorInt.cpp:69
void retornaValorNodo(int nodo, ldouble *coord)
Retorna la coordenada especificada del nodo.
Definition: Geometria.hpp:186
int N_N
Numero de nodos.
Definition: Geometria.hpp:85
int regresaNodosSatisfagan(ldouble val, int ind, int *arr, int narr)
Regresa en el arreglo ARR de tamaño NARR los nodos que satisfacen la condicion de tener el valor VAL e...
Definition: Geometria.cpp:178
void visualizaElementosContienenNodo(int nd)
Visualiza a los elementos que contienen al nodo ND.
Definition: Geometria.cpp:56
void leeGeometria(const char *arch)
Lee la geometria a un archivo.
Definition: Geometria.hpp:386
int retornaNumeracionNodo(int nodo)
Retorna la numeracion de los nodos.
Definition: Geometria.hpp:225
int retornaNumeroNodo(int elemento, int nodo)
Retorna el número de nodo del elemento.
Definition: Geometria.hpp:205
int retornaNodosConocidos(int *nds, int nnds)
Retorna en un arreglo los nodos conocidos asi como su numero.
Definition: Geometria.cpp:137
int retorna(const int col)
Retorna el valor de la columna col.
Definition: VectorInt.hpp:210
MatrizInt * EE
Puntero a una MatrizInt que contiene a los elementos que contienen al nodo.
Definition: Geometria.hpp:82
virtual void visualizaCoordenadasDominio(void)=0
Visualiza coordenadas del dominio.
void retornaNodosElemento(int ne, int *nd, int nnd)
Regresa un arreglo ND de los nodos del elemento NE.
Definition: Geometria.hpp:317
Geometria(void)
Constructor de la clase.
Definition: Geometria.hpp:103
VectorInt Particion
Particion del dominio.
Definition: Geometria.hpp:68
int N_E
Numero de elementos.
Definition: Geometria.hpp:88
int retornaNumeroElementos(void)
Retorna el numero de elementos en el dominio.
Definition: Geometria.hpp:141
void grabaGeometria(const char *arch)
Graba la geometria a un archivo.
Definition: Geometria.hpp:381
int retornaTipoNodo(int nd)
Retorna el tipo de nodo dentro del dominio positivo es desconocido, negativo es conocido, (1) Interior , (2) cara, (3) Vertice.
Definition: Geometria.hpp:341
int retornaNumeroNodos(void)
Regresa el número de nodos en el dominio.
Definition: Geometria.hpp:134
int numeroElementosSoporteNodo(void)
Retorna el número de elementos en el soporte de un nodos.
Definition: Geometria.hpp:212
int retornaNumeroNodosConocidos(void)
Retorna el numero de nodos conocidos.
Definition: Geometria.cpp:161
int retornaNodosElemento(void)
Retorna el número de nodos por elemento.
Definition: Geometria.hpp:148
void marcaNodosSatisfagan(ldouble val, int ind, int mc)
Marca con el valor MC a los nodos que satisfacen la condicion de tener el valor VAL en la componente ...
Definition: Geometria.cpp:211
void liberaSoporteNodos(void)
Libera arreglo de soporte de cada nodo.
Definition: Geometria.hpp:363
void inicializa(const int val)
Inicializa el vector al valor val indicado.
Definition: VectorInt.cpp:59