C NFIL      SOURCE    PV090527  26/04/30    21:15:58     12529          
      SUBROUTINE NFIL
************************************************************************
C NOM         : NFIL
C DESCRIPTION : L'operateur NFIL sert a normaliser/modifier
C               une matrice de filtragea (cree avec MFIL).
************************************************************************
C APPELE PAR : pilot.eso
************************************************************************
C SYNTAXE (GIBIANE) :
C
C       HN  =  NFIL  H  HS        ;
C       HM  =  NFIL  H  HS 'MODI' ;
C
C    H  : Martice de filtrage initiale
C         (RIGIDITE calculee par MFIL)
C
C    HS : Vecteur de la somme des poids de filtrage
C         (CHPOINT egal a H * un CHPOINT unitaire)
C
C    HN : Matrice "normalisee" (les termes de chaque ligne i sont
C                               divises par la i-eme composante de HS)
C
C    HM : Matrice "modifiee"   (les termes de chaque colonne i sont
C                               divises par la i-eme composante de HS)
C
************************************************************************

C     Typages implicites classiques
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)

C     Includes des segments utiles
-INC PPARAM
-INC CCOPTIO
-INC CCREEL
-INC SMRIGID
-INC SMCHPOI
-INC SMELEME

C     Mots clefs
      PARAMETER (LCLE=1)
      CHARACTER*4 MOCLE(LCLE)
      DATA MOCLE/'MODI'/

C     Quelques objets utiles
      CHARACTER*(LOCHPO) MOT1

C     Lecture du mot clef
      CALL LIRMOT(MOCLE,LCLE,ICLE,0)

C     Lecture de la RIGIDITE
      CALL LIROBJ('RIGIDITE',RI1,1,IRETOU)
      CALL ACTOBJ('RIGIDITE',RI1,1)
      IF (IERR.NE.0) RETURN

C     Lecture du CHPOINT
      CALL LIROBJ('CHPOINT ',MCHPO1,1,IRETOU)
      CALL ACTOBJ('CHPOINT ',MCHPO1,1)
      IF (IERR.NE.0) RETURN

C     Petite verification du CHPOINT
      NSOUPO=MCHPO1.IPCHP(/1)
      IF (NSOUPO.EQ.0) THEN
          CALL ERREUR(150)
          RETURN
      ENDIF

C     Initialisation de la matrice resultat RI2 (sur la base de RI1)
      SEGINI,RI2=RI1

C     Normalisation/Modification de la matrice
      NRIGEL=RI2.IRIGEL(/2)
C     Boucle sur les sous matrices
      DO IM=1,NRIGEL
C         Initialisation des taleaux XMATRI de RI2 (sur la base de RI1)
          XMATR1=RI1.IRIGEL(4,IM)
          SEGINI,XMATR2=XMATR1
          RI2.IRIGEL(4,IM)=XMATR2
          NLIGRD=XMATR2.RE(/1)
          NLIGRP=XMATR2.RE(/2)
          NELRIG=XMATR2.RE(/3)
          IPT2=RI2.IRIGEL(1,IM)
          DES2=RI2.IRIGEL(3,IM)
          SEGACT IPT2,DES2
C         Boucle sur les elements
          DO IE=1,NELRIG
C             Boucle sur les inconnues
C             Si ICLE=0 : normalistion des lignes (on parcourt les duales)
              IF (ICLE.EQ.0) THEN
                  NINC=NLIGRD
C             Si ICLE=1 : normalisation des colonnes (on parcourt les primales)
              ELSEIF(ICLE.EQ.1) THEN
                  NINC=NLIGRP
              ENDIF
              DO IINC=1,NINC
C                 Nom de l'inconnue (MOT1) et noeud (IGLO1)
                  IF (ICLE.EQ.0) THEN
                      MOT1=DES2.LISDUA(IINC)
                      ILOC1=DES2.NOELED(IINC)
                  ELSEIF(ICLE.EQ.1) THEN
                      MOT1=DES2.LISINC(IINC)
                      ILOC1=DES2.NOELEP(IINC)
                  ENDIF
                  IGLO1=IPT2.NUM(ILOC1,IE)
C                 Extraction dans le CHPOINT de la valeur de la
C                 composante MOT1 au noeud IGLO1
                  CALL EXTRA9(MCHPO1,IGLO1,MOT1,0,.FALSE.,XVAL,IRET)
C                 Si le point n'est pas present dans MCHPO1, on itere
                  IF (IRET.EQ.0) THEN
                      GOTO 10
                  ENDIF
C                 Si la valeur du champ est nulle, on itere
                  IF (ABS(XVAL).LT.XPETIT) THEN
                      GOTO 10
                  ENDIF
C                 Division des temres concernes
C                 Pour la normalistion des lignes, on boucle sur les primales
                  IF (ICLE.EQ.0) THEN
                      DO J=1,NLIGRP
                          XMATR2.RE(IINC,J,IE)=XMATR2.RE(IINC,J,IE)/XVAL
                      ENDDO
C                 Pour la normalistion par colonne, on boucle sur les duales
                  ELSEIF(ICLE.EQ.1) THEN
                      DO J=1,NLIGRD
                          XMATR2.RE(J,IINC,IE)=XMATR2.RE(J,IINC,IE)/XVAL
                      ENDDO
                  ENDIF
10                CONTINUE
              ENDDO
          ENDDO
          SEGDES IPT2,DES2,XMATR2
      ENDDO

C     Menage
      SEGDES RI2,MCHPO1
      CALL ECROBJ('RIGIDITE',RI2)

C     Et c'est fini
      RETURN
      END
 
 
 
