File:  [local] / rpl / src / algebre_lineaire4.c
Revision 1.66: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:38 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>