Annotation of rpl/src/algebre_lineaire4.c, revision 1.12
1.12 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.18
! 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
! 5:
! 6: This file is part of RPL/2.
! 7:
! 8: RPL/2 is free software; you can redistribute it and/or modify it
! 9: under the terms of the CeCILL V2 License as published by the french
! 10: CEA, CNRS and INRIA.
! 11:
! 12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
! 13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
! 15: for more details.
! 16:
! 17: You should have received a copy of the CeCILL License
! 18: along with RPL/2. If not, write to info@cecill.info.
! 19: ================================================================================
! 20: */
! 21:
! 22:
! 23: #include "rpl-conv.h"
! 24:
! 25:
! 26: /*
! 27: ================================================================================
! 28: Fonction calculant le nombre de condition d'une matrice
! 29: ================================================================================
! 30: Entrées : struct_matrice
! 31: --------------------------------------------------------------------------------
! 32: Sorties : nombre de condition de la matrice
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: static integer4
! 39: calcul_cond(struct_processus *s_etat_processus, void *matrice_f77,
! 40: integer4 nombre_lignes_a, integer4 nombre_colonnes_a,
! 41: integer4 *pivot, unsigned char type, real8 *cond)
! 42: {
! 43: integer4 erreur;
! 44: integer4 *iwork;
! 45: integer4 longueur;
! 46: integer4 ordre;
! 47:
! 48: real8 anorme;
! 49: real8 rcond;
! 50: real8 *rwork;
! 51:
! 52: unsigned char norme;
! 53:
! 54: void *work;
! 55:
! 56: norme = '1';
! 57: longueur = 1;
! 58:
! 59: if (type == 'R')
! 60: {
! 61: // work est NULL dans le cas de la norme '1'
! 62: anorme = dlange_(&norme, &nombre_lignes_a, &nombre_colonnes_a,
! 63: matrice_f77, &nombre_lignes_a, NULL, longueur);
! 64:
! 65: dgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
! 66: &nombre_lignes_a, pivot, &erreur);
! 67:
! 68: if (erreur < 0)
! 69: {
! 70: (*s_etat_processus).erreur_execution =
! 71: d_ex_routines_mathematiques;
! 72:
! 73: free(matrice_f77);
! 74: return(-1);
! 75: }
! 76:
! 77: if ((iwork = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
! 78: {
! 79: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 80: return(-1);
! 81: }
! 82:
! 83: if ((work = malloc(4 * nombre_colonnes_a * sizeof(real8))) == NULL)
! 84: {
! 85: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 86: return(-1);
! 87: }
! 88:
! 89: ordre = (nombre_lignes_a > nombre_colonnes_a)
! 90: ? nombre_colonnes_a : nombre_lignes_a;
! 91:
! 92: dgecon_(&norme, &ordre, matrice_f77,
! 93: &nombre_lignes_a, &anorme, &rcond, work, iwork, &erreur,
! 94: longueur);
! 95:
! 96: free(work);
! 97: free(iwork);
! 98:
! 99: if (erreur < 0)
! 100: {
! 101: (*s_etat_processus).erreur_execution =
! 102: d_ex_routines_mathematiques;
! 103:
! 104: free(matrice_f77);
! 105: return(-1);
! 106: }
! 107: }
! 108: else
! 109: {
! 110: // work est NULL dans le cas de la norme '1'
! 111: anorme = zlange_(&norme, &nombre_lignes_a, &nombre_colonnes_a,
! 112: matrice_f77, &nombre_lignes_a, NULL, longueur);
! 113:
! 114: zgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
! 115: &nombre_lignes_a, pivot, &erreur);
! 116:
! 117: if (erreur < 0)
! 118: {
! 119: (*s_etat_processus).erreur_execution =
! 120: d_ex_routines_mathematiques;
! 121:
! 122: free(matrice_f77);
! 123: return(-1);
! 124: }
! 125:
! 126: if ((rwork = malloc(2 * nombre_colonnes_a * sizeof(real8))) == NULL)
! 127: {
! 128: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 129: return(-1);
! 130: }
! 131:
! 132: if ((work = malloc(2 * nombre_colonnes_a * sizeof(complex16))) == NULL)
! 133: {
! 134: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 135: return(-1);
! 136: }
! 137:
! 138: ordre = (nombre_lignes_a > nombre_colonnes_a)
! 139: ? nombre_colonnes_a : nombre_lignes_a;
! 140:
! 141: zgecon_(&norme, &ordre, matrice_f77,
! 142: &nombre_lignes_a, &anorme, &rcond, work, rwork, &erreur,
! 143: longueur);
! 144:
! 145: free(work);
! 146: free(rwork);
! 147:
! 148: if (erreur < 0)
! 149: {
! 150: (*s_etat_processus).erreur_execution =
! 151: d_ex_routines_mathematiques;
! 152:
! 153: free(matrice_f77);
! 154: return(-1);
! 155: }
! 156: }
! 157:
! 158: (*cond) = ((real8) 1 / rcond);
! 159: return(0);
! 160: }
! 161:
! 162:
! 163: void
! 164: cond(struct_processus *s_etat_processus,
! 165: struct_matrice *s_matrice, real8 *condition)
! 166: {
! 167: integer4 dimension_vecteur_pivot;
! 168: integer4 nombre_lignes_a;
! 169: integer4 nombre_colonnes_a;
! 170: integer4 *pivot;
! 171: integer4 rang;
! 172: integer4 taille_matrice_f77;
! 173:
! 174: real8 cond;
! 175:
! 176: unsigned long i;
! 177: unsigned long j;
! 178: unsigned long k;
! 179:
! 180: void *matrice_f77;
! 181:
! 182: nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
! 183: nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
! 184: dimension_vecteur_pivot = (nombre_lignes_a < nombre_colonnes_a)
! 185: ? nombre_lignes_a : nombre_colonnes_a;
! 186: taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
! 187:
! 188: if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
! 189: sizeof(integer4))) == NULL)
! 190: {
! 191: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 192: return;
! 193: }
! 194:
! 195: switch((*s_matrice).type)
! 196: {
! 197: case 'I' :
! 198: {
! 199: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 200: sizeof(real8))) == NULL)
! 201: {
! 202: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 203: return;
! 204: }
! 205:
! 206: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 207: {
! 208: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 209: {
! 210: ((real8 *) matrice_f77)[k++] = ((integer8 **)
! 211: (*s_matrice).tableau)[j][i];
! 212: }
! 213: }
! 214:
! 215: if ((rang = calcul_cond(s_etat_processus, matrice_f77,
! 216: nombre_lignes_a, nombre_colonnes_a, pivot,
! 217: 'R', &cond)) < 0)
! 218: {
! 219: free(pivot);
! 220: free(matrice_f77);
! 221: return;
! 222: }
! 223:
! 224: free(matrice_f77);
! 225: (*condition) = cond;
! 226: break;
! 227: }
! 228:
! 229: case 'R' :
! 230: {
! 231: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 232: sizeof(real8))) == NULL)
! 233: {
! 234: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 235: return;
! 236: }
! 237:
! 238: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 239: {
! 240: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 241: {
! 242: ((real8 *) matrice_f77)[k++] = ((real8 **)
! 243: (*s_matrice).tableau)[j][i];
! 244: }
! 245: }
! 246:
! 247: if ((rang = calcul_cond(s_etat_processus, matrice_f77,
! 248: nombre_lignes_a, nombre_colonnes_a, pivot,
! 249: 'R', &cond)) < 0)
! 250: {
! 251: free(pivot);
! 252: free(matrice_f77);
! 253: return;
! 254: }
! 255:
! 256: free(matrice_f77);
! 257: (*condition) = cond;
! 258: break;
! 259: }
! 260:
! 261: case 'C' :
! 262: {
! 263: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 264: sizeof(complex16))) == NULL)
! 265: {
! 266: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 267: return;
! 268: }
! 269:
! 270: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 271: {
! 272: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 273: {
! 274: ((complex16 *) matrice_f77)[k++] = ((complex16 **)
! 275: (*s_matrice).tableau)[j][i];
! 276: }
! 277: }
! 278:
! 279: if ((rang = calcul_cond(s_etat_processus, matrice_f77,
! 280: nombre_lignes_a, nombre_colonnes_a, pivot,
! 281: 'C', &cond)) < 0)
! 282: {
! 283: free(pivot);
! 284: free(matrice_f77);
! 285: return;
! 286: }
! 287:
! 288: free(matrice_f77);
! 289: (*condition) = cond;
! 290: break;
! 291: }
! 292: }
! 293:
! 294: free(pivot);
! 295:
! 296: return;
! 297: }
! 298:
! 299:
! 300: /*
! 301: ================================================================================
! 302: Fonction effectuant une décomposition en valeurs singulières
! 303: ================================================================================
! 304: Entrées : struct_matrice
! 305: --------------------------------------------------------------------------------
! 306: Sorties : valeurs singulières dans le vecteur S. Si les pointeurs sur U
! 307: et VH ne sont pas nul, les matrices U et VH sont aussi calculées.
! 308: --------------------------------------------------------------------------------
! 309: Effets de bord : néant
! 310: ================================================================================
! 311: */
! 312:
! 313: void valeurs_singulieres(struct_processus *s_etat_processus,
! 314: struct_matrice *s_matrice, struct_matrice *matrice_u,
! 315: struct_vecteur *vecteur_s, struct_matrice *matrice_vh)
! 316: {
! 317: integer4 erreur;
! 318: integer4 longueur;
! 319: integer4 lwork;
! 320: integer4 nombre_colonnes_a;
! 321: integer4 nombre_lignes_a;
! 322: integer4 nombre_valeurs_singulieres;
! 323: integer4 taille_matrice_f77;
! 324:
! 325: real8 *rwork;
! 326:
! 327: unsigned char jobu;
! 328: unsigned char jobvh;
! 329:
! 330: unsigned long i;
! 331: unsigned long j;
! 332: unsigned long k;
! 333:
! 334: void *matrice_f77;
! 335: void *matrice_f77_u;
! 336: void *matrice_f77_vh;
! 337: void *vecteur_f77_s;
! 338: void *work;
! 339:
! 340: longueur = 1;
! 341:
! 342: if (matrice_u != NULL)
! 343: {
! 344: jobu = 'A';
! 345: }
! 346: else
! 347: {
! 348: jobu = 'N';
! 349: }
! 350:
! 351: if (matrice_vh != NULL)
! 352: {
! 353: jobvh = 'A';
! 354: }
! 355: else
! 356: {
! 357: jobvh = 'N';
! 358: }
! 359:
! 360: nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
! 361: nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
! 362: taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
! 363: nombre_valeurs_singulieres = (nombre_lignes_a < nombre_colonnes_a)
! 364: ? nombre_lignes_a : nombre_colonnes_a;
! 365:
! 366: switch((*s_matrice).type)
! 367: {
! 368: case 'I' :
! 369: {
! 370: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 371: sizeof(real8))) == NULL)
! 372: {
! 373: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 374: return;
! 375: }
! 376:
! 377: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 378: {
! 379: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 380: {
! 381: ((real8 *) matrice_f77)[k++] = ((integer8 **)
! 382: (*s_matrice).tableau)[j][i];
! 383: }
! 384: }
! 385:
! 386: lwork = -1;
! 387:
! 388: if ((work = malloc(sizeof(real8))) == NULL)
! 389: {
! 390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 391: return;
! 392: }
! 393:
! 394: if (matrice_u != NULL)
! 395: {
! 396: if ((matrice_f77_u = malloc(nombre_lignes_a * nombre_lignes_a *
! 397: sizeof(real8))) == NULL)
! 398: {
! 399: (*s_etat_processus).erreur_systeme =
! 400: d_es_allocation_memoire;
! 401: return;
! 402: }
! 403: }
! 404: else
! 405: {
! 406: matrice_f77_u = NULL;
! 407: }
! 408:
! 409: if ((vecteur_f77_s = malloc(nombre_valeurs_singulieres *
! 410: sizeof(real8))) == NULL)
! 411: {
! 412: (*s_etat_processus).erreur_systeme =
! 413: d_es_allocation_memoire;
! 414: return;
! 415: }
! 416:
! 417: if (matrice_vh != NULL)
! 418: {
! 419: if ((matrice_f77_vh = malloc(nombre_colonnes_a
! 420: * nombre_colonnes_a * sizeof(real8))) == NULL)
! 421: {
! 422: (*s_etat_processus).erreur_systeme =
! 423: d_es_allocation_memoire;
! 424: return;
! 425: }
! 426: }
! 427: else
! 428: {
! 429: matrice_f77_vh = NULL;
! 430: }
! 431:
! 432: dgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 433: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 434: matrice_f77_u, &nombre_lignes_a,
! 435: matrice_f77_vh, &nombre_colonnes_a,
! 436: work, &lwork, &erreur, longueur, longueur);
! 437:
! 438: lwork = ((real8 *) work)[0];
! 439: free(work);
! 440:
! 441: if ((work = malloc(lwork * sizeof(real8))) == NULL)
! 442: {
! 443: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 444: return;
! 445: }
! 446:
! 447: dgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 448: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 449: matrice_f77_u, &nombre_lignes_a,
! 450: matrice_f77_vh, &nombre_colonnes_a,
! 451: work, &lwork, &erreur, longueur, longueur);
! 452:
! 453: free(work);
! 454: free(matrice_f77);
! 455:
! 456: if (erreur != 0)
! 457: {
! 458: if (erreur > 0)
! 459: {
! 460: (*s_etat_processus).exception = d_ep_decomposition_SVD;
! 461: }
! 462: else
! 463: {
! 464: (*s_etat_processus).erreur_execution =
! 465: d_ex_routines_mathematiques;
! 466: }
! 467:
! 468: free(matrice_f77_u);
! 469: free(matrice_f77_vh);
! 470: free(vecteur_f77_s);
! 471: return;
! 472: }
! 473:
! 474: if (matrice_u != NULL)
! 475: {
! 476: (*matrice_u).nombre_lignes = nombre_lignes_a;
! 477: (*matrice_u).nombre_colonnes = nombre_lignes_a;
! 478:
! 479: if (((*matrice_u).tableau = malloc((*matrice_u).nombre_lignes *
! 480: sizeof(real8 *))) == NULL)
! 481: {
! 482: (*s_etat_processus).erreur_systeme =
! 483: d_es_allocation_memoire;
! 484: return;
! 485: }
! 486:
! 487: for(i = 0; i < (*matrice_u).nombre_lignes; i++)
! 488: {
! 489: if ((((real8 **) (*matrice_u).tableau)[i] =
! 490: malloc((*matrice_u).nombre_colonnes *
! 491: sizeof(real8))) == NULL)
! 492: {
! 493: (*s_etat_processus).erreur_systeme =
! 494: d_es_allocation_memoire;
! 495: return;
! 496: }
! 497: }
! 498:
! 499: for(k = 0, i = 0; i < (*matrice_u).nombre_colonnes; i++)
! 500: {
! 501: for(j = 0; j < (*matrice_u).nombre_lignes; j++)
! 502: {
! 503: ((real8 **) (*matrice_u).tableau)[j][i] =
! 504: ((real8 *) matrice_f77_u)[k++];
! 505: }
! 506: }
! 507:
! 508: free(matrice_f77_u);
! 509: }
! 510:
! 511: if (matrice_vh != NULL)
! 512: {
! 513: (*matrice_vh).nombre_lignes = nombre_colonnes_a;
! 514: (*matrice_vh).nombre_colonnes = nombre_colonnes_a;
! 515:
! 516: if (((*matrice_vh).tableau = malloc((*matrice_vh)
! 517: .nombre_lignes * sizeof(real8 *))) == NULL)
! 518: {
! 519: (*s_etat_processus).erreur_systeme =
! 520: d_es_allocation_memoire;
! 521: return;
! 522: }
! 523:
! 524: for(i = 0; i < (*matrice_vh).nombre_lignes; i++)
! 525: {
! 526: if ((((real8 **) (*matrice_vh).tableau)[i] =
! 527: malloc((*matrice_vh).nombre_colonnes *
! 528: sizeof(real8))) == NULL)
! 529: {
! 530: (*s_etat_processus).erreur_systeme =
! 531: d_es_allocation_memoire;
! 532: return;
! 533: }
! 534: }
! 535:
! 536: for(k = 0, i = 0; i < (*matrice_vh).nombre_colonnes; i++)
! 537: {
! 538: for(j = 0; j < (*matrice_vh).nombre_lignes; j++)
! 539: {
! 540: ((real8 **) (*matrice_vh).tableau)[j][i] =
! 541: ((real8 *) matrice_f77_vh)[k++];
! 542: }
! 543: }
! 544:
! 545: free(matrice_f77_vh);
! 546: }
! 547:
! 548: (*vecteur_s).taille = nombre_valeurs_singulieres;
! 549: (*vecteur_s).type = 'R';
! 550: (*vecteur_s).tableau = vecteur_f77_s;
! 551:
! 552: break;
! 553: }
! 554:
! 555: case 'R' :
! 556: {
! 557: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 558: sizeof(real8))) == NULL)
! 559: {
! 560: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 561: return;
! 562: }
! 563:
! 564: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 565: {
! 566: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 567: {
! 568: ((real8 *) matrice_f77)[k++] = ((real8 **)
! 569: (*s_matrice).tableau)[j][i];
! 570: }
! 571: }
! 572:
! 573: lwork = -1;
! 574:
! 575: if ((work = malloc(sizeof(real8))) == NULL)
! 576: {
! 577: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 578: return;
! 579: }
! 580:
! 581: if (matrice_u != NULL)
! 582: {
! 583: if ((matrice_f77_u = malloc(nombre_lignes_a * nombre_lignes_a *
! 584: sizeof(real8))) == NULL)
! 585: {
! 586: (*s_etat_processus).erreur_systeme =
! 587: d_es_allocation_memoire;
! 588: return;
! 589: }
! 590: }
! 591: else
! 592: {
! 593: matrice_f77_u = NULL;
! 594: }
! 595:
! 596: if ((vecteur_f77_s = malloc(nombre_valeurs_singulieres *
! 597: sizeof(real8))) == NULL)
! 598: {
! 599: (*s_etat_processus).erreur_systeme =
! 600: d_es_allocation_memoire;
! 601: return;
! 602: }
! 603:
! 604: if (matrice_vh != NULL)
! 605: {
! 606: if ((matrice_f77_vh = malloc(nombre_colonnes_a
! 607: * nombre_colonnes_a * sizeof(real8))) == NULL)
! 608: {
! 609: (*s_etat_processus).erreur_systeme =
! 610: d_es_allocation_memoire;
! 611: return;
! 612: }
! 613: }
! 614: else
! 615: {
! 616: matrice_f77_vh = NULL;
! 617: }
! 618:
! 619: dgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 620: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 621: matrice_f77_u, &nombre_lignes_a,
! 622: matrice_f77_vh, &nombre_colonnes_a,
! 623: work, &lwork, &erreur, longueur, longueur);
! 624:
! 625: lwork = ((real8 *) work)[0];
! 626: free(work);
! 627:
! 628: if ((work = malloc(lwork * sizeof(real8))) == NULL)
! 629: {
! 630: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 631: return;
! 632: }
! 633:
! 634: dgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 635: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 636: matrice_f77_u, &nombre_lignes_a,
! 637: matrice_f77_vh, &nombre_colonnes_a,
! 638: work, &lwork, &erreur, longueur, longueur);
! 639:
! 640: free(work);
! 641: free(matrice_f77);
! 642:
! 643: if (erreur != 0)
! 644: {
! 645: if (erreur > 0)
! 646: {
! 647: (*s_etat_processus).exception = d_ep_decomposition_SVD;
! 648: }
! 649: else
! 650: {
! 651: (*s_etat_processus).erreur_execution =
! 652: d_ex_routines_mathematiques;
! 653: }
! 654:
! 655: free(matrice_f77_u);
! 656: free(matrice_f77_vh);
! 657: free(vecteur_f77_s);
! 658: return;
! 659: }
! 660:
! 661: if (matrice_u != NULL)
! 662: {
! 663: (*matrice_u).nombre_lignes = nombre_lignes_a;
! 664: (*matrice_u).nombre_colonnes = nombre_lignes_a;
! 665:
! 666: if (((*matrice_u).tableau = malloc((*matrice_u).nombre_lignes *
! 667: sizeof(real8 *))) == NULL)
! 668: {
! 669: (*s_etat_processus).erreur_systeme =
! 670: d_es_allocation_memoire;
! 671: return;
! 672: }
! 673:
! 674: for(i = 0; i < (*matrice_u).nombre_lignes; i++)
! 675: {
! 676: if ((((real8 **) (*matrice_u).tableau)[i] =
! 677: malloc((*matrice_u).nombre_colonnes *
! 678: sizeof(real8))) == NULL)
! 679: {
! 680: (*s_etat_processus).erreur_systeme =
! 681: d_es_allocation_memoire;
! 682: return;
! 683: }
! 684: }
! 685:
! 686: for(k = 0, i = 0; i < (*matrice_u).nombre_colonnes; i++)
! 687: {
! 688: for(j = 0; j < (*matrice_u).nombre_lignes; j++)
! 689: {
! 690: ((real8 **) (*matrice_u).tableau)[j][i] =
! 691: ((real8 *) matrice_f77_u)[k++];
! 692: }
! 693: }
! 694:
! 695: free(matrice_f77_u);
! 696: }
! 697:
! 698: if (matrice_vh != NULL)
! 699: {
! 700: (*matrice_vh).nombre_lignes = nombre_colonnes_a;
! 701: (*matrice_vh).nombre_colonnes = nombre_colonnes_a;
! 702:
! 703: if (((*matrice_vh).tableau = malloc((*matrice_vh)
! 704: .nombre_lignes * sizeof(real8 *))) == NULL)
! 705: {
! 706: (*s_etat_processus).erreur_systeme =
! 707: d_es_allocation_memoire;
! 708: return;
! 709: }
! 710:
! 711: for(i = 0; i < (*matrice_vh).nombre_lignes; i++)
! 712: {
! 713: if ((((real8 **) (*matrice_vh).tableau)[i] =
! 714: malloc((*matrice_vh).nombre_colonnes *
! 715: sizeof(real8))) == NULL)
! 716: {
! 717: (*s_etat_processus).erreur_systeme =
! 718: d_es_allocation_memoire;
! 719: return;
! 720: }
! 721: }
! 722:
! 723: for(k = 0, i = 0; i < (*matrice_vh).nombre_colonnes; i++)
! 724: {
! 725: for(j = 0; j < (*matrice_vh).nombre_lignes; j++)
! 726: {
! 727: ((real8 **) (*matrice_vh).tableau)[j][i] =
! 728: ((real8 *) matrice_f77_vh)[k++];
! 729: }
! 730: }
! 731:
! 732: free(matrice_f77_vh);
! 733: }
! 734:
! 735: (*vecteur_s).taille = nombre_valeurs_singulieres;
! 736: (*vecteur_s).type = 'R';
! 737: (*vecteur_s).tableau = vecteur_f77_s;
! 738:
! 739: break;
! 740: }
! 741:
! 742: case 'C' :
! 743: {
! 744: if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
! 745: sizeof(complex16))) == NULL)
! 746: {
! 747: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 748: return;
! 749: }
! 750:
! 751: for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
! 752: {
! 753: for(j = 0; j < (*s_matrice).nombre_lignes; j++)
! 754: {
! 755: ((complex16 *) matrice_f77)[k++] = ((complex16 **)
! 756: (*s_matrice).tableau)[j][i];
! 757: }
! 758: }
! 759:
! 760: lwork = -1;
! 761:
! 762: if ((work = malloc(sizeof(complex16))) == NULL)
! 763: {
! 764: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 765: return;
! 766: }
! 767:
! 768: if (matrice_u != NULL)
! 769: {
! 770: if ((matrice_f77_u = malloc(nombre_lignes_a * nombre_lignes_a *
! 771: sizeof(complex16))) == NULL)
! 772: {
! 773: (*s_etat_processus).erreur_systeme =
! 774: d_es_allocation_memoire;
! 775: return;
! 776: }
! 777: }
! 778: else
! 779: {
! 780: matrice_f77_u = NULL;
! 781: }
! 782:
! 783: if ((vecteur_f77_s = malloc(nombre_valeurs_singulieres *
! 784: sizeof(real8))) == NULL)
! 785: {
! 786: (*s_etat_processus).erreur_systeme =
! 787: d_es_allocation_memoire;
! 788: return;
! 789: }
! 790:
! 791: if (matrice_vh != NULL)
! 792: {
! 793: if ((matrice_f77_vh = malloc(nombre_colonnes_a
! 794: * nombre_colonnes_a * sizeof(complex16))) == NULL)
! 795: {
! 796: (*s_etat_processus).erreur_systeme =
! 797: d_es_allocation_memoire;
! 798: return;
! 799: }
! 800: }
! 801: else
! 802: {
! 803: matrice_f77_vh = NULL;
! 804: }
! 805:
! 806: if ((rwork = malloc(5 * nombre_valeurs_singulieres * sizeof(real8)))
! 807: == NULL)
! 808: {
! 809: (*s_etat_processus).erreur_systeme =
! 810: d_es_allocation_memoire;
! 811: return;
! 812: }
! 813:
! 814: zgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 815: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 816: matrice_f77_u, &nombre_lignes_a,
! 817: matrice_f77_vh, &nombre_colonnes_a,
! 818: work, &lwork, rwork, &erreur, longueur, longueur);
! 819:
! 820: lwork = ((real8 *) work)[0];
! 821: free(work);
! 822:
! 823: if ((work = malloc(lwork * sizeof(real8))) == NULL)
! 824: {
! 825: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 826: return;
! 827: }
! 828:
! 829: zgesvd_(&jobu, &jobvh, &nombre_lignes_a, &nombre_colonnes_a,
! 830: matrice_f77, &nombre_lignes_a, vecteur_f77_s,
! 831: matrice_f77_u, &nombre_lignes_a,
! 832: matrice_f77_vh, &nombre_colonnes_a,
! 833: work, &lwork, rwork, &erreur, longueur, longueur);
! 834:
! 835: free(work);
! 836: free(rwork);
! 837: free(matrice_f77);
! 838:
! 839: if (erreur != 0)
! 840: {
! 841: if (erreur > 0)
! 842: {
! 843: (*s_etat_processus).exception = d_ep_decomposition_SVD;
! 844: }
! 845: else
! 846: {
! 847: (*s_etat_processus).erreur_execution =
! 848: d_ex_routines_mathematiques;
! 849: }
! 850:
! 851: free(matrice_f77_u);
! 852: free(matrice_f77_vh);
! 853: free(vecteur_f77_s);
! 854: return;
! 855: }
! 856:
! 857: if (matrice_u != NULL)
! 858: {
! 859: (*matrice_u).nombre_lignes = nombre_lignes_a;
! 860: (*matrice_u).nombre_colonnes = nombre_lignes_a;
! 861:
! 862: if (((*matrice_u).tableau = malloc((*matrice_u).nombre_lignes *
! 863: sizeof(complex16 *))) == NULL)
! 864: {
! 865: (*s_etat_processus).erreur_systeme =
! 866: d_es_allocation_memoire;
! 867: return;
! 868: }
! 869:
! 870: for(i = 0; i < (*matrice_u).nombre_lignes; i++)
! 871: {
! 872: if ((((complex16 **) (*matrice_u).tableau)[i] =
! 873: malloc((*matrice_u).nombre_colonnes *
! 874: sizeof(complex16))) == NULL)
! 875: {
! 876: (*s_etat_processus).erreur_systeme =
! 877: d_es_allocation_memoire;
! 878: return;
! 879: }
! 880: }
! 881:
! 882: for(k = 0, i = 0; i < (*matrice_u).nombre_colonnes; i++)
! 883: {
! 884: for(j = 0; j < (*matrice_u).nombre_lignes; j++)
! 885: {
! 886: ((complex16 **) (*matrice_u).tableau)[j][i] =
! 887: ((complex16 *) matrice_f77_u)[k++];
! 888: }
! 889: }
! 890:
! 891: free(matrice_f77_u);
! 892: }
! 893:
! 894: if (matrice_vh != NULL)
! 895: {
! 896: (*matrice_vh).nombre_lignes = nombre_colonnes_a;
! 897: (*matrice_vh).nombre_colonnes = nombre_colonnes_a;
! 898:
! 899: if (((*matrice_vh).tableau = malloc((*matrice_vh)
! 900: .nombre_lignes * sizeof(complex16 *))) == NULL)
! 901: {
! 902: (*s_etat_processus).erreur_systeme =
! 903: d_es_allocation_memoire;
! 904: return;
! 905: }
! 906:
! 907: for(i = 0; i < (*matrice_vh).nombre_lignes; i++)
! 908: {
! 909: if ((((complex16 **) (*matrice_vh).tableau)[i] =
! 910: malloc((*matrice_vh).nombre_colonnes *
! 911: sizeof(complex16))) == NULL)
! 912: {
! 913: (*s_etat_processus).erreur_systeme =
! 914: d_es_allocation_memoire;
! 915: return;
! 916: }
! 917: }
! 918:
! 919: for(k = 0, i = 0; i < (*matrice_vh).nombre_colonnes; i++)
! 920: {
! 921: for(j = 0; j < (*matrice_vh).nombre_lignes; j++)
! 922: {
! 923: ((complex16 **) (*matrice_vh).tableau)[j][i] =
! 924: ((complex16 *) matrice_f77_vh)[k++];
! 925: }
! 926: }
! 927:
! 928: free(matrice_f77_vh);
! 929: }
! 930:
! 931: (*vecteur_s).taille = nombre_valeurs_singulieres;
! 932: (*vecteur_s).type = 'R';
! 933: (*vecteur_s).tableau = vecteur_f77_s;
! 934:
! 935: break;
! 936: }
! 937: }
! 938:
! 939: return;
! 940: }
! 941:
! 942: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>