Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

solver.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= solver.cc                                                  Mayo de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones para los SOLVERs numericos!                                =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include "core/simul/solver.h"
00023 
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 
00027 #define VERIFICAR(x)                                                          \
00028   if ( !(x) ) {                                                               \
00029       fprintf(stderr,"<SOLVER> - ERROR FATAL: No hay memoria suficiente!\n"); \
00030       fflush(stderr);                                                         \
00031       exit(1);                                                                \
00032   }
00033 
00034 //===========================================================================
00035 //= CLASE SOLVER                                                            =
00036 //===========================================================================
00037 
00038 SOLVER::SOLVER(ECUACION_DIFERENCIAL *Mi_ecuacion)
00039 {
00040     Ecuacion = Mi_ecuacion;
00041 
00042     temp1 = NULL;
00043     temp2 = NULL;
00044     num_variables_de_estado = Ecuacion->ODE_numero_de_variables_de_estado();
00045     if ( !num_variables_de_estado ) return;
00046 
00047     temp1 = new double[num_variables_de_estado];
00048     VERIFICAR(temp1);
00049     temp2 = new double[num_variables_de_estado];
00050     VERIFICAR(temp2);
00051 }
00052 
00053 SOLVER::~SOLVER()
00054 {
00055     if ( temp1 ) {
00056         delete temp1;
00057         temp1 = NULL;
00058         delete temp2;
00059         temp2 = NULL;
00060         num_variables_de_estado = 0;
00061     }
00062 }
00063 
00064 void
00065 SOLVER::escalar_vector(double factor, double *vector)
00066 {
00067     int i;
00068 
00069     for ( i = 0; i < num_variables_de_estado; i++ ) {
00070         vector[i] *= factor;
00071     }
00072 }
00073 
00074 void
00075 SOLVER::sumar_vectores(void)
00076 {
00077     int i;
00078 
00079     for ( i = 0; i < num_variables_de_estado; i++ ) {
00080         temp2[i] += temp1[i];
00081     }
00082 }
00083 
00084 //===========================================================================
00085 //= CLASE SOLVER_EULER                                                      =
00086 //===========================================================================
00087 
00088 SOLVER_EULER::SOLVER_EULER(ECUACION_DIFERENCIAL *Mi_ecuacion) :
00089                                                           SOLVER(Mi_ecuacion)
00090 {
00091     ;
00092 }
00093 
00094 SOLVER_EULER::~SOLVER_EULER()
00095 {
00096     // OJO: Aqui se llama al destructor de SOLVER o toca dejar esto?
00097     if ( temp1 ) {
00098         delete temp1;
00099         temp1 = NULL;
00100         delete temp2;
00101         temp2 = NULL;
00102         num_variables_de_estado = 0;
00103     }
00104 }
00105 
00106 void
00107 SOLVER_EULER::ejecutar_solucion(double delta_t)
00108 {
00109     Ecuacion->ODE_calcular_la_primera_derivada(temp1);
00110     escalar_vector(delta_t, temp1);
00111     Ecuacion->ODE_reportar_variables_de_estado(temp2);
00112     sumar_vectores(); // temp2 = temp2 + temp1;
00113     Ecuacion->ODE_actualizar_variables_de_estado(temp2);
00114 }
00115 
00116 //===========================================================================
00117 //= EOF                                                                     =
00118 //===========================================================================
00119 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.