Está en la página 1de 213

2

INSTITUTO TECNOLÓGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY


CAMPUS ESTADO DE MÉXICO

Solución Numérica de Problemas de Mecánica de Sólidos para Cuerpos


con Grietas y/o Inclusiones
TESIS QUE PARA OPTAR EL GRADO DE
DOCTOR EN CIENCIAS E INGENIERÍA DE MATERIALES
PRESENTA
Víctor Manuel Romero Medina
Asesor: Dr. SERGUEI KANAOUN MIRONOV

Comité de tesis: Dr. SERGUEI KANAOUN MIRONOV


DR. VALERIY LEVIN
DR. OLEKSANDR TKACHENKO
DR. SADEGH BABAII KOCHEKSARAII

Jurado: DR. VALERIY LEVIN Presidente


DR. OLEKSANDR TKACHENKO Secretario
DR. SADEGH BABAII KOCHEKSARAII Vocal
Dr. SERGUEI KANAOUN MIRONOV Vocal

Atizapán de Zaragoza, Edo. de Méx., 15 de Enero de 2009


3

© [2009] por Víctor Manuel Romero Medina


Todos los Derechos Reservados
4

Agradecimientos

Agradezco fervientemente al Dr. Serguei Kanaoun por todo el apoyo que m e brindo desde que

llegó al I T E S M , C E M , en 1992, por invitarme a participar con él en sus proyectos de investigación,

de donde surgió la posibilidad de ser mi asesor durante los últimos años dando por resultado este

trabajo.

También agradezco al comité de tesis, Dr. Oleksandr Tkachenko, Dr. Valeriy Levin y Dr. Sadegh

Babaii, por su interés en el presente trabajo y de quienes recibí comentarios muy valiosos para el

desarrollo del mismo.

A mis amigos y compañeros de siempre en el I T E S M , C E M , con quienes he compartido m o m e n ­

tos importantes: Dr. A r m a n d o Bravo, Dr. Ulises Figueroa, M . C. A r m a n d o Gómez, Técnico An­

tonio García Mecedo, Dra. Olimpia Salas y Dr. Joaquín Oseguera, de quienes siempre he recibido

consejos y comentarios que m e han servido durante mi desarrollo profesional y personal y con

quienes he sembrado una gran amistad.

Agradezco de forma especial al Dr. Pedro Grasa Soler, por su apoyo incondicional para que

pudiera llevar a buen término esta investigación.

Asimismo, agradezco a mis compañeros y amigos de la Universidad del Caribe, al Rector M. A.

Fernando Espinoza de los Reyes Aguirre, la Dra. Estela Cerezo Acevedo, y principalmente al Ing.

Hilario López Garachana, quien m e apoyo grandemente para que realizara la última etapa del

desarrollo de esta tesis.


5

"...y así, del poco dormir y del mucho leer se le secó el cerebro, de manera que vino a perder el

juicio. Llenósele la fantasía de todo aquello que leía en los libros, así de encantamientos como de

pendencias, batallas, desafíos, heridas, requiebros, amores, tormentas y disparates imposibles;

y asentósele de tal modo en la imaginación que era verdad toda aquella máquina de aquellas

soñadas invenciones que leía, que para él no había otra historia más cierta en el mundo."

El Ingenioso Hidalgo Don Quijote de la M a n c h a

Miguel de Cervantes Saavedra


6

Resumen

El trabajo de investigación está enfocado en la aplicación de un método numérico novedoso, de¬

nominado M é t o d o de Puntos de Frontera, a la solución de las ecuaciones integrales en la frontera

que se presentan en el estudio de mecánica de cuerpos deformables, lo que permite reducir en

una dimensión el análisis en cuestión. Principalmente lo aplicamos a la solución de los siguientes

problemas:

1. El segundo problema de elasticidad estático de cuerpos homogéneos en dos dimensiones,

2. El segundo problema de elasticidad estático de cuerpos homogéneos con grieta en dos di¬

mensiones,

3. El segundo problema de plasticidad estático de cuerpos homogéneos en dos dimensiones, y

4. El segundo problema de elasticidad dinámico de cuerpos homogéneos con grieta en dos

dimensiones.

En el método se utilizan funciones de aproximación tipo Gauss, lo que representa una gran ven¬

taja de este modelo, ya que no se requiere discretizar la frontera en pequeños elementos como en

el B E M , sino que nos permite definir una cantidad f i n i t a de nodos o puntos sobre la frontera de

los que sólo se requiere conocer características geométricas tales como sus coordenadas y la ori¬

entación de vectores unitarios normales a la frontera en dichos puntos. Esto nos lleva a definir

los componentes de la matriz de c o e i c i e n t e s mediante el cálculo analítico de integrales estandar

cuyos valores se pueden guardar fácilmente en la memoria de la computadora para ser utilizados

posteriormente en el cálculo de esfuerzos en el interior del dominio de solución, alcanzando una

gran precisión. Los resultados obtenidos para los diferentes problemas son comparados con solu¬

ciones exactas existentes en los casos (1), (2) y (4), con resultados experimentales, como en el

caso del factor de intensidad de esfuerzos del problema (2), y con modelos numéricos de elemen¬

tos f i n i t o s en el caso del problema (3), mostrando gran precisión en la solución.


7

Abstract

This research work is focused in the application of a relatively new numerical method defined

as Boundary Point Method to the solution of the boundary integral ecuations that are present in

the continuum mechanics, reducing the dimension of the problem by one. Mainly w e apply the

method to the solution of the following problems:

1. The second boundary value problem of static elasticity for 2 D homogeneous bodies,

2. The second boundary value problem of static elasticity for 2 D homogeneous bodies with

crack,

3. The second boundary value problem of static el astolplasticity for 2 D homogeneous bod-

ies,and

4. The second boundary value problem of dynamic elasticity for 2 D homogeneous bodieswith

crack.

The method requires the use of Gaussian approximation functions which represents an advantage

because it is no neccesary to discretize the boundary with small elements as in B E M , so it is only

necessary to define certain f i n i t e quantity of nodes or points on the boundary of the body from

which only is necessary to know geometrical properties as coordinates and direction of normal

unit vectors at the boundary at such points. This allows us to define the elements of the coeficient

of main matrix of the linear sistem of equations by analitical calculus of standar integrals, the

resulting data can be saved in the computer memory to be used afterwards in the calculus of

stresses inside the domain of solution, with a very high pressition. For problems (1), (2) and (4),

results obtained are compared with exact solutions found in the bibligraphy, for intensity stress

factor of problem (2) results are compared with experimental data, and for problem (3) results are

compared with another numerical model as F E M using A N S Y S . All the results show a very high

presicion in the solution.


8

Contenido

Lista de figuras 11

1 Introducción 14

1.1 Métodos numéricos aplicados en la mecánica del medio contínuo 14

1.1.1 M é t o d o de diferencias finitas (FDM) 15

1.1.2 M é t o d o de elementos finitos (FEM) 15

1.1.3 M é t o d o de elementos de frontera ( B E M ) 16

1.2 Métodos sin malla 17

1.2.1 Necesidad de los métodos sin malla 19

1.2.2 L a idea de los métodos sin malla 20

1.2.3 M é t o d o de Puntos de Frontera (BPM) 21

1.3 Meta y objetivos 22

2 Funciones de aproximación 24

3 Problema de elasticidad bidimensional 28

3.1 Formulación del problema plano en lenguaje de ecuaciones integrales 28

3.2 Acción de los operadores del problema sobre las funciones de Gauss 32

3.3 Discretización de las ecuaciones integrales del segundo problema de elasticidad.

Caso plano 35

3.4 Ejemplos de solución numérica del problema 42

3.5 Solución del problema para cuerpos con grieta 46

3.6 Conclusiones 56

4 Problema elasto-plástico para cuerpos en 2D 57


9

4.1 Diferentes formas de la teoría de plasticidad 57

4.1.1 Plasticidad independiente del tiempo o de la razón (rate independent plasticity) 58

4.1.2 Teoría de la plasticidad 59

4.1.3 Especificaciones para el endurecimiento 63

4.1.3.1 Endurecimiento isotrópico multilineal y endurecimiento

isotropico bilineal 63

4.1.3.2 Especificaciones para endurecimiento isotrópico no lineal 63

4.1.3.3 Especificaciones para el endurecimiento cinemático bilineal 64

4.2 Formulación de las ecuaciones elasto-plásticas en forma de ecuaciones integrales . . . . 65

4.3 Acción de operadores integrales del problema elasto-plástico sobre las funciones
de Gauss 68
4.4 Ejemplo de aplicación. Deformación elastoplástica de una placa rectangular con

un corte lateral 70

4.4.1 L a ley de plasticidad 70

4.4.2 Algoritmo de la solución numérica 72

4.4.3 Resultados numéricos 74

4.4.4 Comparación de resultados del modelo utilizando A N S Y S 76

4.5 Conclusiones 78

5 Problema de elasticidad dinámica para cuerpos con grieta 79


5.1 Formulación de las ecuaciones del problema de elasticidad dinámica en forma de
ecuaciones integrales 79

5.2 Solución numérica del problema 2 D 80

5.3 Aplicación al problema de difracción de ondas P planas sobre una grieta 84

5.3.1 Conclusiones 86

6 Conclusiones 88

Bibliografía 90
10

A Tensores de cuarto orden especiales 93

A.1 Las bases tensoriales de cuarto orden 93

A.1.1 Base E 93

A.1.2 Base P 95

A.1.3 Base θ 97

B Algunas integrales sobre la esfera unitaria 98

C Métodos Numéricos 100

C.1 Métodos de solución de sistemas de ecuaciones lineales 100

C.1.1 Conjuntos de ecuaciones no singulares versus conjuntos singulares 100

C.1.2 Representación matricial 102

C.1.3 Eliminación de Gauss-Jordan 102

C.1.4 Eliminación Gaussiana con substitución hacia atrás 103

C.1.5 Descomposición L U y sus aplicaciones 104

C.1.6 Efectuando la descomposición L U 106

C.2 Interpolación en dos dimensiones 108

C.2.1 Orden superior para mejorar la precisión 109

C.2.2 Orden superior para suavizar la función mediante interpolación bicúbica 110

D Programas computacionales en lenguaje C 112


11

Lista de figuras

Fig. 2.1 Gaussianas 24

Fig. 2.2 Gráfica de f (x) 24

Fig. 2.3 Gráfica de f (x) aumentada 25

Fig. 2.4 f / (x)


1 2 y términos individuales 26

Fig. 2.5 f ( x ) y términos individuales


4 26

Fig. 3.1 R (x) de la aproximación Gaussiana de la ec.(3.21) 33

Fig. 3.2 R (x) de la aprox. Gaussiana de la ec.(3.21). D = 2 34

Fig. 3.3 R (x) de la aprox. Gaussiana de la ec.(3.22). D = 2 34

( i ) ( i )
Fig. 3.4 Bases global ( e , e ) y local ( s , n
1 2 ) de un área plana Ωcon frontera T 36

Fig. 3.5 Orificio de una placa plana infinita 43

Fig. 3.6 Solución exacta. Componente b s 44

Fig. 3.7 Solución exacta. Componente b n 45

Fig. 3.8 Esfuerzos en la dirección y, σ 11 45

Fig. 3.9 Disco circular con R = 1, y cargas concentradas opuestas 46

Fig. 3.10 Distribución de σ (x) en el disco sujeto a dos fuerzas de compresión


11

concentradas 47

Fig. 3.11 Distribución de σ (y) en el disco sujeto a dos fuerzas de compresión


11

concentradas 47

Fig. 3.12 Error R ( x ) de la sol. numérica de una grieta recta en un plano infinito 48

Fig. 3.13 Sistema de coordenadas local en la punta de la grieta 48

Fig. 3.14 Área rectangular con grieta central 51

Fig. 3.15 Distribución del esfuerzo σ (x, 0) a lo largo de la grieta de un área rectangular.
11 54
12

Fig. 3.16 Distribución del esfuerzo σ (x, 0) a lo largo de la grieta de un área rectangular.
22 54

Fig. 3.17 Factores de intensidad de esfuerzos para una grieta central en un área plana

rectangular 55

Fig. 4.1 Diferentes superficies de cedencia 60

Fig. 4.2 Curva esfuerzo deformación para el análisis de edurecimiento no lineal en

ANSYS 64

Fig. 4.3 Representación en 2 D de un cuerpo con región de deformación plástica 65

Fig. 4.4 Región de deformación plástica en una placa rectangular en 2 D 71

Fig. 4.5 Lineas A y B en la región de deformación para la comparación de σand ε 75

Fig. 4.6 Comparación de σsobre la linea A para mallas con 2 1 , 4 1 , 61 y 81 nodos


por lado 75
Fig. 4.7 Comparación de ε sobre la linea A para mallas con 2 1 , 4 1 , 61 y 81 nodos
por lado 76

Fig. 4.8 Comparación de σ sobre la linea B para mallas con 2 1 , 4 1 , 61 y 81 nodos


por lado 76

Fig. 4.9 Comparación de ε sobre la linea B para mallas con 2 1 , 4 1 , 61 y 81 nodos

por lado 77

Fig. 4.10 Esfuerzo equivalente de plasticidad en el eje 77

Fig. 4.11 Deformación equivalente de plasticidad en el eje 78

Fig. 5.1 Distribución de esfuerzos en un disco sujeto a dos fuerzas 84

Fig. 5.2 Apertura de la grieta y factores de intensidad de esfuerzos para el problema


de difracción de ondas P 86
Fig. 6.1 Malla cuadrada para interpolación bicúbica 108
13

Nomenclatura
1 Tensor identidad
A, A ij Matriz de coeficientes del sistema de ecuaciones lineales
b Vector del potencial de doble capa
C,C i j k i
Tensor módulo elástico
D Parámetro adimensional de la función tipo Gauss, D = 2
E, E i j k i Base tensorial de cuarto orden
F (•), (•) Transformada de Fourier
G, G ij Función de Green
h Distancia entre puntos de frontera
I, I ijkl Tensor identidad de cuarto orden
K, KI II Factores de intensidad de esfuerzos
n,n i Vector normal exterior a la frontera
P, P ijkl
Base tensorial de cuarto orden
S, S , T, T ijkl ijkl Funciones tensoriales de cuarto orden
U, U i Función potencial de doble capa
X Vector solución del sistema de ecuaciones lineales

a = b/a Razón de dimensiones de placa para placa con grieta


β Angulo que forma el vector normal con el eje y en el punto frontera
٦ Recta tangente a la frontera en el punto frontera
δ ij
Delta de Kronecker
δ(x) Función delta de Dirac
pl pl
ε,ε Tensores deformación plástica, deformación plástica equivalente
η Coordenadas adimensionales
λ,μ C o e i c i e n t e s de L a m é
θ, θ ijkl Base tensorial de cuarto orden
Γ Frontera del dominio de solución
V Razón de Poisson
p Densidad del cuerpo
pl
σ,σ, σ Tensores de esfuerzos, esfuerzos equivalentes, esfuerzos de plasticidad
ω Frecuencia
Ω D o m i n i o de solución
14

1 Introducción

Actualmente sabemos que si no existieran las técnicas numéricas, sería casi imposible resolver

analíticamente problemas de ingeniería prácticos con un grado razonable de precisión. La mayoría

de las técnicas numéricas en mecánica del medio continuo están basados en el principio de que es

posible derivar algunas ecuaciones y relaciones que describan con precisión el comportamiento

de una pequeña parte diferencial de un cuerpo. Dividiendo el cuerpo entero en un gran número

de estas partes pequeñas y utilizando las ecuaciones correspondientes para conectarlas, es posible

obtener una predicción de los valores de las variables con precisión razonable tales como esfuerzos

y desplazamientos en el cuerpo. Conforme el tamaño de estas partes se hacen más pequeñas, la

solución numérica se hace más precisa, pero el costo del tiempo de cómputo puede ser prohibitivo.

N o exsite un substituto para la experiencia en la aplicación de las técnicas numéricas a problemas

de ingeniería prácticos porque no hay una respuesta clara a la pregunta ¿ Q u é tan pequeñas deben

ser las partes componentes para obtener la precisión óptima?

Por lo anterior es importante revisar y comparar las diferentes técnicas numéricas que se han

estado desarrollando para la solución de problemas de la mecánica del medio continuo.

A continuación daremos una brede descripción de cada u n o de ellos.

1.1 Métodos numéricos aplicados en la mecánica del medio continuo

Actualmete es posible clasificar los métodos numéricos aplicados en la mecánica del medio con-

tínuo como métodos con malla y métodos sin malla. Para los métodos con malla podemos distin¬

guir los más comunes como son el método de diferencias f i n i t a s ( F D M , Finite Diference Method),

el método de elementos f i n i t o s ( F E M , Finite Element M e t h o d ) y el método de elementos de fron¬

tera ( B E M , Boundary Element M e t h o d ) ; para los métodos sin malla, aunque se han desarrollado

una gran variedad de ellos, nos enfocaremos al método que es de nuestro interés particular, el

método de puntos de frontera ( B P M , Boundary Point M e t h o d ) .


15

1.1.1 Método de diferencias finitas (FDM)

En este método, las derivadas en las ecuaciones diferenciales parciales que gobiernan el fenó¬

m e n o físico son discretizadas en forma de ecuaciones en diferencias. Por lo tanto, el cuerpo o

dominio de solución es discretizado o dividido como una malla de celdas y la aproximación en

diferencias es aplicada en cada celda interior. Esto resulta en un sistema de ecuaciones algebrái-

cas lineales (con una matriz de c o e i c i e n t e s en banda) que proporciona una solución única ya que

las condiciones de frontera del problema real son satisfechas.

La aproximación en diferencias f i n i t a s es la más simple y relativamente la más fácil de programar.

Su limitación principal al aplicarlo a problemas de ingeniería prácticos es que no es adecuado para

problemas con geometrías con fuertes irregularidades. Por otro lado, debido a que es dificil variar

el tamaño de las celdas en regiones particulares, no es adecuado para problemas donde los valores

de las variables cambian rápidamente, tal como en problemas con concentración de esfuerzos. En

la actualidad, los métodos de diferencias f i n i t a s son populares para problemas de transferencia de

calor y mecánica de fluidos, más que para problemas de análisis de esfuerzos.

1.1.2 Método de elementos finitos (FEM)

En la actualidad, los métodos de elementos finitos son ampliamente usados en análisis en inge-

niería. Estos métodos son usados extensamente en el análisis de sólidos y estructuras, en trans-

ferencia de calor y dinámica de fluidos; de hecho, los métodos de elementos finitos son útiles

prácticamente en cada campo de análisis de ingeniería.

En este método, el dominio de solución entero es dividido en pequeños elementos (elementos

finitos). Sobre cada elemento, el comportamiento es descrito por las ecuaciones diferenciales que

gobiernan el fenómeno físico. Todos estos pequeños elementos se mantienen conectados y los

requerimientos de continuidad y equilibrio son satisfechos entre los elementos vecinos. D a d o que

las condiciones de frontera del problema real son satisfechas, se puede obtener una solución única

con el sistema de ecuaciones lineales obtenido (en este caso, la matriz de c o e i c i e n t e s está poblada

de forma dispersa).
16

El F E M es muy adecuado para problemas prácticos de ingeniería de geometrías complejas. Para

obtener buena precisión en regiones donde los valores de las variables cambian rápidamente se

debe utilizar un gran número de elementos f i n o s .

1.1.3 Método de elementos de frontera (BEM)

Los ingenieros que han trabajado con programas desarrollados bajo el F E M se pueden preguntar

por qué es necesario crear otras técnicas de cómputo. L a respuesta es que el F E M ha demostrado

ser inadecuado o ineficaz en muchas aplicaciones de la ingeniería. El análisis con elementos f i n i t o s

sigue siendo un proceso comparativamente lento debido a la necesidad de definir o de redefinir

mallas en la pieza o el dominio bajo estudio.

El método de elementos de frontera ( B E M ) [1] surgió como una alternativa potencial a elementos

f i n i t o s ,particularmente para casos donde se requiere una mayor exactitud debido a los problemas

tales como concentración de esfuerzos o donde el dominio se extiende al infinito. Sin embargo,

la característica más importantes del método de elementos de frontera es que solamente requiere

la discretización de la frontera más que del dominio de solución. Por lo tanto, los códigos de el¬

ementos de frontera son más fáciles de utilizar con los modeladores de sólidos y los generadores

de mallas existentes. Esta ventaja es particularmente importante para el diseño, ya que el proceso

implica generalmente una serie de modificaciones que son más difíciles de realizar usando ele¬

mentos f i n i t o s . Las mallas pueden ser generadas fácilmente y los cambios de diseño no requieren

mallado completo.

En este método, las ecuaciones diferenciales que gobiernan el fenómeno físico son transformadas

en ecuaciones integrales que son aplicables sobre la frontera del dominio de solución. Estas ecua¬

ciones son integradas numéricamente sobre la frontera que se divide en pequeños segmentos de

frontera (o elementos de frontera). C o m o en los métodos anteriores, dado que las condiciones de

frontera son satisfechas, se obtiene un sistema de ecuaciones lineales para el que se obtiene una

solución única.

Con este método se pueden acomodar fronteras geométricamente complejas. Además, ya que

todas las aproximaciones están restringidas a la frontera, se pueden modelar regiones con variables

que cambian su valor rápidamente con mejor precisión que el F E M .


17

1.2 Métodos sin malla

Los métodos sin malla, se utilizan para establecer un sistema de ecuaciones algebraicas para el

dominio entero del problema sin el uso de una malla predefinida. Los métodos sin malla utilizan

un sistema de nodos dispersos dentro del dominio del problema, así como sistemas de nodos

dispersos en las fronteras del dominio para representar (no discretizar) el dominio del problema

y sus fronteras. Estos sistemas de nodos dispersos no forman una malla, lo que significa que no se

requiere ninguna información sobre la relación entre los nodos, por lo menos para la interpolación

de las variables del campo.

Hay un número de métodos sin malla, tales como el método de Galerkin libre de elementos (EFG)

[2], el método local sin malla de Petrov-Galerkin ( M L P G ) [3], el método de la interpolación

puntual (PIM) [4], el método del conjunto de puntos (PAM) [5], el método del punto finito [6],

el método de diferencias finitas con mallas irregulares arbitrarias [7, 8], y otros más. Todos estos

métodos comparten la misma característica que no requieren mallas predefinidas, por lo menos

para la interpolación de las variables del campo. L o s nombres para los varios métodos sin malla

todavía se están discutiendo. Debido a que la metodología todavía está en etapa de desarrollo,

constantemente se proponen nuevos nombres de métodos. Puede tardar cierto tiempo antes que

todos los métodos se categorizen y se unifiquen adecuadamente para evitar confusiones en la

comunidad.

En contraste con el F E M , se prefiere el término método libre de elementos, y en contraste con

F D M , se prefiere el término método de diferencias finitas usando mallas arbitrarias o irregulares.

El requisito mínimo para considerar un método como método sin malla es:

• Que una malla predefinida no es necesaria, por lo menos en la interpolación de las variables

del campo.

El requisito ideal para un método sin malla es:

• Que no se requiere malla alguna durante el proceso de solución del problema de una geometría

arbitraria dada gobernada por un sistema de ecuaciones diferenciales parciales sujetas a cualquier

tipo de condiciones de frontera.


18

La realidad es que los métodos sin malla desarrollados hasta ahora no son realmente ideales, y

fallan en una de las categorías siguientes:

• Métodos que requieren celdas de respaldo para la integración de las matrices del sistema

derivadas de la forma débil sobre el dominio del problema. Estos métodos no están realmente

libres de malla. L o s métodos E F G pertenecen a esta categoría. Estos métodos son prácticos en

gran medida, siempre y cuando sea generalmente factible la creación de una malla de fondo,

y siempre puede ser automatizada usando una malla triangular para dominios bidimensionales

(2D) y mallas tetrahédricas para dominios tridimensionales (3D).

• Métodos que requieren celdas de respaldo locales para la integración de las matrices del sistema

sobre el dominio del problema. Los métodos M L P G pertenecen a esta categoría. Se dice que

estos métodos son esencialmente libres de malla porque la creación de una malla local es más

fácil que crear una malla para el dominio entero del problema; es una tarea más simple que se

puede realizar automáticamente sin ninguna predefinición para la malla local.

• Métodos que no requieren una malla, pero que son menos estables y menos precisos. Los méto¬

dos de colocación y los métodos de diferencias f i n i t a s que utilizan mallas irregulares pertenecen

a esta categoría. La selección de nodos basados en el tipo de un problema físico es todavía im¬

portante para obtener resultados estables y precisos [9, 10, 11]. La automatización de la selec¬

ción de los nodos y el mejoramiento en la estabilidad de la solución son algunos de los desafíos

en estas clases de métodos. Este tipo de métodos tienen una ventaja muy significativa: son muy

fáciles de implementar, porque no se requiere ninguna integración.

• Métodos de partículas que requieren una predefinición de estas para sus volúmenes o masas.

El algoritmo entonces realizará los análisis incluso si el dominio del problema experimenta

la deformación y separación extremadamente grandes. Los métodos SPH pertenecen a esta

categoría. Este tipo de métodos sufren de problemas en la imposición de las condiciones de

frontera. Además, la predefinición de las partículas todavía requiere técnicamente una cierta

clase de malla.
19

1.2.1 Necesidad de los métodos sin malla

El F E M es robusto y se ha desarrollado a fondo para el análisis de esfuerzos estáticos y dinámi¬

cos, lineales o no lineales de sólidos y estructuras, así como de flujos de fluidos. L a mayoría de los

problemas prácticos de la ingeniería relacionados con sólidos y estructuras se solucionan actual¬

mente usando una gran cantidad de paquetes bien desarrollados del F E M que están disponibles en

el mercado. Sin embargo, las siguientes limitaciones del F E M se están poniendo cada vez más de

manifiesto:

1. L a creación de una malla para el dominio del problema es un requisito previo al usar los

paquetes del F E M . El analista pasa generalmente la mayor parte de su tiempo creando la

malla, y se convierte en un componente importante del costo de un proyecto de simulación

porque el costo del tiempo de la C P U (unidad central de procesamiento) está disminuyendo

drásticamente. L a preocupación es más por el tiempo de la m a n o de obra, y menos por

el tiempo de computadora. Por lo tanto, idealmente el proceso de mallado sería realizado

completamente por la computadora sin la intervención humana.

2. Durante los cálculos, los esfuerzos obtenidos son discontinuos y menos exactos usando los

paquetes de F E M .

3. Al manejar deformaciones grandes, la precisión se pierde considerable debido a las distor¬

siones de los elementos.

4. E s muy difícil simular crecimiento de grieta con las trayectorias arbitrarias y complejas y las

transformaciones de la fase debido a las discontinuidades que no coinciden con las líneas

nodales originales.

5. E s muy difícil simular la fractura del material en una gran cantidad de fragmentos pues el

F E M esencialmente se basa en la mecánica del medio continuo, en la que los elementos for¬

mulados no pueden estar divididos. Los elementos pueden ser, o totalmente fragmentados o

permanecer como una pieza completa. Esto lleva generalmente a una mala representación de

la trayectoria de la fractura. U n error serio puede ocurrir porque la naturaleza del problema

es no lineal; y por lo tanto, los resultados son altamente dependientes de la trayectoria.


20

6. Se han propuesto aproximaciones de re-mallado para manejar estos tipos de problemas en el

F E M . En la aproximación del re-mallado, el dominio del problema es re-mallado en cada

paso durante el proceso de la simulación para prevenir la distorsión severa de elementos y

para permitir que las líneas nodales sigan siendo coincidentes con las fronteras de la discon¬

tinuidad. Con este i n , se han desarrollado procesadores complejos, robustos, y generadores

de mallas adaptivas. Sin embargo, estos procesadores son solamente realizables para proble¬

mas en 2D. N o hay procesadores confiables disponibles para crear mallas hexahédricas para

problemas 3D debido a la dificultad técnica.

7. L o s procesadores adaptantes requieren el mapeo de las variables del campo entre las mallas

en etapas sucesivas durante la solución del problema. Este proceso de mapeo lleva a m e n u d o

a realizar cálculos adicionales, así como una degradación de la exactitud. Además, para los

problemas grandes en 3D, el costo de cómputo de re-mallar en cada paso llega a ser muy

alto, incluso si un esquema adaptivo está disponible.

8. L o s F D M trabajan muy bien para una gran cantidad de problemas, especialmente para solu¬

cionar problemas de la dinámica de l u i d o s . Pero adolecen de una desventaja importante, en

que dependen de nodos regularmente distribuidos. Por lo tanto, se han efectuado estudios du¬

rante mucho tiempo para desarrollar métodos que utilicen mallas irregulares. Actualmente,

se siguen realizando esfuerzos en esta dirección.

1.2.2 La idea de los métodos sin malla

U n a evaluación enfocada a estas dificultades asociadas al F E M revela la raíz del problema: la

necesidad de utilizar los elementos, que son la base de construcción del F E M . Se requiere una

malla con conectividad predefinida para formar los elementos. Mientras se requiera utilizar ele¬

mentos, los problemas mencionados anteriormente no serán fáciles de solucionar. Por lo tanto, la

idea de eliminar los elementos, y por lo tanto las mallas, ha evolucionado naturalmente. se han

propuesto los conceptos de métodos libres de elementos o libres de malla, en los que el dominio

del problema está representado por un sistema de nodos arbitrariamente distribuidos.


21

Los métodos sin malla tienen gran potencial para solucionar los problemas difíciles menciona¬

dos arriba. Los esquemas adaptivos pueden ser desarrollados fácilmente, pues no hay malla, y por

lo tanto ningun concepto de conectividad esta implicado. Así, no hay necesidad de proporcionar

a priori ninguna información sobre la relación entre los nodos. Esto proporciona f l e x i b i l i d a d en

la adición o la supresión de nodos o puntos siempre y donde sean necesarios. Por ejemplo, para

el análisis de esfuerzos de un dominio sólido, existen a menudo áreas de concentración de es¬

fuerzos, incluso singularidades. U n o puede agregar, con relativa libertad, puntos en el área de

concentración de esfuerzos sin la preocupación de su relación con los otros puntos existentes. En

problemas de crecimiento de grieta, los puntos se pueden agregar fácilmente alrededor de la nariz

o punta de la grieta para capturar la concentración de esfuerzos con la exactitud deseada. Este rei¬

namiento nodal se puede desplazar junto con la propagación de la grieta con un arreglo de puntos

de apoyo asociados con la geometría global. Las mallas adaptivas de una gran variedad de prob¬

lemas, en 2 D o 3D, incluyendo análisis de esfuerzos lineales y no lineales, estáticos y dinámicos,

se pueden tratar con mucha eficacia en los métodos sin malla de una forma relativamente simple.

Debido a que no hay necesidad de crear una malla, y los puntos se pueden crear por una com¬

putadora en una manera completamente automatizada, el tiempo que un ingeniero pasaría en la

generación convencional de una malla puede ser disminuído. Esto se puede traducir en ahorros

substanciales del costo y del tiempo en proyectos del modelado y de la simulación.

1.2.3 Método de Puntos de Frontera (BPM)

El método de puntos de frontera (BPM) es un método sin malla relativamente nuevo desarrolla¬

do para obtener la solución de una amplia gama de ecuaciones integrales de la físico matemática

propuesto por Vladimir M a z ' y a [13, 14] y V. M a z ' y a y G. Shmidt [15]. El análisis de multires-

olución basado en estas funciones fue propuesto en los trabajos de V. M a z ' y a y G. Shmidt [16].

La utilización de estas funciones para la solución de las ecuaciones integrales de elasticidad tiene

dos ventajas principales. L a primera, es que la acción de los operadores integrales del problema

sobre estas funciones son combinaciones de unas cuantas funciones estandar. Estas, simplemente

pueden ser tabuladas, mantenidas en la memoria de la computadora y posteriormente ser usadas

para la solución de cualquier problema de elasticidad. C o m o resultado, el tiempo para el cálculo


22

de la matriz del sistema de ecuaciones lineales obtenido después de la discretización del problema

es reducido sustancialmente comparado con el B E M .

También es importante hacer notar que el B P M no requiere la construcción de una malla en la

frontera. E n lugar de eso, utiliza las coordenadas de un número finito de puntos en la frontera y la

orientación de la frontera a partir de vectores unitarios normales exteriores a la frontera en cada

punto. Esto representa menor información que la requerida en el B E M , donde la forma de los

elementos de las fronteras deben ser definidas. Entonces los puntos de frontera en el B P M juegan

el papel de los elementos de frontera en el B E M . La idea general es utilizar una función base

localizada (tal como una distribución Gaussiana) centrada alrededor de cada punto de la frontera

concentradas en los planos tangentes a la frontera en cada punto o nodo. La teoría de aproximación

en la aplicación más simple del método, las integrales de frontera resultantes son aproximadas por

integrales sobre la tangente a cada punto de la frontera, llevando una aproximación de segundo

orden a la solución exacta. L a simetría radial de las funciones base ayudan en la determinación de

expresiones analíticas para las integrales de frontera requeridas.

1.3 Meta y objetivos

Por lo descrito anteriormente podemos establecer que esta tesis tiene como meta fundamental

presentar una metodología en la que se aplica el M é t o d o de Puntos de Frontera (BPM, Boundary

Points Method) a la solución de problemas de elasticidad, tanto estáticos como dinámicos, de

cuerpos homogéneos con grietas y/o inclusiones y de plasticidad. Para alcanzar esta meta se tienen

establecidos los siguientes objetivos generales:

• Aplicar la metodología a la solución de la ecuación integral del segundo problema de elas¬

ticidad de cuerpos homogéneos sin y con grieta, comprobando su aplicabilidad con algunos

problemas cuya solución exacta es conocida.

• Aplicar la metodología a la solución de la ecuación integral del segundo problema de elasto-

plasticidad de cuerpos homogéneos, comprobando su aplicabilidad con otros métodos, como

por ejemplo, F E M , mediante el uso del programa comercial A N S Y S .


23

• Aplicar la metodología a la solución de la ecuación integral del problema de elasticidad dinámi¬

ca de cuerpos homogéneos con grieta, comprobando su aplicabilidad con algunos problemas

cuya solución exacta es conocida.


24

2 Funciones de aproximación

Supongamos que se nos da la tarea de dibujar la gráfica de la función

obtenida mediante la suma de las Gaussianas desplazadas, como se muestra en la figura (2.1)

Fig. 2 . 1 : Gaussianas.

Por supuesto, la función f (x) está acotada, es positiva y suave; además, f (x + 1) = f (x), es

decir, es periódica con período 1, por lo que esperamos que la gráfica de f debería verse como

una curva ondulada periódica agradable. Sin embargo, es interesante encontrar que esta gráfica es

una constante, como se muestra en la f i g u r a (2.2).

Fig. 2.2: Gráfica de f (x).


25

En efecto, esta impresión superficial está equivocada. Si la escala del eje y se modifica como

en la figura (2.3), entonces podemos ver que f (x) no es constante y oscila entre 2 , 5 0 6 6 2 8 2 6 y

2,50662829.

Fig. 2.3: Gráfica de f (x) aumentada.

Se obtiene la misma gráfica si el procedimiento se repite para la suma

Con diferentes valores del parámetro D > 0. Las figuras (2.4, 2.5) muestran las gráficas de fD

para los parámetros D = 0 , 5 y D = 4 , respectivamente. La gráfica de la función f (x) 1/2 muestra

el comportamiento oscilante, mientras que f 4 parece ser una constante. En efecto, f 4 también
- 1 5
es oscilante alrededor de 3 , 5 4 4 9 0 7 7 0 1 8 1 1 0 3 2 0 5 ± 1 , 4 3 x 1 0 , que es muy difícil de graficar.

P o d e m o s concluir, que la función oscilante f D tiende a una constante si D se incrementa.

Para explicar rigurosamente las peculiaridades de las gráficas, consideremos la serie de Fourier de

la función

(2.1)

Sus coeficientes se pueden calcular como sigue


26

Fig. 2.4: f (x)


1/2 y términos individuales.

Fig. 2.5: f (x) 4 y términos individuales.

El orden de la sumatoria y la integración se puede intercambiar debido a la convergencia absoluta

de la sumatoria infinita. Entonces obtenemos la serie de Fourier

(2.2)

Esta representación de la función 6 es un caso especial de la conocida sumatoria de Poisson

(2.3)
27

donde F u denota la transformada de Fourier de la función u. D e la ecuación (2.2), tenemos

es decir, nuestra función θ (x, D) difiere de 1 por la serie infinita

(2.4)

Los coeficientes e - π 2 D v 2
, v = 1, 2 , . . . , pueden ser muy pequeños dependiendo de D, c o m o se
- π 2 - 5
puede ver de la relación e = 5.172 3 x 1 0 . En particular, si D ≥1, entonces para cualquier
- 4 D
x, el m ó d u l o de la ecuación (2.4) es menor que 1,04 x 1 0 . N ó t e s e que para los casos D = 2

y D = 4 la diferencia es comparable a las presiciones simple y doble, respectivamente, en la

aritmética de las computadoras modernas; es decir, en estos casos donde la función θ (x, D) es

numéricamente la función constante 1. A d e m á s , la diferencia |θ(x, D) — 1| se puede hacer menor

que cualquier tolerancia positivo prescrita ε, escogiendo D suficientemente grande. Para ello es

s u i c i e n t e considerar

D > π (log |ε| -


2
log2).

Nota. L a función θestá fuertemente conectada con la función Teta de Jacobi V3, que está definida

c o m o [17]

mediante la relación θ(x, D) = V 3 (ΠX|iΠD).


28

3 Problema de elasticidad bidimensional

3.1 Formulación del problema plano en lenguaje de ecuaciones inte¬

grales

Consideremos un cuerpo elástico que ocupa una región en el espacio de dos o tres dimensiones

con una frontera suave Γ, el material del cuerpo es homogéneo con el tensor módulo elástico

C (C i j k l son los componentes de este tensor). El vector desplazamiento u (x) de los puntos del

cuerpo satisface la ecuación

(3.1)

Aquí, q es el vector de fuerzas de cuerpo, x (i = 1, 2, 3 para el caso tridimensional o i = 1, 2


i

para el caso bidimensional) son las coordenadas cartesianas de cada punto x del cuerpo. En la

notación consideramos que se realiza la suma con respecto a índices repetidos. El segundo prob­

lema de elasticidad de valores en la frontera es la solución de la ecuación (3.1) con las siguientes

condiciones en la frontera Γ:

σ (x) • n ( x ) | = f (x),
Γ
σ ij (x)= C i j k l
u (x).
l (3.2)

Aquí, σ(x) es el tensor de esfuerzos con componentes σ , n ( x ) es un vector normal dirigido


ij

hacia el exterior de la frontera Γen el punto x EΓ, f (x) es el vector de fuerzas aplicadas en la

frontera del cuerpo, el punto significa operación producto escalar entre tensores y vectores; es

decir, σ • n →σ n .
i j j

La función de Green, G ( x ) , es el operador diferencial en el lado izquierdo de la ecuación (3.1)

que satisface la ecuación siguiente

(3.3)

D o n d e δ(x) es la función delta de Dirac y δ es el símbolo delta de Kronecker.


ij
29

La integral de frontera

(3.4)

se llama el potential de doble capa con vector densidad b ( x ) . Este potential satisface la ecuación

(3.1) en todo el dominio excepto sobre la frontera Γ, en donde tiene una discontinuidad. El salto

del potential U (x) sobre Γes igual a su densidad b (x) [19, 20, 24].

[U (x0)] = U (x0 + 0) - U (x0 - 0) = b ( x 0 ) , x 0 E Γ. (3.5)

En esta última ecuación, U ( x + 0) es un valor límite del potential U (x) cuando x


0 →x 0 E Γ

desde el lado del vector normal externo n ( x ) en el punto x , y U ( x — 0) es el m i s m o límite


0 0 0

cuando x → x 0 E Γ desde el lado opuesto del vector normal n ( x ) . 0

El campo de esfuerzos Σ(x) que corresponde al potential U (x) tiene la forma siguiente:

(3.6)

Debido a que la función U (x) tiene un salto sobre la frontera Γ, esta integral contiene una función

delta singular concentrada sobre ΓIntroduzcamos la función tensorial de rango cuatro, S ( x ) ,

c o m o sigue:

(3.7)

Entonces, el potencial

Σ1ij =
(x) Sijkl ( x - x ' ) nk ( x ' ) bl (x') dΓ. (3.8)

coincide con el potencial Σ(x) en todas partes excepto en la frontera Γ. Es posible mostrar [20,
1 1
24], que Σ (x) no tiene una componente singular concentrada sobre Γ, y Σ (x) satisface la

ecuación

1
en todo el espacio. El salto del tensor Σ (x) sobre la frontera Γ tiene la forma [20, 24]

[Σ1ij (x0)] = - S i j k L (n0) n0kbL (x0) , x0 E Γ , (3.9)


30

Aquí n = n ( x ) , S ( n ) = S ( k ) |
0 0 0 k = n o y S ( k ) es la transformada de Fourier de la función S ( x )

definida en la ecuación (3.7). D e la ecuación (3.7) se obtiene la siguiente expresión para S ( k ) :

- 1
S i j k l (k) = C i j k l k k G
k m l s (k) C m s p q - C i j p q , G ls (k) = [k k C
i j i l j s ] , (3.10)

donde G ( k ) es la transfromada de Fourier de la función de Green definida en la ecuación (3.3)

Para cuerpos isotrópicos G ls (k) tiene la forma

donde para el caso tridimensional, siendo λ y μ los coeficientes de L a m é del 0 0

medio. Para el problema plano, N toma una de las formas siguientes, según sea el caso:
0

para estado de deformación plana.


(3.11)
para estado de esfuerzos planos.

y v es la razón de Poisson. D e acuerdo con las ecuaciones (3.9, 3.10) la componente normal de
0

1
Σ (x) es continua sobre la frontera Γ; es decir,

1
[n • Σ ( x ) ] = 0.
0 0
(3.12)

1
L a s propiedades mencionadas de Σ ( x ) nos permite utilizar este potencial para la determinación

del tensor de esfuerzos σ(x) en la región Ωcon frontera Γ. Entonces, encontremos σ ( x ) en la

forma

1
σij (x) = Σ ij (x) = S i j k l (x - x') n k ( x ' ) bl ( x ' ) dΓ'.

La ecuación integral para la densidad desconocida b (x) en esta ecuación se obtiene a partir de la

condición de frontera (3.2), y t o m a la forma

T (x, x ' ) • b (x') dΓ = f ( x ) , x E Γ,


(3.14)

Tij (x, x') = n k (x) S k i j l (x - x') n ( x ) .


l
(3.15)

El núcleo del operador integral en la ecuación (3.14) tiene la sigularidad fuerte

- 3
T (x, x ' ) ~ |x ̶ x ' | cuando x' →x
31

por lo que se debe definir un procedimiento de regularización para el cálculo de la integral en

la ecuación (3.14) . Se demuestra en [20, 24], que la integral en la ecuación (3.14) se puede

comprender en el sentido siguiente:

T (x, x') • b (x') dΓ' = v.p. T (x, x') • [b (x') - b (x)] dΓ'. (3.16)

Aquí, Γse considera como una frontera cerrada suave; la integral en el lado derecho, se entiende

en el sentido de su valor principal de Cauchy (v.p.), b (x) es una función finita suave. La misma

fórmula de regularización se puede aplicar a una frontera abierta si b (x) →0 cuando x → Γ,

donde Γes el contorno frontera de Γ.

En el caso de cuerpos con grietas, las fronteras de las grietas Γ deben ser incluidas como parte de
C

la frontera total del cuerpo. Las condiciones de frontera sobre Γ tienen la forma siguiente:
c

n (x) • σ(x) |Γ = 0 c (3.17)

si los lados de las grietas están libres de esfuerzos. Aquí, n (x) es un vector normal arbitrario a Γ c

en el punto x E Γ . C

Nota 1. Las ecuaciones (3.13, 3.14) también se pueden aplicar a la solución del problema de

elasticidad para cuerpos con grietas cuyos lados no estén libres de esfuerzos; pero las fuerzas

aplicadas a los diferentes lados de las fronteras de la grieta deben ser de la misma magnitud y

de direcciones opuestas. en este caso, la condición de frontera (3.17) se cambia por la condición

n • σ|Γ = f, donde f es la fuerza aplicada en el lado positivo de la grieta (Cualquier lado de la


c

grieta se puede escoger como positivo y n es un vector normal externo a este lado.)

Nota 2. El potencial U (x) en la ecuación (3.4) representa los desplazamientos de los puntos del

cuerpo que corresponde al tensor de esfuerzos en la ecuación (3.13). A partir de la propiedad

(3.5) de U ( x ) , se sigue que el vector b (x) en las ecuaciones (3.13, 3.14) es el salto del vector de

desplazamiento sobre la frontera de la grieta (apertura de la grieta).

Nota 3. Usualmente, para la solución del segundo problema de elasticidad con valores en la fron¬

tera, el vector de desplazamiento se presenta en la forma del potencial de capa simple (denominado

método indirecto.) C o m o resultado, el núcleo del operador en la ecuación integral del problema

no tiene la singularidad fuerte como la del núcleo de la ecuación (3.14); pero el potencial de capa
32

simple no puede utilizarse para las simulaciones de grietas ya que es continuo sobre las fronteras

de su distribución.

C o m o se mencionó anteriormente, la ventaja de las ecuaciones (3.13, 3.14) es que las fronteras

de grieta se pueden incluir c o m o parte de la frontera total Γdel cuerpo. L a solución única de la

ecuación (3.14) existe si su lado derecho, f ( x ) , (el vector de las fuerzas de frontera) satisface las

condiciones

F0 = f (x) dΓ = 0, M0 = x x f (x) dΓ = 0. (3.18)

(La fuerza total, F , y el m o m e n t o total, M , de las fuerzas aplicadas f (x) deben ser iguales a
0 0

cero. Las fronteras de grieta no participan en esta condición).

3.2 Acción de los operadores del problema sobre las funciones de

Gauss

Para la solución numérica de la ecuación integral (3.14) utilizaremos la clase especial de funciones

de aproximación descritas en 2. Consideremos una función finita suave u (x) dependiente de la

coordenada x en la región — ∞ < x < ∞. Esta función se puede aproximar mediante las series

siguientes

(3.19)

Aquí, mh ( m = 0, ± 1 , ± 2 , . . . ) son las coordenadas de los nodos de aproximación, h es la distancia

entre los nodos, D es un parámetro adimensional. E s posible demostrar, de acuerdo con [21, 14],

que la siguiente evaluación para el error de aproximación se cumple,

u (x) = u h (x) + R (x) ,

|R (x)| ≥(||u|| + | | u ' | | ) R ( D ) + ||u"||


0
R0 (D) = O ( e x p ( - π D ) ) .
2
(3.20)
32

simple no puede utilizarse para las simulaciones de grietas ya que es continuo sobre las fronteras

de su distribución.

C o m o se mencionó anteriormente, la ventaja de las ecuaciones (3.13, 3.14) es que las fronteras

de grieta se pueden incluir c o m o parte de la frontera total Γdel cuerpo. L a solución única de la

ecuación (3.14) existe si su lado derecho, f ( x ) , (el vector de las fuerzas de frontera) satisface las

condiciones

F0 = f (x) dΓ = 0, M0 = x x f (x) dΓ = 0. (3.18)

(La fuerza total, F , y el m o m e n t o total, M , de las fuerzas aplicadas f (x) deben ser iguales a
0 0

cero. Las fronteras de grieta no participan en esta condición).

3.2 Acción de los operadores del problema sobre las funciones de

Gauss

Para la solución numérica de la ecuación integral (3.14) utilizaremos la clase especial de funciones

de aproximación descritas en 2. Consideremos una función finita suave u (x) dependiente de la

coordenada x en la región — ∞ < x < ∞. Esta función se puede aproximar mediante las series

siguientes

(3.19)

Aquí, mh ( m = 0, ± 1 , ± 2 , . . . ) son las coordenadas de los nodos de aproximación, h es la distancia

entre los nodos, D es un parámetro adimensional. E s posible demostrar, de acuerdo con [21, 14],

que la siguiente evaluación para el error de aproximación se cumple,

u (x) = u h (x) + R (x) ,

|R (x)| ≥(||u|| + | | u ' | | ) R ( D ) + ||u"||


0
R0 (D) = O ( e x p ( - π D ) ) .
2
(3.20)
33

Así, el error de aproximación R (x), ecuación (3.20), depende de dos parámetros: la dispersión D

y el paso de aproximación h. Si h es suficientemente pequeño y D = O (1) este error se puede

considerar prácticamente despreciable. Consideremos la aproximación (3.19) en algunos casos

particulares.

P R I M E R C A S O . Consideremos la función u (x) como el impulso unitario en el intervalo ̶1 <

x < 1; es decir,

(3.21)

Las gráficas de los errores de aproximación

R(x) = u(x) ̶ u ( x ) ,
h u (x) =
h
φ(x ̶ m h )

se presentan en la figura (3.1) para M = 50 y D = 0,2 (línea sólida), D = 2 (línea con triángulos),

D = 20 (línea con puntos); y en la figura (3.2) para D = 2 y M = 20 (línea sólida), M = 40(línea

con triángulos), M = 60 (línea con puntos). Aquí, 2 M + 1 es el número de puntos dentro del

intervalo (̶1,1), h =

En estas gráficas se puede observar que el error R (x) está concentrado cerca de los extremos

del intervalo (̶1,1) y es mínimo para D D = 2. El m á x i m o del error decrece con el paso de la

aproximación h.

Fig. 3.1: R (x) de la aprox. Gaussiana de la ec.(3.21). D variable.


34

Fig. 3.2: R (x) de la aprox. Gaussiana de la ec.(3.21). D = 2.

Error R (x) de la aproximación Gaussiana de la función impulso en la ecuación (3.21)

S E G U N D O C A S O . Consideremos la función u (x) definida por la ecuación

u (x) = (3.22)

Las gráficas de los errores de aproximación

R (x) = u (x) — u ( x ) ,
h uh (x) = (x — m h )

se presentan en la figura (3.3) para D = 2 y M = 20 (línea sólida), M = 40 (línea con triángulos),

M = 60 (línea con puntos.) C o m o en el primer caso, el error es máximo en los extremos del

intervalo (—1,1), pero debido a la continuidad de u ( x ) , este error es menor que en el primer caso,

y el m í n i m o del error se obtiene nuevamente para D = 2.

El análisis detallado de la aproximación (3.19) se presenta en los trabajos de M a z ' y a [21, 14, 15].

Fig. 3.3: R ( x ) de la aprox. Gaussiana de la ec.(3.22). D = 2.


35

3.3 Discretización de las ecuaciones integrales del segundo problema

de elasticidad. Caso plano

Consideremos un cuerpo isotrópico homogéneo que ocupa una área plana Ωcon frontera Γ, como

se muestra en la figura (3.4). La solución del segundo problema de elasticidad de valores en la

frontera para esta área se puede determinar a partir de las ecuaciones (3.13, 3.14). L a ecuación

(3.13) para el tensor de esfuerzos σ( x , y) se puede reescribir de la forma siguiente:

(3.23)

donde Γ(x, y) es la función delta concentrada sobre el contorno de frontera Γ, la integral se realiza

sobre todo el espacio bidimensional. Para la construcción de la solución numérica de este prob­
( i ) (i)
lema, seleccionemos un conjunto de puntos ( x , y ) sobre la frontera Γ, con distancias iguales

entre ellos, y cambiemos el potential (3.23) concentrado sobre Γpor la suma de potenciales con­

centrados sobre las líneas tangentes γ en cada punto i, ver figura (3.4). Entonces, la distribución
i

b ( x , y) Γ(x, y) en la ecuación (3.23) es aproximada por la suma siguiente

(3.24)

donde γ (x, y) es la función delta concentrada sobre la línea tangente γ . D e acuerdo a la aproxi­
i i

mación (3.19), la función φ (x) tiene la forma


i

(3.25)

( i )
donde h es la distancia entre nodos vecinos, con D = 2. L o s vectores b en la ecuación (3.24)

son las incógnitas principales del problema.

Si sustituímos la ecuación (3.24) en la ecuación (3.23), esta última se convierte en la suma de

potenciales concentrados en las líneas tangentes γ en cada nodo de la frontera Γ.


i

σ( x, y) = [S (x — x', y — y') • n (x', y')] • b (x', y') Γ(x', y') dx'dy' ≈

(i)
I (x,y) • b , ( i )
(3.26)

( i )
I ( x , y ) = S (x - x', y - y') • n
(i)
φ (x', y') dγ'.
i (3.27)
36

( i ) ( i )
Fig. 3.4: Bases global (e e ) y local ( s , n
1 2 ) de un área plana Ωcon frontera Γ.

Consideremos la integral que corresponde al nodo i-ésimo en el sistema de coordenadas local

(s, z) de este nodo, c o m o se muestra en la figura (3.4),

( i )
I (s,z) = S (s-s',z) •n φ (s') ds'. (3.28)

Aquí, s es la coordenada a lo largo de la tangente del i-ésimo nodo, z es la coordenada a lo largo


( i ) (i) (i)
del eje paralelo al vector n normal a Γen el i-ésimo nodo. En este sistema, n 1 = 0y n 2 = 1.

La integral en la ecuación (3.28) se puede reescribir c o m o la integral sobre todo el plano infinito

(s, z) si se utiliza la función delta de Dirac, δ(z),

I (s,z) =
ijl
S i j k l (s̶s', z ̶ z') n φ (s') δ(z') k ds'dz'. (3.29)

Debido a que esta es una integral del tipo convolución, se puede reescribir mediante transformadas

de Fourier de las funciones del integrando en la forma

I (s,z) =
ijl

S i j k l (k , k ) n φ (k )
1 2 k 1 e-i(k1s+k2z)
dk dk .
1 2
(3.30)

Aquí, la transformada de Fourier S (k) del tensor S (x) esta definida en la ecuación (3.10); y para

el caso de un medio isotrópico toma la forma (ver Apéndice A)

S (k) = -4μ N 0 0 [E -2E


1 5 (m) + E 6 (m)] , m = k = |k|. (3.31)
37

Los tensores E , E 1 5 ( m ) y E ( m ) en esta ecuación tienen los componentes siguientes (ver Apéndice
6

A)

E 1 i j k l = δδ, i(k j)l E 5 i j k l (m) = m δ ( i i ) ( k m ,


l ) E 6 i j k l ( m ) = mmm m, i j k l (3.32)

en donde los paréntesis en los subíndices significan simetrización.

La transformada de Fourier ( k ) de la función


1 φ(s) tiene la forma

(3.33)

Después de calcular la integral en la ecuación (3.29) con respecto a k obtenemos 2

(3.34)

donde

(i) ( i )
Aquí s , n son los vectores unitarios sobre los ejes s y z, respectivamente, y

Aquí, i = Después de sustituir la ecuación (3.34) en la ecuación (3.30) e integrando con

respecto a k , obtenemos la siguiente expresión del tensor I


1

I (s, z) = -4μ0N0 [J (s, z) t 11 11 + J12 ( s , z) t 1 2 + J21 ( s , z) t 2 1 + J 22 ( s , z) t ] ,


2 2 (3.36)
38

con

Aquí, las cuatro funciones j (ζ, η) tienen la forma de las integrales siguientes
i

(3.37)

Estas integrales dependen de las variables adimensionales (ζ, η) y simplemente pueden ser tabu­

ladas y mantenidas en la memoria de la computadora para cálculos posteriores. Para

10 estas integrales pueden ser cambiadas por sus expresiones asimptóticas siguientes

(3.38)
39

Nótese que las ecuaciones siguientes conectan las funciones con la función de error

especial Erf(z)

(3.39)

Introduzcamos un sistema de coordenadas global con la base Cartesiana ( e 1 ; e ) , y el sistema de


2

( i ) ( i ) ( i ) ( i )
coordenadas local, ( s , n ) , conectado con los nodos sobre la frontera Γ. ( s , n ) son vectores
( i )
unitarios de la base local en el nodo x , ver figura (3.4)

( i ) ( i ) ( i )
En la base local ( s , n ) , el vector b de la ecuación (3.24) tiene la forma

(3.40)

La conexión entre la base global y la base local en el i-ésimo nodo tiene la forma
s(i) = cos(βi)e1 + sin(βi)e2 n(i) = - sin(βi)e1 + cos(βi)e2. (3.41)

( i ) ( i )
Aquí,βieselánguloentrelosvectoresunitariose2yn(i),figura(3.4).Lascoordenadas de un punto arbitrario x(x, y) en la base local ( s , n

( i ) ( i ) (i) (i)
x = xe + ye = r
1 2 s + rs n , (3.42)

con

rs(i) =(x-x(i) cos(βi)+(y-y(i)sin(β),rn(i)= -(x-x(i) sin(βi)+(y-y(i))cos(βi).

La conección entre las bases locales entre los nodos i-ésimo y j - é s i m o tiene la forma

s(j) =cos(γji)s(i)+sin(γj)n(i,n(j)= -sin(γji)s(i)+cos(γji)n(,γji=βj- βi

(3.43)
40

La expresión (3.26) para el tensor de esfuerzos en un punto arbitrario x del medio es aproximada

por la ecuación siguiente

(i) (i) ( i )
σ( x , y ) (x - x ,y - y) •b =

Usando las ecuaciones (3.43), el tensor de esfuerzos en la base global ( e , e ) tiene la forma 1 2

siguiente

(3.45)

donde, para k, l = 1, 2,

El vector de fuerzas de frontera que actúa en el i-ésimo nodo tiene la forma siguiente

(i) (i) (i)


f (x ,y )= f ; (3.46)

donde

(i) ( i )
f = n • σ (x,y) = n ( i )
• (S (x - x', y - y') • n (x', y')) • b (x', y') dΓ'

(j) (j) ( j )
• I (x - x ,y - y) • b .

En la base local del i-ésimo nodo, este vector tiene la forma

(i) ( i ) ( i ) ( i ) ( i )
f = f s s + f n n , (3.47)
41

donde los componentes de la fuerza de frontera son

(3.48)

y los componentes de A son

(3.49)

Aquí, los argumentos γ - están definidos en la ecuación (3.43), y


ij

(ij) ( i ) ( j ) ( i ) (j)
r s = (x - x ) cos(β ) + ( y
j - y) sin ( β ) ,
j

(ij) ( i ) (j) ( i ) (j)


(3.50)
r n = - (x - x) sin(β ) + (yj - y) cos ( β ) .
j

(i)
El sistema de ecuaciones algebráicas líneales para los componentes de los vectores b

en la base local, se pueden obtener a partir de las condiciones de frontera de la ecuación (3.2) que

serán satisfechas en todos los nodos (método de colocación).

Introduzcamos u n vector columna X para las incógnitas que están conectadas con los compo-

nentes por las relaciones

X = ||X || , j j = 1, 2, 3 , . . . , 2N,
(i) (i)
(3.51)
X 2 i - 1 = b , S X2i = b , n i = 1, 2, 3 , . . . , M .

Aquí, M es el número total de puntos de frontera. El vector columna F define las f u e r z a s que

actúan en los puntos de frontera

F = ||F || , j j = 1, 2, 3 , . . . , 2M,
(i) (i)
(3.52)
F 2 i - 1 = f,
s F2 = i f n i = 1, 2, 3 , . . . , M .

(i) (i)
Aquí,(f , f )
s n son los valores de los componentes de las fuerzas (tangencial, f , y normal, s f)
n

aplicadas en los puntos de frontera, y que son conocidas a partir de las condiciones de frontera.
42

Las ecuaciones para la determinación del vector X tienen la forma

Bij Xj = F, i j = 1, 2, 3 , . . . , 2 M . (3.53)

Aquí los componentes de la matriz B =||Bij|| están definidas por las ecuaciones siguientes

(3.54)

Nótese que los componentes de la matriz B en las ecuaciones (3.54, 3.49) están expresadas m e ­

diante las funciones estandar (3.37), y el tiempo de computadora para sus cálculos es pequeño.

Después de la solución de la ecuación (3.53), el tensor de esfuerzos en un punto arbitrario del

cuerpo se puede determinar utilizando la ecuación (3.45).

3.4 Ejemplos de solución numérica del problema

Para evaluar la capacidad del método numérico propuesto, lo aplicaremos a los dos problemas

siguientes que tienen solución exacta:

1. U n plano elástico infinito con un orificio circular de radio unitario.

2. U n disco elástico de radio unitario.

P R I M E R C A S O . Consideremos un plano elástico con un orificio circular de radio unitario ( R =

1), sujeto a un campo tensorial uniaxial constante, σ , aplicado en el infinito a lo largo de la


0

coordenada x, ver figura (3.5).

σ0 = e 1 x e1 (3.55)

La condición de frontera en el borde Γdel orificio es

n • σ| = 0.
r (3.56)
42

Las ecuaciones para la determinación del vector X tienen la forma

Bij Xj = F, i j = 1, 2, 3 , . . . , 2 M . (3.53)

Aquí los componentes de la matriz B =||Bij|| están definidas por las ecuaciones siguientes

(3.54)

Nótese que los componentes de la matriz B en las ecuaciones (3.54, 3.49) están expresadas m e ­

diante las funciones estandar (3.37), y el tiempo de computadora para sus cálculos es pequeño.

Después de la solución de la ecuación (3.53), el tensor de esfuerzos en un punto arbitrario del

cuerpo se puede determinar utilizando la ecuación (3.45).

3.4 Ejemplos de solución numérica del problema

Para evaluar la capacidad del método numérico propuesto, lo aplicaremos a los dos problemas

siguientes que tienen solución exacta:

1. U n plano elástico infinito con un orificio circular de radio unitario.

2. U n disco elástico de radio unitario.

P R I M E R C A S O . Consideremos un plano elástico con un orificio circular de radio unitario ( R =

1), sujeto a un campo tensorial uniaxial constante, σ , aplicado en el infinito a lo largo de la


0

coordenada x, ver figura (3.5).

σ0 = e 1 x e1 (3.55)

La condición de frontera en el borde Γdel orificio es

n • σ| = 0.
r (3.56)
43

El campo de esfuerzos en el medio se puede encontrar de forma similar a la ecuación (3.13)

σ(x) = σ0 + [S ( x - x ' ) • n (x')] • b (x') dΓ' . (3.57)

La ecuación integral para el vector b (x) se puede expresar a partir de las condiciones de frontera

ecuación (3.2), y toma la forma

n (x) • [S(x - x') • n (x')] • b (x') dΓ' = - n (x) • σ,


0 x E Γ . (3.58)

Nótese que en la base local (s, n ) , el lado derecho de esta ecuación tiene la forma

Donde φes el ángulo polar sobre el plano (x, y), ver figura (3.5).

Fig. 3.5: Orificio de una placa plana infinita.

Es posible mostrar que la solución exacta de la ecuación (3.58) tiene la forma

b (φ) = b (φ) s (φ) +b (φ) n ( φ ) ,


s n (3.59)

con componentes

b (φ) = 1/2 sin (2φ) ,


s bn (φ) = ( c o s φ - 1/4) .
2
44

Entonces, la solución exacta del c a m p o de esfuerzos en el medio está representado por la ecuación

Aquí, 1 es el tensor unitario de rango dos.

En las figuras (3.6, 3.7), la solución exacta (3.59) (línea sólida) es comparada con la solución

numérica de la ecuación (3.58), obtenida con el Método de Puntos de Frontera. La distribución de

esfuerzos, σ , a lo largo de la coordenada y ( x = 0) se presenta en la figura (3.8). Nótese que la


11

distribución exacta, σ 11 (0, y), que de acuerdo con la ecuación (3.60), tiene la forma

(3.61)

y la línea sólida en la f i g u r a (3.8) corresponde a esta ecuación.

Se puede observar que para M = 80, las soluciones numérica y exacta prácticamente coinciden.

Fig. 3.6: Solución exacta. Componente b . s

S E G U N D O C A S O . U n disco elástico de radio unitario ( R = 1) sujeto a dos fuerzas concen¬

tradas aplicadas a lo largo de su diámetro, ver f i g u r a (3.9). La solución exacta de este problema,
45

Fig. 3.7: Solución exacta. Componente b . n

Fig. 3.8: Esfuerzos en la dirección y, σ.


11

considerando que | F | = 1, tiene la forma [25]

(3.62)

donde los ángulos Φ1 y Φ2, y los intervalos r y r se muestran en la figura (3.9).


1 2

L a solución de este problema se encuentra a partir de la ecuación (3.23) que a continuación se

repite

σ(x) = [S ( x - x ' ) • n (x')] • b (x') dΓ' .


46

y la ecuación para el vector b (x) se obtiene a partir de las condiciones de frontera, y tiene la

forma integral siguiente

n (x) • [S ( x - x') • n (x')] • b (x') dΓ' = - F δ (φ) + Fδ (φ - π) , x E Γ. (3.63)

Para la solución numérica, las fuerzas concentradas aplicadas en los puntos de frontera para los

ángulos φ = 0 y φ = π en la base local de estos puntos de frontera tienen la forma

(3.64)

donde h es la distancia entre los puntos de frontera vecinos a lo largo de ΓPara los demás puntos
(i)
de frontera, f = 0.

La distribución de esfuerzos σ 11 ( x , y) en diferentes secciones paralelas al eje del disco se presen­

tan en las figuras (3.10, 3.11). Las líneas sólidas representan a las soluciones exactas; las líneas

interrumpidas corresponden a 60 puntos equidistantes sobre la frontera. Se puede observar que el

error de la solución numérica es esencial solamente en una pequeña vecindad de los puntos de

frontera sobre los que se encuentran aplicadas las fuerzas.

Fig. 3.9: Disco circular con R = 1, y cargas concentradas opuestas.

3.5 Solución del problema para cuerpos con grieta

Consideremos la solución numérica del problema de elasticidad para una grieta recta que ocupa

un intervalo (|x| < 1, y = 0) en un plano infinito. El plano está sujeto a un campo de esfuerzos
46

y la ecuación para el vector b (x) se obtiene a partir de las condiciones de frontera, y tiene la

forma integral siguiente

n (x) • [S ( x - x') • n (x')] • b (x') dΓ' = - F δ (φ) + Fδ (φ - π) , x E Γ. (3.63)

Para la solución numérica, las fuerzas concentradas aplicadas en los puntos de frontera para los

ángulos φ = 0 y φ = π en la base local de estos puntos de frontera tienen la forma

(3.64)

donde h es la distancia entre los puntos de frontera vecinos a lo largo de ΓPara los demás puntos
(i)
de frontera, f = 0.

La distribución de esfuerzos σ 11 ( x , y) en diferentes secciones paralelas al eje del disco se presen­

tan en las figuras (3.10, 3.11). Las líneas sólidas representan a las soluciones exactas; las líneas

interrumpidas corresponden a 60 puntos equidistantes sobre la frontera. Se puede observar que el

error de la solución numérica es esencial solamente en una pequeña vecindad de los puntos de

frontera sobre los que se encuentran aplicadas las fuerzas.

Fig. 3.9: Disco circular con R = 1, y cargas concentradas opuestas.

3.5 Solución del problema para cuerpos con grieta

Consideremos la solución numérica del problema de elasticidad para una grieta recta que ocupa

un intervalo (|x| < 1, y = 0) en un plano infinito. El plano está sujeto a un campo de esfuerzos
47

Fig. 3.10: Distribución de σ (x)


11 en el disco sujeto a dos fuerzas de compresión concentradas.

Fig. 3.11: Distribución de σ (y) en el disco sujeto a dos fuerzas de compresión concentradas.
11

σ (x) en el infinito. Encontremos la solución de este problema de forma similar a la ecuación


0

(3.57), y la ecuación integral de este problema t o m a la forma de la ecuación (3.58), donde Γes la

línea de la grieta.

Para un campo de esfuerzos constante dirigido a lo largo del eje y y tomando

μ = 1 , N = 1 , la solución de esta ecuación t o m a la forma


0 0

b (x) = b (x) n ,
0 0 b0 (x) = (3.65)

donde n = e es el vector normal a la línea de la grieta.


2

El error R (x) = b (x) — b (x) de la solución numérica para varias cantidades de puntos de
n 0

frontera sobre la línea de la grieta se presenta en la f i g u r a (3.12).. En esta gráfica se puede ver

que el máximo del error está concentrado en las vecindades de las puntas de la grieta. Pero las

asimptóticas de la solución cerca de estas puntas nos proporcionan información importante para

aplicaciones de ingeniería. Es bien sabido [20, 2 4 ] que el brinco exacto del vector desplazamiento,
48

Fig. 3.12: Error R ( x ) de la sol. numérica de una grieta recta en un plano infinito.

b ( x ) , sobre la grieta tiene la siguiente ecuación asimptótica cerca de la punta de la grieta

(3.66)

Aquí r es la distancia entre el punto x E Γy la punta de la grieta, como se ve en la figura (3.13).

Fig. 3.13: Sistema de coordenadas local en la punta de la grieta.

Los componentes ( β β ) del vector


s , n βen la ecuación (3.66) están conectadas con los factores de

intensidad de esfuerzos K y K I II mediante las ecuaciones [20, 24]

(3.67)

y las asimptóticas de los componentes σ 22 y σ 1 2 del tensor de esfuerzos cerca de la punta de la

grieta tienen las siguientes formas conocidas

(3.68)
49

Para calcular los coeficientes del vector β en la ecuación (3.66) y los factores de intensidad de

esfuerzos con alta precisión, tenemos que m o d i i c a r el método desarrollado previamente. Esta

modificación está basada en el t e o r e m a de conservatividad polinomial [ 2 4 ] que aplicaremos a

continuación. Consideremos una grieta recta (|x| < l, y = 0) en un plano infinito. El teorema nos

dice que si un campo externo σ (x, y) es polinomial sobre la línea de la grieta como sigue
0

2 m - 1
σ (x, 0) = σ
0 1 + σ x + σ x
2 3 + •••+ σ x m , |x| < l, (3.69)

(σ k = constante, k = 1, 2 , . . . , m ) , entonces el vector de la apertura de la grieta b (x) toma la

forma siguiente

m 2 m 1
B (x) = a 1 + a x + a x
2 3 + •••+ a x - ,
m (3.70)

m
donde los a k (k = 1, 2 , . . ., m ) son vectores constantes y B (x) es una función polinomial de la

misma potencia que el campo externo ao(x, 0).

Este teorema nos permite encontrar la solución de la ecuación integral del problema de la grieta

de forma similar a la ecuación (3.70). Para hallar la solución, introduzcamos un conjunto de nodos
(j)
auxiliares sobre la línea de la grieta x a ( j = 1, 2 , . . . . M ) y utilicemos estos nodos para realizar
a

la aproximación Gaussiana (3.19) de la función b (x) en la ecuación (3.70)

(3.71)

Aquí, h a es la distancia entre los nodos auxiliares. Para una buena aproximación de b (x), el

número M debe ser suficientemente grande ( M


a a > 50). Después de sustituir la ecuación (3.71) de

b (x) en la ecuación (3.57) de los componentes del tensor de esfuerzos, obtenemos las ecuaciones

siguientes para r, s = 1, 2:

(3.72)
50

(k) (k)
Donde (a ,a )
s n son los componentes de los vectores a k de la ecuación (3.70) en la base local

(s, n ) , es decir,

( k ) ( k )
a k = a S s+a n n.

Los componentes de las fuerzas que actúan sobre la línea de la grieta tienen las ecuaciones

y si los lados de la grieta están libres de esfuerzos, entonces tenemos

f (x) = f
s n (x) = 0, |x| ≥l. (3.74)

(k) (k)
Para obtener las 2 m incógnitas a S y an de la ecuación (3.71) tenemos que satisfacer las ecua­

ciones (3.73) y (3.74) en m puntos de frontera sobre la línea de la grieta. L a cantidad de estos

puntos de frontera coinciden con la potencia m á x i m a de la función polinomial de la ecuación

(3.70). E n realidad, esta potencia no es muy grande y podemos escoger las coordenadas de estos

puntos de frontera en la región interior de la grieta, donde el error de la aproximación Gaussiana

es pequeño. El sistema de ecuaciones final para t o m a la forma

(3.75)
( 1 )
donde las x son las coordenadas de los puntos de frontera sobre la línea de la grieta.

Nótese que las asimptóticas de la expresión (3.70) cerca de las puntas de la grieta, x = ± l , tienen

la forma

(3.76a)

Consideremos la solución numérica del sistema (3.75) cuando el campo aplicado es de tensión

constante a lo largo del eje y, es decir,

0 0 0
σ =
11 σ = 12 0, σ 22 = 1.
51

Para m = 5, M a = 50, l = 1 y una distribución homogénea de los puntos de frontera,

la solución del sistema (3.75) para k = 1 , . . . , 5, es

a s
(k)
=0,
(1) (2) (3) (4) (5)
a n = 0,9912, a n = 0, a n = 0,0037, a n = 0, a n = 0,0048 .

Tomando en cuenta que la solución exacta de este problema tiene la forma de la ecuación (3.65),

y por lo tanto

as (k)
= 0, k = 1 2 3 ...;
(1)
a n = 1, a n
(l)
= 0, l = 2, 3 , . . . ,

podemos ver que el error de la solución numérica es menor que el 1 % en este caso.

Ahora consideremos una área rectangular con una grieta recta central sometida a tensión constante

en la dirección y, ver figura (3.14).La solución de este problema se puede encontrar en la forma

Fig. 3.14: Área rectangular con grieta central.

a ( x, y) = [S (x - x ' , y - y') • n (x', y')] • b (x', y') dΓ' + c

[S (x - x ' , y - y') • n ( x ' , y ' ) ] • b ( x ' , y ' ) dΓ', (3.77)

donde la primera integral se reliza sobre la línea de la grieta Γ y la segunda integral sobre el borde c

externo del área Γ . b


52

Utilizando las ecuaciones (3.70, 3.71) para la representación del vector b (x) hemos escogido
c

(j)
un conjunto de nodos auxiliares x a ( j = 1, 2 , . . . , M ) sobre la línea de la grieta, así como la
a

m
potencia m — 1 de la función polinomial B (x) en la ecuación (3.70). Entonces, se deben definir

las coordenadas de los m puntos de frontera sobre la línea de la grieta y las condiciones de frontera

se deben satisfacer en estos puntos. E n u m e r e m o s los puntos de frontera sobre la línea de la grieta

desde 1 hasta m . También tenemos que definir los puntos de frontera sobre la frontera exterior del

cuerpo donde el vector b (x) es aproximado mediante las ecuaciones (3.24, 3.71). L a numeración

de estos puntos de frontera se haces desde m + 1 hasta M , donde M es el número total de puntos

de frontera, o nodos principales. C o m o resultado, el tensor de esfuerzos a (x, y) en la base global

( e , e ) es aproximado por las ecuaciones obtenidas a partir de las ecuaciones (3.72, 3.45, 3.48)
1 2

(3.78)

donde

donde las funciones están definidas en la ecuación (3.48).

Las fuerzas

f (x) = n (x) • σ( x ) , x E Γ.

sobre la frontera del cuerpo y las fronteras de la grieta son calculadas a partir de la ecuación (3.78).

Los valores de estas fuerzas en los puntos de frontera tienen la forma siguiente en las bases locales
53

( i ) ( i )
(s , n ):

( i ) ( i ) ( i ) ( i ) ( i ) ( i )
f (x ,y ) = f s s + f n n , (3.79)

lk lk lk lk
donde la función B (x) está definida en la ecuación (3.71) y las funciones A ,
0 SS A ,A ,y
Sn nS A nn

están dadas en la ecuación (3.49).

El sistema f i n a l de c o e i c i e n t e s desconocidos que definen la solución b ( x ) sobre la

línea de la grieta, y los c o e i c i e n t e s en los puntos sobre la frontera exterior del área, se

obtienen a partir de las condiciones de frontera y toman la forma

c
B X kl l = F , k k = 1, 2 , . . . , 2 M . (3.80)

aquí el vector X de incógnitas tiene los componentes siguientes:

(k), (k)
X 2 l - 1 = a S X 2 1 = a n l = 1 2,...,m; (3 81)
(k) (k)
X 2 l - 1 = b , S X 21 = b , n l = m + 1,m + 2 , . . . , M .

El lado derecho, F , de la ecuación (3.80) es:

( k ) ( k )
F 2 k - 1 = f s , F 2k = f n , k = 1,2,...,M. (3.82)
54

c
Los elementos de la matriz B toman la forma
c l k , c lk
R 2 l - 1 , 2 k - 1 = C s s B 2 l - 1 , 2 k = C ,sn

lk
B
c
c
2 l , 2 k - 1
lk
=
c lk
C , ns B c
2l,2k = Clk
nn l.k=1,2,...,m;
(3.83)
B 2l-1,2k-1 =A ,B ss 2l-1,2k=A sn

c lk c lk
B 2 l , 2 k - 1 = A , ns B = 2l,2k A , nn l, k = m + 1, m + 2,...,M.

La solución de la ecuación (3.80) se obtuvo para varios tamaños del rectángulo y diferentes lon¬

gitudes de grieta. E n las figuras (3.15, 3.16), las gráficas de las funciones σ (x,0) y
11 σ (x,0),
22

respectivamente, son presentadas para a = 2, b = 3, y l = 1. El número de nodos auxiliares so­

bre la línea de la grieta se escogió como M a = 70, el número de puntos de frontera fue m = 5 y

M = 27, 47 y 67. El incremento del número de nodos auxiliares y de puntos de frontera respecto

a los indicados no cambió la solución.

Fig. 3.15: Distribución del esfuerzo σ (x, 0) a lo largo de la grieta de u n área rectangular.
11

Fig. 3.16: Distribución del esfuerzo σ (x, 0) a lo largo de la grieta de u n área rectangular. 22

El resultado de los cálculos de los factores de intensidad de esfuerzos en las puntas de la grieta se

presentan en la figura (3.17);en esta figura


55

Fig. 3.17: Factores de intensidad de esfuerzos para una grieta central en un área plana rectangular.

m m
donde B n (x) es la componente normal del vector B (x) definido en la ecuación (3.70), y

son los factores de intensidad de esfuerzos K y los coeficentes β que coresponden a una
I n

placa infinita con grieta de longitud 1. E n este caso, considerando μ = 1 y N = 1. Las


o o

líneas sólidas en la figura (3.17) son soluciones numéricas presentadas en [26] (la precisión es del

1%), las líneas discontinuas son las soluciones numéricas obtenidas con el método desarrollado.

Para los valores de ωindicados, se consideraron las siguientes cantidades de puntos de frontera y

de nodos auxiliares:

ω m M a M
0,5 5 70 105
1,5 11 70 71

Se puede ver que una distribución homogénea de los puntos de frontera sobre la línea de la gri¬

eta lleva a obtener errores relativamente grandes en el cálculo de los factores de intensidad de

esfuerzos. Este error disminuye si la densidad de puntos de frontera es mayor en los extremos de

la grieta. Los experimentos numéricos muestran que la posición óptima de los puntos de frontera
( i )
x sobre la línea de la grieta corresponde a las raices de los polinomios de Chebyshev; es decir,

( i ) ,
x = l cos i= 1,2,...,m.

Los resultados numéricos en laf i g u r a(3.17) fueron obtenidos para estas coordenadas de los puntos

de frontera sobre la línea de la grieta.


56

3.6 Conclusiones

Los métodos numéricos desarrollados son una herramienta efectiva para la solución del segundo

problema con valores en la frontera de elasticidad. La precisión del método depende de la densidad

de los puntos de frontera en la frontera del cuerpo.

En esta versión desarrollada para este método, las distancias entre puntos de frontera vecinos se

consideraron del mismo tamaño. Estas distancias deben ser de alrededor de 0,1R para obtener
c

una precisión aceptable de la solución ( ~ 1 % ) .

Aquí, R es el radio mínimo de curvatura de la frontera del cuerpo u otra longitud característica.
c

Nótese que en la vecindad de los puntos de fronteras anguladas o en los puntos de aplicación de

las fuerzas concentradas, la función desconocida b (x) debe ser aproximada de acuerdo a la forma

analítica de las asimptóticas de la solución exacta en estas regiones (ver sección 3.5). Esta modifi¬

cación incrementa esencialmente la precisión del método. El método también permite considerar

distribuciones no homogéneas de puntos de frontera sobre la s u p e r i c i e del cuerpo considerado.


57

4 Problema elasto-plástico para cuerpos en 2D

4.1 Diferentes formas de la teoría de plasticidad

En esta sección describiremos la clasiicación y descripción de las diferentes formas de la teoría

de plasticidad que se presenta en A N S Y S .

El comportamiento no lineal de los materiales cuando están sujetos a diferentes tipos de cargas, se

deben a la relación no lineal entre los esfuerzos y las deformaciones, es decir, el esfuerzo es una

función no lineal de la deformación. Esta relación también es dependiente de la trayectoria, por lo

que el esfuerzo depende tanto de la historia de la deformación como de la deformación misma.

En la actualidad existen diferentes estudios sobre las no linealidades de materiales estructurales

tales como plasticidad, elasticidad no lineal, hiperelasticidad, viscoelasticidad, y otros.

Los métodos desarrollados para determinar las relaciones no lineales entre los esfuerzos y las

deformaciones se pueden resumir como sigue:

• Plasticidad independiente del tiempo. Está caracterizado por la deformación instantanea ir¬

reversible que ocurre en un material.

• Plasticidad dependiente del tiempo. Ocurre cuando las deformaciones plásticas se desarrollan

durante un intervalo de tiempo; también denominada viscoplasticidad.

• Ondulamiento. Es una deformación irreversible que ocurre en un material y es dependiente

del tiempo. El marco del tiempo para el ondulamiento generalmente es mayor que en el caso

de plasticidad dependiente del tiempo.

• Elasticidad no lineal. Se presenta en situaciones en donde la relación esfuerzo-deformación

es no lineal. A d e m á s todas las deformaciones son reversibles.

• Viscoelasticidad. E s la caracterización de propiedades del material que dependen del tiempo

y que incluye una contribución viscosa a la deformación elástica.


58

• Concreto. Los materiales similares al concreto incluyen formación de grietas y desmoron¬

amiento.

• Expansión. Aquí, los materiales se elongan debido a la presencia de flujo de neutrones.

Definiciones de la deformación

Para el caso de materiales no lineales, la definición de deformación elástica tiene la forma sigu¬

iente:

el pl t o ex
ε = ε- ε - ε - ε - ε (4.1)

que nos dice que la deformación elástica se puede obtener a partir de la diferencia de la deforma¬

ción total con las demás deformaciones (pl=plástica, t=térmica, o=ondulamiento, ex=expansión).

La teoría de plasticidad ofrece relaciones matemáticas que caracterizan la respuesta elastoplástica

de los materiales. Para el presente trabajo, sólo consideraremos la relación entre las deformaciones

total, elástica y plástica y se describirá el modelo que fue utilizado para comparar las simulaciones

realizadas con el M é t o d o de Puntos de Frontera.

4.1.1 Plasticidad independiente del tiempo o de la razón (rate independent


plasticity)

La plasticidad independiente del tiempo está caracterizada por la deformación irreversible que

ocurre en un material una vez que cierto nivel de esfuerzos es alcanzado. Se considera que la

deformación plástica se desarrolla instantáneamente, es decir, independiente del tiempo. La forma

en que se presenta la deformación plástica se puede clasificar o caracterizar de acuerdo a los

diferentes tipos de comportamiento del material como sigue:

• Endurecimiento isotrópico no lineal

• Endurecimiento isotrópico bilineal

• Endurecimiento isotrópico multilineal

Endurecimiento cinemático bilineal clásico


59

• Endurecimiento cinemático multilineal

• Endurecimiento cinemático no lineal

4.1.2 Teoría de la plasticidad

La teoría de la plasticidad proporciona relaciones matemáticas que caracterizan la respuesta elasto-

plástica de los materiales. H a y tres ingredientes en la teoría de plasticidad independiente del tiem­

po: el criterio de cedencia, la regla de flujo y la regla de endurecimiento.

Criterio de cedencia

El criterio de cedencia determina el nivel de esfuerzos en el que se inicia la deformación plástica

o cedencia. Para esfuerzos multicomponentes, este está representado como una función de los

componentes individuales, f ( σ ) , que puede interpretarse como un esfuerzo equivalente:

σe = f ( σ ) (4.2)

donde c es el tensor de esfuerzos.

Cuando el esfuerzo equivalente es igual al parámetro de cedencia del material, σ , el material


y

comenzará a desarrollar deformaciones plásticas. Si σ es menor que σ , el material es elástico


e y

y los esfuerzos se desarrollarán de acuerdo a la relación de esfuerzo deformación elástica corre¬

spondiente. N o t e m o s que el esfuerzo equivalente nunca puede exceder el esfuerzo de cedencia

del material ya que en este caso las deformaciones plásticas se desarrollarán instantáneamente. y

por lo tanto, reduciendo los esfuerzos al nivel de cedencia. La ecuación (4.2) se puede graficar

en el espacio de esfuerzos para las diferentes formas de plasticidad como se muestra en la f i g u r a

(4.1). Las superficies mostradas son conocidas como superficies de cedencia y cualquier estado

de esfuerzos dentro de esas superficies es elástico, es decir, no se pueden producir deformaciones

plásticas.
60

Fig. 4 . 1 : Diferentes superficies de cedencia.

Regla del flujo

La regla del l u j o determina la dirección de las deformaciones plásticas y está dado por

(4.3)

donde:

λ= multiplicador de plasticidad, que determina la cantidad de deformación plástica,

Q = función de esfuerzos denominado potencial plástico, que determina la dirección de la defor¬

mación plástica.

Si Q es función del punto de cedencia (como normalmente se asume), la regla del l u j o se denom¬

ina asociativa y la deformación plástica ocurre en la dirección normal a la superficie de cedencia.


61

Regla de endurecimiento

La regla de endurecimiento describe el cambio de la superficie de cedencia con cedencia progre¬

siva, por lo que las condiciones (i.e. estados de esfuerzos) se pueden establecer para condiciones

subsecuentes de cedencia. Se consideran dos situaciones o reglas de endurecimiento: endurec­

imiento por trabajo (o isotrópico) y endurecimiento cinemático. E n el endurecimiento por trabajo

la superficie de cedencia se mantiene centrada alrededor de su línea central inicial y se expande en

tamaño conforme se desarrollan las deformaciones plásticas. Para materiales con comportamien¬

to plástico isotrópico esto es conocido como endurecimiento isotrópico y se muestra en la figura

(4.1a). Durante el endurecimiento isotrópico se asume que la superficie de cedencia se mantiene

constante en tamaño y la superficie se traslada en el espacio de esfuerzos con cedencia prograsiva,

como se muestra en la figura (4.1b).

Incremento en la deformación plástica

Si el esfuerzo equivalente calculado utilizando las propiedades elásticas excede el punto de ce-

dencia del material, entonces ocurrirá deformación plástica. Las deformaciones plásticas reducen

el estado de esfuerzos por lo que satisface el criterio de cedencia, f ( σ ) = σ . Basado en la teoría


y

presentada en la s e c c i ó n anterior, el incremento de deformación plástica se puede calcular rápi¬

damente.

La regla de endurecimiento establece que el critero de cedencia cambia con el endurecimiento por

trabajo y/o con el endurecimiento cinemático. Incorporando estas dependencias, en f ( σ ) = σ,y

este criterio se puede escribir de la forma siguiente

F (σ, K, A) = 0 (4.4)

donde K es el trabajo debido a la deformación plástica y a es el vector traslación de la superficie de

cedencia. Estos términos son llamados variables de estado o internas. Específicamente, el trabajo

plástico es la suma del trabajo plástico desarrollado durante toda la historia de la aplicación de la

carga; es decir

(4.5)
62

donde

y el vector traslación (o desplazamiento) de la superficie de cedencia es

(4.6)

donde C = parámetro del material y a = esfuerzo de retorno (localización del centro de la

superficie de cedencia). El incremento de esfuerzos se puede calcular mediante relaciones de

esfuerzo-deformación

e l
dσ = D ε

el pl
donde D = matriz de esfuerzo-deformación y con d ε = dε — ε . La magnitud del incremento

de deformación plástica está relacionada con el incremento total de deformación, el estado de

esfuerzos actual y la forma específica de la superficie de cedencia. Entonces, el incremento de

d e f o r m a c i ó n plástica se determina con la ecuación (4.3).

Implementación

El algoritmo utilizado en el programa A N S Y S es el siguiente:

1. Se establece el parámetro σ . y

2. Se calculan los esfuerzos tomando como base las deformaciones calculadas en un paso previo
pr pl
como la diferencia de la deformación total menos la deformación plástica: ε n = ε — ε
n n-1 .

3. Se cálcula el esfuerzo equivalente, σ . Si σ < σ , entonces el material es elástico, por lo que


e e y

no se necesita calcular incrementos de deformación plástica.

4. Si el esfuerzo excede el punto de cedencia del material, entonces se procede a calcular los

incrementos debidos a la deformación plástica

5. L a deformación plástica es actualizada:

el pr pl
6. A continuación se calcula la deformación elástica como ε = ε — ε.
63

e l
7. A continuación se calcula el tensor de esfuerzos con σ= C ε .

8. L o s incrementos del trabajo de plasticidad y el centro de la superficie de cedencia, se

calculan y se actualizan sus valores.

9. Dentro del proceso se calculan la deformación plástica equivalente, el incremento de

deformación plástica equivalente, el esfuerzo equivalente, a, y la razón de esfuerzos,

N , dado como N = σ/σy. Por lo tanto N es mayor o igual a 1 cuando se presenta la

cedencia, y menor a 1 cuando el estado de esfuerzos es elástico.

Los parámetros deformación plástica equivalente y esfuerzo equivalente se determinan dependi¬

endo de la opción que se utilice.

4.1.3 Especificaciones para el endurecimiento

Endurecimiento isotrópico multilineal y endurecimiento isotropico bilineal

Estas opciones utilizan el criterio de cedencia de von Mises con los correspondientes regla de l u j o

y endurecimiento isotrópico (de trabajo). El esfuerzo equivalente es

donde s es el vector de esfuerzo deviatórico. Cuando a es igual al esfuerzo de cedencia en la

iteración actual, se dice que el material cede.

Especificaciones para endurecimiento isotrópico no lineal

A d e m á s de las opciones de endurecimiento isotrópico bilineal y multilineal, A N S Y S proporciona

otra opción de endurecimiento isotrópico no lineal denominada la ley de endurecimiento. El com¬

portamiento de endurecimiento isotrópico de los materiales está especificado por

(4.7)
64

Fig. 4.2: Curva esfuerzo deformación para el análisis de edurecimiento no lineal en A N S Y S .

donde: k es el límite elástico, R , R∞, b, son parámetros del material que caracterizan el compor­
0

pl
tamiento de endurecimiento isotrópico de los materiales, y ε es la deformación plástica equiva¬

lente.

Las ecuaciones constitutivas están basadas en la elasticidad isotrópica lineal, la función de ceden-

cia de von Mises y la regla de l u j o asociada.

NOTA: Esta ley es la que se utiliza para comparar las soluciones del M é t o d o de Puntos de Frontera

con el m i s m o modelo simulado en el programa A N S Y S .

Especificaciones para el endurecimiento cinemático bilineal

Esta opción utiliza el criterio de cedencia de von Mises con la regla de l u j o asociada y endurec¬

imiento cinemático.

Para este caso, el esfuerzo equivalente es

T
donde s es el vector de esfuerzo deviatórico s = σ̶ σ [ 1
m 1 1 0 0 0 ] , σm es el esfuerzo

hidrostático o promedio, σ m = 1/3 (σx + σ + σ ), y a es el vector de traslación de la superficie


y z

de cedencia.

Nótese que ya que la ecuación (4.8) depende del esfuerzo deviatórico, s, la cedencia es independi­

ente del estado de esfuerzos hidrostáticos. Cuando σes igual al esfuerzo de cedencia uniaxial, σ , y
65

entonces el material comienza a ceder, siendo este el criterio de cedencia requerido para el cálculo

de los esfuerzos y deformaciones de plasticidad.

En este método se determinan las deformaciones debidas al desplazamiento de la superficie de

cedencia. Este desplazamiento no es considerado en el M é t o d o de Puntos de Frontera.

Debido a que la deformación plástica equivalente depende de la historia de la carga, esta se calcula

como

y el esfuerzo equivalente de plasticidad se determina como una función de la deformación equiv¬

alente plástica y del esfuerzo de cedencia

4.2 Formulación de las ecuaciones elasto-plásticas en forma de ecua­

ciones integrales

Consideremos un cuerpo que ocupa la región Ωen el espacio tridimensional y que tiene una

frontera suave Γ, como se muestra en la figura (4.3).

Fig. 4.3: Representación en 2 D de un cuerpo con región de deformación plástica.


65

entonces el material comienza a ceder, siendo este el criterio de cedencia requerido para el cálculo

de los esfuerzos y deformaciones de plasticidad.

En este método se determinan las deformaciones debidas al desplazamiento de la superficie de

cedencia. Este desplazamiento no es considerado en el M é t o d o de Puntos de Frontera.

Debido a que la deformación plástica equivalente depende de la historia de la carga, esta se calcula

como

y el esfuerzo equivalente de plasticidad se determina como una función de la deformación equiv¬

alente plástica y del esfuerzo de cedencia

4.2 Formulación de las ecuaciones elasto-plásticas en forma de ecua­

ciones integrales

Consideremos un cuerpo que ocupa la región Ωen el espacio tridimensional y que tiene una

frontera suave Γ, como se muestra en la figura (4.3).

Fig. 4.3: Representación en 2 D de un cuerpo con región de deformación plástica.


66

El material del cuerpo es homogéneo e isotrópico con tensor módulo elástico C . El sistema de

ecuaciones diferenciales de elasto-plasticidad tiene la forma [24]:


e
∂iσij = 0; σij = Cijkl ε ; kl εkl = εekl + εpkl

R o t i j k l εkl = 0; εpij = Fij ( σ ) ;

p
Aquí, σes el tensor esfuerzos, εe es el tensor deformación elástica, ε es el tensor deformación

plástica, εes el tensor deformación total, Rot es el tensor de incompatibilidad de Saint-Venant


p
[24], y F ( σ ) es una funcional que define la deformación plástica ε como una función del tensor

esfuerzos σ , y las x son las coordenadas cartesianas en el espacio. El tensor esfuerzos que satis­
0 i

face el sistema de ecuaciones diferenciales dados en la ecuación (4.9) se puede escribir en forma

de ecuación integral como [27]

(4.10)

Aquí, n (x) es el vector normal unitario a la frontera Γ, b (x) es una función vectorial arbitraria

sobre Γ, S (x) es una función vectorial de rango cuatro definida como [24]

(4.11)

donde, x es un punto cualquiera en el medio, δ(x) es la función delta de Dirac, y G ls (x) es la

función de Green que satisface la ecuación

(4.12a)

en donde δij es el símbolo de Kronecker.

La segunda integral en el lado derecha de la ecuación (4.10) representa los esfuerzos debidos a la
p
deformación plástica ε , por lo que tenemos que los esfuerzos de plasticidad se representan por la

ecuación

(4.13)

Para el análisis de esfuerzos-deformación en el caso de dos dimensiones, ε 33 (x) se puede deter¬

minar a partir de

(4.14)

Para el análisis en dos dimensiones, podemos considerar dos situaciones:


67

a) Estado de deformaciones planas. Para esta situación, el componente ε 33 = 0, por lo que

σ (x) t o m a la forma
33

σ33 (x) — v [σ11 (x) + σ22 (x)] + x = (x1, x2) (4.15)

b) Estado de esfuerzos planos. Para esta situación, el componente σ 33 = 0, por lo que σ 33 (x)

t o m a la forma

(4.16)

El tensor de esfuerzos en la ecuación (4.10) debe satisfacer las condiciones de frontera siguientes

σ ij (x) n ( x ) | = f ( x ) ,
j Γ i (4.17)

donde f (x) es el vector de fuerzas aplicado en la frontera del cuerpo. Después de sustituir la

ecuación (4.10) en la ecuación (4.17), obtenemos la ecuación para el vector densidad, b ( x ) , con

la forma

p
Γij ( x , x ' ) bj (x') dT' = fi(x) - njσ j i (x), (4.18)

donde el tensor T (x,


ij x ' ) tiene la misma representación que la ecuación (3.15), y que a contin¬

uación se vuelve a presentar

Tij (x, x ' ) = nk (x) Skijl ( x - x ' ) nl ( x ) . (4.19)

Al igual que en el caso de elasticidad, el núcleo del operador integral en la ecuación (4.18) tiene

la sigularidad fuerte

-3
T (x, x ' ) ~ |x — x'| cuando x' →x ,

por lo que, como en el caso de elasticidad, se debe definir un procedimiento de regularización para

el cálculo de la integral. E n [22, 24] se demuestra que la integral de la ecuación (4.18) se puede

entender en el sentido siguiente

(4.20)

Aquí Γes una frontera cerrada suave, la integral en el lado derecho, se entiende en el sentido

de su valor principal de Cauchy (v.p.), y b (x) es una función finita suave. L a misma fórmula de

regularización se cumple para una frontera abierta si b (x) → 0 cuando x → Γ.


68

Para el cálculo del lado derecho de la ecuación (4.18), es necesario conocer la deformación plástica
p
ε en la región de interés dentro del cuerpo. Esta deformación depende del campo de esfuerzos
p
( ε = F ( σ ) ) via la ley de plasticidad.

4.3 Acción de operadores integrales del problema elasto-plástico so­

bre las funciones de Gauss

Para la solución numérica de la ecuación (4.18) nuevamente utilizaremos las funciones de aproxi­

mación Gaussianas descritas en 2. D e acuerdo con [21, 14], el vector desconocido b ( x ) y el tensor
p
deformación plástica ε ( x ) se pueden expresar como sigue

(4.21)

(4.22)

Aquí, x (i ̶ 1, 2 , . . . , N) es un conjunto de puntos en la frontera Γ, h es la distancia entre puntos


i

de frontera x , los puntos y (i ̶ 1, 2 , . . . , N )


i i 1 son un conjunto de nodos de una malla que rep­

resenta la región plástica, h es la distancia entre los nodos y y D es un parámetro adimensional


1 i

( D = 2).

Utilizando la aproximación dada por la ecuación (4.21), la primera integral del lado derecho de la

ecuación (4.10) se puede escribir en la forma [27]

(4.23)

Γ ( i )
donde el tensor S ( x ̶ x ) es una combinación de funciones estandar, n
i = n ( x ) es el vector
i

normal a la frontera del cuerpo en el punto x i (ver detalles en [27]).

Los esfuerzos debidos a la deformación en la región de plasticidad en la ecuación (4.13) se

pueden representar como

(4.24)
68

Para el cálculo del lado derecho de la ecuación (4.18), es necesario conocer la deformación plástica
p
ε en la región de interés dentro del cuerpo. Esta deformación depende del campo de esfuerzos
p
( ε = F ( σ ) ) via la ley de plasticidad.

4.3 Acción de operadores integrales del problema elasto-plástico so­

bre las funciones de Gauss

Para la solución numérica de la ecuación (4.18) nuevamente utilizaremos las funciones de aproxi­

mación Gaussianas descritas en 2. D e acuerdo con [21, 14], el vector desconocido b ( x ) y el tensor
p
deformación plástica ε ( x ) se pueden expresar como sigue

(4.21)

(4.22)

Aquí, x (i ̶ 1, 2 , . . . , N) es un conjunto de puntos en la frontera Γ, h es la distancia entre puntos


i

de frontera x , los puntos y (i ̶ 1, 2 , . . . , N )


i i 1 son un conjunto de nodos de una malla que rep­

resenta la región plástica, h es la distancia entre los nodos y y D es un parámetro adimensional


1 i

( D = 2).

Utilizando la aproximación dada por la ecuación (4.21), la primera integral del lado derecho de la

ecuación (4.10) se puede escribir en la forma [27]

(4.23)

Γ ( i )
donde el tensor S ( x ̶ x ) es una combinación de funciones estandar, n
i = n ( x ) es el vector
i

normal a la frontera del cuerpo en el punto x i (ver detalles en [27]).

Los esfuerzos debidos a la deformación en la región de plasticidad en la ecuación (4.13) se

pueden representar como

(4.24)
69

donde

(4.25)

(4.26)

La ecuación (4.25) es la integral de convolución que se puede escribir, aplicando transformada de

Fourier a las funciones de la integral, de la forma siguiente

(4.27)

donde S(k) es la transformada de Fourier de S ( x ) , φ( k , k )


1 2

es la transformada de Fourier de φ(x) y p 2


— h D / 4 . El tensor S(k) tiene la forma
2

S(k)=- 4 μ 0 N 0[E - 2 E ( m ) + E ( m ) ] ;
1 5 6
(4.28)

Los tensores E i son los elementos de la base tensorial (ver Apéndice A)

E1ijkl = δi(k δjl); E2ijkl = δijδkl; E3ijkl = δij m m


k l
(4.29)

E4ijkl = m m i j δ; kl E 5 i j k l = m(iδj)(kml); E6ijkl = mimjmkml

Después
p de x2)
S (x1, calcular las integrales
= -4δ0N0[φ0 de la
(r) E1 ecuación
+ Ф1 (r) E1 (4.28), obtenemos
+ Ф2 (r) E 5 (g) + Ф3 (r) ( 2 E 1 + E 2 )
+ Ф 4 (r) ( E 3 (g) + E 4 (g) + 4 E 5 (g)) + Ф4 (r) E6 (g)] . (4.30)
r — xe + x e ;
1 1 2 2 r = |r|

L a s funciones Ф (r), con r = r/p, están definidas como sigue


i

(4.31)
70

p
Por lo tanto, las ecuaciones de aproximación para el tensor esfuerzos de plasticidad, σ , en la

ecuación (4.24) toma la forma

(4.32)

con i,j — 1, 2 y

(4.33)

s
Aquí, r —

4.4 Ejemplo de aplicación. Deformación elastoplástica de una placa

rectangular con un corte lateral

4.4.1 La ley de plasticidad

En la solución para este ejemplo, utilizaremos la teoría de plasticidad incremental en donde la ley
p
de plasticidad define la deformación plástica como función del tensor de esfuerzos, ε — f ( σ ) .

Consideremos una placa rectangular que tiene un corte triangular en u n o de sus lados como se

muestra en la f i g u r a (4.4).

Esta placa está sujeta a la tensión σ0 en la dirección x . Esta tensión es incrementada hasta alcanzar
2

el valor σ . Durante el proceso de carga se puede observar el desarrollo de deformación plástica


y

en la placa.

Introduzcamos el esfuerzo equivalente como (σ, (σ ≥0), definido como

(4.34)
70

p
Por lo tanto, las ecuaciones de aproximación para el tensor esfuerzos de plasticidad, σ , en la

ecuación (4.24) toma la forma

(4.32)

con i,j — 1, 2 y

(4.33)

s
Aquí, r —

4.4 Ejemplo de aplicación. Deformación elastoplástica de una placa

rectangular con un corte lateral

4.4.1 La ley de plasticidad

En la solución para este ejemplo, utilizaremos la teoría de plasticidad incremental en donde la ley
p
de plasticidad define la deformación plástica como función del tensor de esfuerzos, ε — f ( σ ) .

Consideremos una placa rectangular que tiene un corte triangular en u n o de sus lados como se

muestra en la f i g u r a (4.4).

Esta placa está sujeta a la tensión σ0 en la dirección x . Esta tensión es incrementada hasta alcanzar
2

el valor σ . Durante el proceso de carga se puede observar el desarrollo de deformación plástica


y

en la placa.

Introduzcamos el esfuerzo equivalente como (σ, (σ ≥0), definido como

(4.34)
71

Fig. 4.4: Región de deformación plástica en una placa rectangular en 2D.

Para el estado de esfuerzos planos,

(4.35)

p
La deformación plástica equivalente, ε , está definida como

(4.36)

p
El incremento de la deformación plástica equivalente, d ε , está definida por las ecuaciones

(4.37)

(4.38)

El cálculo del componente Σ 33 del tensor de esfuerzos se puede hacer para los dos casos siguientes:

• Estado de esfuerzos planos: Σ 33 — 0.

p
• Estado de deformaciones planas: Σ 33 —V(Σ 1 1 + Σ ) — Eε
22 33 .
72

4.4.2 Algoritmo de la solución numérica

Para realizar la solución numérica de la ecuación (4.18), ésta se puede escribir c o m o

p p
T b ̶f - g ( ε ) , (4.39)

p p p
donde g ( ε ) es el vector de cargas que depende del tensor deformación plástica, ε , el cual se

obtiene cuando las cargas aplicadas producen esfuerzos superiores al esfuerzo de cedencia del

material, σ . U s a n d o la clase de funciones de aproximación Gaussiana, ecuaciones (4.21, 4.22),


Y

en la ecuación (4.39) obtenemos el sistema de ecuaciones algebraicas siguiente

(4.40)

donde

(i) (i)
X 2 i - 1 = bs , X 2 i = bn , i ̶ 1, 2 , . . . , N

p(i) p p(i) p
F2i-1 = fs(i) - gs (ε ) , F 2 i = fn(i) - g n (ε ) , i ̶ 1, 2 , . . . , N (4.42)

Los A i j son los elementos de la matriz del sistema discretizado y están expresados mediante fun­

ciones estandar, de forma similar al modelo de elasticidad. Éstos sólo necesitan ser calculados una

sola vez y mantenidos en la memoria de la computadora para ser utilizados en cada paso del proce¬

so iterativo, Xj representa los componentes desconocidos del vector potencial b a ser calculados

según la ecuación (4.41), F representa el vector columna cuyos elementos son conocidos a par­
i

tir de las condiciones de frontera dados por f, que es el vector de fuerzas externas aplicadas sobre
p p
la frontera del cuerpo ( n • σr| = f), y g ( ε ) es el vector obtenido debido al tensor deformación
Γ

p
plástica, ε . N representa la cantidad total de puntos de frontera.

El sistema de ecuaciones (4.39) se resuelve en cada paso del proceso de carga c o m o sigue:

1. Se define el incremento de carga para cada intervalo. La tensión total aplicada a la

placa es

(4.43)
73

2. D e acuerdo con la teoría de plasticidad incremental, se determina la deformación plástica a

partir de la ecuación siguiente:

(4.44)

L o s componentes del tensor S i j se calculan utilizando le ecuación (4.34), f (σ ) T es la ley de


(k-1)
plasticidad del material considerado y que satisface la ecuación (4.7), σ es el esfuerzo

equivalente en cada nodo de la malla en la región de deformación plástica en el intervalo k - 1


(k-1)
calculado mediante la ecuación (4.35), y σT es el esfuerzo debido a la carga aplicada en

el intervalo k -1. L a ley de plasticidad incremental se reescribe a continuación

(4.45)

donde k = σ , y para el análisis, E n donde σ es el esfuerzo de cedencia, y e es la deforma¬


y 0

ción plástica equivalente.. R , R


o ∞ y b son constantes de la función. La razón de cambio del

esfuerzo respecto de la deformación plástica equivalente es

(4.46)

Para la simulación se requiere que la deformación equivalente plástica se presente como

función del esfuerzo equivalente, lo que podemos escribir como

L o s valores utilizados para la simulación con A N S S Y S fueron: σ0 = 2, R0 = 10, R ∞ = 2

y b = 20. L a curva de comportamiento del esfuerzo equivalente con respecto de la deforma­

ción equivalente está dada en la figura (4.46).

Curva esfuerzo equivalente -vs-


deformación equivalente
74

Los datos anteriores se utilizaron para calcula el campo de esfuerzos y deformaciones de un placa

rectangular con una indentación o grieta en el borde derecho. La placa se somete a una carga

de tensión que crece gradualmente de 0 a 2. Entonces, la deformación plástica equivalente se

determina como

(4.47)

P P
1. Se determina el vector g ( ε ) , que en la ecuación (4.39) tiene la forma

p ( t ) p ( t ) p
g = g (ε ) (4.48)

(k)
2. Se actualiza el esfuerzo σ T en cada nodo de la malla de deformación plástica usando la

condición siguiente

(4.49)

3. Se resuelve el sistema de ecuaciones lineales definidos en la ecuación (4.39) para obtener el

vector b .

(k)
4. L o s nuevos esfuerzos equivalentes, σ , se calculan en cada nodo de la malla. El tensor de
p ( k )
deformación plástica, ε , y el esfuerzo equivalente, σ
i j , se mantienen en la memoria de la

computadora para ser utilizados en el paso siguiente.

5. El proceso se repite a partir del paso 1, mientras la deformación plástica no rebase un valor

límite predeterminado. N o r m a l m e n t e 0 , 1 5 , que es el valor considerado par la simulación.

4.4.3 Resultados numéricos

El método numérico fue aplicado a una placa rectangular con un corte triangular en un borde

lateral y una malla cuadrada fue considerada en la región de plasticidad, c o m o se muestra en la

figura (4.4). Los cálculos se realizaron para diferentes tamaños de la malla considerando 2 1 , 4 1 ,

6 1 y 8 1 nodos por lado. Para optimizar el tiempo del proceso de cálculo, en cada paso sólo se

utilizaron los nodos de la malla donde se satisfacía la condición de esfuerzo equivalente, σ >
75

σ,
T por lo que en cada paso del proceso iterativo el número de nodos utilizado se incrementaba

gradualmente.

Para el análisis de los resultados se consideraron dos líneas verticales dentro de la región de

plasticidad, como se muestra en la figura (4.5). Los esfuerzos y deformaciones para los diferentes

tamaños de malla son comparados a lo largo de cada línea. En las figuras (4.6, 4.7) se presenta la

comparación de esfuerzos y deformaciones, respectivamente, sobre la linea A. Se puede observar

que la precisión de los resultados numéricos mejora conforme el número de nodos de la malla

de deformación plástica M se incrementa, y podemos considerar que aumentar esta cantidad de

nodos no mejora la precisión más alla de M = 81 nodos por lado. L a comparación de esfuerzos

y deformaciones equivalentes en la linea B se presentan en las figuras (4.8, 4.9), respectivamente.

Se puede observar que la precisión no mejora sustancialmente cuando la malla se incrementa más

allá de M = 81 nodos por lado, como se indicó previamente.

Fig. 4.5: Lineas A y B en la región de deformación para la comparación de σ and ε.

Fig. 4.6: Comparación de σ sobre la linea A para mallas con 2 1 , 4 1 , 61 y 81 nodos por lado.
76

Fig. 4.7: Comparación de εsobre la linea A para mallas con 2 1 , 4 1 , 61 y 81 nodos por lado.

Fig. 4.8: Comparación de σsobre la linea B para mallas con 2 1 , 4 1 , 61 y 81 nodos por lado.

La diferencia en el comportamiento de la precisión en ambas lineas se debe a la presencia de

la singularidad en la punta del corte, lo que requiere que la distancia entre los nodos en la zona

plástica sea del mismo orden de magnitud que la distancia entre los puntos de frontera cercanos a

esta región.

4.4.4 Comparación de resultados del modelo utilizando ANSYS

Para validar los resultados obtenidos con el M é t o d o de Puntos de Frontera, se utilizó el progra­

m a de propósito general A N S Y S . Se creó el m i s m o modelo que el modelo en B P M , con las

propiedades del material especificadas anteriormente, se utilizó la ley de endurecimiento dada por

la ecuación (4.45) con los mismos parámetros σ = 2, R


o o = 10, R ∞ = 2 y b = 20. La curva
77

Fig. 4.9: Comparación de εsobre la linea B para mallas con 2 1 , 4 1 , 61 y 81 nodos por lado.

de comportamiento es la indicada en la figura (4.46). Se compararon los resultados en el eje del

modelo y se muestran en las figuras (4.10,4.11).

Fig. 4.10: Esfuerzo equivalente de plasticidad en el eje.

El nombre de cada curva indica el método utilizado (BPM, A N S Y S ) . L a malla de la zona plás­

tica es cuadrada y sus dimensiones son fijas en todas las simulaciones. El número en el nombre

corresponde a la cantidad de nodos por cada lado utilizados en la malla de la zona plástica. L o s

resultados son comparados con los obtenidos usando A N S Y S y se indican con una curva discon-

tínua. Se puede observar claramente que el incremento de nodos en la malla mejora la calidad del

resultado. L a cantidad de puntos en la frontera también se fue incrementando para satisfacer la

condición de que su distancia debe ser equivalente a la distancia entre nodos de la malla plástica.
78

Fig. 4 . 1 1 : Deformación equivalente de plasticidad en el eje.

4.5 Conclusiones

En este estudio hemos aplicado funciones de aproximación gaussianas para el cálculo del campo

de esfuerzos elasto-plásticos en una placa rectangular homogénea con un corte en u n o de sus

lados, y sometida a cargas de tensión en la dirección vertical. H e m o s mostrado que las integrales

en el lado derecho de la ecuación integral de esfuerzos se pueden representar mediante algunas

funciones estandar que pueden ser calculadas y ser tabuladas fácilmente manteniendo estos valores

en la memoria de la computadora para ser usadas posteriormente para obtener los elementos de la

matriz de c o e i c i e n t e s del sistema de ecuaciones lineales.

Los resultados numéricos obtenidos muestran que su precisión depende de la densidad de nodos

de la malla auxiliar cerca de la frontera donde está presente la punta de la indentación o corte

lateral, y que la distancia entre los nodos en la región plástica debe ser del orden de magnitud de

la distancia entre los puntos de frontera cerca de la indentación. Las figuras (4.6-4.9) muestran

que el método desarrollado es efectivo.

Por otro lado, la comparación de resultados con un modelo equivalente calculado con el progra¬

m a de propósito general A N S Y S muestra resultados bastante precisos en las figuras (4.10 y 4.11),

en donde se puede observar que las propiedades de plasticidad, el esfuerzo equivalente y la defor¬

mación equivalente, están muy bien aproximadas cuando la cantidad de nodos de la malla en la

región de plasticidad se incrementa, así como la cantidad de puntos de frontera para satisfacer el

orden de magnitud previamente descrito. P o d e m o s considerar que 121 nodos por lado en la malla

de plasticidad nos proveen de resultados satisfactorios.


78

Fig. 4 . 1 1 : Deformación equivalente de plasticidad en el eje.

4.5 Conclusiones

En este estudio hemos aplicado funciones de aproximación gaussianas para el cálculo del campo

de esfuerzos elasto-plásticos en una placa rectangular homogénea con un corte en u n o de sus

lados, y sometida a cargas de tensión en la dirección vertical. H e m o s mostrado que las integrales

en el lado derecho de la ecuación integral de esfuerzos se pueden representar mediante algunas

funciones estandar que pueden ser calculadas y ser tabuladas fácilmente manteniendo estos valores

en la memoria de la computadora para ser usadas posteriormente para obtener los elementos de la

matriz de c o e i c i e n t e s del sistema de ecuaciones lineales.

Los resultados numéricos obtenidos muestran que su precisión depende de la densidad de nodos

de la malla auxiliar cerca de la frontera donde está presente la punta de la indentación o corte

lateral, y que la distancia entre los nodos en la región plástica debe ser del orden de magnitud de

la distancia entre los puntos de frontera cerca de la indentación. Las figuras (4.6-4.9) muestran

que el método desarrollado es efectivo.

Por otro lado, la comparación de resultados con un modelo equivalente calculado con el progra¬

m a de propósito general A N S Y S muestra resultados bastante precisos en las figuras (4.10 y 4.11),

en donde se puede observar que las propiedades de plasticidad, el esfuerzo equivalente y la defor¬

mación equivalente, están muy bien aproximadas cuando la cantidad de nodos de la malla en la

región de plasticidad se incrementa, así como la cantidad de puntos de frontera para satisfacer el

orden de magnitud previamente descrito. P o d e m o s considerar que 121 nodos por lado en la malla

de plasticidad nos proveen de resultados satisfactorios.


79

5 Problema de elasticidad dinámica para cuerpos


con grieta

En este capítulo, aplicamos el M é t o d o de Puntos de Frontera para resolver las ecuaciones inte¬

grales del segundo problema con valores en la frontera de elasticidad dinámica estacionaria para

sólidos con grieta. Nuevamente, continuamos usando como base funciones de aproximación Gaus-

siana, propuestas por V. M a z ' y a [14] a principios de 1990. Estas funciones fueron usadas para la

solución de las ecuaciones integrales de elasticidad estática de grientas e inclusiones delgadas por

Vilchevskaya y Kanaoun [22] y Kanaoun y R o m e r o [23]. recalcamos que la utilización de estas

funciones permite calcular de forma más simple y rápida los componentes de la matriz de c o e i -

cientes del sistema de ecuaciones lineales del problema discretizado, comparado con la aplicación

convencional del M é t o d o de Elementos de Frontera.

5.1 Formulación de las ecuaciones del problema de elasticidad dinámi¬

ca en forma de ecuaciones integrales

Consideremos un cuerpo elástico que ocupa una región Ωcon frontera cerrada Γen el espacio 3D

(o 2D), y sea n (x) el vector normal a Γdirigido hacia el exterior de Ω, en el punto x E Γ. El

material del cuerpo es h o m o g é n e o con tensor módulo elástico C y densidad p. Si el cuerpo está

sujeto a fuerzas de frontera

iwt
F ( x , t ) = f (x) e , (5.1)

el vector desplazamiento U y el tensor de esfuerzos Σen Ω tienen las formas

iwt iwt
U (x, t) = u (x) e Σ(x, t) = σ(x) e ,

donde t es el tiempo y ωes la frecuencia de la fuerza aplicada. Las amplitudes u (x) y σ (x) en

estas ecuaciones se pueden presentar en la forma

(5.2)

(5.3)
80

(5.4)

donde x ( x , x , x ) es el punto del cuerpo, G


1 2 3 l s (x) es la función de Green dinámica del medio in­

finito con módulo C y densidad p. El vector u (x) y el tensor a (x) en las ecuaciones (5.2,5.3)

proporcionan la solución del segundo problema de elasticidad dinámica si a (x) satisface la condi¬

ción de frontera sobre la frontera del cuerpo

σ (x) • n ( x ) | = f (x) Γ (5.5)

La ecuación integral para el vector b (x) se obtiene de las condiciones de frontera y tiene la forma

(5.6)

con

Tij (x, x') ̶ nk (x) Skijl ( x - x') nl (x') (5.7)

Si el cuerpo contiene un número finito de grietas, su frontera, Γ , debe ser incluida como parte
c

de la frontera total, Γ, del cuerpo. Se asume que ambos lados de cada grieta están sujetas a las

mismas fuerzas. La dirección de los vectores normales a la frontera de la grieta se pueden escoger

arbitrariamente. Si las caras de las grietas están libres de esfuerzos, entonces

σ(x) • n (x)| Γ = 0.

5.2 Solución numérica del problema 2D

Consideremos el problema de elasticidad dinámico plano para un cuerpo que ocupa una región

cerrada Ωen el espacio bidimensional con frontera Γ La solución de este problema se puede

escribir de forma similar a las ecuaciones (5.2,5.3)

(5.8)

donde δ(Γ) es la función delta concentrada sobre el contorno Γ y la integración se realiza sobre

el espacio bidimensional completo. Procediendo como en el M é t o d o de Puntos de Frontera del


( i )
capítulo 3, seleccionamos un conjunto de nodos x sobre Γ igualmente espaciados con distancia h

entre los puntos vecinos (ver [23]). El potencial dado por la ecuación (5.8) concentrado sobre Γ es
81

1
cambiado por la suma de potenciales concentrados sobre las líneas tangentes 7 en cada i-esimo

punto de frontera. L a densidad n (x) ® b (x) 5 (T) del potencial en la ecuación (5.8) es aproximada

por la ecuación

( i ) i
donde n es el vector normal externo a Γ en el i-ésimo punto de frontera, γ (x) es la función
i
delta concentrada en la línea tangente γ a Γ en el i-ésimo punto de frontera, h es la distancia entre
( i )
puntos frontera vecinos y D = 2. L o s vectores b en cada punto de frontera se debe determinar

c o m o la solución del problema y son las incógnitas principales del método. Después de susti¬

tuir la ecuación (5.9) en la ecuación (5.8), este último es convertido en una suma de potenciales
i
concentrados sobre las líneas tangentes γ

(5.10)

donde

( i )
Sea (s, z ) un sistema de coordenadas local conectado con el i-ésimo punto de frontera; sean s y
( i ) i
n los vectores unitarios del eje s dirigidos a lo largo de la línea tangente γ , y del eje z dirigido
( i )
a lo largo de la recta normal a Γ en el i-ésimo punto de frontera. E n esta base, el vector b en la

ecuación (5.9) tiene la forma

( i ) (i) (i) (i) (i)


b = bs s + b n.
n

Aquí, sólo las ondas P y las ondas SH son consideradas.

Después de sustituir la ecuación (5.9) en la ecuación (5.10), y calculando las integrales, obtenemos
(i)
la siguiente expresión para el tensor I en la base local del i-ésimo punto de frontera

(5.11)
82

donde los tensores J están dados por

y los tensores t son

además, λ, μson las constantes de L a m e del medio, Las cinco

funciones fi (ζ, η, K0) son las siguientes integrales unidimensionales

(5.12)

donde

(5.13)
83

2 2
Nótese que para valores grandes de los argumentos n, 7 (i.e. n + 7 > 1 0 0 ) , estas integrales

pueden ser cambiadas por ecuaciones asimptóticas sencillas que son una combinación de fun¬

ciones racionales y funciones de Hankel.

( i )
El sistema de ecuaciones algebraicas para las componentes (bs(i),bn(i)) de los vectores b en las

bases locales, se tienen que obtener a partir de la condición de frontera ecuación (5.5), que deben

ser satisfechas en todos los puntos de frontera (el método de colocación).

m ) ( m )
Introduzcamos el vector X de las incógnitas que son las componentes b S , del vector b
m)
en las bases locales. Entonces X = { X j } , j = 1, 2,..., 2M, con X 2 m _ 1 = bS( y X 2 m = ,

m = 1 , 2 , . . . , M . Aquí, M es el número total de puntos de frontera. El vector F define las fuerzas


m)
que actúan sobre los puntos de frontera; entonces, F = { F j } , j = 1 , 2 , . . . , 2 M , con F 2 m _ 1 = FS(

y F 2 m = Fn( ,m )
m = 1 , 2 , . . . , M , donde f s ( m)
y fn( m)
son los valores de los componentes tangencial

y normal, respectivamente, de las fuerzas aplicadas sobre los puntos de frontera. L a ecuación del

vector X toma la forma

Los componentes de la matriz de coeficientes, B j, i estan dados por las relaciones siguientes:

con

( m )
donde 7 m l = B m — B , ( m , l = 1, 2 , . . . , M ) , y B
1 m es el ángulo entre el vector n normal a
ml)
T en el m - é s i m o punto de frontera y el eje x , (rs( 2 rn(ml)) son los componentes del vector de

posición que conecta los puntos de frontera m - é s i m o y l-ésimo en la base local del m - é s i m o punto

de frontera, como se muestra en la figura (3.4). L o s componentes de la matriz B i j son expresados

mediante las funciones dadas en la ecuación (5.12) y su cálculo es muy simple.


84

2 2
Los resultados de los cálculos de los esfuerzos σ 11 en un disco circular (x + x , < 1 ) sujeto a
1 2

dos fuerzas concentradas periódicas a lo largo del eje x , se presentan en la figura (5.1) (problema
1

de deformación plana) para las frecuencias ω = 5 , 1 0 . Las líneas sólidas son soluciones analíticas

presentadas en Eringen y Suhubi [28], las líneas con círculos son las soluciones numéricas para

M — 8 0 , y se puede ver que ambas soluciones prácticamente coinciden.

Fig. 5.1: Distribución de esfuerzos en un disco sujeto a dos fuerzas.

5.3 Aplicación al problema de difracción de ondas P planas sobre

una grieta

Para el caso de sólidos con grietas, la función desconocida b (x) es el vector de apertura de la

grieta en las líneas de grieta Γ . La dificultad de la aplicación del método para este caso está
c

conectado con el hecho de que el error m á x i m o de la solución numérica, usando la aproximación

del potencial dada por la ecuación (5.9), se encuentra cerca de las puntas de la grieta. E s bien

sabido que tanto en dinámica como en estática, las asimptóticas del vector de la apertura de la

grieta, b ( x ) , cerca de la punta de la grieta está dado por la ecuación (3.66), que se repite a

continuación

donde r es la distancia entre el punto x 2 Γ y la punta de la grieta, y los componentes β y β


c s n

del vector β, están relacionadas con los factores de intensidad de esfuerzos, ecuaciones (3.67), es
85

decir

(5.14)

Para calcular el vector βcon gran precisión, se debe modificar el método.

Consideremos una grieta recta de longitud 2l (|x1| < l , x 2 = 0) en un plano infinito. E n este

caso la solución del problema de difracción de una onda armónica plana sobre una grieta se puede

obtener como se indica en la ecuación (3.70), que a continuación se escribe nuevamente

m 2 ... m - 1
B (x) = a 1 + a x + a x 2 3 + +a x
m , (5.15)

donde los vectores a (k = 1, 2 , . . . m ) son constantes.


k

Siguiendo con la metodología de la sección 3.5, introduzcamos un conjunto de nodos auxiliares


(j)
distribuidos homogéneamente sobre la línea de la grieta xa ( j = 1 , 2 , . . . M ) , y aproximemos la
a

función b (x) en la ecuación (5.15) de la forma siguiente:

(5.16)

Aquí, h a es la distancia entre los nodos auxiliares y su cantidad M a debe ser suficientemente
( k )
grande. Ahora los coeficientes a son las incógnitas de la expansión dada por la ecuación (5.15).
( k ) ( k )
El sistema final de coeficientes desconocidos ( a s ,a n ) que definen al vector b (x) sobre la

linea de la grieta se obtiene a partir de las condiciones de frontera. Para satisfacer estas condiciones

sobre la línea de la grieta, debemos escoger los puntos de frontera principales en la región central, a

alguna distancia desde las puntas de la grieta. El número m de puntos de frontera principales debe

ser pequeño (para frecuencias no muy altas) y está definido por el grado de los polinomiales de

aproximación en la ecuación (5.15). L o s e x p e r i m e n t o s numéricos muestran que las coordenadas


( j )
óptimas x ( j = 1, 2 , . . . m ) de los puntos de frontera deben seleccionarse a partir de las raices

de polinominales de Chevishev

( k )
Después de calcular los coeficientes a , los vectores b (x) y βse calculan a partir de la ecuación

(5.15).
86

Consideremos una onda P incidente con el vector de onda ortogonal a la linea de la grieta. En la

figura (5.2), los resultados de los cálculos de la apertura de la grieta | b ( x ) | son comparados con

la solución de este problema obenido por Eringen y Suhubi [28] mediante otro método, mostrado

con líneas sólidas.

| b ( x ) | está dividido sobre la apertura "estática"en el centro de la grieta; las líneas acompañadas

de círculos son las soluciones numéricas para M a = 200, m = 6 en las aproximaciones de las

ecuaciones (5.15, 5.16).Los resultados de los cálculos de los factores de intensidad de esfuerzos en

las puntas de la grieta se presentan en la gráfica del lado derecho de la figura (5.2), donde k (w) = 1

s
K /K ;
I I siendo K el factor de intensidad de esfuerzos como una función de la frecuencia y
I

s
K I= KI (0). L a línea sólida es la dependencia presentada por Eringen y Suhubi [28], la línea

representada por círculos es la solución numérica para M a = 200, m = 6, la línea representada

por los símbolos cuadrados es la solución numérica para M a = 200, m = 10.

Fig. 5.2: Apertura de la grieta y factores de intensidad de esfuerzos para el problema de difracción
de ondas P.

5.3.1 Conclusiones

La aplicación del método de puntos de frontera a la solución de problemas dinámicos de elastici¬

dad reduce la construcción de la matriz del problema discretizado al cálculo de integrales estandar

que tienen asimptóticas simples para grandes valores de los argumentos. Para pequeños valores

de los argumentos estas integrales pueden ser tabuladas y mantenidas en la memoria de la com¬

putadora. Esto decrece esencialmente el tiempo de solución de los problemas de difracción. Estas
87

ventajas abren el camino para resolver los problemas de difracción para campos incidentes no har¬

mónicos, (e.g. impulsos) que usualmente son usados en dispositivos ultrasónicos para la detección

no destructiva de defectos en materiales.


88

6 Conclusiones

El M é t o d o de Puntos de Frontera (BPM) nos permite desarrollar métodos de solución de ecuaciones

integrales de problemas físico matemáticos, permitiendo mayor precisión y mejor aproximación

que el F E M y otros métodos que requieren la discretización y construcción de mallas del dominio

completo, siendo un método alternativo tanto del F E M y B E M como de otros métodos que no

requieren de mallado; además, presenta un gran potencial de aplicación en diferentes problemas

de medios semi infinitos o infinitos. El B P M , al igual que el B E M , permite reducir en una di¬

mensión la complejidad de los problemas, debido a que las ecuaciones diferenciales parciales que

gobiernan el fenómeno físico se pueden representar como ecuaciones integrales de la frontera.

Pero a diferencia del B E M , no requiere de funciones de forma para realizar las aproximaciones,

ya que al establecer puntos sobre la frontera, colocados de forma equidistante, sólo requiere del

conocimiento de las propiedades geométricas de dichos puntos, tal como sus coordenadas, la ori¬

entación de un vector unitario normal a la superficie y dirigido hacia el exterior, y la orientación

de las rectas (2D) o planos (3D) trangentes a la frontera en el punto correspondiente.

Debido a ello, los elementos de la matriz de c o e i c i e n t e s del sistema de ecuaciones lineales resul¬

tante a resolver quedan r e p r e s e n t a d o s por integrales estandar que se pueden resolver analítica¬

mente, y cuyos valores se pueden tabular y guardar en la memoria de la computadora, permitiendo

construir la matriz de c o e i c i e n t e s de forma más rápida y eficiente que en el caso del B E M .

El B P M se aplicó a diferentes problemas de elasticidad, estática y dinámica, de cuerpos homogé¬

neos sin grieta y con grieta, así como al problema de plasticidad en 2D.

La metodología se aplicó satisfactoriamente a la solución de la ecuación integral de diferentes

problemas de elasticidad, estática y dinámica, asi como al problema de plasticidad, para cuerpos

homogéneos bidimensionales.

La comparación de los resultados numéricos con soluciones exactas y resultados experimentales

para los problemas de elasticidad tanto estática como dinámica, demuestran que el método se

puede aplicar con resultados altamente satisfactorios en todos los casos.


89

Para el problema de deformación plástica se requiere definir además, una serie de puntos en la

vecindad de la región de interés (e.g. cerca de la punta de la grieta) que permitan aproximar

adecuada y satisfactoriamente la participación de la deformación plástica en el tensor de esfuerzos.

Para el problema bidimensional tratado se establecieron puntos equiespaciados en una región

cuadrada cerca de la punta de la grieta, en donde las deformaciones plásticas son aproximadas

con las funciones propuestas en 2.


90

Bibliografía

[1] Brebbia, C. A., Telles, J. C. F., y Wrobel, L. C., "Boundary Element Techniques", Springer-

Verlag, Berlin, N.Y., 1984.

[2] Belytschko, T., Lu, y Y, y Gu, L., "Element-free Galerkin methods", Int. J. Numer. Methods

Eng., 37, 229-256,1994.

[3] Atluri, S. N . y Zhu, T., " A n e w meshless local Petrov-Galerkin ( M L P G ) approach in compu-

tational mechanics", Comput. Mech., 22, 117-127, 1998.

[4] Liu, G. R. y Gu, Y. T., " A point interpolation method", en Proc. 4th Asia-PaciGc Conference

on Computational Mechanics, , Singapore, Diciembre 1999, 1009-1014.

[5] Liu, G. R., " A point assembly method for stress analysis for solid, Impact Response of Mate-

rials & Structures", Shim, V P . W. et al., Oxford University Press, Oxford, 1999, 475-480.

[6] Onate, E. et al., " A finite point method in computational mechanics applications to convective

transport and fluid flow", Int. J. Numer. Methods Eng., 39, 3839-3866, 1996.

[7] Liszka, T. y Orkisz, J., "The finite difference method at arbitrary irregular grids and its appli-

cation in applied mechanics", Comput. Struct., 11, 83-95, 1980.

[8] Jensen, P. S., "Finite difference techniques for variable grids", Comput. Struct., 2, 17-29,

1980.

[9] Song, B . et al., "Application of finite point method to fluid flow and heat transfer", en Proc.

4th Asia-PaciGc Conference on Computational Mechanics, Diciembre, Singapur, 1091¬

1096, 1999.

[10] Xu, X. G. y Liu, G. R., " A local-function approximation method for simulating two-dimensional

incompressible flow", en Proc. 4th International Asia-PaciGc Conference on Computation-

al Mechanics, Diciembre, Singapore, 1021-1026, 1999.


91

[11] Cheng, M . y Liu, G. R., " A finite point method for analysis of fluid flow", en Proceedings

of 4th International Asia-Paciñc Conference on Computational Mechanics, Diciembre,

Singapore, 1015-1020, 1999.

[12] V. M a z ' y a , "Boundary point method", Technical Report No. LiTH-MATR-91-44, Dept. of

Mathematics, Linkóping University, S-581 83 L i n k p i n g , Sweden, 1991.

[13] V. M a z ' y a , " A n e w approximation method and its applications to the calculation of volume

potentials. Boundary point method, in " 3 . DFG-Koloqium des DFG-Forschungs schwer-

punctes 'Randelementmethoden' ",19, 1991.

[14] M a z ' y a V., "Approximate approximation", The Mathematics of Finite Elements and Ap-

plications. Highlights 1993, e d i t e d b y J.R. W h i t m a n , 77-104, Wiley, Chichester, 1994.

[15] V. M a z ' y a y G. Schmidt, " O n approximate approximations using Gausian kernels", IMA

Journal of Numerical Analysis, 16, 13-29, 1996.

[16] V. M a z ' y a y G. Schmidt, "Approximate wavelets and the approximation of pseudodifferential

operators", Applied and Computational Harmonic Analysis, 6, 287-313, 1999.

[17] M . Abramowitz, I. A. Stegun, "Handbook of Mathematical Functions", Dover Publ., N e w

York, 1968.

[18] W. H. Press, S. A. Teukplsky, W. T. Vetterling y B . P. Flannery, "Numerical Recipes in C", 2a.

Ed., Cambridge University Press, 1992.

[19] BanerjeeP. K. y Batterfield R., "Boundary elements methods in Engineering Sciences", McGraw-

Hill, 1981.

[20] Kanaun S. K., "To the problem of a spatial crack in an elastic anisotropic medium", Applied

Mathematics and Mechanics (PMM), 45, N 2 , 361-370, 1981.

[21] M a z ' y a V., " A n e w approximation method and its applications to the calculation of volume

potentials". Boundary point method en "3. DFG-Koloqium des DFG-Forschungs schwer-

punctes 'Randelementmethoden' ",19, 1991.


92

[22] Vilchevskaya E.N. y S. K. Kanaun, "Integral equation for thin inclusions in homogeneous

elastic media", Applied Mathematics and Mechanics (PMM), V.56, N . 2 , 235-243, 1992.

[23] Kanaun S. y V. Romero, " A numerical method for the solution of the second boundary value

problem of elasticity for solids with cracks", International Journal of Fracture, 107, N 1 ,

L15-L20, 2 0 0 1 .

[24] Kunin I. A., "Elastic M e d i a with Microstructure", V.2, Chapt.4, Springer-Verlag, 1983.

[25] Lurie A. I. "Theory of Elasticity", Nauka, 1973.

[26] Murakami Y. (Ed.), "Stress intensity factors handbook", V.1, Pergamon press, 1987.

[27] S. Kanaun, V. Romero, J. Bernal, " A n e w numerical method for the solution of the second

boundary value problem of elasticity for bodies with cracks", Revista Mexicana de Fsica, 47

(4), pp. 309-323, 2 0 0 1 .

[28] A. C. Eringen y E. S. Suhubi, "Elastodynamics", Vol. II, Academic Press, NY, 1975.
93

Apéndice A
Tensores de cuarto orden especiales

A.1 Las bases tensoriales de cuarto orden

Para la representación de tensores de cuarto orden, que se presentan en los problemas de elas¬

ticidad de medios heterogéneos, es conveniente utilizar bases especiales que son formados de

tensores singulares y de u n o o dos de los tensores singulares. M á s adelante se presentan las expre¬

siones para estas bases, también las fórmulas que permiten efectuar las operaciones con tensores,

que pertenecen a la envolvente de las bases examinadas. Comenzaremos con tensores del espacio

euclideano.

A.1.1 Base E

Cuando se construyen los operadores de Green para medios isotrópicos y otros casos, tenemos

que tratar con tensores de un tipo especial, que dependen de la delta de Kronecker y de un vector

unitario. E n este apartado, se presentan las fórmulas que nos permiten simplificar la operación con

estos tensores, y en particular, obtener expresiones explícitas para tensores inversos.

Consideremos tensores de cuarto orden construidos con deltas de Kronecker y el vector unitario

n , los cuales son simétricos en los primer y segundo pares de índices, pero que, generalmente

hablando, no son simétricos con respecto a la permutación de los pares.

Es posible mostrar que todos los tensores con esta estructura se pueden representar como la com¬

binación lineal de los siguientes seis tensores básicos linealmente independientes (y por lo tanto,
94

j u g a n d o el papel de una base):

Definamos una multiplicación convolución de dos tensores

(A.2)

donde

(A.3)

i j
Es fácil verificar que los tensores E se pueden expresar como combinaciones lineales de los
i
elementos base E .

i
El espacio tensorial lineal, expandido por la base E , es cerrado con respecto al producto intro¬

ducido, y por lo tanto, forma un álgebra que denotaremos por A ( n ) , con lo que podemos formar
i
la tabla de multiplicaciones de los tensores E

(A.4)

Examinaremos el espacio lineal de los tensores isotrópicos, simétricos en los primero y segundo
1
pares de índices. La base de estos tensores consiste de una combinación de los dos tensores E y
2
E . Para las operaciones tensoriales de esta base es conveniente tomar en cuenta los tensores base
2 1 2
ortogonales E y E — E / 3 , es decir,
95

D e aquí, podemos definir el tensor libre

1 1 1 1
donde a y a son c o e f i c i e n t e s escalares. E s fácil escribir el tensor inverso A -
1 2 (AA- = A- A = E )

A.1.2 Base P

Esta base se construye análogamente a la base dada en las ecuaciones (A.1), donde el tensor δaβ

produce la proyección θ aβ al plano, ortogonal al vector unitario m (||m|| = 1 )

θaβ = δ aβ - m m
a β (A.5)

Además, la base P consiste de seis tensores que están representados por las expresiones

Los elementos de los tensores E y P , ecuaciones (A.1,A.6), están relacionados por

j j i i j 1 j i i
P = a E , E = (a- ) P ,

- 1
donde las matrices a y a tienen las estructuras siguientes

(A.7)
96

i
Los seis tensores P también satisface la operación de multiplicación tensorial de la ecuación

(A.2). L a tabla de multiplicar de estos tensores tiene el siguiente aspecto


1 2 3 4 5 6
P P P P P P
1 1 2 3
P P P P 0 0 0
2 2 2 3
P P 2P 2P 0 0 0
3 2 3
P 0 0 0 P 0 P
4 4 4 6
(A.8)
P P 2P 2P 0 0 0
5
P 5
0 0 0 0 1P 0
6 4
2 6
P 0 0 0 P 0 P

1 2 i
N o t e m o s que el tensor ( P — P / 2 ) es ortogonal a todos los elementos P , con exepción del
1
tensor P ; es decir,

(A.9)

Es evidente que las envolventes de los tensores E y P coinciden.

Por lo que el tensor A y la base P tienen la siguiente relación

(A.10)

1 1 1 1
donde los a (i = 1 , . . . , 6), son coeficientes escalares. Entonces el tensor inverso A -
i (AA- = A- A = E)

se puede escribir como

(A.11)

con

Consideremos dos tensores A y B conformados de acuerdo con la base P de la ecuación (A.10).

La multiplicación tensorial A B se obtiene por las relaciones de las ecuaciones (A.8 y A.9), obte¬

niendo

(A.12)
97

A.1.3 Base θ

El tensor θaβ es la proyección sobre el plano, ortogonal al vector m , de acuerdo con la ecuación

(A.5), y a n , vector que está contenido en este plano de tal forma que m • n = 0. P o d e m o s

determinar los elementos de la base θmediante las relaciones

A continuación presentamos la tabla de multiplicar de la base θ


98

Apéndice B
Algunas integrales sobre la esfera unitaria

1. Caso 2 D
99

2. Caso 3D
100
Apéndice C

Métodos Numéricos

C.1 Métodos de solución de sistemas de ecuaciones lineales

Un conjunto de ecuaciones algebraicas lineales se puede escribir de la siguiente forma general

(C.1)

Aquí, las N incógnitas x j , con j = 1 , 2 , . . . , N están relacionadas por las M ecuaciones. Los
coeficientes a , con i = 1 , 2 , . . . , M y j = 1 , 2 , . . . , N , son números conocidos, y las cantidades
i j

del lado derecho, con i = 1 , 2 , . . . , M también son conocidos.

C.1.1 Conjuntos de ecuaciones no singulares versus conjuntos singulares

Si N = M, entonces existen tantas ecuaciones como incógnitas, y por lo tanto, existe una gran
posibilidad de resolver dicho sistema para obtener un conjunto solución único de xj. Analíti¬
camente, es posible no obtener una solución única si una o más de las M ecuaciones es una
combinación lineal de las otras, esto se conoce como degeneración por filas, o por otro lado, si to¬
das las ecuaciones tienen ciertas variables en exactamente la misma combinación lineal, conocido
como degeneración por columnas. Un conjunto de ecuaciones que es degenerado se denomina
1

singular.

Para situaciones de cálculos numéricos, por lo menos dos situaciones que produzcan errores se
pueden presentar:
• Aunque algunas ecuaciones no sean combinaciones lineales exactas de las otras, algunas de
ellas pudieran tener casi dependencia lineal que los errores de redondeo en la computadora
1
Para el caso de matrices cuadradas, una degeneración de filas implica una degeneración por columnas, y viceversa.
101

pueden producir dependencia lineal en alguna etapa del proceso de solución. E n este caso, el

procedimiento numérico fallará.

• Los errores de redondeo acumulados en el proceso de solución pueden producir un resultado

alejado de la solución real. Este problema surge particularmente si N es demasiado grande. El

procedimiento numérico no falla algorítmicamente. Sin embargo, proporciona un conjunto de

Xj equivocado, lo que puede comprobarse sustituyendo esta solución directamente en el sis¬

tema de ecuaciones lineales original. esto puede ocurrir facilmente si el sistema de ecuaciones

lineales es muy cercano a un sistema de ecuaciones singular.

Actualmente, muchos de los programas computacionales para la solución de sistemas de ecua¬

ciones lineales están enfocados en la detección y/o corrección de estas dos patologías. A u n q u e

estas dificultades las va resolviendo el desarrollador de dichos programas con experiencia, se

pueden aplicar los principios siguientes: Los sistemas de ecuaciones lineales con N tan grande

como 20 o 50 se pueden resolver utilizando precisión simple (representación de números de pun-

to flotante de 32 bits) sin necesidad de métodos sofisticados, siempre y cuando estos sistemas no

sean muy cercanos a sistemas singulares. Para números de doble precisión (64 bits), N se puede

extender a un tamaño tan grande como varios cientos, después de lo cual, el factor limitante no es

la precisión, sino el tiempo de máquina. Aún para conjuntos lineales grandes ( N del orden de mil

o mayor), si los c o e i c i e n t e s están dispersos (es decir, la mayoría son cero), estos sistemas pueden

resolverse utilizando métodos que aprovechan esta dispersión.

Para el otro extremo del espectro de posibilidades, a veces nos encontramos problemas lineales

que por su propia naturaleza están muy cercanos de ser singulares. Para estos casos, es necesario

considerar métodos sofisticados, aún para el caso en el que N = 10. Entonces se puede utilizar una

técnica conocida como descomposición en valor singular, técnica que en ciertas situaciones, per¬

mite transformar sistemas singulares en sistemas no singulares, evitando la necesidad de utilizar

técnicas más sofisticadas.


102

C.1.2 Representación matricial

La ecuación (C.1) se puede escribir en forma matricial como

A •x = b (C.2)

Aquí, el punto denota multiplicación matricial, A es la matriz de coeficientes, b representa las

constantes del lado derecho y x representa las incógnitas, ambos escritos como vector columna,

(C.3)

Por convención, el primer índice del elemento a i j denota su fila y el segundo índice denota su

columna.

C.1.3 Eliminación de Gauss-Jordan

Para invertir una matriz, la eliminación de Gauss-Jordan es tan eficiente como cualquier otro

método. Para la solución de sistemas de ecuaciones lineales, la eliminación de Gauss-Jordan pro-


_ 1
duce tanto la solución para u n o o más vectores b del lado derecho como la matriz inversa A . S i n

embargo, sus principales debilidades son: (i) requiere que todos los vectores del lado derecho es¬

tén almacenados y sean manipulados al m i s m o tiempo, y (ii) que cuando la matriz inversa no

se necesita, Gauss-Jordan es tres veces más lento que la mejor técnica alternativa para resolver

un sólo sistema. L a principal fortaleza del método es que es estable como cualquier otro método

directo, tal vez un poco más estable cuando se utiliza pivoteo (ver más adelante).

Si posteriormente se desea resolver el sistema con un nuevo vector b , por supuesto que éste

se puede multiplicar por la matriz inversa; sin embargo, la respuesta obtenida será susceptible a

errores de redondeo, y no será tan precisa como si se hubiera incluído este vector desde el principio

del proceso.

Por estas razones, no siempre el método de Gauss-Jordan es seleccionado en primera instancia

como el método de solución, aunque es un buen método directo, comprensible, sólido y excep-

cionalmente produce gran confianza al usuario.


103

C.1.4 Eliminación Gaussiana con substitución hacia atrás

La utilidad de la eliminación Gaussiana con substitución hacia atrás es en principio pedagógica.

Se ubica entre los esquemas de eliminación completa tal como el Gauss-Jordan, y los esquemas

de descomposición triangular. La eliminación Gaussiana reduce una matriz, no hasta obtener la

matriz identidad, sino sólo la mitad del camino, hasta obtener una matriz cuyos componentes sobre

la diagonal y los componentes por encima de esta diagonal se mantienen no triviales. Veamos

cuales son sus ventajas.

Supongamos que realizamos la eliminación Gauss-Jordan, realizando las operaciones sólamente

por debajo del pivote actual, de tal forma que obtenemos ceros por debajo de la diagonal principal.

También supongamos que sólo hacemos pivoteo parcial, es decir, nunca intercambiamos columnas

de tal forma que el orden de las componentes incógnitas no se modifica. Entonces cuando se hace

esto para todos los pivotes obtenemos un sistema de ecuaciones equivalente parecido al siguiente

(C.4)

Aquí, las primas significan que las a y las b no tiene su valor numérico original, sino que ha sido

modificado por todas las operaciones f i l a realizadas durante el proceso. Este procedimiento hasta

este punto se denomina eliminación Gaussiana.

¿Pero cómo determinamos los valores del vector incógnita x ? En el sistema (C.4) la última

ecuación nos permite determinar x 4 como

(C.5)

Este valor lo substituimos en la penúltima ecuación para obtener

(C.6)

y procediendo de la misma forma para cada ecuación anterior, podemos sistematizar este proceso

como

(C.7)
104

El procedimiento definido por la ecuación (C.7) se conoce como substitución hacia atrás. La

combinación de eliminación Gaussiana y substitución hacia atrás proporciona una solución al

sistema de ecuaciones lineales.

La ventaja de este método sobre la eliminación de Gauss-Jordan es simplemente que es más

rápido en la realización de operaciones por f i l a s . Los ciclos más internos de la eliminación de


3
Gauss-Jordan, cada u n o conteniendo una substracción y una multiplicación, son efectuados N
2
y N M veces (dónde se tienen N ecuaciones y M incógnitas); los ciclos correspondientes en la

eliminación Gaussiana son efectuados sólamente veces (ya que sólo la mitad de la matriz

es reducida y el aumento de números convertibles a cero reduce el conteo a un tercio), y

veces, respectivamente. Cada sustitución hacia atrás del lado derecho requiere de operaciones

de un ciclo similar (una multiplicación más una substracción). Para M << N (sólo unos cuantos

vectores del lado derecho) la eliminación Gaussiana tiene una ventaja con un factor de tres sobre

la eliminación de Gauss-Jordan. Se puede reducir este factor a 1.5 si no se calcula la matriz inversa

como parte del esquema de Gauss-Jordan.)

Para el cálculo de la matriz inversa (que se puede ver como el caso de M = N vectores del lado

derecho, dígase los N vectores unitarios que son las columnas de la matriz identidad), a primera

vista la eliminación gaussiana con substitución hacia atrás requiere (reducción de la matriz)

(manipulaciones del lado derecho) ( N substituciones hacia atrás) ciclos


3
efectuados, que es mayor que N para Gauss-Jordan. Sin embargo, los vectores unitarios tienen

todos sus elementos iguales a cero excepto por un sólo elemento. Si esto se toma en cuenta, las

manipulaciones del lado derecho se pueden reducir a sólamente ciclos efectuados, y para la

inversión de la matriz los dos métodos tienen eficiencias idénticas.

A m b o s métodos comparten la desventaja de que todos los vectores del lado derecho deben ser

conocidos por adelantado.

C.1.5 Descomposición L U y sus aplicaciones

Supongamos que somos capaces de escribir la matriz A como un producto de dos matrices,

L •U = A (C.8)
105

donde L es triangular inferior (sólamente tiene elementos en la diagonal principal y por debajo de

ella) y U es triangular superior (sólamente tiene elementos en la diagonal principal y por encima

de ella). Por ejemplo, para el caso de una matriz A de dimensiones 4 x 4 la ecuación (C.8) se

vería como

(C.9)

P o d e m o s usar la descomposición (C.9) para resolver el sistema de ecuaciones lineales como

A • x = (L • U ) • x = L • ( U • x ) = b (C.10)

resolviendo primero para un vector y tal que

L •y = b (C.11)

y luego resolviendo para x con

U •x = y (C.12)

La ventaja de dividir un sistema de ecuaciones lineales en dos sistemas con los cuales realizar

operaciones sucesivas es que la solución de un conjunto de ecuaciones triangular es bastante

trivial, como se puede comprobar con la ecuación (C.7). Entonces, la ecuación (C.11) se puede

resolver por substitución hacia adelante como sigue

(C.13)

mientras que la ecuación (C.12) se puede resolver mediante substitución hacia atrás, exactamente

igual como en las ecuaciones (C.5-C.7),

(C.14)

2
Las ecuaciones (C.13, C.14) realizan un total de N operaciones (para cada vector b del lado

derecho del sistema) en un ciclo interior, cada u n o conteniendo una multiplicación y una suma.

Si tenemos N vectores del lado derecho del sistema tales como vectores unitarios columna (que
106

es el caso cuando estamos invirtiendo u n a matriz), entonces, t o m a n d o en cuenta los elementos

con valor cero, la cantidad total de operaciones de la ecuación (C.13) se reduce de

mientras que la ecuación (C.14) se mantiene en

Es importante notar que, una vez que se tiene la descomposición L U de A , podemos resolver el

sistema para tantos vectores b del lado derecho c o m o queramos, u n o a la vez, sin necesidad de

reducir nuevamente el sistema original; por lo que es una ventaja de este proceso con respecto a

los anteriores de las secciones C.1.3 y C.1.4.

C.1.6 Efectuando la descomposición L U

La metodología para resolver un sistema de ecuaciones lineales utilizando la descomposición L U

es la siguiente:

Primero, escribimos la ecuación para el componente i, j é s i m o de la ecuación (C.8) o la ecuación

(C.9). Sin embargo, el número de términos en la suma depende de si i o j es el n ú m e r o m á s

pequeño. Se tienen tres casos:

i < j : li1U1j + li2U2j +...+ liiuij = aij (C.15)

i = j : LI1U1J + LI2U2J +...+ liiujj = aij (C.16)

i > j : +li1u1j+li2U2j+ . . . + lijUjj = aij (C.17)

2 2
Las ecuaciones (C.15, C.17 ) representan un total de N ecuaciones para las N + N incógnitas

l y u (Los términos de la diagonal principal se consideran dos veces). Debido a que el número de

incógnitas es mayor al número de ecuaciones, entonces podemos especificar N de las incógnitas

arbitrariamente y luego resolver el sistema para las otras incógnitas. E n efecto, siempre es posible

tomar

lii = 1 i = 1,...,N (C.18)


107

Ahora, un procedimiento sorprendente es el algoritmo de Crout, con el que se puede resolver


2
trivialmente el conjunto de N + N ecuaciones (C.15, C.18) para todas las incógnitas l y u sim¬

plemente reacomodando las ecuaciones en cierto orden, c o m o sigue:

• Se define lii = 1, i = 1 , . . . , N (ecuación (C.18)).

• Para cada j = 1 , 2 , . . . , N se hace lo siguiente:

Primero, para i = 1 , 2 , . . . , j , se usan las ecuaciones (C.15, C.16 y C.18) para determinar

los u¿j, es decir

(C.19)

(Cuando i = 1 en la ecuación (C.19) la sumatoria vale cero).

Segundo, para i = j + 1 , j + 2 , . . . , N se usa la ecuación (C.17) para determinar los valores

de los lij,

(C.20)

Es importante estar seguros de realizar los dos procedimientos antes de continuar con el siguiente

j.

Durante el proceso de cálculo, se puede verificar que los / y u del lado derecho de las ecuaciones

(C.19, C.20) ya han sido calculados previamente; también se puede verificar que los aij se utilizan

sólamente una vez y no se vuelven a ocupar posteriormente. Esto permite que los /¿j o u¿j corre¬

spondientes se puedan almacenar en el espacio de memoria ocupado por a¿j. además, los /¿¿ = 1

no necesitan ser almacenados. Así, el método de Crout obtiene la matriz combinada

(C.21)

Es importante recalcar que para que el método de Crout sea estable, se requiere realizar pivoteo

durante el proceso para evitar divisiones por cero (o valores demasiado pequeños) en la ecuación

(C.20).
108

C.2 Interpolación en dos dimensiones

En interpolación multidimensional, buscamos una estimación de y (x1, x , . . . , x ) a partir de


2 n

una malla n-dimensional de valores tabulados y y n vectores n-dimensionales que contienen los

valores tabulados de cada una de las variables independientes x , x , . . . , x . Consideraremos el


1 2 n

caso explícito de dos dimensiones, ya que los casos de tres o más dimensiones son análogos.

Imaginemos que se nos ha dado una matriz de valores funcionales y a [1..m] [1..n] en dos dimen-

siones. También se nos ha dado un arreglo x 1 a [1..m], y un arreglo x 2 a [1..m]. L a relación de estas

cantidades de entrada con una función subyacente y (x1, x ) es 2

y a [j] [k] = y ( x 1 a [j] , x 2 a [k]) (C.22)

D e s e a m o s estimar, mediante interpolación, la función y en algún punto no tabulado (x1, x ) . 2

U n concepto importante es el de la malla cuadrada, en la que se encuentra el punto (x1, x ) , esto


2

es, los cuatro puntos tabulados que rodean al punto interior deseado. Por conveniencia, numer¬

aremos estos puntos de 1 a 4, en sentido contrario a las manecillas del reloj comenzando a partir

de la esquina inferior izquierda, como se ve en la figura (6.1).

(a) (b)

Fig. 6.1: Malla cuadrada para interpolación bicúbica.


109
De forma más precisa, si
x1a [j] ≤x 1 ≤x1a [j + 1] (C.23)
x2a [k] ≤x 2 ≤x2a [k + 1]
con j y k definidos, entonces

y2 = y a [j + 1] [k]
(C.24)
y3 = y a [j + 1] [ k + 1]
y4 = y a [j] [k + 1]

La interpolación más simple en dos dimensiones es la interpolación bilineal sobre una malla
cuadrada. Sus fórmulas son

(C.25)

por lo que el valor tanto de t como de u se encuentran entre 0 y 1, y


y(x1,x2)= (1 - t) (1 - u) y1 + t (1 - u) y2 + ty3 + (1 - t) y 4 (C.26)

Conforme los puntos de interpolación cambian de una malla cuadrada a otra, los valores de la
función interpolada cambian continuamente. Sin embargo, el gradiente de la función interpolada
cambia discontinuamente en las fronteras de cada malla cuadrada.

Existen dos direcciones claramente diferentes que se pueden tomar para ir más allá de la inter¬
polación bilineal a métodos de orden superior: Se puede usar técnicas de orden superior para
obtener un incremento en la precisión de la función interpolada (principalmente para funciones
suficientemente suaves) sin necesidad de tratar defijarla continuidad del gradiente y las derivadas
superiores. O se pueden usar técnicas de orden superior para forzar la suavidad de algunas de estas
derivadas conforme el punto interpolante cruza las fronteras de la malla cuadrada. A continuación
se considera la primera posibilidad que es la utilizada en el Método de Puntos de Frontera.

C.2.1 Orden superior para mejorar la precisión

La idea básica es dividir el problema en una sucesión de interpolaciones unidimensionales. Si


queremos hacer una interpolación de orden m — 1 en la dirección x , y de orden n — 1 en la
1

dirección x , primero localizamos un sub-bloque de m x n de la matriz de la función tabulada


2
110
que contenga el punto(X2,x )deseado. Entonces hacemos m interpolaciones unidimensionales
2

en la dirección x , i.e. sobre lasfilasdel sub-bloque, para obtener los valores de la función en
2

los puntos (x1a [j] , x ) , con j = 1, 2,..., m . Finalmente, hacemos una última interpolación en la
2

dirección x para obtener la respuesta.


1

C.2.2 Orden superior para suavizar la función mediante interpolación


bicúbica

La interpolación bicúbica requiere que el usuario especifique en cada punto de la malla, no sólo
los valores de la función y ( x , x ) , sino también los gradientes ∂y/∂x = y , , ∂y/∂x = y , , y la
1 2 1 1 2 2

derivada cruzada ∂ y/∂x ∂x = y , . Entonces, se puede encontrar una función interpolante que
2
1 2 12

es cúbica en las coordenadas normalizadas t y u, ecuación (C.25), con las siguientes propiedades:
1. Los valores de la función y las derivadas correspondientes son reproducidas exactamente
sobre los puntos de la malla, y

2. los valores de la función y las derivadas correspondientes cambian continuamente conforme


el punto de interpolación cruza de una malla cuadrada a otra.

Es recomendable conocer las derivada analíticamente, o tener la capacidad de poder calcularlas


numéricamente con gran precisión en los puntos de la malla. Si no es posible lo anterior, se pueden
determinar por difereiciación numérica a partir de los valores funcionales ya tabulados sobre la
malla. El código relevante podría ser algo como lo siguiente:

y1a[j][k] = (ya[j +1 ] [ k ] - y a [ j - 1 ] [ k ] ) / ( x 1 a [ j + 1 ] - x 1 a [ j - 1 ] ) ;
y2a[j][k] = (ya[j][k+1]-ya[j][k-1])/(x2a[k+1]-x2a[k-1]);
y12a[j][k] = (ya[j +1][k+1]-ya[j +1 ] [ k - 1 ] - y a [ j + 1][k-1]
-ya[j-1][k+1]+ya[j-1][k-1])/((x1a[j + 1]-x1a[j-1])
*(x2a[k+1]-x2a[k-1]));

Para hacer una interpolación bicúbica dentro de una malla cuadrada, dada la función y y las
derivadas y1, y2, y12 en cada una de las cuatro esquinas del cuadrado, se tienen dos pasos:
111

1. Obtener las 16 cantidades cij, i, j = 1 , . . . , 4 usando métodos numéricos adecuados, por


ejemplo, la rutina b c u c o f dada en [18].

2. Substituir las cij en las fórmulas bicúbicas siguientes para la función y sus derivadas,

(C.27)

donde t y u están dados por la ecuación (C.25).


112

Apéndice D

Programas computacionales en lenguaje C


113

*******************************************************************/

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "bpmcalcpla.h"
#include "bpmgeoma.h"
#include "func14a.h"
#include "funplast21a.h"
#include "intext.h"
#include "mallaAdaptiva.h"
#include "nr.h"
#include "nrutil.h"

/**************************************************************************
Definicion de constantes generales y propiedades del material
**************************************************************************/
int cond, M0c;
double cero, D, KAPPA0, Elmod, MU0, Nu, epsmax, pb, C1;
char falso[72];

/*************************************************************************/

double fs, fn;

int II, JJ, KK, LL, continuar=1, indicI, indicJ;

int e, f, i, j, k, kinicial, nx, ny, Mx, My;


int intervalo;
int leerdatos;
int Regiones, Regext, Regint, Grietas, N;
double **A, **AA, **u, *X, *T, *G, *TG, *as, *an, *bs, *bn;
double **sigma11, **sigma12, **sigma22, **sigma33, *NX, *NY;
double *zeta, *eta;
double **fJ11, **fJ12, **fJ21, **fJ22;
double **dxyJ11, **dxyJ12, **dxyJ21, **dxyJ22;
double *fxy, *dfx, *dfy, *dfxy, *delx, *dely;
double fzalim, fzainic, deltafuerza, lx, ly, sigmay;

/*************************************************************************
Variables para definir si los puntos de la malla donde se calculan
los esfuerzos son interiores, 1, o exteriores, 0.
*************************************************************************/
int **intextgen, **intextpl;
int ixinic, iyinic;
int lix, lsx, liy, lsy, cambio=0;
double coordxinic, coordyinic;

/************************************************************************
Variables utilizadas para los calculos dentro de la region plastica
La dimensi� es Mx por My
************************************************************************/
int nn;
double *xp, *yp;
double linfx, lsupx, linfy, lsupy, hplas, hplasy, pplas;
114
double **esfp11, **esfp12, **esfp22, **esfp33;
double **Sp11, **Sp12, **Sp22, **Sp33;
double **eps11, **eps12, **eps22, **eps33;
double **deps11, **deps12, **deps22, **deps33;
double **esfeq, **sigmat, **epseq;
double esfeqmax=0.0, epseqmax=0.0, sumaesfp, razonesfp;
double B1, R0, RINF;
double coordx, coordy;

double xmin, xmax, ymin, ymax, deltax, deltay;

/**************************************************************************
Definicion de las fronteras (region) (DREGION),
puntos de frontera (elemento) (DELEMENTO) y
Cargas externas (fuerza) (DVECTOR2D)
**************************************************************************/
DREGION *region;

DELEMENTO *elemento;

DVECTOR2D *fuerza, *fzaplast;

FILE *fp, *fpesfpl, *fpepspl, *fpmallapl, *fpresult;


FILE *fps11, *fps12, *fps22;
FILE *fps11pl, *fps12pl, *fps22pl, *fps33pl;
FILE *fpe11pl, *fpe12pl, *fpe22pl, *fpe33pl;
FILE *fpde11pl, *fpde12pl, *fpde22pl, *fpde33pl;
FILE *fpSp11, *fpSp12, *fpSp22, *fpSp33;

char matriz[13]="matrizA.txt", archivo[81], archivobak[81], numero[4];


char ndatgen[81], edatgen[5]=".dat",
ndatesfeq[81], edatesfeq[5]=".spl",
ndatepseq[81], edatepseq[5]=".epl",
nmallapl[81], emallapl[5]=".net",
nresult[81], eresult[5]=".res",
ndats11[81], edats11[5]=".s11",
ndats12[81], edats12[5]=".s12",
ndats22[81], edats22[5]=".s22",
ndats11pl[81], edats11pl[7]=".s11pl",
ndats12pl[81], edats12pl[7]=".s12pl",
ndats22pl[81], edats22pl[7]=".s22pl",
ndats33pl[81], edats33pl[7]=".s33pl",
ndate11pl[81], edate11pl[7]=".e11pl",
ndate12pl[81], edate12pl[7]=".e12pl",
ndate22pl[81], edate22pl[7]=".e22pl",
ndate33pl[81], edate33pl[7]=".e33pl",
ndatde11pl[81], edatde11pl[8]=".de11pl",
ndatde12pl[81], edatde12pl[8]=".de12pl",
ndatde22pl[81], edatde22pl[8]=".de22pl",
ndatde33pl[81], edatde33pl[8]=".de33pl",
ndatSp11pl[81], edatSp11pl[8]=".Sp11pl",
ndatSp12pl[81], edatSp12pl[8]=".Sp12pl",
ndatSp22pl[81], edatSp22pl[8]=".Sp22pl",
ndatSp33pl[81], edatSp33pl[8]=".Sp33pl";

time_t tinicio,tfinal, t1, t2, t3, tiniciter, tfiniter;


float tusado, titer;

/************************************************************************
115
Variables para obtener la fecha y la hora local
************************************************************************/
time_t ahora;
struct tm *tahora;

/*********************************************************************
Funcion para el calculo de la constante A
en la fn. de incremento de carga

double expA(int i, double b)


{
double a;
a=-log(1-(fzalim-fzainic)/b)/i;
return a;
}
*********************************************************************/

/*********************************************************************
PROGRAMA PRINCIPAL
*********************************************************************/
main()
{

/***************************************************************
DETERMINA EL TIEMPO DE INICIO DEL PROGRAMA
****************************************************************/
time(&tinicio);

datos_interp();

system("cls");

inicio();
brinco(2);
lee_propiedades("bpmplastprop01.dat");

/*******************************************
Define espacio de memoria para las variables de tama� Mx My
*******************************************/
intextpl=imatrix(0,Mx,0,My);
xp=dvector(0,Mx); yp=dvector(0,My);
esfp11=dmatrix(0,Mx,0,My); esfp12=dmatrix(0,Mx,0,My);
esfp22=dmatrix(0,Mx,0,My); esfp33=dmatrix(0,Mx,0,My);
Sp11=dmatrix(0,Mx,0,My); Sp12=dmatrix(0,Mx,0,My);
Sp22=dmatrix(0,Mx,0,My); Sp33=dmatrix(0,Mx,0,My);
eps11=dmatrix(0,Mx,0,My); eps12=dmatrix(0,Mx,0,My);
eps22=dmatrix(0,Mx,0,My); eps33=dmatrix(0,Mx,0,My);
deps11=dmatrix(0,Mx,0,My); deps12=dmatrix(0,Mx,0,My);
deps22=dmatrix(0,Mx,0,My); deps33=dmatrix(0,Mx,0,My);
esfeq=dmatrix(0,Mx,0,My); sigmat=dmatrix(0,Mx,0,My);
epseq=dmatrix(0,Mx,0,My);

/**************************************************************************

AQUI ENTRA LA FUNCION PARA LEER DATOS DESDE ARCHIVOS DE MODELO PREVIO

lee_modelo_previo();

****************************************************************************/
116

/*****************************************************************
DEFINICION DEL NOMBRE DEL ARCHIVO PARA EL ALMACENAMIENTO DE LA INFORMACION
******************************************************************/
printf("Nombre del archivo para almacenar la informacion (sin extension) : ");
scanf("%s",archivo);

strcpy(archivobak,archivo);

/*****************************************************************
DEFINICION DE LAS REGIONES FRONTERA DEL MODELO
******************************************************************/
printf("\n\nDEFINICION DE LAS REGIONES FRONTERA DEL MODELO\n\n");
printf("Numero de grietas : ");
scanf("%d",&Grietas);
printf("Numero de regiones exteriores : ");
scanf("%d",&Regext);
printf("Numero de regiones interiores : ");
scanf("%d",&Regint);

/******************************************************************
Colocacion de memoria para las regiones.
******************************************************************/
Regiones=Grietas+Regext+Regint;

if((region=(DREGION *)calloc(Regiones,sizeof(DREGION)))==NULL)
fprintf(stderr,"\nNo hay espacio para las regiones\n\n");
else
printf("\nLas regiones se colocaron satisfactoriamente.\n");
regiones(region,Regiones);
modregs(region,Regiones);

brinco(1);

N=0;
for(i=0;i<Regiones;i++) N+=region[i].numpf;
printf("N= %d\n",N);

/***************************************************************
Colocacion de memoria para los puntos de frontera.
****************************************************************/
if((elemento=(DELEMENTO *)calloc(N,sizeof(DELEMENTO)))==NULL)
fprintf(stderr,"\n\nNo hay espacio para los puntos de frontera\n\n");
else
printf("\nLos puntos de frontera se colocaron satisfactoriamente.\n");

/***************************************************************
DEFINICION DE MATRICES Y VECTORES
****************************************************************/
A=dmatrix(1,2*N,1,2*N);
AA=dmatrix(1,2*N,1,2*N);
T=dvector(1,2*N);
G=dvector(1,2*N);
TG=dvector(1,2*N);
X=dvector(1,2*N);
as=dvector(1,region[0].numpf);
an=dvector(1,region[0].numpf);
bs=dvector(1,N);
bn=dvector(1,N);
117

/***************************************************************
DEFINICION DE LAS COORDENADAS Y VECTORES NORMALES
DE LOS PUNTOS DE FRONTERA
****************************************************************/
puntos_de_frontera(region,Regiones,elemento);

/***************************************************************
CALCULO DEL PARAMETRO pb = h/Sqrt(D) COMO PROMEDIO
DEL pb DE CADA PUNTO DE FRONTERA
****************************************************************/
pb=0.0;
for(i=0;i<N;i++) pb+=elemento[i].p;
pb=pb/N;

printf("\n\nEl pb promedio es : %6.4E\n\n",pb);

/***************************************************************
Presentacion en pantalla de la informacion de los puntos de frontera
printf("Elem Front Xpuntof Ypuntof Beta(Rad) h\n");
for(i=0;i<N;i++)
printf("%3d %c %+6.4E %+6.4E %+6.4E %+6.4E\n",
i+1,elemento[i].frontera,elemento[i].xpuntof,
elemento[i].ypuntof,elemento[i].beta,elemento[i].h);
****************************************************************/

/***************************************************************
Colocacion de memoria para los vectores Fuerza y Fzaplast.
****************************************************************/
if((fuerza=(DVECTOR2D *)calloc(N,sizeof(DVECTOR2D)))==NULL)
fprintf(stderr,
"\n\nNo hay espacio para los vectores Fuerza\n\n");
else
printf("\nLos vectores Fuerza se colocaron satisfactoriamente.\n");

if((fzaplast=(DVECTOR2D *)calloc(N,sizeof(DVECTOR2D)))==NULL)
fprintf(stderr,
"\n\nNo hay espacio para los vectores Fzaplast\n\n");
else
printf("\nLos vectores Fzaplast se colocaron satisfactoriamente.\n");

/***************************************************************
Discretizacion del dominio para el calculo de los esfuerzos en todo el
dominio
****************************************************************/
discret_dominio();

/***************************************************************
Asignacion de la memoria para las variables de esfuerzos y
de la matriz que define si los puntos son exteriores o interiores
de toda la placa.
***************************************************************/
sigma11=dmatrix(1,nx,1,ny);
sigma12=dmatrix(1,nx,1,ny);
sigma22=dmatrix(1,nx,1,ny);

/***************************************************************
sigma33=dmatrix(1,nx,1,ny);
***************************************************************/
118
intextgen=imatrix(1,nx,1,ny);

/*******************************************************************
Definicion si los puntos de la malla general
son interiores (1) o exteriores (0).
*******************************************************************/
printf("Definicion de la malla general para el calculo de esfuerzos.\n"
"Definiendo puntos interiores (1) y exteriores (0) al dominio.\n\n");
for(i=1;i<=nx;i++)
for(j=1;j<=ny;j++)
intextgen[i][j]=intext(NX[i], NY[j]);

/***************************************************************
for(j=ny;j>=1;j--)
{
for(i=1;i<=nx;i++)
printf("%d", intextgen[i][j]);
brinco(1);
}
***************************************************************/
/*******************************************************
Definicion de la region plastica
*******************************************************/
printf("Definicion de las fronteras de la region plastica:\n");
printf("Coordenada X inicial = ");
scanf("%lf", &linfx);
printf("Coordenada X final = ");
scanf("%lf", &lsupx);
printf("Coordenada Y inicial = ");
scanf("%lf", &linfy);
printf("Coordenada Y final = ");
scanf("%lf", &lsupy);

lx=fabs(lsupx-linfx);
ly=fabs(lsupy-linfy);

hplas=lx/(Mx-1);
hplasy=ly/(My-1);
pplas=hplas/sqrt(2.0);

xp[0]=linfx;
yp[0]=linfy;

for(i=1;i<Mx;i++)
{
xp[i]=xp[i-1]+hplas;
}
for(j=1;j<My;j++)
{
yp[j]=yp[j-1]+hplasy;
}
brinco(1);
/***************************************************************
for(i=0;i<Mx;i++)
printf("xp[%3d] = %lf yp[%3d] = %lf\n", i, xp[i], i, yp[i]);
brinco(2);
***************************************************************/
/*******************************************************************
Definiendo si los puntos de la malla de la region plastica
119
son interiores (1) o exteriores (0).
*******************************************************************/
for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
intextpl[i][j]=intext(xp[i], yp[j]);
brinco(1);

for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
{
if(intextpl[i][j]>0) printf("-");
else printf(" ");
}
brinco(1);
}
brinco(1);

/*****************************************************************

DEFINICION DE LOS INDICES INICIALES PARA LA MALLA ADAPTIVA

*****************************************************************/
printf("Definicion de las coordenadas iniciales para la malla adaptiva...\n");
printf("Coordenada X inicial = ");
scanf("%lf", &coordxinic);
printf("Coordenada Y inicial = ");
scanf("%lf", &coordyinic);

indic_inic();
lix=lsx=ixinic;
liy=lsy=iyinic;
brinco(1);

/***************************************************************
PASO 1.-

DEFINICION DE LAS FUERZAS EXTERNAS APLICADAS AL MODELO

Definicion de la carga limite y del esfuerzo de cedencia

***************************************************************/
printf("Inicializacion de datos en la region plastica.\n");
printf("Establecer la carga inicial externa..............: ");
scanf("%lf",&fzainic);
printf("Establecer el maximo de las cargas externas......: ");
scanf("%lf",&fzalim);
printf("Definir el numero de intervalos de fzas. externas: ");
scanf("%d",&intervalo);
printf("Establecer el esfuerzo de cedencia...............: ");
scanf("%lf",&sigmay);
brinco(1);
printf("La carga inicial es.......: %8.6lf\n", fzainic);
printf("La carga limite es........: %8.6lf\n", fzalim);
printf("El num. de intervalos es..: %3d\n", intervalo);
printf("El esfuerzo de cedencia es: %8.6E\n", sigmay);
brinco(1);
deltafuerza=(fzalim-fzainic)/intervalo;
printf("El incremento de carga es: %8.6lf\n", deltafuerza);
120

/*************************************************************
Asignacion de la carga inicial al modelo
*************************************************************/
fuerzas(fuerza, fzainic);

/*****************************************************************

PASO 2.-

Inicializando las deformaciones plasticas


y los cambios de deformacion a cero en la region plastica.

*****************************************************************/
printf("Inicializacion de las deformaciones plasticas a cero.\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
eps11[i][j]=eps12[i][j]=eps22[i][j]=eps33[i][j]=0.0;
deps11[i][j]=deps12[i][j]=deps22[i][j]=deps33[i][j]=0.0;
Sp11[i][j]=Sp12[i][j]=Sp22[i][j]=Sp33[i][j]=0.0;
esfp11[i][j]=esfp12[i][j]=esfp22[i][j]=esfp33[i][j]=0.0;
esfeq[i][j]=0.0;
epseq[i][j]=0.0;
}
}
brinco(1);

/*****************************************************************

PASO 3.-

Definiendo el esfuerzo de cedencia en cada nodo de la region plastica.

*****************************************************************/
printf("Inicializacion del esfuerzo t = esfuerzo de cedencia.\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==0)
sigmat[i][j]=0.0;
else
sigmat[i][j]=sigmay;
}
}
brinco(1);

/***************************************************************
INICIALIZACION DE LAS COMPONENTES DEL VECTOR G A CERO
***************************************************************/
for(j=1;j<=N;j++)
{
G[2*j-1]=0.0;
G[2*j]=0.0;
}
121
printf("LAS COMPONENTES DEL VECTOR G YA HAN SIDO INICIALIZADAS A
CERO...\n\n");

kinicial = 1;
/***************************************************************

PASO 4.-

INICIA PROCESO ITERATIVO PARA EL CALCULO DE LA DEFORMACION Y


ESFUERZOS EN LA REGION DE PLASTICIDAD

INICIA PROCESO ITERATIVO PARA INCREMENTAR LA CARGA


HASTA QUE EL ESF. EQUIV. SEA MAYOR AL ESF. DE CEDENCIA

****************************************************************/

for(k=kinicial; k<=kinicial+intervalo; k++)


{
time(&tiniciter);
time(&t3);
printf("INICIA ITERACION %d.....\n\n", k);

/***************************************************************
ABRIENDO LOS ARCHIVOS PARA EL ALMACENAMIENTO DE LA INFORMACION...
****************************************************************/
copia_nombres_archivos();

entero2alfa(k, numero);

abre_archivos();

/*******************************************************

PASO 5.-

Definicion del incremento de la carga aplicada.


fn=fzainic+cargaB*(1-exp(-expA(intervalo,cargaB)*k));

*******************************************************/
if(k>1)
{
fn+=deltafuerza;
for(i=0; i<N; i++)
{
if(fuerza[i].vn!=0)
fuerza[i].vn=fn;
}
}
printf("\nLA CARGA APLICADA EN ESTA ITERACION ES: %6.4lf\n",
fn);

/***************************************************************
DEFINICION DEL VECTOR "T"
****************************************************************/
vectorT(T,fuerza);

/***************************************************************

PASO 6.-
122

DEFINICION DEL VECTOR "G"

****************************************************************/
if(cambio==2)
{

time(&t1);

vectorG(G, elemento);

/***************************************************************
Guardar el vector G
***************************************************************/
fprintf(fpresult,"Componentes normal y tangencial del vector G\n");
fprintf(fpresult,"Elemento Gs Gn\n");
for(j=1;j<=N;j++)
fprintf(fpresult,"%5d %+6.4E %+6.4E\n",j,G[2*j-1],G[2*j]);
fprintf(fpresult,"\n");

time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para la definicion de G fue ==> %6.2f seg.\n\a",tusado);
}

/***************************************************************

PASO 7.-

SOLUCION DEL SISTEMA Ax = b ( En el modelo: A X = T - G )

****************************************************************/
/***************************************************************
DEFINICION DE LA SUMA (DIFERENCIA) DE LOS VECTORES "T" Y "G"
****************************************************************/
SumTG(TG,T,G);

fprintf(fpresult," j Ts Gs TGs Tn
Gn TGn\n");
for(j=1;j<=N;j++)
{
fprintf(fpresult,"%3d %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E\n",
j,T[2*j-1],G[2*j-1],TG[2*j-1],T[2*j],G[2*j],TG[2*j]);
}

/***************************************************************
DEFINICION DE LA MATRIZ "A"
****************************************************************/
time(&t1);
if(k>0)
matrizA(AA);

for(j=1;j<=2*N;j++)
for(i=1;i<=2*N;i++)
A[i][j]=AA[i][j];
time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para la definicion de A fue ==> %6.2f seg.\n\a",tusado);
123
time(&t1);

/***************************************************************
SOLUCION DEL SISTEMA Ax = T - G
****************************************************************/
solsistema(fp,A,X,TG);

time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para la solucion del sistema fue ==> %6.2f
seg.\n\a",tusado);

for(i=1;i<=2*N;i++)
fprintf(fpresult,"\t%+8.6E\n",X[i]);

/*******************************************************

Calculo de los esfuerzos en toda la placa

time(&t1);

esfuerzos(sigma11, sigma12, sigma22, nx, ny, k);

time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para el calculo de esfuerzos fue ==> %6.2f
seg.\n\a",tusado);
*******************************************************/

/*************************************************************
AQUI SE ALMACENA LA INFORMACION PARA PROCESAR LAS GRAFICAS
*************************************************************/
/***************************************************************
ALMACENAMIENTO DE LA INFORMACION GEOMETRICA
****************************************************************/
guardaregs(fp,region,Regiones);

/***************************************************************
ALMACENAMIENTO DEL VECTOR DE CARGAS EXTERNAS, T.
****************************************************************/
guardaT();

/***************************************************************
ALMACENAMIENTO DE LA MALLA GENERAL PARA CALCULAR
ESFUERZOS SOBRE LA PLACA COMPLETA
****************************************************************/
guardamalla();

/***************************************************************
guardamatriz(fp, AA, 2*N, 2*N, "\tMATRIZ A\n");
***************************************************************/
/********************************************************
ALMACENAMIENTO DE LOS ESFUERZOS EN TODA LA PLACA
printf("Almacenando los esfuerzos de todo el dominio...\n");
guardamatriz(fp, sigma11, nx, ny, "\tMATRIZ SIGMA11 ( N/m2 )\n");
guardamatriz(fp, sigma12, nx, ny, "\tMATRIZ SIGMA12 ( N/m2 )\n");
guardamatriz(fp, sigma22, nx, ny, "\tMATRIZ SIGMA22 ( N/m2 )\n");
printf("Los esfuerzos de todo el dominio ya han sido almacenados...\n\n");
********************************************************/
124

/***************************************************************
APLICACION DE LA RUTINA PARA PROBAR LAS FUNCIONES

functest();
***************************************************************/

/**********************************************************

PASO 8.-

CALCULO DE LOS ESFUERZOS EN LA REGION PLASTICA

***********************************************************/
time(&t1);
printf("Se inicia el calculo de los esfuerzos en la region plastica...\n");

for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
switch(intextpl[i][j])
{
case 0:
break;
case 1:
esfp11[i][j]=SG11(xp[i],yp[j]);
esfp12[i][j]=SG12(xp[i],yp[j]);
esfp22[i][j]=SG22(xp[i],yp[j]);
esfp33[i][j]=Nu*(esfp11[i][j]+esfp22[i][j]);
}
}
}

printf("Se termino el calculo de los esfuerzos en la region plastica...\n");


time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para el calculo fue ==> %6.2f min.\n\a",tusado/60);

/*******************************************************

PASO 9.-

CALCULO DEL TENSOR Sij EN CADA NODO DE LA REGION PLASTICA

*******************************************************/
time(&t1);
printf("Se esta calculando las componentes del tensor Sij...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]>0)
{
sumaesfp=1.0/3.0*(esfp11[i][j]+esfp22[i][j]+esfp33[i][j]);
Sp11[i][j]=esfp11[i][j]-sumaesfp;
Sp12[i][j]=esfp12[i][j];
Sp22[i][j]=esfp22[i][j]-sumaesfp;
Sp33[i][j]=esfp33[i][j]-sumaesfp;
125
}
}
}
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("de Sij fue ==> %6.2f seg.\n\a",tusado);

/*******************************************************

PASO 10.-

CALCULO DEL ESFUERZO EQUIVALENTE EN CADA NODO DE LA REGION PLASTICA

*******************************************************/
time(&t1);
printf("Se inicia el calculo del esfuerzo equivalente...\n");

for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]>0)
/***************************************************************
esfeq[i][j]=sqrt( 0.5*(
pow(esfp11[i][j]-esfp22[i][j],2)
+pow(esfp11[i][j]-esfp33[i][j],2)
+pow(esfp22[i][j]-esfp33[i][j],2) )
+3.0*pow(esfp12[i][j],2) );
****************************************************************/
esfeq[i][j]=sqrt(1.5*(pow(Sp11[i][j],2)+2.0*pow(Sp12[i][j],2)
+pow(Sp22[i][j],2)+pow(Sp33[i][j],2)));
}
}

/****************************************************************
IMPRIME EN PANTALLA EL ESFUERZO EQUIVALENTE MAXIMO
******************************************************************/
printf("\n------------------------------------------------------\n\n");
printf("\nESFUERZO EQUIVALENTE MAXIMO: \n");
esfeqmax=0;
for(j=0;j<My;j++)
for(i=0;i<Mx;i++)
if(esfeqmax<esfeq[i][j])
{
esfeqmax=esfeq[i][j];
indicI=i+1;
indicJ=j+1;
}
printf("i = %d j = %d esfeqmax = %+6.4E\n", indicI, indicJ, esfeqmax);
brinco(1);
fprintf(fp,"\nESFUERZO EQUIVALENTE MAXIMO: %+6.4E\n",esfeqmax);
printf("------------------------------------------------------\n\n");

/*******************************************************
DEFINIENDO LOS NODOS EN LA MALLA CON DEFORMACION PLASTICA COMO 2.
*******************************************************/
for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
126
if(intextpl[i][j]>0 && esfeq[i][j]>sigmat[i][j])
intextpl[i][j]=2;
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("del esfuerzo equivalente fue ==> %6.2f seg.\n\a",tusado);

for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
if(intextpl[i][j]==2)
{
cambio=2;
break;
}
brinco(1);
printf("Si existen nodos con deformacion plastica ");
printf("el valor de -cambio- debe ser 2: cambio= %d\n", cambio);

/******************************************************************
FUNCION ITERATIVA PARA LA DEFINICION DE LOS LIMITES DE LA MALLA ADAPTIVA
SE ESTABLECE UNA CONDICION DE TERMINACION DEL PROGRAMA SI SE REBASAN
LOS LIMITES DE LA REGION PLASTICA

selec_limites2();

for(j=0;j<My;j++)
if(lix==0 && intextpl[0][j]==2) intervalo=k-1;
for(j=0;j<My;j++)
if(lsx==Mx-1 && intextpl[Mx-1][j]==2) intervalo=k-1;
for(i=0;i<Mx;i++)
if(liy==0 && intextpl[i][0]==2) intervalo=k-1;
for(i=0;i<Mx;i++)
if(lsy==My-1 && intextpl[i][My-1]==2) intervalo=k-1;

printf("lix= %d lsx= %d liy= %d lsy= %d",


lix, lsx, liy, lsy);
brinco(2);
***************************************************************/

/*******************************************************

PASO 11.-

CALCULO DE LOS INCREMENTOS DE DEFORMACION DE LA REGION PLASTICA


CONSIDERANDO LA DEFORMACION PLASTICA EQUIVALENTE DE LA ITERACION PREVIA

*******************************************************/
while(cambio==2 && epseqmax<epsmax)
{

if(epseqmax>0)
{

k++;
time(&tiniciter);
printf("INICIA ITERACION %d.....\n\n", k);

/***************************************************************
ABRIENDO LOS ARCHIVOS PARA EL ALMACENAMIENTO DE LA INFORMACION...
127
****************************************************************/
copia_nombres_archivos();

entero2alfa(k, numero);

abre_archivos();

/**********************************************************

CALCULO DE LOS ESFUERZOS DE PLASTICIDAD EN LA REGION PLASTICA

***********************************************************/
time(&t1);
printf("Se inicia el calculo de los esfuerzos de plasticidad en la region
plastica...\n");

for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
esfp11[i][j]=SG11(xp[i],yp[j])+SG11pl(xp[i],yp[j]);
esfp12[i][j]=SG12(xp[i],yp[j])+SG12pl(xp[i],yp[j]);
esfp22[i][j]=SG22(xp[i],yp[j])+SG22pl(xp[i],yp[j]);
esfp33[i][j]=Nu*(esfp11[i][j]+esfp22[i][j])-Elmod*eps33[i][j];
}
}

printf("Se termino el calculo de los esfuerzos de plasticidad en la region


plastica...\n");
time(&t2);
tusado=difftime(t2,t1);
printf("\aEl tiempo para el calculo fue ==> %6.2f min.\n\a",tusado/60);

/*******************************************************

CALCULO DEL TENSOR Sij DE PLASTICIDAD EN CADA NODO DE LA REGION PLASTICA

*******************************************************/
time(&t1);
printf("Se esta calculando las componentes del tensor Sij...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]>0)
{
sumaesfp=1.0/3.0*(esfp11[i][j]+esfp22[i][j]+esfp33[i][j]);
Sp11[i][j]=esfp11[i][j]-sumaesfp;
Sp12[i][j]=esfp12[i][j];
Sp22[i][j]=esfp22[i][j]-sumaesfp;
Sp33[i][j]=esfp33[i][j]-sumaesfp;
}
}
}
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("de Sij fue ==> %6.2f seg.\n\a",tusado);
128

/*******************************************************

CALCULO DEL ESFUERZO DE PLASTICIDAD EQUIVALENTE


EN CADA NODO DE LA REGION PLASTICA

*******************************************************/
time(&t1);
printf("Se inicia el calculo del esfuerzo equivalente (de
plasticidad)...\n");

for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]>0)
esfeq[i][j]=sqrt(1.5*(pow(Sp11[i][j],2)+2.0*pow(Sp12[i][j],2)
+pow(Sp22[i][j],2)+pow(Sp33[i][j],2)));
}
}

/****************************************************************
IMPRIME EN PANTALLA EL ESFUERZO DE PLASTICIDAD EQUIVALENTE MAXIMO
******************************************************************/
printf("\n------------------------------------------------------\n\n");
printf("\nESFUERZO DE PLASTICIDAD EQUIVALENTE MAXIMO: \n");
esfeqmax=0;
for(j=0;j<My;j++)
for(i=0;i<Mx;i++)
if(esfeqmax<esfeq[i][j])
{
esfeqmax=esfeq[i][j];
indicI=i+1;
indicJ=j+1;
}
printf("i = %d j = %d esfeqmax = %+6.4E\n", indicI, indicJ, esfeqmax);
brinco(1);
fprintf(fp,"\nESFUERZO DE PLASTICIDAD EQUIVALENTE MAXIMO:
%+6.4E\n",esfeqmax);
printf("------------------------------------------------------\n\n");

/*******************************************************
DEFINIENDO LOS NODOS EN LA MALLA CON DEFORMACION PLASTICA COMO 2.
*******************************************************/
for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
if(intextpl[i][j]>0 && esfeq[i][j]>sigmat[i][j])
intextpl[i][j]=2;
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("del esfuerzo equivalente fue ==> %6.2f seg.\n\a",tusado);

for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
if(intextpl[i][j]==2)
{
cambio=2;
break;
129
}
brinco(1);
printf("Si existen nodos con deformacion plastica ");
printf("el valor de -cambio- debe ser 2: cambio= %d\n", cambio);
}
/******************************************************

TERMINA EL BLOQUE PARA EL CALCULO DEL ESFUERZO DE PLASTICIDAD

INICIA EL CALCULO DE DEFORMACION PLASTICA

*******************************************************/
time(&t1);
printf("Se estan calculando los incrementos de ");
printf("deformacion plastica, delta epsilon...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==2)
{
razonesfp=C1*depsdesf(epseq[i][j])
*(esfeq[i][j]-sigmat[i][j])/esfeq[i][j];
deps11[i][j]=Sp11[i][j]*razonesfp; /*if(fabs(deps11[i][j])<=cero)
deps11[i][j]=0;*/
deps12[i][j]=Sp12[i][j]*razonesfp; /*if(fabs(deps12[i][j])<=cero)
deps12[i][j]=0;*/
deps22[i][j]=Sp22[i][j]*razonesfp; /*if(fabs(deps22[i][j])<=cero)
deps22[i][j]=0;*/
deps33[i][j]=Sp33[i][j]*razonesfp; /*if(fabs(deps33[i][j])<=cero)
deps33[i][j]=0;*/
}
}
}
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("de delta epsilon fue ==> %6.2f seg.\n\a",tusado);

/***************************************************************

PASO 12.-

ACTUALIZANDO LA DEFORMACION PLASTICA

****************************************************************/
time(&t1);
printf("Se esta actualizando la def. plastica...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==2)
{
eps11[i][j]=deps11[i][j];
eps12[i][j]=deps12[i][j];
eps22[i][j]=deps22[i][j];
eps33[i][j]=deps33[i][j];
}
130
/***************************************************************
{
eps11[i][j]=0.5;
if(j<50) eps12[i][j]=0.5;
else if(j==50) eps12[i][j]=0.0;
else eps12[i][j]=-0.5;
eps22[i][j]=0.5;
eps33[i][j]=0.5;
}
***************************************************************/
}
}
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para la actualizacion ");
printf("de la def. plastica fue ==> %6.2f seg.\n\a",tusado);

/*******************************************************
PASO 13.-

CALCULO DE LA DEFORMACION PLASTICA EQUIVALENTE

*******************************************************/
time(&t1);
printf("Se esta calculando la def. plastica equivalente...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==2)
epseq[i][j]=sqrt(2.0/3.0*(pow(eps11[i][j],2)+pow(eps22[i][j],2)
+pow(eps33[i][j],2)+2.0*pow(eps12[i][j],2)));
}
}

/****************************************************************
IMPRIMIENDO EN PANTALLA LA DEFORMACION PLASTICA EQUIVALENTE
******************************************************************/
printf("\nDEFORMACION PLASTICA EQUIVALENTE MAXIMA\n");
epseqmax=0;
for(j=0;j<My;j++)
for(i=0;i<Mx;i++)
if(intextpl[i][j]==2)
{
if(epseqmax<epseq[i][j])
{
epseqmax=epseq[i][j];
indicI=i+1;
indicJ=j+1;
}
}
printf("i = %d j = %d epseqmax = %+6.4E ",indicI, indicJ, epseqmax);
brinco(1);
fprintf(fp,"\nDEFORMACION PLASTICA EQUIVALENTE MAXIMA: %+6.4E\n",epseqmax);
printf("\n------------------------------------------------------\n\n");

brinco(1);

time(&t2);
131
tusado=difftime(t2,t1);
printf("El tiempo para el calculo ");
printf("de la deformacion plastica equivalente fue ==> %6.2f
seg.\n\a",tusado);

/*******************************************************
IMPRIME EN PANTALLA LA REPRESENTACION DE LA DEFORMACION PLASTICA
********************************************************/
printf("\n------------------------------------------------------\n\n");
printf("\nDEFORMACION PLASTICA\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
{
if(intextpl[i][j]==1)
printf("-");
else if(intextpl[i][j]==2)
printf("#");
else
printf(" ");
}
printf("\n");
}

brinco(2);
/*******************************************************

PASO 14.-

REDEFINICION DE LOS NODOS DONDE HAY DEFORMACION PLASTICA

*******************************************************/
time(&t1);
printf("Se esta definiendo el nuevo esfuerzo Sigma_t "
"en los puntos donde hay deformacion plastica...\n");
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==2)
sigmat[i][j]=esfeq[i][j];
}
}
time(&t2);
tusado=difftime(t2,t1);
printf("El tiempo para la redefinicion del nuevo ");
printf("esfuerzo Sigma_t fue ==> %6.2f seg.\n\a",tusado);

/*******************************************************
FUNCION PARA ALMACENAR LOS RESULTADOS
*******************************************************/
guarda_resultados();

/*******************************************************
DETERMINA EL TIEMPO FINAL DEL PROGRAMA
*******************************************************/
time(&tfinal);
time(&tfiniter);
132
/*******************************************************
CALCULA E IMPRIME EL TIEMPO UTILIZADO EN MINUTOS
*******************************************************/
tusado=difftime(tfinal,tinicio)/60;
titer=difftime(tfiniter,tiniciter)/60;
printf("El tiempo requerido durante la iteracion %3d fue ==> %6.2f
min.\n\n",k,titer);
printf("El tiempo requerido hasta la iteracion %3d fue ==> %6.2f
min.\n",k,tusado);
fprintf(fp,"El tiempo requerido durante la iteracion %3d fue ==> %6.2f
min.\n\n",k,titer);
fprintf(fp,"El tiempo requerido hasta la iteracion %3d fue ==> %6.2f
min.\n",k,tusado);

/*******************************************************
CIERRA LOS ARCHIVOS PARA EL ALMACENAMIENTO DE DATOS
*******************************************************/
close(fp); close(fpesfpl); close(fpepspl); close(fpmallapl);
close(fpresult);
close(fps11); close(fps12); close(fps22);
close(fps11pl); close(fps12pl); close(fps22pl); close(fps33pl);
close(fpe11pl); close(fpe12pl); close(fpe22pl); close(fpe33pl);
close(fpde11pl); close(fpde12pl); close(fpde22pl); close(fpde33pl);
close(fpSp11); close(fpSp12); close(fpSp22); close(fpSp33);

strcpy(archivo,archivobak);

/*******************************************************
CALCULA E IMPRIME LA FECHA Y LA HORA ACTUAL
*******************************************************/
time(&ahora);
tahora=localtime(&ahora);
printf("El tiempo actual es: %s\n\n", asctime(tahora));
fprintf(fp,"El tiempo actual es: %s\n\n", asctime(tahora));
brinco(2);

if(epseqmax > epsmax) exit(0);

/*******************************************************
FUNCION PARA ALMACENAR LOS RESULTADOS
*******************************************************/
guarda_resultados();

/*******************************************************
DETERMINA EL TIEMPO FINAL DEL PROGRAMA
*******************************************************/
time(&tfinal);
time(&tfiniter);

/*******************************************************
CALCULA E IMPRIME EL TIEMPO UTILIZADO EN MINUTOS
*******************************************************/
tusado=difftime(tfinal,tinicio)/60;
titer=difftime(tfiniter,tiniciter)/60;
printf("El tiempo requerido durante la iteracion %3d fue ==> %6.2f
min.\n\n",k,titer);
133
printf("El tiempo requerido hasta la iteracion %3d fue ==> %6.2f
min.\n",k,tusado);
fprintf(fp,"El tiempo requerido durante la iteracion %3d fue ==> %6.2f
min.\n\n",k,titer);
fprintf(fp,"El tiempo requerido hasta la iteracion %3d fue ==> %6.2f
min.\n",k,tusado);

/*******************************************************
CIERRA LOS ARCHIVOS PARA EL ALMACENAMIENTO DE DATOS
*******************************************************/
close(fp); close(fpesfpl); close(fpepspl); close(fpmallapl); close(fpresult);
close(fps11); close(fps12); close(fps22);
close(fps11pl); close(fps12pl); close(fps22pl); close(fps33pl);
close(fpe11pl); close(fpe12pl); close(fpe22pl); close(fpe33pl);
close(fpde11pl); close(fpde12pl); close(fpde22pl); close(fpde33pl);
close(fpSp11); close(fpSp12); close(fpSp22); close(fpSp33);

strcpy(archivo,archivobak);

/*******************************************************
CALCULA E IMPRIME LA FECHA Y LA HORA ACTUAL
*******************************************************/
time(&ahora);
tahora=localtime(&ahora);
printf("El tiempo actual es: %s\n\n", asctime(tahora));
fprintf(fp,"El tiempo actual es: %s\n\n", asctime(tahora));
brinco(2);

/*********************************************************
if(lix==0 || lsx == Mx-1 || liy == 0 || lsy == My-1) break;
************************************************************/
}
/***********************************************************

TERMINA PROCESO ITERATIVO

***********************************************************/

/*******************************************************
LIBERACION DE MEMORIA
*******************************************************/
free(region);
free(elemento);
free(fuerza);

free_dmatrix(fJ11,1,Nz,1,Ne);
free_dmatrix(fJ12,1,Nz,1,Ne);
free_dmatrix(fJ21,1,Nz,1,Ne);
free_dmatrix(fJ22,1,Nz,1,Ne);
free_dmatrix(dxyJ11,1,Nz,1,Ne);
free_dmatrix(dxyJ12,1,Nz,1,Ne);
free_dmatrix(dxyJ21,1,Nz,1,Ne);
free_dmatrix(dxyJ22,1,Nz,1,Ne);
free_dvector(fxy,1,4);
free_dvector(dfx,1,4);
free_dvector(dfy,1,4);
free_dvector(dfxy,1,4);

free_dmatrix(sigma11,1,nx,1,ny);
134
free_dmatrix(sigma12,1,nx,1,ny);
free_dmatrix(sigma22,1,nx,1,ny);
/***************************************************************
free_dmatrix(sigma33,1,nx,1,ny);
***************************************************************/
/*******************************************************
DETERMINA EL TIEMPO FINAL DEL PROGRAMA
*******************************************************/
time(&tfinal);

/*******************************************************
CALCULA E IMPRIME EL TIEMPO UTILIZADO EN MINUTOS
*******************************************************/
tusado=difftime(tfinal,tinicio)/60;
printf("\n\nEl tiempo total requerido fue ==> %6.2f min.\n\n",tusado);
fprintf(fp,"\n\nEl tiempo total requerido fue ==> %6.2f min.\n\n",tusado);
}
135
ude "mandat13a.h"
#include "func14a.h"
#include "bpmgeoma.h"

/**************************************************************************
ARCHIVO QUE CONTIENE LAS FUNCIONES RELACIONADAS CON
LA GEOMETRIA DEL MODELO Y LAS PROPIEDADES DEL MATERIAL
**************************************************************************/

/**************************************************************************
Definicion de constantes generales y propiedades del material
**************************************************************************/
extern int cond, M0c;
extern double cero, D, KAPPA0, Elmod, MU0, Nu, epsmax, C1;
extern double B1, R0, RINF;
extern char falso[72];

/*************************************************************************/

extern int i, j, nx, ny, Mx, My;


extern int Regiones, Regext, Regint, Grietas, N;
extern double **A, **u, *X, *T, *as, *an, *bs, *bn;
extern double **sigma11, **sigma12, **sigma22, **sigma33, *NX, *NY, sigmay;
extern double *zeta, *eta;
extern double **fJ11, **fJ12, **fJ21, **fJ22;
extern double **dxyJ11, **dxyJ12, **dxyJ21, **dxyJ22;
extern double *fxy, *dfx, *dfy, *dfxy, *delx, *dely;

extern double xmin, xmax, ymin, ymax, deltax, deltay;

extern DREGION *region;

extern DELEMENTO *elemento;

extern DVECTOR2D *fuerza;

extern FILE *fp;

extern time_t tinicio,tfinal, t1, t2;


extern float tusado;

/*********************************************************************
VENTANA DE PRESENTACION
*********************************************************************/
void inicio(void)
{
printf("*****************************************************************\n");
printf("\n");
printf(" Programa para el calculo del campo de esfuerzos en un cuerpo
plano\n");
printf("\n");
printf(" Nombre del programa: PLASTICIDAD Version: 2.1.a\n");
printf(" Creado por: M. I. Victor M. Romero M. y Dr. Serguei
Kanaoun\n");
printf(" Fecha de inicio: 30 de marzo de 1998\n");
printf(" Ultima revision: 24 de agosto de 2007\n");
printf("\n");
printf("*******************************************************************\n"
);
136
return;
}

/*********************************************************************
LECTURA DE ARCHIVO DE DATOS GENERALES Y PROPIEDADES DE MATERIAL
*********************************************************************/
void lee_propiedades(char archivo[72])
{
FILE *fp;

if((fp=fopen(archivo,"r"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n\n",archivo);
exit(0);
}
else
printf("El archivo %s se abrio satisfactoriamente.\n\n", archivo);

fscanf(fp, "%d %s", &Mx, falso);


printf("%s\t%d\n", falso, Mx);

fscanf(fp, "%d %s", &My, falso);


printf("%s\t%d\n", falso, My);

fscanf(fp, "%d %s", &cond, falso);


printf("%s\t%d\n", falso, cond);

fscanf(fp, "%d %s", &M0c, falso);


printf("%s\t%d\n", falso, M0c);

fscanf(fp, "%lf %s", &cero, falso);


printf("%s\t%g\n", falso, cero);

fscanf(fp, "%lf %s", &D, falso);


printf("%s\t%lf\n", falso, D);

fscanf(fp, "%lf %s", &Elmod, falso);


printf("%s\t%lf\n", falso, Elmod);

fscanf(fp, "%lf %s", &Nu, falso);


printf("%s\t%lf\n", falso, Nu);

fscanf(fp, "%lf %s", &R0, falso);


printf("%s\t%lf\n", falso, R0);

fscanf(fp, "%lf %s", &RINF, falso);


printf("%s\t%lf\n", falso, RINF);

fscanf(fp, "%lf %s", &B1, falso);


printf("%s\t%lf\n", falso, B1);

fscanf(fp, "%lf %s", &epsmax, falso);


printf("%s\t%lf\n", falso, epsmax);

fscanf(fp, "%lf %s", &C1, falso);


printf("%s\t%lf\n", falso, C1);

KAPPA0=1.0/(2*(1-Nu));
printf("KAPPA0\t%lf\n", KAPPA0);
137

MU0=Elmod/(2*(1+Nu));
printf("MU0\t%lf\n", MU0);

close(fp);
}

/*********************************************************************
LECTURA DE ARCHIVOS PARA INTERPOLACION
*********************************************************************/
void archinteg(char archivo[14],double **variable,int N,int M,char dato[14])
{
FILE *fp;
int i,j;
if((fp=fopen(archivo,"r"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n\n",archivo);
exit(0);
}
for(i=1;i<=N;i++)
{
for(j=1;j<=M;j++)
{
fscanf(fp,"%lf",&variable[i][j]);
}
}
close(fp);
}

/*********************************************************************
DEFINICION DE GRIETAS
*********************************************************************/
void grieta(DREGION *region, int Regiones, int i)
{
printf("X inicial= "); scanf("%lf",&region[i].xinic);
printf("Y inicial= "); scanf("%lf",&region[i].yinic);
printf("X final= "); scanf("%lf",&region[i].xfin);
printf("Y final= "); scanf("%lf",&region[i].yfin);
printf("Num de puntos frontera en la grieta %3d = ",i+1);
scanf("%d",&region[i].numpf);
region[i].xcent=(region[i].xinic+region[i].xfin)/2.0;
region[i].ycent=(region[i].yinic+region[i].yfin)/2.0;
region[i].arco=0;
region[i].beta=0.0;
if(fabs(region[i].beta)<=cero) region[i].beta=0;
region[i].h=sqrt(pow(region[i].xfin-region[i].xinic,2)+
pow(region[i].yfin-region[i].yinic,2))/region[i].numpf;
return;
}

/*********************************************************************
DEFINICION DE FRONTERAS RECTAS
*********************************************************************/
void linea_frontera(DREGION *region, int Regiones, int i)
{
printf("X inicial= "); scanf("%lf",&region[i].xinic);
printf("Y inicial= "); scanf("%lf",&region[i].yinic);
printf("X final= "); scanf("%lf",&region[i].xfin);
printf("Y final= "); scanf("%lf",&region[i].yfin);
138
printf("Num de puntos frontera en la region %3d = ",i+1);
scanf("%d",&region[i].numpf);
region[i].xcent=0; region[i].ycent=0; region[i].arco=0;
region[i].beta=angulo(region[i].xinic,region[i].yinic,
region[i].xfin,region[i].yfin);
if(fabs(region[i].beta)<=cero) region[i].beta=0;
region[i].h=sqrt(pow(region[i].xfin-region[i].xinic,2)+
pow(region[i].yfin-region[i].yinic,2))/region[i].numpf;
return;
}

/*********************************************************************
DEFINICION DE FRONTERAS EN FORMA DE ARCO
*********************************************************************/
void arco_frontera(DREGION *region, int Regiones, int i)
{
float xc,yc,radio;
printf("X inicial= "); scanf("%lf",&region[i].xinic);
printf("Y inicial= "); scanf("%lf",&region[i].yinic);
printf("X del centro del arco= "); scanf("%lf",&region[i].xcent);
printf("Y del centro del arco= "); scanf("%lf",&region[i].ycent);
printf("Angulo del arco (Grados)= ");
scanf("%lf",&region[i].arco);
printf("Num de puntos frontera en la region %3d = ",i+1);
scanf("%d",&region[i].numpf);
xc=region[i].xinic-region[i].xcent;
yc=region[i].yinic-region[i].ycent;
region[i].xfin=(xc*cos(region[i].arco*GAR)-
yc*sin(region[i].arco*GAR))+region[i].xcent;
region[i].yfin=(xc*sin(region[i].arco*GAR)+
yc*cos(region[i].arco*GAR))+region[i].ycent;
region[i].beta=0;
if(fabs(region[i].xfin)<=cero) region[i].xfin=0;
if(fabs(region[i].yfin)<=cero) region[i].yfin=0;
radio=sqrt(pow(region[i].xinic-region[i].xcent,2)+
pow(region[i].yinic-region[i].ycent,2));
region[i].h=fabs(region[i].arco*GAR*radio/region[i].numpf);
return;
}

/*********************************************************************
FUNCION PARA IMPRIMIR LAS REGIONES EN PANTALLA
*********************************************************************/
void imprime_regiones(void)
{
printf("Region Front Tipof Xinic Yinic Xfin Yfin
Xcen Ycen Arco Beta Numpf\n");
for(i=0;i<Regiones;i++)
{
printf("%5d %c %c %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E
%3d\n",
i+1,region[i].frontera,region[i].tipofron,
region[i].xinic,region[i].yinic,region[i].xfin,region[i].yfin,
region[i].xcent,region[i].ycent,region[i].arco,region[i].beta,
region[i].numpf);
}
brinco(2);
}
139
/*********************************************************************
DEFINICION DE LAS REGIONES
*********************************************************************/
void regiones(DREGION *region, int Regiones)
{
int i, j;
for(i=0;i<Regiones;i++)
{
printf("Region %3d [(G)rieta, (E)xterior, (I)nterior]: ",i+1);
scanf("%s",&region[i].frontera);
region[i].frontera=toupper(region[i].frontera);
printf("Tipo de curva de la Region %3d [(G)rieta, (L)inea, (A)rco]:
",i+1);
scanf("%s",&region[i].tipofron);
switch(region[i].tipofron)
{
case ('g'): region[i].tipofron='G';
case ('G'): grieta(region, Regiones, i);
break;
case ('l'): region[i].tipofron='L';
case ('L'): linea_frontera(region, Regiones, i);
break;
case ('a'): region[i].tipofron='A';
case ('A'): arco_frontera(region, Regiones, i);
break;
}
}
imprime_regiones();
}

/*********************************************************************
MODIFICACION DE LAS REGIONES
*********************************************************************/
void modregs(DREGION *region, int Regiones)
{
int i,j;
printf("Si desea modificar alguna region teclee el numero de la Region,\n");
printf("o teclee \"0 (cero)\" para salir: ");
scanf("%d",&j);
while(j!=0)
{
i=j-1;
printf("Region %3d [(G)rieta, (E)xterior, (I)nterior]: ",j);
scanf("%s",&region[i].frontera);
region[i].frontera=toupper(region[i].frontera);
printf("Tipo de curva de la Region %3d [(G)rieta, (L)inea, (A)rco]: ",j);
scanf("%s",&region[i].tipofron);
switch(region[i].tipofron)
{
case ('g'): region[i].tipofron='G';
case ('G'): grieta(region, Regiones, i);
break;
case ('l'): region[i].tipofron='L';
case ('L'): linea_frontera(region, Regiones, i);
break;
case ('a'): region[i].tipofron='A';
case ('A'): arco_frontera(region, Regiones, i);
break;
}
140
imprime_regiones();
printf("Si desea modificar alguna region teclee el numero de la
Region,\n");
printf("o teclee \"0 (cero)\" para salir: ");
scanf("%d",&j);
}
}

/*********************************************************************
PROPIEDADES DE LOS PUNTOS DE FRONTERA
*********************************************************************/
void puntos_de_frontera(DREGION *region, int Regiones,
DELEMENTO *elemento)
{
/* Definicion de las coordenadas de los puntos de frontera */
int i,j,k,m;
double deltax,deltay, deltaarco,xc,yc,xtemp,ytemp,radio;
for(k=0;k<Regiones;k++)
{
switch(region[k].tipofron)
{
case ('G'): deltaarco=M_PI/(region[k].numpf+1);
xc=(region[k].xinic+region[k].xfin)/2.0;
yc=(region[k].yinic+region[k].yfin)/2.0;
for(i=0;i<region[k].numpf;i++)
{
elemento[i].frontera='G';
radio=1/sqrt(pow(cos((i+1)*deltaarco),2)/(l()*l()) +
pow(sin((i+1)*deltaarco),2)/pow(SemiB*l(),2));
elemento[i].xpuntof=xc+radio*cos((i+1)*deltaarco);
elemento[i].ypuntof=yc;
elemento[i].beta=region[k].beta;
elemento[i].h=region[k].h;
elemento[i].p=elemento[i].h/sqrt(D);
if(fabs(elemento[i].xpuntof)<=cero) elemento[i].xpuntof=0.0;
if(fabs(elemento[i].ypuntof)<=cero) elemento[i].ypuntof=0.0;
}
break;
case ('L'): deltax=(region[k].xfin-region[k].xinic)/region[k].numpf;
deltay=(region[k].yfin-region[k].yinic)/region[k].numpf;
j=0;
for(m=0;m<k;m++) j+=region[m].numpf;
elemento[j].frontera='L';
elemento[j].xpuntof=region[k].xinic+deltax/2.0;
elemento[j].ypuntof=region[k].yinic+deltay/2.0;
elemento[j].beta=region[k].beta;
elemento[j].h=region[k].h;
elemento[j].p=elemento[j].h/sqrt(D);
for(i=j+1;i<j+region[k].numpf;i++)
{
elemento[i].frontera='L';
elemento[i].xpuntof=elemento[i-1].xpuntof+deltax;
elemento[i].ypuntof=elemento[i-1].ypuntof+deltay;
elemento[i].beta=region[k].beta;
elemento[i].h=region[k].h;
elemento[i].p=elemento[i].h/sqrt(D);
if(fabs(elemento[i].xpuntof)<=cero) elemento[i].xpuntof=0.0;
if(fabs(elemento[i].ypuntof)<=cero) elemento[i].ypuntof=0.0;
}
141
break;
case ('A'): deltaarco=region[k].arco*GAR/region[k].numpf;
xc=region[k].xinic-region[k].xcent;
yc=region[k].yinic-region[k].ycent;
xtemp=xc*cos(deltaarco/2.0)-yc*sin(deltaarco/2.0);
ytemp=xc*sin(deltaarco/2.0)+yc*cos(deltaarco/2.0);
j=0;
for(m=0;m<k;m++) j+=region[m].numpf;
elemento[j].frontera='A';
elemento[j].xpuntof=region[k].xcent+xtemp;
elemento[j].ypuntof=region[k].ycent+ytemp;
elemento[j].beta=atan2(-xtemp,ytemp);
if(region[k].frontera=='I')
if(xtemp>=0)
elemento[j].beta=M_PI+atan2(-xtemp,ytemp);
else
elemento[j].beta=atan2(-xtemp,ytemp)-M_PI;
elemento[j].h=region[k].h;
elemento[j].p=elemento[j].h/sqrt(D);
for(i=j+1;i<j+region[k].numpf;i++)
{
xtemp=xc*cos(deltaarco*(i-j+0.5))-yc*sin(deltaarco*(i-
j+0.5));
ytemp=xc*sin(deltaarco*(i-j+0.5))+yc*cos(deltaarco*(i-
j+0.5));
elemento[i].frontera='A';
elemento[i].xpuntof=region[k].xcent+xtemp;
elemento[i].ypuntof=region[k].ycent+ytemp;
elemento[i].beta=atan2(-xtemp,ytemp);
if(region[k].frontera=='I')
if(xtemp>=0)
elemento[i].beta=M_PI+atan2(-xtemp,ytemp);
else
elemento[i].beta=atan2(-xtemp,ytemp)-M_PI;
elemento[i].h=region[k].h;
elemento[i].p=elemento[i].h/sqrt(D);
if(fabs(elemento[i].xpuntof)<=cero) elemento[i].xpuntof=0.0;
if(fabs(elemento[i].ypuntof)<=cero) elemento[i].ypuntof=0.0;
}
break;
}
}
}

/*********************************************************************
ALMACENAMIENTO DE LAS REGIONES, PUNTOS DE FRONTERA
*********************************************************************/
void guardaregs(FILE *fp, DREGION *region, int Regiones)
{
int i;
/**********************************************************************
Definicion del numero total de regiones y de puntos de frontera del modelo
printf("Total de Regiones (grietas, externas e internas) del modelo.\n");
printf("%3d Regiones\n\n",Regiones);
printf("Total de Puntos de frontera del modelo.\n");
printf("%3d Puntos de frontera\n",N);
**********************************************************************/
fprintf(fp,"Total de Regiones (grietas, externas e internas) del
modelo.\n");
142
fprintf(fp,"%3d Regiones\n\n",Regiones);
fprintf(fp,"Total de Puntos de frontera del modelo.\n");
fprintf(fp,"%3d Puntos de frontera\n\n",N);
/* Guarda los datos en el archivo */
fprintf(fp,"Region Front Tipof Xinic Yinic Xfin
Yfin Xcen Ycen Arco Beta(Rad) Numpf\n");
for(i=0;i<Regiones;i++)
{
fprintf(fp,"%4d %c %c %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E
%+6.4E %+6.4E %3d\n",
i+1,region[i].frontera,region[i].tipofron,
region[i].xinic,region[i].yinic,region[i].xfin,region[i].yfin,
region[i].xcent,region[i].ycent,region[i].arco,region[i].beta,
region[i].numpf);
}
fprintf(fp,"\n");
fprintf(fp,"Elem Front Xpuntof Ypuntof Beta(Rad) h
p\n");
for(i=0;i<N;i++)
{
fprintf(fp,"%3d %c %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E\n",
i+1,elemento[i].frontera,elemento[i].xpuntof,
elemento[i].ypuntof,elemento[i].beta,elemento[i].h,elemento[i].p);
}
fprintf(fp,"\n");

return;
}

/*********************************************************************
ALMACENAMIENTO DEL VECTOR DE CARGAS EXTERNAS
**********************************************************************/
void guardaT(void)
{
printf("SE ESTA ALMACENANDO EL VECTOR DE CARGAS EXTERNAS, T...\n");
fprintf(fp,"Componentes normal y tangencial de las fuerzas aplicadas al
modelo\n");
fprintf(fp,"Elemento Fs Fn\n");
for(j=1;j<=N;j++)
fprintf(fp,"%5d %+6.4E %+6.4E\n", j, T[2*j-1], T[2*j]);
fprintf(fp,"\n");
printf("EL VECTOR DE CARGAS EXTERNAS, T, YA HA SIDO ALMACENADO...\n");

/*********************************************************************
ALMACENAMIENTO DE LA MALLA GENERAL PARA CALCULAR
ESFUERZOS SOBRE LA PLACA COMPLETA
**********************************************************************/
void guardamalla (void)
{
fprintf(fp,"Cantidad de nodos en las direcciones X y Y,
respectivamente.\n");
fprintf(fp,"%3d Nodos en la direccion X\n",nx);
fprintf(fp,"%3d Nodos en la direccion Y\n\n",ny);

fprintf(fp,"Coordenadas de los nodos en la direccion X.\n");


fprintf(fp,"Nodo Coordenada\n");
for(i=1;i<=nx;i++) fprintf(fp,"%3d %+6.4E\n",i,NX[i]);
143
fprintf(fp,"\n");
fprintf(fp,"Coordenadas de los nodos en la direccion Y.\n");
fprintf(fp,"Nodo Coordenada\n");
for(i=1;i<=ny;i++) fprintf(fp,"%3d %+6.4E\n",i,NY[i]);
fprintf(fp,"\n");
}
/**********************************************************************
FUNCION PARA LA DISCRETIZACION DEL DOMINIO
**********************************************************************/
void discret_dominio(void)
{
printf("Discretizacion del dominio para el calculo de los esfuerzos.\n\n");
printf("Definir el numero de nodos en la direccion X.\n");
printf("Incluir nodos extremos: "); scanf("%d",&nx);
printf("Definir el numero de nodos en la direccion Y.\n");
printf("Incluir nodos extremos: "); scanf("%d",&ny);

NX=dvector(1,nx);
NY=dvector(1,ny);

xmin=region[0].xinic; xmax=region[0].xfin;
ymin=region[0].yinic; ymax=region[0].yfin;

for(i=1;i<Regiones;i++)
{
if(xmin>region[i].xinic) xmin=region[i].xinic;
if(xmax<region[i].xfin) xmax=region[i].xfin;
if(ymin>region[i].yinic) ymin=region[i].yinic;
if(ymax<region[i].yfin) ymax=region[i].yfin;
}
for(i=0;i<N;i++)
{
if(xmin>elemento[i].xpuntof) xmin=elemento[i].xpuntof;
if(xmax<elemento[i].xpuntof) xmax=elemento[i].xpuntof;
if(ymin>elemento[i].ypuntof) ymin=elemento[i].ypuntof;
if(ymax<elemento[i].ypuntof) ymax=elemento[i].ypuntof;
}

printf("Los limites para el calculo de los esfuerzos son:\n");


printf("\txmin= %8.6lf\txmax= %8.6lf\tymin= %8.6lf\tymax= %8.6lf\n",
xmin, xmax, ymin, ymax);
deltax=(xmax-xmin)/(nx-1);
deltay=(ymax-ymin)/(ny-1);
NX[1]=xmin; NY[1]=ymin;
for(i=2;i<=nx;i++)
{
NX[i]=NX[i-1]+deltax;
if(fabs(NX[i])<=cero) NX[i]=0;
}
for(i=2;i<=ny;i++)
{
NY[i]=NY[i-1]+deltay;
if(fabs(NY[i])<=cero) NY[i]=0;
}
}
144
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "nr.h"
#include "nrutil.h"

#include "func14a.h"
#include "funplast21a.h"
#include "mandat13a.h"
#include "bpmcalcpla.h"

/**************************************************************************
ARCHIVO QUE CONTIENE LAS FUNCIONES PARA
DEFINIR LAS FUERZAS APLICADAS AL MODELO,
EL CALCULO DE LA MATRIZ DE COEFICIENTES DEL SISTEMA DE ECS.,
DEFINIR EL VECTOR DE PLASTICIDAD, G,
CALCULAR LOS ESFUERZOS ELASTICOS Y PLASTICOS.
**************************************************************************/

/**************************************************************************
Definicion de constantes generales y propiedades del material
**************************************************************************/
extern int cond, M0c, **intextgen;
extern double cero, D, KAPPA0, Elmod, MU0, Nu, pb;
extern char falso[72];

/*************************************************************************/

extern int i, j, nx, ny, *indx;


extern int Regiones, Regext, Regint, Grietas, N;
extern double **A, **u, *X, *T, *as, *an, *bs, *bn, ddd;
extern double **sigma11, **sigma12, **sigma22, **sigma33, *NX, *NY, sigmay;
extern double *zeta, *eta;
extern double **fJ11, **fJ12, **fJ21, **fJ22;
extern double **dxyJ11, **dxyJ12, **dxyJ21, **dxyJ22;
extern double *fxy, *dfx, *dfy, *dfxy, *delx, *dely;

extern DREGION *region;

extern DELEMENTO *elemento;

extern DVECTOR2D *fuerza;

extern FILE *fp;

extern time_t tinicio,tfinal, t1, t2;


extern float tusado;

/*********************************************************************
DEFINICION DE LAS CARGAS EXTERNAS AL MODELO
*********************************************************************/
void fuerzas(DVECTOR2D *fuerza, double deltafuerza)
{
int i,seleccion;
int liminf,limsup;
extern double fs,fn;
145

printf("\nEn principio, todos los vectores fuerza son inicializados\n");


printf("con componentes iguales a cero.\n");
for(i=0;i<N;i++)
{
fuerza[i].vs=0.0;
fuerza[i].vn=0.0;
}

/* Introduccion de las componentes de la fuerza en cada elemento */


seleccion=1;
while(seleccion==1)
{
printf("\nDefinicion de la carga inicial aplicada en la fontera de la
placa.\n\n");
printf("Elemento inicial: "); scanf("%d",&liminf);
printf("Elemento final: "); scanf("%d",&limsup);
brinco(1);
printf("Valor de la Fuerza tangencial a la frontera, Fs, (Newtons): ");
/*
scanf("%lf",&fs);
*/
fs=0.0;
brinco(1);
printf("Valor de la Fuerza normal a la frontera, Fn, (+ hacia afuera)
(Newtons): ");
/*
scanf("%lf",&fn);
*/
fn=deltafuerza;
brinco(1);
for(i=liminf-1; i<=limsup-1; i++)
{
fuerza[i].vs=fs;
fuerza[i].vn=fn;
/*
printf("elemento[%3d]: Fs= %+6.4E; Fn=
%+6.4E\n",i+1,fuerza[i].vs,fuerza[i].vn);
*/
}
printf("Para introducir mas valores de fuerza teclee \"1\",");
printf("Para terminar, teclee \"0\".\n\n");
scanf("%d",&seleccion);
}
}

/*********************************************************************
DEFINICION DE LA MATRIZ "A"
*********************************************************************/
void matrizA(double **A)
{
int i, j, k;
printf("DEFINIENDO LA MATRIZ A...\n");
for(i=1;i<=2*N;i++)
{
for(j=1;j<=2*N;j++)
{

if(region[0].frontera=='G')
146
{
if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)>0 && j<=2*region[0].numpf)
A[i][j]=ACss((i+1)/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)<=0 &&
j<=2*region[0].numpf)
A[i][j]=ACsn((i+1)/2,j/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)>0 &&
j<=2*region[0].numpf)
A[i][j]=ACns(i/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)<=0 &&
j<=2*region[0].numpf)
A[i][j]=ACnn(i/2,j/2);
else
if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)>0 && j>2*region[0].numpf)
A[i][j]=Ass((i+1)/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)<=0 && j>2*region[0].numpf)
A[i][j]=Asn((i+1)/2,j/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)>0 && j>2*region[0].numpf)
A[i][j]=Ans(i/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)<=0 &&
j>2*region[0].numpf)
A[i][j]=Ann(i/2,j/2);
/*
if(fabs(A[i][j])<=cero) A[i][j]=0.0;
*/
}
else
{

if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)>0)


A[i][j]=Ass((i+1)/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)>0 && j/2.0-floor(j/2.0)<=0)
A[i][j]=Asn((i+1)/2,j/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)>0)
A[i][j]=Ans(i/2,(j+1)/2);
else
if(i/2.0-floor(i/2.0)<=0 && j/2.0-floor(j/2.0)<=0)
A[i][j]=Ann(i/2,j/2);
/*
if(fabs(A[i][j])<=cero) A[i][j]=0.0;
*/
}

}
}

printf("LA MATRIZ A YA HA SIDO DEFINIDA...\n");


}

/*********************************************************************
VECTOR DE FUERZAS "T"
147
*********************************************************************/
void vectorT(double *T, DVECTOR2D *fuerza)
{
int j;
/* Definicion del vector constante T */
printf("DEFINIENDO EL VECTOR DE CARGAS EXTERNAS \"T\"...\n");
for(j=1;j<=N;j++)
{
T[2*j-1]=fuerza[j-1].vs;
T[2*j]=fuerza[j-1].vn;
}
printf("EL VECTOR DE CARGAS EXTERNAS \"T\" YA HA SIDO DEFINIDO...\n");
}

/*********************************************************************
VECTOR DE PLASTICIDAD "G"
*********************************************************************/
void vectorG(double *G, DELEMENTO *elemento)
{
int j;
double x, y, beta;
printf("DEFINIENDO EL VECTOR \"G\"...\n");
for(j=1;j<=N;j++)
{
x=elemento[j-1].xpuntof;
y=elemento[j-1].ypuntof;
beta=elemento[j-1].beta;

G[2*j-1]=Gs(x,y,beta);
G[2*j]=Gn(x,y,beta);
/*
G[2*j-1]=SG12pl(x,y)*cos(2.0*beta)-
(SG11pl(x,y)-SG22pl(x,y))*0.5*sin(2.0*beta);

G[2*j]=SG11pl(x,y)*pow(sin(beta),2)-
SG12pl(x,y)*sin(2.0*beta)+
SG22pl(x,y)*pow(cos(beta),2);
printf("Nodo = %3d G[%3d] = %+6.4e G[%3d] = %+6.4e\n",j,2*j-1,G[2*j-
1],2*j,G[2*j]);
*/
}
printf("EL VECTOR \"G\" YA HA SIDO DEFINIDO...\n");
}

/*********************************************************************
SUMA DE LOS VECTORES "T' Y "G"
*********************************************************************/
void SumTG(double *TG, double *T, double *G)
{
int j;
printf("DEFINIENDO LA SUMA DE LOS VECTORES \"T\" Y \"G\"...\n");
for(j=1;j<=N;j++)
{
TG[2*j-1] = T[2*j-1] - G[2*j-1];
TG[2*j] = T[2*j] - G[2*j];
/*
printf("Nodo=%3d TG[%3d]=%+6.4e TG[%3d]=%+6.4e\n",j,2*j-1,TG[2*j-
1],2*j,TG[2*j]);
*/
148
}
printf("LA SUMA DE LOS VECTORES \"T\" Y \"G\" YA HA SIDO DEFINIDA...\n");
}

/*********************************************************************
SOLUCION DEL SISTEMA DE ECUACIONES
*********************************************************************/
void solsistema(FILE *fp, double **A, double *X, double *T)
{
int j, d;
double **v, *w;
v=dmatrix(1,2*N,1,2*N);
w=dvector(1,2*N);
/* SOLUCION DEL SISTEMA A x = T */
printf("EFECTUANDO LA SOLUCION DEL SISTEMA A x = T - G...\n");
/******************************************************************
Funcion para la descomposicion en valor singular de A
dsvdcmp(A,2*N,2*N,w,v);
printf("Iniciando la solucion del sistema A X = T - G...\n");
dsvbksb(A,w,v,2*N,2*N,T,X);
printf("Se termino de realizar la solucion del sistema A X = T - G...\n");
******************************************************************/
/******************************************************************
Funcion para la descomposicion A = L U
******************************************************************/
printf("Iniciando la descomposicion A = L U...\n");
dludcmp(A, 2*N, w, &d);
printf("Se realizo la descomposicion A = L U...\n");
/*
for(j=1;j<=2*N;j++)
fprintf(fp,"w[%2d]= %+6.4E ",j,w[j]);
fprintf(fp,"\n\n");
wmax=0.0;
for(j=1;j<=2*N;j++) if(w[j]>wmax) wmax=w[j];
wmin=wmax*condic;
for(j=1;j<=2*N;j++) if(w[j]<wmin) w[j]=0.0;
*/
/******************************************************************
Funcion para la sustitucion hacia atras. La solucion es el vector X
******************************************************************/
dlubksb(A, 2*N, w, T);
for(i=1;i<=2*N;i++) X[i]=T[i];

/*****************************************************************
Definicion y almacenamiento de las componentes as, an, bs, bn.
*****************************************************************/
if(region[0].frontera=='G')
{
for(j=1;j<=region[0].numpf;j++)
{
as[j]=X[2*j-1]; an[j]=X[2*j];
/*
printf("as[%3d]= %+10.8E an[%3d]= %+10.8E\n",j,as[j],j,an[j]);
*/
}
for(j=region[0].numpf+1;j<=N;j++)
{
bs[j]=X[2*j-1]; bn[j]=X[2*j];
/*
149
printf("bs[%3d]= %+10.8E bn[%3d]= %+10.8E\n",j,bs[j],j,bn[j]);
*/
}
/*
for(j=1;j<=N;j++)
{
if(elemento[j-1].frontera=='G')
fprintf(fp,"as[%3d]= %+10.8E an[%3d]= %+10.8E\n",j,as[j],j,an[j]);
else
fprintf(fp,"bs[%3d]= %+10.8E bn[%3d]= %+10.8E\n",j,bs[j],j,bn[j]);
}
fprintf(fp,"\n");
*/
}
else
{
for(j=1;j<=N;j++)
{
bs[j]=X[2*j-1]; bn[j]=X[2*j];
/*
printf("bs[%3d]= %+10.8E bn[%3d]= %+10.8E\n",j,bs[j],j,bn[j]);
*/
}
/*
for(j=1;j<=N;j++)
fprintf(fp,"bs[%3d]= %+10.8E bn[%3d]= %+10.8E\n",j,bs[j],j,bn[j]);
fprintf(fp,"\n");
*/
}
printf("EL SISTEMA A x = T - G YA HA SIDO RESUELTO...\n");
free_dmatrix(v,1,2*N,1,2*N);
free_dvector(w,1,2*N);
}

/*********************************************************************
CALCULO DE ESFUERZOS ELASTICOS Y PLASTICOS EN TODO EL DOMINIO
*********************************************************************/
void esfuerzos(double **sigma11, double **sigma12, double **sigma22,
int nx, int ny, int iter)
{
int i, j;
printf("\nINICIANDO EL CALCULO DE LOS ESFUERZOS...\n");
if(iter==1)
{
for(i=1;i<=nx;i++)
{
for(j=1;j<=ny;j++)
{
if(intextgen[i][j]==0)
{
sigma11[i][j]=0.0;
sigma12[i][j]=0.0;
sigma22[i][j]=0.0;
}
else
{
sigma11[i][j]=SG11(NX[i],NY[j]);
sigma12[i][j]=SG12(NX[i],NY[j]);
sigma22[i][j]=SG22(NX[i],NY[j]);
150
}
}
}
}
else
{
for(i=1;i<=nx;i++)
{
for(j=1;j<=ny;j++)
{
if(intextgen[i][j]==0)
{
sigma11[i][j]=0.0;
sigma12[i][j]=0.0;
sigma22[i][j]=0.0;
}
else
{
sigma11[i][j]=SG11(NX[i],NY[j])+SG11pl(NX[i],NY[j]);
sigma12[i][j]=SG12(NX[i],NY[j])+SG12pl(NX[i],NY[j]);
sigma22[i][j]=SG22(NX[i],NY[j])+SG22pl(NX[i],NY[j]);
}
}
}
}
/*
for(i=1;i<=nx;i++)
{
for(j=1;j<=ny;j++)
{
switch(intextgen[i][j])
{
case 0:
sigma11[i][j]=0.0;
sigma12[i][j]=0.0;
sigma22[i][j]=0.0;
break;
case 1:
sigma11[i][j]=SG11(NX[i],NY[j]);
sigma12[i][j]=SG12(NX[i],NY[j]);
sigma22[i][j]=SG22(NX[i],NY[j]);
break;
case 2:
sigma11[i][j]=SG11(NX[i],NY[j])+SG11pl(NX[i],NY[j]);
sigma12[i][j]=SG12(NX[i],NY[j])+SG12pl(NX[i],NY[j]);
sigma22[i][j]=SG22(NX[i],NY[j])+SG22pl(NX[i],NY[j]);
break;
}
}
}
*/
printf("ESFUERZOS CALCULADOS. SALIENDO DE LA FUNCION ESFUERZOS.\n");
}
151
#include <math.h>

#include "mandat13a.h"
#include "nr.h"
#include "func14a.h"
#include "funplast21a.h"

/*************************************************************
Definicion de las variables externas de las funciones generales
*************************************************************/

/**************************************************************************
Definicion de constantes generales y propiedades del material
**************************************************************************/
extern int cond, M0c;
extern double cero, D, KAPPA0, Elmod, MU0, Nu, pb;
extern char falso[72];

/*************************************************************************/

extern double lcrack, h, *as, *an, *bs, *bn;


extern int Mc, M, N;

extern DREGION *region;

extern DELEMENTO *elemento;


/*
extern DVECTOR2D *fuerza;
*/
double xval, yval;

extern double **fJ11, **fJ12, **fJ21, **fJ22;


extern double **dxyJ11, **dxyJ12, **dxyJ21, **dxyJ22;

extern double *zeta, *eta;


extern double *fxy, *dfx, *dfy, *dfxy;

/*******************************************************
Funciones generales
*******************************************************/
/* Semi-longitud de la grieta */
double l()
{
return fabs(region[0].xfin-region[0].xinic)/2.0;
}

/* Distancia entre puntos de grieta */


double hc()
{
return fabs(region[0].xfin-region[0].xinic)/region[0].numpf;
}

/* Distancia entre puntos auxiliares de grieta */


double h0c()
{
return fabs(region[0].xfin-region[0].xinic)/M0c;
}

/* p = h Sqrt(D)/2 para los puntos de grieta */


152
double p0c()
{
double P0C;
P0C = h0c()/sqrt(D);
return P0C;
}

/* p = h / Sqrt(D) para los puntos de frontera


double pb(int i)
{
return elemento[i-1].h/sqrt(D);
}
*/
/* Funcion de aproximacion de la grieta */

double b0(double x)
{
double L;
L=l();
return sqrt(L*L-x*x);
}

/* Coord. X de nodos auxiliares de la grieta */


double xc(int i)
{
if(region[0].xinic > region[0].xfin)
return (region[0].xinic-(i-0.5)*h0c());
else
return (region[0].xinic+(i-0.5)*h0c());
}

/* Coord. X de nodos auxiliares de la grieta */


double xcs(int i)
{
double xorigen,XCS;
xorigen=(region[0].xinic+region[0].xfin)/2.0;
if(region[0].xinic > region[0].xfin)
{
XCS=(region[0].xinic-(i-0.5)*h0c()-xorigen);
return XCS;
}
else
{
XCS=(region[0].xinic+(i-0.5)*h0c()-xorigen);
return XCS;
}
}

/* Coord. Y de nodos auxiliares de la grieta */


double yc(int i)
{
return ( (region[0].yinic+region[0].yfin)/2.0 );
}

/* Angulo beta de nodos auxiliares de la grieta */


double bc(int i)
{
return 0.0;
}
153

/**************************************************************
METODO DE PUNTOS DE FRONTERA
****************************************************************/
/***************************************************************
Funciones basicas
****************************************************************/
/***************************************************************
Funciones basicas: Para las Integrales

double J1p (double k)


{
return k*exp(-k*k-fabs(yval)*k)*cos(xval*k)/M_PI;
}

double J1m (double k)


{
return k*exp(-k*k-fabs(yval)*k)*sin(xval*k)/M_PI;
}

double J2p (double k)


{
return k*k*exp(-k*k-fabs(yval)*k)*cos(xval*k)/M_PI;
}

double J2m (double k)


{
return k*k*exp(-k*k-fabs(yval)*k)*sin(xval*k)/M_PI;
}
****************************************************************/

/******************************************************
Integrales de las funciones basicas

double J11p (double x, double y)


{
double dqsimp(double (*func)(double), double a, double b);
xval=x; yval=y;
return dqsimp(J1p, 0.0, cond);
}

double J11m (double x, double y)


{
double dqsimp(double (*func)(double), double a, double b);
xval=x; yval=y;
return dqsimp(J1m, 0.0, cond);
}

double J22p (double x, double y)


{
double dqsimp(double (*func)(double), double a, double b);
xval=x; yval=y;
return dqsimp(J2p, 0.0, cond);
}

double J22m (double x, double y)


{
double dqsimp(double (*func)(double), double a, double b);
xval=x; yval=y;
154
return dqsimp(J2m, 0.0, cond);
}
********************************************************/

/******************************************************
Interpolacion de las funciones basicas
********************************************************/

double J11p (double x, double y)


{
int m,n,k,l;
double j11p, ansy1, ansy2;

for(m=1;m<=Nz;m++) {
if(zeta[m]>x) break;
}
for(n=1;n<=Ne;n++) {
if(eta[n]>y) break;
}
if(x<zeta[m] && y<eta[n]){ k=m-1; l=n-1; }
if(x==zeta[m] && y<eta[n]){ k=m; l=n-1; }
if(x<zeta[m] && y==eta[n]){ k=m-1; l=n; }
if(x==zeta[m] && y==eta[n]){ k=m; l=n; }

fxy[1]=fJ11[k][l];
fxy[2]=fJ11[k+1][l];
fxy[3]=fJ11[k+1][l+1];
fxy[4]=fJ11[k][l+1];

dfx[1]=-fJ22[k][l];
dfx[2]=-fJ22[k+1][l];
dfx[3]=-fJ22[k+1][l+1];
dfx[4]=-fJ22[k][l+1];

dfy[1]=-fJ21[k][l];
dfy[2]=-fJ21[k+1][l];
dfy[3]=-fJ21[k+1][l+1];
dfy[4]=-fJ21[k][l+1];

dfxy[1]=dxyJ11[k][l];
dfxy[2]=dxyJ11[k+1][l];
dfxy[3]=dxyJ11[k+1][l+1];
dfxy[4]=dxyJ11[k][l+1];

dbcuint(fxy,dfx,dfy,dfxy,zeta[k],zeta[k+1],eta[l],eta[l+1],
x,y,&j11p,&ansy1,&ansy2);
return j11p;
}

double J11m (double x, double y)


{
int m,n,k,l;
double j11m, ansy1, ansy2;

for(m=1;m<=Nz;m++) {
if(zeta[m]>x) break;
}
for(n=1;n<=Ne;n++) {
if(eta[n]>y) break;
155
}
if(x<zeta[m] && y<eta[n]){ k=m-1; l=n-1; }
if(x==zeta[m] && y<eta[n]){ k=m; l=n-1; }
if(x<zeta[m] && y==eta[n]){ k=m-1; l=n; }
if(x==zeta[m] && y==eta[n]){ k=m; l=n; }

fxy[1]=fJ12[k][l];
fxy[2]=fJ12[k+1][l];
fxy[3]=fJ12[k+1][l+1];
fxy[4]=fJ12[k][l+1];

dfx[1]=fJ21[k][l];
dfx[2]=fJ21[k+1][l];
dfx[3]=fJ21[k+1][l+1];
dfx[4]=fJ21[k][l+1];

dfy[1]=-fJ22[k][l];
dfy[2]=-fJ22[k+1][l];
dfy[3]=-fJ22[k+1][l+1];
dfy[4]=-fJ22[k][l+1];

dfxy[1]=dxyJ12[k][l];
dfxy[2]=dxyJ12[k+1][l];
dfxy[3]=dxyJ12[k+1][l+1];
dfxy[4]=dxyJ12[k][l+1];

dbcuint(fxy,dfx,dfy,dfxy,zeta[k],zeta[k+1],eta[l],eta[l+1],
x,y,&j11m,&ansy1,&ansy2);
return j11m;
}

double J22p (double x, double y)


{
int m,n,k,l;
double j22p, ansy1, ansy2;

for(m=1;m<=Nz;m++) {
if(zeta[m]>x) break;
}
for(n=1;n<=Ne;n++) {
if(eta[n]>y) break;
}
if(x<zeta[m] && y<eta[n]){ k=m-1; l=n-1; }
if(x==zeta[m] && y<eta[n]){ k=m; l=n-1; }
if(x<zeta[m] && y==eta[n]){ k=m-1; l=n; }
if(x==zeta[m] && y==eta[n]){ k=m; l=n; }

fxy[1]=fJ21[k][l];
fxy[2]=fJ21[k+1][l];
fxy[3]=fJ21[k+1][l+1];
fxy[4]=fJ21[k][l+1];

dfx[1]=-dxyJ11[k][l];
dfx[2]=-dxyJ11[k+1][l];
dfx[3]=-dxyJ11[k+1][l+1];
dfx[4]=-dxyJ11[k][l+1];

dfy[1]=dxyJ12[k][l];
dfy[2]=dxyJ12[k+1][l];
156
dfy[3]=dxyJ12[k+1][l+1];
dfy[4]=dxyJ12[k][l+1];

dfxy[1]=dxyJ21[k][l];
dfxy[2]=dxyJ21[k+1][l];
dfxy[3]=dxyJ21[k+1][l+1];
dfxy[4]=dxyJ21[k][l+1];

dbcuint(fxy,dfx,dfy,dfxy,zeta[k],zeta[k+1],eta[l],eta[l+1],
x,y,&j22p,&ansy1,&ansy2);
return j22p;
}

double J22m (double x, double y)


{
int m,n,k,l;
double j22m, ansy1, ansy2;

for(m=1;m<=Nz;m++) {
if(zeta[m]>x) break;
}
for(n=1;n<=Ne;n++) {
if(eta[n]>y) break;
}
if(x<zeta[m] && y<eta[n]){ k=m-1; l=n-1; }
if(x==zeta[m] && y<eta[n]){ k=m; l=n-1; }
if(x<zeta[m] && y==eta[n]){ k=m-1; l=n; }
if(x==zeta[m] && y==eta[n]){ k=m; l=n; }

fxy[1]=fJ22[k][l];
fxy[2]=fJ22[k+1][l];
fxy[3]=fJ22[k+1][l+1];
fxy[4]=fJ22[k][l+1];

dfx[1]=-dxyJ12[k][l];
dfx[2]=-dxyJ12[k+1][l];
dfx[3]=-dxyJ12[k+1][l+1];
dfx[4]=-dxyJ12[k][l+1];

dfy[1]=-dxyJ11[k][l];
dfy[2]=-dxyJ11[k+1][l];
dfy[3]=-dxyJ11[k+1][l+1];
dfy[4]=-dxyJ11[k][l+1];

dfxy[1]=dxyJ22[k][l];
dfxy[2]=dxyJ22[k+1][l];
dfxy[3]=dxyJ22[k+1][l+1];
dfxy[4]=dxyJ22[k][l+1];

dbcuint(fxy,dfx,dfy,dfxy,zeta[k],zeta[k+1],eta[l],eta[l+1],
x,y,&j22m,&ansy1,&ansy2);
return j22m;
}

/*******************************************************
Funciones asimptoticas
*******************************************************/

double J1pa (double x, double y)


157
{
double x2 = x*x, y2 = y*y,
x4 = x2*x2, y4 = y2*y2,
x6 = x2*x4, y6 = y2*y4,
x8 = x4*x4, y8 = y4*y4;
double j1pa = (-x2+y2)/(M_PI*pow(x2+y2,2))+
6*(-x4+6*x2*y2-y4)/(M_PI*pow(x2+y2,4))+
60*(-x6+15*x4*y2-15*x2*y4+y6)/(M_PI*pow(x2+y2,6))+
840*(-x8+28*x6*y2-70*x4*y4+28*x2*y6-y8)/(M_PI*pow(x2+y2,8));
return j1pa;
}

double J1ma (double x, double y)


{
double x2 = x*x, y2 = y*y,
x4 = x2*x2, y4 = y2*y2,
x6 = x2*x4, y6 = y2*y4;
double j1ma = 2*x*y/(M_PI*pow(x2+y2,2))+
24*x*y*(x2-y2)/(M_PI*pow(x2+y2,4))+
120*x*y*(3*x4-10*x2*y2+3*y4)/(M_PI*pow(x2+y2,6))+
6720*x*y*(x6-7*x4*y2+7*x2*y4-y6)/(M_PI*pow(x2+y2,8));
return j1ma;
}

double J2pa (double x, double y)


{
double x2 = x*x, y2 = y*y,
x4 = x2*x2, y4 = y2*y2,
x6 = x2*x4, y6 = y2*y4,
x8 = x4*x4, y8 = y4*y4,
x10 = x4*x6, y10 = y4*y6,
x12 = x6*x6, y12 = y6*y6;
double j2pa = 2*y*(-3*x2+y2)/(M_PI*pow(x2+y2,3))+
24*y*(-5*x4+10*x2*y2-y4)/(M_PI*pow(x2+y2,5))+
360*y*(-7*x6+35*x4*y2-21*x2*y4+y6)/(M_PI*pow(x2+y2,7))+
6720*y*(-3*x2+y2)*(3*x6-27*x4*y2+33*x2*y4-y6)/(M_PI*pow(x2+y2,9))+
151200L*y*(-11*x10+165*x8*y2-462*x6*y4+330*x4*y6-
55*x2*y8+y10)/(M_PI*pow(x2+y2,11))+
3991680L*y*(-13*x12+286*x10*y2-1287*x8*y4+1716*x6*y6-
715*x4*y8+78*x2*y10-y12)/(M_PI*pow(x2+y2,13));
return j2pa;
}

double J2ma (double x, double y)


{
double x2 = x*x, y2 = y*y,
x4 = x2*x2, y4 = y2*y2,
x6 = x2*x4, y6 = y2*y4,
x8 = x4*x4, y8 = y4*y4,
x10 = x4*x6, y10 = y4*y6,
x12 = x6*x6, y12 = y6*y6;
double j2ma = 2*x*(-x2+3*y2)/(M_PI*pow(x2+y2,3))+
24*x*(-x4+10*x2*y2-5*y4)/(M_PI*pow(x2+y2,5))+
360*x*(-x6+21*x4*y2-35*x2*y4+7*y6)/(M_PI*pow(x2+y2,7))+
6720*x*(-x8+36*x6*y2-126*x4*y4+84*x2*y6-9*y8)/(M_PI*pow(x2+y2,9))+
151200L*x*(-x10+55*x8*y2-330*x6*y4+462*x4*y6-
165*x2*y8+11*y10)/(M_PI*pow(x2+y2,11))+
3991680L*x*(-x12+78*x10*y2-715*x8*y4+1716*x6*y6-
158
1287*x4*y8+286*x2*y10-13*y12)/(M_PI*pow(x2+y2,13));
return j2ma;
}

/******************************************************************
DEFINICION MEDIANTE FUNCS. DE INTERPOLACION Y ASIMPTOTICAS
*******************************************************************/

double J1pg(double x, double y)


{
if(fabs(x) <= cond && fabs(y) <= cond)
return J11p(x,y);
else
return J1pa(x,y);
}

double J1mg(double x, double y)


{
if(fabs(x) <= cond && fabs(y) <= cond)
return J11m(x,y);
else
return J1ma(x,y);
}

double J2pg(double x, double y)


{
if(fabs(x) <= cond && fabs(y) <= cond)
return J22p(x,y);
else
return J2pa(x,y);
}

double J2mg(double x, double y)


{
if(fabs(x) <= cond && fabs(y) <= cond)
return J22m(x,y);
else
return J2ma(x,y);
}

/**********************************************************
Funciones auxiliares
************************************************************/

double J11(double x, double y, double p)


{
double xp = fabs(x/p), yp = fabs(y/p);
double j11 = sqrt(2.0)/(4*p)*SIGNO(x)*(-y/p*J2mg(xp,yp)+
2*SIGNO(y)*J1mg(xp,yp));
return j11;
}

double J12(double x, double y, double p)


{
double xp = fabs(x/p), yp = fabs(y/p);
double j12 = sqrt(2.0)/(4*p)*(J1pg(xp,yp)-yp*J2pg(xp,yp));
return j12;
}
159
double J21(double x, double y, double p)
{
double xp = fabs(x/p), yp = fabs(y/p);
double j21 = sqrt(2.0)*y/(4*p*p)*SIGNO(x)*J2mg(xp,yp);
return j21;
}

double J22(double x, double y, double p)


{
double xp = fabs(x/p), yp = fabs(y/p);
double j22 = sqrt(2.0)/(4*p)*(J1pg(xp,yp)+yp*J2pg(xp,yp));
return j22;
}

/********************************************************
Componentes de las integrales basicas
********************************************************/

/*********************************************************
Para los elementos de frontera
**********************************************************/

double S11(double x, double y, double p)


{
double s11 = -4*MU0*KAPPA0*J11(x,y,p);
return s11;
}

double S12(double x, double y, double p)


{
double s12 = -4*MU0*KAPPA0*J12(x,y,p);
return s12;
}

double S21(double x, double y, double p)


{
double s21 = -4*MU0*KAPPA0*J21(x,y,p);
return s21;
}

double S22(double x, double y, double p)


{
double s22 = -4*MU0*KAPPA0*J22(x,y,p);
return s22;
}

/*********************************************************
Funciones para los elementos de la grieta
***********************************************************/

double rcs(double x, double y, int j)


{
double RCS;
RCS = (x-xc(j))*cos(bc(j)) + (y-yc(j))*sin(bc(j));
return RCS;
}

double rcn(double x, double y, int j)


{
160
double RCN;
RCN = -(x-xc(j))*sin(bc(j)) + (y-yc(j))*cos(bc(j));
return RCN;
}

double SC11(int i, double x, double y)


{
int j;
double sc11 = 0;
for(j=1;j<=M0c;j++)
sc11 += S11(rcs(x,y,j),rcn(x,y,j),p0c())*
pow(xcs(j),(i-1))*b0(xcs(j));
return sc11;
}

double SC12(int i, double x, double y)


{
int j;
double sc12 = 0;
for(j=1;j<=M0c;j++)
sc12 += S12(rcs(x,y,j),rcn(x,y,j),p0c())*
pow(xcs(j),(i-1))*b0(xcs(j));
return sc12;
}

double SC21(int i, double x, double y)


{
int j;
double sc21 = 0;
for(j=1;j<=M0c;j++)
sc21 += S21(rcs(x,y,j),rcn(x,y,j),p0c())*
pow(xcs(j),(i-1))*b0(xcs(j));
return sc21;
}

double SC22(int i, double x, double y)


{
int j;
double sc22 = 0;
for(j=1;j<=M0c;j++)
sc22 += S22(rcs(x,y,j),rcn(x,y,j),p0c())*
pow(xcs(j),(i-1))*b0(xcs(j));
return sc22;
}

/********************************************************
Componentes de la matriz del sistema
********************************************************/
/*******************************************************
Elementos de la grieta
*******************************************************/

double ACss(int j, int i)


{
double acss;
j=j-1;
acss =
SC12(i,elemento[j].xpuntof,elemento[j].ypuntof)*cos(2*elemento[j].beta)-
(SC11(i,elemento[j].xpuntof,elemento[j].ypuntof)-
161

SC21(i,elemento[j].xpuntof,elemento[j].ypuntof))*sin(2*elemento[j].beta)/2.0;
return acss;
}

double ACsn(int j, int i)


{
double acsn;
j=j-1;
acsn =
SC21(i,elemento[j].xpuntof,elemento[j].ypuntof)*cos(2*elemento[j].beta)-
(SC12(i,elemento[j].xpuntof,elemento[j].ypuntof)-

SC22(i,elemento[j].xpuntof,elemento[j].ypuntof))*sin(2*elemento[j].beta)/2.0;
return acsn;
}

double ACns(int j, int i)


{
double acns;
j=j-1;
acns =
SC21(i,elemento[j].xpuntof,elemento[j].ypuntof)*pow(cos(elemento[j].beta),2)-

SC12(i,elemento[j].xpuntof,elemento[j].ypuntof)*sin(2*elemento[j].beta)+

SC11(i,elemento[j].xpuntof,elemento[j].ypuntof)*pow(sin(elemento[j].beta),2);
return acns;
}

double ACnn(int j, int i)


{
double acnn;
j=j-1;
acnn =
SC22(i,elemento[j].xpuntof,elemento[j].ypuntof)*pow(cos(elemento[j].beta),2)-

SC21(i,elemento[j].xpuntof,elemento[j].ypuntof)*sin(2*elemento[j].beta)+

SC12(i,elemento[j].xpuntof,elemento[j].ypuntof)*pow(sin(elemento[j].beta),2);
return acnn;
}

/******************************************************
Funciones para gama, rs y rn
********************************************************/

double g(int i, int j)


{
double G;
i=i-1; j=j-1;
G=elemento[j].beta-elemento[i].beta;
return G;
}

double rs(int i, int j)


{
double RS;
i=i-1; j=j-1;
162
RS = (elemento[i].xpuntof-elemento[j].xpuntof)*cos(elemento[j].beta)+
(elemento[i].ypuntof-elemento[j].ypuntof)*sin(elemento[j].beta);
return RS;
}

double rn(int i, int j)


{
double RN;
i=i-1; j=j-1;
RN = (-(elemento[i].xpuntof-elemento[j].xpuntof)*sin(elemento[j].beta)+
(elemento[i].ypuntof-elemento[j].ypuntof)*cos(elemento[j].beta));
return RN;
}

/********************************************************
Elementos de la matriz A
*********************************************************/

double Ass(int i, int j)


{
double ass;
ass = S12(rs(i,j),rn(i,j),pb)*cos(2*g(i,j))-
0.5*(S21(rs(i,j),rn(i,j),pb)-
S11(rs(i,j),rn(i,j),pb))*sin(2*g(i,j));
return ass;
}

double Asn(int i, int j)


{
double asn;
asn = S21(rs(i,j),rn(i,j),pb)*cos(2*g(i,j))-
0.5*(S22(rs(i,j),rn(i,j),pb)-
S12(rs(i,j),rn(i,j),pb))*sin(2*g(i,j));
return asn;
}

double Ans(int i, int j)


{
double ans;
ans = S21(rs(i,j),rn(i,j),pb)*pow(cos(g(i,j)),2)+
S12(rs(i,j),rn(i,j),pb)*sin(2*g(i,j))+
S11(rs(i,j),rn(i,j),pb)*pow(sin(g(i,j)),2);
return ans;
}

double Ann(int i, int j)


{
double ann;
ann = S22(rs(i,j),rn(i,j),pb)*pow(cos(g(i,j)),2)+
S21(rs(i,j),rn(i,j),pb)*sin(2*g(i,j))+
S12(rs(i,j),rn(i,j),pb)*pow(sin(g(i,j)),2);
return ann;
}

/******************************************************************
FUNCIONES PARA LA DETERMINACION DE LOS ESFUERZOS ELASTICOS
******************************************************************/

double Rs(double a,double c,int j)


163
{
double rs;
rs=(a-elemento[j-1].xpuntof)*cos(elemento[j-1].beta)+
(c-elemento[j-1].ypuntof)*sin(elemento[j-1].beta);
return rs;
}

double Rn(double a,double c,int j)


{
double rn;
rn=-(a-elemento[j-1].xpuntof)*sin(elemento[j-1].beta)+
(c-elemento[j-1].ypuntof)*cos(elemento[j-1].beta);
return rn;
}

double SG11 (double a, double c)


{
int j, m;
double sg11a=0, sg11b=0, sg11=0;
if(region[0].frontera=='G')
{
for(m=1;m<=region[0].numpf;m++)
sg11a+=SC11(m,a,c)*as[m]+SC12(m,a,c)*an[m];
for(j=region[0].numpf+1;j<=N;j++)
sg11b+=(S11(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S12(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(cos(elemento[j-
1].beta),2)+
(S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]-
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*sin(2*elemento[j-1].beta)+
(S21(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S22(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(sin(elemento[j-
1].beta),2);
sg11=sg11a+sg11b;
return sg11;
}
else
{
for(j=1;j<=N;j++)
sg11+=(S11(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S12(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(cos(elemento[j-
1].beta),2)+
(S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*sin(2*elemento[j-1].beta)+
(S21(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S22(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(sin(elemento[j-
1].beta),2);
return sg11;
}
}

double SG12 (double a, double c)


{
int j, m;
double sg12a=0, sg12b=0, sg12=0;
if(region[0].frontera=='G')
{
for(m=1;m<=region[0].numpf;m++)
sg12a+=SC12(m,a,c)*as[m]+SC21(m,a,c)*an[m];
for(j=region[0].numpf+1;j<=N;j++)
164
sg12b+=(S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*cos(2*elemento[j-1].beta)+
0.5*((S11(Rs(a,c,j),Rn(a,c,j),pb)-
S21(Rs(a,c,j),Rn(a,c,j),pb))*bs[j]-
(S22(Rs(a,c,j),Rn(a,c,j),pb)-
S12(Rs(a,c,j),Rn(a,c,j),pb))*bn[j])*sin(2*elemento[j-1].beta);
sg12=sg12a+sg12b;
return sg12;
}
else
{
for(j=1;j<=N;j++)
sg12+= (S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*cos(2*elemento[j-1].beta)+
0.5*((S11(Rs(a,c,j),Rn(a,c,j),pb)-
S21(Rs(a,c,j),Rn(a,c,j),pb))*bs[j]-
(S22(Rs(a,c,j),Rn(a,c,j),pb)-
S12(Rs(a,c,j),Rn(a,c,j),pb))*bn[j])*sin(2*elemento[j-1].beta);
return sg12;
}
}

double SG22 (double a, double c)


{
int j, m;
double sg22a=0, sg22b=0, sg22=0;
if(region[0].frontera=='G')
{
for(m=1;m<=region[0].numpf;m++)
sg22a+=SC21(m,a,c)*as[m]+SC22(m,a,c)*an[m];
for(j=region[0].numpf+1;j<=N;j++)
sg22b+=(S21(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S22(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(cos(elemento[j-
1].beta),2)+
(S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*sin(2*elemento[j-1].beta)+
(S11(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S12(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(sin(elemento[j-
1].beta),2);
sg22=sg22a+sg22b;
return sg22;
}
else
{
for(j=1;j<=N;j++)
sg22+= (S21(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S22(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(cos(elemento[j-
1].beta),2)+
(S12(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S21(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*sin(2*elemento[j-1].beta)+
(S11(Rs(a,c,j),Rn(a,c,j),pb)*bs[j]+
S12(Rs(a,c,j),Rn(a,c,j),pb)*bn[j])*pow(sin(elemento[j-
1].beta),2);
return sg22;
}
}
165
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "func14a.h"
#include "funplast21a.h"

extern double **A, **AA, pb;

void functest(void)
{
int opcion=1, i, j, cant;
char cadena0[40], cadena[20][40], *token;
char tokensep[]=" [],";
float x,y,p;

while(opcion==1)
{
i=0;
printf("\nEscriba una funcion: ");
scanf("%s",cadena0);
for(j=0;j<40;j++)
cadena[0][j]= cadena0[j];
token=strtok(cadena0,tokensep);
strcpy(cadena[1],token);
printf("Token %d= %s, funcion %d= %s\n",i,token,i+1,cadena[i+1]);

while(token!=NULL)
{
i++;
token=strtok(NULL,tokensep);
if(token==NULL) break;
strcpy(cadena[i+1],token);
printf("Token %d= %s, funcion %d= %s\n",i,token,i+1,cadena[i+1]);
}
/*
COMPONENTES DE LA MATRIZ PRINCIPAL
*/
if(strcmp(cadena[1],"A")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("A[%3d,%3d]= %+6.4E\n",i,j,A[i][j]);
}
else
if(strcmp(cadena[1],"AA")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("AA[%3d,%3d]= %+7.5E\n",i,j,AA[i][j]);
}
else
if(strcmp(cadena[1],"Ass")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("Assg[%3d,%3d]= %+7.5E\n",i,j,Ass(i,j));
}
else
166
if(strcmp(cadena[1],"Asn")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("Asng[%3d,%3d]= %+7.5E\n",i,j,Asn(i,j));
}
else
if(strcmp(cadena[1],"Ans")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("Ansg[%3d,%3d]= %+7.5E\n",i,j,Ans(i,j));
}
else
if(strcmp(cadena[1],"Ann")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("Anng[%3d,%3d]= %+7.5E\n",i,j,Ann(i,j));
}
else
if(strcmp(cadena[1],"g")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("g[%3d,%3d]= %+7.5E\n",i,j,g(i,j));
}
else
if(strcmp(cadena[1],"rs")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("rs[%3d,%3d]= %+7.5E\n",i,j,rs(i,j));
}
else
if(strcmp(cadena[1],"rn")==0)
{
i=atoi(cadena[2]);
j=atoi(cadena[3]);
printf("rn[%3d,%3d]= %+7.5E\n",i,j,rn(i,j));
}
/*
FUNCIONES S11g, S12g, S21g, S22g
*/
if(strcmp(cadena[1],"S11")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("S11g[%f,%f,%f]= %+7.5E\n",x,y,p,S11(x,y,p));
}
else
if(strcmp(cadena[1],"S12")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("S12g[%f,%f,%f]= %+7.5E\n",x,y,p,S12(x,y,p));
}
167
else
if(strcmp(cadena[1],"S21")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("S21g[%f,%f,%f]= %+7.5E\n",x,y,p,S21(x,y,p));
}
else
if(strcmp(cadena[1],"S22")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("S22g[%f,%f,%f]= %+7.5E\n",x,y,p,S22(x,y,p));
}
/*
FUNCIONES J11g, J12g, J21G, J22g
*/
if(strcmp(cadena[1],"J11")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("J11g[%f,%f,%f]= %+7.5E\n",x,y,p,J11(x,y,p));
}
else
if(strcmp(cadena[1],"J12")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("J12g[%f,%f,%f]= %+7.5E\n",x,y,p,J12(x,y,p));
}
else
if(strcmp(cadena[1],"J21")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("J21g[%f,%f,%f]= %+7.5E\n",x,y,p,J21(x,y,p));
}
else
if(strcmp(cadena[1],"J22")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
p=atof(cadena[4]);
printf("J22g[%f,%f,%f]= %+7.5E\n",x,y,p,J22(x,y,p));
}
/*
FUNCIONES J1pg, J1mg, J2pg, J2mg
*/
if(strcmp(cadena[1],"J1pg")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
printf("J1pg[%f,%f]= %+7.5E\n",x,y,J1pg(x,y));
}
168
else
if(strcmp(cadena[1],"J1mg")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
printf("J1mg[%f,%f]= %+7.5E\n",x,y,J1mg(x,y));
}
else
if(strcmp(cadena[1],"J2pg")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
printf("J2pg[%f,%f]= %+7.5E\n",x,y,J2pg(x,y));
}
else
if(strcmp(cadena[1],"J2mg")==0)
{
x=atof(cadena[2]);
y=atof(cadena[3]);
printf("J2mg[%f,%f]= %+7.5E\n",x,y,J2mg(x,y));
}
else
if(strcmp(cadena[1],"pb")==0)
{
x=atof(cadena[2]);
printf("pb= %+7.5E\n",pb);
}
else
if(strcmp(cadena[1],"F0")==0)
{
x=atof(cadena[2]);
printf("F0[%f]= %+7.5E\n",x,F0(x));
}
else
if(strcmp(cadena[1],"F1")==0)
{
x=atof(cadena[2]);
printf("F1[%f]= %+7.5E\n",x,F1(x));
}
else
if(strcmp(cadena[1],"F2")==0)
{
x=atof(cadena[2]);
printf("F2[%f]= %+7.5E\n",x,F2(x));
}
else
if(strcmp(cadena[1],"F3")==0)
{
x=atof(cadena[2]);
printf("F3[%f]= %+7.5E\n",x,F3(x));
}
else
if(strcmp(cadena[1],"F4")==0)
{
x=atof(cadena[2]);
printf("F4[%f]= %+7.5E\n",x,F4(x));
}

printf("Para continuar teclee \"1\", para terminar teclee \"0\": ");


169
scanf("%d",&opcion);
printf("\n");

}
170

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "nr.h"
#include "nrutil.h"
#include "mandat13a.h"
#include "funplast21a.h"

/**************************************************************************
Definicion de constantes generales y propiedades del material
**************************************************************************/
extern int cond, M0c;
extern double cero, D, KAPPA0, Elmod, MU0, Nu, pplas;
extern char falso[72];

/*************************************************************************/
/**************************************************************************
Definicion de las fronteras (region) (DREGION),
puntos de frontera (elemento) (DELEMENTO) y
Cargas externas (fuerza) (DVECTOR2D)
**************************************************************************/
extern DREGION *region;

extern DELEMENTO *elemento;

extern double lx, ly;

/*
Vectores xp , yp , de las coordenadas de los puntos
en la region plastica
*/

extern int Mx, My;

extern double *xp, *yp;

extern double **eps11, **eps12;


extern double **eps22, **eps33;
extern double B1, R0, RINF;

/*************************************************************************
Variables que definen si los puntos de la malla donde se calculan
los esfuerzos son interiores, 1, o exteriores, 0.
*************************************************************************/
extern int **intextpl;
extern int lix, lsx, liy, lsy;

/*********************************************************
DEFINICION DE LAS FUNCIONES PARA EL CALCULO DEL VECTOR DE PLASTICIDAD
**********************************************************/
double Rpl(double a, double b, int i, int j)
{
return sqrt(pow(a-xp[i],2)+pow(b-yp[j],2));
}
171
double N1(double a, double b, int i, int j)
{
double r=Rpl(a,b,i,j);
if (fabs(r)<= cero) return 0;
else return (a-xp[i])/r;
}

double N2(double a, double b, int i, int j)


{
double r=Rpl(a,b,i,j);
if (fabs(r)<= cero) return 0;
else return (b-yp[j])/r;
}

double F0(double r)
{
if(r < 0.02) return ( 3.0/(16*M_PI) );
else
return ( -(12+r*r-(12+4*r*r+pow(r,4))*exp(-r*r/4))/(2*M_PI*pow(r,4)) );
}

double F1(double r)
{
if(r < 0.025) return ( 0.0 );
else
return ( (48-2*r*r-(48+10*r*r+pow(r,4))*exp(-r*r/4))/(M_PI*pow(r,4)) );
}

double F2(double r)
{
if(r < 0.025) return ( 1.0/(16*M_PI) );
else
return ( (12-r*r-2*(6+r*r)*exp(-r*r/4))/(2*M_PI*pow(r,4)) );
}

double F3(double r)
{
if(r < 0.025) return ( 1.0/(8*M_PI) );
else
return ( (24+2*r*r-(24+8*r*r+pow(r,4))*exp(-r*r/4))/(2*M_PI*pow(r,4)) );
}

double F4(double r)
{
if(r < 0.1) return ( 0.0 );
else
return ( (8*r*r-96+(pow(r,4)+16*r*r+96)*exp(-r*r/4))/(2*M_PI*pow(r,4)) );
}

double s11pl(double r,double n1,double n2,int i,int j)


{
double S11, rdp;

rdp=r/pplas;

if(eps11[i][j]==0.0 && eps12[i][j]==0.0 && eps22[i][j]==0.0)


S11=0.0;

else if(eps11[i][j]==0.0 && eps12[i][j]==0.0)


172
S11=eps22[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp));

else if(eps11[i][j]==0.0 && eps22[i][j]==0.0)


S11=eps12[i][j]*n1*n2*(F1(rdp)+2*n1*n1*F4(rdp));

else if(eps12[i][j]==0.0 && eps22[i][j]==0.0)


S11=eps11[i][j]*(F0(rdp)+n1*n1*F1(rdp)+pow(n1,4)*F4(rdp));

else if(eps11[i][j]==0.0)
S11=eps12[i][j]*n1*n2*(F1(rdp)+2*n1*n1*F4(rdp))+
eps22[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp));

else if(eps12[i][j]==0.0)
S11=eps11[i][j]*(F0(rdp)+n1*n1*F1(rdp)+pow(n1,4)*F4(rdp))+
eps22[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp));

else if(eps22[i][j]==0.0)
S11=eps11[i][j]*(F0(rdp)+n1*n1*F1(rdp)+pow(n1,4)*F4(rdp))+
eps12[i][j]*n1*n2*(F1(rdp)+2*n1*n1*F4(rdp));

else
S11=eps11[i][j]*(F0(rdp)+n1*n1*F1(rdp)+pow(n1,4)*F4(rdp))+
eps12[i][j]*n1*n2*(F1(rdp)+2*n1*n1*F4(rdp))+
eps22[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp));

return S11;
}

double s12pl(double r,double n1,double n2,int i,int j)


{
double S12, rdp;
rdp=r/pplas;

if(eps11[i][j]==0.0 && eps12[i][j]==0.0 && eps22[i][j]==0.0)


S12=0.0;

else if(eps11[i][j]==0.0 && eps12[i][j]==0.0)


S12=eps22[i][j]*n1*n2*(F1(rdp)/2+n2*n2*F4(rdp));

else if(eps11[i][j]==0.0 && eps22[i][j]==0.0)


S12=eps12[i][j]*(F3(rdp)+2*n1*n1*n2*n2*F4(rdp));

else if(eps12[i][j]==0.0 && eps22[i][j]==0.0)


S12=eps11[i][j]*n1*n2*(F1(rdp)/2+n1*n1*F4(rdp));

else if(eps11[i][j]==0.0)
S12=eps12[i][j]*(F3(rdp)+2*n1*n1*n2*n2*F4(rdp))+
eps22[i][j]*n1*n2*(F1(rdp)/2+n2*n2*F4(rdp));

else if(eps12[i][j]==0.0)
S12=eps11[i][j]*n1*n2*(F1(rdp)/2+n1*n1*F4(rdp))+
eps22[i][j]*n1*n2*(F1(rdp)/2+n2*n2*F4(rdp));

else if(eps22[i][j]==0.0)
S12=eps11[i][j]*n1*n2*(F1(rdp)/2+n1*n1*F4(rdp))+
eps12[i][j]*(F3(rdp)+2*n1*n1*n2*n2*F4(rdp));

else
S12=eps11[i][j]*n1*n2*(F1(rdp)/2+n1*n1*F4(rdp))+
173
eps12[i][j]*(F3(rdp)+2*n1*n1*n2*n2*F4(rdp))+
eps22[i][j]*n1*n2*(F1(rdp)/2+n2*n2*F4(rdp));

return S12;
}

double s22pl(double r,double n1,double n2,int i,int j)


{
double S22, rdp;
rdp=r/pplas;

if(eps11[i][j]==0.0 && eps12[i][j]==0.0 && eps22[i][j]==0.0)


S22=0.0;

else if(eps11[i][j]==0.0 && eps12[i][j]==0.0)


S22=eps22[i][j]*(F0(rdp)+n2*n2*F1(rdp)+pow(n2,4)*F4(rdp));

else if(eps11[i][j]==0.0 && eps22[i][j]==0.0)


S22=eps12[i][j]*n1*n2*(F1(rdp)+2*n2*n2*F4(rdp));

else if(eps12[i][j]==0.0 && eps22[i][j]==0.0)


S22=eps11[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp));

else if(eps11[i][j]==0.0)
S22=eps12[i][j]*n1*n2*(F1(rdp)+2*n2*n2*F4(rdp))+
eps22[i][j]*(F0(rdp)+n2*n2*F1(rdp)+pow(n2,4)*F4(rdp));

else if(eps12[i][j]==0.0)
S22=eps11[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp))+
eps22[i][j]*(F0(rdp)+n2*n2*F1(rdp)+pow(n2,4)*F4(rdp));

else if(eps22[i][j]==0.0)
S22=eps11[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp))+
eps12[i][j]*n1*n2*(F1(rdp)+2*n2*n2*F4(rdp));

else
S22=eps11[i][j]*(F2(rdp)+n1*n1*n2*n2*F4(rdp))+
eps12[i][j]*n1*n2*(F1(rdp)+2*n2*n2*F4(rdp))+
eps22[i][j]*(F0(rdp)+n2*n2*F1(rdp)+pow(n2,4)*F4(rdp));

return S22;
}

double SG11pl(double a, double b)


{
int i, j;
double sg11=0, r, n1, n2;

for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
r=Rpl(a,b,i,j);
n1=N1(a,b,i,j);
n2=N2(a,b,i,j);
if(intextpl[i][j]==2)
sg11 += s11pl(r,n1,n2,i,j);
/*
{
174
if(r<=0.01) continue;
else sg11 += s11pl(r,n1,n2,i,j);
}
*/
}
}
sg11 *= (-4*MU0*KAPPA0);
return sg11;
}

double SG12pl(double a, double b)


{
int i, j;
double sg12=0, r, n1, n2;
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
r=Rpl(a,b,i,j);
n1=N1(a,b,i,j);
n2=N2(a,b,i,j);
if(intextpl[i][j]==2)
sg12 += s12pl(r,n1,n2,i,j);
/*
{
if(r<=0.01) continue;
else sg12 += s12pl(r,n1,n2,i,j);
}
*/
}
}
sg12 *= (-4*MU0*KAPPA0);
return sg12;
}

double SG22pl(double a, double b)


{
int i, j;
double sg22=0, r, n1, n2;
for(i=0;i<Mx;i++)
for(j=0;j<My;j++)
{
r=Rpl(a,b,i,j);
n1=N1(a,b,i,j);
n2=N2(a,b,i,j);
if(intextpl[i][j]==2)
sg22 += s22pl(r,n1,n2,i,j);
/*
{
if(r<=0.01) continue;
else sg22 += s22pl(r,n1,n2,i,j);
}
*/
}
sg22*=(-4*MU0*KAPPA0);
return sg22;
}

/**************************************************************
175
FUNCIONES PARA CALCULAR LAS COMPONENTES DEL VECTOR G DE DEF. PLASTICA
***************************************************************/
double Gs(double x, double y, double beta)
{
double gs, a, b;
a = SG12pl(x,y)*cos(2.0*beta);
b = (SG11pl(x,y)-SG22pl(x,y))*0.5*sin(2.0*beta);
gs = a-b;
return gs;
}

double Gn(double x, double y, double beta)


{
double gn, a, b, c;
a = SG11pl(x,y)*pow(sin(beta),2);
b = SG12pl(x,y)*sin(2.0*beta);
c = SG22pl(x,y)*pow(cos(beta),2);
gn = a-b+c;
return gn;
}

/**************************************************************
FUNCION DE DEF. PLASTICA EN FUNCION DE LA DEFORMACION EQUIVALENTE
***************************************************************/
double depsdesf(double epseq)
{
double depsdsigma;
if(B1==0 || RINF==0) depsdsigma=1.0/R0;
else depsdsigma=1.0/(R0+B1*RINF*exp(-B1*epseq));
return depsdsigma;
}
176
/************************************************************************
FUNCION PARA DEFINIR SI LOS PUNTOS PARA EL CALCULO DE LAS PROPIEDADES
DEL MATERIAL SON PUNTOS INTERIORES O EXTERIORES AL CUERPO
************************************************************************/
/***********************************************************************
Definicion de las variables
***********************************************************************/
/**********************************************************************
Definicion del areglo 2D para establecer si el punto de interes es
interior ( 1 ) o exterior ( 0 ).
**********************************************************************/
#include "mandat13a.h"

#ifndef _INTEXT_C_
#define _INTEXT_C_

extern int N;
extern DELEMENTO *elemento;
extern double xmin, xmax, ymin, ymax;
extern double cero;
/********************************************************************
Inicio de la funcion. Se leen las coordenadas
del punto de interes y los indices correspondientes.
********************************************************************/
int intext(double x, double y)
{
int ktemp, k, v;
double d, dx, dy, dtemp, dxtemp, dytemp;
double nx, ny, pp;
/********************************************************************
Calculo de la distancia del punto de interes a los puntos de frontera.
Se van comparando las distancias y se almacena la menor.
Tambien se almacenan las componentes del vector menor.
*********************************************************************/
for(k=0;k<N;k++)
{
dx=elemento[k].xpuntof-x;
dy=elemento[k].ypuntof-y;
d=sqrt(dx*dx+dy*dy);

if(k==0)
/* Toma los valores iniciales y los guarda en variables temporales */
{
ktemp=k; dtemp=d; dxtemp=dx; dytemp=dy;
}
else
/* Compara las longitudes de los vectores anterior y nuevo.
Si la longitud del vector anterior es mayor a la del vector nuevo,
se guardan los valores nuevos */
if(dtemp>d)
{
ktemp=k; dtemp=d; dxtemp=dx; dytemp=dy;
}
}
/*
printf("\nk= %2d x=%+1.4e y=%+1.4e xn=%+1.4e yn=%+1.4e d=%+1.4e dx=%+1.4e
dy=%+1.4e\n",
ktemp+1, x, y, elemento[ktemp].xpuntof, elemento[ktemp].ypuntof,
dtemp, dxtemp, dytemp);
177
*/
/**********************************************************************
Definicion del vector unitario dirigido desde el punto de interes en (i,j)
al punto de frontera mas cercano, ktemp.
sus componentes son (dx, dy) = (dxtemp, dytemp)/dtemp.
dx=(dtemp==0 ? 0 : (fabs(dxtemp)<=cero ? 0 : dxtemp/dtemp));
dy=(dtemp==0 ? 0 : (fabs(dytemp)<=cero ? 0 : dytemp/dtemp));
**********************************************************************/
dx=(dxtemp==0 ? 0 : dxtemp/dtemp);
dy=(dytemp==0 ? 0 : dytemp/dtemp);
/**********************************************************************
Definicion del vector unitario normal en el punto de frontera k.

nx=cos(elemento[ktemp].beta+M_PI/2.0);
ny=sin(elemento[ktemp].beta+M_PI/2.0);
**********************************************************************/

nx=-sin(elemento[ktemp].beta);
ny= cos(elemento[ktemp].beta);

/**********************************************************************
Definicion de si el punto de interes es interior o exterior
mediante el producto interior ( pp ) entre los vectores unitarios:
( dx, dy ) . ( nx, ny ) = dx.nx + dy.ny
El producto punto del resultado anterior (pp), indica:

NOTA: ESTE APARTADO SE REVISA PARA DEFINIR SI SE VAN A CONSIDERAR LOS PUNTOS
SOBRE LA FRONTERA COMO PARTE DEL DOMINIO, O NO.

ESTA ES LA CONDICION QUE SE REVISA Y SE MODIFICA SEGUN SE


CONSIDERE............

SI SE VAN A CONSIDERAR LOS PUNTOS DE FRONTERA COMO PARTE DEL DOMINIO SE


CONSIDERA:

Si pp >= 0, es interior y se define con 1.


Si pp < 0, es exterior y se define con 0.

SI NO SE VAN A CONSIDERAR LOS PUNTOS DE FRONTERA COMO PARTE DEL DOMINIO SE


CONSIDERA:

Si pp > 0, es interior y se define con 1.


Si pp <= 0, es exterior y se define con 0.
***********************************************************************/
pp = dx*nx + dy*ny;
if(fabs(pp)<cero) pp=0;
/*
if(pp >= 0) v=1; else v=0;
printf("x=%+1.4e y=%+1.4e dx=%+1.4e dy=%+1.4e nx=%+1.4e ny=%+1.4e,
pp=%+1.4e 1o0=%2d\n",
x, y, dx, dy, nx, ny, pp, v);
*/
if(pp > 0) return 1;
else return 0;
}

#endif
178

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

#include "bpmgeoma.h"

char nombre_modelo[81];

extern int leerdatos;

extern int Regiones, N;


extern int k;

extern DREGION *region;

extern DELEMENTO *elemento;

extern DVECTOR2D *fuerza, *fzaplast;

extern double *T;

extern FILE *fp, *fpesfpl, *fpepspl, *fpmallapl, *fpresult;


extern FILE *fps11, *fps12, *fps22;
extern FILE *fps11pl, *fps12pl, *fps22pl, *fps33pl;
extern FILE *fpe11pl, *fpe12pl, *fpe22pl, *fpe33pl;
extern FILE *fpde11pl, *fpde12pl, *fpde22pl, *fpde33pl;
extern FILE *fpSp11, *fpSp12, *fpSp22, *fpSp33;

extern char matriz[13]="matrizA.txt", archivo[81], archivobak[81], numero[4];


extern char ndatgen[81], edatgen[5]=".dat",
ndatesfeq[81], edatesfeq[5]=".spl",
ndatepseq[81], edatepseq[5]=".epl",
nmallapl[81], emallapl[5]=".net",
nresult[81], eresult[5]=".res",
ndats11[81], edats11[5]=".s11",
ndats12[81], edats12[5]=".s12",
ndats22[81], edats22[5]=".s22",
ndats11pl[81], edats11pl[7]=".s11pl",
ndats12pl[81], edats12pl[7]=".s12pl",
ndats22pl[81], edats22pl[7]=".s22pl",
ndats33pl[81], edats33pl[7]=".s33pl",
ndate11pl[81], edate11pl[7]=".e11pl",
ndate12pl[81], edate12pl[7]=".e12pl",
ndate22pl[81], edate22pl[7]=".e22pl",
ndate33pl[81], edate33pl[7]=".e33pl",
ndatde11pl[81], edatde11pl[8]=".de11pl",
ndatde12pl[81], edatde12pl[8]=".de12pl",
ndatde22pl[81], edatde22pl[8]=".de22pl",
ndatde33pl[81], edatde33pl[8]=".de33pl",
ndatSp11pl[81], edatSp11pl[8]=".Sp11pl",
ndatSp12pl[81], edatSp12pl[8]=".Sp12pl",
ndatSp22pl[81], edatSp22pl[8]=".Sp22pl",
ndatSp33pl[81], edatSp33pl[8]=".Sp33pl";

void leer_datos(void)
179
{
printf("¿Desea leer datos desde un modelo previo?\n"
"Presione \"1\" para leer, \"0\" para iniciar un nuevo modelo\n");
scanf("%d",&leerdatos);
if(leerdatos==1)
{
printf("Escriba el nombre del modelo a leer (sin numero y sin
extension): ");
scanf("%s",archivo);
printf("Escriba el numero del modelo a leer, sin extension: ");
scanf("%d",k);

strcpy(archivobak,archivo);
entero2alfa(k,numero);
copia_nombres_archivos();
abre_archivos();

lee_inicio();
lee_

void lee_inicio(void)
{
char header[128], falso[72];
int regs, puntof;
fgets(header,128,fp);
printf("%s", header);
fscanf(fp,"%d %s", &Regiones, falso);
printf("%s\t%d\n", Regiones, falso);
fscanf(fp,"%s", falso);
brinco(1);
fgets(header,128,fp);
printf("%s", header);
fscanf(fp,"%d %s", &N, falso);
printf("%s\t%d\n", N, falso);
fscanf(fp,"%s", falso);
brinco(1);
fgets(header,128,fp);
printf("%s", header);
for(i=0;i<Regiones;i++)
{
fscanf(fp,"%d %c %c %lf %lf %lf %lf %lf %lf %lf %lf %d",
regs,
region[i].frontera, region[i].tipofron,
region[i].xinic, region[i].yinic,
region[i].xfin, region[i].yfin,
region[i].xcent, region[i].ycent,
region[i].arco, region[i].beta, region[i].numpf)
}
imprime_regiones();
brinco(1);
fscanf(fp,"%s", falso);
brinco(1);
180
fgets(header,128,fp);
printf("%s", header);
for(i=0;i<N;i++)
{
fscanf(fp,"%d %c %lf %lf %lf %lf %lf",
puntof,
elemento[i].frontera,
elemento[i].xpuntof, elemento[i].ypuntof,
elemento[i].beta, elemento[i].h,
elemento[i].p)
}
printf("Elem Front Xpuntof Ypuntof Beta(Rad) h
p\n");
for(i=0;i<N;i++)
{
printf("%3d %c %+6.4E %+6.4E %+6.4E %+6.4E %+6.4E\n",
i+1,elemento[i].frontera,elemento[i].xpuntof,
elemento[i].ypuntof,elemento[i].beta,elemento[i].h,elemento[i].p);
}
brinco(1);
fscanf(fp,"%s", falso);
brinco(1);
fgets(header,128,fp);
printf("%s", header);
fgets(header,128,fp);
printf("%s", header);
for(i=0;i<N;i++)
{
fscanf(fp,"%d %lf %lf", puntof, T[2*i-1], T[2*i]);
}

}
181
/************************************************
RUTINAS PARA LA DEFINICION DE LA MALLA ADAPTIVA
EN LA REGION PLASTICA
**************************************************/
#include "mandat13a.h"
#include "mallaAdaptiva.h"

int i, j;
extern int ixinic, iyinic;
extern int lix, lsx, liy, lsy, Mx, My;
int cambioliminfx, cambiolimsupx, cambioliminfy, cambiolimsupy;

extern int **intextpl;


extern double **esfeq, **sigmat;
extern double *xp, *yp;
extern double coordxinic, coordyinic;

void indic_inic(void)
{
double num, den, frac;

/*******************************************
Primero se requiere seleccionar los indices de un nodo de la malla
*******************************************/
/*******************************************
Determinacion del nodo en la direccion X
********************************************/
if(coordxinic<=xp[0]) ixinic=0;
else if(coordxinic>xp[0] && coordxinic<xp[Mx-1])
for(i=0; i<Mx-1; i++)
{
num=fabs(coordxinic-xp[i]);
den=fabs(xp[i+1]-xp[i]);
frac=num/den;
if(frac<=0.5)
{
ixinic=i;
break;
}
else if(frac>0.5 && frac<=1.0)
{
ixinic=i+1;
break;
}
}
else if(coordxinic>=xp[Mx-1]) ixinic=Mx-1;

/*******************************************
Determinacion del nodo en la direccion Y
********************************************/
if(coordyinic<=yp[0]) iyinic=0;
else if(coordyinic>yp[0] && coordyinic<yp[My-1])
for(i=0; i<My-1; i++)
{
num=fabs(coordyinic-yp[i]);
den=fabs(yp[i+1]-yp[i]);
frac=num/den;
if(frac<=0.5)
{
182
iyinic=i;
break;
}
else if(frac>0.5 && frac<=1.0)
{
iyinic=i+1;
break;
}
}
else if(coordyinic>=yp[My-1]) iyinic=My-1;

printf("Coordenadas iniciales para la definicion de la malla adaptiva :\n"


"Nodo inicial en X : %3d\tCoordenada inicial en X : %+6.4e\n"
"Nodo inicial en Y : %3d\tCoordenada inicial en Y : %+6.4e\n",
ixinic, xp[ixinic], iyinic, yp[iyinic]);

void selec_limites(void)
{
/********************************************
Variable de control para verificar si cambiaron los limites
de la region plastica.
cambioliminf = 0 : No hubo cambios de limites, se termina el proceso.
cambiolimsup = 1 : Si hubo cambios de limites, continua el proceso.
Se inicializa a 1 para iniciar el proceso iterativo.
********************************************/
cambioliminfx=1;
cambiolimsupx=1;
cambioliminfy=1;
cambiolimsupy=1;

/**************************************************
Aqui se establecen los limites inferior y superior
en cada direccion para el inicio del proceso iterativo
**************************************************/
if(ixinic==0)
{
lix=ixinic;
lsx=ixinic+2;
}
else if(ixinic>0 && ixinic<Mx-1)
{
lix=ixinic-1;
lsx=ixinic+1;
}
else if(ixinic==Mx-1)
{
lix=ixinic-2;
lsx=ixinic;
}

if(iyinic==0)
{
liy=iyinic;
lsy=iyinic+2;
}
else if(iyinic>0 && iyinic<My-1)
{
183
liy=iyinic-1;
lsy=iyinic+1;
}
else
{
liy=iyinic-2;
lsy=iyinic;
}
printf("Limites iniciales para la malla adaptiva\n"
"Limite inferior en X : %3d , Coordenada : %+6.4e\n"
"Limite superior en X : %3d , Coordenada : %+6.4e\n"
"Limite inferior en Y : %3d , Coordenada : %+6.4e\n"
"Limite superior en Y : %3d , Coordenada : %+6.4e\n",
lix, xp[lix], lsx, xp[lsx],liy, yp[liy], lsy, yp[lsy]);

/******************************************************
Aqui se establece el proceso iterativo para definir los limites
en cada direccion en el calculo de los esfuerzos de plasticidad.
La secuencia se realiza en el sentido de las manecillas del reloj
iniciando en la esquina inferior izquierda del rectangulo; es decir,
en las coordenadas del punto (xp[lix], yp[liy]).
Se evalua si el esfuerzo equivalente es superior al esfuerzo t,
Si es cierto, los limites se incrementan o decrementan en uno,
segun sea necesario y se repite el barrido.
******************************************************/
while(cambioliminfx==1 || cambiolimsupx==1 ||
cambioliminfy==1 || cambiolimsupy==1)
{
/******************************************************
Se realiza el barrido en la direccion X positiva para liy
******************************************************/
for(j=liy, i=lix; i<=lsx; i++)
{
if(lix==0 && intextpl[i][j]==2)

if(i==lix && intextpl[i][j]==2)


{
while(intextpl[i][j]==2)
{
lix--; liy--; i=lix; j=liy;
cambioliminfx=1; cambioliminfy=1;
}
}
else
if(lix<i<lsx && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
liy--; j=liy; cambioliminfy=1;
}
}
else
if(i==lsx && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsx++; liy--; i=lsx; j=liy;
cambiolimsupx=1; cambioliminfy=1;
}
184
}
else cambioliminfy=0;
}
/******************************************************
Se realiza el barrido en la direccion Y positiva para lsx
******************************************************/
for(i=lsx, j=liy; j<=lsy; j++)
{
if(j==liy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsx++; liy--; i=lsx; j=liy;
cambiolimsupx=1; cambioliminfy=1;
}
}
else
if(liy<j<lsy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsx++; i=lsx;
cambiolimsupx=1;
}
}
else
if(j==lsy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsx++; lsy++; i=lsx; j=lsy;
cambiolimsupx=1; cambiolimsupy=1;
}
}
else cambiolimsupx=0;
}

/******************************************************
Se realiza el barrido en la direccion X negativa para lsy
******************************************************/
for(j=lsy, i=lsx; i>=lix; i--)
{
if(i==lsx && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsx++; lsy++; i=lsx; j=lsy;
cambiolimsupx=1; cambiolimsupy=1;
}
}
else
if(lix<i<lsx && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lsy++; j=lsy;
cambiolimsupy=1;
}
}
185
else
if(i==lix && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lix--; lsy++; i=lix; j=lsy;
cambioliminfx=1; cambiolimsupy=1;
}
}
else cambiolimsupy=0;
}

/******************************************************
Se realiza el barrido en la direccion Y negativa para lix
******************************************************/
for(i=lix, j=lsy; j>=liy; j--)
{
if(j==lsy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lix--; lsy++; i=lix; j=lsy;
cambioliminfx=1; cambiolimsupy=1;
}
}
else
if(liy<j<lsy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lix--; i=lix;
cambioliminfx=1;
}
}
else
if(j==liy && intextpl[i][j]==2)
{
while(intextpl[i][j]==2)
{
lix--; liy--; i=lix; j=liy;
cambioliminfx=1; cambioliminfy=1;
}
}
else cambioliminfx=0;
}

}/********** TERMINA EL WHILE ********************/


printf("Limites finales para la malla adaptiva en esta iteracion:\n"
"Limite inferior en X : %3d , Coordenada : %+6.4e\n"
"Limite superior en X : %3d , Coordenada : %+6.4e\n"
"Limite inferior en Y : %3d , Coordenada : %+6.4e\n"
"Limite superior en Y : %3d , Coordenada : %+6.4e\n",
lix, xp[lix], lsx, xp[lsx],liy, yp[liy], lsy, yp[lsy]);

void selec_limites2(void)
{
/********************************************
186
Variable de control para verificar si cambiaron los limites
de la region plastica.
cambioliminf = 0 : No hubo cambios de limites, se termina el proceso.
cambiolimsup = 1 : Si hubo cambios de limites, continua el proceso.
Se inicializa a 1 para iniciar el proceso iterativo.

cambioliminfx=1;
cambiolimsupx=1;
cambioliminfy=1;
cambiolimsupy=1;
********************************************/

/**************************************************
Aqui se establecen los limites inferior y superior
en cada direccion para el inicio del proceso iterativo

if(ixinic==0)
{
lix=ixinic;
lsx=ixinic+2;
}
else if(ixinic>0 && ixinic<Mx-1)
{
lix=ixinic-1;
lsx=ixinic+1;
}
else if(ixinic==Mx-1)
{
lix=ixinic-2;
lsx=ixinic;
}

if(iyinic==0)
{
liy=iyinic;
lsy=iyinic+2;
}
else if(iyinic>0 && iyinic<My-1)
{
liy=iyinic-1;
lsy=iyinic+1;
}
else
{
liy=iyinic-2;
lsy=iyinic;
}
printf("Limites iniciales para la malla adaptiva\n"
"Limite inferior en X : %3d , Coordenada : %+6.4e\n"
"Limite superior en X : %3d , Coordenada : %+6.4e\n"
"Limite inferior en Y : %3d , Coordenada : %+6.4e\n"
"Limite superior en Y : %3d , Coordenada : %+6.4e\n",
lix, xp[lix], lsx, xp[lsx],liy, yp[liy], lsy, yp[lsy]);

**************************************************/
/******************************************************
Aqui se establece el proceso iterativo para definir los limites
en cada direccion en el calculo de los esfuerzos de plasticidad.
La secuencia se realiza en el sentido de las manecillas del reloj
187
iniciando en la esquina inferior izquierda del rectangulo; es decir,
en las coordenadas del punto (xp[lix], yp[liy]).
Se evalua si el esfuerzo equivalente es superior al esfuerzo t,
Si es cierto, los limites se incrementan o decrementan en uno,
segun sea necesario y se repite el barrido.
******************************************************/
for(i=0;i<Mx;i++)
{
for(j=0;j<My;j++)
{
if(intextpl[i][j]==2)
{
if(i<lix) lix=i;
if(i>lsx) lsx=i;
if(j<liy) liy=j;
if(j>lsy) lsy=j;
}
}
}

printf("Limites finales para la malla adaptiva en esta iteracion:\n"


"Limite inferior en X : %3d , Coordenada : %+6.4e\n"
"Limite superior en X : %3d , Coordenada : %+6.4e\n"
"Limite inferior en Y : %3d , Coordenada : %+6.4e\n"
"Limite superior en Y : %3d , Coordenada : %+6.4e\n",
lix, xp[lix], lsx, xp[lsx],liy, yp[liy], lsy, yp[lsy]);

}
188
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "nr.h"
#include "nrutil.h"
#include "mandat13a.h"

extern double **esfp11, **esfp12, **esfp22, **esfp33;


extern double **Sp11, **Sp12, **Sp22, **Sp33;
extern double **eps11, **eps12, **eps22, **eps33;
extern double **deps11, **deps12, **deps22, **deps33;
extern double **esfeq, **sigmat, **epseq;
extern double **sigma11, **sigma12, **sigma22;

extern int nx, ny, **intextpl, Mx, My;

extern double cero;

extern double *zeta, *eta;


extern double **fJ11, **fJ12, **fJ21, **fJ22;
extern double **dxyJ11, **dxyJ12, **dxyJ21, **dxyJ22;
extern double *fxy, *dfx, *dfy, *dfxy;

extern FILE *fp, *fpesfpl, *fpepspl, *fpmallapl, *fpresult;


extern FILE *fps11, *fps12, *fps22;
extern FILE *fps11pl, *fps12pl, *fps22pl, *fps33pl;
extern FILE *fpe11pl, *fpe12pl, *fpe22pl, *fpe33pl;
extern FILE *fpde11pl, *fpde12pl, *fpde22pl, *fpde33pl;
extern FILE *fpSp11, *fpSp12, *fpSp22, *fpSp33;

extern char numero[4], archivo[81],


ndatgen[81], edatgen[5],
ndatesfeq[81], edatesfeq[5],
ndatepseq[81], edatepseq[5],
nmallapl[81], emallapl[5],
nresult[81], eresult[5],
ndats11[81], edats11[5],
ndats12[81], edats12[5],
ndats22[81], edats22[5],
ndats11pl[81], edats11pl[7],
ndats12pl[81], edats12pl[7],
ndats22pl[81], edats22pl[7],
ndats33pl[81], edats33pl[7],
ndate11pl[81], edate11pl[7],
ndate12pl[81], edate12pl[7],
ndate22pl[81], edate22pl[7],
ndate33pl[81], edate33pl[7],
ndatde11pl[81], edatde11pl[8],
ndatde12pl[81], edatde12pl[8],
ndatde22pl[81], edatde22pl[8],
ndatde33pl[81], edatde33pl[8],
ndatSp11pl[81], edatSp11pl[8],
ndatSp12pl[81], edatSp12pl[8],
ndatSp22pl[81], edatSp22pl[8],
ndatSp33pl[81], edatSp33pl[8];

void leematriz(FILE *archivo, double **matriz, int N, int M)


189
{
int i, j, k, l, m, n, falso;
char header[128];
div_t resultado;
resultado=div(N,10);
if(resultado.rem==0) n=resultado.quot;
else n=resultado.quot+1;
fgets(header,128,archivo);
printf("%s",header);
fgets(header,128,archivo);
printf("%s",header);
fgets(header,128,archivo);
printf("%s",header);
for(k=0;k<=n-1;k++)
{
fgets(header,128,archivo);
printf("%s",header);
fgets(header,128,archivo);
printf("%s",header);
fgets(header,128,archivo);
printf("%s",header);
fgets(header,128,archivo);
printf("%s",header);
for(j=0;j<=M-1;j++)
{
fscanf(archivo,"%d",&falso);
printf("%3d",falso);
for(i=0;i<=9;i++)
{
if(i+k*10>=N) break;
else
{
fscanf(archivo,"%f",&matriz[i+k*10][j]);
printf(" %+6.4E",matriz[i+k*10][j]);
}
}
printf("\n");
}
printf("\n\n");
}
}

void guardamatriz(FILE *archivo, double **matriz, int N, int M, char


titulo[70])
{
int i,j,k,n;
div_t resultado;
resultado=div(N,10);
if(resultado.rem==0) n=resultado.quot;
else n=resultado.quot+1;
fputs(titulo,archivo);
fputs("-----------------------------------------------\n\n",archivo);
for(k=0;k<n;k++)
{
fprintf(archivo," I ");
for(i=1;i<=10;i++)
{
if(i+k*10>N) break;
fprintf(archivo,"%8d ",i+k*10);
190
}
fprintf(archivo,"\n");
fprintf(archivo," J\n");
for(j=1;j<=M;j++)
{
fprintf(archivo,"%3d",j);
for(i=1;i<=10;i++)
{
if(i+k*10>N) break;
fprintf(archivo," %+6.4E",matriz[i+k*10][j]);
}
fprintf(archivo,"\n");
}
fprintf(archivo,"\n");
}
}

double angulo (double x1, double y1, double x2, double y2)
{
double ang;
ang=acos((x1-x2)/sqrt(pow(x1-x2,2)+pow(y1-y2,2)));
if(y1-y2<0)
return (-ang);
else
return ang;
}

char ent2alfa(int i)
{
char n;
switch(i)
{
case 0: n='0'; return n;
case 1: n='1'; return n;
case 2: n='2'; return n;
case 3: n='3'; return n;
case 4: n='4'; return n;
case 5: n='5'; return n;
case 6: n='6'; return n;
case 7: n='7'; return n;
case 8: n='8'; return n;
case 9: n='9'; return n;
}
}

void entero2alfa(int k, char *num)


{
int i, j;
double x, entero=0.0, fraccion=0.0;
for(i=2;i>=0;i--)
{
j = k%10;
num[i] = ent2alfa(j);
x = k/10.0;
fraccion = modf(x,&entero);
k = (int)(entero);
}
}
191
/*********************************************************************
FUNCION PARA CAMBIAR DE LINEA.
*********************************************************************/
void brinco(int n)
{
int i;
for(i=1;i<=n;i++)
printf("\n");
}

/*********************************************************************
FUNCION PARA MANEJO DE DATOS DE INTERPOLACION.
*********************************************************************/
void datos_interp(void)
{
int i;
fJ11=dmatrix(1,Nz,1,Ne);
fJ12=dmatrix(1,Nz,1,Ne);
fJ21=dmatrix(1,Nz,1,Ne);
fJ22=dmatrix(1,Nz,1,Ne);
dxyJ11=dmatrix(1,Nz,1,Ne);
dxyJ12=dmatrix(1,Nz,1,Ne);
dxyJ21=dmatrix(1,Nz,1,Ne);
dxyJ22=dmatrix(1,Nz,1,Ne);
fxy=dvector(1,4);
dfx=dvector(1,4);
dfy=dvector(1,4);
dfxy=dvector(1,4);

/***************************************************************
APERTURA DE LOS ARCHIVOS J11, J12, J21, J22,
dxyJ11, dxyJ12, dxyJ21, dxyJ22
****************************************************************/
archinteg("J11.dat",fJ11,Nz,Ne,"J11");
archinteg("J12.dat",fJ12,Nz,Ne,"J12");
archinteg("J21.dat",fJ21,Nz,Ne,"J21");
archinteg("J22.dat",fJ22,Nz,Ne,"J22");
archinteg("dxyJ11.dat",dxyJ11,Nz,Ne,"dxyJ11");
archinteg("dxyJ12.dat",dxyJ12,Nz,Ne,"dxyJ12");
archinteg("dxyJ21.dat",dxyJ21,Nz,Ne,"dxyJ21");
archinteg("dxyJ22.dat",dxyJ22,Nz,Ne,"dxyJ22");

/***************************************************************
DEFINICION DE LAS COORDENADAS ADIMENSIONALES zeta Y eta
PARA LAS FUNCIONES DE INTERPOLACION
****************************************************************/
zeta=dvector(1,Nz);
eta=dvector(1,Ne);
for(i=1;i<=Nz;i++)
{
zeta[i]=(i-1)*0.2-1.0;
eta[i]=(i-1)*0.2-1.0;
if(fabs(zeta[i])<=cero) zeta[i]=0.0;
if(fabs(eta[i])<=cero) eta[i]=0.0;
}
}

/****************************************************************
FUNCION PARA COPIAR LOS NOMBRES ARCHIVOS DE ALMACENAMIENTO
192
******************************************************************/
void copia_nombres_archivos(void)
{
strcpy(ndatgen, archivo); strcpy(ndatesfeq, archivo);
strcpy(ndatepseq, archivo); strcpy(nmallapl, archivo);
strcpy(nresult, archivo); strcpy(ndats11, archivo);
strcpy(ndats12, archivo); strcpy(ndats22, archivo);
strcpy(ndats11pl, archivo); strcpy(ndats12pl, archivo);
strcpy(ndats22pl, archivo); strcpy(ndats33pl, archivo);
strcpy(ndate11pl, archivo); strcpy(ndate12pl, archivo);
strcpy(ndate22pl, archivo); strcpy(ndate33pl, archivo);
strcpy(ndatde11pl, archivo); strcpy(ndatde12pl, archivo);
strcpy(ndatde22pl, archivo); strcpy(ndatde33pl, archivo);
strcpy(ndatSp11pl, archivo); strcpy(ndatSp12pl, archivo);
strcpy(ndatSp22pl, archivo); strcpy(ndatSp33pl, archivo);

strcpy(numero, "000");
}

/****************************************************************
FUNCION PARA ABRIR LOS ARCHIVOS DE ALMACENAMIENTO
******************************************************************/

void abre_archivos(void)
{

/*****************************************************************
Apertura del archivo general... *.dat
*****************************************************************/
strcat(ndatgen, numero);
strcat(ndatgen, edatgen);
if((fp=fopen(ndatgen,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatgen);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatgen);

Apertura del archivo para almacenar


los esfuerzos Sigma11 en todo el dominio... *.s11
*****************************************************************/
strcat(ndats11, numero);
strcat(ndats11, edats11);
if((fps11=fopen(ndats11,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats11);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats11);

Apertura del archivo para almacenar


los esfuerzos Sigma12 en todo el dominio... *.s12
*****************************************************************/
strcat(ndats12, numero);
strcat(ndats12, edats12);
193
if((fps12=fopen(ndats12,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats12);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats12);

Apertura del archivo para almacenar


los esfuerzos Sigma22 en todo el dominio... *.s22
*****************************************************************/
strcat(ndats22, numero);
strcat(ndats22, edats22);
if((fps22=fopen(ndats22,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats22);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats22);

Apertura del archivo para almacenar


la malla de deformacion plastica... *.net
*****************************************************************/
strcat(nmallapl, numero);
strcat(nmallapl, emallapl);
if((fpmallapl=fopen(nmallapl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",nmallapl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",nmallapl);

Apertura del archivo para almacenar


el esfuerzo equivalente... *.spl
*****************************************************************/
strcat(ndatesfeq, numero);
strcat(ndatesfeq, edatesfeq);
if((fpesfpl=fopen(ndatesfeq,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatesfeq);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatesfeq);

Apertura del archivo para almacenar


la deformacion plastica equivalente... *.epl
*****************************************************************/
strcat(ndatepseq, numero);
strcat(ndatepseq, edatepseq);
if((fpepspl=fopen(ndatepseq,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatepseq);
194
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatepseq);

Apertura del archivo para almacenar


los resultados de la solucion del sistema... *.res
*****************************************************************/
strcat(nresult, numero);
strcat(nresult, eresult);
if((fpresult=fopen(nresult,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",nresult);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",nresult);

Apertura del archivo para almacenar


los esfuerzos Sigma11 plasticos... *.s11pl
*****************************************************************/
strcat(ndats11pl, numero);
strcat(ndats11pl, edats11pl);
if((fps11pl=fopen(ndats11pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats11pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats11pl);

Apertura del archivo para almacenar


los esfuerzos Sigma12 plasticos... *.s12pl
*****************************************************************/
strcat(ndats12pl, numero);
strcat(ndats12pl, edats12pl);
if((fps12pl=fopen(ndats12pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats12pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats12pl);

Apertura del archivo para almacenar


los esfuerzos Sigma22 plasticos... *.s22pl
*****************************************************************/
strcat(ndats22pl, numero);
strcat(ndats22pl, edats22pl);
if((fps22pl=fopen(ndats22pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats22pl);
exit(0);
}
/*****************************************************************
195
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats22pl);

Apertura del archivo para almacenar


los esfuerzos Sigma33 plasticos... *.s33pl
*****************************************************************/
strcat(ndats33pl, numero);
strcat(ndats33pl, edats33pl);
if((fps33pl=fopen(ndats33pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndats33pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndats33pl);

Apertura del archivo para almacenar


las deformaciones 11 plasticas... *.e11pl
*****************************************************************/
strcat(ndate11pl, numero);
strcat(ndate11pl, edate11pl);
if((fpe11pl=fopen(ndate11pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndate11pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndate11pl);

Apertura del archivo para almacenar


las deformaciones 12 plasticas... *.e12pl
*****************************************************************/
strcat(ndate12pl, numero);
strcat(ndate12pl, edate12pl);
if((fpe12pl=fopen(ndate12pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndate12pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndate12pl);

Apertura del archivo para almacenar


las deformaciones 22 plasticas... *.e22pl
*****************************************************************/
strcat(ndate22pl, numero);
strcat(ndate22pl, edate22pl);
if((fpe22pl=fopen(ndate22pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndate22pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndate22pl);
196
Apertura del archivo para almacenar
las deformaciones 33 plasticas... *.e33pl
*****************************************************************/
strcat(ndate33pl, numero);
strcat(ndate33pl, edate33pl);
if((fpe33pl=fopen(ndate33pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndate33pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndate33pl);

Apertura del archivo para almacenar


los incrementos de deformacion 11 plastica... *.de11pl
*****************************************************************/
strcat(ndatde11pl, numero);
strcat(ndatde11pl, edatde11pl);
if((fpde11pl=fopen(ndatde11pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatde11pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatde11pl);

Apertura del archivo para almacenar


los incrementos de deformacion 12 plastica... *.de12pl
*****************************************************************/
strcat(ndatde12pl, numero);
strcat(ndatde12pl, edatde12pl);
if((fpde12pl=fopen(ndatde12pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatde12pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatde12pl);

Apertura del archivo para almacenar


los incrementos de deformacion 22 plastica... *.de22pl
*****************************************************************/
strcat(ndatde22pl, numero);
strcat(ndatde22pl, edatde22pl);
if((fpde22pl=fopen(ndatde22pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatde22pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatde22pl);

Apertura del archivo para almacenar


los incrementos de deformacion 33 plastica... *.de33pl
*****************************************************************/
197
strcat(ndatde33pl, numero);
strcat(ndatde33pl, edatde33pl);
if((fpde33pl=fopen(ndatde33pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatde33pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatde33pl);

Apertura del archivo para almacenar Sp11... *.Sp11pl


*****************************************************************/
strcat(ndatSp11pl, numero);
strcat(ndatSp11pl, edatSp11pl);
if((fpSp11=fopen(ndatSp11pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatSp11pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatSp11pl);

Apertura del archivo para almacenar Sp12... *.Sp12pl


*****************************************************************/
strcat(ndatSp12pl, numero);
strcat(ndatSp12pl, edatSp12pl);
if((fpSp12=fopen(ndatSp12pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatSp12pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatSp12pl);

Apertura del archivo para almacenar Sp22... *.Sp22pl


*****************************************************************/
strcat(ndatSp22pl, numero);
strcat(ndatSp22pl, edatSp22pl);
if((fpSp22=fopen(ndatSp22pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatSp22pl);
exit(0);
}
/*****************************************************************
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatSp22pl);

Apertura del archivo para almacenar Sp33... *.Sp33pl


*****************************************************************/
strcat(ndatSp33pl, numero);
strcat(ndatSp33pl, edatSp33pl);
if((fpSp33=fopen(ndatSp33pl,"w"))==NULL)
{
printf("\nNo se puede abrir el archivo %s\n",ndatSp33pl);
exit(0);
}
198
/*
else
printf("El archivo %s se abrio satisfactoriamente.\n",ndatSp33pl);
*/
}

/****************************************************************
FUNCION PARA EL ALMACENAMIENTO DE LOS RESULTADOS
******************************************************************/

void guarda_resultados(void)
{

int i, j;

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA11
******************************************************************/

fprintf(fps11,"ESFUERZO SIGMA11\n\n");
for(j=ny;j>=1;j--)
{
for(i=1;i<=nx;i++)
fprintf(fps11,"%+6.4E ",sigma11[i][j]);
fprintf(fps11,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA12
******************************************************************/

fprintf(fps12,"ESFUERZO SIGMA12\n\n");
for(j=ny;j>=1;j--)
{
for(i=1;i<=nx;i++)
fprintf(fps12,"%+6.4E ",sigma12[i][j]);
fprintf(fps12,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA22
******************************************************************/

fprintf(fps22,"ESFUERZO SIGMA22\n\n");
for(j=ny;j>=1;j--)
{
for(i=1;i<=nx;i++)
fprintf(fps22,"%+6.4E ",sigma22[i][j]);
fprintf(fps22,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO EQUIVALENTE
******************************************************************/

fprintf(fpesfpl,"ESFUERZO EQUIVALENTE\n\n");
for(j=My-1;j>=0;j--)
{
199
for(i=0;i<Mx;i++)
fprintf(fpesfpl,"%+6.4E ",esfeq[i][j]);
fprintf(fpesfpl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION PLASTICA EQUIVALENTE
******************************************************************/

fprintf(fpepspl,"DEFORMACION PLASTICA EQUIVALENTE\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpepspl,"%+6.4E ",epseq[i][j]);
fprintf(fpepspl,"\n");
}

brinco(1);

/*******************************************************
ALMACENAMIENTO EN ARCHIVO DE LA REPRESENTACION DE LA DEFORMACION PLASTICA

fprintf(fpmallapl,"REPRESENTACION DE LA DEFORMACION PLASTICA\n\n");


********************************************************/

for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
{
if(intextpl[i][j]==1)
fprintf(fpmallapl,"-");
else if(intextpl[i][j]==2)
fprintf(fpmallapl,"#");
else
fprintf(fpmallapl," ");
}
fprintf(fpmallapl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA11 PLASTICO
******************************************************************/

fprintf(fps11pl,"ESFUERZO PLASTICO SIGMA11\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fps11pl,"%+6.4E ",esfp11[i][j]);
fprintf(fps11pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA12 PLASTICO
******************************************************************/

fprintf(fps12pl,"ESFUERZO PLASTICO SIGMA12\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
200
fprintf(fps12pl,"%+6.4E ",esfp12[i][j]);
fprintf(fps12pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA22 PLASTICO
******************************************************************/

fprintf(fps22pl,"ESFUERZO PLASTICO SIGMA22\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fps22pl,"%+6.4E ",esfp22[i][j]);
fprintf(fps22pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL ESFUERZO PLASTICO SIGMA33 PLASTICO
******************************************************************/

fprintf(fps33pl,"ESFUERZO SIGMA33\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fps33pl,"%+6.4E ",esfp33[i][j]);
fprintf(fps33pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS11 PLASTICA
******************************************************************/

fprintf(fpe11pl,"DEFORMACION PLASTICA 11\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpe11pl,"%+6.4E ",eps11[i][j]);
fprintf(fpe11pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS12 PLASTICA
******************************************************************/

fprintf(fpe12pl,"DEFORMACION PLASTICA 12\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpe12pl,"%+6.4E ",eps12[i][j]);
fprintf(fpe12pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS22 PLASTICA
******************************************************************/

fprintf(fpe22pl,"DEFORMACION PLASTICA 22\n\n");


for(j=My-1;j>=0;j--)
{
201
for(i=0;i<Mx;i++)
fprintf(fpe22pl,"%+6.4E ",eps22[i][j]);
fprintf(fpe22pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS33 PLASTICA
******************************************************************/

fprintf(fpe33pl,"DEFORMACION PLASTICA 33\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpe33pl,"%+6.4E ",eps33[i][j]);
fprintf(fpe33pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS11 PLASTICA
******************************************************************/

fprintf(fpde11pl,"INCREMENTO DE DEFORMACION PLASTICA 11\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpde11pl,"%+6.4E ",deps11[i][j]);
fprintf(fpde11pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS12 PLASTICA
******************************************************************/

fprintf(fpde12pl,"INCREMENTO DE DEFORMACION PLASTICA 12\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpde12pl,"%+6.4E ",deps12[i][j]);
fprintf(fpde12pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS22 PLASTICA
******************************************************************/

fprintf(fpe22pl,"INCREMENTO DE DEFORMACION PLASTICA 22\n\n");


for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpde22pl,"%+6.4E ",deps22[i][j]);
fprintf(fpde22pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS33 PLASTICA
******************************************************************/

fprintf(fpe33pl,"INCREMENTO DE DEFORMACION PLASTICA 33\n\n");


for(j=My-1;j>=0;j--)
202
{
for(i=0;i<Mx;i++)
fprintf(fpde33pl,"%+6.4E ",deps33[i][j]);
fprintf(fpde33pl,"\n");
}

/****************************************************************
ALMACENAMIENTO DE SP11
******************************************************************/

fprintf(fpSp11,"Sp11\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpSp11,"%+6.4E ",Sp11[i][j]);
fprintf(fpSp11,"\n");
}

/****************************************************************
ALMACENAMIENTO DE SP12
******************************************************************/

fprintf(fpSp12,"Sp12\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpSp12,"%+6.4E ",Sp12[i][j]);
fprintf(fpSp12,"\n");
}

/****************************************************************
ALMACENAMIENTO DE SP22
******************************************************************/

fprintf(fpSp11,"Sp11\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpSp22,"%+6.4E ",Sp22[i][j]);
fprintf(fpSp22,"\n");
}

/****************************************************************
ALMACENAMIENTO DE SP33
******************************************************************/

fprintf(fpSp33,"Sp33\n\n");
for(j=My-1;j>=0;j--)
{
for(i=0;i<Mx;i++)
fprintf(fpSp33,"%+6.4E ",Sp33[i][j]);
fprintf(fpSp33,"\n");
}

}
203
void dbcucof(double y[], double y1[], double y2[], double y12[], double d1,
double d2,
double **c)
{
static int wt[16][16]=
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
-3,0,0,3,0,0,0,0,-2,0,0,-1,0,0,0,0,
2,0,0,-2,0,0,0,0,1,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,-3,0,0,3,0,0,0,0,-2,0,0,-1,
0,0,0,0,2,0,0,-2,0,0,0,0,1,0,0,1,
-3,3,0,0,-2,-1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-3,3,0,0,-2,-1,0,0,
9,-9,9,-9,6,3,-3,-6,6,-6,-3,3,4,2,1,2,
-6,6,-6,6,-4,-2,2,4,-3,3,3,-3,-2,-1,-1,-2,
2,-2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,-2,0,0,1,1,0,0,
-6,6,-6,6,-3,-3,3,3,-4,4,2,-2,-2,-2,-1,-1,
4,-4,4,-4,2,2,-2,-2,2,-2,-2,2,1,1,1,1};
int l,k,j,i;
double xx,d1d2,cl[16],x[16];

d1d2=d1*d2;
for (i=1;i<=4;i++) {
x[i-1]=y[i];
x[i+3]=y1[i]*d1;
x[i+7]=y2[i]*d2;
x[i+11]=y12[i]*d1d2;
}
for (i=0;i<=15;i++) {
xx=0.0;
for (k=0;k<=15;k++) xx += wt[i][k]*x[k];
cl[i]=xx;
}
l=0;
for (i=1;i<=4;i++)
for (j=1;j<=4;j++) c[i][j]=cl[l++];
}
/* (C) Copr. 1986-92 Numerical Recipes Software 6)#41221^21. */
204
#define NRANSI
#include "nrutil.h"

void dbcuint(double y[], double y1[], double y2[], double y12[], double x1l,
double x1u, double x2l, double x2u, double x1, double x2, double *ansy,
double *ansy1, double *ansy2)
{
void dbcucof(double y[], double y1[], double y2[], double y12[], double
d1,
double d2, double **c);
int i;
double t,u,d1,d2,**c;

c=dmatrix(1,4,1,4);
d1=x1u-x1l;
d2=x2u-x2l;
dbcucof(y,y1,y2,y12,d1,d2,c);
if (x1u == x1l || x2u == x2l) nrerror("Bad input in routine bcuint");
t=(x1-x1l)/d1;
u=(x2-x2l)/d2;
*ansy=(*ansy2)=(*ansy1)=0.0;
for (i=4;i>=1;i--) {
*ansy=t*(*ansy)+((c[i][4]*u+c[i][3])*u+c[i][2])*u+c[i][1];
*ansy2=t*(*ansy2)+(3.0*c[i][4]*u+2.0*c[i][3])*u+c[i][2];
*ansy1=u*(*ansy1)+(3.0*c[4][i]*t+2.0*c[3][i])*t+c[2][i];
}
*ansy1 /= d1;
*ansy2 /= d2;
free_dmatrix(c,1,4,1,4);
}
#undef NRANSI
/* (C) Copr. 1986-92 Numerical Recipes Software 6)#41221^21. */
205
#include <math.h>
#define NRANSI
#include "nrutil.h"

double dpythag(double a, double b)


{
double absa,absb;
absa=fabs(a);
absb=fabs(b);
if (absa > absb) return absa*sqrt(1.0+DSQR(absb/absa));
else return (absb == 0.0 ? 0.0 : absb*sqrt(1.0+DSQR(absa/absb)));
}
#undef NRANSI
/* (C) Copr. 1986-92 Numerical Recipes Software .2#. */
206
#include <math.h>
#define NRANSI
#include "nrutil.h"
#define TINY 1.0e-20;

void dludcmp(double **a, int n, int *indx, double *d)


{
int i,imax,j,k;
double big,dum,sum,temp;
double *vv;

vv=dvector(1,n);
*d=1.0;
for (i=1;i<=n;i++) {
big=0.0;
for (j=1;j<=n;j++)
if ((temp=fabs(a[i][j])) > big) big=temp;
if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
vv[i]=1.0/big;
}
for (j=1;j<=n;j++) {
for (i=1;i<j;i++) {
sum=a[i][j];
for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
a[i][j]=sum;
}
big=0.0;
for (i=j;i<=n;i++) {
sum=a[i][j];
for (k=1;k<j;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (dum=vv[i]*fabs(sum)) >= big) {
big=dum;
imax=i;
}
}
if (j != imax) {
for (k=1;k<=n;k++) {
dum=a[imax][k];
a[imax][k]=a[j][k];
a[j][k]=dum;
}
*d = -(*d);
vv[imax]=vv[j];
}
indx[j]=imax;
if (a[j][j] == 0.0) a[j][j]=TINY;
if (j != n) {
dum=1.0/(a[j][j]);
for (i=j+1;i<=n;i++) a[i][j] *= dum;
}
}
free_dvector(vv,1,n);
}
#undef TINY
#undef NRANSI
/* (C) Copr. 1986-92 Numerical Recipes Software 6)#41221^21. */
207
void dlubksb(double **a, int n, int *indx, double b[])
{
int i,ii=0,ip,j;
double sum;

for (i=1;i<=n;i++) {
ip=indx[i];
sum=b[ip];
b[ip]=b[i];
if (ii)
for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
else if (sum) ii=i;
b[i]=sum;
}
for (i=n;i>=1;i--) {
sum=b[i];
for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
b[i]=sum/a[i][i];
}
}
/* (C) Copr. 1986-92 Numerical Recipes Software 6)#41221^21. */

También podría gustarte