|
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. | |
| 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:
| p_DATOS | Puntero a estructura basicos |
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 }
| 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.
| 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 }
1.5.6