File:  [local] / rpl / src / algebre_lineaire3.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:44 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.9
    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 réalisation la factorisation de Schur d'une matrice carrée
   29: ================================================================================
   30:   Entrées : struct_matrice
   31: --------------------------------------------------------------------------------
   32:   Sorties : décomposition de Schur de la matrice d'entrée et drapeau d'erreur.
   33:             La matrice en entrée est écrasée. La matrice de sortie est
   34:             la forme de Schur.
   35:             La routine renvoie aussi une matrice de complexes correspondant
   36:             aux vecteurs de Schur. Cette matrice est allouée par
   37:             la routine et vaut NULL sinon.
   38: --------------------------------------------------------------------------------
   39:   Effets de bord : néant
   40: ================================================================================
   41: */
   42: 
   43: void
   44: factorisation_schur(struct_processus *s_etat_processus,
   45:         struct_matrice *s_matrice, struct_matrice **s_schur)
   46: {
   47:     complex16                   *w;
   48: 
   49:     integer4                    info;
   50:     integer4                    lwork;
   51:     integer4                    nombre_colonnes_a;
   52:     integer4                    nombre_lignes_a;
   53:     integer4                    sdim;
   54: 
   55:     real8                       *rwork;
   56:     real8                       *wi;
   57:     real8                       *wr;
   58: 
   59:     unsigned char               calcul_vecteurs_schur;
   60:     unsigned char               tri_vecteurs_schur;
   61: 
   62:     unsigned long               i;
   63:     unsigned long               j;
   64:     unsigned long               k;
   65:     unsigned long               taille_matrice_f77;
   66: 
   67:     void                        *matrice_a_f77;
   68:     void                        *matrice_vs_f77;
   69:     void                        *tampon;
   70:     void                        *work;
   71: 
   72:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
   73:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
   74:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
   75: 
   76:     calcul_vecteurs_schur = 'V';
   77:     tri_vecteurs_schur = 'N';
   78: 
   79:     switch((*s_matrice).type)
   80:     {
   81:         case 'I' :
   82:         {
   83:             /* Conversion de la matrice en matrice réelle */
   84: 
   85:             for(i = 0; i < (unsigned long) nombre_lignes_a; i++)
   86:             {
   87:                 tampon = (*s_matrice).tableau[i];
   88: 
   89:                 if ((((real8 **) (*s_matrice).tableau)[i] = (real8 *)
   90:                         malloc(nombre_colonnes_a * sizeof(real8))) == NULL)
   91:                 {
   92:                     (*s_etat_processus).erreur_systeme =
   93:                             d_es_allocation_memoire;
   94:                     return;
   95:                 }
   96: 
   97:                 for(j = 0; j < (unsigned long) nombre_colonnes_a; j++)
   98:                 {
   99:                     ((real8 **) (*s_matrice).tableau)[i][j] =
  100:                             ((integer8 *) tampon)[j];
  101:                 }
  102: 
  103:                 free(tampon);
  104:             }
  105: 
  106:             (*s_matrice).type = 'R';
  107:         }
  108: 
  109:         case 'R' :
  110:         {
  111:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  112:                     sizeof(real8))) == NULL)
  113:             {
  114:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  115:                 return;
  116:             }
  117: 
  118:             if ((matrice_vs_f77 = (void *) malloc(taille_matrice_f77 *
  119:                     sizeof(real8))) == NULL)
  120:             {
  121:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  122:                 return;
  123:             }
  124: 
  125:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  126:             {
  127:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  128:                 {
  129:                     ((real8 *) matrice_a_f77)[k++] = ((real8 **)
  130:                             (*s_matrice).tableau)[j][i];
  131:                 }
  132:             }
  133: 
  134:             if ((wr = (real8 *) malloc(nombre_lignes_a * sizeof(real8)))
  135:                     == NULL)
  136:             {
  137:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  138:                 return;
  139:             }
  140: 
  141:             if ((wi = (real8 *) malloc(nombre_lignes_a * sizeof(real8)))
  142:                     == NULL)
  143:             {
  144:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  145:                 return;
  146:             }
  147: 
  148:             lwork = -1;
  149: 
  150:             if ((work = (real8 *) malloc(sizeof(real8))) == NULL)
  151:             {
  152:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  153:                 return;
  154:             }
  155: 
  156:             dgees_(&calcul_vecteurs_schur, &tri_vecteurs_schur,
  157:                     NULL, &nombre_lignes_a, matrice_a_f77,
  158:                     &nombre_colonnes_a, &sdim, wr, wi,
  159:                     matrice_vs_f77, &nombre_colonnes_a,
  160:                     work, &lwork, NULL, &info, 1, 1);
  161: 
  162:             lwork = ((real8 *) work)[0];
  163:             free(work);
  164: 
  165:             if ((work = (real8 *) malloc(lwork * sizeof(real8))) == NULL)
  166:             {
  167:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  168:                 return;
  169:             }
  170: 
  171:             dgees_(&calcul_vecteurs_schur, &tri_vecteurs_schur,
  172:                     NULL, &nombre_lignes_a, matrice_a_f77,
  173:                     &nombre_colonnes_a, &sdim, wr, wi,
  174:                     matrice_vs_f77, &nombre_colonnes_a,
  175:                     work, &lwork, NULL, &info, 1, 1);
  176: 
  177:             free(work);
  178:             free(wr);
  179:             free(wi);
  180: 
  181:             if (info != 0)
  182:             {
  183:                 if (info > 0)
  184:                 {
  185:                     (*s_etat_processus).exception = d_ep_decomposition_QR;
  186:                 }
  187:                 else
  188:                 {
  189:                     (*s_etat_processus).erreur_execution =
  190:                             d_ex_routines_mathematiques;
  191:                 }
  192: 
  193:                 free(matrice_a_f77);
  194:                 free(matrice_vs_f77);
  195:                 return;
  196:             }
  197: 
  198:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  199:             {
  200:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  201:                 {
  202:                     ((real8 **) (*s_matrice).tableau)[j][i] =
  203:                             ((real8 *) matrice_a_f77)[k++];
  204:                 }
  205:             }
  206: 
  207:             (**s_schur).nombre_colonnes = (*s_matrice).nombre_colonnes;
  208:             (**s_schur).nombre_lignes = (*s_matrice).nombre_lignes;
  209:             (**s_schur).type = 'R';
  210: 
  211:             if (((**s_schur).tableau = malloc((**s_schur)
  212:                     .nombre_lignes * sizeof(real8 *))) == NULL)
  213:             {
  214:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  215:                 return;
  216:             }
  217: 
  218:             for(i = 0; i < (**s_schur).nombre_lignes; i++)
  219:             {
  220:                 if ((((real8 **) (**s_schur).tableau)[i] = (real8 *)
  221:                         malloc((**s_schur).nombre_colonnes *
  222:                         sizeof(real8))) == NULL)
  223:                 {
  224:                     (*s_etat_processus).erreur_systeme =
  225:                             d_es_allocation_memoire;
  226:                     return;
  227:                 }
  228:             }
  229: 
  230:             for(k = 0, i = 0; i < (**s_schur).nombre_colonnes; i++)
  231:             {
  232:                 for(j = 0; j < (**s_schur).nombre_lignes; j++)
  233:                 {
  234:                     ((real8 **) (**s_schur).tableau)[j][i] = ((real8 *)
  235:                             matrice_vs_f77)[k++];
  236:                 }
  237:             }
  238: 
  239:             free(matrice_a_f77);
  240:             free(matrice_vs_f77);
  241: 
  242:             break;
  243:         }
  244: 
  245:         case 'C' :
  246:         {
  247:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  248:                     sizeof(complex16))) == NULL)
  249:             {
  250:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  251:                 return;
  252:             }
  253: 
  254:             if ((matrice_vs_f77 = (void *) malloc(taille_matrice_f77 *
  255:                     sizeof(complex16))) == NULL)
  256:             {
  257:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  258:                 return;
  259:             }
  260: 
  261:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  262:             {
  263:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  264:                 {
  265:                     ((complex16 *) matrice_a_f77)[k].partie_reelle =
  266:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  267:                             .partie_reelle;
  268:                     ((complex16 *) matrice_a_f77)[k++].partie_imaginaire =
  269:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  270:                             .partie_imaginaire;
  271:                 }
  272:             }
  273: 
  274:             if ((w = (complex16 *) malloc(nombre_lignes_a * sizeof(complex16)))
  275:                     == NULL)
  276:             {
  277:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  278:                 return;
  279:             }
  280: 
  281:             lwork = -1;
  282: 
  283:             if ((work = (complex16 *) malloc(sizeof(complex16))) == NULL)
  284:             {
  285:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  286:                 return;
  287:             }
  288: 
  289:             if ((rwork = (real8 *) malloc(nombre_lignes_a * sizeof(real8)))
  290:                     == NULL)
  291:             {
  292:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  293:                 return;
  294:             }
  295: 
  296:             zgees_(&calcul_vecteurs_schur, &tri_vecteurs_schur,
  297:                     NULL, &nombre_lignes_a, matrice_a_f77,
  298:                     &nombre_colonnes_a, &sdim, w,
  299:                     matrice_vs_f77, &nombre_colonnes_a,
  300:                     work, &lwork, rwork, NULL, &info, 1, 1);
  301: 
  302:             lwork = ((complex16 *) work)[0].partie_reelle;
  303:             free(work);
  304: 
  305:             if ((work = (complex16 *) malloc(lwork * sizeof(complex16)))
  306:                     == NULL)
  307:             {
  308:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  309:                 return;
  310:             }
  311: 
  312:             zgees_(&calcul_vecteurs_schur, &tri_vecteurs_schur,
  313:                     NULL, &nombre_lignes_a, matrice_a_f77,
  314:                     &nombre_colonnes_a, &sdim, w,
  315:                     matrice_vs_f77, &nombre_colonnes_a,
  316:                     work, &lwork, rwork, NULL, &info, 1, 1);
  317: 
  318:             free(work);
  319:             free(rwork);
  320:             free(w);
  321: 
  322:             if (info != 0)
  323:             {
  324:                 if (info > 0)
  325:                 {
  326:                     (*s_etat_processus).exception = d_ep_decomposition_QR;
  327:                 }
  328:                 else
  329:                 {
  330:                     (*s_etat_processus).erreur_execution =
  331:                             d_ex_routines_mathematiques;
  332:                 }
  333: 
  334:                 free(matrice_a_f77);
  335:                 free(matrice_vs_f77);
  336:                 return;
  337:             }
  338: 
  339:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  340:             {
  341:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  342:                 {
  343:                     ((complex16 **) (*s_matrice).tableau)[j][i]
  344:                             .partie_reelle = ((complex16 *) matrice_a_f77)[k]
  345:                             .partie_reelle;
  346:                     ((complex16 **) (*s_matrice).tableau)[j][i]
  347:                             .partie_imaginaire = ((complex16 *) matrice_a_f77)
  348:                             [k++].partie_imaginaire;
  349:                 }
  350:             }
  351: 
  352:             (**s_schur).nombre_colonnes = (*s_matrice).nombre_colonnes;
  353:             (**s_schur).nombre_lignes = (*s_matrice).nombre_lignes;
  354:             (**s_schur).type = 'C';
  355: 
  356:             if (((**s_schur).tableau = malloc((**s_schur)
  357:                     .nombre_lignes * sizeof(complex16 *))) == NULL)
  358:             {
  359:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  360:                 return;
  361:             }
  362: 
  363:             for(i = 0; i < (**s_schur).nombre_lignes; i++)
  364:             {
  365:                 if ((((complex16 **) (**s_schur).tableau)[i] = (complex16 *)
  366:                         malloc((**s_schur).nombre_colonnes *
  367:                         sizeof(complex16))) == NULL)
  368:                 {
  369:                     (*s_etat_processus).erreur_systeme =
  370:                             d_es_allocation_memoire;
  371:                     return;
  372:                 }
  373:             }
  374: 
  375:             for(k = 0, i = 0; i < (**s_schur).nombre_colonnes; i++)
  376:             {
  377:                 for(j = 0; j < (**s_schur).nombre_lignes; j++)
  378:                 {
  379:                     ((complex16 **) (**s_schur).tableau)[j][i].partie_reelle =
  380:                             ((complex16 *) matrice_vs_f77)[k].partie_reelle;
  381:                     ((complex16 **) (**s_schur).tableau)[j][i]
  382:                             .partie_imaginaire = ((complex16 *) matrice_vs_f77)
  383:                             [k++].partie_imaginaire;
  384:                 }
  385:             }
  386: 
  387:             free(matrice_a_f77);
  388:             free(matrice_vs_f77);
  389: 
  390:             break;
  391:         }
  392:     }
  393: 
  394:     return;
  395: }
  396: 
  397: 
  398: /*
  399: ================================================================================
  400:   Fonction réalisation la factorisation LQ d'une matrice quelconque
  401: ================================================================================
  402:   Entrées : struct_matrice
  403: --------------------------------------------------------------------------------
  404:   Sorties : décomposition de LQ de la matrice d'entrée. Le tableau tau
  405:   est initialisé par la fonction
  406: --------------------------------------------------------------------------------
  407:   Effets de bord : néant
  408: ================================================================================
  409: */
  410: 
  411: void
  412: factorisation_lq(struct_processus *s_etat_processus, struct_matrice *s_matrice,
  413:         void **tau)
  414: {
  415:     integer4                    nombre_colonnes_a;
  416:     integer4                    nombre_lignes_a;
  417:     integer4                    erreur;
  418: 
  419:     unsigned long               i;
  420:     unsigned long               j;
  421:     unsigned long               k;
  422:     unsigned long               taille_matrice_f77;
  423: 
  424:     void                        *matrice_a_f77;
  425:     void                        *tampon;
  426:     void                        *work;
  427: 
  428:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
  429:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
  430:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
  431: 
  432:     switch((*s_matrice).type)
  433:     {
  434:         case 'I' :
  435:         {
  436:             /* Conversion de la matrice en matrice réelle */
  437: 
  438:             for(i = 0; i < (unsigned long) nombre_lignes_a; i++)
  439:             {
  440:                 tampon = (*s_matrice).tableau[i];
  441: 
  442:                 if ((((real8 **) (*s_matrice).tableau)[i] = (real8 *)
  443:                         malloc(nombre_colonnes_a * sizeof(real8))) == NULL)
  444:                 {
  445:                     (*s_etat_processus).erreur_systeme =
  446:                             d_es_allocation_memoire;
  447:                     return;
  448:                 }
  449: 
  450:                 for(j = 0; j < (unsigned long) nombre_colonnes_a; j++)
  451:                 {
  452:                     ((real8 **) (*s_matrice).tableau)[i][j] =
  453:                             ((integer8 *) tampon)[j];
  454:                 }
  455: 
  456:                 free(tampon);
  457:             }
  458: 
  459:             (*s_matrice).type = 'R';
  460:         }
  461: 
  462:         case 'R' :
  463:         {
  464:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  465:                     sizeof(real8))) == NULL)
  466:             {
  467:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  468:                 return;
  469:             }
  470: 
  471:             if (((*tau) = malloc(((nombre_colonnes_a < nombre_lignes_a)
  472:                     ? nombre_colonnes_a : nombre_lignes_a) * sizeof(real8)))
  473:                     == NULL)
  474:             {
  475:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  476:                 return;
  477:             }
  478: 
  479:             if ((work = malloc(nombre_lignes_a * sizeof(real8))) == NULL)
  480:             {
  481:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  482:                 return;
  483:             }
  484: 
  485:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  486:             {
  487:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  488:                 {
  489:                     ((real8 *) matrice_a_f77)[k++] = ((real8 **)
  490:                             (*s_matrice).tableau)[j][i];
  491:                 }
  492:             }
  493: 
  494:             dgelq2_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  495:                     &nombre_lignes_a, (*((real8 **) tau)), work, &erreur);
  496: 
  497:             if (erreur != 0)
  498:             {
  499:                 // L'erreur ne peut être que négative.
  500: 
  501:                 (*s_etat_processus).erreur_execution =
  502:                         d_ex_routines_mathematiques;
  503:                 free(work);
  504:                 free(matrice_a_f77);
  505:                 return;
  506:             }
  507: 
  508:             for(k = 0, i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  509:             {
  510:                 for(j = 0; j < (unsigned long) nombre_lignes_a; j++)
  511:                 {
  512:                     ((real8 **) (*s_matrice).tableau)[j][i] = ((real8 *)
  513:                             matrice_a_f77)[k++];
  514:                 }
  515:             }
  516: 
  517:             free(work);
  518:             free(matrice_a_f77);
  519: 
  520:             break;
  521:         }
  522: 
  523:         case 'C' :
  524:         {
  525:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  526:                     sizeof(complex16))) == NULL)
  527:             {
  528:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  529:                 return;
  530:             }
  531: 
  532:             if (((*tau) = malloc(((nombre_colonnes_a < nombre_lignes_a)
  533:                     ? nombre_colonnes_a : nombre_lignes_a) *
  534:                     sizeof(complex16))) == NULL)
  535:             {
  536:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  537:                 return;
  538:             }
  539: 
  540:             if ((work = malloc(nombre_lignes_a * sizeof(complex16))) == NULL)
  541:             {
  542:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  543:                 return;
  544:             }
  545: 
  546:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  547:             {
  548:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  549:                 {
  550:                     ((complex16 *) matrice_a_f77)[k].partie_reelle =
  551:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  552:                             .partie_reelle;
  553:                     ((complex16 *) matrice_a_f77)[k++].partie_imaginaire =
  554:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  555:                             .partie_imaginaire;
  556:                 }
  557:             }
  558: 
  559:             zgelq2_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  560:                     &nombre_lignes_a, (*((complex16 **) tau)), work, &erreur);
  561: 
  562:             if (erreur != 0)
  563:             {
  564:                 // L'erreur ne peut être que négative.
  565: 
  566:                 (*s_etat_processus).erreur_execution =
  567:                         d_ex_routines_mathematiques;
  568:                 free(work);
  569:                 free(matrice_a_f77);
  570:                 return;
  571:             }
  572: 
  573:             for(k = 0, i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  574:             {
  575:                 for(j = 0; j < (unsigned long) nombre_lignes_a; j++)
  576:                 {
  577:                     ((complex16 **) (*s_matrice).tableau)[j][i].partie_reelle =
  578:                             ((complex16 *) matrice_a_f77)[k].partie_reelle;
  579:                     ((complex16 **) (*s_matrice).tableau)[j][i]
  580:                             .partie_imaginaire = ((complex16 *) matrice_a_f77)
  581:                             [k++].partie_imaginaire;
  582:                 }
  583:             }
  584: 
  585:             free(work);
  586:             free(matrice_a_f77);
  587: 
  588:             break;
  589:         }
  590:     }
  591: 
  592:     return;
  593: }
  594: 
  595: 
  596: /*
  597: ================================================================================
  598:   Fonction réalisation la factorisation QR d'une matrice quelconque
  599: ================================================================================
  600:   Entrées : struct_matrice
  601: --------------------------------------------------------------------------------
  602:   Sorties : décomposition de QR de la matrice d'entrée. Le tableau tau
  603:   est initialisé par la fonction
  604: --------------------------------------------------------------------------------
  605:   Effets de bord : néant
  606: ================================================================================
  607: */
  608: 
  609: void
  610: factorisation_qr(struct_processus *s_etat_processus, struct_matrice *s_matrice,
  611:         void **tau)
  612: {
  613:     integer4                    lwork;
  614:     integer4                    nombre_colonnes_a;
  615:     integer4                    nombre_lignes_a;
  616:     integer4                    erreur;
  617:     integer4                    *pivot;
  618: 
  619:     real8                       *rwork;
  620: 
  621:     unsigned long               i;
  622:     unsigned long               j;
  623:     unsigned long               k;
  624:     unsigned long               taille_matrice_f77;
  625: 
  626:     void                        *matrice_a_f77;
  627:     void                        *registre;
  628:     void                        *tampon;
  629:     void                        *work;
  630: 
  631:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
  632:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
  633:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
  634: 
  635:     switch((*s_matrice).type)
  636:     {
  637:         case 'I' :
  638:         {
  639:             /* Conversion de la matrice en matrice réelle */
  640: 
  641:             for(i = 0; i < (unsigned long) nombre_lignes_a; i++)
  642:             {
  643:                 tampon = (*s_matrice).tableau[i];
  644: 
  645:                 if ((((real8 **) (*s_matrice).tableau)[i] = (real8 *)
  646:                         malloc(nombre_colonnes_a * sizeof(real8))) == NULL)
  647:                 {
  648:                     (*s_etat_processus).erreur_systeme =
  649:                             d_es_allocation_memoire;
  650:                     return;
  651:                 }
  652: 
  653:                 for(j = 0; j < (unsigned long) nombre_colonnes_a; j++)
  654:                 {
  655:                     ((real8 **) (*s_matrice).tableau)[i][j] =
  656:                             ((integer8 *) tampon)[j];
  657:                 }
  658: 
  659:                 free(tampon);
  660:             }
  661: 
  662:             (*s_matrice).type = 'R';
  663:         }
  664: 
  665:         case 'R' :
  666:         {
  667:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  668:                     sizeof(real8))) == NULL)
  669:             {
  670:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  671:                 return;
  672:             }
  673: 
  674:             if (((*tau) = malloc(((nombre_colonnes_a < nombre_lignes_a)
  675:                     ? nombre_colonnes_a : nombre_lignes_a) * sizeof(real8)))
  676:                     == NULL)
  677:             {
  678:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  679:                 return;
  680:             }
  681: 
  682:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  683:             {
  684:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  685:                 {
  686:                     ((real8 *) matrice_a_f77)[k++] = ((real8 **)
  687:                             (*s_matrice).tableau)[j][i];
  688:                 }
  689:             }
  690: 
  691:             if ((pivot = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
  692:             {
  693:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  694:                 return;
  695:             }
  696: 
  697:             for(i = 0; i < (unsigned long) nombre_colonnes_a; pivot[i++] = 0);
  698: 
  699:             lwork = -1;
  700: 
  701:             if ((work = malloc(sizeof(real8))) == NULL)
  702:             {
  703:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  704:                 return;
  705:             }
  706: 
  707:             // Calcul de la taille de l'espace
  708: 
  709:             dgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  710:                     &nombre_lignes_a, pivot, (*((real8 **) tau)),
  711:                     work, &lwork, &erreur);
  712: 
  713:             lwork = ((real8 *) work)[0];
  714: 
  715:             free(work);
  716: 
  717:             if ((work = malloc(lwork * sizeof(real8))) == NULL)
  718:             {
  719:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  720:                 return;
  721:             }
  722: 
  723:             // Calcul de la permutation
  724: 
  725:             if ((registre = (void *) malloc(taille_matrice_f77 *
  726:                     sizeof(real8))) == NULL)
  727:             {
  728:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  729:                 return;
  730:             }
  731: 
  732:             memcpy(registre, matrice_a_f77, taille_matrice_f77 * sizeof(real8));
  733: 
  734:             dgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, registre,
  735:                     &nombre_lignes_a, pivot, (*((real8 **) tau)),
  736:                     work, &lwork, &erreur);
  737: 
  738:             free(registre);
  739: 
  740:             if (erreur != 0)
  741:             {
  742:                 // L'erreur ne peut être que négative.
  743: 
  744:                 (*s_etat_processus).erreur_execution =
  745:                         d_ex_routines_mathematiques;
  746:                 free(work);
  747:                 free(matrice_a_f77);
  748:                 free(tau);
  749:                 return;
  750:             }
  751: 
  752:             // La permutation doit maintenant être unitaire
  753: 
  754:             dgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  755:                     &nombre_lignes_a, pivot, (*((real8 **) tau)),
  756:                     work, &lwork, &erreur);
  757: 
  758:             if (erreur != 0)
  759:             {
  760:                 // L'erreur ne peut être que négative.
  761: 
  762:                 (*s_etat_processus).erreur_execution =
  763:                         d_ex_routines_mathematiques;
  764:                 free(work);
  765:                 free(matrice_a_f77);
  766:                 free(tau);
  767:                 return;
  768:             }
  769: 
  770:             for(i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  771:             {
  772:                 if ((i + 1) != (unsigned long) pivot[i])
  773:                 {
  774:                     (*s_etat_processus).erreur_execution =
  775:                             d_ex_routines_mathematiques;
  776: 
  777:                     free(pivot);
  778:                     free(work);
  779:                     free(matrice_a_f77);
  780:                     free(tau);
  781: 
  782:                     return;
  783:                 }
  784:             }
  785: 
  786:             free(pivot);
  787: 
  788:             for(k = 0, i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  789:             {
  790:                 for(j = 0; j < (unsigned long) nombre_lignes_a; j++)
  791:                 {
  792:                     ((real8 **) (*s_matrice).tableau)[j][i] = ((real8 *)
  793:                             matrice_a_f77)[k++];
  794:                 }
  795:             }
  796: 
  797:             free(work);
  798:             free(matrice_a_f77);
  799: 
  800:             break;
  801:         }
  802: 
  803:         case 'C' :
  804:         {
  805:             if ((matrice_a_f77 = (void *) malloc(taille_matrice_f77 *
  806:                     sizeof(complex16))) == NULL)
  807:             {
  808:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  809:                 return;
  810:             }
  811: 
  812:             if (((*tau) = malloc(((nombre_colonnes_a < nombre_lignes_a)
  813:                     ? nombre_colonnes_a : nombre_lignes_a) * sizeof(complex16)))
  814:                     == NULL)
  815:             {
  816:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  817:                 return;
  818:             }
  819: 
  820:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
  821:             {
  822:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
  823:                 {
  824:                     ((complex16 *) matrice_a_f77)[k].partie_reelle =
  825:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  826:                             .partie_reelle;
  827:                     ((complex16 *) matrice_a_f77)[k++].partie_imaginaire =
  828:                             ((complex16 **) (*s_matrice).tableau)[j][i]
  829:                             .partie_imaginaire;
  830:                 }
  831:             }
  832: 
  833:             if ((pivot = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
  834:             {
  835:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  836:                 return;
  837:             }
  838: 
  839:             if ((rwork = malloc(2 * nombre_colonnes_a * sizeof(real8))) == NULL)
  840:             {
  841:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  842:                 return;
  843:             }
  844: 
  845:             for(i = 0; i < (unsigned long) nombre_colonnes_a; pivot[i++] = 0);
  846: 
  847:             lwork = -1;
  848: 
  849:             if ((work = malloc(sizeof(complex16))) == NULL)
  850:             {
  851:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  852:                 return;
  853:             }
  854: 
  855:             // Calcul de la taille de l'espace
  856: 
  857:             zgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  858:                     &nombre_lignes_a, pivot, (*((complex16 **) tau)),
  859:                     work, &lwork, rwork, &erreur);
  860: 
  861:             if (erreur != 0)
  862:             {
  863:                 // L'erreur ne peut être que négative.
  864: 
  865:                 (*s_etat_processus).erreur_execution =
  866:                         d_ex_routines_mathematiques;
  867: 
  868:                 free(work);
  869:                 free(rwork);
  870:                 free(pivot);
  871:                 free(matrice_a_f77);
  872:                 free(tau);
  873:                 return;
  874:             }
  875: 
  876:             lwork = ((complex16 *) work)[0].partie_reelle;
  877: 
  878:             free(work);
  879: 
  880:             if ((work = malloc(lwork * sizeof(complex16))) == NULL)
  881:             {
  882:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  883:                 return;
  884:             }
  885: 
  886:             // Calcul de la permutation
  887: 
  888:             if ((registre = (void *) malloc(taille_matrice_f77 *
  889:                     sizeof(complex16))) == NULL)
  890:             {
  891:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  892:                 return;
  893:             }
  894: 
  895:             memcpy(registre, matrice_a_f77,
  896:                     taille_matrice_f77 * sizeof(complex16));
  897: 
  898:             zgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, registre,
  899:                     &nombre_lignes_a, pivot, (*((complex16 **) tau)),
  900:                     work, &lwork, rwork, &erreur);
  901: 
  902:             free(registre);
  903: 
  904:             if (erreur != 0)
  905:             {
  906:                 // L'erreur ne peut être que négative.
  907: 
  908:                 (*s_etat_processus).erreur_execution =
  909:                         d_ex_routines_mathematiques;
  910: 
  911:                 free(work);
  912:                 free(rwork);
  913:                 free(pivot);
  914:                 free(matrice_a_f77);
  915:                 free(tau);
  916:                 return;
  917:             }
  918: 
  919:             // La permutation doit maintenant être unitaire
  920: 
  921:             zgeqp3_(&nombre_lignes_a, &nombre_colonnes_a, matrice_a_f77,
  922:                     &nombre_lignes_a, pivot, (*((complex16 **) tau)),
  923:                     work, &lwork, rwork, &erreur);
  924: 
  925:             if (erreur != 0)
  926:             {
  927:                 // L'erreur ne peut être que négative.
  928: 
  929:                 (*s_etat_processus).erreur_execution =
  930:                         d_ex_routines_mathematiques;
  931: 
  932:                 free(work);
  933:                 free(rwork);
  934:                 free(pivot);
  935:                 free(matrice_a_f77);
  936:                 free(tau);
  937:                 return;
  938:             }
  939: 
  940:             free(rwork);
  941: 
  942:             for(i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  943:             {
  944:                 if ((i + 1) != (unsigned long) pivot[i])
  945:                 {
  946:                     (*s_etat_processus).erreur_execution =
  947:                             d_ex_routines_mathematiques;
  948: 
  949:                     free(pivot);
  950:                     free(work);
  951:                     free(matrice_a_f77);
  952:                     free(tau);
  953: 
  954:                     return;
  955:                 }
  956:             }
  957: 
  958:             free(pivot);
  959: 
  960:             for(k = 0, i = 0; i < (unsigned long) nombre_colonnes_a; i++)
  961:             {
  962:                 for(j = 0; j < (unsigned long) nombre_lignes_a; j++)
  963:                 {
  964:                     ((complex16 **) (*s_matrice).tableau)[j][i].partie_reelle =
  965:                             ((complex16 *) matrice_a_f77)[k].partie_reelle;
  966:                     ((complex16 **) (*s_matrice).tableau)[j][i]
  967:                             .partie_imaginaire = ((complex16 *)
  968:                             matrice_a_f77)[k++].partie_imaginaire;
  969:                 }
  970:             }
  971: 
  972:             free(work);
  973:             free(matrice_a_f77);
  974: 
  975:             break;
  976:         }
  977:     }
  978: 
  979:     return;
  980: }
  981: 
  982: 
  983: /*
  984: ================================================================================
  985:   Fonctions calculant le déterminant ou le rang d'une matrice quelconque
  986: ================================================================================
  987:   Entrées : struct_matrice
  988: --------------------------------------------------------------------------------
  989:   Sorties : déterminant
  990: --------------------------------------------------------------------------------
  991:   Effets de bord : néant
  992: ================================================================================
  993: */
  994: 
  995: 
  996: static integer4
  997: calcul_rang(struct_processus *s_etat_processus, void *matrice_f77,
  998:         integer4 nombre_lignes_a, integer4 nombre_colonnes_a,
  999:         integer4 *pivot, integer4 dimension_vecteur_pivot, unsigned char type)
 1000: {
 1001:     integer4                    erreur;
 1002:     integer4                    *iwork;
 1003:     integer4                    *jpvt;
 1004:     integer4                    lwork;
 1005:     integer4                    longueur;
 1006:     integer4                    nombre_colonnes_b;
 1007:     integer4                    nombre_lignes_b;
 1008:     integer4                    ordre;
 1009:     integer4                    rang;
 1010: 
 1011:     real8                       anorme;
 1012:     real8                       rcond;
 1013:     real8                       *rwork;
 1014: 
 1015:     unsigned char               norme;
 1016: 
 1017:     unsigned long               i;
 1018: 
 1019:     void                        *matrice_b;
 1020:     void                        *matrice_c;
 1021:     void                        *work;
 1022: 
 1023: #undef NORME_I
 1024: #ifdef NORME_I
 1025:     norme = 'I';
 1026: 
 1027:     if ((work = malloc(nombre_lignes_a * sizeof(real8))) == NULL)
 1028:     {
 1029:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1030:         return(-1);
 1031:     }
 1032: #else
 1033:     norme = '1';
 1034:     work = NULL;
 1035: #endif
 1036: 
 1037:     longueur = 1;
 1038: 
 1039:     if (type == 'R')
 1040:     {
 1041:         anorme = dlange_(&norme, &nombre_lignes_a, &nombre_colonnes_a,
 1042:                 matrice_f77, &nombre_lignes_a, work, longueur);
 1043: 
 1044: #ifndef NORME_I
 1045:         free(work);
 1046: #endif
 1047: 
 1048:         if ((matrice_c = malloc(nombre_lignes_a * nombre_colonnes_a *
 1049:                 sizeof(real8))) == NULL)
 1050:         {
 1051:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1052:             return(-1);
 1053:         }
 1054: 
 1055:         memcpy(matrice_c, matrice_f77, nombre_lignes_a * nombre_colonnes_a *
 1056:                 sizeof(real8));
 1057: 
 1058:         dgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
 1059:                 &nombre_lignes_a, pivot, &erreur);
 1060: 
 1061:         if (erreur < 0)
 1062:         {
 1063:             (*s_etat_processus).erreur_execution =
 1064:                     d_ex_routines_mathematiques;
 1065: 
 1066:             free(matrice_f77);
 1067:             return(-1);
 1068:         }
 1069: 
 1070:         if ((iwork = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
 1071:         {
 1072:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1073:             return(-1);
 1074:         }
 1075: 
 1076:         if ((work = malloc(4 * nombre_colonnes_a * sizeof(real8))) == NULL)
 1077:         {
 1078:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1079:             return(-1);
 1080:         }
 1081: 
 1082:         ordre = (nombre_lignes_a > nombre_colonnes_a)
 1083:                 ? nombre_colonnes_a : nombre_lignes_a;
 1084: 
 1085:         dgecon_(&norme, &ordre, matrice_f77,
 1086:                 &nombre_lignes_a, &anorme, &rcond, work, iwork, &erreur,
 1087:                 longueur);
 1088: 
 1089:         free(work);
 1090:         free(iwork);
 1091: 
 1092:         if (erreur < 0)
 1093:         {
 1094:             (*s_etat_processus).erreur_execution =
 1095:                     d_ex_routines_mathematiques;
 1096: 
 1097:             free(matrice_f77);
 1098:             return(-1);
 1099:         }
 1100: 
 1101:         if ((jpvt = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
 1102:         {
 1103:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1104:             return(-1);
 1105:         }
 1106: 
 1107:         for(i = 0; i < (unsigned long) nombre_colonnes_a; i++)
 1108:         {
 1109:             ((integer4 *) jpvt)[i] = 0;
 1110:         }
 1111: 
 1112:         lwork = -1;
 1113: 
 1114:         if ((work = malloc(sizeof(real8))) == NULL)
 1115:         {
 1116:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1117:             return(-1);
 1118:         }
 1119: 
 1120:         nombre_colonnes_b = 1;
 1121:         nombre_lignes_b = (nombre_lignes_a > nombre_colonnes_a)
 1122:                 ? nombre_lignes_a : nombre_colonnes_a;
 1123: 
 1124:         if ((matrice_b = malloc(nombre_lignes_b * sizeof(real8))) == NULL)
 1125:         {
 1126:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1127:             return(-1);
 1128:         }
 1129: 
 1130:         for(i = 0; i < (unsigned long) nombre_lignes_b; i++)
 1131:         {
 1132:             ((real8 *) matrice_b)[i] = 0;
 1133:         }
 1134: 
 1135:         dgelsy_(&nombre_lignes_a, &nombre_colonnes_a,
 1136:                 &nombre_colonnes_b, matrice_c, &nombre_lignes_a,
 1137:                 matrice_b, &nombre_lignes_b, jpvt, &rcond, &rang,
 1138:                 work, &lwork, &erreur);
 1139: 
 1140:         lwork = ((real8 *) work)[0];
 1141:         free(work);
 1142: 
 1143:         if ((work = malloc(lwork * sizeof(real8))) == NULL)
 1144:         {
 1145:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1146:             return(-1);
 1147:         }
 1148: 
 1149:         dgelsy_(&nombre_lignes_a, &nombre_colonnes_a,
 1150:                 &nombre_colonnes_b, matrice_c, &nombre_lignes_a,
 1151:                 matrice_b, &nombre_lignes_b, jpvt, &rcond, &rang,
 1152:                 work, &lwork, &erreur);
 1153: 
 1154:         free(matrice_b);
 1155:         free(matrice_c);
 1156:         free(work);
 1157:         free(jpvt);
 1158: 
 1159:         if (erreur < 0)
 1160:         {
 1161:             (*s_etat_processus).erreur_execution =
 1162:                     d_ex_routines_mathematiques;
 1163: 
 1164:             free(matrice_f77);
 1165:             return(-1);
 1166:         }
 1167:     }
 1168:     else
 1169:     {
 1170:         anorme = zlange_(&norme, &nombre_lignes_a, &nombre_colonnes_a,
 1171:                 matrice_f77, &nombre_lignes_a, work, longueur);
 1172: 
 1173: #ifndef NORME_I
 1174:         free(work);
 1175: #endif
 1176: 
 1177:         if ((matrice_c = malloc(nombre_lignes_a * nombre_colonnes_a *
 1178:                 sizeof(complex16))) == NULL)
 1179:         {
 1180:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1181:             return(-1);
 1182:         }
 1183: 
 1184:         memcpy(matrice_c, matrice_f77, nombre_lignes_a * nombre_colonnes_a *
 1185:                 sizeof(complex16));
 1186: 
 1187:         zgetrf_(&nombre_lignes_a, &nombre_colonnes_a, matrice_f77,
 1188:                 &nombre_lignes_a, pivot, &erreur);
 1189: 
 1190:         if (erreur < 0)
 1191:         {
 1192:             (*s_etat_processus).erreur_execution =
 1193:                     d_ex_routines_mathematiques;
 1194: 
 1195:             free(matrice_f77);
 1196:             return(-1);
 1197:         }
 1198: 
 1199:         if ((rwork = malloc(2 * nombre_colonnes_a * sizeof(real8))) == NULL)
 1200:         {
 1201:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1202:             return(-1);
 1203:         }
 1204: 
 1205:         if ((work = malloc(2 * nombre_colonnes_a * sizeof(complex16))) == NULL)
 1206:         {
 1207:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1208:             return(-1);
 1209:         }
 1210: 
 1211:         ordre = (nombre_lignes_a > nombre_colonnes_a)
 1212:                 ? nombre_colonnes_a : nombre_lignes_a;
 1213: 
 1214:         zgecon_(&norme, &ordre, matrice_f77,
 1215:                 &nombre_lignes_a, &anorme, &rcond, work, rwork, &erreur,
 1216:                 longueur);
 1217: 
 1218:         free(work);
 1219: 
 1220:         if (erreur < 0)
 1221:         {
 1222:             (*s_etat_processus).erreur_execution =
 1223:                     d_ex_routines_mathematiques;
 1224: 
 1225:             free(matrice_f77);
 1226:             return(-1);
 1227:         }
 1228: 
 1229:         if ((jpvt = malloc(nombre_colonnes_a * sizeof(integer4))) == NULL)
 1230:         {
 1231:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1232:             return(-1);
 1233:         }
 1234: 
 1235:         for(i = 0; i < (unsigned long) nombre_colonnes_a; i++)
 1236:         {
 1237:             ((integer4 *) jpvt)[i] = 0;
 1238:         }
 1239: 
 1240:         lwork = -1;
 1241: 
 1242:         if ((work = malloc(sizeof(complex16))) == NULL)
 1243:         {
 1244:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1245:             return(-1);
 1246:         }
 1247: 
 1248:         nombre_colonnes_b = 1;
 1249:         nombre_lignes_b = (nombre_lignes_a > nombre_colonnes_a)
 1250:                 ? nombre_lignes_a : nombre_colonnes_a;
 1251: 
 1252:         if ((matrice_b = malloc(nombre_lignes_b * sizeof(complex16))) == NULL)
 1253:         {
 1254:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1255:             return(-1);
 1256:         }
 1257: 
 1258:         for(i = 0; i < (unsigned long) nombre_lignes_b; i++)
 1259:         {
 1260:             ((complex16 *) matrice_b)[i].partie_reelle = 0;
 1261:             ((complex16 *) matrice_b)[i].partie_imaginaire = 0;
 1262:         }
 1263: 
 1264:         zgelsy_(&nombre_lignes_a, &nombre_colonnes_a,
 1265:                 &nombre_colonnes_b, matrice_c, &nombre_lignes_a,
 1266:                 matrice_b, &nombre_lignes_b, jpvt, &rcond, &rang,
 1267:                 work, &lwork, rwork, &erreur);
 1268: 
 1269:         lwork = ((complex16 *) work)[0].partie_reelle;
 1270:         free(work);
 1271: 
 1272:         if ((work = malloc(lwork * sizeof(complex16))) == NULL)
 1273:         {
 1274:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1275:             return(-1);
 1276:         }
 1277: 
 1278:         zgelsy_(&nombre_lignes_a, &nombre_colonnes_a,
 1279:                 &nombre_colonnes_b, matrice_c, &nombre_lignes_a,
 1280:                 matrice_b, &nombre_lignes_b, jpvt, &rcond, &rang,
 1281:                 work, &lwork, rwork, &erreur);
 1282: 
 1283:         free(rwork);
 1284:         free(matrice_b);
 1285:         free(matrice_c);
 1286:         free(work);
 1287:         free(jpvt);
 1288: 
 1289:         if (erreur < 0)
 1290:         {
 1291:             (*s_etat_processus).erreur_execution =
 1292:                     d_ex_routines_mathematiques;
 1293: 
 1294:             free(matrice_f77);
 1295:             return(-1);
 1296:         }
 1297:     }
 1298: 
 1299:     return(rang);
 1300: }
 1301: 
 1302: 
 1303: void
 1304: determinant(struct_processus *s_etat_processus, struct_matrice *s_matrice,
 1305:         void *valeur)
 1306: {
 1307:     complex16                   *vecteur_complexe;
 1308: 
 1309:     integer4                    dimension_vecteur_pivot;
 1310:     integer4                    nombre_colonnes_a;
 1311:     integer4                    nombre_lignes_a;
 1312:     integer4                    *pivot;
 1313:     integer4                    rang;
 1314: 
 1315:     integer8                    signe;
 1316: 
 1317:     real8                       *vecteur_reel;
 1318: 
 1319:     unsigned long               i;
 1320:     unsigned long               j;
 1321:     unsigned long               k;
 1322:     unsigned long               taille_matrice_f77;
 1323: 
 1324:     void                        *matrice_f77;
 1325: 
 1326:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
 1327:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
 1328:     dimension_vecteur_pivot = (nombre_lignes_a < nombre_colonnes_a)
 1329:             ? nombre_lignes_a : nombre_colonnes_a;
 1330:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
 1331: 
 1332:     switch((*s_matrice).type)
 1333:     {
 1334:         case 'I' :
 1335:         {
 1336:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1337:                     sizeof(real8))) == NULL)
 1338:             {
 1339:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1340:                 return;
 1341:             }
 1342: 
 1343:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1344:             {
 1345:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1346:                 {
 1347:                     ((real8 *) matrice_f77)[k++] = ((integer8 **)
 1348:                             (*s_matrice).tableau)[j][i];
 1349:                 }
 1350:             }
 1351: 
 1352:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
 1353:                     sizeof(integer4))) == NULL)
 1354:             {
 1355:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1356:                 return;
 1357:             }
 1358: 
 1359:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1360:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1361:                     dimension_vecteur_pivot, 'R')) < 0)
 1362:             {
 1363:                 return;
 1364:             }
 1365: 
 1366:             if (rang < nombre_lignes_a)
 1367:             {
 1368:                 (*((real8 *) valeur)) = 0;
 1369:             }
 1370:             else
 1371:             {
 1372:                 if ((vecteur_reel = malloc((*s_matrice).nombre_colonnes *
 1373:                         sizeof(real8))) == NULL)
 1374:                 {
 1375:                     (*s_etat_processus).erreur_systeme =
 1376:                             d_es_allocation_memoire;
 1377:                     return;
 1378:                 }
 1379: 
 1380:                 signe = 1;
 1381: 
 1382:                 for(i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1383:                 {
 1384:                     if ((unsigned long) pivot[i] != (i + 1))
 1385:                     {
 1386:                         signe = (signe == 1) ? -1 : 1;
 1387:                     }
 1388: 
 1389:                     vecteur_reel[i] = ((real8 *) matrice_f77)
 1390:                             [(i * nombre_colonnes_a) + i];
 1391:                 }
 1392: 
 1393:                 for(i = 1; i < (*s_matrice).nombre_colonnes; i++)
 1394:                 {
 1395:                     vecteur_reel[0] *= vecteur_reel[i];
 1396:                 }
 1397: 
 1398:                 (*((real8 *) valeur)) = vecteur_reel[0] * signe;
 1399: 
 1400:                 free(vecteur_reel);
 1401:             }
 1402: 
 1403:             free(matrice_f77);
 1404:             free(pivot);
 1405: 
 1406:             break;
 1407:         }
 1408: 
 1409:         case 'R' :
 1410:         {
 1411:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1412:                     sizeof(real8))) == NULL)
 1413:             {
 1414:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1415:                 return;
 1416:             }
 1417: 
 1418:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1419:             {
 1420:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1421:                 {
 1422:                     ((real8 *) matrice_f77)[k++] = ((real8 **)
 1423:                             (*s_matrice).tableau)[j][i];
 1424:                 }
 1425:             }
 1426: 
 1427:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
 1428:                     sizeof(integer4))) == NULL)
 1429:             {
 1430:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1431:                 return;
 1432:             }
 1433: 
 1434:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1435:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1436:                     dimension_vecteur_pivot, 'R')) < 0)
 1437:             {
 1438:                 return;
 1439:             }
 1440: 
 1441:             if (rang < nombre_lignes_a)
 1442:             {
 1443:                 (*((real8 *) valeur)) = 0;
 1444:             }
 1445:             else
 1446:             {
 1447:                 if ((vecteur_reel = malloc((*s_matrice).nombre_colonnes *
 1448:                         sizeof(real8))) == NULL)
 1449:                 {
 1450:                     (*s_etat_processus).erreur_systeme =
 1451:                             d_es_allocation_memoire;
 1452:                     return;
 1453:                 }
 1454: 
 1455:                 signe = 1;
 1456: 
 1457:                 for(i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1458:                 {
 1459:                     if ((unsigned long) pivot[i] != (i + 1))
 1460:                     {
 1461:                         signe = (signe == 1) ? -1 : 1;
 1462:                     }
 1463: 
 1464:                     vecteur_reel[i] = ((real8 *) matrice_f77)
 1465:                             [(i * nombre_colonnes_a) + i];
 1466:                 }
 1467: 
 1468:                 for(i = 1; i < (*s_matrice).nombre_colonnes; i++)
 1469:                 {
 1470:                     vecteur_reel[0] *= vecteur_reel[i];
 1471:                 }
 1472: 
 1473:                 (*((real8 *) valeur)) = vecteur_reel[0] * signe;
 1474: 
 1475:                 free(vecteur_reel);
 1476:             }
 1477: 
 1478:             free(matrice_f77);
 1479:             free(pivot);
 1480: 
 1481:             break;
 1482:         }
 1483: 
 1484:         case 'C' :
 1485:         {
 1486:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1487:                     sizeof(complex16))) == NULL)
 1488:             {
 1489:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1490:                 return;
 1491:             }
 1492: 
 1493:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1494:             {
 1495:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1496:                 {
 1497:                     ((complex16 *) matrice_f77)[k++] = ((complex16 **)
 1498:                             (*s_matrice).tableau)[j][i];
 1499:                 }
 1500:             }
 1501: 
 1502:             if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
 1503:                     sizeof(integer4))) == NULL)
 1504:             {
 1505:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1506:                 return;
 1507:             }
 1508: 
 1509:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1510:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1511:                     dimension_vecteur_pivot, 'C')) < 0)
 1512:             {
 1513:                 return;
 1514:             }
 1515: 
 1516:             if (rang < nombre_lignes_a)
 1517:             {
 1518:                 (*((complex16 *) valeur)).partie_reelle = 0;
 1519:                 (*((complex16 *) valeur)).partie_imaginaire = 0;
 1520:             }
 1521:             else
 1522:             {
 1523:                 if ((vecteur_complexe = malloc((*s_matrice).nombre_colonnes *
 1524:                         sizeof(complex16))) == NULL)
 1525:                 {
 1526:                     (*s_etat_processus).erreur_systeme =
 1527:                             d_es_allocation_memoire;
 1528:                     return;
 1529:                 }
 1530: 
 1531:                 signe = 1;
 1532: 
 1533:                 for(i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1534:                 {
 1535:                     if ((unsigned long) pivot[i] != (i + 1))
 1536:                     {
 1537:                         signe = (signe == 1) ? -1 : 1;
 1538:                     }
 1539: 
 1540:                     vecteur_complexe[i] = ((complex16 *) matrice_f77)
 1541:                             [(i * nombre_colonnes_a) + i];
 1542:                 }
 1543: 
 1544:                 for(i = 1; i < (*s_matrice).nombre_colonnes; i++)
 1545:                 {
 1546:                     f77multiplicationcc_(&(vecteur_complexe[0]),
 1547:                             &(vecteur_complexe[i]), &(vecteur_complexe[0]));
 1548:                 }
 1549: 
 1550:                 f77multiplicationci_(&(vecteur_complexe[0]), &signe,
 1551:                         ((complex16 *) valeur));
 1552: 
 1553:                 free(vecteur_complexe);
 1554:             }
 1555: 
 1556:             free(matrice_f77);
 1557:             free(pivot);
 1558: 
 1559:             break;
 1560:         }
 1561:     }
 1562: 
 1563:     return;
 1564: }
 1565: 
 1566: 
 1567: void
 1568: rang(struct_processus *s_etat_processus, struct_matrice *s_matrice,
 1569:         integer8 *valeur)
 1570: {
 1571:     integer4                    dimension_vecteur_pivot;
 1572:     integer4                    nombre_lignes_a;
 1573:     integer4                    nombre_colonnes_a;
 1574:     integer4                    *pivot;
 1575:     integer4                    rang;
 1576:     integer4                    taille_matrice_f77;
 1577: 
 1578:     unsigned long               i;
 1579:     unsigned long               j;
 1580:     unsigned long               k;
 1581: 
 1582:     void                        *matrice_f77;
 1583: 
 1584:     nombre_lignes_a = (integer4) (*s_matrice).nombre_lignes;
 1585:     nombre_colonnes_a = (integer4) (*s_matrice).nombre_colonnes;
 1586:     dimension_vecteur_pivot = (nombre_lignes_a < nombre_colonnes_a)
 1587:             ? nombre_lignes_a : nombre_colonnes_a;
 1588:     taille_matrice_f77 = nombre_lignes_a * nombre_colonnes_a;
 1589: 
 1590:     if ((pivot = (integer4 *) malloc(dimension_vecteur_pivot *
 1591:             sizeof(integer4))) == NULL)
 1592:     {
 1593:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1594:         return;
 1595:     }
 1596: 
 1597:     switch((*s_matrice).type)
 1598:     {
 1599:         case 'I' :
 1600:         {
 1601:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1602:                     sizeof(real8))) == NULL)
 1603:             {
 1604:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1605:                 return;
 1606:             }
 1607: 
 1608:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1609:             {
 1610:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1611:                 {
 1612:                     ((real8 *) matrice_f77)[k++] = ((integer8 **)
 1613:                             (*s_matrice).tableau)[j][i];
 1614:                 }
 1615:             }
 1616: 
 1617:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1618:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1619:                     dimension_vecteur_pivot, 'R')) < 0)
 1620:             {
 1621:                 free(pivot);
 1622:                 free(matrice_f77);
 1623:                 return;
 1624:             }
 1625: 
 1626:             free(matrice_f77);
 1627:             (*valeur) = rang;
 1628:             break;
 1629:         }
 1630: 
 1631:         case 'R' :
 1632:         {
 1633:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1634:                     sizeof(real8))) == NULL)
 1635:             {
 1636:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1637:                 return;
 1638:             }
 1639: 
 1640:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1641:             {
 1642:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1643:                 {
 1644:                     ((real8 *) matrice_f77)[k++] = ((real8 **)
 1645:                             (*s_matrice).tableau)[j][i];
 1646:                 }
 1647:             }
 1648: 
 1649:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1650:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1651:                     dimension_vecteur_pivot, 'R')) < 0)
 1652:             {
 1653:                 free(pivot);
 1654:                 free(matrice_f77);
 1655:                 return;
 1656:             }
 1657: 
 1658:             free(matrice_f77);
 1659:             (*valeur) = rang;
 1660:             break;
 1661:         }
 1662: 
 1663:         case 'C' :
 1664:         {
 1665:             if ((matrice_f77 = (void *) malloc(taille_matrice_f77 *
 1666:                     sizeof(complex16))) == NULL)
 1667:             {
 1668:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1669:                 return;
 1670:             }
 1671: 
 1672:             for(k = 0, i = 0; i < (*s_matrice).nombre_colonnes; i++)
 1673:             {
 1674:                 for(j = 0; j < (*s_matrice).nombre_lignes; j++)
 1675:                 {
 1676:                     ((complex16 *) matrice_f77)[k++] = ((complex16 **)
 1677:                             (*s_matrice).tableau)[j][i];
 1678:                 }
 1679:             }
 1680: 
 1681:             if ((rang = calcul_rang(s_etat_processus, matrice_f77,
 1682:                     nombre_lignes_a, nombre_colonnes_a, pivot,
 1683:                     dimension_vecteur_pivot, 'C')) < 0)
 1684:             {
 1685:                 free(pivot);
 1686:                 free(matrice_f77);
 1687:                 return;
 1688:             }
 1689: 
 1690:             free(matrice_f77);
 1691:             (*valeur) = rang;
 1692:             break;
 1693:         }
 1694:     }
 1695: 
 1696:     free(pivot);
 1697: 
 1698:     return;
 1699: }
 1700: 
 1701: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>