/* MTMAVE.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"

/* Subroutine */ int mmtmave_(nligne, ncolon, gposit, gnstoc, gmatri, vecin, 
	vecout, iercod)
integer *nligne, *ncolon, *gposit, *gnstoc;
doublereal *gmatri, *vecin, *vecout;
integer *iercod;
{
    /* System generated locals */
    integer i__1, i__2;

    /* Local variables */
    static logical ldbg;
    static integer imin, imax, i__, j, k;
    static doublereal somme;
    extern integer mnfndeb_();
    static integer aux;
    extern /* Subroutine */ int maermsg_(), mgenmsg_(), mgsomsg_();



/* < */
/* **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 : */
/*     ---------- */
/*                          t */
/*      EFFECUE LE PRODUIT   G V */
/*      OU LA MATRICE G EST SOUS FORME DE PROFIL */

/*     MOTS CLES : */
/*     ----------- */
/*      RESERVE, PRODUIT, MATRICE, PROFIL, VECTEUR */

/*     ARGUMENTS D'ENTREE : */
/*     -------------------- */
/*       NLIGNE : NOMBRE DE LIGNE DE LA MATRICE */
/*       NCOLON : NOMBRE DE COLONNE DE LA MATRICE */
/*       GPOSIT: TABLE DE POSITIONNEMENT DES TERMES DE STOCKAGE */
/*               GPOSIT(1,I) CONTIENT LE NOMBRE DE TERMES-1 SUR LA LIGNE 
*/
/*               I DANS LE PROFIL DE LA MATRICE */
/*              GPOSIT(2,I) CONTIENT L'INDICE DE STOCKAGE DU TERME DIAGONA
L*/
/*               DE LA LIGNE I */
/*               GPOSIT(3,I) CONTIENT L'INDICE COLONE DU PREMIER TERME DU 
*/
/*                           PROFIL DE LA LIGNE I */
/*       GNSTOC : NOMBRE DE TERME DANS LE PROFIL DE GMATRI */
/*       GMATRI : MATRICE DES CONTRAINTES SOUS FORME DE PROFIL */
/*       VECIN : VECTEUR D'ENTRE */

/*     ARGUMENTS DE SORTIE : */
/*     --------------------- */
/*       VECOUT :VECTEUR PRODUIT */
/*       IERCOD : CODE D'ERREUR */


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


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


/*     DESCRIPTION/REMARQUES/LIMITATIONS : */
/*     ----------------------------------- */


/* $    HISTORIQUE DES MODIFICATIONS : */
/*     ------------------------------ */
/*     21-08-95 : KHN; ECRITURE VERSION ORIGINALE. */
/* > */
/* ***********************************************************************
 */
/*                            DECLARATIONS */
/* ***********************************************************************
 */



/* ***********************************************************************
 */
/*                      INITIALISATIONS */
/* ***********************************************************************
 */

    /* Parameter adjustments */
    --vecin;
    gposit -= 4;
    --vecout;
    --gmatri;

    /* Function Body */
    ldbg = mnfndeb_() >= 2;
    if (ldbg) {
	mgenmsg_("MMTMAVE", 7L);
    }
    *iercod = 0;

/* ***********************************************************************
 */
/*                     TRAITEMENT */
/* ***********************************************************************
 */



    i__1 = *ncolon;
    for (i__ = 1; i__ <= i__1; ++i__) {
	somme = 0.;
	i__2 = *nligne;
	for (j = 1; j <= i__2; ++j) {
	    imin = gposit[j * 3 + 3];
	    imax = gposit[j * 3 + 1] + gposit[j * 3 + 3] - 1;
	    aux = gposit[j * 3 + 2] - gposit[j * 3 + 1] - imin + 1;
	    if (imin <= i__ && i__ <= imax) {
		k = i__ + aux;
		somme += gmatri[k] * vecin[j];
	    }
	}
	vecout[i__] = somme;
    }





    goto L9999;

/* ***********************************************************************
 */
/*                   TRAITEMENT DES ERREURS */
/* ***********************************************************************
 */


/* ***********************************************************************
 */
/*                   RETOUR PROGRAMME APPELANT */
/* ***********************************************************************
 */

L9999:

/* ___ DESALLOCATION, ... */

    maermsg_("MMTMAVE", iercod, 7L);
    if (ldbg) {
	mgsomsg_("MMTMAVE", 7L);
    }
 return 0 ;
} /* mmtmave_ */

