Geometria_2D.hpp
Ir a la documentación de este archivo.
1 // Clase base para generar una geometría en dos dimensiones //
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 
33 #ifndef __Geometria_2D__
34 #define __Geometria_2D__
35 
36 #include "Geometria.hpp"
37 
38 
40 
45 class Geometria_2D : public Geometria
46 {
47 
48 public:
49 
52  {
53  Dominio.redimensiona(2,2);
55  }
56 
58  virtual void inicializa(MatrizDensa *dm, int partx, int party) = 0;
59 
61 
64  int coordenadasDentroDominio(ldouble x, ldouble y)
65  {
66  if (x < (Dominio.retorna(0,0) - TOLERANCIA_NODO) || x > (Dominio.retorna(1,0) + TOLERANCIA_NODO) ) return 0;
67  if (y < (Dominio.retorna(0,1) - TOLERANCIA_NODO) || y > (Dominio.retorna(1,1) + TOLERANCIA_NODO) ) return 0;
68  return 1;
69  }
70 
71 
72  // Retorna el numero de nodo que tiene coordenadas Coor, si no pertenece -1
76  int retornaNodoCoord(ldouble x, ldouble y);
77 
78 
80 
83  inline void coordenadasNodo(int nd, ldouble &x, ldouble &y)
84  {
85  int ix = nd % (Particion.retorna(0) +1);
86  while (nd >= ((Particion.retorna(0) +1) *(Particion.retorna(1) +1))) nd -= ((Particion.retorna(0) +1) *(Particion.retorna(1) +1));
87  int iy = nd / (Particion.retorna(0) +1);
88  x = ND->retorna(0,ix);
89  y = ND->retorna(1,iy);
90  }
91 
92  //~ /// Establece las coordenadas del nodo
93  //~ /** @param nodo Número de nodo
94  //~ @param x Coordenada X
95  //~ @param y Coordenada Y */
96  //~ inline void estableceValorCoordenadas(int nodo, ldouble x, ldouble y)
97  //~ {
98  //~ ND->asigna(0,nodo,x);
99  //~ ND->asigna(1,nodo,y);
100  //~ }
101 
103 
106  void coordenadasElemento(int el, ldouble *x, ldouble *y);
107 
109 
110  inline int numeroMaximoNodosFrontera(void)
111  {
112  return (2 * Particion.retorna(0) + 2 * Particion.retorna(1));
113  }
114 
115  //~ /// Retrona las coordenadas del dominio
116  //~ /** @param ini Puntero a las coordenadas iniciales del dominio
117  //~ @param fin Puntero a las coordenadas finales del dominio */
118  //~ inline void Coordenadas_dominio(ldouble *ini, ldouble *fin)
119  //~ {
120  //~ ini[0] = Dominio[0][0];
121  //~ ini[1] = Dominio[0][1];
122  //~ fin[0] = Dominio[1][0];
123  //~ fin[1] = Dominio[1][1];
124  //~ }
125 
126  //~ /// Regresa los nodos externos en un arreglo ARR y numero ND
127  //~ /** @param arr Puntero a un arreglo de nodos
128  //~ @param nd Número de nodos */
129  //~ void Regresa_Nodos_externos(int *arr, int nd);
130 
131  //~ /// Marca los nodos externos con el valor MC
132  //~ /** @param mc Valor a usar de marca */
133  //~ void Marca_Nodos_Externos(int mc);
134 
136 
139  int retornaNodosAdyacentes(int nd, int *nds, int nnds);
140 
142  void calculaTipoNodo(void);
143 
145 
146  int retornaNumeroNodosVertices(void);
147 
149 
150  int retornaNumeroNodosCaras(void);
151 
153 
154  int retornaNodoCoord(ldouble coor);
155 
157  int retornaNumeracionNodoFrontera(int nodo);
158 
160 
161  virtual ldouble areaElemento(int el) = 0;
162 
165  {
166 #ifdef __Double__
167  printf("\nDominio: (%f,%f) a (%f,%f)\n\n",Dominio.retorna(0,0),Dominio.retorna(0,1),Dominio.retorna(1,0),Dominio.retorna(1,1));
168 #else
169  printf("\nDominio: (%Lf,%Lf) a (%Lf,%Lf)\n\n",Dominio.retorna(0,0),Dominio.retorna(0,1),Dominio.retorna(1,0),Dominio.retorna(1,1));
170 #endif
171  }
172 
173 };
174 
175 #endif
virtual ldouble areaElemento(int el)=0
Regresa el valor del área del elemento.
ldouble retorna(const int ren, const int col)
Retorna valor almacenado en el renglon y la columna indicada.
Definition: MatrizTamanoVariable.hpp:119
int numeroMaximoNodosFrontera(void)
Número máximo de nodos en la frontera.
Definition: Geometria_2D.hpp:110
Geometria_2D(void)
Constructor de la clase.
Definition: Geometria_2D.hpp:51
int retornaNodoCoord(ldouble x, ldouble y)
Definition: Geometria_2D.cpp:39
MatrizDensa Dominio
Dominio de la geometria.
Definition: Geometria.hpp:65
Clase para el trabajar con matrices densas de punto flotante.
Definition: MatrizDensa.hpp:44
int retornaNumeroNodosCaras(void)
Retorna el número de nodos en caras.
Definition: Geometria_2D.cpp:192
#define TOLERANCIA_NODO
Definition: Geometria.hpp:37
void calculaTipoNodo(void)
Calcula el tipo de nodo dentro del dominio positivo es desconocido, negativo es conocido (1) Interior...
Definition: Geometria_2D.cpp:129
int retornaNumeroNodosVertices(void)
Retorna el número de nodos en vertices.
Definition: Geometria_2D.cpp:176
Clase base para generar una geometria.
Definition: Geometria.hpp:59
void redimensiona(int nren, int ncol)
Constructor de la clase.
Definition: MatrizDensa.hpp:118
void coordenadasNodo(int nd, ldouble &x, ldouble &y)
Retorna las coordenadas del nodo especificado.
Definition: Geometria_2D.hpp:83
MatrizTamanoVariable * ND
Definition: Geometria.hpp:73
virtual void inicializa(MatrizDensa *dm, int partx, int party)=0
Inicializa la geometria.
int retornaNodosAdyacentes(int nd, int *nds, int nnds)
Retorna el numero y nodos adyacentes a un nodo dado.
Definition: Geometria_2D.cpp:87
Clase base para generar una geometria en 2D.
Definition: Geometria_2D.hpp:45
void visualizaCoordenadasDominio(void)
Visualiza coordenadas del dominio.
Definition: Geometria_2D.hpp:164
void redimensiona(int ncol)
Redimensiona el tamaño del vector.
Definition: VectorInt.hpp:140
ldouble retorna(const int ren, const int col)
Retorna el valor del renglon y columna solicitado.
Definition: MatrizDensa.hpp:156
int retorna(const int col)
Retorna el valor de la columna col.
Definition: VectorInt.hpp:210
int coordenadasDentroDominio(ldouble x, ldouble y)
Coordenadas dentro del dominio.
Definition: Geometria_2D.hpp:64
VectorInt Particion
Particion del dominio.
Definition: Geometria.hpp:68
void coordenadasElemento(int el, ldouble *x, ldouble *y)
Regresa las coordenadas del elemento.
Definition: Geometria_2D.cpp:67
int retornaNumeracionNodoFrontera(int nodo)
Retorna la numeración de los nodos.
Definition: Geometria_2D.cpp:210