• No se han encontrado resultados

UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA CIENCIAS BÁSICAS E INGENIERÍA LICENCIATURA EN COMPUTACI~N PROYECTO DE INVESTIGACI~N

N/A
N/A
Protected

Academic year: 2018

Share "UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA CIENCIAS BÁSICAS E INGENIERÍA LICENCIATURA EN COMPUTACI~N PROYECTO DE INVESTIGACI~N"

Copied!
42
0
0

Texto completo

(1)

UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA

CIENCIAS BÁSICAS E INGENIERÍA

LICENCIATURA EN COMPUTACI~N

PROYECTO DE INVESTIGACI~N I Y 11

APROXIMACI~N A UNA ESFERA SÓLIDA POR

UN ENSAMBLE DE TETRAEDROS

TESIS QUE PRESENTAN LOS ALUMNOS: MARTÍNEZ JUÁREZ SERGIO (91220170)

CISNEROS HERNÁNDEZ VELIA MARÍA (87227912)

PARA OBTENCI~N DEL GRADO DE: LICENCIADO EN COMPUTACI~N

ASESOR

DR. OCTAVIO R. ARZATE SOLTERO

(2)

UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA

CIENCIAS BÁSICAS E INGENIERÍA

LICENCIATURA EN COMPUTACI~N

PROYECTO DE INVESTIGACI~N I Y 11

APROXIMACI~N A UNA ESFERA SÓLIDA POR

UN ENSAMBLE DE TETRAEDROS

REPORTE QUE PRESENTAN LOS ALUMNOS: MARTÍNEZ JUÁREZ SERGIO (91220170) CISNEROS HERNÁNDEZ VELIA MARÍA (87227912)

PARA OBTENCI~N DEL GRADO DE:

LICENCIADO EN COMPUTACI~N

ASESOR

DR. OCTAVIO R. ARZATE SOLTERO

(3)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

INTRODUCCION

El motivo de este proyecto es con el fin de Paralelizar dos algoritmos para aproximar una esfera sólida, por una malla de tetraedros compatibles, calculándose tanto las coordenadas de sus vértices como la forma de numerarlos y enlazarlos. El lenguaje que se utilizo fue C*(C star) en la Máquina CMS(Connection Machine System) esto en un ambiente UNIX.

Actualmente existe una gran necesidad de generar algoritmos que sean capaces de generar

mallas de buena calidad para el modelado de sólidos. Los existentes en la literatura no son muchos, si se les compara con los existentes para las mallas planares o mallas de dos dimensiones, embebidas en el espacio. Esto es fundamentalmente debido a que los métodos como el de los mapeos conformes, a pesar de su elegancia no es fácil y a veces ni siquiera posible, usarlos para representar sólidos mas o menos complicados, como reporta T. J. Baker( 1).

Actualmente existe una creciente cantidad de literatura, que reporta métodos para aproximar objetos que se pueden descomponer en conjuntos convexos, u objetos más sencillos utilizando mallas de tetraedros, las cuales también pueden refinarse incluso automáticamente: Olsewsky(2), Bornemann(3), Baehmann(4), Frink(S), Ha11(6), Joe(7), Uemura(8) y Golias(9).

Quizás existan más de esta clase de Algoritmos, pero éstos no son generalmente publicados en la literatura, por ser parte de paquetes comerciales con propiedad intelectual registrada.

(4)

Atxoximación a una Esfera Sólida por un Ensamble de Tetraedros.

INDICE

l . Vista General del Algoritmo 1

2. Código Paralelizado en C* que Genera el Ensamble de Tetraedros 8 3. Código Paralelizado en C* que Transforma las Coordenadas en el Espacio(x,y,z) a

coordenadas en el Plano(x,y). 13

4. El Lenguaje de Programación C* 15

4. l . Un Simple Programa. 15

4.2. Declarando Formas y Variables Paralelas. 16

4.3. Variables Paralelas. 16

4.4. Seleccionando una Forma. 17

4.5. Asignación de Valores a Variables Paralelas. 17

4.6. Realizando Operaciones usando variables paralelas. 17 4.7. Compilación de Programas. 18

4.8. Estructuras Paralelas. 18

4.9. Arreglos Paralelos. 19

4.10. Punteros de Formas y Variables Paralelas. 20

4.11. Asignación Dinámica de Formas y Variables Paralelas. 23

4.12. Operaciones Paralelas. 24

4.13. La Expresión Condicional. 25

4.14. Reducción de Operadores. 26

4.15. Funciones. 27

5. Unix 28

5. 1. El Editor de Textos vi. 30

(5)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

E

ste proyecto es importante no solo por lo interesante del tema sino por la importancia de los Algoritmos que se presentaron en él. Los Algoritmos son de gran interés puesto que se permite la construcción de una esfera con una aproximación de tetraedros. En este reporte se mostraran dos algoritmos los cuales se describirán paso por paso y se mostraran ejemplos detallados de los resultados que estos algoritmos generan.

Los dos algoritmos difieren solamente en la forma de construir los tetraedros, pues el método para generar los puntos en ambos algoritmos es el mismo. Explicaremos la manera de generar los puntos en el espacio así como la forma de pasar estos al plano XY.

Se explicara también como fue que estos dos algoritmos se desarrollaron en estas herramientas y la forma en que fue implementado respectivamente. Para empezar analicemos los dos algoritmos detalladamente.

Analicemos la forma en que se generan los puntos en el espacio, recordemos que se usan coordenadas cilíndricas para el hemisferio norte

1. m = 0 ;

2. x = 0.0, y = 0.0, z = m;

3. Guardar los valores x, y, z en un archivo; 4. k = 1; (Para la pista k del nivel m)

5. rad = k

+

m;

6. 1 = O; ( Para el inicio de la pista)

7. teta = 1

*

pi(3

*

k); ( teta es el ángulo azimutal) x = rad

*

sin(fi)

*

cos(teta);

y = rad

*

sin(fi)

*

sin(teta); z = m ;

8. 1 = l + 1;

9. Si 1 no es mayor que 6

*

k - 1, (Recorrido de la pista) Regresar al paso 7;

1 O. k =

k

+ 1

; ( Nos pasamos a la siguiente pista)

1 l . Si k no es mayor que ne - m, (Para todas las pistas del nivel) Regresar al paso 5;

12. m = m

+ 1;

(Nos pasamos al siguiente nivel)

13. Si m no es mayor que ne; (Para todos los niveles) Regresar al paso 2; fi = acos( m /rad );

(fí

es el ángulo cenital del punto)

Analicemos este algoritmo para poder entender como es que se generan los puntos en el espacio (x, y, 2); Para poder entender esto generemos valores para una semiesfera de 3 niveles.

n O 1 2 3 4 5 6

(6)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

n 7 8 9 I O 11 12 13 14 15 16 17 18

Tabla 2.

n 56 57 58 59 60 61 62 63

Tabla 3.

En esta parte solamente mostramos algunos de los fragmentos que se forman al ejecutar el algoritmo en las tablas la n = numero de punto, m = indica el nivel en el que nos encontramos, 1 = indica el número de sector en el que estamos,

k

= indica el número de pista en el que nos encontramos, x, y, z = nos indican las coordenadas del punto en el espacio. En la Figura que se muestra abajo se dibujaron los puntos que se encuentran en las tablas, es fácil ver como estos comienzan generándose del centro hacia fuera en forma de espiral, esto se realiza en cada nivel en el siguiente nivel se vuelve a comenzar en el centro y otra vez se generan los puntos en forma de espiral hasta llegar a lo que se le denomina polo norte.

Explicaremos paso a paso esto para que quede claro; supongamos que cada nivel es un semi- plano y generemos estos puntos nivel por nivel y después sobrepongamos los planos para generar la semiesfera, generemos el nivel más bajo el nivel 3 (recordemos que nuestra esfera de explicación es de 3 niveles), observemos que los puntos generados en las figuras son algunos de los puntos que aparecen en las tablas mostradas anteriormente, se observa como se generan del centro hacia fuera del circulo que generan. En las figuras se muestra cada nivel y el número correspondiente de punto que le corresponde esto comenzando desde el punto O hasta el punto 63. En la figura 1 se muestra el Nivel O que es el centro de la esfera que se genera (base de la semiesfera que generamos de ejemplos), en la figura 2 se observa el Nivel 1, en la figura 3 se observa el Nivel 2, en la figura 4 se observa el punto de terminal o polo norte de la esfera, por ultimo en la ultima imagen la figura 5 se observa como se observan los puntos totales y la forma de cómo se ven nivel por nivel.

Ahora que ya tenemos los puntos totales que generan la semiesfera en el espacio analicemos como son manipulados antes de proyectarlos en el plano, esto es veamos corno es que se generan los tetraedros a partir de todo el conjunto de puntos que hemos generado.

El primer paso es la triangulación del circulo que se genera cuando hacemos pasar un circulo de radio uno, dos, tres, etc. según el número de niveles con el que contara la esfera, ahora se unen 10s puntos para generar polígonos regulares que están contenidos en una circunferencia Y 10s cuales los puntos de sus vértices están contenidos en está.

(7)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

24 23

25 22

10 I 9 21 26 11

2 , 8 ., 20 27 ..

28 :,

,

29

12 -I4 3

13

4

4 O 1

,: 19 7

5 6

18 I' 36 14 € 15 i t 17 35 30 16 h

31 34

11

33 32

Figura l . Nivel O Se observa que se generan 3 círculos concéntricos y 37 puntos (recordemos que en Este nivel la coordenada z tiene valor O).

47

49

40 39

4 45

50

t

41

I

37 38

44

51 I

55

42 43

3

52 54

53

Figura 2. Nlvel 1 Se observa 19 puntos y que se generan Dos círculos concéntricos (Aquí z = 1).

(8)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

56

Figura - 3. Nivel 2 en este caso únicamente se observa una circunferencia (Aquí z = 2).

63

Figura 4. Contiene é1 ultimo nivel el llamado polo Norte de l a esfera. Este punto es el que termina la esfera (Aquí z = 3).

(9)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Figura 5 . Si todas las figuras anteriores se sobrepone uno encima de la otra a una distancia de una unidad una de la otra obtendríamos una figura en el espacio Como la mostrada en esta figura.

Si unimos el punto 1 con el punto 2 y el 2 con el 3 y así respectivamente hasta cerrar la figura que se genera, y si continuamos uniendo los puntos de las circunferencias que siguen es como se obtienen los polígonos que mencionamos anteriormente ver figura 6, estas líneas son las bases de los círculos que generaremos en cada pista de las circunferencias; en estas pistas tendremos dos tipos de triángulos los que apuntan hacia el centro de la circunferencia (diremos que son de tipo “i”) y los que apuntan hacia fuera de está (diremos que son de tipo “o”) ver figura 7.

Figura 7. En esta figura observamos como se generan los polígonos y el tipo de Triángulos que han sido generados en cada pista.

Ya vimos la forma de generar los puntos en el espacio y de cómo se generan los triángulos en la circunferencia, ahora generemos un prisma entre dos niveles continuos, es decir el triángulo del nivel inferior funciona como base y el superior como tapa y así sucesivamente después de generar los prismas veamos como se generan los tetraedros dentro de cada prisma hasta llenar cada nivel y así poder generar los tetraedros de las orillas del circulo (a lo que llamaremos falda). Supongamos que tenemos un prisma como el mostrado en la figura 8, y que

(10)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

formado por las rectas que se interceptan en los puntos a, b, c, d, e, y el punto f; si unimos los puntos a, b, c y d obtenemos uno de los tres tetraedros que se forman dentro del prisma el otro tetraedro es el formado por los puntos d, e, f y c, el tercer tetraedro no es fácil de visualizar por eso son que se muestran los tres tetraedros separadamente para que se puedan ver sus diferencias y ver también como es que forman el prisma. En la figura 8 observamos un prisma cuyos puntos fueron cambiados para comprender mejor como se generaron los tetraedros:

a = 37; b = 38;

d = 0 ; e = 6;

1

c = 43; f = 1;

Figura 8. En esta figura se observa un prisma triangular en el cual el triángulo de la base es más pequeño que el triángulo de la tapa.

Ahora con el prisma generado obtengamos los tetraedros que se pueden generar a partir de esté; en la parte que denominaremos falda (Esta parte es la parte más externa de la esfera) los tetraedros no se obtienen a partir de este tipo de prismas se generan de una forma que veremos más adelante. Los tetraedros que se generan son para prismas del tipo i de forma parecida se generan los tetraedros para prismas del tipo o.

e

Figura 9. En esta figura observamos como los tetraedros forman el prisma en las siguientes

(11)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Fig. 10. En Esta figura como ya se menciono anteriormente se observan los tres Tetraedros que se generan con el prisma.

Como tal vez no sea tan claro como se generaron los puntos observemos como se generan los tetraedros que se generan con este tipo de prismas para después ver como se genera lo que denominamos falda de la semiesfera. Los tetraedros se generan construyendo primero los más internos de cada nivel hasta llegar al polo norte para después generar lo que llamamos la falda de cada nivel en la siguiente figura se observa la construcción de algunos niveles de la semiesfera. Como se observa no hay ningún nivel concluido totalmente esto por lo que se

(12)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

CODIGO PARALELIZADO(EN C*) QUE GENERA EL ENSAMBLE DE

TETRAEDROS.

#include <stdio.h - >

shape [ 163 84ltetraedro; struct datos {

int n l ;

int n2; int n3; int n4; >;

struct datos: tetraedro tetra;

main() {

struct datos:tetraedro nodosl, nodos2, nodos3; int:tetraedro n l , n2, n3, n4, n5, n6;

int nnn, oen, osn, nc, isn, k, 1, m, conteta, inicio, fin; conteta=O;

nnn=0; oen=0; osn=0;

for(m=O;m<=ne- 1 ;m++)

{

nc=ne-m; isn=oen+ 1 ;

osn=isn+l ;

nnn=isn+ 1 ;

where(O<=pcoord(0)<=5) {

nl=isn;

n2=pcoord(O)+osn; n3=pcoord(O)+osn+l; n4=n 1 +nnn;

where(k==5) n3=osn; if(nc!=l)

{

(13)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

nodos2.n2=n4; nodos2.n3=n3; nodos2.n4=n6;

everywhere(pcoord(O)>=conteta) tetra=[.-conteta]nodosl;

conteta=conteta+6;

everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos2;

conteta=conteta+6;

I

nodos3.nl=n2; nodos3 .n2=n4; nodos3.n3=nl; nodos3.n4=n3;

everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos3;

conteta=conteta+6;

for(l=2;l<=nc- 1 ;I++)

I

{

isn=osn;

osn=isn+6*(1-1); [0]n2=osn+l;

for(i=l;i<=6*(1-l);i++)

{

[i]n2=[i-l]n2+1; if(i%(l-l)==O)

[i]n2=[i]n2+1; }

{

where(0<=pcoord(0)<=6*(1-1)-1)

nl=pcoord(O)+isn; n3=pcoord(O)+isn+l; k=pcoord(O)+l ;

where(k==6*(1-1)-1) n3=isn;

(14)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros. nodos2.n4=n4; nodos3.nl=n2; nodos3.n2=n6; nodos3.n3=n4; nodos3.n4=n5; everywhere(pcoord(O)>=conteta) tetra=[ .-contetalnodos 1 ;

conteta+=6*(1-1); everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos2; conteta+=6*(1-1); everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos3; conteta+=6*(1-1); [O]nl=isn; for(i=l;i<=6*l;i++;) { [i]nl=[i-l]nl+l; if(i%l==O) [i]nl=[i]nl-1; } {

where(O<=pcoord(0)<=6*1- 1)

n2=pcoord(O)+osn; n3=pcoord(O)+osn; k=pcoord(O)+l; where(k==(6*1)-1)

{

n 1 =isn; n3=osn;

(15)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos1 ;

conteta+=6*1;

everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos2;

conteta+=6*1;

everywhere(pcoord(O)>=conteta) tetra=[.-contetalnodos3;

conteta+=6*1;

1

isn=osn;

osn=isn+6*(nc-l); [0]n2=osn+l;

{

[i]n2=[i-ln2+1; if(i%(nc- 1)==0) [i]n2=[i]n2+1;

1

{

nl=pcoord(O)+isn; n3=pcoord(O)+isn+l; k=pcoord(O)+l;

where(k==6*(n~-l)-l) n3=isn;

n4=n 1 +nnn; n6=n3+nnn; nodosl.nl=n2; nodos 1 .n2=n6; nodosl.n3=nl; nodos 1 .n4=n3; nodos2.nl=n2; nodos2.n2=n6; nodos2.n3=nl; nodos2.n4=n4;

for(i=l;i<=b*(nc-l);i++);

where(0<=pcoord(O)<=6*(nc-1)-1)

everywhere(pcoord(O)>=conteta) tetra=[.-conteta]nodosl ;

conteta+=6*(nc-l);

[O]nl=isn;

1

for(i=l ;i<=6*nc;i++)

[i]nl=[i-l]nl+l; if(i%nc==O)

(16)

Aproximación a una Esfera Sólida Dor un Ensamble de Tetraedros.

}

{

where(O<=pcoord(O)<=6*nc- 1)

n2=pcoord(O)+osn; n3=pcoord(O)+osn+l; k=pcoord(O)+l;

where(k==6*nc)

{

n 1 =isn;

1

n3=osn;

n4=n 1 +m;

nodos 1 .nl=n2; nodos 1 .n2=n4; nodosl .n3=nl; nodosl .n4=n3;

everywhere(pcoord(O)>=conteta) tetra=[.-conteta]nodosl;

conteta+=6*nc;

oen=osn+6*nc- 1 ;

}

}

(17)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

CODIGO PARALELIZADO(EN C*) QUE TRANSFORMA LAS COORDENADAS EN

EL ESPACIO(x,y,z) ACOORDENADAS EN EL PLANO(x,y).

#include <stdio.h> #include <math.h>

#define pi "PI

shape [ 1 OO]coordenadas; shape [ 100]espacio; stmct xyz

{

double x;

double y; double z;

L

struct xyz:espacio XYZ;

doub1e:coordenadas tetra x,tetra y,tetra-z; int:coordenadas 1;

doub1e:coordenadas rad,teta,fi;

int m,k,super,infer7cont=0,ne=2,i;

int p l ;

- -

main() {

with(coordenadas)

{

for(m=O;m<=ne;m++)

{

[contltetra-x=O.O; [contltetra-y=O.O; [contltetra-z=m; cont++;

for(k=l;k<=ne-m;k++)

{

rad=k+m; fi =acos(m/rad); infer=cont;

super=cont+(b*k-1); l=pcoord(O)-cont;

where(pcoord(O)>=infer && pcoord(O)<=super)

teta=l*pi/(3*k);

tetrax=rad*sin(fi)*cos(teta);

(18)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

tetra-z=m;

positionsof(physica1);

printf(" number of physical processors %d\n ",(int:physical)pl);

1

cont=super+l ;

1

1

for(k=O;k<=26;k++)

XYZ.x=tetra-x; XYZ.y=tetra - y; XYZ.z=tetra-z;

printf(" %f %f %f\n",[k]tetra-x,[k]tetra-y,[k]tetra-z);

1

printf("Estructura \n\n\n"); with(espaci0)

{

for(k=O;k<=26;++k)

printf("%f %f %flntt,[k]XYZ.x,[k]XYZ.y,[k]XYZ.z);

}

printf(" Shape espacio tiene rango %d y %d posiciones.\n",rankof(espacio),

positionsof(espacio));

I

(19)

ADroximación a una Esfera Sólida por un Ensamble de Tetraedros.

El Lenguaje de Programación

C*

C* es una extensión de el lenguaje de programación C. Diseñado para ayudar en el uso de programas masivamente paralelo y de memoria distribuida de computadoras.

C* mantiene constructores de C tales como tipos de datos, operadores, estructuras, punteros y funciones. Además de soportar también los prototipos de funciones.

C* es una extensión de C con un pequeño conjunto de nuevas características a ayudar en la escritura de programas para computadoras masivamente paralelas. Por ejemplo:

C* provee la palabra reservada shape indica el tamaño y forma del dato paralelo. C* tiene operadores en sus variables paralelas para proveer algunas nuevas operaciones, nuevos operadores y nuevos significados para operadores de C.

0 C* adiciona una palabra reservada (declaración) with que permite elegir la forma a usar

para operaciones paralelas y una palabra reservada where que restringe operaciones a ciertos puntos de datos de la forma.

0 C* extiende estructuras, punteros y funciones de C estándar para que trabajen con datos

paralelos.

C* proporciona formas para interactuar variables paralelas con otras variables paralelas aunque las variables paralelas son de diferentes formas.

UN SIMPLE PROGRAMA

#include <stdio.h>

/* 1 .- Declaración de la forma y las variables*/ shape [2][32768]ShapeA;

int ShapeA p l , p2, p3; int sum=0;

main()

/*2.- Seleccionar la forma*/ with (ShapeA)

{

/*3.- Asignar valores a dos de las variables paralelas*/ p l = l ;

p2=2;

/*4.- Adicionar éstas y asignar el resultado a la tercer variable paralela*/ p3= pl+p2;

/*5.- Imprimir la suma de un elemento de p3*/

printf("La suma en un elemento es %d\n", [O][l]p3);

/*6.- Calcular e imprimir la suma en todos los elementos de p3*/ sum+=p3;

printf("La suma en todos los elementos es %d\n", sum);

1

(20)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

DECLARANDO FORMAS Y VARIABLES PARALELAS

Shapes el paso inicial en relación con datos paralelos en un programa, es la forma en que el dato será organizado.

Shape [2][32768]ShapeA, en donde

[2] = rango, dimensión. [32768] = No. de posiciones

O 3

...

32767

..

..

1

..

ShapeA

VARIABLES PARALELAS

Una vez que se declara una forma, se pueden declarar variables paralelas de esta forma.

Int: ShapeA p l , p2, p3;

P l

O 1 2 3 4 5 32767

P2

O 1 2 3 4 5

P3

... 1

..

...

..

El

32767

... ..

...

32767

Li

(21)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

SELECCIONANDO UNA FORMA

En el paso 2, en la línea:

With((ShapeA)

C* dice que usa ShapeA en la ejecución del código siguiente, en otras palabras, la declaración whit especifica que solamente las 65,536 posiciones definidas por ShapeA son activas. Esto hace a ShapeA la forma actual. Con algunas excepciones, el código siguiente a la declaración with solo puede operar en variables paralelas que son de la forma actual.

Un programa puede ejecutar la mayor parte de código paralelo solo, sin el cuerpo de una declaración with.

A S I G N A C I ~ N DE VALORES A VARIABLES PARALELAS

Una vez que la forma actual ha sido seleccionada el programa puede incluir declaraciones que lleven a cabo operaciones sobre variables paralelas de la forma.

p l = l ; p2=2;

Pl

O 1 2 3 4 5

P2

O 1 2 3 4 5

32767

32767 O

2

1

. . . .

.

. . . . . .

.

. . .

.

. . .

2 2

2 2 2 2

.. ..

2 2 2 2 2 .. ..

REALIZANDO OPERACIONES USANDO VARIABLES PARALELAS

En el paso 4 se realiza una simple adición de variables paralelas.

p3=p 1 +p2;

(22)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

O 1 2 32767

...

1

..

+P2

O 1 2 3 4 5

O 2 2 2 2 2 2

32767

...

1

. . . . .*

M

..

7 3

O 1 2 32767

...

..

1 . . . .

C O M P I L A C I ~ N DE PROGRAMAS

Como el compilador de C. Este comando produce un ejecutable con el nombre por default a.out. Se utiliza la opción o- para especificar un archivo diferente. El comando cs tiene otras opciones que se pueden especificar, éstas son las mismas que las opciones cc.

ESTRUCTURAS PARALELAS

Se puede declarar una estructura entera como una variable paralela. Por ejemplo, se declara esta forma y estructura:

shape [ 16384]employees; struct date

{

int Month; int Day; int Year;

>;

(23)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Se declara una estructura paralela como sigue: struct date: employees birthday;

Esto nos da la estructura birthday formada por shape employees

Month Day Y ear

...

16383

... ...

REFERENCIA A UN ELEMENTO

shape [ 16384]employees;

unsigned int:employees employee-id; [2]employee_id;

employee-id

O 1 2 3 4 5 I6383

...

=a====-*

*

0

*

[2]employee_id unsigned int

ARREGLOS PARALELOS

También se puede declarar un arreglo de variables paralelas. Por ejemplo:

shape[l6384]employees; int: employees rating@];

Esto es un arreglo ratings de tres variables paralelas de forma empleados.

Ratings[O] Ratings[ 1 ]

Ratings[2]

O 1 2 3 4

$

!

int

... ...

...

I6384

... ...

(24)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

PUNTEROS DE FORMAS Y VARIABLES PARALELAS

C* proporciona punteros a formas y variables paralelas, como los punteros de C. En funciones se pueden utilizar punteros para pasar datos por referencia en lugar de por valor. Esta sentencia declara la variable escalar shapeptr como un puntero a una forma:

shape "shapegtr;

Y esta declaración hace que shapegtr apunte a la forma ShapeA:

shapegtr=&ShapeA;

La declaración

with(*shapeptr)

Hace que ShapeA sea la forma actual.

PUNTEROS A VARIABLES PARALELAS

L a declaración:

int: ShapeA "pvarptr;

Declara un puntero escalar p v a r p t r que apunta a un entero paralelo de forma ShapeA. Si p l es una variable paralela de forma ShapeA, entonces

p v a r p t r - &p 1 ;

Hace p v a r p t r un puntero a p l . Podemos entonces referimos a p 1 vía el puntero pvarptr. Se puede declarar un puntero a una variable paralela de una forma que no esté específicamente llena (fully - specified), aunque no se pueda declarar una variable paralela de esta forma. Por ejemplo:

shape data; int:data "dataptr;

La relación entre arreglos y punteros es mantenida en C". Por ejemplo:

int:ShapeA A l [40];

(25)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

ELIGIENDO UNA FORMA

La declaración with. Designa la forma actual usando la nueva declaración de C* with. Por ejemplo:

shape[ 16384lemployees;

unsigned int:employees employees-id, age, salary; main()

{

with(emp1oyees)

/*Aquí van operaciones sobre variables paralelas de forma employees.*/

I

La mayor parte de operaciones sobre variables paralelas de forma employees pueden ocurrir solamente dentro del ambiente de la declaración with. Notemos que la declaración with no restringe operaciones sobre escalares. Puedes tener muchas declaraciones with en un programa, haciendo diferentes formas actuales en diferentes tiempos. Puedes además anidar declaraciones with. Cuando el programa regresa de la declaración with anidada la anterior forma una vez de nuevo será actual, como en el siguiente ejemplo:

with(ShapeA)

{

/* Poner operaciones sobre variables paralelas de forma ShapeA aquí */ with(ShapeB)

{

I

/* Operaciones sobre variables paralelas de forma ShapeB */

/* Operaciones sobre variables de forma ShapeA nuevamente */

I

MARCO DEL CONTEXTO

La declaración where. Para llevar a cabo una operación sobre un subconjunto de los elementos de una variable paralela, se usa la nueva declaración C* where para restringir el contexto en el cual la operación es llevada a cabo. Una declaración where específica en cuales posiciones una forma queda activa; el código en el cuerpo de una declaración where opera solamente sobre elementos en posiciones activas.

Por ejemplo, el código de abajo restringe operaciones a posiciones de forma employees cuando el valor de la variable paralela age es m á s grande que 35:

shape[ 16384]employees;

unsigned int:employees employee id, age, salary; main()

-

{

with(emp1oyees) where(age>35)

(26)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

í*código paralelo en restricción al contexto va aquí */

1

Esto interpreta a O(fa1so) o diferente de cero(verdader0). Separadamente para cada una de las posiciones que están actualmente activas. Las posiciones en las cuales la expresión es falsa son hechas inactivas, el código es aun ejecutado, pero una operación sobre una variable paralela de la forma actual no tiene resultado. Inicialmente, todas las posiciones en todas las formas son activas.

Podemos anidar declaraciones where; el efecto es reducir el conjunto de posiciones activas de la forma actual. Por ejemplo las dos declaraciones where siguientes restringen el contexto a posiciones de la forma employees en la cual age es mayor que 35 y salary es mayor que 50000.

with(emp1oyees) where( age>3 5)

{

í*aquí va código paralelo en restricción al contexto */ where(salary>50000)

{

}

í*aquí va código en más restricción al contexto */

Como la declaración if de C, la declaración where puede incluir una cláusula else. La cláusula else revierte el conjunto de posiciones activas; esto es, esas posiciones que están activas cuando la declaración fue ejecutada son hechas inactivas, y esas que están hechas inactivas son hechas activas.

Ej emp lo :

with(emp1oyees) where(age>35)

else

/*Código paralelo en un contexto restringido */

/*Código paralelo en oposición al contexto */

LA DECLARACIóN evervwhere.

C* también provee una declaración everywhere. La declaración everywhere hace todas las posiciones de la forma actual. El código paralelo dentro del ámbito de una declaración everywhere opera sobre todas las posiciones de la forma actual, pase lo que pase con el contexto que hay anterior a la declaración where. Después de la declaración everywhere, el contexto regresa a lo que estaba antes de la declaración everywhere.

(27)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

A S I G N A C I ~ N DINÁMICA DE SHAPES Y VARIABLES PARALELAS

Una de las características más poderosas de C* es que éste permite asignar y reasignar a formas y variables paralelas dinámicamente. Las funciones allocate-shape y deallocate-shape se utilizan para formas, palloc y pfree se utilizan para variables paralelas.

LAS FUNCIONES ALLOCATE-SHAPE Y DEALLOCATE-SHAPE

La función allocate-shape tiene dos formatos. En el primero, se toma como argumentos un puntero a una forma, el rango de esta forma, y el número de posiciones en cada eje. Éste regresa una descripción de la forma. Por ejemplo:

allocate-shape(&new-shape, 3,2,2,4096);

Asigna una forma tridimensional que es: 2 por 2 por 4096.

En el formato alternativo, se puede usar un arrreglo para especificar el rango y el número de posiciones en cada eje, Este formato es usado si el programa no conocerá el rango hasta el tiempo de ejecución,

y

por lo tanto no se puede usar el número de variables de argumentos requeridos por la anterior sintaxis.

Se puede usar allocate shape en cualquiera de las dos para asignar una nueva forma totalmente o para completar la especificación de una forma que no será específicamente llena cuando la declaras.

Usa la función de librería C* deallocate shape para liberar una forma que fue asignada vía allocate - shape; incluye el archivo de cabecera <stdio.h> cuando llames esta función. Su argumento es un puntero a la forma que será liberada. Por ejemplo:

-

Deallocate-shape(&new-shape);

Libera la forma asignada arriba.

LAS FUNCIONES PALLOC Y PFREE

Usa la función de librería palloc para repartir explícitamente almacenamiento para una variable paralela; usa la función pfree para liberar este almacenamiento. En ambos casos incluye el archivo de cabecera <stdio.h>.

La función palloc toma dos argumentos: una forma y un tamaño. Éste asigna espacio para la forma y su tamaño, y regresa un puntero al comienzo del espacio.

La unidad de tamaño en palloc es bools. Boo1 es un nuevo tipo de dato en C* que almacena cualquiera de los dos un cero o un uno. (El tamaño actual de un boo1 puede ser diferente en diferentes implementaciones.)

(28)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Para obtener el tamaño exacto de una variable o tipo de dato en unidades de bools, usamos el nuevo operador C* boolsizeof. Por ejemplo:

s l = boolsizeof(int:ShapeA);

Regresa el número de book que pueden ser asignados por un simple caso de un entero paralelo. La función pfree toma como su argumento el puntero regresado por palloc. El ejemplo siguiente asigna una forma y una variable paralela de la forma, usando la función allocate-shape y palloc, entonces quitamos ambas usando pfree y desallocate-shape:

#include<stdlib.h> shape S;

doub1e:S *p; main()

{

allocate-shape(&$ 2,4,8192);

p = palloc(S, boolsizeof(doub1e:S));

pfree(p);

I

desallocate-shape(&S);

Nótese el uso de boolsizeof para obtener el tamaño en bools, de un double paralelo.

OPERACIONES PARALELAS

Operadores de C estándar Operadores Unitarios.

Puedes usar los operadores unitarios de C estándar con variables paralelas de la forma actual. Cada elemento actual de la variable paralela lleva a cabo la operación separadamente en el mismo tiempo. Por ejemplo, si p l es una variable paralela de la forma actual, pl++; incrementa el valor en cada elemento activo de p l .

Operadores Binarios con un Operador Escalar y un Operador Paralelo

(29)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

activo de p l . Similarmente, p2 = p l + s l ; adiciona el valor de s l a cada elemento activo de p l , y asigna el resultado al correspondiente elemento de p2. Ambos p l y p2 serán de la misma forma.

0 Asignación con un Escalar LHS y un Paralelo LHS

Una variable escalar no es promovida cuando está del lado izquierdo de la declaración de asignación. Si s l es escalar y p l es paralelo, esta declaración es ilegal en C*:

S 1 = p l ;

para asignar una variable paralela a una variable escalar se puede realizar mediante un casting. Así, si s l es un entero este código será:

s l = (int) p l ;

En este caso C* simplemente elige un valor de los elementos activos de la variable paralela y asigna el valor a la variable escalar. C* no especifica cual de los valores será escogido, éste será diferente para diferentes implementaciones del lenguaje.

0 Operaciones Binarias con dos Operandos Paralelos.

Los dos operandos paralelos serán de la misma forma. Esta operación una vez más trae el concepto de elementos correspondientes. Por ejemplo, si p l y p2 son variables paralelas de la forma actual, p l = p2; simplemente asigna el valor en cada elemento activo de p l al correspondiente elemento de p2.

PI O 1 2 3 n

[

18

I

47

1

12

I

95

I

...

,

P2 18

i , i , i

47 12 95

1

1

1

...

m

p l = p 2

Similarmente, p3 = (pl >= p2); asigna a p3, para cada correspondiente elemento activo de p l , 1 si este es mayor o igual al correspondiente elemento de p2, y O si no lo es.

LA E X P R E S I ~ N CONDICIONAL

La expresión condicional ?: opera en forma diferente dependiendo sobre la mezcla de variables paralelas y escalares, en la expresión. Considere la declaración de abajo, cuando s l es escalar y p l , p2 y p3 son variables paralelas de la misma forma:

(30)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Si sl es menor que 5 , esta declaración asigna el valor del correspondiente elemento de p2 a cada elemento activo de p l ; en otro caso, p l le es asignado el valor del correspondiente

elemento de p3.

El comportamiento es diferente si todos los operandos son variables paralelas de la misma forma. Por ejemplo:

p l = (p2<5)?p3:p4;

En este caso, cada elemento activo de p2 es evaluado separadamente. Si el valor en p2 es menor que 5 en un elemento dado, el valor de p3 es asignado a p l para el elemento correspondiente, en otro caso el valor de p4 es asignado a p l . Si cualquiera de los dos p3 o p4 (o ambos) son escalares en este ejemplo, estos serán promovidos a variables paralelas de la forma actual, y la expresión será evaluada como se describió arriba.

R E D U C C I ~ N DE OPERADORES

C estándar tiene varios componentes de asignación de operadores, tales como

+=,

que lleva a cabo una operación binaria y una asignación de resultado para el lado izquierdo de la declaración. Muchas de estas operaciones pueden ser usadas con variables paralelas en C* para llevar a cabo reducciones, esto es, reduce el valor de todos los elementos de una variable paralela a un simple valor escalar. C* proporciona reducción de operadores, una forma rápida de llevar a cabo operaciones sobre todos los elementos de una variable paralela.

La reducción de operadores puede llevarse a cabo para ambos (unarios o binarios). Por ejemplo, si p l es una variable paralela de la forma actual, +=pl; suma los valores de todos los elementos activos de la variable paralela p l .

S1 + = p l ;

Suma 10s valores de todos los elementos activos de p l , y adiciona estos a 1 valor de la variable escalar S l .

Cuando se usa con dos variables paralelas, estos operadores llevan a cabo una simple operación binaria elemental. Por ejemplo, si p l y p2 son ambos variables paralelas de la forma actual,

p l = p 2 ;

Adiciona el valor de cada elemento activo de p2 al valor del correspondiente elemento de p l

.

C* introduce dos nuevos operadores de reducción: el operador mínimo, <?=, y el operador máximo, >?=. Para una variable paralela, <?= regresa el valor mínimo entre sus elementos activos, y >?= regresa el valor máximo.

(31)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

FUNCIONES

C* adiciona soporte para variables y formas. Las variables paralelas y formas pueden ser pasadas como argumentos y para regresar de funciones. Por ejemplo, esta función toma una variable paralela de tipo entero y forma ShapeA como un argumento:

void printf - sum(int:ShapeA x) {

printf("La suma de los elementos es %d.\n", +=x);

(32)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

UNIX

Un sistema operativo es una colección de programas que controlan y organizan los recursos de un equipo de cómputo. Esos recursos se clasifican en dos componentes fundamentales: el hard- ware, que incluye terminales, impresoras, manejadores de cinta, etc., y el software, que consta de editores de texto, compiladores, manejadores de liases de datos, etc.

La mayoría de las computadoras personales tienen sistemas operativos monousuario, es decir, sólo una persona puede usar el sistema, y éste puede manejar sólo una tarea. otros sistemas ope- rativos son multiusuario y multitarea, en estos, varias terminales están conectadas a la computadora y el sistema controla los accesos a ella para una comunidad de usuarios. Esta clase de sistemas operativos permiten a la computadora la ejecución de varias tareas al mismo tiempo.

PARTES QUE COMPONEN A UNIX

Unix está compuesto por cuatro partes básicas: kernel (o núcleo)

sistema de archivos

0 shell (o intérprete de órdenes) 0 herramientas.

El kernel es el núcleo del sistema operativo y controla el hardware de la computadora.

El sistema de archivos es la forma en que Unix almacena información de cualquier clase. Los archivos pueden contener documentación, información de hojas de cálculo, gráficas, instruccio- nes de Unix y muchos otros tipos de datos.

El shell es un programa que actúa como la interfaz entre el kernel y los usuarios.

Las herramientas son programas de aplicación que pueden ser ejecutados por el shell para llevar a cabo diferentes tareas. Cualquier software de aplicación que se carga dentro de un sistema Unix, como un procesador de palabras o una base de datos, técnicamente se conoce como herramienta.

C O N E X I ~ N Y D E S C O N E X I ~ N DE UNIX

Para conectarse al sistema operativo Unix es necesario disponer de una clave de usuario y de una clave confidencial o contraseña. Unix controla el acceso al sistema con un programa llamado login. Cuando dicho programa está activo despliega el mensaje siguiente en la terminal:

>login :

(33)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

y espera a que el usuario digite su clave, cuando se oprime la tecla [RETURN] o [ENTER] se envía el nombre a la computadora, entonces el programa login responde con el mensaje:

>password :

y espera a que el usuario introduzca su contraseña, la cual no aparece en la pantalla mientras se digita; igual que en el caso anterior, cuando se presiona la tecla [RETURN] o [ENTER], el programa login verifica que ambos, el nombre de entrada y la contraseña sean válidos. En este caso aparece un carácter de $ o de % en la pantalla, lo cual indica que la conexión con Unix ha quedado esta6lecida. En otro caso el programa login envía un mensaje de error, no permite el acceso al sistema y vuelve a enviar su mensaje inicial.

La manera adecuada de terminar una sesión es oprimir la combinación de teclas [CTRL-Dl. Esta orden le indica a Unix que ya no se desea seguir trabajando con él. En respuesta, el sistema da por terminada la conexión y después vuelve a ejecutar el programa login sobre la terminal.

USUARIOS Y CONTRASEÑAS

El administrador del sistema asigna a cada usuario una clave única, ésta lo identifica dentro del universo de usuarios del sistema; también le da una contraseña inicial, que después se puede cambiar según el gusto o las necesidades. En general cada clave de usuario es única, pero puede suceder que un grupo de personas tenga la misma, por ejemplo en el caso en que estén trabajando en el mismo proyecto. Cada clave de usuario es conocida como una cuenta en la terminología de Unix.

La principal finalidad de las claves de identificación y de las contraseñas es definir la propiedad sobre 10s archivos y especificar quién puede, y quién no, tener acceso a los archivos de un usuario..

DOCUMENTACI~N EN LÍNEA DE UNIX

Dentro de la documentación de Unix hay un manual de usuario que se mantiene dentro de la computadora, y que frecuentemente está en línea. Éste describe la mayor parte del material necesario para familiarizarse con el sistema, y se puede consultar en una terminal. La orden

man da acceso a los tópicos del manual. Por ejemplo, para leer algo sobre la orden who, debe digitarse:

%man who

(34)

Auroximación a una Esfera Sólida z)or un Ensamble de Tetraedros.

El EDITOR DE TEXTOS vi

El editor vi -visual- tiene características que pueden hacerlo poco intuitivo, debido a que el teclado se utiliza tanto para ejecutar órdenes como para escribir texto. Cuando el teclado se usa para introducir órdenes se dice que está en modo orden. Para insertar texto se pone en modo de

inserción. Al inicio el editor está en modo orden.

Las órdenes se abrevian a través de letras, que funcionan como mnemónicos, por ejemplo, para insertar se usa i -insert-, para cambiar una palabra se usa cw -change word-, etc.

Hay algunas consideraciones que se deben tener en cuenta al trabajar en modo orden. Las órdenes son sensitivas al tipo -mayúsculas o minúsculas-, no se muestran en la pantalla al digitarlas y no requieren oprimir la tecla [RETURN] después de la orden.

Todo lo que se introduce en modo texto se guarda, aún los caracteres de control, si se le pide a vi que conserve lo editado.

ABRIR ARCHIVOS

El comando vi es la orden de Unix que invoca al editor del mismo nombre; vi trabaja sobre archivos de texto, se puede usar para modificar uno existente o para crear uno nuevo.

Cuando se usa vi para editar un archivo de texto, se hace una copia de éste en un buffer de memoria y ahí se maneja mientras se esté editando. Vi copia el buffer al archivo permanente hasta que se le da la orden de guardarlo -write-.

La sintaxis para la orden vi es:

$ vi [Nombre - de-archivo]

Los paréntesis cuadrados -[ y

I-,

indican que el nombre del archivo es opcional.

Por ejemplo, si se quiere editar un archivo nuevo llamado práctica, se deberá digitar:

$ vi práctica

GUARDAR Y SALIR DE UN ARCHIVO

En cualquier momento se puede abandonar un archivo, o guardar lo editado y regresar a Unix. La orden de vi para guardar un archivo y salir es ZZ (nótese que son mayúsculas). Si se ejecuta está orden en la pantalla aparece un mensaje como el que se ve abajo:

(35)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

n lines, xyz characters.

En el mensaje la n indica el número de líneas que se editaron en el archivo y xyz es la cuenta del número total de caracteres que contiene el archivo.

ÓRDENES BÁSICAS

Lo que se incluye en esta sección como órdenes básicas, comprende aquellas que se usan más a menudo para moverse a lo largo del archivo que se está editando. Tanto para recorrer el archivo de pantalla en pantalla, como para moverse dentro del contenido de una sola.

Para iniciar las órdenes de movimiento el editor tiene que estar en modo de órdenes. Cuando el editor arranca lo hace en este modo. Antes de mover el cursor se presiona la tecla [ESC] para asegurarse de que está en modo orden.

MANEJO DE ARCHIVOS

Orden

Graba el archivo y sale de vi ZZ

Descripción

:w

Graba el archivo y sale de vi :wq

Sale de vi, sólo si no se modificó el archivo :q

Graba el archivo

:x!

Sale de vi, sin grabar los cambios

: q !

Graba el archivo y sale de vi

MOVIMIENTO DEL CURSOR

En el modo orden se puede colocar el cursor en cualquier parte del archivo. Las órdenes de vi

para mover el cursor son:

Orden Descripción

Se desplaza una posición a la izquierda Se desplaza una posición a la derecha Se desplaza una líneahacia abajo

Se desplaza una líneahacia arriba

También pueden utilizarse las teclas [RETURN] y [BACKSPACE], para avanzar una línea y para regresar un carácter, respectivamente.

(36)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Dos órdenes que permiten el movimiento dentro de una línea son:

Orden Descripción

O

coloca el cursor al final de la linea

$

-cero- coloca el cursor al inicio de la linea

La orden w mueve el cursor palabra por palabra hacia adelante. Ésta considera los signos de puntuación como si fueran palabras. La orden

-

lleva a cabo las mismas acciones que w, sólo que en la dirección contraria. Otra orden que mueve el cursor como en el caso de w es la e, pero ésta tiene la peculiaridad de que deja el cursor en el último carácter de la palabra -end-.

Orden Descripción

w

retrocede el cursor a la palabra previa b

avanza el cursor a la próxima palabra

I

e avanza el cursor al final de la próxima palabra

MOVIMIENTOS POR

PANTALLA

vi permite mover el cursor una página hacia arriba y una página hacia abajo con las siguientes órdenes:

Orden Descripción

CTRL-

mueve el texto una página hacia atrás CTRL-

mueve el texto una página hacia adelante F

B

También se puede hacer el movimiento de medias páginas con las siguientes órdenes:

I I I

Despliegue adicional de líneas:

(37)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

Otra orden que permite mover el texto por pantalla, pero con la propiedad de dejar fijo el cursor es z, esto se hace de la siguiente forma:

Orden Descripción

z [RETURN] mueve la líneaactual a lo alto de la pantalla

mueve la líneaactual al centro de la pantalla

mueve la líneaactual a la base de la uantalla

MOVIMIENTOS DENTRO DE UNA MISMA PANTALLA

~

Orden

~~~

Descripción H

se mueve al final de la pantalla (la ultima línea) G

se mueve al tope de la pantalla (la primera línea)

se mueve a la base de la pantalla (la ultima L

se mueve a la mitad de la pantalla M

nH se mueve n líneas hacia arriba nL se mueve 11 líneas hacia abajo

línea)

I N S E R C I ~ N DE TEXTO

Hay varias formas para pasar al modo de inserción, la más común es con

i,

la posición del cursor marca el punto de inicio de ésta. Para suspender este modo y regresar al de órdenes, se oprime la tecla [ESC].

En algunas ocasiones se puede olvidar si se está en modo orden o inserción, entonces se debe presionar la tecla [ESC] hasta que se escuche el beep de la terminal, entonces se estará en modo orden.

Las órdenes que permiten insertar texto en diferentes posiciones son:

Orden Descripción

A

agrega texto adelante de la posición actual del a agrega texto al final de la línea actual

I inserta texto al inicio de la línea

i inserta texto antes de la posición del cursor O inserta un renglón en blanco en la línea anterior al

o inserta un renglón en blanco en la línea siguiente cursor

cursor

a la

(38)

Atxoxirnación a una Esfera Sólida Dor un Ensamble de Tetraedros.

I

I

actual

I

CAMBIAR TEXTO

Las órdenes de vi que se usan para cambiar texto dentro del archivo son:

Orden C

cc nc$

c>

S S

R

cw

Descripción

cambia desde la posición del cursor hasta el fin de la

línea

cambia una línea completa

cambia las siguientes n líneas a partir de donde está el cursor

cambia el texto, desde la posición del cursor, hasta el inicio de la sentencia siguiente sustituye una línea completa

sustituye un carácter por el texto que se introduzca hasta que se oprima la tecla [ESC] sobre escribe cada carácter a partir de donde está el

cursor hasta que se oprime la tecla [ESC] cambia una palabra hacia adelante, a partir de la posición en la que está el cursor

BORRADO DE TEXTO

Las órdenes de vi que se usan para eliminar texto de un archivo editado son:

Orden Descripción

dd

borra desde la posición del cursor hasta el final de D borra una línea

la línea x

borra una palabra hacia adelante, a partir de la dw

borra el carácter que está a la izquierda del cursor X

borra el carácter que está a la derecha del cursor

nx borra n caracteres, a partir de donde está el cursor posición en la que está el cursor

(39)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

MOVIMIENTO PARA B ~ S Q U E D A

Vi realiza búsquedas de texto mediante la orden / (diagonal), Para realizar las búsquedas es necesario estar en modo de órdenes. Cuando se oprime esta tecla, aparece el símbolo / en el fondo de la pantalla, en espera de que se introduzca el texto a buscar. Al terminar de digitar el texto se debe oprimir [RETURN] para iniciar la búsqueda.

La búsqueda del texto actual se puede repetir mediante la orden n. Si se da esta orden, la búsqueda continuará hasta encontrar la siguiente ocurrencia del texto buscado, o hasta que el editor haya recorrido todo el archivo y vuelva a llegar al punto en el que inicio.

MOVIMIENTO DE TEXTO

Pegar (Paste)

Al borrar en vi, lo que se elimina queda almacenado temporalmente en un buffer. Después se vaciará el buffer en cualquier parte del texto.

La orden p vacía el contenido del buffer de borrado a partir de l a posición en donde se encuentra el cursor. Si se utiliza la orden P, el texto se vacía desde una posición antes a la del cursor. Si se ejecuta alguna otra orden que haga uso del buffer antes de vaciarlo, el contenido anterior se destruye.

COPIADO DE TEXTO

Para copiar un texto en diferentes lugares del archivo se utilizan las órdenes: y (yank) y p (paste). El procedimiento para copiar un bloque es el siguiente:

a) Para copiar texto el editor debe estar en modo de órdenes.

b) Se deben contar todas las líneas que abarca el bloque.

c) El cursor se posiciona en la primera línea del bloque.

d) Se ejecuta la orden: nyy, donde la n representa el número de líneas de que consta el bloque.

e) Después se coloca el cursor en la posición donde se va a copiar el bloque.

f) Para hacer la copia se puede dar la orden p, ésta hace que el texto se copie a partir de la línea que sigue a aquella en la que se encuentra el cursor. Si se da la orden: P,,el texto se copia antes de la línea en la que está el cursor.

La orden yy sólo copia al buffer la línea en la que está el cursor.

(40)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

R E P E T I C I ~ N DE UNA ORDEN

La orden

.

(punto) permite repetir la última orden de edición que se realizó, el cursor se debe colocar en donde se quiere repetir la orden y después ejecutarla. Repite cualquier tipo de orden cuantas veces se quiera.

A N U L A C I ~ N DE UNA ORDEN

Vi permite anular los cambios hechos por la orden previa al ejecutar u (undo). E l cursor necesita estar sobre la línea donde se realizó la modificación. E l texto queda como estaba antes de ejecutar la orden previa a la u.

UNIóN DE DOS LINEAS

Cuando se quieren unir dos líneas, una al final de la otra, se utiliza la orden J. E l cursor debe estar en la primera línea. Esta orden acepta un prefijo numérico (nJ) que le indica cuántas líneas se quieren unir.

REEMPLAZOS GLOBALES

Cuando es necesario hacer el mismo cambio en muchos lugares a lo largo de un archivo, se puede usar una orden que automáticamente reemplace el texto cada vez que ocurra en el archivo.

La orden de sustitución tiene la siguiente sintaxis:

%s/texto-anteriorhexto - actual

ésta sustituye sólo la primera ocurrencia del texto, hacia adelante a partir de donde se encuentra el cursor.

La orden que se usa para hacer la sustitución en todo el archivo se compone de dos partes S que significa sustituye y g que significa global.

También se puede especificar el intervalo de líneas en el cual se desea hacer el cambio, por ejemplo, la siguiente orden cambia sólo el texto que esté entre las líneas 50 y 100.

%50,100s/texto~viejo/texto nuevo/g

(41)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

La orden

%1 ,$s/texto-viejokexto - nuevo/g

hace los cambios desde la primera línea hasta el final del archivo -representado por $-, esta orden se puede hacer utilizando también % que sustituye la secuencia l,$. Si se utiliza la opción c en la orden de sustitución, el editor pedirá que se confirme cada una antes de hacerla.

%s/texto-viejohexto - nuevo/gc

MOVIMIENTO POR NÚMERO DE LINEA

Para vi todos los archivos tienen sus líneas numeradas secuencialmente, desde la primera hasta la última. El cursor se puede mover a una línea en particular especificando su número. Para que la numeración de las líneas de un archivo aparezca en la pantalla se utiliza la orden:

%set number

que se puede abreviar como

%se nu

Para desaparecer la numeración se utiliza

%set nonumber que se abrevia como

(42)

Aproximación a una Esfera Sólida por un Ensamble de Tetraedros.

BIBLIOGRAFIA.

T. J. Beker Developments and trends in three-dimensional mesh generation. Aplied Numerical Mathematics 5 (1989) 275-304.

P. Olszewsky,

T.

Nakata, N. Takahashi and K. Fujiwara. A simple algorithm f o r adaptive

refinement of tetrahedral meshes combined with edge meshes. IEEE Transactions on

Magnetics, vol 29, no 2, march 1993.

F. Bornemann, B Erdmann and R. Kornhuber. Adaptive multilevel methods in three space

dimensions. International journal for numerical methods in engineering, vol. 36,3 187-3203

(1 993).

P. L. Baehmann, M. S. Shepard, J. F. Flaherty. Aposteriori error estimation f o r triangular

and tetrahedral quadratic elements using interior residual. International journal for

numerical methods in engineering, vol. 34, 979-996 (1992).

N. T. Frink, Upwin schema f o r solving the euler equations on unstructured tetrahedral

meshes. AIAA Journal Vol. 30 no 1 january 1992.

M. Hall, J. Warren. Adaptive polygonization of implicitly defined surfaces. IEEE Computer Graphics and applications. Nov 1990, 33-42.

B. Joe. Tetrahedral mesh generation in polyhedral regions based on convex polyhedron decompositions. International journal for numerical methods in engineering. Vol 37, 693- 713 (1994).

K. Uemura, T. Saito. Automatic mesh generation for FEMsimulations of windflow around

tall buildings. Journal of Wind Engineering and industrial aerodynamic, 46-46 (1993)

N. A. Golias and T. D. Tsiboukis. An aproach to refining three-dimensional tetrahedral meshes based on delaunay transformations. International journal for numerical methods in engineering, vol. 37, 793-812 (1994).

357-362.

IO) Getting Started in C*

Figure

Figura  l .   Nivel  O  Se  observa  que  se  generan  3  círculos  concéntricos  y 37  puntos  (recordemos  que  en  Este  nivel  la  coordenada  z  tiene  valor  O)
Figura  -  3.  Nivel  2  en  este  caso  únicamente  se  observa  una  circunferencia  (Aquí  z  =  2)
Figura  5 .  Si  todas  las  figuras  anteriores  se  sobrepone  uno encima  de la otra a una  distancia  de  una  unidad  una de la otra  obtendríamos una figura en el espacio  Como la mostrada en esta figura
Figura  9.  En  esta  figura  observamos  como  los  tetraedros  forman  el  prisma  en  las  siguientes
+2

Referencias

Documento similar

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

1º) una motivación social minusvaloradora, despectiva o, incluso, estigmatizadora: las personas contra las que se discrimina, caracterizadas por lo general mediante su pertenencia a

No había pasado un día desde mi solemne entrada cuando, para que el recuerdo me sirviera de advertencia, alguien se encargó de decirme que sobre aquellas losas habían rodado

De acuerdo con Harold Bloom en The Anxiety of Influence (1973), el Libro de buen amor reescribe (y modifica) el Pamphihis, pero el Pamphilus era también una reescritura y

Esto viene a corroborar el hecho de que perviva aún hoy en el leonés occidental este diptongo, apesardel gran empuje sufrido porparte de /ue/ que empezó a desplazar a /uo/ a

En junio de 1980, el Departamento de Literatura Española de la Universi- dad de Sevilla, tras consultar con diversos estudiosos del poeta, decidió propo- ner al Claustro de la

Tras establecer un programa de trabajo (en el que se fijaban pre- visiones para las reuniones que se pretendían celebrar los posteriores 10 de julio —actual papel de los

En cuarto lugar, se establecen unos medios para la actuación de re- fuerzo de la Cohesión (conducción y coordinación de las políticas eco- nómicas nacionales, políticas y acciones