Télécharger mucpri.eso

Retour à la liste

Numérotation des lignes :

mucpri
  1. C MUCPRI SOURCE PV090527 23/03/21 21:15:09 11610
  2. subroutine mucpri(mchpo1,mrigid,mchpoi)
  3. C
  4. C **** multiplication d'une matrice(mrigid) par un champoin (mchpo1)
  5. C **** le resultat est un champoin (mchpoi).
  6. C **** iret=ire2*ire1
  7. C **** le champpoint resultat a la meme dimension que la matrice.
  8. C
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11.  
  12. -INC PPARAM
  13. -INC CCOPTIO
  14. -INC SMELEME
  15. -INC SMCHPOI
  16. -INC SMRIGID
  17. -INC SMCOORD
  18. segment itrav1
  19. * liste des inconnues duales dans le champ etendu
  20. character*(LOCOMP) nocod(nctod)
  21. integer ifod(nctod)
  22. endsegment
  23. segment itrav2
  24. * position des comps du chpo cree dans le nocod, nb pts par paquet du chpo
  25. integer liscomp(nctod,nsoupo),nbp(nsoupo)
  26. endsegment
  27. segment itrav4
  28. * champ dual etendu
  29. real*8 ivald(nctod,nbpts)
  30. endsegment
  31. character*4 cnoha
  32. integer*4 inoha
  33. equivalence(cnoha,inoha)
  34. data cnoha/'NOHA'/
  35. *
  36. * constitution de la liste des composantes duales
  37. *
  38. segact mrigid
  39. if (imgeo2.ne.0) goto 1000
  40. * creation d'un champoin prototype
  41. * attention les mpoval ne sont pas crees
  42. segact mrigid*mod
  43. nrigel=irigel(/2)
  44. nctod=0
  45. do 27 irige=1,nrigel
  46. descr=irigel(3,irige)
  47. segact descr
  48. nctod=nctod+lisdua(/2)
  49. 27 continue
  50. segini itrav1
  51. nctod=0
  52. do 30 irige=1,nrigel
  53. descr=irigel(3,irige)
  54. do 32 i=1,lisdua(/2)
  55. do 33 j=1,nctod
  56. if (ifod(j).ne.irigel(5,irige)) goto 33
  57. if (nocod(j).eq.lisdua(i)) goto 31
  58. 33 continue
  59. nctod=nctod+1
  60. nocod(nctod)=lisdua(i)
  61. ifod(nctod)=irigel(5,irige)
  62. 31 continue
  63. 32 continue
  64. 30 continue
  65. *
  66. * expansion du chpo dual de la rigidite
  67. *
  68. segini itrav4
  69. do 40 irige=1,nrigel
  70. descr=irigel(3,irige)
  71. ipt2=irigel(1,irige)
  72. segact ipt2
  73. do 45 ic=1,lisdua(/2)
  74. do 47 ir=1,nctod
  75. if (ifod(ir).ne.irigel(5,irige)) goto 47
  76. if (nocod(ir).eq.lisdua(ic)) goto 50
  77. 47 continue
  78. goto 45
  79. 50 continue
  80. if (irigel(5,irige).eq.inoha) then
  81. ivava=2**17+2**16
  82. else
  83. ivava=2**17+ifod(ir)
  84. endif
  85. do 55 iel=1,ipt2.num(/2)
  86. ivald(ir,ipt2.num(noeled(ic),iel))=ivava
  87. 55 continue
  88. 45 continue
  89. 40 continue
  90. *
  91. *
  92. * creation du champoin resultant (sans les valeurs)
  93. *
  94. nat=1
  95. nsoupo=10
  96. nsoupr=0
  97. segini mchpoi,itrav2
  98. segact mchpo1
  99. * jattri(1) = (mchpo1.jattri(1) * 4 )/ 2
  100. * par defaut les chpts issus d'un produit seront discrets ! PV
  101. jattri(1) = 2
  102. mochde='créé par mucpri'
  103. mtypoi=' '
  104. * Le(s) chpoint(s) resultat(s) ont IFOPOI = IOFRIG
  105. *OLD ifopoi = mchpo1.ifopoi
  106. ifopoi = iforig
  107. if (iforig .ne. mchpo1.ifopoi) then
  108. interr(1)=mchpo1.ifopoi
  109. interr(2)=iforig
  110. interr(3)=ifour
  111. c-dbg write(ioimp,*) '1132 mucpri',mchpo1,mrigid
  112. call erreur(1132)
  113. ifopoi = ifour
  114. end if
  115. * on sauve de suite dans la raideur le prototype
  116. imgeo2=mchpoi
  117. *
  118. do 100 i=1,nbpts
  119. do 110 ir=1,nctod
  120. if (ivald(ir,i).ne.0) goto 120
  121. 110 continue
  122. goto 100
  123. 120 continue
  124. * point a garder test liste des composantes
  125. do 130 isoupo=nsoupr,1,-1
  126. msoupo=ipchp(isoupo)
  127. * regarder si meme composantes et harmonique que isoupo
  128. do 140 ic=1,nocomp(/2)
  129. if (ivald(liscomp(ic,isoupo),i).ne.2**17+noharm(ic)) goto 130
  130. 140 continue
  131. * verifier pas d'autres composantes
  132. indtot=0
  133. do 145 ir=1,nctod
  134. if (ivald(ir,i).ne.0) indtot=indtot+1
  135. 145 continue
  136. if (indtot.ne.nocomp(/2)) goto 130
  137. * ok on ajoute le pt dans sa liste
  138. nbp(isoupo)=nbp(isoupo)+1
  139. meleme=igeoc
  140. num(1,nbp(isoupo))=i
  141. goto 100
  142. 130 continue
  143. * creation d'un nouveau paquet
  144. 150 continue
  145. nsoupr=nsoupr+1
  146. if (nsoupr.gt.nsoupo) then
  147. nsoupo=nsoupr+10
  148. segadj mchpoi,itrav2
  149. endif
  150. nc=0
  151. do 160 ir=1,nctod
  152. if (ivald(ir,i).eq.0) goto 160
  153. nc=nc+1
  154. liscomp(nc,nsoupr)=ir
  155. 160 continue
  156. segini msoupo
  157. ipchp(nsoupr)=msoupo
  158. do 165 ic=1,nc
  159. nocomp(ic)=nocod(liscomp(ic,nsoupr))
  160. noharm(ic)=ifod(liscomp(ic,nsoupr))
  161. 165 continue
  162. nbelem=nbpts
  163. nbnn=1
  164. nbsous=0
  165. nbref=0
  166. segini meleme
  167. itypel=1
  168. igeoc=meleme
  169. num(1,1)=i
  170. nbp(nsoupr)=1
  171. goto 100
  172. 100 continue
  173. do 170 isoup=1,nsoupr
  174. msoupo=ipchp(isoup)
  175. meleme=igeoc
  176. nbelem=nbp(isoup)
  177. if(meleme.ne.num(/2)) then
  178. nbnn=1
  179. nbsous=0
  180. nbref=0
  181. segini ipt1
  182. ipt1.itypel=itypel
  183. do i=1,nbelem
  184. ipt1.num(1,i)=num(1,i)
  185. enddo
  186. segsup meleme
  187. meleme=ipt1
  188. endif
  189. * si possible ne pas creer de nouveau meleme
  190. call crech1(meleme,1)
  191. igeoc=meleme
  192. 170 continue
  193. segsup itrav1,itrav2,itrav4
  194. nsoupo=nsoupr
  195. segadj mchpoi
  196. 1000 continue
  197. call mucpr1(mchpo1,mrigid,mchpoi)
  198. return
  199. end
  200.  
  201.  
  202.  
  203.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales