Pag 15 PDF
Pag 15 PDF
Pag 15 PDF
3.1 INTRODUCCIÓN
En el capítulo I se
se han desarrollado las bases teóricas
teóricas para desarrollar el método de los
elementos finitos. Ahora analizaremos los problemas unidimensionales, donde la
deformación unitaria, el esfuerzo, el desplazamiento y las cargas sólo dependen de la
coordenada x. Es decir las relaciones matriciales vistos en el capítulo uno se convierten
ahora en sólo relaciones escalares, de tal forma que:
3.1
u = u(x) = (x)
(x) =
= (x)
(x) T = T(x) f = f(x)
dx
dV = Adx 3.3
Esquema de numeración
Se ha mostrado cómo una barra de apariencia complicada puede modelarse usando un
número discreto de elementos, cada elemento con una geometría simple. La similaridad de
los diversos elementos es una razón por la que el método de los elementos finitos es muy
adecuado para ser tratado en una computadora. Para su fácil implantación debe adoptarse
un esquema ordenado de numeración que a continuación se detalla.
54
En un problema unidimensional los desplazamientos son sólo a lo largo del eje x, por lo que
cada nodo tiene un solo grado de libertad (gdl); por tanto cada elemento finito tiene solo
dos grados de libertad ( dos nodos) . El modelo del elemento finito de cinco nodos en la
figura 3.2b tiene cinco grados de libertad. Los desplazamientos a lo largo de cada grado de
libertad se denotan por Q1 , Q2 ,, Q5 . De hecho, el vector columna Q = [ Q1 , Q2 ,, Q5 ] T
se llama vector de desplazamiento global . El vector de carga global se denota por F=
F 1 , F 2 ,, F 5
T
Q y F se muestran en la figura 3.3. La convención de signos
. Los vectores
usada es que un desplazamiento o carga tiene un valor positivo si actúa en la dirección + x.
En esta etapa no se ponen las condiciones de frontera.
Cada elemento tiene dos nodos; por tanto la información sobre la conectividad de los
elementos puede representarse convenientemente como se muestra en la figura 3.4. En la
figura se da la tabla de conectividad. En esta tabla los encabezados 1 y 2 se refieren a los
55
Considere un elemento finito típico e en la figura 3.5a. En el esquema de numeración local,
el número del primer nodo será 1 y el del segundo nodo será 2. Se usa la notación x 1 =
coordenada x del nodo 1, x 2 = coordenada x del nodo 2. Definimos un sistema coordenado
2
natural o intrínseco , denotado por ξ = 1
x x
1 3.4
x x
2 1
1 3.5
N 1
2
1
3.6
N 2
2
Las funciones de forma N 1 y N 2 se muestran en las figuras 3.7a y b, respectivamente.
Una vez definidas las funciones de forma, el campo de desplazamiento lineal dentro del
elemento puede escribirse en términos de los desplazamientos no dales q1 y q2 como
3.7a
u N 1q1 N 2 q2
o, en notación matricial como
u = Nq 3.7b
56
donde
N = N 1 , N 2 y q = q1 , q 2 T 3.8
dx
Al usar la regla de la cadena de la derivación, resulta
du d
3.10
d dx
d 2
3.11
dx x 2 x1
Además, como
1 1
u N 1q1 N 2 q2 = q1 q2
2 2
tenemos
du q1 q2
3.12
d 2
= Bq 3.14
Las expresiones u = Nq, = Bq, = E Bq relacionan desplazamiento, deformación unitaria
y esfuerzo, respectivamente , en términos de los valores nodales. Ahora con estas
58
1
u Tdx u P
3.17
Adx u T fAdx
fAdx
T T
Adx i i
2 L L L
i
Como el continuo ha sido discretizado en elementos finitos, la expresión para П es entonces
1
Adx u
Adx
T T
fAdx
fAdx u Tdx Q P T
i i
3.18a
e 2 e
e
e
e
e
i
El último término supone que las cargas puntuales P i están aplicadas en los nodos. Esta
suposición hace la presente deducción más simple con respecto a la notación y también es
una práctica común en el modelado. La ecuación anterior, 3.18a, puede escribirse como
U e u
T
fAdx
fAdx u Tdx Q P T
i i
3.18b
e e
e e e i
1
Adx
T
donde U e
2
es la energía de deformación unitaria del elemento.
3.20a
o
3.20b
En el modelo del elemento finito, el área de la sección transversal del elemento e, denotada
por Ae es constante. Además, B es una matriz constante. La transformación
transformación de x a ξ en la
ecuación 3.4 nos da
x2 x1 3.21a
dx d
2
3.21b
59
e
dx d
2
3.22
donde E e es el módulo de Young del elemento e. Notando que d 2 , y sustituyendo el
1
valor de B dado por la ecuación 3.15, obtenemos
3.23
que conduce a
3.24
3.25
3.26
SOLUCIÓN:
a. De la figura hallamos ξ.
2 2
ξ= 1 =
x x
1
20
15 1 0.25
x
2
x 1
23 15
Hallamos las funciones de forma:
1 1 0.25
N 1 0.375
375
2 2
1 1 0.25
N 2 0.625
625
2 2
El desplazamiento en P se calcula con:
1 1
q1 q2 (0.02
0.025
025) 0.000625
x 2 x1 23 15
1.2 * 30e6 1 1 1 1
1 4.5e 6 1 1 Respuesta.
23 15 1
1 1 1 0.02
0.02 0.025
025 4.5e6 025 56.25in*lb. Respuesta.
2 1 1 0.025
Términos de fuerza
3.27
u
fAdx Ae f N 1q1 N 2 q2 dx
T
fAdx
e e
61
Ae f N dx
eu fAdx q Ae f e N dx
1
T T 3.28
e 2
Las integrales de las funciones de forma anteriores pueden evaluarse fácilmente haciendo la
sustitución dx ( e / 2)d . Entonces,
e 1 1 e
e
N 1 dx
2
1 2
d
2 3.29
e 1 1 e
N dx 2
e
2
1 2
d
2
3.30a
que es de la forma
3.30b
3.31
3.33
Ya hemos obtenido las integrales de las funciones de forma. Por tanto la ecuación 3.33 es
de la forma
En esta etapa, se han obtenido ya las matrices del elemento , y . Después de tomar en
cuenta la conectividad de los elementos, la energía potencial total se puede escribirse así,
3.36
donde K es
es la matriz de rigidez global, F es el vector de carga global y Q es el vector de
desplazamiento global.
3.37
63
De manera muy parecida, el vector de carga global F se ensambla a partir de los vectores de
de
fuerza y de los vectores de carga puntual de los elementos, como
3.38
3.6 PROPIEDADES DE K
donde K es
es la matriz de rigidez estructural, F es el vector de carga global y Q es el vector
de desplazamiento global. Como se vio antes, K y F se ensamblan a partir de las matrices
de rigidez y fuerza de los elementos, respectivamente. Para poder hallar los
desplazamientos nodales, esfuerzos en los elementos y fuerzas en los soportes, tenemos que
usar las ecuaciones de equilibrio. Esto lo podemos deducir del teorema de la energía
potencial mínima : De todos los desplazamientos posibles que satisfacen las condiciones de de
frontera de un sistema estructural, aquellos que corresponden a configuraciones de
equilibrio hacen que la energía potencial total adquiera un valor mínimo. Pon tanto, las
ecuaciones de equilibrio pueden obtenerse minimizando con respecto a Q, teniendo en
cuenta que previamente se halla sometido a las condiciones
con diciones de frontera de la estructura.
Las condiciones de frontera son usualmente del tipo
Es decir, los desplazamientos a lo largo de los grados de libertad p1 , p2 ,, p r se
especifican como iguales a a1 , a2 ,, ar , respectivamente. En otras palabras, hay un
64
donde 1 , 2 0 son constantes conocidas. Estos tipos de frontera se usan para modelar
y
Debe enfatizarse que una especificación impropia de las condiciones de frontera puede
conducir a resultados erróneos. Las condiciones de frontera eliminan la posibilidad que la
estructura se mueva como cuerpo rígido. Las condiciones de frontera deben modelar el
sistema físico con exactitud. En este apartado se verán dos enfoques para el manejo de las
condiciones de frontera: el enfoque de la eliminación y el enfoque de la penalización.
Enfoque de eliminación
Para ilustrar la idea básica, consideremos la sola condición de frontera Q1 a1 . Las
K 11
K 12 K 1 N
K K 22 K 2 N
K= 21
3.41
K N 1
K N 2 K NN
2 1 1 2 2 3.43
Q K a Q K Q Q K Q
N N 1
N N 1 N NN N
2 2
0 i 2,3, , N 3.44
Qi
K 22Q2 K 23Q3
K 2 N Q N F 2 K 21a1
Las ecuaciones del elemento finito anteriores se puede escribirse matricialmente así,
Ahora observamos que la matriz de rigidez de ( N-1 N-1 x N-1) anterior se obtiene simplemente
borrando o eliminando la primera fila y columna (en vista de que Q1 a1 ) de la matriz de
Donde K es una matriz de rigidez reducida que se obtiene eliminando la fila y columna
correspondiente al grado de libertad o “soporte” especificado. Las ecuaciones 3.47 pueden
resolverse para el vector de desplazamiento Q usando la eliminación de Gauss. Note que la
matriz reducida K es no singular, siempre que las condiciones de frontera se hallan
especificado apropiadamente; por otra parte, la matriz K original es una matriz singular.
Una vez determinada Q, el esfuerzo en los elementos puede evaluarse usando la ecuación
3.16 : E Bq, donde q para cada elemento se extrae de Q usando información sobre la
Una vez obtenidos los esfuerzos en los elementos es necesario calcular la fuerza de
reacción R1 en el soporte. Esta fuerza de reacción puede obtenerse de la ecuación del
elemento finito (o ecuación de equilibrio) para el nodo 1: 3.48
K 11Q1 K 12Q2 K 1 N Q N F 1 R1
R1 K 11Q1 K 12Q2 K 1 N Q N F 1 3.49
Note que los elementos K 11 , K 12 ,, K 1 N usados antes, que forman la primera fila de K ,
deben ser almacenados en forma separada. Esto se debe a que K de la ecuación 3.47 se
obtiene borrando esta fila y columna de la K original.
original.
Ej emplo 3.2. Considere la barra en la figura P3.3 cargada como se muestra. Determine
los desplazamientos nodales, los esfuerzos en los elementos y las reacciones en los
soportes. Resuelva este problema a mano usando el método de eliminación para manejar
las condiciones de frontera. Verifique sus resultados usando el programa Unidimensional.
1 2
1 1 333333. 3 333333 . 3 1
250
250 * 200000
k 1 1
1
150
150 333333 . 3 333333. 3 2
2 3
1 1 333333. 3 333333. 3 2
250
250 * 200000
k 1 1
2
150
150 333333. 3 333333 . 3 3
3 4
67
1 1 266666. 6 266666. 6 3
400
400 * 200000
k 1 1
3
300
300 266666. 6 266666. 6 4
2) Se ensambla las tres matrices anteriores para hallar la matriz de rigidez global de la
estructura, considerando la conectividad de los elementos que también se ha indicado.
1 2 3 4
1
333333 . 3 333333 .3 0
0
2
K 333333 . 3 666666 . 6 333333 . 3 0
0 333333 . 3 600000 266666 . 6 3
266666 . 6 266666 . 6 4
0 0
666666 . 6 333333 . 3 Q2 300000
Q 0
333333 . 3 600000 3
donde se han eliminado las correspondientes filas y columnas de los grados de libertad
1 y 4 de las tres matrices K, Q y F.
Resolviendo dicho sistema tenemos:
Q2 0.62307692
Q 0.346153846
3
200000 0
1 1 1
150
150 0.62307692
1 830
830 .769
769 N / mm²
200000 0.62307692
2 1 1
150
150 0.346153846
2 369
369 .231
231 N / mm²
200000 0.346153846
3 1 1
150
150 0
3 230
230 .769
769 N / mm²
K 11Q1 K 12Q2
K N Q N F R
1 1 1
6) Las reacciones se calculan de acuerdo a
R K Q K Q K N Q N F
1 11 1 12 2 1 1
0
333333 . 3
0.62307692
R1
333333 . 3 0 0 207692 .3N .
0 .346153846
0
0
0.62307692
R4 0 0 266666 . 6 266666 . 6 92307 .7 N .
0.346153846
0
Enfoque de la penalización
Este segundo enfoque para tratar las condiciones de frontera, es fácil de implementar en
una computadora y retiene su simplicidad aún cuando se consideran condiciones de frontera
generales.
3.50
C Q1 a1
1 2
U s
2
70
3.51
Anteriormente vimos que las únicas modificaciones para tratar Q1 a1 son: que debe
agregarse un gran número C al primer elemento diagonal de K y y que C a1 se agrega a F 1 .
La fuerza de reacción en el nodo 1 es igual a la fuerza ejercida por el resorte sobre la
estructura. Como la extensión neta del resorte es ( Q1 a1 ) y la rigidez del resorte es C, la
coeficientes de rigidez K 11 , K 12 ,, K 1 N , entonces Q1 a1 . Note que F 1 es una carga
aplicada en el soporte (si existe) y que F 1 /C es
es generalmente de pequeña magnitud.
Un simple esquema sugiere por sí mismo la elección de la magnitud de C :
4
C = máx K ij 10
1 i N 3.55
1 j N
Restricciones de multipunto
En problemas donde, por ejemplo, deben modelarse soportes inclinados con rodillos o
conexiones rígidas, las condiciones de frontera toman la forma
donde 1 , 2 y 0 son constantes conocidas. A tales condiciones de frontera se les llama
restricciones de multipunto. El enfoque de penalización se aplicará a este tipo de condición
de frontera.
Considere la expresión de la energía potencial total modificada a ser minimizada
3.56
y
72
Si consideramos las ecuaciones de equilibrio M / Q P 1 y M / Q P 2 , y las reordenamos
en la forma
obtenemos las fuerzas de reacción R p1 y R p 2 que son las componentes de reacción a lo
largo de los grados de libertad p1 y p2 , respectivamente , como
3.59a
R p1
Q p1
C Q
1
2 1 p1 2 Q p 2 0
2
y
R p1
Q p 2
C Q
1
2 1 p1 2Q p 2 0 2
3.59b
Vemos que el enfoque de penalización nos permite manejar las restricciones de multipunto
y es nuevamente fácil implementarlo en un programa de computadora.
Ej emplo 3.3. Se aplica una carga axial P = 385 kN al bloque compuesto mostrado en la
figura P3.5. Determine el esfuerzo en cada material.
73
SOLUCIÓN:
En este problema consideramos 2 elementos con dos condiciones de frontera y dos
restricciones de multipunto y 5 grados de libertad , así:
5
2 4
1 3
Condiciones de Frontera:
Q1 0
Q3 0
Restricciones de multipunto:
Q2 Q5 0
Q4 Q5 0
Con la corrida del programa obtenemos los siguientes esfuerzos:
1
85.55898 N / mm²
2
128
128 .32991 N / mm²
74
Ej emplo 3.4 Considere la barra en la figura P3.6 Determine los desplazamientos nodales,
los esfuerzos en los elementos y las reacciones en los soportes.
SOLUCIÓN:
Q1 0
Resolviendo el problema con el programa tenemos:
75
Q5 3.5mm
76
Ej emplo 3.5. La viga rígida en la figura P3.9 estaba a nivel antes de aplicarse la carga.
Encuentre el esfuerzo en cada miembro vertical
Condiciones de frontera:
Q1 0
Q3 0
Restricciones de multipunto:
36
15
Q2 Q5 0
36
27
Q4 Q5 0
Hasta ahora, el campo de desplazamiento ha sido considerado por funciones de forma lineal
dentro de cada elemento. Sin embargo, en algunos problemas, el uso de una interpolación
cuadrática conduce a resultados bastante más exactos. En esta sección se presentarán las
funciones de forma
forma cuadrática y la correspondiente
correspondiente matriz de rigidez del elemento y se
deducirán los vectores de carga.
T
nodo i, i = 1, 2, 3. Además q = q1, q2 , q3 , donde q1, q2 , q3 son los desplazamientos de los
nodos 1, 2 y 3, respectivamente. El sistema coordenado x es “mapeado” en un sistema
coordenado ξ, que se obtiene con la transformación
2 x x
3
3.61
x x
2 1
79
T
donde N = [ N 1 , N 2 , N 3 ] es un vector de (1 *3) de funciones de forma y q = q1 , q2 , q3 un
vector columna de (3*1) de desplazamiento del elemento. En el nodo 1 vemos que
N 1 1, N 2
N 3
0 y por consiguiente , u q1 . De igual manera, u q2 en el nodo 2 y
80
u q3 en el nodo 3. Entonces, u en la ecuación 3.89a es una interpolación cuadrática que
pasa por q1 , q2 , q3 .
1 2 1 2
2 3.65
, ,2 q
x x 2 2
2 1
que es de la forma
3.66
= Bq
= E Bq
Bq 3.68
Nuevamente, en el modelo del elemento finito considerado aquí, se supondrá que el área
transversal Ae , la fuerza de cuerpo f y la fuerza de tracción T , son constantes dentro del
81
1
Adx u
T T
fAdx
fAdx u Tdx Q P
T
i i
e 2 e
e
e
e
e
i
3.69
resulta
3.70a
3.70b
3.71a
3.71b
3.72a
que conduce a
82
3.72b
0 = T 3.73
= E ( - 0 ) 3.74
1 3.75
u
0
2
( - 0 )
83
u
1
( - 0 ) T E ( - 0 ) 3.76a
0 2
3.76c
3.76d
de temperatura:
3.77a
e
=
1
La ecuación anterior puede simplificarse sustituyendo B=
1 y notando que
1
x2 x1
0 = T, entonces
e
=
3.77b
3.78
Después de resolver las ecuaciones del elemento finito KQ = F para los desplazamientos
Q, el esfuerzo en cada elemento puede obtenerse con la ecuación 3.74 como
Q1 0
Q4 0
85
Se dan los códigos del proyecto “UnaDimension.bpr” , la salida en pantalla es tal como se
ha visto anteriormente al resolver los ejercicios. Note la inclusión de la clase TMatriz
desarrollada en el anterior capítulo.
/**************************************
* UnaDimension.h Versión 1.0 *
* D.R. © Adolfo Linares Flores 2003 *
* El Método de los Elementos Finitos *
* Todos los Derechos Reservados *
***************************************/
//---------------------------------------------------------------------------
#ifndef UnaDimensionH
#define UnaDimensionH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
86
#include <Menus.hpp>
#include <ToolWin.hpp>
#include <DBGrids.hpp>
#include <Grids.hpp>
#include <Db.hpp>
#include <iostream.h>
#include <assert.h>
#include "TMatriz.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TEdit *Edit1;
TButton *Button1;
TMainMenu *MainMenu1;
TMenuItem *Archivo1;
TMenuItem *Imprimir1;
TMenuItem *N1;
TMenuItem *Salir1;
TMenuItem *Editar1;
TMenuItem *Copiar1;
TMenuItem *Cortar1;
TMenuItem *Pegar1;
TDBGrid *DBGrid1;
TButton *Button2;
TLabel *Label2;
TDataSource *DataSource1;
TLabel *Label3;
TLabel *Label4;
TEdit *Edit2;
TLabel *Label5;
TEdit *Edit3;
TLabel *Label6;
TDBGrid *DBGrid2;
TLabel *Label7;
TDBGrid *DBGrid3;
TDataSource *DataSource2;
TDataSource *DataSource3;
TMenuItem *Acerca;
TMenuItem *AcercaDelMEF;
TLabel *Label8;
TEdit *Edit4;
TLabel *Label9;
TLabel *Label10;
TEdit *Edit5;
87
TEdit *Edit6;
TDBGrid *DBGrid4;
TDBGrid *DBGrid5;
TLabel *Label11;
TLabel *Label12;
TDataSource *DataSource4;
TDataSource *DataSource5;
TLabel *Label13;
TDBGrid *DBGrid6;
TDataSource *DataSource6;
TLabel *Label14;
TLabel *Label15;
TDBGrid *DBGrid7;
TDBGrid *DBGrid8;
TDataSource *DataSource7;
TDataSource *DataSource8;
TButton *Button3;
TDBGrid *DBGrid9;
TLabel *Label16;
TDataSource *DataSource9;
TButton *Button4;
TButton *Button5;
TLabel *Label17;
TLabel *Label18;
TDataSource *DataSource10;
TDBGrid *DBGrid10;
TMenuItem *VistaPrevia1;
void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
void __fastcall Button1Click(TObject *Sender);
/**************************************
* UnaDimension.cpp Versión 1.0 *
* D.R. © Adolfo Linares Flores 2003 *
* El Método de los Elementos Finitos *
* Todos los Derechos Reservados *
***************************************/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UnaDimension.h"
#include "TMatriz.h"
#include "AcercaDel.h"
#include "ResultadosUnidimensional.h"
#include "Informe.h"
89
USEUNIT("TMatriz.cpp");
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
ncf = Edit5->Text.ToInt();
nrmp = Edit6->Text.ToInt();
90
try {
tabla = new TTable(this);
tabla->DatabaseName = "Base de Datos Unidimensional";
tabla->TableName = "materiales.dbf";
tabla->Active = false;
//Crea la tabla
tabla->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla;
return ;
}
//Ahora crea la tabla
try {
tabla2 = new TTable(this);
tabla2->DatabaseName = "Base de Datos Unidimensional";
tabla2->TableName = "cargasPuntuales.dbf";
tabla2->Active = false;
//Crea la tabla
tabla2->CreateTable();
}
91
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de las Cargas Puntuales",
"Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla2;
return ;
}
//Ahora crea la tabla
try {
tabla3 = new TTable(this);
tabla3->DatabaseName = "Base de Datos Unidimensional";
tabla3->TableName = "conectividad.dbf";
tabla3->Active = false;
//Crea la tabla
tabla3->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Conectividad", "Mensaje",
0);
Screen->Cursor = crDefault;
delete tabla3;
return ;
}
if(ncf) {
//Ahora crea la tabla
try {
tabla4 = new TTable(this);
tabla4->DatabaseName = "Base de Datos Unidimensional";
tabla4->TableName = "CondicionesDeFrontera.dbf";
tabla4->Active = false;
//Crea la tabla
tabla4->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Condiciones de
frontera", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla4;
return ;
}
if(nrmp) {
//Ahora crea la tabla
try {
tabla5 = new TTable(this);
tabla5->DatabaseName = "Base de Datos Unidimensional";
tabla5->TableName = "RestriccionesMP.dbf";
tabla5->Active = false;
//Crea la tabla
tabla5->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete tabla5;
return ;
}
}
93
Screen->Cursor = crDefault;
//Desactiva el botón del ingreso de datos de los elementos finitos
Button1->Enabled = false;
MessageBox(Handle, "Las tablas han sido creadas satisfactoriamente", "Mensaje", 0);
//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource1->DataSet = tabla;
DBGrid1->DataSource = DataSource1;
DataSource2->DataSet = tabla2;
DBGrid2->DataSource = DataSource2;
DataSource3->DataSet = tabla3;
DBGrid3->DataSource = DataSource3;
if(ncf) {
DataSource4->DataSet = tabla4;
DBGrid4->DataSource = DataSource4;
}
if(nrmp) {
DataSource5->DataSet = tabla5;
DBGrid5->DataSource = DataSource5;
}
DBGrid1->Visible = true;
DBGrid2->Visible = true;
94
DBGrid3->Visible = true;
if(ncf) DBGrid4->Visible = true;
if(nrmp)DBGrid5->Visible = true;
//Abre la tabla
tabla->Active = true;
tabla2->Active = true;
tabla3->Active = true;
if(ncf) tabla4->Active = true;
if(nrmp)tabla5->Active = true;
}
//---------------------------------------------------------------------------
{
tabla->Active = true;
tabla2->Active = true;
tabla3->Active = true;
fn = new TMatriz[n];
for(int i = 0; i<n; i++)
fn[i] = TMatriz(2,1);
95
tabla->First();
for(int i = 0; i<nn; i++) {
delTem[i].elementos[0][0] = -(tabla->FieldByName("Módulo E")->Value)*(tabla-
>FieldByName("Area")->Value)*(tabla->FieldByName("Delta Temp")->Value)*(tabla-
>FieldByName("Alfa")->Value);
delTem[i].elementos[1][0] = -delTem[i].elementos[0][0];
tabla->Next();
}
q = new TMatriz[nn];
for(int i = 0; i<nn; i++)
q[i] = TMatriz(2,1);
N = new TMatriz[nn];
for(int i = 0; i<nn; i++)
N[i] = TMatriz(1,2);
K = new TMatriz[nn];
for(int i = 0; i<nn; i++)
K[i] = TMatriz(2,2);
tabla->First();
for(int i = 0; i<nn; i++) {
K[i].elementos[0][0] = (tabla->FieldByName("Area")->Value)*(tabla-
>FieldByName("Módulo E")->Value)/tabla->FieldByName("Longitud")->Value;
K[i].elementos[0][1] = -K[i].elementos[0][0];
K[i].elementos[1][0] = K[i].elementos[0][1];
K[i].elementos[1][1] = K[i].elementos[0][0];
tabla->Next();
}
tabla->First();
f = new TMatriz[nn];
for(int i = 0; i<nn; i++)
f[i] = TMatriz(2,1);
double ff = Edit2->Text.ToDouble();
for(int i = 0; i<nn; i++) {
f[i].elementos[0][0] = ff*(tabla->FieldByName("Area")->Value)*(tabla-
>FieldByName("Longitud")->Value)/2.0;
f[i].elementos[1][0] = f[i].elementos[0][0];
tabla->Next();
}
tabla->First();
T = new TMatriz[nn];
for(int i = 0; i<nn; i++)
T[i] = TMatriz(2,1);
double tt = Edit3->Text.ToDouble();
for(int i = 0; i<nn; i++) {
96
T[i].elementos[0][0] = tt*(tabla->FieldByName("Longitud")->Value)/2.0;
T[i].elementos[1][0] = T[i].elementos[0][0];
tabla->Next();
}
ng = Edit4->Text.ToInt();
P = new TMatriz(ng,1);
tabla2->First();
for(int i = 0; i<ng; i++) {
P->elementos[i][0] = tabla2->FieldByName("Cargas Puntuales")->Value;
tabla2->Next();
}
tabla3->First();
gl = new TMatriz[nn];
for(int i = 0; i<nn; i++)
gl[i] = TMatriz(2,1);
for(int i = 0; i<nn; i++) {
gl[i].elementos[0][0] = tabla3->FieldByName("Nodo 1")->Value;
gl[i].elementos[1][0] = tabla3->FieldByName("Nodo 2")->Value;
tabla3->Next();
}
TMatriz ST(ng,ng);
TMatriz F(ng,1);
for(int i = 0; i<n;i++)
for(int j = 0; j<2; j++) {
int a = gl[i].elementos[j][0];
g l[i].elementos[j][0];
F.elementos[a-1][0] +=
f[i].elementos[j][0]+T[i].elementos[j][0]+delTem[i].elementos[j][0];
}
F = F+(*P);
if(ncf) {
tabla4->Active = true;
tabla4->First();
97
C = 0;
for(int i = 0; i < ng; i++) {
if(C < ST.elementos[i][i])
C = ST.elementos[i][i];
}
C *= 10000;
//Modificación por los desplazamientos de las condiciones de frontera
for(int i = 0; i < ncf; i++) {
int k = tabla4->FieldByName("Nodo")->Value;
double u = tabla4->FieldByName("Desplazamiento")->Value;
ST.elementos[k-1][k-1] += C;
F.elementos[k-1][0] += C*u;
tabla4->Next();
}
}
try {
rigidez = new TTable(this);
rigidez->DatabaseName = "Base de Datos Unidimensional";
rigidez->TableName = "rigido.dbf";
DataSource7->DataSet = rigidez;
DBGrid7->DataSource = DataSource7;
rigidez->Active = false;
cad = "K_0_"+IntToStr(j);
rigidez->FieldDefs->Add(cad, ftFloat, 0, true);
}
//Crea la tabla
rigidez->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de rigidez", "Mensaje", 0);
Screen->Cursor = crDefault;
delete rigidez;
return ;
}
try {
fuerza = new TTable(this);
fuerza->DatabaseName = "Base de Datos Unidimensional";
fuerza->TableName = "force.dbf";
DataSource8->DataSet = fuerza;
DBGrid8->DataSource = DataSource8;
fuerza->Active = false;
//Crea la tabla
fuerza->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de fuerzas", "Mensaje", 0);
Screen->Cursor = crDefault;
delete fuerza;
return ;
}
rigidez->Active = true;
fuerza->Active = true;
rigidez->Edit();
fuerza->Edit();
Label14->Visible = true;
Label15->Visible = true;
DBGrid7->Visible = true;
DBGrid8->Visible = true;
99
rigidez->FieldByName(cad)->Value = ST.elementos[i][j];
}
rigidez->Next();
}
F.elementos[ng-1][0] = F.elementos[ng-1][0]/ST.elementos[ng-1][ng-1];
for(int i = ng-2; i>=0; i--) {
cc = 1.0/ST.elementos[i][i];
F.elementos[i][0] = cc*F.elementos[i][0];
for(int k = i + 1 ; k<ng; k++){
F.elementos[i][0] =F.elementos[i][0]- cc*ST.elementos[i][k]*F.elementos[k][0];
}
}
try {
Respuesta = new TTable(this);
100
Respuesta->Active = false;
//Crea la tabla
Respuesta->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Respuestas", "Mensaje", 0);
Screen->Cursor = crDefault;
delete Respuesta;
return ;
}
Screen->Cursor = crDefault;
MessageBox(Handle, "Las tabla de respuesta ha sido creada satisfactoriamente",
"Mensaje", 0);
Label13->Visible = true;
DBGrid6->Visible = true;
Respuesta->Active = true;
Respuesta->Edit();
}
//---------------------------------------------------------------------------
101
//Crea la tabla
esfuerzo->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete esfuerzo;
return ;
}
//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource9->DataSet = esfuerzo;
DBGrid9->DataSource = DataSource9;
Label16->Visible = true;
DBGrid9->Visible = true;
esfuerzo->Active = true;
esfuerzo->Edit();
tabla->First();
for(int i = 0; i<n; i++){
esfuerzo->Append();
TMatriz prod(1,1);
prod = B[i]*q[i];
double esf = (tabla->FieldByName("Módulo E")->Value)*(prod.elementos[0][0]-
(tabla->FieldByName("Delta Temp")->Value)*(tabla->FieldByName("Alfa")->Value));
esfuerzo->FieldByName("Elemento")->Value = i+1;
esfuerzo->FieldByName("Esfuerzo")->Value = esf;
esfuerzo->Next();
tabla->Next();
}
Button3->Enabled = false;
}
//---------------------------------------------------------------------------
}
//---------------------------------------------------------------------------
103
//Crea la tabla
funo->CreateTable();
}
catch(...) {
MessageBox(Handle, "Error en la Creación de la Tabla de Restricciones
Multipunto", "Mensaje", 0);
Screen->Cursor = crDefault;
delete funo;
return ;
}
//Ponenos la tabla creada anteriormente en modo de edición para que el usuario ingrese
los datos
DataSource10->DataSet = funo;
DBGrid10->DataSource = DataSource10;
Label18->Visible = true;
DBGrid10->Visible = true;
funo->Active = true;
funo->Edit();
for(int i = 0; i<n; i++){
funo->Append();
funo->FieldByName("Elemento")->Value = i+1;
funo->FieldByName("Fuerza1")->Value = fn[i].elementos[0][0];
funo->FieldByName("Fuerza2")->Value = fn[i].elementos[1][0];
funo->Next();
}
Button4->Enabled = false;
}
//---------------------------------------------------------------------------