Métodos de resolución

Diagrama de colaboración para Métodos de resolución:

Módulos

 Resolución de Permanente
 Resolución de Transitorio
 Resultados

Slots públicos

virtual void sbcl_principal::slt_resolver ()
 El slot resolver se encarga comenzar los procesos necesarios para la resolución del sistema.

Slots protegidos

virtual void sbcl_principal::slt_resolucion (basicos *p_DATOS)
 Este Slot se encarga de seguir el proceso de resolución de los sistemas de ecuaciones del circuito a analizar.

Descripción detallada

En este grupo de funciones se encuentran todas aquellas que hacen posible la resolución de los sistemas estacionarios y transitorios

Slots públicos

void sbcl_principal::slt_resolver (  )  [virtual, slot, inherited]

El slot resolver se encarga comenzar los procesos necesarios para la resolución del sistema.

Entre las tareas que realiza esta función se encuentra:

  • Ver si la matriz T está ensamblada
  • Toma los valores de análisis del transitorio, tiempo inicial, final, paso de tiempo y valor de theta.
  • Leer los valores existentes en las tablas MDG, MN y MVC
    Ver también:
    actualiza, slt_resolucion
    Parámetros:
    p_DATOS Puntero a estructura basicos
    Ver también:
    resolucion_transitorio, resolucion_permanente
    Chequea que ha elegido el usuario para llamar a las funciones resolucion_transitorio o resolucion_permanente.
    Además también se encarga de llamar a las funciones que cargan en pantalla los sistemas utilizados y sus respectivas soluciones

Definición en la línea 234 del archivo sbcl_principal.cpp.

00235 {
00236 basicos *p_DATOS;basicos *p_DATA;
00237 p_DATA=&DATOS;
00238 p_DATOS=&DATOS;
00239 int i,j,k,cont=0;
00240 int *ii=&i; int *jj=&j,*p_cont=&cont;
00241 int element;
00242 bool result;
00243 p_DATOS->estaT=0;//cargamos a 0 para indicar que no está ensamblada la matriz T
00244 //cargamos los valores para el transitorio
00245 QString h;
00246 h=lineEdit_t0->text(); p_DATOS->t0=h.toDouble(&result);
00247 h=lineEdit_tf->text(); p_DATOS->tf=h.toDouble(&result);
00248 h=lineEdit_h->text(); p_DATOS->h=h.toDouble(&result);
00249 h=lineEdit_theta->text(); p_DATOS->theta=h.toDouble(&result);
00250 //Barremos las tablas para resolver el estacionario
00251 if(p_DATOS->estacionario==1){
00252         for(i=0;i<DATOS.elementos;i++)
00253         {
00254 /*declaración del vector que contiene los datos leidos de las 
00255 diferentes Qtables la longitud debe ser la del elemento más largo*/
00256         double elemento[16];
00257         //limpiamos en vector elemento
00258         for(j=0;j<16;j++){elemento[j]=0;}
00259         element=filaTable (ii,p_cont,tableMDG);         
00260         lee_elemento (element,p_DATA);  
00261                 for(j=0;j<p_DATA->lim[2];j++)
00262                 {
00263                 ii=&i;jj=&j;            
00264                 if(j<p_DATA->lim[0])
00265                 {elemento[j]=filaTable (ii,jj,p_DATOS->tableMDG);}
00266                 int a=(j-p_DATA->lim[0]);jj=&a;
00267                 if (j<p_DATA->lim[1] && j>=p_DATA->lim[0])
00268                 {elemento[j]=filaTable (ii,jj,p_DATOS->tableMN);}
00269                 int b=(j-p_DATA->lim[1]);jj=&b;
00270                 if(j<p_DATA->lim[2] && j>=p_DATA->lim[1])
00271                 {elemento[j]=filaTable (ii,jj,p_DATOS->tableMVC);}              
00272                 }
00273         double *p_elemento=&elemento[0];                
00274         p_DATOS->t=0;
00275         elementoMatrizT(p_elemento,p_DATOS);
00276         elementoVectorW(p_elemento,p_DATOS,p_DATOS->t);         
00277         }
00278 //llamada a salida de datos
00279 slt_resolucion(p_DATOS);
00280 p_DATOS->estacionario=0;
00281 }
00282 
00283 //REsolución del transitorio
00284 if(p_DATOS->transitorio==1)
00285 {
00286 //Creamos el Vector que guardará la solución del sistema estacionario
00287 p_DATOS->x_trans=p_DATOS->creax_trans();
00288 //calculo del número de iteraciones
00289 if(p_DATOS->t0 > p_DATOS->tf){p_DATOS->numv=0;
00290 cout<<"Error los datos necesarios para el transitorio están mal"<<endl;}
00291 else {num_iteraciones(p_DATOS);}
00292 if(p_DATOS->numv!=0)//Entra sólo si las iteraciones a realizar son diferentes a 0
00293 {       
00294         for(k=1;k<=p_DATOS->numv;k++)//Este for da tantas vueltas como número de iteraciones
00295         {
00296         p_DATOS->iter=k;        
00297         //iMPORTANTE para que se apunte a EA y A2
00298         p_DATOS->apuntaA2=p_DATOS->situaA2();p_DATOS->apuntaEA=p_DATOS->situaEA();
00299                 for(i=0;i<DATOS.elementos;i++)
00300                 {
00301 /*declaración del vector que contiene los datos leidos de las 
00302 diferentes Qtables la longitud debe ser la del elemento más largo*/
00303                 double elemento[16];
00304                 //limpiamos en vector elemento
00305                 for(j=0;j<16;j++){elemento[j]=0;}
00306                 element=filaTable (ii,p_cont,tableMDG); 
00307                 lee_elemento (element,p_DATA);
00308                 for(j=0;j<p_DATA->lim[2];j++)
00309                         {
00310                         ii=&i;jj=&j;            
00311                         if(j<p_DATA->lim[0])
00312                         {elemento[j]=filaTable (ii,jj,p_DATOS->tableMDG);}
00313                         int a=(j-p_DATA->lim[0]);jj=&a;
00314                         if (j<p_DATA->lim[1] && j>=p_DATA->lim[0])
00315                         {elemento[j]=filaTable (ii,jj,p_DATOS->tableMN);}
00316                         int b=(j-p_DATA->lim[1]);jj=&b;
00317                         if(j<p_DATA->lim[2] && j>=p_DATA->lim[1])
00318                         {elemento[j]=filaTable (ii,jj,p_DATOS->tableMVC);}              
00319                         }
00320                 double *p_elemento=&elemento[0];
00321                 p_DATOS->t=k-1;
00322                 if(p_DATOS->estaT==1)
00323                 {
00324                 elementoVectorW(p_elemento,p_DATOS,p_DATOS->t);                         
00325                 }
00326                 else
00327                 {
00328                 elementoMatrizT(p_elemento,p_DATOS);
00329                 elementoVectorW(p_elemento,p_DATOS,p_DATOS->t);                         
00330                 }               
00331                 }
00332         MatAssemblyBegin(p_DATOS->T,MAT_FINAL_ASSEMBLY);
00333         MatAssemblyEnd(p_DATOS->T,MAT_FINAL_ASSEMBLY);
00334         p_DATOS->estaT=1;
00335         VecAssemblyBegin(p_DATOS->W); VecAssemblyEnd(p_DATOS->W);               
00336                 
00337         //preparando el sistema transitorio 
00338         PetscTruth *flg;
00339         Mat A1;
00340         Vec BBCC,z;             
00341         z=creavectorauxiliar(p_DATOS);
00342         VecCreate(PETSC_COMM_SELF,&BBCC);
00343         VecSetSizes(BBCC,PETSC_DECIDE,p_DATOS->filas());VecSetFromOptions(BBCC);
00344         VecAssemblyBegin(BBCC); VecAssemblyEnd(BBCC);           
00345         p_DATOS->BBCC=BBCC;
00346         MatCreateSeqAIJ(PETSC_COMM_SELF,p_DATOS->filas(),p_DATOS->columnas(),10,PETSC_NULL,&A1);
00347         MatAssemblyBegin(A1,MAT_FINAL_ASSEMBLY);MatAssemblyEnd(A1,MAT_FINAL_ASSEMBLY);
00348         PetscScalar unomenostheta=1-p_DATOS->theta;
00349         PetscScalar thetamenosuno=p_DATOS->theta-1;
00350         p_DATOS->creaGC();              
00351         MatCopy(p_DATOS->T,p_DATOS->G,  DIFFERENT_NONZERO_PATTERN);             
00352         MatCopy(p_DATOS->T,p_DATOS->C,  DIFFERENT_NONZERO_PATTERN);                             
00353         MatImaginaryPart(p_DATOS->C);           
00354         float unoentreh=1/p_DATOS->h;           
00355         MatScale ( p_DATOS->C, unoentreh);              
00356         MatRealPart(p_DATOS->G);
00357         MatCopy(p_DATOS->G,A1,  DIFFERENT_NONZERO_PATTERN);             
00358         MatAYPX(p_DATOS->G,p_DATOS->theta,p_DATOS->C, DIFFERENT_NONZERO_PATTERN);
00359         //Operación A realizada Y = a*Y + X.  MatAYPX(Mat Y,PetscScalar a,Mat X,MatStructure str)
00360         //A1=(theta-1)*G+C/h Operación B realizada     
00361         MatAYPX(A1,thetamenosuno,p_DATOS->C, DIFFERENT_NONZERO_PATTERN);        
00362         p_DATOS->x0=p_DATOS->creax0(k,p_DATOS);//Creamos el vector de condiciones iniciales     
00363         VecScale (p_DATOS->Wn1, p_DATOS->theta);                        
00364         //preparación de CC y DD
00365         VecScale (p_DATOS->Wn, unomenostheta);  
00366         //VecWAXPY(Vec w,PetscScalar alpha,Vec x,Vec y) Computes w = alpha x + y.       
00367         VecWAXPY(z,1,p_DATOS->Wn,p_DATOS->Wn1);
00368         //MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3) Computes v3 = v2 + A * v1,prepara BB+CC 
00369         MatMultAdd(A1,p_DATOS->x0,z,BBCC);
00370         //MatMultAdd(BBCC,Vec1,p_DATOS->W,terminoIndep);
00371         
00372         //Resolucion
00373         resolucion_transitorio(p_DATOS);                
00374         }
00375 }
00376 escribirgnuplot(p_DATOS);
00377 //llamada a salida de datos
00378 slt_resolucion(p_DATOS);
00379 }
00380 }


Slots protegidos

void sbcl_principal::slt_resolucion ( basicos p_DATOS  )  [protected, virtual, slot, inherited]

Este Slot se encarga de seguir el proceso de resolución de los sistemas de ecuaciones del circuito a analizar.

Parámetros:
p_DATOS Puntero a estructura basicos

Definición en la línea 427 del archivo sbcl_principal.cpp.

00428 {
00429 if(p_DATOS->estaT!=1)
00430 {
00431 MatAssemblyBegin(p_DATOS->T,MAT_FINAL_ASSEMBLY);MatAssemblyEnd(p_DATOS->T,MAT_FINAL_ASSEMBLY);
00432 p_DATOS->estaT=1;
00433 }
00434 VecAssemblyBegin(p_DATOS->W); VecAssemblyEnd(p_DATOS->W);
00435 if(p_DATOS->transitorio==1){resolucion_transitorio(p_DATOS);}
00436 if(p_DATOS->estacionario==1){resolucion_permanente(p_DATOS);}
00437 mostrar_solucion(p_DATOS);
00438 //CArgar soluciones en pantalla
00439 slt_sistemaestacionario();
00440 slt_sistematransitorio();
00441 slt_solucionestacionario();
00442 slt_soluciontransitorio();
00443 INFOgeneral (p_DATOS);
00444 }


Generado el Wed Sep 2 16:04:52 2009 para Software de Análisis de Circuitos Lineales mediante Métodos Avanzados de Resolución para Uso Docente. Manual de Código Fuente por  doxygen 1.5.6