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