Télécharger pimodl.eso

Retour à la liste

Numérotation des lignes :

pimodl
  1. C PIMODL SOURCE JK148537 25/12/12 21:15:08 12418
  2.  
  3. *=======================================================================
  4. *= SOUS-PROGRAMME PERMETTANT DE DEROULER UN MMODEL =
  5. *= (UTILE SURTOUT EN CAS DE MODELE MELANGE) =
  6. *= =
  7. *= IPMOD0 MMODEL initial complet =
  8. *= IPMOD1 MMODEL "deroule" contenant, de maniere unitaire, les sous- =
  9. *= modeles de formulation 'MECANIQUE', 'LIQUIDE' et 'POREUX' =
  10. *= vaut 0 en cas d'ERREUR (MMODEL "deroule" vide) =
  11. *= IPMAI1 MAILLAGE "deroule" contenant, pour chaque sous-modele de =
  12. *= IPMOD1, le maillage support (type 28) si le mode de calcul =
  13. *= est de type DPGE (2D/1D) =
  14. *= vaut 0 si non utile/defini =
  15. *= INIVE = 0 sans 'MELANGE' avec sous-modeles encapsules =
  16. *= = 1 avec 'MELANGE' et sous-modeles encapsules sauf 'PARALLELE'=
  17. *= = 2 avec 'MELANGE' et sous-modeles encapsules si 'PARALLELE' =
  18. *= Nota : - IPMOD0 / IPMOD1 est ACTIF en entree / sortie. =
  19. *= - Tous les sous-modeles de IPMOD1 sont ACTIFs en sortie ! =
  20. *=======================================================================
  21.  
  22. SUBROUTINE PIMODL (IPMOD0,IPMOD1,IPMAI1,INIVE)
  23.  
  24. IMPLICIT INTEGER (I-N)
  25. IMPLICIT REAL*8 (A-H,O-Z)
  26.  
  27. -INC PPARAM
  28. -INC CCOPTIO
  29. -INC CCPRECO
  30.  
  31. -INC SMMODEL
  32. -INC SMELEME
  33. POINTEUR ipt0.meleme
  34.  
  35. SEGMENT limodl(0)
  36.  
  37. CHARACTER*(16) moforg
  38. LOGICAL lDPGE
  39.  
  40. IPMOD1 = 0
  41. IPMAI1 = 0
  42.  
  43. iimpi0 = IIMPI
  44. c*dbg iimpi0 = 1972
  45.  
  46. mmodel = IPMOD0
  47. c* segact,mmodel*nomod <- Actif en E/S
  48.  
  49. C PRECOnditionnment "CMODPG" des MODELES mecaniques en mode DPGE (2D/1D)
  50. C ======================================================================
  51. C Recherche si le modele IPMOD0 n'a pas deja ete traite :
  52. C Verification si presence dans le preconditionnement CCPRECO / "CMODPG"
  53. ith = oothrd
  54. ith1 = ith + 1
  55.  
  56. CALL OOOHO1(mmodel,ihorot)
  57. ITAILL = NBMODP(ith1)
  58. DO is = 1, ITAILL
  59. IF ( PMODPE(is,ith1) .EQ. mmodel .AND.
  60. & PMODPH(is,ith1) .EQ. ihorot ) THEN
  61. mmode1 = PMODPS(is,ith1)
  62. meleme = PMADPS(is,ith1)
  63. if (iimpi0.eq.1972) then
  64. write(ioimp,*) 'Preconditionnement PIMODL trouve',
  65. & mmodel,mmode1,meleme,is
  66. endif
  67. C Mise a jour du preconditionnement dans CCPRECO : Deplacement en position 1
  68. IF (is .GT. 1) THEN
  69. DO js = is, 2, -1
  70. PMODPE(js,ith1) = PMODPE(js - 1,ith1)
  71. PMODPH(js,ith1) = PMODPH(js - 1,ith1)
  72. PMODPS(js,ith1) = PMODPS(js - 1,ith1)
  73. PMADPS(js,ith1) = PMADPS(js - 1,ith1)
  74. ENDDO
  75. PMODPE(1,ith1) = mmodel
  76. PMODPH(1,ith1) = ihorot
  77. PMODPS(1,ith1) = mmode1
  78. PMADPS(1,ith1) = meleme
  79. ENDIF
  80. IF (mmode1.NE.0 .AND. mmode1.NE.mmodel)
  81. & CALL ACTOBJ('MMODEL ',mmode1,1)
  82. IF (meleme.NE.0) CALL ACTOBJ('MAILLAGE',meleme,1)
  83. IPMOD1 = mmode1
  84. IPMAI1 = meleme
  85. if (iimpi0.eq.1972)
  86. & write(ioimp,*) 'PIMODL : IPMOD1 avec NSOU1 =',
  87. & mmode1.kmodel(/1)
  88. GOTO 100
  89. ENDIF
  90. ENDDO
  91.  
  92. C On deroule le MODELE des MODELES mecaniques en mode DPGE (2D/1D)
  93. C ======================================================================
  94. * On met dans le segment limodl tous les sous-modeles utiles.
  95. NSOUS = mmodel.kmodel(/1)
  96.  
  97. N1 = 0
  98. N1SM = 0
  99.  
  100. SEGINI,limodl
  101.  
  102. DO is = 1, NSOUS
  103. imodel = mmodel.kmodel(is)
  104. c* segact imodel
  105.  
  106. moforg = imodel.FORMOD(1)(1:16)
  107. if (cmatee.eq.'ADVECTIO') goto 50
  108. IF (moforg.EQ.'MECANIQUE ' .OR.
  109. & moforg.EQ.'CONTRAINTE ' .OR.
  110. & moforg.EQ.'POREUX ' .OR.
  111. & moforg.EQ.'ELECTROSTATIQUE ' .OR.
  112. & moforg.EQ.'DIFFUSION ' .OR.
  113. & moforg.EQ.'LIQUIDE ' ) THEN
  114. N1 = N1 + 1
  115. limodl(**) = imodel
  116. ELSE IF (moforg.EQ.'NAVIER_STOKES ') THEN
  117. IF (imodel.MATMOD(1).EQ.'NLIN') THEN
  118. N1 = N1 + 1
  119. limodl(**) = IMODEL
  120. ENDIF
  121. ELSE IF (moforg.EQ.'MELANGE ') THEN
  122. IF (imodel.MATMOD(1).NE.'SERIE') THEN
  123. IF (INIVE.ge.1) THEN
  124. limodl(**) = IMODEL
  125. N1 = N1 + 1
  126. ENDIF
  127. IF (IVAMOD(/1).GE.1) THEN
  128. DO j = 1,IVAMOD(/1)
  129. IF (TYMODE(j).EQ.'IMODEL ') THEN
  130. IMODE1 = IVAMOD(j)
  131. SEGACT,IMODE1
  132. IF (IMODE1.FORMOD(1)(1:10).EQ.'MECANIQUE ' .OR.
  133. & IMODE1.FORMOD(1)(1:10).EQ.'POREUX ' .OR.
  134. & IMODE1.FORMOD(1)(1:10).EQ.'LIQUIDE ' ) THEN
  135. if (CMATEE.NE.'PARALLEL') then
  136. limodl(**) = IMODE1
  137. N1SM = N1SM + 1
  138. else
  139. if (inive.ne.2) then
  140. limodl(**) = IMODE1
  141. N1SM = N1SM + 1
  142. endif
  143. endif
  144. ELSE
  145. C SEGDES,IMODE1
  146. ENDIF
  147. ENDIF
  148. ENDDO
  149. ENDIF
  150. ENDIF
  151. c ELSE IF (moforg.EQ.'................') THEN
  152. ENDIF
  153. 50 CONTINUE
  154. ENDDO
  155.  
  156. C- Le modele deroule contenu dans limodl correspond au modele de depart :
  157. C--------------------
  158. IF (N1.EQ.NSOUS .AND. N1SM.EQ.0) THEN
  159. mmode1 = mmodel
  160. if (iimpi0.eq.1972) then
  161. write(ioimp,*) 'Preconditionnement PIMODL IPMOD0 = IPMOD1'
  162. endif
  163.  
  164. C- Moedele deroule plus petit et/ou incluant des sous-modeles
  165. ELSE
  166. C- Test sur le nombre de sous-modeles de limodl qui doit etre non nul !
  167. NSOUS = limodl(/1)
  168. IF (NSOUS.LE.0) THEN
  169. CALL ERREUR(-182)
  170. GOTO 99
  171. ENDIF
  172. * Test de non redondance si presence de sous-modeles MELANGE :
  173. N1 = NSOUS
  174. IF (N1SM .NE. 0) THEN
  175. N1 = 1
  176. DO is = NSOUS, 2, -1
  177. imode1 = limodl(is)
  178. DO js = (is-1),1,-1
  179. imode2 = limodl(js)
  180. IF (imode1.eq.imode2) THEN
  181. limodl(is) = 0
  182. GOTO 10
  183. ELSE IF (imode1.IMAMOD.EQ.imode2.IMAMOD .AND.
  184. & imode1.CONMOD.EQ.imode2.CONMOD) THEN
  185. limodl(is) = 0
  186. GOTO 10
  187. ENDIF
  188. ENDDO
  189. N1 = N1 + 1
  190. 10 CONTINUE
  191. ENDDO
  192. ENDIF
  193. * Creation du MMODEL deroule :
  194. is = 0
  195. SEGINI,mmode1
  196. DO js = 1, NSOUS
  197. IF (limodl(js).GT.0) THEN
  198. is = is + 1
  199. mmode1.kmodel(is) = limodl(js)
  200. ENDIF
  201. ENDDO
  202. SEGACT,mmode1*NOMOD
  203. if (is.ne.N1) then
  204. write(ioimp,*) 'PIMODL : N1 != is !',is,N1
  205. endif
  206. ENDIF
  207.  
  208. NSOU1 = mmode1.kmodel(/1)
  209. if (iimpi0.eq.1972)
  210. & write(ioimp,*) 'PIMODL : IPMOD1 avec NSOU1 =',NSOU1
  211. IF (NSOU1.LE.0) THEN
  212. write(ioimp,*) 'PIMODL : IPMOD1 vide - NSOU1 = 0'
  213. CALL ERREUR(-182)
  214. GOTO 99
  215. ENDIF
  216.  
  217. ipt1 = 0
  218.  
  219. C- Test si le mode de calcul courant est "DPGE"
  220. mfr = 1
  221. CALL INFDPG(mfr,IFOUR,lDPGE,ndpge)
  222. IF (lDPGE) THEN
  223. NBNN = 0
  224. NBELEM = 0
  225. NBREF = 0
  226. NBSOUS = 0
  227. SEGINI,ipt0
  228. SEGACT,ipt0*NOMOD
  229.  
  230. NBSOUS = NSOU1
  231. SEGINI,ipt1
  232.  
  233. N1 = 0
  234. DO is = 1, NSOU1
  235. imodel = mmode1.kmodel(is)
  236. mfr = imodel.INFELE(13)
  237. CALL INFDPG(mfr,IFOUR,lDPGE,ndpge)
  238. IF (lDPGE) THEN
  239. IIPDPG = imodel.IPDPGE
  240. IIPDPG = IPTPOI(IIPDPG)
  241. IF (IIPDPG.LE.0) THEN
  242. CALL ERREUR(925)
  243. CALL ERREUR(5)
  244. GOTO 99
  245. ENDIF
  246. ipt3 = imodel.imamod
  247. NBNN3 = ipt3.NUM(/1)
  248. NBNN = NBNN3+1
  249. NBELEM = ipt3.NUM(/2)
  250. NBREF = 0
  251. NBSOUS = 0
  252. SEGINI,meleme
  253. meleme.ITYPEL=28
  254. DO i = 1, NBELEM
  255. DO j = 1, NBNN3
  256. meleme.NUM(j,i) = ipt3.NUM(j,i)
  257. ENDDO
  258. meleme.NUM(NBNN,i) = IIPDPG
  259. meleme.ICOLOR(i) = ipt3.ICOLOR(i)
  260. ENDDO
  261. SEGACT,meleme*NOMOD
  262. N1 = N1 + 1
  263. ELSE
  264. meleme = ipt0
  265. ENDIF
  266. ipt1.lisous(is) = meleme
  267. ENDDO
  268. SEGACT,ipt1*NOMOD
  269. IF (N1.EQ.0) THEN
  270. segsup,ipt1,ipt0
  271. ipt1 = 0
  272. ENDIF
  273.  
  274. ENDIF
  275.  
  276. IPMOD1 = mmode1
  277. IPMAI1 = ipt1
  278.  
  279. C Mise a jour du preconditionnement CCPRECO / "CMODPG"
  280. C Si N1SM non nul et INIVE different de 1, pas de preco ... En attendant mieux !
  281. if (N1SM.NE.0 .AND. INIVE.NE.1) then
  282. if (iimpi0.eq.1972)
  283. & write(ioimp,*) 'PIMODL : Preconditionnement non retenu ',
  284. & NSOU1,N1SM,INIVE
  285. goto 99
  286. endif
  287.  
  288. ITAILL = MIN(ITAILL + 1, NPMDPG)
  289. NBMODP(ith1) = ITAILL
  290. DO is = ITAILL, 2, -1
  291. PMODPE(is,ith1) = PMODPE(is - 1,ith1)
  292. PMODPH(is,ith1) = PMODPH(is - 1,ith1)
  293. PMODPS(is,ith1) = PMODPS(is - 1,ith1)
  294. PMADPS(is,ith1) = PMADPS(is - 1,ith1)
  295. ENDDO
  296. PMODPE(1,ith1) = mmodel
  297. PMODPH(1,ith1) = ihorot
  298. PMODPS(1,ith1) = mmode1
  299. PMADPS(1,ith1) = ipt1
  300. if (iimpi0.eq.1973) then
  301. write(ioimp,*) 'PIMODL : Preconditionnement realise',
  302. & mmodel,mmode1,ipt1,itaill
  303. endif
  304.  
  305. C Sortie du sous-programme (menage...)
  306. 99 CONTINUE
  307. SEGSUP,limodl
  308. 100 CONTINUE
  309.  
  310. c RETURN
  311. END
  312.  
  313.  
  314.  
  315.  
  316.  

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