C ELFCHA    SOURCE    CB215821  20/11/25    13:27:13     10792          
      SUBROUTINE ELFCHA(MCHARG,KOMALI,KNREFE,KACHAR)
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)
C
C =====================================================================
C
C    CREATION DU SEGMENT MACHAR A PARTIR DE L'OBJET CHARGEMENT MCHARG
C
C    SOUS PROGRAMME APPELE PAR ELFE
C
C    KNREFE : SEGMENT QUI DECRIT LES ELEMENTS
C    KOMALI : SEGMENT DE POINTEURS SUR LES SEGMENTS MALIAI DEFINISSANT
C                  LES LIAISONS
C
C    GUILBAUD MAI 86
C
C =====================================================================
C

-INC PPARAM
-INC CCOPTIO
-INC CCHAMP
-INC SMCHARG
-INC SMCHPOI
-INC SMELEME
-INC SMLREEL
C
      SEGMENT MALIAI
        REAL*8  ALIA1(NALI)
        REAL*8  ALIA2(NBLI)
        REAL*8  ALIA3(NL/2,NL/2)
        REAL*8  ALIA4(NL/2,NL/2)
        REAL*8  BLIAI(NL)
        REAL*8  XLIAI(NL)
        INTEGER NLBLI(2,NBSTLI)
        INTEGER NDCLIA(NL)
        INTEGER NVNLIA(NL/2)
        INTEGER IBCHA(NCHAL)
        POINTEUR KWLIAI.MWLIAI
        POINTEUR KLIMAS.MLIMAS
      ENDSEGMENT
C
C     MATRICE DE LIAISON PUIS SON INVERSE EN 4 BLOCS:
C     ALIA1 : MATRICE BANDE  I-A0
C                               -1
C     ALIA2 : MATRICE BANDE  -B0
C     ALIA3 : MATRICE DE LIAISON  TERMES EN DEPLACEMENT
C     ALIA4 : MATRICE DE LIAISON  TERMES EN CONTRAINTE
C     NLBLI : TABLEAU DE CORRESPONDANCE ENTRE LES BLOCS
C     BLIAI : VECTEUR SECOND MEMBRE -> VN ET CHARGEMENT EVENTUEL
C     XLIAI : VECTEUR PREMIER MEMBRE -> DNCN
C     NDCLIA(NJC)=IKID : LA NJC-IEME INCONNUE DE XLIAI EST LE IKID-IEME
C     DDL DE DNCN
C               DNCN(IKID)      <-  XLIAI(NJC)
C     NVNLIA(NJL)=IKIV : LA NJL-IEME INCONNUE DE BLIAI EST LE IKIV-IEME
C     DDL DE VN
C               BLIAI(NJL)      <-  VN(IKIV)
C     NCHAL : NOMBRE DE SOUS-CHARGEMENTS AGISSANT SUR LA LIAISON
C     IBCHA(I)=K : LA PARTIE CHARGEMENT DE BLIAI POUR LE I-IEME SOUS-
C     CHARGEMENT SE TROUVE A PARTIR DE LA K+1-IEME PLACE DANS BCHAR2
C               BLIAI(NL/2+NJL) <-  BCHAR2(K+NJL)
C
      SEGMENT MWLIAI
        REAL*8  ALIAI(NL/2,NL)
      ENDSEGMENT
C
      SEGMENT ICPR(nbpts)
C
C                 IKID=ICPR(NUM(I,J))+K
C     LA COMPOSANTE NOMD(K) DU POINT NUM EST LE IKID-IEME DDL DE DNCN
C
      SEGMENT MACHAR
        INTEGER  LACHAL(NCHAR)
        POINTEUR LACHAT(NCHAR).ICHPO2
        POINTEUR LACHAF(NCHAR).ICHPO3
        REAL*8   BCHAR1(NV1)
        REAL*8   BCHAR2(NV1)
      ENDSEGMENT
C
C     LACHAL(I) : NOMBRE DE TERMES RELATIFS AU CHARGEMENT I DANS BCHAR1
C     LACHAT(I) : POINTEUR SUR LA LISTE DES TEMPS DU CHARGEMENT I
C     LACHAF(I) : POINTEUR SUR LA LISTE DES F(T)  DU CHARGEMENT I
C     BCHAR1 : VECTEUR FORME PAR L'EMPILEMENT DE LA PARTIE CHARGEMENT
C          DES SECOND-MEMBRES BLIAI, POUR TOUTES LES LIAISONS CONCERNEES
C          PAR UN SOUS-CHARGEMENT ET POUR TOUS LES SOUS-CHARGEMENTS
C     BCHAR2 : IDEM MODULE PAR LES FONCTIONS TEMPORELLES
C
      SEGMENT MOMALI
        POINTEUR NOMALI(NBLIPE).MALIAI
        POINTEUR KCPR2.ICPR2
      ENDSEGMENT
C
      SEGMENT MNREFE
        INTEGER NREFE(8,NSTR)
        INTEGER NTANBN
        INTEGER NIDNCN
        INTEGER NTVN
        POINTEUR NREPA.MPASS
        POINTEUR NRECA.MCARA
        POINTEUR NRENO.MNORM
        POINTEUR NRECPR.ICPR
        POINTEUR NREMEL.MELEME
        POINTEUR NREDEN.MDEN
      ENDSEGMENT
C
C   NSTR       : NOMBRE D'ELEMENTS
C   NREFE(1,I) : MELEME
C   NREFE(2,I) : MSOSTU
C   NREFE(3,I) : TYPE DE L'ELEMENT
C   NREFE(4,I) : NOMBRE DE POINTS DU MELEME
C   NREFE(5,I) : NOMBRE DE DDL PAR POINT
C   NREFE(6,I)=IVN :LE 1ER DDL DE L'ELEMENT EST LE IVN+1 IEME DE VN
C   NREFE(7,I)=IAN :LE 1ER TERME DE LA MATRICE A EST LE IAN IEME DE ANBN
C   NREFE(8,I)= 1 :LE IEME ELEMENT EST RIGIDE (OU PARTIELLEMENT) SINON 0
C   NTANBN : NOMBRE DE TERMES DES MATRICES A ET B POUR TOUS LES ELEMENTS
C   NIDNCN : NOMBRE TOTAL D'INCONNUES DE DNCN
C   NTVN   : LONGUEUR DU TABLEAU VN
C
      SEGMENT ICPR2(NIDNCN)
C
C     NJ=ICPR2(IKID) : LE IKID-IEME DDL DE DNCN EST LE NJ-IEME DANS
C     L'ENSEMBLE DES XLIAI MIS BOUT-A-BOUT
C
      SEGMENT V0(2*NTVN)*D
C
      SEGMENT ITCOM(NC)
C
      SEGMENT IT(NBLIPE)
C
      SEGMENT/ITLI/(ITLIA(NCHAR,NBLIPE))
C
      CHARACTER*(LOCOMP) NOC
      
      
      WRITE(IOIMP,*) 'DEBUT DE ELFCHA'
      KACHAR=0
      MNREFE=KNREFE
      ICPR=NRECPR
      SEGINI V0
C
      MOMALI=KOMALI
      ICPR2=KCPR2
      NBLIPE=NOMALI(/1)
      SEGINI IT
C
      SEGACT MCHARG
      NCHAR=KCHARG(/1)
      SEGINI ITLI
      DO 1 I=1,NBLIPE
      IT(I)=0
      DO 1 J=1,NCHAR
      ITLIA(J,I)=0
    1 CONTINUE
C
      NV1=NTVN
      SEGINI MACHAR
C
C       BOUCLE SUR LES SOUS-CHARGEMENTS DE L'OBJET CHARGEMENT
C
      NV1=0
      DO 140 I=1,NCHAR
        DO 10 II=1,NIDNCN
        V0(II)=0.D0
  10    CONTINUE
C
C   1 - RECHERCHE DE LA POSITION DU DDL CHARGE DANS L'ENSEMBLE DES XLIAI
C       ET REMPLISSAGE DE V0
C
      ICHARG=KCHARG(I)
      SEGACT ICHARG
      IF(CHATYP.NE.'CHPOINT '.OR.CHAMOB(I).NE.'STAT'
     & .OR.CHALIE(I).NE.'LIE ') THEN
         SEGDES ICHARG,MCHARG
         CALL ERREUR(696)
         RETURN
      ENDIF
      MCHPOI=ICHPO1
      SEGACT MCHPOI
      NSOUPO=IPCHP(/1)
         DO 70 ISOUPO=1,NSOUPO
         MSOUPO=IPCHP(ISOUPO)
         SEGACT MSOUPO
         MPOVAL=IPOVAL
         SEGACT MPOVAL
         NC=VPOCHA(/2)
         SEGINI ITCOM
           DO 40 INC=1,NC
           NOC=NOCOMP(INC)
           ITCOM(INC)=0
           DO 20 IDD=1,6
           IF(NOC.EQ.NOMDD(IDD)) THEN
             ITCOM(INC)=IDD
             GO TO 40
           ENDIF
   20      CONTINUE
           DO 30 IDU=1,6
           IF(NOC.EQ.NOMDU(IDU)) THEN
             ITCOM(INC)=IDU+6
             GO TO 40
           ENDIF
   30      CONTINUE
   40    CONTINUE
C
         MELEME=IGEOC
         SEGACT MELEME
         NBPO=NUM(/2)
         DO 60 IBPO=1,NBPO
         IKI=ICPR(NUM(1,IBPO))
         IF(IKI.EQ.-1) THEN
C  ***  LE POINT NE FAIT PAS PARTIE DE LA STRUCTURE
           INTERR(1)=IKI
           CALL ERREUR(384)
           RETURN
         ENDIF
         DO 50 INC=1,NC
         IKC=ITCOM(INC)
         IF(IKC.EQ.0) THEN
C  ***  LA COMPOSANTE N'EST PAS DEFINIE POUR LA STRUCTURE
           MOTERR=NOCOMP(INC)
           CALL ERREUR(385)
           RETURN
         ENDIF
         VP=VPOCHA(IBPO,INC)
         IV=ICPR2(IKI+IKC)
C        WRITE(IOIMP,*) IV
         IF(VP.NE.0.D0) V0(IV)=VP
   50    CONTINUE
   60    CONTINUE
         SEGSUP ITCOM
   70    CONTINUE
C     WRITE(IOIMP,*)(V0(J),J=1,NIDNCN)
C
C   2 - CREATION DU TABLEAU V1 A PARTIR DE V0
C
      NDEPLA=0
      NV2=0
         DO 130 INLIAI=1,NBLIPE
         MALIAI=NOMALI(INLIAI)
         MWLIAI=KWLIAI
         NL=NDCLIA(/1)
C
C       Y A-T-IL UN CHARGEMENT SUR LA LIAISON ?
C
         DO 80 NJCC=1,NL
           IF(V0(NDEPLA+NJCC).NE.0.D0) THEN
C
C       CREATION DE LA PARTIE CHARGEMENT DU SECOND MEMBRE BLIAI
C       ET EMPILEMENT DANS BCHAR1
C
           ITT=IT(INLIAI)+1
           IT(INLIAI)=ITT
           NLS2=NL/2
           ITLIA(ITT,INLIAI)=NV1
           NVA=NV1
           NV1=NV1+NLS2
           NV2=NV2+NLS2
C          WRITE(IOIMP,*)ITT,NV1,NV2,INLIAI,NDEPLA
           DO 110 NJC=1,NL
            VV=V0(NDEPLA+NJC)
            IF(VV.NE.0.D0) THEN
              DO 100 NJ=1,NLS2
C               WRITE(IOIMP,*) ALIAI(NJL,NJC)
                IF(ALIAI(NJ,NJC).NE.0.D0) THEN
                  NJA=NVA+NJ
                  BCHAR1(NJA)=BCHAR1(NJA)+VV
C                 WRITE(IOIMP,*) BCHAR1(NJA)
                ENDIF
  100         CONTINUE
            ENDIF
  110      CONTINUE
           GOTO 120
          ENDIF
   80    CONTINUE
  120    NDEPLA=NDEPLA+NL
  130  CONTINUE
C
      LACHAL(I)=NV2
      MLREEL=ICHPO2
      SEGACT MLREEL
      LACHAT(I)=ICHPO2
      MLREEL=ICHPO3
      SEGACT MLREEL
      LACHAF(I)=ICHPO3
      SEGDES ICHARG
  140 CONTINUE
C
      SEGDES MCHARG
      SEGSUP V0
      SEGADJ MACHAR
      KACHAR=MACHAR
C
C     CREATION DU TABLEAU IBCHA DES SEGMENTS MALIAI
C
      DO 160 INLIAI=1,NBLIPE
      MALIAI=NOMALI(INLIAI)
      MWLIAI=KWLIAI
      SEGSUP MWLIAI
      NCHAL=IT(INLIAI)
      IF(NCHAL.NE.0) THEN
        NL=NDCLIA(/1)
        NALI=ALIA1(/1)
        NBLI=ALIA2(/1)
        NBSTLI=NLBLI(/2)
        SEGADJ MALIAI
           DO 150 ITT=1,NCHAL
           IBCHA(ITT)=ITLIA(ITT,INLIAI)
  150      CONTINUE
      ENDIF
  160 CONTINUE
      SEGSUP IT,ITLI
C
      IF(IIMPI.EQ.1) THEN
        DO 210 INLIAI=1,NBLIPE
        MALIAI=NOMALI(INLIAI)
        NCHAL=IBCHA(/1)
        WRITE(IOIMP,1001) INLIAI,NCHAL
 1001 FORMAT(/1X,' LA ',I5,' IEME LIAISON EST CHARGEE AVEC ',I5,
     *' CHARGEMENT(S) '/)
        IF(NCHAL.NE.0) THEN
          NLS2=NDCLIA(/1)/2
          DO 200 J=1,NCHAL
          IT1=IBCHA(J)+1
          IT2=0
             DO 170 N=1,NCHAR
             IT2=IT2+LACHAL(N)
             IF(IT1.LE.IT2) THEN
               WRITE(IOIMP,1002) N,LACHAT(N),LACHAF(N),LACHAL(N)
 1002 FORMAT(//1X,' CHARGEMENT ',I5,' T, F(T) :',I6,1X,I6,1X,I6)
               GOTO 180
             ENDIF
  170        CONTINUE
  180        CONTINUE
          IT2=IT1+NLS2-1
          WRITE(IOIMP,1003)(BCHAR1(IT),IT=IT1,IT2)
 1003 FORMAT(1X,10(1PE12.5,1X))
  200     CONTINUE
        ENDIF
  210   CONTINUE
      ENDIF
C
      WRITE(IOIMP,*) 'FIN DE ELFCHA'
      RETURN
      END






 
