Download relaba.eso

Back to the list

   1 : C RELABA    SOURCE    CHAT      09/10/09    21:22:39     6519           
   2 :       SUBROUTINE RELABA
   3 : *
   4 : * relation barycentrique pour les ddl d'un noeud vis-à-vis
   5 : * d'un maillage
   6 : *  rig1 = rela bary lmot1 (ou 'DEPL' ou 'ROTA') p1 geo1 
   7 : *
   8 : *
   9 :       IMPLICIT INTEGER(I-N)
  10 :       IMPLICIT REAL*8 (A-H,O-Z)
  11 : -INC CCOPTIO
  12 : -INC CCGEOME
  13 : -INC SMELEME
  14 : -INC SMCOORD
  15 : -INC SMRIGID
  16 : -INC CCHAMP
  17 : -INC SMLREEL
  18 : -INC SMLMOTS
  19 : c
  20 :       CHARACTER*4 ITCORI(2),LEMOT,LESDDL(6),LESDUA(6)
  21 :       CHARACTER*4 MODEPL(5),MODEDU(5),MOROTA(5),MORODU(5)
  22 :       DATA ITCORI(1)/'DEPL'/
  23 :       DATA ITCORI(2)/'ROTA'/
  24 :       DATA MODEPL / 'UX  ','UY  ','UZ  ','UR  ','UT  ' /
  25 :       DATA MODEDU / 'FX  ','FY  ','FZ  ','FR  ','FT  ' /
  26 :       DATA MOROTA / 'RX  ','RY  ','RZ  ','RT  ','RS  ' /
  27 :       DATA MORODU / 'MX  ','MY  ','MZ  ','MT  ','MS  ' /
  28 : 
  28 :       CALL LIROBJ('LISTMOTS',IP0,0,IRETOU)
  29 : 
  30 :       if (IP0.eq.0) then
  30 :          CALL LIRMOT(ITCORI,2,IMOT,0)
  31 :          if (imot.eq.0) then
  31 :           call erreur(5)
  32 :           return
  33 :          else if (imot.eq.1) then
  34 :           if (ifour.eq.2) then
  35 :            nosddl = 3 
  36 :            lesddl(1) = modepl(1)
  37 :            lesddl(2) = modepl(2)
  38 :            lesddl(3) = modepl(3)
  39 :           else
  40 :           endif
  40 :            CALL LIRMOT(ITCORI,2,IMOT,0)
  41 :            if (imot.eq.2) then
  42 :             if (ifour.eq.2) then
  43 :              nosddl = 6
  44 :              lesddl(4) = morota(1)
  45 :              lesddl(5) = morota(2)
  46 :              lesddl(6) = morota(3)
  47 :             else
  48 :             endif
  49 :            endif
  50 :          else
  50 :            CALL LIRMOT(ITCORI,2,IMOT,0)
  51 :            if (imot.eq.1) then
  52 :             if (ifour.eq.2) then
  53 :              nosddl = 6
  54 :              iddl = 3
  55 :             else
  56 :             endif
  57 :            else
  58 :             if (ifour.eq.2) then
  59 :              nosddl = 3
  60 :              iddl = 0
  61 :             else
  62 :             endif
  63 :             
  64 :            endif
  65 :            if (ifour.eq.2) then 
  66 :             lesddl(iddl + 1) = morota(1)
  67 :             lesddl(iddl + 2) = morota(2)
  68 :             lesddl(iddl + 3) = morota(3)
  69 :           else
  70 :           endif
  71 :         endif
  72 :       else
  73 :        mlmots = ip0
  74 :        segact mlmots
  75 :        jgn = mots(/2)
  76 :        do 11 imo = 1,jgn
  77 :         do jde =1,5
  78 :          if (mots(imo).eq.modepl(jde)) then
  79 :            lesddl(imo) = modepl(jde)
  80 :            lesdua(imo) = modedu(jde)
  81 :            goto 11
  82 :          endif
  83 :         enddo
  84 :         do jde = 1,5
  85 :          if (mots(imo).eq.morota(jde)) then
  86 :            lesddl(imo) = morota(jde)
  87 :            lesdua(imo) = morodu(jde)
  88 :            goto 11
  89 :          endif
  90 :         enddo
  91 : c le mot  n est pas un ddl 
  91 :         call erreur(5)
  92 :         return
  93 :  11    continue
  94 :        nosddl = jgn
  95 :       endif
  96 : 
  97 : 
  97 :       CALL LIROBJ('POINT',IP1,1,IRETOU)
  97 :       CALL LIROBJ('MAILLAGE',IP2,1,IRETOU)
  98 :       meleme = ip2
  99 :       segact meleme
  99 :       if (itypel.ne.1) call change(ip2,1)
 100 :       meleme = ip2
 101 :       segact meleme
 102 :       nbele1 = num(/2)
 103 :       ipt1 = ip2
 103 :       CALL LIROBJ('LISTREEL',IP3,0,IRETOU)
 104 :       if (iretou.eq.1) then
 105 :        mlreel = ip3      
 106 :        segact mlreel
 107 :        jg = prog(/1)
 108 :        if (jg.ne.nbele1) then
 109 : c autant de coef que de points
 109 :          call erreur(5)
 110 :          return
 111 :        endif
 112 :        som1 = prog(1)
 113 :        do j = 2,jg
 114 :          som1 = som1 + prog(j)
 115 :        enddo
 116 :        if (som1.eq.0.D0) then
 117 : c somme des coefs nulle
 117 :          call erreur(5)
 118 :          return
 119 :        endif 
 120 :       else
 121 :        jg = 1
 122 :       endif
 123 :       
 124 : 
 125 : * cree multiplicateur(s)
 126 :       NBPTI=XCOOR(/1)/(IDIM+1)
 127 :       NBPTS = NBPTI + nosddl
 128 :       segadj mcoord
 129 :       do j = 1,nosddl
 130 :        xcoor((nbpti - 1 + j)*(idim + 1) + 1) = 0.d0
 131 :        xcoor((nbpti - 1 + j)*(idim + 1) + 2) = 0.d0
 132 :        if (idim.eq.3) xcoor((nbpti - 1 + j)*(idim + 1) + 3) = 0.d0
 133 :        xcoor((nbpti + j)*(idim + 1)) = 0.d0
 134 :       enddo
 135 : 
 136 : * cree rigidite
 137 :       NRIGE = 6
 138 :       NRIGEL = nosddl
 139 :       segini mrigid
 140 :       ICHOLE=0
 141 :       IMGEO1=0
 142 :       IMGEO2=0
 143 :       ISUPEQ=0
 144 :       IFORIG=IFOMOD
 145 :       MTYMAT='RIGIDITE'
 146 : 
 147 :        NLIGRP=nbele1 + 2
 148 :        NLIGRD=nbele1 + 2
 149 :            nelrig=1
 150 :        segini xmatri
 151 : *       nelrig = 1
 152 : *       segini imatri
 153 : *       imattt(1) = xmatri
 154 :        re(1,1,1) = 0.d0
 155 :        if (jg.eq.1) then
 156 :          re(1,2,1) = 1.D0/nbele1
 157 :          re(2,1,1) = re(1,2,1)
 158 :          do l = 1, nbele1
 159 :           re(1,2 + l,1) = -1.D0
 160 :           re(2+l,1,1) = -1.D0
 161 :          enddo
 162 :        else
 163 :          re(1,2,1) = 1.D0/som1
 164 :          re(2,1,1) = re(1,2,1)
 165 :          do l = 1, nbele1
 166 :           re(1,2 + l,1) = -1.D0*prog(l)
 167 :           re(2+l,1,1) = re(1,2+l,1)
 168 :          enddo
 169 :        endif
 170 :        segdes xmatri
 171 : 
 172 :       do ir = 1,nosddl
 173 :         ipmu = NBPTI + ir
 174 :         nbnn = nbele1 + 2
 175 :         nbelem = 1
 176 :         nbsous = 0
 177 :         nbref = 0 
 178 :         segini meleme
 179 :         itypel = 22
 180 :         num(1,1) = ipmu
 181 :         num(2,1) = ip1
 182 :         segact ipt1
 183 :         do in = 1,nbele1
 184 :           num(2+in,1) = ipt1.num(1,in)
 185 :         enddo
 186 :         icolor(1) = idcoul
 187 :         segdes meleme
 188 : 
 189 :        SEGINI DESCR
 190 :        NOELEP(1)= 1
 191 :        NOELED(1)= 1
 192 :        LISINC(1)='LX'
 193 :        LISDUA(1)='FLX'
 194 :        do l = 1,nbele1+1
 195 :          LISINC(1 + l)=lesddl(ir)
 196 :          LISDUA(1 + l)=lesdua(ir)
 197 :          NOELEP(1+l)= 1 + l
 198 :          NOELED(1+l)= 1 + l
 199 :        enddo
 200 :        SEGDES DESCR
 201 : 
 202 :         coerig(ir) = 1.d0
 203 :         IRIGEL(2,ir) = 0
 204 :         IRIGEL(5,ir) = NIFOUR
 205 :         IRIGEL(6,ir) = 0
 206 :         IRIGEL(1,ir) = meleme
 207 :         IRIGEL(3,ir) = descr
 208 :         IRIGEL(4,ir) = xmatri
 209 : 
 210 : 
 211 :       enddo
 212 :       segdes mrigid
 213 : 
 213 :       CALL ECROBJ('RIGIDITE',mrigid)
 214 :       RETURN
 215 :       END
 216 :  
 217 :  

© Cast3M 2003 - All rights reserved.
Disclaimer