Télécharger modope.eso

Retour à la liste

Numérotation des lignes :

modope
  1. C MODOPE SOURCE JK148537 26/10/19 21:15:12 12674
  2. *=======================================================================
  3. *= SOUS-PROGRAMME PERMETTANT D'ADAPTER UN MMODEL A L'OPERATEUR =
  4. *= pour rigi / bsigma / epsi / comp =
  5. *= =
  6. *= =
  7. *= PAS DE PRECONDITIONNEMENT ICI, MERCI !! =
  8. *= =
  9. *= IPMOD0 MMODEL initial complet =
  10. *= IPMOD1 MMODEL "deroule" contenant, de maniere unitaire, les sous- =
  11. *= modeles de formulation 'MECANIQUE', 'LIQUIDE' et 'POREUX' =
  12. *= vaut 0 en cas d'ERREUR (MMODEL "deroule" vide) =
  13. *= IPMAI1 MAILLAGE "deroule" contenant, pour chaque sous-modele de =
  14. *= IPMOD1, le maillage support (type 28) si le mode de calcul =
  15. *= est de type DPGE (2D/1D) =
  16. *= vaut 0 si non utile/defini =
  17. *= INIVE = 0 sans 'MELANGE' avec sous-modeles encapsules =
  18. *= = 1 avec 'MELANGE' et sous-modeles encapsules sauf 'PARALLELE'=
  19. *= = 2 avec 'MELANGE' et sous-modeles encapsules si 'PARALLELE' =
  20. *= = 3 avec formulation CHARGEMENT =
  21. *= =
  22. *= INIVE = 6 met en ordre pour COMP =
  23. *= Nota : - IPMOD0 / IPMOD1 est ACTIF en entree / sortie. =
  24. *=======================================================================
  25.  
  26. SUBROUTINE MODOPE (IPMOD0,IPMOD1,IRET,INIVE)
  27.  
  28. IMPLICIT INTEGER (I-N)
  29. IMPLICIT REAL*8 (A-H,O-Z)
  30.  
  31. -INC PPARAM
  32. -INC CCOPTIO
  33.  
  34. -INC SMMODEL
  35. POINTEUR mmode3.mmodel
  36. -INC SMELEME
  37. POINTEUR ipt0.meleme
  38.  
  39. CHARACTER*(16) moforg
  40.  
  41. mmodel = IPMOD0
  42. cc segact,mmodel*nomod
  43. NSOUS = mmodel.kmodel(/1)
  44. if (NSOUS.EQ.0) then
  45. IPMOD1 = IPMOD0
  46. return
  47. endif
  48.  
  49. segini,mmode1=mmodel
  50.  
  51. N1 = NSOUS
  52. segini mmode3
  53. k3 = 0
  54.  
  55. if (inive.lt.4.or.inive.eq.6) goto 100
  56.  
  57. DO is = 1, NSOUS
  58. imodel = mmode1.kmodel(is)
  59.  
  60. if ((cmatee.eq.'MODAL'.or.cmatee.eq.'STATIQUE')
  61. &.and.(inive.eq.4.or.inive.eq.5)) then
  62. do im =1,matmod(/2)
  63. if (matmod(im)(1:12).eq.'COMP_ASSO') then
  64. do jv = 1,ivamod(/1)
  65. if (TYMODE(jv).eq.'MMODEL ') then
  66. icomp = jv
  67. endif
  68. enddo
  69. endif
  70. enddo
  71. if (icomp.gt.0) then
  72. mmode2 = ivamod(icomp)
  73. n1 = n1 + mmode2.kmodel(/1)
  74. segadj mmode3
  75. do kr = 1,mmode2.kmodel(/1)
  76. k3 = k3 + 1
  77. mmode3.kmodel(k3) = mmode2.kmodel(kr)
  78. enddo
  79. if (inive.eq.4) mmode1.kmodel(is) = 0
  80. endif
  81.  
  82. endif
  83.  
  84. ENDDO
  85.  
  86. if (k3.eq.0) then
  87. ipmod1 = ipmod0
  88. segsup mmode1,mmode3
  89. return
  90. endif
  91.  
  92. * test non redondance
  93. DO is = 1,k3-1
  94. DO js = is+1,k3
  95. if (mmode3.kmodel(is).eq.mmode3.kmodel(js))
  96. & mmode3.kmodel(js) = 0
  97. ENDDO
  98. ENDDO
  99.  
  100. n1 = nsous + k3
  101. segini mmode2
  102. k2 = 0
  103.  
  104. if (inive.eq.4) then
  105. do js = 1,nsous
  106. if (mmode1.kmodel(js).gt.0) then
  107. k2 = k2 + 1
  108. mmode2.kmodel(k2) = mmode1.kmodel(js)
  109. endif
  110. enddo
  111. endif
  112.  
  113. if (inive.eq.5) then
  114. do js = 1,nsous
  115. do kr = 1,k3
  116. if (mmode1.kmodel(js).eq.mmode3.kmodel(kr))
  117. & mmode1.kmodel(js) = 0
  118. enddo
  119. if (mmode1.kmodel(js).gt.0) then
  120. k2 = k2 + 1
  121. mmode2.kmodel(k2) = mmode1.kmodel(js)
  122. endif
  123. enddo
  124. endif
  125.  
  126. do j3 = 1,k3
  127. if (mmode3.kmodel(j3).gt.0) then
  128. k2 = k2 + 1
  129. mmode2.kmodel(k2) = mmode3.kmodel(j3)
  130. endif
  131. enddo
  132.  
  133. n1 = k2
  134. segadj mmode2
  135. segsup mmode1,mmode3
  136. ipmod1 = mmode2
  137.  
  138. RETURN
  139.  
  140. 100 CONTINUE
  141. c inive 0-3 / 6
  142. NMOMEL = 0
  143. DO is = 1, NSOUS
  144. imodel = mmode1.kmodel(is)
  145. if (cmatee.eq.'ADVECTIO') goto 50
  146.  
  147. moforg = imodel.FORMOD(1)(1:16)
  148. IF (moforg.EQ.'MECANIQUE ' .OR.
  149. & moforg.EQ.'CONTRAINTE ' .OR.
  150. & moforg.EQ.'POREUX ' .OR.
  151. & moforg.EQ.'ELECTROSTATIQUE ' .OR.
  152. & moforg.EQ.'DIFFUSION ' .OR.
  153. & moforg.EQ.'METALLURGIE ' .OR.
  154. & moforg.EQ.'LIQUIDE ' ) THEN
  155.  
  156.  
  157. k3 = k3 + 1
  158. mmode3.kmodel(k3) = imodel
  159.  
  160. ELSE IF (moforg.eq.'LIAISON '.and.inive.eq.6) then
  161. k3 = k3 + 1
  162. mmode3.kmodel(k3) = imodel
  163. ELSE IF (moforg.eq.'CHARGEMENT'.and.
  164. &imodel.matmod(1).eq.'PRESSION'.and.inive.eq.3) then
  165. k3 = k3 + 1
  166. mmode3.kmodel(k3) = imodel
  167. ELSE IF (moforg.EQ.'NAVIER_STOKES ') THEN
  168. IF (imodel.MATMOD(1).EQ.'NLIN') THEN
  169. k3 = k3 + 1
  170. mmode3.kmodel(k3) = imodel
  171. ENDIF
  172. ELSE IF (moforg.EQ.'MELANGE ') THEN
  173. NMOMEL = NMOMEL + 1
  174. IF (imodel.MATMOD(1).NE.'SERIE') THEN
  175. IF (INIVE.ge.1.or.INIVE.le.3) THEN
  176. k3 = k3 + 1
  177. mmode3.kmodel(k3) = imodel
  178. ENDIF
  179. IF (IVAMOD(/1).GE.1) THEN
  180. n1 = n1 + ivamod(/1)
  181. segadj mmode3
  182. DO j = 1,IVAMOD(/1)
  183. IF (TYMODE(j).EQ.'IMODEL ') THEN
  184. IMODE1 = IVAMOD(j)
  185. SEGACT,IMODE1
  186. IF (IMODE1.FORMOD(1)(1:10).EQ.'MECANIQUE ' .OR.
  187. & IMODE1.FORMOD(1)(1:10).EQ.'POREUX ' .OR.
  188. & IMODE1.FORMOD(1)(1:10).EQ.'LIQUIDE ' ) THEN
  189. if (CMATEE.NE.'PARALLEL'.or.inive.eq.6) then
  190. k3 = k3 + 1
  191. mmode3.kmodel(k3) = imode1
  192. else
  193. if (inive.eq.0.or.inive.eq.1.or.inive.eq.3) then
  194. k3 = k3 + 1
  195. mmode3.kmodel(k3) = imode1
  196. endif
  197. endif
  198. ELSE
  199. C SEGDES,IMODE1
  200. ENDIF
  201. ENDIF
  202. ENDDO
  203. ENDIF
  204. ENDIF
  205. c ELSE IF (moforg.EQ.'................') THEN
  206. ENDIF
  207. 50 CONTINUE
  208. ENDDO
  209.  
  210. n1 = k3
  211. segadj mmode3
  212.  
  213. IF (N1.EQ.NSOUS .AND. NMOMEL.EQ.0) THEN
  214. c modele initial
  215. ipmod1 = ipmod0
  216. if (iimpi0.eq.1972) then
  217. write(ioimp,*) 'Preconditionnement PIMODL IPMOD0 = IPMOD1'
  218. endif
  219. segsup mmode1,mmode3
  220. RETURN
  221. C- Moedele deroule plus petit et/ou incluant des sous-modeles
  222. ELSE
  223.  
  224. IF (k3.LE.0) THEN
  225. CALL ERREUR(-182)
  226. segsup mmode1,mmode3
  227. RETURN
  228. ENDIF
  229. * Test de non redondance si presence de sous-modeles MELANGE :
  230. IF (NMOMEL .GT. 0) THEN
  231. N1 = 1
  232. DO is = k3, 2, -1
  233. imode1 = mmode3.kmodel(is)
  234. DO js = (is-1),1,-1
  235. imode2 = mmode3.kmodel(js)
  236. IF (imode1.eq.imode2) THEN
  237. mmode3.kmodel(is) = 0
  238. GOTO 10
  239. ELSE IF (imode1.IMAMOD.EQ.imode2.IMAMOD .AND.
  240. & imode1.CONMOD.EQ.imode2.CONMOD) THEN
  241. mmode3.kmodel(is) = 0
  242. GOTO 10
  243. ENDIF
  244. ENDDO
  245. N1 = N1 + 1
  246. 10 CONTINUE
  247. ENDDO
  248. ENDIF
  249. * Creation du MMODEL deroule :
  250. segsup mmode1
  251. SEGINI,mmode1
  252. is = 0
  253. DO js = 1, k3
  254. IF (mmode3.kmodel(js).GT.0) THEN
  255. is = is + 1
  256. mmode1.kmodel(is) = mmode3.kmodel(js)
  257. ENDIF
  258. ENDDO
  259. SEGACT,mmode1*NOMOD
  260. if (is.ne.N1) then
  261. write(ioimp,*) 'PIMODL : N1 != is !',is,N1
  262. call erreur(22)
  263. return
  264. endif
  265. ENDIF
  266.  
  267. segsup mmode3
  268. ipmod1 = mmode1
  269.  
  270. if (inive.lt.6) RETURN
  271.  
  272. 200 continue
  273. if (NMOMEL.eq.0) return
  274. C CREATION DU MMODEL DE TRAVAIL (les sous-modeles de formulation
  275. C melange sont mis a la fin pour qu'ils soient traites en dernier
  276. C car ils dependent des resultats des autres sous-modeles)
  277. SEGINI,MMODEL
  278. IT1 = 0
  279. IT2 = N1 - NMOMEL
  280. DO IM = 1, N1
  281. IMODEL = mmode1.kmodel(im)
  282. IF (IMODEL.GT.0) THEN
  283. IF (FORMOD(1)(1:8).NE.'MELANGE ') THEN
  284. IT1 = IT1 + 1
  285. KMODEL(IT1) = IMODEL
  286. ELSE
  287. IT2 = IT2 + 1
  288. KMODEL(IT2) = IMODEL
  289. ENDIF
  290. ENDIF
  291. ENDDO
  292. segsup mmode1
  293. IPMOD1 = MMODEL
  294.  
  295. RETURN
  296.  
  297.  
  298. END
  299.  
  300.  
  301.  

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