Annotation of rpl/src/sommations.c, revision 1.1
1.1 ! bertrand 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 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>