Télécharger melim.eso

Retour à la liste

Numérotation des lignes :

melim
  1. C MELIM SOURCE GOUNAND 25/04/30 21:15:20 12258
  2. SUBROUTINE MELIM(MATRIK,KCLIM,
  3. $ INCX,KS2B,
  4. $ KMORS,KISA,
  5. $ IMPR,IRET)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. IMPLICIT INTEGER (I-N)
  8. C***********************************************************************
  9. C NOM : MELIM
  10. C DESCRIPTION :
  11. C Ce SP s'occupe de prendre en compte les conditions
  12. C aux limites de type Dirichlet pour un système linéaire
  13. C du type Ax=b (avec A utilisant le stockage Morse.
  14. C On procède en trois étapes :
  15. C 1 - on surcharge le second membre (b)
  16. C et l'inconnue (x) avec le chpoint des conditions
  17. C aux limites
  18. C 2 - on s'occupe de la matrice Morse (A)
  19. C Aux degrés de libertés où il y a des
  20. C conditions aux limites : 1 sur la diagonale
  21. C 0 sur la ligne
  22. C 0 sur la colonne en reportant les
  23. C produits dans le second membre
  24. C (sinon perte de symétrie
  25. C éventuelle de A)
  26. C 3 - On nettoie la matrice morse A des 0 qu'on vient de lui
  27. C rajouter (sous-programme clmors).
  28. C
  29. C 2 et 3 peuvent sans doute etre regroupées au prix d'une
  30. C perte de lisibilité
  31. C
  32. C
  33. C LANGAGE : ESOPE
  34. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  35. C mél : gounand@semt2.smts.cea.fr
  36. C***********************************************************************
  37. C APPELES : KRIPAD, CLMORS
  38. C***********************************************************************
  39. C ENTREES : MATRIK, KCLIM, IMPR
  40. C ENTREES/SORTIES : KS2B, INCX
  41. C SORTIES : KMORS,KISA,IRET
  42. C CODE RETOUR (IRET) : 0 si ok
  43. C <0 si problème
  44. C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  45. C on pioche dedans les informations nécessaires
  46. C (différents pointeurs, nb. de ddl...)
  47. C KCLIM : pointeur sur segment MCHPOI de l'include SMCHPOI
  48. C chpoint contenant les conditions aux limites de
  49. C Dirichlet (valeur imposée).
  50. C IMPR : niveau d'impression
  51. C KS2B : pointeur sur segment IZA de l'include SMMATRIK
  52. C vecteur second membre
  53. C (ie b dans la résolution de Ax=b).
  54. C INCX : pointeur sur segment IZA de l'include SMMATRIK
  55. C vecteur des inconnues
  56. C (ie x dans la résolution de Ax=b).
  57. C KMORS : pointeurs sur segment PMORS et IZA de l'include
  58. C KISA SMMATRIK : profil et valeurs de la matrice morse
  59. C (ie A dans la résolution de Ax=b).
  60. C***********************************************************************
  61. C VERSION : v1, 20/12/99
  62. C HISTORIQUE : v1, 01/04/98, création
  63. C HISTORIQUE : 20/12/99,
  64. C Nouvelle signification de NUAN (renumérotation des ddl et non pas
  65. C des points)
  66. C HISTORIQUE : 05/01/00 : non-duplication de la matrice assemblée
  67. C HISTORIQUE : 09/04/04 : idmatp idmatd,
  68. C la cl dirichlet n'est plus forcément sur la
  69. C diagonale
  70. C HISTORIQUE :
  71. C***********************************************************************
  72. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  73. C en cas de modification de ce sous-programme afin de faciliter
  74. C la maintenance !
  75. C***********************************************************************
  76.  
  77. -INC PPARAM
  78. -INC CCOPTIO
  79. -INC SMELEME
  80. POINTEUR ISPGT.MELEME
  81. -INC SMLENTI
  82. POINTEUR DDLPD.MLENTI
  83. POINTEUR DDLDP.MLENTI
  84. *-INC SMLLOGI
  85. * SEGMENT MLLOGI
  86. * LOGICAL LOGI(JG)
  87. * ENDSEGMENT
  88. * INTEGER JG
  89. * POINTEUR DDLCL.MLLOGI
  90. -INC SMCHPOI
  91. POINTEUR KCLIM.MCHPOI
  92. POINTEUR KMORS.PMORS
  93. POINTEUR KISA.IZA
  94. POINTEUR AMORS.PMORS
  95. POINTEUR AISA.IZA
  96. POINTEUR KS2B.IZA
  97. POINTEUR INCX.IZA
  98. POINTEUR IDMATP.IDMAT
  99. POINTEUR IDMATD.IDMAT
  100. *
  101. INTEGER IMPR,IRET
  102. *
  103. * .. Variables locales
  104. * .. Parameters
  105. REAL*8 ZERO,ONE
  106. PARAMETER (ZERO=0.0D0, ONE=1.0D0)
  107. * ..
  108. CHARACTER*(LOCOMP) NOMINC
  109. LOGICAL FLINC
  110. LOGICAL FLDIA
  111. *
  112. INTEGER I1,IN,ISOUPO,INC,INBI,INBVA
  113. INTEGER N ,NSOUPO,NC ,NBI
  114. INTEGER ICOL,INTTT,JNTTT
  115. INTEGER NTTT
  116. REAL*8 TEMP
  117. LOGICAL LINCX
  118. C***
  119. LINCX=(INCX.NE.0)
  120. C On récupère les segments utiles
  121. IF (IMPR.GT.5) THEN
  122. WRITE(IOIMP,*) 'melim.eso : CL de Dirichlet'
  123. ENDIF
  124. SEGACT MATRIK
  125. MINC =KMINC
  126. ISPGT=KISPGT
  127. NTTT =KNTTT
  128. IDMATP=KIDMAT(1)
  129. IDMATD=KIDMAT(2)
  130. AMORS=KIDMAT(4)
  131. AISA =KIDMAT(5)
  132. SEGDES MATRIK
  133. C S'il n'y a pas de CL de Dirichlet, on n'a rien à faire
  134. IF(KCLIM.EQ.0) THEN
  135. SEGINI,KMORS=AMORS
  136. SEGINI,KISA=AISA
  137. ELSE
  138. C 1) On s'occupe du second membre et de l'inconnue
  139. C On parcourt le chpoint un peu comme dans ch2vec.eso
  140. C Les DDL ou on applique une condition de Dirichlet
  141. C ont un DDLCL(No DDL)=1 et 0 sinon
  142. IF (IMPR.GT.6) THEN
  143. WRITE(IOIMP,*)
  144. $ 'Dirichlet sur l''inconnue et le second membre'
  145. ENDIF
  146. JG=NTTT
  147. SEGINI DDLPD
  148. SEGINI DDLDP
  149. MCHPOI=KCLIM
  150. SEGACT MINC
  151. NBI=LISINC(/2)
  152. C In KRIPAD : SEGACT ISPGT
  153. C SEGINI MLENTI
  154. CALL KRIPAD(ISPGT,MLENTI)
  155. SEGDES ISPGT
  156. SEGACT IDMATP
  157. SEGACT IDMATD
  158. SEGACT MCHPOI
  159. NSOUPO=IPCHP(/1)
  160. DO 1 ISOUPO=1,NSOUPO
  161. MSOUPO=IPCHP(ISOUPO)
  162. SEGACT MSOUPO
  163. NC=NOCOMP(/2)
  164. MELEME=IGEOC
  165. MPOVAL=IPOVAL
  166. SEGACT MELEME
  167. SEGACT MPOVAL
  168. C NPTI=VPOCHA(/1)
  169. DO 11 INC=1,NC
  170. NOMINC=NOCOMP(INC)
  171. FLINC=.FALSE.
  172. C Repeat..until
  173. INBI=1
  174. 111 CONTINUE
  175. IF (NOMINC.EQ.LISINC(INBI)) THEN
  176. FLINC=.TRUE.
  177. ELSEIF (INBI.LT.NBI) THEN
  178. INBI=INBI+1
  179. GOTO 111
  180. ENDIF
  181. IF (.NOT.FLINC) THEN
  182. * WRITE(IOIMP,*) 'melim.eso : composante ',NOMINC
  183. * $ ,'unknown'
  184. WRITE(IOIMP,*) 'CLIM : component name ',NOMINC
  185. $ ,' not in the matrix'
  186. GOTO 9999
  187. ELSE
  188. N=VPOCHA(/1)
  189. DO 112 IN=1,N
  190. I1=LECT(NUM(1,IN))
  191. IF(I1.EQ.0)THEN
  192. * WRITE(IOIMP,*) 'melim.eso : le point ',IN
  193. * $ ,' du ch.'
  194. * WRITE(IOIMP,*) 'n''appartient pas au vec.'
  195. WRITE(IOIMP,*) 'CLIM : point number ',(num(1,IN)),
  196. $ ' unknown ',NOMINC,' not in the matrix'
  197. GOTO 9999
  198. ELSE
  199. IF (MPOS(I1,INBI).EQ.0) THEN
  200. WRITE(IOIMP,*) 'CLIM : point number ',(num(1,IN)),
  201. $ ' unknown ',NOMINC,' not in the matrix'
  202. GOTO 9999
  203. ELSE
  204. IDIAGP=IDMATP.NUAN(NPOS(I1)+MPOS(I1,INBI)-1)
  205. IDIAGD=IDMATD.NUAN(NPOS(I1)+MPOS(I1,INBI)-1)
  206. C* INBVA=NUAN(NPOS(I1)+MPOS(I1,INBI)-1)
  207. C INPT=NUAN(I1)
  208. C INBVA=NPOS(INPT)+MPOS(INPT,INBI)-1
  209. C KVEC.A(INBVA)=KVEC.A(INBVA)+VPOCHA(IN,INC)
  210. C Je préfère surcharger
  211. C
  212. * KS2B.A(INBVA)=VPOCHA(IN,INC)
  213. * IF (LINCX) INCX.A(INBVA)=VPOCHA(IN,INC)
  214. KS2B.A(IDIAGD)=VPOCHA(IN,INC)
  215. IF (LINCX) INCX.A(IDIAGP)=VPOCHA(IN,INC)
  216. DDLPD.LECT(IDIAGP)=IDIAGD
  217. DDLDP.LECT(IDIAGD)=IDIAGP
  218. * DDLCL.LOGI(INBVA)=.TRUE.
  219. ENDIF
  220. ENDIF
  221. 112 CONTINUE
  222. ENDIF
  223. 11 CONTINUE
  224. SEGDES MSOUPO
  225. SEGDES MELEME
  226. SEGDES MPOVAL
  227. 1 CONTINUE
  228. SEGDES MCHPOI
  229. SEGDES IDMATD
  230. SEGDES IDMATP
  231. SEGSUP MLENTI
  232. SEGDES MINC
  233. IF (IMPR.GT.7) THEN
  234. SEGPRT,KS2B
  235. IF (LINCX) SEGPRT,INCX
  236. ENDIF
  237. C 2) On s'occupe de la matrice :
  238. C pour les no de DDL ou on impose une CL dirichlet, il faut :
  239. C annuler la ligne correspondante sauf la diagonale qui vaut 1
  240. C reporter -colonne*clim sur le second membre
  241. C On parcourt donc toute la matrice
  242. IF (IMPR.GT.6) THEN
  243. WRITE(IOIMP,*) 'Dirichlet sur la matrice'
  244. ENDIF
  245. SEGINI,KMORS=AMORS
  246. SEGINI,KISA=AISA
  247. DO 2 INTTT=1,NTTT
  248. *! IF (DDLCL.LOGI(INTTT)) THEN
  249. IDIAGP=DDLDP.LECT(INTTT)
  250. IF (IDIAGP.NE.0) THEN
  251. C
  252. C CL de dirichlet pour la ligne INTTT :
  253. C On met 1 sur la diagonale et 0 ailleurs,
  254. C le second membre ne change pas
  255. C
  256. FLDIA=.FALSE.
  257. DO 21 ICOL=KMORS.IA(INTTT),(KMORS.IA(INTTT+1)-1)
  258. *! IF (KMORS.JA(ICOL).NE.INTTT) THEN
  259. IF (KMORS.JA(ICOL).NE.IDIAGP) THEN
  260. KISA.A(ICOL)=ZERO
  261. ELSE
  262. KISA.A(ICOL)=ONE
  263. FLDIA=.TRUE.
  264. ENDIF
  265. 21 CONTINUE
  266. IF (.NOT.FLDIA) THEN
  267. *! WRITE(IOIMP,*) 'melim.eso : diag.',INTTT,'inexistante'
  268. WRITE(IOIMP,*) 'melim.eso : diag.',IDIAGP,
  269. $ 'inexistante'
  270. GOTO 9999
  271. ENDIF
  272. ELSE
  273. C
  274. C Ligne INTTT sans condition de dirichlet :
  275. C On annule les termes des colonnes liées à une CL dirichlet,
  276. C et on reporte le produit colonne*CL au second membre
  277. C
  278. TEMP=ZERO
  279. DO 22 ICOL=KMORS.IA(INTTT),(KMORS.IA(INTTT+1)-1)
  280. JNTTT=KMORS.JA(ICOL)
  281. IDIAGD=DDLPD.LECT(JNTTT)
  282. *! IF (DDLCL.LOGI(JNTTT)) THEN
  283. IF (IDIAGD.NE.0) THEN
  284. *! IF (KS2B.A(JNTTT).NE.ZERO) THEN
  285. *! TEMP=TEMP+(KISA.A(ICOL)*KS2B.A(JNTTT))
  286. TEMP=TEMP+(KISA.A(ICOL)*KS2B.A(IDIAGD))
  287. *! ENDIF
  288. KISA.A(ICOL)=ZERO
  289. ENDIF
  290. 22 CONTINUE
  291. IF (TEMP.NE.ZERO) THEN
  292. KS2B.A(INTTT)=KS2B.A(INTTT)-TEMP
  293. ENDIF
  294. ENDIF
  295. 2 CONTINUE
  296. SEGSUP DDLPD
  297. SEGSUP DDLDP
  298. ENDIF
  299. *
  300. * Terminaison normale
  301. *
  302. IRET=0
  303. RETURN
  304. *
  305. * Format handling
  306. *
  307. 1002 FORMAT(10(1X,1PE11.4))
  308. *
  309. * Error handling
  310. *
  311. 9999 CONTINUE
  312. IRET=1
  313. WRITE(IOIMP,*) 'An error was detected in melim.eso'
  314. RETURN
  315. *
  316. * End of MELIM
  317. *
  318. END
  319.  
  320.  

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