Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DocsTec 6988 PDF
DocsTec 6988 PDF
Agradecimientos
Agradezco fervientemente al Dr. Serguei Kanaoun por todo el apoyo que m e brindo desde que
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
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
Agradezco de forma especial al Dr. Pedro Grasa Soler, por su apoyo incondicional para que
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
"...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
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."
Resumen
problemas:
2. El segundo problema de elasticidad estático de cuerpos homogéneos con grieta en dos di¬
mensiones,
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
cuyos valores se pueden guardar fácilmente en la memoria de la computadora para ser utilizados
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¬
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
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
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
Contenido
Lista de figuras 11
1 Introducción 14
2 Funciones de aproximación 24
3.2 Acción de los operadores del problema sobre las funciones de Gauss 32
Caso plano 35
3.6 Conclusiones 56
isotropico bilineal 63
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.5 Conclusiones 78
5.3.1 Conclusiones 86
6 Conclusiones 88
Bibliografía 90
10
A.1.1 Base E 93
A.1.2 Base P 95
A.1.3 Base θ 97
C.2.2 Orden superior para suavizar la función mediante interpolación bicúbica 110
Lista de figuras
( i ) ( i )
Fig. 3.4 Bases global ( e , e ) y local ( s , n
1 2 ) de un área plana Ωcon frontera T 36
concentradas 47
concentradas 47
Fig. 3.12 Error R ( x ) de la sol. numérica de una grieta recta en un plano infinito 48
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
ANSYS 64
por lado 77
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
1 Introducción
Actualmente sabemos que si no existieran las técnicas numéricas, sería casi imposible resolver
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
solución numérica se hace más precisa, pero el costo del tiempo de cómputo puede ser prohibitivo.
de ingeniería prácticos porque no hay una respuesta clara a la pregunta ¿ Q u é tan pequeñas deben
Por lo anterior es importante revisar y comparar las diferentes técnicas numéricas que se han
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),
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
En este método, las derivadas en las ecuaciones diferenciales parciales que gobiernan el fenó¬
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
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
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
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
obtener buena precisión en regiones donde los valores de las variables cambian rápidamente se
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
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
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
Hay un número de métodos sin malla, tales como el método de Galerkin libre de elementos (EFG)
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
comunidad.
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.
• 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
La realidad es que los métodos sin malla desarrollados hasta ahora no son realmente ideales, y
• 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
• 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
• 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
• 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
frontera. Además, la predefinición de las partículas todavía requiere técnicamente una cierta
clase de malla.
19
cos, lineales o no lineales de sólidos y estructuras, así como de flujos de fluidos. L a mayoría de los
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
2. Durante los cálculos, los esfuerzos obtenidos son discontinuos y menos exactos usando los
paquetes de F E M .
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
para permitir que las líneas nodales sigan siendo coincidentes con las fronteras de la discon¬
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
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
8. L o s F D M trabajan muy bien para una gran cantidad de problemas, especialmente para solu¬
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,
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
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
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¬
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¬
generación convencional de una malla puede ser disminuído. Esto se puede traducir en ahorros
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
de la matriz del sistema de ecuaciones lineales obtenido después de la discretización del problema
frontera. E n lugar de eso, utiliza las coordenadas de un número finito de puntos en la frontera y la
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
Por lo descrito anteriormente podemos establecer que esta tesis tiene como meta fundamental
cuerpos homogéneos con grietas y/o inclusiones y de plasticidad. Para alcanzar esta meta se tienen
ticidad de cuerpos homogéneos sin y con grieta, comprobando su aplicabilidad con algunos
2 Funciones de aproximació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
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.
Con diferentes valores del parámetro D > 0. Las figuras (2.4, 2.5) muestran las gráficas de fD
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.
Para explicar rigurosamente las peculiaridades de las gráficas, consideremos la serie de Fourier de
la función
(2.1)
(2.2)
(2.3)
27
(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
aritmética de las computadoras modernas; es decir, en estos casos donde la función θ (x, D) es
que cualquier tolerancia positivo prescrita ε, escogiendo D suficientemente grande. Para ello es
s u i c i e n t e considerar
Nota. L a función θestá fuertemente conectada con la función Teta de Jacobi V3, que está definida
c o m o [17]
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
(3.1)
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)
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
(3.3)
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].
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
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]
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 )
- 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)
medio. Para el problema plano, N toma una de las formas siguientes, según sea el caso:
0
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
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
- 3
T (x, x ' ) ~ |x ̶ x ' | cuando x' →x
31
la ecuación (3.14) . Se demuestra en [20, 24], que la integral en la ecuación (3.14) se puede
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
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
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
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
(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
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
(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
Gauss
Para la solución numérica de la ecuación integral (3.14) utilizaremos la clase especial de funciones
coordenada x en la región — ∞ < x < ∞. Esta función se puede aproximar mediante las series
siguientes
(3.19)
entre los nodos, D es un parámetro adimensional. E s posible demostrar, de acuerdo con [21, 14],
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
(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
Gauss
Para la solución numérica de la ecuación integral (3.14) utilizaremos la clase especial de funciones
coordenada x en la región — ∞ < x < ∞. Esta función se puede aproximar mediante las series
siguientes
(3.19)
entre los nodos, D es un parámetro adimensional. E s posible demostrar, de acuerdo con [21, 14],
Así, el error de aproximación R (x), ecuación (3.20), depende de dos parámetros: la dispersión D
particulares.
x < 1; es decir,
(3.21)
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),
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.
u (x) = (3.22)
R (x) = u (x) — u ( x ) ,
h uh (x) = (x — m h )
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,
El análisis detallado de la aproximación (3.19) se presenta en los trabajos de M a z ' y a [21, 14, 15].
Consideremos un cuerpo isotrópico homogéneo que ocupa una área plana Ωcon frontera Γ, como
frontera para esta área se puede determinar a partir de las ecuaciones (3.13, 3.14). L a ecuación
(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
(3.24)
donde γ (x, y) es la función delta concentrada sobre la línea tangente γ . D e acuerdo a la aproxi
i 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)
(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 Γ.
( i )
I (s,z) = S (s-s',z) •n φ (s') ds'. (3.28)
La integral en la ecuación (3.28) se puede reescribir c o m o la integral sobre todo el plano infinito
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
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
Los tensores E , E 1 5 ( m ) y E ( m ) en esta ecuación tienen los componentes siguientes (ver Apéndice
6
A)
(3.33)
(3.34)
donde
(i) ( i )
Aquí s , n son los vectores unitarios sobre los ejes s y z, respectivamente, y
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
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)
( 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
La conección entre las bases locales entre los nodos i-ésimo y j - é s i m o tiene la forma
(3.43)
40
La expresión (3.26) para el tensor de esfuerzos en un punto arbitrario x del medio es aproximada
(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
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 .
(i) ( i ) ( i ) ( i ) ( i )
f = f s s + f n n , (3.47)
41
(3.48)
(3.49)
(ij) ( i ) ( j ) ( i ) (j)
r s = (x - x ) cos(β ) + ( y
j - y) sin ( β ) ,
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
Introduzcamos u n vector columna X para las incógnitas que están conectadas con los compo-
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
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
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.
Para evaluar la capacidad del método numérico propuesto, lo aplicaremos a los dos problemas
σ0 = e 1 x e1 (3.55)
n • σ| = 0.
r (3.56)
42
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.
Para evaluar la capacidad del método numérico propuesto, lo aplicaremos a los dos problemas
σ0 = e 1 x e1 (3.55)
n • σ| = 0.
r (3.56)
43
La ecuación integral para el vector b (x) se puede expresar a partir de las condiciones de frontera
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).
con componentes
Entonces, la solución exacta del c a m p o de esfuerzos en el medio está representado por la ecuación
En las figuras (3.6, 3.7), la solución exacta (3.59) (línea sólida) es comparada con la solución
distribución exacta, σ 11 (0, y), que de acuerdo con la ecuación (3.60), tiene la forma
(3.61)
Se puede observar que para M = 80, las soluciones numérica y exacta prácticamente coinciden.
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
(3.62)
repite
y la ecuación para el vector b (x) se obtiene a partir de las condiciones de frontera, y tiene la
Para la solución numérica, las fuerzas concentradas aplicadas en los puntos de frontera para los
(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.
tan en las figuras (3.10, 3.11). Las líneas sólidas representan a las soluciones exactas; las líneas
error de la solución numérica es esencial solamente en una pequeña vecindad de los puntos de
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
Para la solución numérica, las fuerzas concentradas aplicadas en los puntos de frontera para los
(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.
tan en las figuras (3.10, 3.11). Las líneas sólidas representan a las soluciones exactas; las líneas
error de la solución numérica es esencial solamente en una pequeña vecindad de los puntos de
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.11: Distribución de σ (y) en el disco sujeto a dos fuerzas de compresión concentradas.
11
(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.
b (x) = b (x) n ,
0 0 b0 (x) = (3.65)
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.
(3.66)
(3.67)
(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
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)
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
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
(3.71)
Aquí, h a es la distancia entre los nodos auxiliares. Para una buena aproximación de b (x), el
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
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
(3.70). E n realidad, esta potencia no es muy grande y podemos escoger las coordenadas de estos
(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
0 0 0
σ =
11 σ = 12 0, σ 22 = 1.
51
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
donde la primera integral se reliza sobre la línea de la grieta Γ y la segunda integral sobre el borde c
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
( e , e ) es aproximado por las ecuaciones obtenidas a partir de las ecuaciones (3.72, 3.45, 3.48)
1 2
(3.78)
donde
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
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
c
B X kl l = F , k k = 1, 2 , . . . , 2 M . (3.80)
(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 .
( 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
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
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
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
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
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
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
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
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
Los métodos desarrollados para determinar las relaciones no lineales entre los esfuerzos y las
• Plasticidad independiente del tiempo. Está caracterizado por la deformación instantanea ir¬
• Plasticidad dependiente del tiempo. Ocurre cuando las deformaciones plásticas se desarrollan
del tiempo. El marco del tiempo para el ondulamiento generalmente es mayor que en el caso
amiento.
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).
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
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
plástica de los materiales. H a y tres ingredientes en la teoría de plasticidad independiente del tiem
Criterio de cedencia
o cedencia. Para esfuerzos multicomponentes, este está representado como una función de los
σe = f ( σ ) (4.2)
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
(4.1). Las superficies mostradas son conocidas como superficies de cedencia y cualquier estado
plásticas.
60
La regla del l u j o determina la dirección de las deformaciones plásticas y está dado por
(4.3)
donde:
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¬
Regla de endurecimiento
siva, por lo que las condiciones (i.e. estados de esfuerzos) se pueden establecer para condiciones
tamaño conforme se desarrollan las deformaciones plásticas. Para materiales con comportamien¬
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
damente.
La regla de endurecimiento establece que el critero de cedencia cambia con el endurecimiento por
F (σ, K, A) = 0 (4.4)
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
(4.6)
esfuerzo-deformación
e l
dσ = D ε
el pl
donde D = matriz de esfuerzo-deformación y con d ε = dε — ε . La magnitud del incremento
Implementación
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 .
4. Si el esfuerzo excede el punto de cedencia del material, entonces se procede a calcular los
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 ε .
Estas opciones utilizan el criterio de cedencia de von Mises con los correspondientes regla de l u j o
(4.7)
64
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-
NOTA: Esta ley es la que se utiliza para comparar las soluciones del M é t o d o de Puntos de Frontera
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.
T
donde s es el vector de esfuerzo deviatórico s = σ̶ σ [ 1
m 1 1 0 0 0 ] , σm es el esfuerzo
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
Debido a que la deformación plástica equivalente depende de la historia de la carga, esta se calcula
como
ciones integrales
Consideremos un cuerpo que ocupa la región Ωen el espacio tridimensional y que tiene una
entonces el material comienza a ceder, siendo este el criterio de cedencia requerido para el cálculo
Debido a que la deformación plástica equivalente depende de la historia de la carga, esta se calcula
como
ciones integrales
Consideremos un cuerpo que ocupa la región Ωen el espacio tridimensional y que tiene una
El material del cuerpo es homogéneo e isotrópico con tensor módulo elástico C . El sistema de
p
Aquí, σes el tensor esfuerzos, εe es el tensor deformación elástica, ε es el tensor deformación
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
(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)
(4.12a)
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)
minar a partir de
(4.14)
σ (x) t o m a la forma
33
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)
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
(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
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.
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)
( D = 2).
Utilizando la aproximación dada por la ecuación (4.21), la primera integral del lado derecho de la
(4.23)
Γ ( i )
donde el tensor S ( x ̶ x ) es una combinación de funciones estandar, n
i = n ( x ) es el vector
i
(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.
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)
( D = 2).
Utilizando la aproximación dada por la ecuación (4.21), la primera integral del lado derecho de la
(4.23)
Γ ( i )
donde el tensor S ( x ̶ x ) es una combinación de funciones estandar, n
i = n ( x ) es el vector
i
(4.24)
69
donde
(4.25)
(4.26)
(4.27)
S(k)=- 4 μ 0 N 0[E - 2 E ( m ) + E ( m ) ] ;
1 5 6
(4.28)
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|
(4.31)
70
p
Por lo tanto, las ecuaciones de aproximación para el tensor esfuerzos de plasticidad, σ , en la
(4.32)
con i,j — 1, 2 y
(4.33)
s
Aquí, r —
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
en la placa.
(4.34)
70
p
Por lo tanto, las ecuaciones de aproximación para el tensor esfuerzos de plasticidad, σ , en la
(4.32)
con i,j — 1, 2 y
(4.33)
s
Aquí, r —
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
en la placa.
(4.34)
71
(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:
p
• Estado de deformaciones planas: Σ 33 —V(Σ 1 1 + Σ ) — Eε
22 33 .
72
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
(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:
placa es
(4.43)
73
(4.44)
(4.45)
(4.46)
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
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)
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
5. El proceso se repite a partir del paso 1, mientras la deformación plástica no rebase un valor
El método numérico fue aplicado a una placa rectangular con un corte triangular en un borde
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
que la precisión de los resultados numéricos mejora conforme el número de nodos de la malla
nodos no mejora la precisión más alla de M = 81 nodos por lado. L a comparación de esfuerzos
Se puede observar que la precisión no mejora sustancialmente cuando la malla se incrementa más
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 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.
Para validar los resultados obtenidos con el M é t o d o de Puntos de Frontera, se utilizó el progra
propiedades del material especificadas anteriormente, se utilizó la ley de endurecimiento dada por
Fig. 4.9: Comparación de εsobre la linea B para mallas con 2 1 , 4 1 , 61 y 81 nodos por lado.
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
condición de que su distancia debe ser equivalente a la distancia entre nodos de la malla plástica.
78
4.5 Conclusiones
En este estudio hemos aplicado funciones de aproximación gaussianas para el cálculo del campo
lados, y sometida a cargas de tensión en la dirección vertical. H e m o s mostrado que las integrales
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
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
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
4.5 Conclusiones
En este estudio hemos aplicado funciones de aproximación gaussianas para el cálculo del campo
lados, y sometida a cargas de tensión en la dirección vertical. H e m o s mostrado que las integrales
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
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
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
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
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
Consideremos un cuerpo elástico que ocupa una región Ωcon frontera cerrada Γen el espacio 3D
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á
iwt
F ( x , t ) = f (x) e , (5.1)
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
(5.2)
(5.3)
80
(5.4)
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¬
La ecuación integral para el vector b (x) se obtiene de las condiciones de frontera y tiene la forma
(5.6)
con
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
σ(x) • n (x)| Γ = 0.
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
(5.8)
donde δ(Γ) es la función delta concentrada sobre el contorno Γ y la integración se realiza sobre
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
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
(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¬
( 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
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 = ,
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
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
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
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
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
del vector β, están relacionadas con los factores de intensidad de esfuerzos, ecuaciones (3.67), es
85
decir
(5.14)
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
m 2 ... m - 1
B (x) = a 1 + a x + a x 2 3 + +a x
m , (5.15)
(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
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
| 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
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
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
6 Conclusiones
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
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
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¬
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¬
neos sin grieta y con grieta, así como al problema de plasticidad en 2D.
problemas de elasticidad, estática y dinámica, asi como al problema de plasticidad, para cuerpos
homogéneos bidimensionales.
para los problemas de elasticidad tanto estática como dinámica, demuestran que el método se
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
cuadrada cerca de la punta de la grieta, en donde las deformaciones plásticas son aproximadas
Bibliografía
[1] Brebbia, C. A., Telles, J. C. F., y Wrobel, L. C., "Boundary Element Techniques", Springer-
[2] Belytschko, T., Lu, y Y, y Gu, L., "Element-free Galerkin methods", Int. J. Numer. Methods
[3] Atluri, S. N . y Zhu, T., " A n e w meshless local Petrov-Galerkin ( M L P G ) approach in compu-
[4] Liu, G. R. y Gu, Y. T., " A point interpolation method", en Proc. 4th Asia-PaciGc Conference
[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-
[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.
1096, 1999.
[10] Xu, X. G. y Liu, G. R., " A local-function approximation method for simulating two-dimensional
[11] Cheng, M . y Liu, G. R., " A finite point method for analysis of fluid flow", en Proceedings
[12] V. M a z ' y a , "Boundary point method", Technical Report No. LiTH-MATR-91-44, Dept. of
[13] V. M a z ' y a , " A n e w approximation method and its applications to the calculation of volume
[14] M a z ' y a V., "Approximate approximation", The Mathematics of Finite Elements and Ap-
[15] V. M a z ' y a y G. Schmidt, " O n approximate approximations using Gausian kernels", IMA
York, 1968.
[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
[21] M a z ' y a V., " A n e w approximation method and its applications to the calculation of volume
[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.
[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
[28] A. C. Eringen y E. S. Suhubi, "Elastodynamics", Vol. II, Academic Press, NY, 1975.
93
Apéndice A
Tensores de cuarto orden especiales
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
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
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
(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
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β
θaβ = δ aβ - m m
a β (A.5)
Además, la base P consiste de seis tensores que están representados por las expresiones
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
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)
(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)
(A.11)
con
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
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)
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
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
tema de ecuaciones lineales original. esto puede ocurrir facilmente si el sistema de ecuaciones
ciones lineales están enfocados en la detección y/o corrección de estas dos patologías. A u n q u e
pueden aplicar los principios siguientes: Los sistemas de ecuaciones lineales con N tan grande
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
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¬
A •x = b (C.2)
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.
Para invertir una matriz, la eliminación de Gauss-Jordan es tan eficiente como cualquier otro
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.
como el método de solución, aunque es un buen método directo, comprensible, sólido y excep-
Se ubica entre los esquemas de eliminación completa tal como el Gauss-Jordan, y los esquemas
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
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
¿Pero cómo determinamos los valores del vector incógnita x ? En el sistema (C.4) la última
(C.5)
(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
eliminación Gaussiana son efectuados sólamente veces (ya que sólo la mitad de la matriz
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
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)
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
A m b o s métodos comparten la desventaja de que todos los vectores del lado derecho deben ser
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)
A • x = (L • U ) • x = L • ( U • x ) = b (C.10)
L •y = b (C.11)
U •x = y (C.12)
La ventaja de dividir un sistema de ecuaciones lineales en dos sistemas con los cuales realizar
trivial, como se puede comprobar con la ecuación (C.7). Entonces, la ecuación (C.11) se puede
(C.13)
mientras que la ecuación (C.12) se puede resolver mediante substitución hacia atrás, exactamente
(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 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
es la siguiente:
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
arbitrariamente y luego resolver el sistema para las otras incógnitas. E n efecto, siempre es posible
tomar
Primero, para i = 1 , 2 , . . . , j , se usan las ecuaciones (C.15, C.16 y C.18) para determinar
(C.19)
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
(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
una malla n-dimensional de valores tabulados y y n vectores n-dimensionales que contienen los
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
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
(a) (b)
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)
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.
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
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
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
2. Substituir las cij en las fórmulas bicúbicas siguientes para la función y sus derivadas,
(C.27)
Apéndice D
*******************************************************************/
#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];
/*************************************************************************/
/*************************************************************************
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;
/**************************************************************************
Definicion de las fronteras (region) (DREGION),
puntos de frontera (elemento) (DELEMENTO) y
Cargas externas (fuerza) (DVECTOR2D)
**************************************************************************/
DREGION *region;
DELEMENTO *elemento;
/************************************************************************
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
/*********************************************************************
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;
/***************************************************************
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);
/*****************************************************************
*****************************************************************/
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.-
***************************************************************/
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.-
*****************************************************************/
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.-
*****************************************************************/
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.-
****************************************************************/
/***************************************************************
ABRIENDO LOS ARCHIVOS PARA EL ALMACENAMIENTO DE LA INFORMACION...
****************************************************************/
copia_nombres_archivos();
entero2alfa(k, numero);
abre_archivos();
/*******************************************************
PASO 5.-
*******************************************************/
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
****************************************************************/
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.-
****************************************************************/
/***************************************************************
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]);
/*******************************************************
time(&t1);
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.-
***********************************************************/
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]);
}
}
}
/*******************************************************
PASO 9.-
*******************************************************/
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.-
*******************************************************/
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;
/*******************************************************
PASO 11.-
*******************************************************/
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();
/**********************************************************
***********************************************************/
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];
}
}
/*******************************************************
*******************************************************/
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
/*******************************************************
*******************************************************/
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);
}
/******************************************************
*******************************************************/
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.-
****************************************************************/
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.-
*******************************************************/
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.-
*******************************************************/
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);
/*******************************************************
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;
************************************************************/
}
/***********************************************************
***********************************************************/
/*******************************************************
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];
/*************************************************************************/
/*********************************************************************
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);
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",®ion[i].xinic);
printf("Y inicial= "); scanf("%lf",®ion[i].yinic);
printf("X final= "); scanf("%lf",®ion[i].xfin);
printf("Y final= "); scanf("%lf",®ion[i].yfin);
printf("Num de puntos frontera en la grieta %3d = ",i+1);
scanf("%d",®ion[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",®ion[i].xinic);
printf("Y inicial= "); scanf("%lf",®ion[i].yinic);
printf("X final= "); scanf("%lf",®ion[i].xfin);
printf("Y final= "); scanf("%lf",®ion[i].yfin);
138
printf("Num de puntos frontera en la region %3d = ",i+1);
scanf("%d",®ion[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",®ion[i].xinic);
printf("Y inicial= "); scanf("%lf",®ion[i].yinic);
printf("X del centro del arco= "); scanf("%lf",®ion[i].xcent);
printf("Y del centro del arco= "); scanf("%lf",®ion[i].ycent);
printf("Angulo del arco (Grados)= ");
scanf("%lf",®ion[i].arco);
printf("Num de puntos frontera en la region %3d = ",i+1);
scanf("%d",®ion[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",®ion[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",®ion[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",®ion[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",®ion[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);
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;
}
#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];
/*************************************************************************/
/*********************************************************************
DEFINICION DE LAS CARGAS EXTERNAS AL MODELO
*********************************************************************/
void fuerzas(DVECTOR2D *fuerza, double deltafuerza)
{
int i,seleccion;
int liminf,limsup;
extern double fs,fn;
145
/*********************************************************************
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
{
}
}
/*********************************************************************
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];
/*************************************************************************/
/*******************************************************
Funciones generales
*******************************************************/
/* Semi-longitud de la grieta */
double l()
{
return fabs(region[0].xfin-region[0].xinic)/2.0;
}
double b0(double x)
{
double L;
L=l();
return sqrt(L*L-x*x);
}
/**************************************************************
METODO DE PUNTOS DE FRONTERA
****************************************************************/
/***************************************************************
Funciones basicas
****************************************************************/
/***************************************************************
Funciones basicas: Para las Integrales
/******************************************************
Integrales de las funciones basicas
/******************************************************
Interpolacion de las funciones basicas
********************************************************/
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;
}
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;
}
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;
}
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
*******************************************************/
/******************************************************************
DEFINICION MEDIANTE FUNCS. DE INTERPOLACION Y ASIMPTOTICAS
*******************************************************************/
/**********************************************************
Funciones auxiliares
************************************************************/
/********************************************************
Componentes de las integrales basicas
********************************************************/
/*********************************************************
Para los elementos de frontera
**********************************************************/
/*********************************************************
Funciones para los elementos de la grieta
***********************************************************/
/********************************************************
Componentes de la matriz del sistema
********************************************************/
/*******************************************************
Elementos de la grieta
*******************************************************/
SC21(i,elemento[j].xpuntof,elemento[j].ypuntof))*sin(2*elemento[j].beta)/2.0;
return acss;
}
SC22(i,elemento[j].xpuntof,elemento[j].ypuntof))*sin(2*elemento[j].beta)/2.0;
return acsn;
}
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;
}
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
********************************************************/
/********************************************************
Elementos de la matriz A
*********************************************************/
/******************************************************************
FUNCIONES PARA LA DETERMINACION DE LOS ESFUERZOS ELASTICOS
******************************************************************/
#include "func14a.h"
#include "funplast21a.h"
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));
}
}
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;
/*
Vectores xp , yp , de las coordenadas de los puntos
en la region plastica
*/
/*************************************************************************
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 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)) );
}
rdp=r/pplas;
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;
}
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;
}
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;
}
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;
}
/**************************************************************
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;
}
/**************************************************************
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.
#endif
178
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bpmgeoma.h"
char nombre_modelo[81];
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;
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;
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)
/******************************************************
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;
}
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;
}
}
}
}
188
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nr.h"
#include "nrutil.h"
#include "mandat13a.h"
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;
}
}
/*********************************************************************
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);
/****************************************************************
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
******************************************************************/
brinco(1);
/*******************************************************
ALMACENAMIENTO EN ARCHIVO DE LA REPRESENTACION DE LA DEFORMACION PLASTICA
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
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA12 PLASTICO
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL ESFUERZO SIGMA22 PLASTICO
******************************************************************/
/****************************************************************
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
******************************************************************/
/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS12 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS22 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DE LA DEFORMACION EPS33 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS11 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS12 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS22 PLASTICA
******************************************************************/
/****************************************************************
ALMACENAMIENTO DEL INCREMENTO DE DEFORMACION DEPS33 PLASTICA
******************************************************************/
/****************************************************************
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"
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. */