File:  [local] / rpl / src / algebre_lineaire2.c
Revision 1.38: download - view: text, annotated - select for diffs - revision graph
Tue Dec 18 13:19:33 2012 UTC (11 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.1.12 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.12
    4:   Copyright (C) 1989-2012 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 réalisation la factorisation LU d'une matrice quelconque
   29: ================================================================================
   30:   Entrées : struct_matrice
   31: --------------------------------------------------------------------------------
   32:   Sorties : décomposition A=PLU de la matrice d'entrée et drapeau d'erreur.
   33:             La matrice en entrée est écrasée. La matrice de sortie est réelle
   34:             si la matrice d'entrée est entière ou réelle, et complexe
   35:             si la matrice d'entrée est complexe.
   36:             La routine renvoie aussi une matrice d'entiers correspondant
   37:             à la matrice de permutation. Cette matrice est allouée par
   38:             la routine et vaut NULL sinon.
   39: --------------------------------------------------------------------------------
   40:   Effets de bord : néant
   41: ================================================================================
   42: */
   43: 
   44: void
   45: factorisation_lu(struct_processus *s_etat_processus,
   46:         struct_matrice *s_matrice, struct_matrice **s_permutation)
   47: {
   48:     integer4                    dimension_vecteur_pivot;
   49:     integer4                    erreur;
   50:     integer4                    nombre_colonnes_a;
   51:     integer4                    nombre_lignes_a;
   52:     integer4                    *pivot;
   53: 
   54:     long                        n;
   55: 
   56:     unsigned long               i;
   57:     unsigned long               j;
   58:     unsigned long               k;
   59:     unsigned long               taille_matrice_f77;
   60: 
   61:     void                        *matrice_f77;
   62:     void                        *tampon;
   63: 
   64:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
   65:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
   66:     dimension_vecteur_pivot = (nombre_lignes_a < nombre_colonnes_a)
   67:             ? nombre_lignes_a : nombre_colonnes_a;
   68:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
   69: 
   70:     switch((*s_matrice).type)
   71:     {
   72:         case 'I' :
   73:         {
   74:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
   75:                     sizeof(real8))) == NULL)
   76:             {
   77:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   78:                 return;
   79:             }
   80: 
   81:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
   82:             {
   83:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
   84:                 {
   85:                     ((real8 *) matrice_f77)[k++] = ((integer8 **)
   86:                             (*s_matrice).tableau)[j][i];
   87:                 }
   88:             }
   89: 
   90:             for(i = 0; i < (*s_matrice).nombre_lignes; i++)
   91:             {
   92:                 free(((integer8 **) (*s_matrice).tableau)[i]);
   93:             }
   94: 
   95:             free((integer8 **) (*s_matrice).tableau);
   96: 
   97:             if (((*s_matrice).tableau = (void **) malloc((*s_matrice)
   98:                     .nombre_lignes * sizeof(real8 *))) == NULL)
   99:             {
  100:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  101:                 return;
  102:             }
  103: 
  104:             for(i = 0; i < (*s_matrice).nombre_lignes; i++)
  105:             {
  106:                 if ((((*s_matrice).tableau)[i] =
  107:                         (real8 *) malloc((*s_matrice)
  108:                         .nombre_colonnes * sizeof(real8))) == NULL)
  109:                 {
  110:                     (*s_etat_processus).erreur_systeme =
  111:                             d_es_allocation_memoire;
  112:                     return;
  113:                 }
  114:             }
  115: 
  116:             (*s_matrice).type = 'R';
  117: 
  118:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
  119:                     sizeof(integer4))) == NULL)
  120:             {
  121:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  122:                 return;
  123:             }
  124: 
  125:             dgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
  126:                     &nombre_lignes_a, pivot, &erreur);
  127: 
  128:             if (erreur < 0)
  129:             {
  130:                 (*s_etat_processus).erreur_execution =
  131:                         d_ex_routines_mathematiques;
  132: 
  133:                 free(pivot);
  134:                 free(matrice_f77);
  135:                 return;
  136:             }
  137: 
  138:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  139:             {
  140:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  141:                 {
  142:                     ((real8 **) (*s_matrice).tableau)[j][i] =
  143:                             ((real8 *) matrice_f77)[k++];
  144:                 }
  145:             }
  146: 
  147:             free(matrice_f77);
  148: 
  149:             (**s_permutation).type = 'I';
  150:             (**s_permutation).nombre_lignes = dimension_vecteur_pivot;
  151:             (**s_permutation).nombre_colonnes = dimension_vecteur_pivot;
  152: 
  153:             if (((**s_permutation).tableau = malloc((**s_permutation)
  154:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  155:             {
  156:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  157:                 return;
  158:             }
  159: 
  160:             for(i = 0; i < (**s_permutation).nombre_lignes; i++)
  161:             {
  162:                 if ((((integer8 **) (**s_permutation).tableau)[i] =
  163:                         (integer8 *) malloc((**s_permutation).nombre_colonnes *
  164:                         sizeof(integer8))) == NULL)
  165:                 {
  166:                     (*s_etat_processus).erreur_systeme =
  167:                             d_es_allocation_memoire;
  168:                     return;
  169:                 }
  170: 
  171:                 for(j = 0; j < (**s_permutation).nombre_colonnes; j++)
  172:                 {
  173:                     ((integer8 **) (**s_permutation).tableau)[i][j] =
  174:                             (j == i) ? 1 : 0;
  175:                 }
  176:             }
  177: 
  178:             for(n = dimension_vecteur_pivot - 1; n >= 0; n--)
  179:             {
  180:                 if ((pivot[n] - 1) != n)
  181:                 {
  182:                     tampon = ((integer8 **) (**s_permutation).tableau)[n];
  183:                     ((integer8 **) (**s_permutation).tableau)[n] =
  184:                             ((integer8 **) (**s_permutation).tableau)
  185:                             [pivot[n] - 1];
  186:                     ((integer8 **) (**s_permutation).tableau)[pivot[n] - 1] =
  187:                             tampon;
  188:                 }
  189:             }
  190: 
  191:             free(pivot);
  192: 
  193:             break;
  194:         }
  195: 
  196:         case 'R' :
  197:         {
  198:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
  199:                     sizeof(real8))) == NULL)
  200:             {
  201:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  202:                 return;
  203:             }
  204: 
  205:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  206:             {
  207:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  208:                 {
  209:                     ((real8 *) matrice_f77)[k++] = ((real8 **)
  210:                             (*s_matrice).tableau)[j][i];
  211:                 }
  212:             }
  213: 
  214:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
  215:                     sizeof(integer4))) == NULL)
  216:             {
  217:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  218:                 return;
  219:             }
  220: 
  221:             dgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
  222:                     &nombre_lignes_a, pivot, &erreur);
  223: 
  224:             if (erreur < 0)
  225:             {
  226:                 (*s_etat_processus).erreur_execution =
  227:                         d_ex_routines_mathematiques;
  228: 
  229:                 free(pivot);
  230:                 free(matrice_f77);
  231:                 return;
  232:             }
  233: 
  234:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  235:             {
  236:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  237:                 {
  238:                     ((real8 **) (*s_matrice).tableau)[j][i] =
  239:                             ((real8 *) matrice_f77)[k++];
  240:                 }
  241:             }
  242: 
  243:             free(matrice_f77);
  244: 
  245:             (**s_permutation).type = 'I';
  246:             (**s_permutation).nombre_lignes = dimension_vecteur_pivot;
  247:             (**s_permutation).nombre_colonnes = dimension_vecteur_pivot;
  248: 
  249:             if (((**s_permutation).tableau = malloc((**s_permutation)
  250:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  251:             {
  252:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  253:                 return;
  254:             }
  255: 
  256:             for(i = 0; i < (**s_permutation).nombre_lignes; i++)
  257:             {
  258:                 if ((((integer8 **) (**s_permutation).tableau)[i] =
  259:                         (integer8 *) malloc((**s_permutation).nombre_colonnes *
  260:                         sizeof(integer8))) == NULL)
  261:                 {
  262:                     (*s_etat_processus).erreur_systeme =
  263:                             d_es_allocation_memoire;
  264:                     return;
  265:                 }
  266: 
  267:                 for(j = 0; j < (**s_permutation).nombre_colonnes; j++)
  268:                 {
  269:                     ((integer8 **) (**s_permutation).tableau)[i][j] =
  270:                             (j == i) ? 1 : 0;
  271:                 }
  272:             }
  273: 
  274:             for(n = dimension_vecteur_pivot - 1; n >= 0; n--)
  275:             {
  276:                 if ((pivot[n] - 1) != n)
  277:                 {
  278:                     tampon = ((integer8 **) (**s_permutation).tableau)[n];
  279:                     ((integer8 **) (**s_permutation).tableau)[n] =
  280:                             ((integer8 **) (**s_permutation).tableau)
  281:                             [pivot[n] - 1];
  282:                     ((integer8 **) (**s_permutation).tableau)[pivot[n] - 1] =
  283:                             tampon;
  284:                 }
  285:             }
  286: 
  287:             free(pivot);
  288: 
  289:             break;
  290:         }
  291: 
  292:         case 'C' :
  293:         {
  294:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
  295:                     sizeof(complex16))) == NULL)
  296:             {
  297:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  298:                 return;
  299:             }
  300: 
  301:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  302:             {
  303:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  304:                 {
  305:                     ((complex16 *) matrice_f77)[k++] = ((complex16 **)
  306:                             (*s_matrice).tableau)[j][i];
  307:                 }
  308:             }
  309: 
  310:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
  311:                     sizeof(integer4))) == NULL)
  312:             {
  313:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  314:                 return;
  315:             }
  316: 
  317:             zgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
  318:                     &nombre_lignes_a, pivot, &erreur);
  319: 
  320:             if (erreur < 0)
  321:             {
  322:                 (*s_etat_processus).erreur_execution =
  323:                         d_ex_routines_mathematiques;
  324:                 free(pivot);
  325:                 free(matrice_f77);
  326:                 return;
  327:             }
  328: 
  329:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  330:             {
  331:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  332:                 {
  333:                     ((complex16 **) (*s_matrice).tableau)[j][i] =
  334:                             ((complex16 *) matrice_f77)[k++];
  335:                 }
  336:             }
  337: 
  338:             free(matrice_f77);
  339: 
  340:             (**s_permutation).type = 'I';
  341:             (**s_permutation).nombre_lignes = dimension_vecteur_pivot;
  342:             (**s_permutation).nombre_colonnes = dimension_vecteur_pivot;
  343: 
  344:             if (((**s_permutation).tableau = malloc((**s_permutation)
  345:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  346:             {
  347:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  348:                 return;
  349:             }
  350: 
  351:             for(i = 0; i < (**s_permutation).nombre_lignes; i++)
  352:             {
  353:                 if ((((integer8 **) (**s_permutation).tableau)[i] =
  354:                         (integer8 *) malloc((**s_permutation).nombre_colonnes *
  355:                         sizeof(integer8))) == NULL)
  356:                 {
  357:                     (*s_etat_processus).erreur_systeme =
  358:                             d_es_allocation_memoire;
  359:                     return;
  360:                 }
  361: 
  362:                 for(j = 0; j < (**s_permutation).nombre_colonnes; j++)
  363:                 {
  364:                     ((integer8 **) (**s_permutation).tableau)[i][j] =
  365:                             (j == i) ? 1 : 0;
  366:                 }
  367:             }
  368: 
  369:             for(n = dimension_vecteur_pivot - 1; n >= 0; n--)
  370:             {
  371:                 if ((pivot[n] - 1) != n)
  372:                 {
  373:                     tampon = ((integer8 **) (**s_permutation).tableau)[n];
  374:                     ((integer8 **) (**s_permutation).tableau)[n] =
  375:                             ((integer8 **) (**s_permutation).tableau)
  376:                             [pivot[n] - 1];
  377:                     ((integer8 **) (**s_permutation).tableau)[pivot[n] - 1] =
  378:                             tampon;
  379:                 }
  380:             }
  381: 
  382:             free(pivot);
  383: 
  384:             break;
  385:         }
  386:     }
  387: 
  388:     return;
  389: }
  390: 
  391: 
  392: /*
  393: ================================================================================
  394:   Fonction réalisation la factorisation de Cholesky d'une matrice symétrique
  395:   définie positive
  396: ================================================================================
  397:   Entrées : struct_matrice, mode (U ou L selon la décomposition demandée)
  398: --------------------------------------------------------------------------------
  399:   Sorties : décomposition de Cholesky de la matrice d'entrée et drapeau
  400:             d'erreur.  La matrice en entrée est écrasée.
  401: --------------------------------------------------------------------------------
  402:   Effets de bord : néant
  403: ================================================================================
  404: */
  405: 
  406: void
  407: factorisation_cholesky(struct_processus *s_etat_processus,
  408:         struct_matrice *s_matrice, unsigned char mode)
  409: {
  410:     integer4                    erreur;
  411:     integer4                    i;
  412:     integer4                    j;
  413:     integer4                    nombre_colonnes_a;
  414:     integer4                    nombre_lignes_a;
  415: 
  416:     unsigned long               taille_matrice_f77;
  417: 
  418:     void                        *matrice_f77;
  419: 
  420:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
  421:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
  422: 
  423:     if (nombre_lignes_a != nombre_colonnes_a)
  424:     {
  425:         (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  426:         return;
  427:     }
  428: 
  429:     taille_matrice_f77 = (nombre_lignes_a * (nombre_colonnes_a + 1)) / 2;
  430: 
  431:     switch((*s_matrice).type)
  432:     {
  433:         case 'I' :
  434:         {
  435:             /*
  436:              * Allocation du vecteur représentant la matrice triangulaire
  437:              */
  438: 
  439:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
  440:                     sizeof(real8))) == NULL)
  441:             {
  442:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  443:                 return;
  444:             }
  445: 
  446:             if (mode == 'U')
  447:             {
  448:                 for(j = 1; j <= nombre_colonnes_a; j++)
  449:                 {
  450:                     for(i = 1; i <= j; i++)
  451:                     {
  452:                         ((real8 *) matrice_f77)[i + (((j - 1) * j) / 2) - 1] =
  453:                                 (real8) ((integer8 **) (*s_matrice).tableau)
  454:                                 [i - 1][j - 1];
  455:                     }
  456:                 }
  457:             }
  458:             else
  459:             {
  460:                 for(j = 1; j <= nombre_colonnes_a; j++)
  461:                 {
  462:                     for(i = j; i <= nombre_colonnes_a; i++)
  463:                     {
  464:                         ((real8 *) matrice_f77)[(i - 1) + (((j - 1) *
  465:                                 ((nombre_colonnes_a * 2) - j)) / 2)] = (real8)
  466:                                 ((integer8 **) (*s_matrice).tableau)
  467:                                 [i - 1][j - 1];
  468:                     }
  469:                 }
  470:             }
  471: 
  472:             dpptrf_(&mode, &nombre_colonnes_a, matrice_f77, &erreur, 1);
  473: 
  474:             if (erreur != 0)
  475:             {
  476:                 if (erreur > 0)
  477:                 {
  478:                     (*s_etat_processus).exception =
  479:                             d_ep_matrice_non_definie_positive;
  480:                 }
  481:                 else
  482:                 {
  483:                     (*s_etat_processus).erreur_execution =
  484:                             d_ex_routines_mathematiques;
  485:                 }
  486: 
  487:                 free(matrice_f77);
  488:                 return;
  489:             }
  490: 
  491:             for(i = 0; i < (integer4) (*s_matrice).nombre_lignes; i++)
  492:             {
  493:                 free(((integer8 **) (*s_matrice).tableau)[i]);
  494:             }
  495: 
  496:             free((integer8 **) (*s_matrice).tableau);
  497: 
  498:             if (((*s_matrice).tableau = (void **) malloc((*s_matrice)
  499:                     .nombre_lignes * sizeof(real8 *))) == NULL)
  500:             {
  501:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  502:                 return;
  503:             }
  504: 
  505:             for(i = 0; i < (integer4) (*s_matrice).nombre_lignes; i++)
  506:             {
  507:                 if ((((*s_matrice).tableau)[i] =
  508:                         (real8 *) malloc((*s_matrice)
  509:                         .nombre_colonnes * sizeof(real8))) == NULL)
  510:                 {
  511:                     (*s_etat_processus).erreur_systeme =
  512:                             d_es_allocation_memoire;
  513:                     return;
  514:                 }
  515:             }
  516: 
  517:             (*s_matrice).type = 'R';
  518: 
  519:             if (mode == 'U')
  520:             {
  521:                 for(j = 1; j <= nombre_colonnes_a; j++)
  522:                 {
  523:                     for(i = 1; i <= j; i++)
  524:                     {
  525:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] =
  526:                                 ((real8 *) matrice_f77)
  527:                                 [i + (((j - 1) * j) / 2) - 1];
  528:                     }
  529:                 }
  530: 
  531:                 for(j = 1; j <= nombre_colonnes_a; j++)
  532:                 {
  533:                     for(i = j + 1; i <= nombre_colonnes_a; i++)
  534:                     {
  535:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] = 0;
  536:                     }
  537:                 }
  538:             }
  539:             else
  540:             {
  541:                 for(j = 1; j <= nombre_colonnes_a; j++)
  542:                 {
  543:                     for(i = j; i <= nombre_colonnes_a; i++)
  544:                     {
  545:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] =
  546:                                 ((real8 *) matrice_f77)[(i - 1) + (((j - 1) *
  547:                                 ((nombre_colonnes_a * 2) - j)) / 2)];
  548:                     }
  549:                 }
  550: 
  551:                 for(j = 1; j <= nombre_colonnes_a; j++)
  552:                 {
  553:                     for(i = 1; i < j; i++)
  554:                     {
  555:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] = 0;
  556:                     }
  557:                 }
  558:             }
  559: 
  560:             free(matrice_f77);
  561:             break;
  562:         }
  563: 
  564:         case 'R' :
  565:         {
  566:             /*
  567:              * Allocation du vecteur représentant la matrice triangulaire
  568:              */
  569: 
  570:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
  571:                     sizeof(real8))) == NULL)
  572:             {
  573:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  574:                 return;
  575:             }
  576: 
  577:             if (mode == 'U')
  578:             {
  579:                 for(j = 1; j <= nombre_colonnes_a; j++)
  580:                 {
  581:                     for(i = 1; i <= j; i++)
  582:                     {
  583:                         ((real8 *) matrice_f77)[i + (((j - 1) * j) / 2) - 1] =
  584:                                 ((real8 **) (*s_matrice).tableau)[i - 1][j - 1];
  585:                     }
  586:                 }
  587:             }
  588:             else
  589:             {
  590:                 for(j = 1; j <= nombre_colonnes_a; j++)
  591:                 {
  592:                     for(i = j; i <= nombre_colonnes_a; i++)
  593:                     {
  594:                         ((real8 *) matrice_f77)[(i - 1) + (((j - 1) *
  595:                                 ((nombre_colonnes_a * 2) - j)) / 2)] = (real8)
  596:                                 ((real8 **) (*s_matrice).tableau)[i - 1][j - 1];
  597:                     }
  598:                 }
  599:             }
  600: 
  601:             dpptrf_(&mode, &nombre_colonnes_a, matrice_f77, &erreur, 1);
  602: 
  603:             if (erreur != 0)
  604:             {
  605:                 if (erreur > 0)
  606:                 {
  607:                     (*s_etat_processus).exception =
  608:                             d_ep_matrice_non_definie_positive;
  609:                 }
  610:                 else
  611:                 {
  612:                     (*s_etat_processus).erreur_execution =
  613:                             d_ex_routines_mathematiques;
  614:                 }
  615: 
  616:                 free(matrice_f77);
  617:                 return;
  618:             }
  619: 
  620:             if (mode == 'U')
  621:             {
  622:                 for(j = 1; j <= nombre_colonnes_a; j++)
  623:                 {
  624:                     for(i = 1; i <= j; i++)
  625:                     {
  626:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] =
  627:                                 ((real8 *) matrice_f77)
  628:                                 [i + (((j - 1) * j) / 2) - 1];
  629:                     }
  630:                 }
  631: 
  632:                 for(j = 1; j <= nombre_colonnes_a; j++)
  633:                 {
  634:                     for(i = j + 1; i <= nombre_colonnes_a; i++)
  635:                     {
  636:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] = 0;
  637:                     }
  638:                 }
  639:             }
  640:             else
  641:             {
  642:                 for(j = 1; j <= nombre_colonnes_a; j++)
  643:                 {
  644:                     for(i = j; i <= nombre_colonnes_a; i++)
  645:                     {
  646:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] =
  647:                                 ((real8 *) matrice_f77)[(i - 1) + (((j - 1) *
  648:                                 ((nombre_colonnes_a * 2) - j)) / 2)];
  649:                     }
  650:                 }
  651: 
  652:                 for(j = 1; j <= nombre_colonnes_a; j++)
  653:                 {
  654:                     for(i = 1; i < j; i++)
  655:                     {
  656:                         ((real8 **) (*s_matrice).tableau)[i - 1][j - 1] = 0;
  657:                     }
  658:                 }
  659:             }
  660: 
  661:             free(matrice_f77);
  662:             break;
  663:         }
  664: 
  665:         case 'C' :
  666:         {
  667:             /*
  668:              * Allocation du vecteur représentant la matrice triangulaire
  669:              */
  670: 
  671:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
  672:                     sizeof(complex16))) == NULL)
  673:             {
  674:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  675:                 return;
  676:             }
  677: 
  678:             if (mode == 'U')
  679:             {
  680:                 for(j = 1; j <= nombre_colonnes_a; j++)
  681:                 {
  682:                     for(i = 1; i <= j; i++)
  683:                     {
  684:                         ((complex16 *) matrice_f77)[i + (((j - 1) * j) / 2)
  685:                                 - 1].partie_reelle = ((complex16 **)
  686:                                 (*s_matrice).tableau)[i - 1][j - 1]
  687:                                 .partie_reelle;
  688:                         ((complex16 *) matrice_f77)[i + (((j - 1) * j) / 2)
  689:                                 - 1].partie_imaginaire = ((complex16 **)
  690:                                 (*s_matrice).tableau)[i - 1][j - 1]
  691:                                 .partie_imaginaire;
  692:                     }
  693:                 }
  694:             }
  695:             else
  696:             {
  697:                 for(j = 1; j <= nombre_colonnes_a; j++)
  698:                 {
  699:                     for(i = j; i <= nombre_colonnes_a; i++)
  700:                     {
  701:                         ((complex16 *) matrice_f77)[(i - 1) + (((j - 1) *
  702:                                 ((nombre_colonnes_a * 2) - j)) / 2)]
  703:                                 .partie_reelle = ((complex16 **)
  704:                                 (*s_matrice).tableau)[i - 1][j - 1]
  705:                                 .partie_reelle;
  706:                         ((complex16 *) matrice_f77)[(i - 1) + (((j - 1) *
  707:                                 ((nombre_colonnes_a * 2) - j)) / 2)]
  708:                                 .partie_imaginaire = ((complex16 **)
  709:                                 (*s_matrice).tableau)[i - 1][j - 1]
  710:                                 .partie_imaginaire;
  711:                     }
  712:                 }
  713:             }
  714: 
  715:             zpptrf_(&mode, &nombre_colonnes_a, matrice_f77, &erreur, 1);
  716: 
  717:             if (erreur != 0)
  718:             {
  719:                 if (erreur > 0)
  720:                 {
  721:                     (*s_etat_processus).exception =
  722:                             d_ep_matrice_non_definie_positive;
  723:                 }
  724:                 else
  725:                 {
  726:                     (*s_etat_processus).erreur_execution =
  727:                             d_ex_routines_mathematiques;
  728:                 }
  729: 
  730:                 free(matrice_f77);
  731:                 return;
  732:             }
  733: 
  734:             if (mode == 'U')
  735:             {
  736:                 for(j = 1; j <= nombre_colonnes_a; j++)
  737:                 {
  738:                     for(i = 1; i <= j; i++)
  739:                     {
  740:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  741:                                 .partie_reelle = ((complex16 *) matrice_f77)
  742:                                 [i + (((j - 1) * j) / 2) - 1].partie_reelle;
  743:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  744:                                 .partie_imaginaire = ((complex16 *) matrice_f77)
  745:                                 [i + (((j - 1) * j) / 2) - 1].partie_imaginaire;
  746:                     }
  747:                 }
  748: 
  749:                 for(j = 1; j <= nombre_colonnes_a; j++)
  750:                 {
  751:                     for(i = j + 1; i <= nombre_colonnes_a; i++)
  752:                     {
  753:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  754:                                 .partie_reelle = 0;
  755:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  756:                                 .partie_imaginaire = 0;
  757:                     }
  758:                 }
  759:             }
  760:             else
  761:             {
  762:                 for(j = 1; j <= nombre_colonnes_a; j++)
  763:                 {
  764:                     for(i = j; i <= nombre_colonnes_a; i++)
  765:                     {
  766:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  767:                                 .partie_reelle = ((complex16 *)
  768:                                 matrice_f77)[(i - 1) + (((j - 1) *
  769:                                 ((nombre_colonnes_a * 2) - j)) / 2)]
  770:                                 .partie_reelle;
  771:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  772:                                 .partie_imaginaire = ((complex16 *)
  773:                                 matrice_f77)[(i - 1) + (((j - 1) *
  774:                                 ((nombre_colonnes_a * 2) - j)) / 2)]
  775:                                 .partie_imaginaire;
  776:                     }
  777:                 }
  778: 
  779:                 for(j = 1; j <= nombre_colonnes_a; j++)
  780:                 {
  781:                     for(i = 1; i < j; i++)
  782:                     {
  783:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  784:                                 .partie_reelle = 0;
  785:                         ((complex16 **) (*s_matrice).tableau)[i - 1][j - 1]
  786:                                 .partie_imaginaire = 0;
  787:                     }
  788:                 }
  789:             }
  790: 
  791:             free(matrice_f77);
  792:             break;
  793:         }
  794:     }
  795: 
  796:     return;
  797: }
  798: 
  799: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>