/* VSHELD.f -- translated by f2c (version 19960827).
   You must link the resulting object file with the libraries:
	-lf2c -lm   (in that order)
*/

#include "Data_f2c.h"
#ifdef WNT
#include <MathBase.h>
#else 
#define  __MathBase_API
#endif
/* Subroutine */ __MathBase_API int mvsheld_(n, is, dtab, icle)
integer *n, *is;
doublereal *dtab;
integer *icle;
{
    /* System generated locals */
    integer dtab_dim1, dtab_offset, i__1, i__2;

    /* Local variables */
    static integer incr;
    static doublereal dsave;
    static integer i3, i4, i5, incrp1;



/* < */
/* **NOTICE */
/*  THIS SOFTWARE IS THE PROPERTY OF CISIGRAPH. */
/*  THIS CODE MUST NOT BE DISTRIBUTED OR COPIED WITHOUT THE PRIOR */
/*  WRITTEN PERMISSION OF CISIGRAPH AND IS ONLY TO BE USED ON THE */
/*  SITE WHERE IT IS INSTALLED BY CISIGRAPH */
/* **NOTICE */

/************************************************************************
*******/

/*     FONCTION : */
/*     ---------- */
/*       TRI LES COLONNES D'UN TABLEAU DE REAL*8 SUIVANT LA METHODE DE SHE
LL*/
/*        (DANS L'ORDRE CROISSANT) */

/*     MOTS CLES : */
/*     ----------- */
/*        POINT-ENTREE, TRI, SHELL */

/*     ARGUMENTS D'ENTREE : */
/*     ------------------ */
/*        N      : NOMBRE DE COLONNES DU TABLEAU */
/*        IS     : NOMBRE DE LIGNE DU TABLEAU */
/*        DTAB   : TABLEAU DE REAL*8 A TRIER */
/*        ICLE   : POSITION DE LA CLE SUR LA COLONNE */

/*     ARGUMENTS DE SORTIE : */
/*     ------------------- */
/*        DTAB   : TABLEAU TRIE */

/*     COMMONS UTILISES   : */
/*     ---------------- */


/*     REFERENCES APPELEES   : */
/*     ---------------------- */
/*            Neant */

/*     DESCRIPTION/REMARQUES/LIMITATIONS : */
/*     ----------------------------------- */
/*     METHODE CLASSIQUE DE SHELL : TRI PAR SERIES */
/*     La declaration DTAB(IS, 1) correspond en fait a DTAB(IS, *) */

/* $    HISTORIQUE DES MODIFICATIONS   : */
/*     -------------------------------- */
/*     24-09-93 : PMN; NETTOYAGE ET CORRECTION DE L'EN-TETE */
/*     13-07-84 : BF ; VERSION D'ORIGINE */

/* > */
/* ***********************************************************************
 */


    /* Parameter adjustments */
    dtab_dim1 = *is;
    dtab_offset = dtab_dim1 + 1;
    dtab -= dtab_offset;

    /* Function Body */
    if (*n <= 1) {
	goto L9900;
    }
/*     ------------------------ */

/*  INITIALISATION DE LA SUITE DES INCREMENTS */
/*  RECHERCHE DU PLUS GRAND INCREMENT TEL QUE INCR < N/9 */

    incr = 1;
L1001:
    if (incr >= *n / 9) {
	goto L1002;
    }
/*     ----------------------------- */
    incr = incr * 3 + 1;
    goto L1001;

/*  BOUCLE SUR LES INCREMENTS JUSQU'A INCR = 1 */
/*  TRI PAR SERIES DISTANTES DE INCR */

L1002:
    incrp1 = incr + 1;
/*     ----------------- */
    i__1 = *n;
    for (i3 = incrp1; i3 <= i__1; ++i3) {
/*        ---------------------- */

/*  METTRE L'ELEMENT I3 A SA PLACE DANS SA SERIE */

	i4 = i3 - incr;
L1004:
	if (i4 < 1) {
	    goto L1003;
	}
/*           ------------------------- */
	if (dtab[*icle + i4 * dtab_dim1] <= dtab[*icle + (i4 + incr) * 
		dtab_dim1]) {
	    goto L1003;
	}

	i__2 = *is;
	for (i5 = 1; i5 <= i__2; ++i5) {
/*              ------------------ */
	    dsave = dtab[i5 + i4 * dtab_dim1];
	    dtab[i5 + i4 * dtab_dim1] = dtab[i5 + (i4 + incr) * dtab_dim1];
	    dtab[i5 + (i4 + incr) * dtab_dim1] = dsave;
	}
/*              -------- */
	i4 -= incr;
	goto L1004;

L1003:
	;
    }
/*           -------- */

/*  PASSAGE A L'INCREMENT SUIVANT */

    incr /= 3;
    if (incr >= 1) {
	goto L1002;
    }

L9900:
 return 0   ;
} /* mvsheld_ */

