File:  [local] / rpl / src / sommations.c
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Thu Jun 24 10:10:47 2010 UTC (13 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_17, HEAD
En route pour la 4.0.17 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.17
    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 le tri d'un vecteur de réels du plus petit au plus
   29:   grand en valeur absolue (algorithme de tri dit de Shell-Metzner)
   30: ================================================================================
   31:   Entrées : pointeur sur une structure struct_processus
   32: --------------------------------------------------------------------------------
   33:   Sorties :
   34: --------------------------------------------------------------------------------
   35:   Effets de bord : néant
   36: ================================================================================
   37: */
   38: 
   39: void
   40: tri_vecteur(real8 *vecteur, unsigned long taille)
   41: {
   42:     logical1                    terminaison_boucle_1;
   43:     logical1                    terminaison_boucle_2;
   44:     logical1                    terminaison_boucle_3;
   45: 
   46:     signed long                 indice_i;
   47:     signed long                 indice_j;
   48:     signed long                 indice_k;
   49:     signed long                 indice_l;
   50: 
   51:     unsigned long               ecartement;
   52: 
   53:     ecartement = taille;
   54:     terminaison_boucle_1 = d_faux;
   55: 
   56:     do
   57:     {
   58:         ecartement = ecartement / 2;
   59: 
   60:         if (ecartement >= 1)
   61:         {
   62:             indice_j = 0;
   63:             indice_k = taille - ecartement;
   64:             terminaison_boucle_2 = d_faux;
   65: 
   66:             do
   67:             {
   68:                 indice_i = indice_j;
   69:                 terminaison_boucle_3 = d_faux;
   70: 
   71:                 do
   72:                 {
   73:                     indice_l = indice_i + ecartement;
   74: 
   75:                     if ((indice_i > 0) && (indice_l > 0))
   76:                     {
   77:                         if (fabs(vecteur[indice_i - 1]) >
   78:                                 fabs(vecteur[indice_l - 1]))
   79:                         {
   80:                             swap((void *) &(vecteur[indice_i - 1]),
   81:                                     (void *) &(vecteur[indice_l - 1]),
   82:                                     sizeof(real8));
   83: 
   84:                             indice_i -= ecartement;
   85: 
   86:                             if (indice_i < 1)
   87:                             {
   88:                                 terminaison_boucle_3 = d_vrai;
   89:                             }
   90:                         }
   91:                         else
   92:                         {
   93:                             terminaison_boucle_3 = d_vrai;
   94:                         }
   95:                     }
   96:                     else
   97:                     {
   98:                         terminaison_boucle_3 = d_vrai;
   99:                     }
  100:                 } while(terminaison_boucle_3 == d_faux);
  101: 
  102:                 indice_j++;
  103: 
  104:                 if (indice_j > indice_k)
  105:                 {
  106:                     terminaison_boucle_2 = d_vrai;
  107:                 }
  108:             } while(terminaison_boucle_2 == d_faux);
  109:         }
  110:         else
  111:         {
  112:             terminaison_boucle_1 = d_vrai;
  113:         }
  114:     } while(terminaison_boucle_1 == d_faux);
  115: }
  116: 
  117: 
  118: /*
  119: ================================================================================
  120:   Fonction réalisation la sommation d'un vecteur de réel sans perte
  121:   de précision
  122: ================================================================================
  123:   Entrées : pointeur sur une structure struct_processus
  124: --------------------------------------------------------------------------------
  125:   Sorties :
  126: --------------------------------------------------------------------------------
  127:   Effets de bord : néant
  128: ================================================================================
  129: */
  130: 
  131: real8
  132: sommation_vecteur_reel(real8 *vecteur, unsigned long *taille,
  133:         logical1 *erreur_memoire)
  134: {
  135: #if 0
  136:     unsigned long               nombre_elements;
  137:     unsigned long               pointeur;
  138: 
  139:     /*
  140:      * Sommation des termes en commençant par le plus petit.
  141:      * Algorithme optimal mais NP-complet...
  142:      */
  143: 
  144:     nombre_elements = (*taille);
  145:     (*erreur_memoire) = d_faux;
  146: 
  147:     while(nombre_elements != 1)
  148:     {
  149:         pointeur = (*taille) - nombre_elements;
  150:         tri_vecteur(&(vecteur[pointeur]), nombre_elements);
  151:         vecteur[pointeur + 1] += vecteur[pointeur];
  152:         nombre_elements--;
  153:     }
  154: 
  155:     return(vecteur[(*taille) - 1]);
  156: #else
  157:     real8               erreur;
  158:     real8               somme;
  159:     real8               registre;
  160:     real8               tampon;
  161: 
  162:     unsigned long       i;
  163: 
  164:     somme = 0;
  165:     erreur = 0;
  166: 
  167:     (*erreur_memoire) = d_faux;
  168: 
  169:     for(i = 0; i < (*taille); i++)
  170:     {
  171:         tampon = somme;
  172:         registre = vecteur[i] + erreur;
  173:         somme = tampon + registre;
  174:         erreur = (tampon - somme) + registre;
  175:     }
  176: 
  177:     return(somme);
  178: #endif
  179: }
  180: 
  181: 
  182: /*
  183: ================================================================================
  184:   Fonction réalisation la sommation d'un vecteur de complexes sans perte
  185:   de précision
  186: ================================================================================
  187:   Entrées : pointeur sur une structure struct_processus
  188: --------------------------------------------------------------------------------
  189:   Sorties :
  190: --------------------------------------------------------------------------------
  191:   Effets de bord : néant
  192: ================================================================================
  193: */
  194: 
  195: complex16
  196: sommation_vecteur_complexe(complex16 *vecteur, unsigned long *taille,
  197:         logical1 *erreur_memoire)
  198: {
  199:     complex16                   cumul;
  200: 
  201:     real8                       *tampon;
  202: 
  203:     unsigned long               i;
  204:     unsigned long               nombre_elements;
  205: 
  206:     if ((tampon = malloc((*taille) * sizeof(real8))) == NULL)
  207:     {
  208:         (*erreur_memoire) = d_vrai;
  209: 
  210:         cumul.partie_reelle = 0;
  211:         cumul.partie_imaginaire = 0;
  212: 
  213:         return(cumul);
  214:     }
  215: 
  216:     (*erreur_memoire) = d_faux;
  217: 
  218:     /*
  219:      * Sommation des termes en commençant par le plus petit
  220:      */
  221: 
  222:     for(i = 0, nombre_elements = (*taille); i < nombre_elements;
  223:             tampon[i] = vecteur[i].partie_reelle, i++);
  224:             
  225:     cumul.partie_reelle = sommation_vecteur_reel(tampon, taille,
  226:             erreur_memoire);
  227: 
  228:     /*
  229:      * Même traitement, mais sur la partie imaginaire
  230:      */
  231: 
  232:     for(i = 0, nombre_elements = (*taille); i < nombre_elements;
  233:             tampon[i] = vecteur[i].partie_imaginaire, i++);
  234:             
  235:     cumul.partie_imaginaire = sommation_vecteur_reel(tampon, taille,
  236:             erreur_memoire);
  237: 
  238:     free(tampon);
  239: 
  240:     return(cumul);
  241: }
  242: 
  243: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>