Télécharger manuch.eso

Retour à la liste

Numérotation des lignes :

manuch
  1. C MANUCH SOURCE FANDEUR 22/01/03 21:15:28 11136
  2. SUBROUTINE MANUCH
  3. ************************************************************************
  4. * NOM : MANUCH
  5. * DESCRIPTION : Cree et initialise un objet de type CHPOINT
  6. ************************************************************************
  7. * SYNTAXE (GIBIANE) :
  8. *
  9. * CHPO1 = MANU 'CHPO' GEO1 | LMOT1 LREE1 |
  10. * | |
  11. * |(ENTI1) MOT1 VAL1 MOT2 VAL2 |
  12. * | --------- --------- |
  13. * | |___________| |
  14. * | ENTI1 fois |
  15. * ('TITRE' MOT3)
  16. * ('NATURE' MOT4) ;
  17. *
  18. ************************************************************************
  19. IMPLICIT INTEGER(I-N)
  20.  
  21. -INC PPARAM
  22. -INC CCOPTIO
  23. -INC SMCHPOI
  24. -INC SMLMOTS
  25. -INC SMLREEL
  26. -INC SMELEME
  27. -INC SMCOORD
  28. *
  29. SEGMENT ICPR(nbpts)
  30. SEGMENT ICP1(NBP1),ICP2(NBP2)
  31. SEGMENT IPLREE(JG)
  32. *
  33. REAL*8 VFLOT
  34. CHARACTER*(LOCOMP) MOYY
  35. CHARACTER*72 TITRE
  36. *
  37. * MOOPT CONTIENT LES MOTS-CLES DE L'OPERATEUR
  38. PARAMETER (LMOOPT=2)
  39. CHARACTER*4 MOOPT(LMOOPT)
  40. DATA MOOPT /'TITR','NATU'/
  41. *
  42. * ADDI CONTIENT LES MOTS-CLES DU PREMIER ATTRIBUT (NATURE)
  43. CHARACTER*4 ADDI(3)
  44. DATA ADDI /'INDE','DIFF','DISC'/
  45. *
  46. * ATTRI CONTIENT LES VALEURS DES ATTRIBUTS (LIMITE A 10)
  47. INTEGER ATTRI(10)
  48. *
  49. * BOOLEEN INDIQUANT SI ON A DONNE UN MAILLAGE DE POI1
  50. LOGICAL KPOI1
  51. *
  52. * BOOLEEN INDIQUANT QU'AU MOINS UNE COMPOSANTE EST VARIABLE
  53. LOGICAL KVARI
  54.  
  55. KVARI = .FALSE.
  56. *
  57. *
  58. *
  59. * +---------------------------------------------------------------+
  60. * | L E C T U R E D E S M O T S - C L E S |
  61. * +---------------------------------------------------------------+
  62. * (DANS LE CAS OU ILS SONT PLACES EN TETE D'INSTRUCTION)
  63. *
  64. TITRE = ' '
  65. DO I=1,10
  66. ATTRI(I)=0
  67. ENDDO
  68. *
  69. 100 CALL LIRMOT(MOOPT,LMOOPT,IMOT,0)
  70. IF (IERR.NE.0) RETURN
  71. *
  72. * MOT-CLE "TITR"
  73. * ==============
  74. IF (IMOT.EQ.1) THEN
  75. CALL LIRCHA(TITRE,1,IRETOU)
  76. IF (IERR.NE.0) RETURN
  77. GOTO 100
  78. *
  79. * MOT-CLE "NATU"
  80. * ==============
  81. ELSEIF (IMOT.EQ.2) THEN
  82. CALL LIRMOT(ADDI,3,ATTRI(1),1)
  83. IF (IERR .NE. 0) RETURN
  84. ATTRI(1) = ATTRI(1) - 1
  85. GOTO 100
  86. ENDIF
  87. *
  88. *
  89. *
  90. * +---------------------------------------------------------------+
  91. * | L E C T U R E D E L A G E O M E T R I E |
  92. * +---------------------------------------------------------------+
  93. *
  94. * GEOMETRIE SOUS FORME DE "POINT"
  95. CALL LIROBJ('POINT ',KPOINT,0,IRETOU)
  96. IF (IRETOU.NE.0) THEN
  97. CALL CRELEM(KPOINT)
  98. MELEME = KPOINT
  99. SEGACT MELEME
  100. KPOI1 = .TRUE.
  101. *
  102. * GEOMETRIE SOUS FORME DE "MAILLAGE"
  103. ELSE
  104. CALL LIROBJ('MAILLAGE',MELEME,1,IRETOU)
  105. IF (IERR.NE.0) RETURN
  106. SEGACT MELEME
  107. KPOI1 = (ITYPEL.EQ.1.AND.LISOUS(/1).EQ.0)
  108. ENDIF
  109. *
  110. * NBP1 = Nombre de noeuds avec doublons eventuels
  111. * NBP2 = Nombre de noeuds sans aucun doublon
  112. *
  113. * CREATION D'UN MAILLAGE DE POI1 SANS DOUBLONS
  114. IF (KPOI1) THEN
  115. *
  116. * BOUCLE SUR LES NOEUDS DU MAILLAGE
  117. * => ON DETECTE LES DOUBLONS EVENTUELS EN REMPLISSANT ICPR
  118. * => ON CREE IPT1, LE MAILLAGE CORRESPONDANT A MELEME SANS LES DOUBLONS
  119. * (ON LE CREE MANUELLEMENT PLUTOT QUE D'APPELER "CHANGE"
  120. * AFIN DE MAITRISER LA NUMEROTATION DE NOEUDS DANS IPT1
  121. * ET ETRE SUR DE LA BONNE CORRESPONDANCE AVEC LE MLREEL)
  122. * => DANS ICP1, ON RELIE LE RANG DANS MELEME AU RANG DANS IPT1 :
  123. * ICP1(RANG_AVEC_DOUBLONS) = RANG_SANS_DOUBLONS
  124. NBP1 = NUM(/2)
  125. NBP2 = 0
  126. *
  127. SEGINI ICPR,ICP1
  128. *
  129. NBNN=1
  130. NBELEM=NBP1
  131. NBSOUS=0
  132. NBREF=0
  133. SEGINI IPT1
  134. IPT1.ITYPEL=1
  135. *
  136. DO I=1,NBP1
  137. IKI = NUM(1,I)
  138. IF (ICPR(IKI).EQ.0) THEN
  139. NBP2 = NBP2+1
  140. ICPR(IKI) = NBP2
  141. IPT1.NUM(1,NBP2) = IKI
  142. ENDIF
  143. ICP1(I) = ICPR(IKI)
  144. ENDDO
  145. *
  146. SEGSUP ICPR
  147. *bp : ajout du cas ou NBP2 = NBP1 : on conserve le bon MELEME
  148. if (NBP2.eq.NBP1) then
  149. SEGSUP,IPT1
  150. else
  151. * On peut desormais remplacer MELEME par IPT1
  152. NBELEM=NBP2
  153. SEGADJ IPT1
  154. *bp : ajout de la verif que ce maillage n existe pas deja via crech1
  155. ipt11=ipt1
  156. call crech1(ipt1,1)
  157. MELEME = IPT1
  158. if (IPT1.ne.ipt11) then
  159. IPT1=ipt11
  160. segsup,IPT1
  161. endif
  162. endif
  163. *
  164. ELSE
  165. *
  166. * L'APPEL A "CHANGE" SUFFIT POUR ELIMINER TOUS LES DOUBLONS
  167. CALL CHANGE(MELEME,1)
  168. NBP1 = NUM(/2)
  169. NBP2 = NBP1
  170. *
  171. ENDIF
  172. *
  173. *
  174. * +---------------------------------------------------------------+
  175. * | L E C T U R E D E S C O M P O S A N T E S |
  176. * +---------------------------------------------------------------+
  177. *
  178. *
  179. * SYNTAXE 1
  180. * =========
  181. *
  182. * MANU 'CHPO' GEO1 LMOT1 LREE1 ;
  183. * => ATTRIBUE UNE VALEUR CONSTANTE A CHAQUE COMPOSANTE (NULLE SI
  184. * PLUS DE COMPOSANTES DANS LMOT1 QUE DE VALEURS DANS LREE1)
  185. *
  186. CALL LIROBJ('LISTMOTS',MLMOTS,0,ISYNTA1)
  187. IF (ISYNTA1.NE.0) THEN
  188. *
  189. * NC = Nombre de noms de composantes dans le LISTMOTS
  190. * NR = Nombre de valeurs reelles dans le LISTREEL
  191. *
  192. *
  193. * LECTURE DES NOMS
  194. * ****************
  195. *
  196. SEGACT MLMOTS
  197. NC = MOTS(/2)
  198. ILU = 1
  199.  
  200. * LECTURE DES VALEURS
  201. * *******************
  202. *
  203. CALL LIROBJ('LISTREEL',MLREEL,1,IRETOU)
  204. IF (IERR.NE.0) RETURN
  205. SEGACT MLREEL
  206. NR = PROG(/1)
  207. JG = NC
  208. SEGINI IPLREE
  209. c DO I=1,NC
  210. c IPLREE(I)=0
  211. c ENDDO
  212. IF (NR.LT.NC) THEN
  213. SEGADJ MLREEL
  214. DO I=NR+1,NC
  215. PROG(I)=0.D0
  216. ENDDO
  217. ENDIF
  218. *
  219. *
  220. * SYNTAXE 2
  221. * =========
  222. *
  223. * MANU 'CHPO' GEO1 (ENTI1) MOT1 VAL1 (MOT2 VAL2 ...) ;
  224. * => ATTRIBUE UNE VALEUR OU UNE LISTE DE VALEURS A CHAQUE COMPOSANTE
  225. * (LES VALi PEUVENT ETRE DE TYPE FLOTTANT OU LISTREEL)
  226. *
  227. ELSE
  228. *
  229. * ILU = 1 si le nombre de composantes est specifie (0 sinon)
  230. * NCC = Nombre de composantes indique par l'utilisateur
  231. * NC = Nombre de composantes lues dans MOT1, MOT2, etc...
  232. CALL LIRENT(NCC,0,IRETOU)
  233. JGN=LOCOMP
  234. IF (IRETOU.NE.0) THEN
  235. ILU=1
  236. INTERR(1)= NCC
  237. IF (NCC.LE.0) CALL ERREUR(36)
  238. IF (IERR.NE.0) RETURN
  239. JGM=NCC
  240. JG =NCC
  241. ELSE
  242. ILU=0
  243. JGM=1
  244. JG=0
  245. ENDIF
  246. SEGINI MLMOTS,MLREEL,IPLREE
  247. *
  248. NC = 0
  249. *
  250. 20 CONTINUE
  251. *
  252. *
  253. * LECTURE DU NOM
  254. * **************
  255. *
  256. CALL LIRCHA(MOYY,0,IRETOU)
  257. IF (IRETOU.EQ.0) THEN
  258. IF (ILU.EQ.1) THEN
  259. CALL ERREUR(80)
  260. RETURN
  261. ELSE
  262. GOTO 21
  263. ENDIF
  264. ENDIF
  265. IF (IERR.NE.0) RETURN
  266. *
  267. IF (IRETOU.GT.LOCOMP) THEN
  268. CALL ERREUR(536)
  269. RETURN
  270. ENDIF
  271. *
  272. *
  273. * LECTURE DES VALEURS CORRESPONDANTES...
  274. * **************************************
  275. *
  276. * ...SOUS-FORME DE FLOTTANT ?
  277. CALL LIRREE(VFLOT,0,IFLO)
  278. *
  279. * ...OU SOUS-FORME DE LISTREEL ?
  280. IF (IFLO.EQ.0) THEN
  281. CALL LIROBJ('LISTREEL',MLREE1,1,ILIS)
  282. IF (IERR.NE.0) RETURN
  283. *
  284. SEGACT MLREE1
  285. N = MLREE1.PROG(/1)
  286. *
  287. IF (N.NE.NBP1.AND.N.NE.1) CALL ERREUR(726)
  288. IF (IERR.NE.0) RETURN
  289. *
  290. * ...FINALEMENT NON, C'EST BIEN UN UNIQUE FLOTTANT !
  291. IF (N.EQ.1) THEN
  292. VFLOT = MLREE1.PROG(1)
  293. IFLO = 1
  294. ENDIF
  295. ENDIF
  296. *
  297. *
  298. * MEMORISATION DES NOMS DANS MLMOTS
  299. * MEMORISATION DES VALEURS DANS MLREEL OU IPLREE
  300. * **********************************************
  301. *
  302. NC = NC + 1
  303. *
  304. IF (ILU.EQ.0) THEN
  305. JGM = NC
  306. JG = NC
  307. SEGADJ MLMOTS,MLREEL,IPLREE
  308. ENDIF
  309. *
  310. MOTS(NC) = MOYY
  311. *
  312. IF (IFLO.NE.0) THEN
  313. IPLREE(NC) = 0
  314. PROG(NC) = VFLOT
  315. ELSE
  316. KVARI = .TRUE.
  317. IPLREE(NC) = MLREE1
  318. ENDIF
  319. *
  320. IF (ILU.EQ.0.OR.NC.LT.NCC) GOTO 20
  321. 21 CONTINUE
  322. *
  323. ENDIF
  324. *
  325. *
  326. *
  327. * +---------------------------------------------------------------+
  328. * | L E C T U R E D E S M O T S - C L E S |
  329. * +---------------------------------------------------------------+
  330. * (DANS LE CAS OU ILS SONT PLACES EN FIN D'INSTRUCTION)
  331. *
  332. 200 CONTINUE
  333. CALL LIRMOT(MOOPT,LMOOPT,IMOT,0)
  334. IF (IERR.NE.0) RETURN
  335. *
  336. * MOT-CLE "TITR"
  337. * ==============
  338. IF (IMOT.EQ.1) THEN
  339. CALL LIRCHA(TITRE,1,IRETOU)
  340. IF (IERR.NE.0) RETURN
  341. GOTO 200
  342. *
  343. * MOT-CLE "NATU"
  344. * ==============
  345. ELSEIF (IMOT.EQ.2) THEN
  346. CALL LIRMOT(ADDI,3,ATTRI(1),1)
  347. IF (IERR .NE. 0) RETURN
  348. ATTRI(1) = ATTRI(1) - 1
  349. GOTO 200
  350. ENDIF
  351. *
  352. *
  353. *
  354. * +---------------------------------------------------------------+
  355. * | C R E A T I O N D U C H P O I N T |
  356. * +---------------------------------------------------------------+
  357. *
  358. *
  359. IF (.NOT.KPOI1.AND.KVARI) CALL ERREUR(1040)
  360. IF (IERR.NE.0) RETURN
  361. *
  362. IF (NBP1.NE.NBP2.AND.ATTRI(1).EQ.0) CALL ERREUR(1041)
  363. IF (IERR.NE.0) RETURN
  364. *
  365. *
  366. * INITIALISATION DES SEGMENTS MSOUPO ET MPOVAL DU CHPOINT
  367. * =======================================================
  368. *
  369. SEGINI MSOUPO
  370. IGEOC = MELEME
  371. N = NBP2
  372. *
  373. SEGINI MPOVAL
  374. IPOVAL = MPOVAL
  375. *
  376. *
  377. * BOUCLE SUR LES COMPOSANTES A CREER
  378. * ==================================
  379. *
  380. DO IC=1,NC
  381. *
  382. NOHARM(IC) = NIFOUR
  383. NOCOMP(IC) = MOTS(IC)
  384. *l
  385. IF (IPLREE(IC).EQ.0) THEN
  386. *
  387. * -------------------
  388. * COMPOSANTE UNIFORME
  389. * -------------------
  390. *
  391. VFLOT=PROG(IC)
  392. *
  393. * Maillage initial sans noeuds multiples
  394. IF (NBP1.EQ.NBP2) THEN
  395. DO K=1,NBP1
  396. VPOCHA(K,IC) = VFLOT
  397. ENDDO
  398. *
  399. * Noeuds multiples + Nature DIFFUSE
  400. ELSEIF (ATTRI(1).EQ.1) THEN
  401. DO K=1,NBP2
  402. VPOCHA(K,IC) = VFLOT
  403. ENDDO
  404. *
  405. * Noeuds multiples + Nature DISCRETE
  406. ELSEIF (ATTRI(1).EQ.2) THEN
  407. DO K=1,NBP1
  408. K1=ICP1(K)
  409. VPOCHA(K1,IC) = VPOCHA(K1,IC) + VFLOT
  410. ENDDO
  411. ENDIF
  412. *
  413. ELSE
  414. *
  415. * -------------------
  416. * COMPOSANTE VARIABLE
  417. * -------------------
  418. *
  419. MLREE1=IPLREE(IC)
  420. SEGACT MLREE1
  421. *
  422. * Maillage initial sans noeuds multiples
  423. IF (NBP1.EQ.NBP2) THEN
  424. DO K=1,NBP1
  425. VPOCHA(K,IC) = MLREE1.PROG(K)
  426. ENDDO
  427. *
  428. * Noeuds multiples + Nature DIFFUSE
  429. ELSEIF (ATTRI(1).EQ.1) THEN
  430. SEGINI ICP2
  431. DO K=1,NBP1
  432. K1=ICP1(K)
  433. VFLOT=MLREE1.PROG(K)
  434. IF (ICP2(K1).EQ.1.AND.VPOCHA(K1,IC).NE.VFLOT) THEN
  435. MOTERR=MOTS(IC)
  436. CALL ERREUR(1042)
  437. RETURN
  438. ENDIF
  439. VPOCHA(K1,IC) = VPOCHA(K1,IC) + VFLOT
  440. ICP2(K1)=1
  441. ENDDO
  442. SEGSUP ICP2
  443. *
  444. * Noeuds multiples + Nature DISCRETE
  445. ELSEIF (ATTRI(1).EQ.2) THEN
  446. DO K=1,NBP1
  447. K1=ICP1(K)
  448. VPOCHA(K1,IC) = VPOCHA(K1,IC) + MLREE1.PROG(K)
  449. ENDDO
  450. ENDIF
  451. *
  452. ENDIF
  453. *
  454. ENDDO
  455. *
  456. *
  457. * Un peu de menage...
  458. IF (ISYNTA1.NE.1) THEN
  459. SEGSUP MLMOTS,MLREEL
  460. ENDIF
  461. SEGSUP IPLREE
  462. IF (KPOI1) SEGSUP ICP1
  463. *
  464. *
  465. * CREATION DU CHAPEAU
  466. * ===================
  467. *
  468. NSOUPO = 1
  469. NAT = 1
  470. SEGINI MCHPOI
  471. MOCHDE = TITRE
  472. MTYPOI = ' '
  473. DO I=1,NAT
  474. JATTRI(I) = ATTRI(I)
  475. ENDDO
  476. IFOPOI = IFOUR
  477. IPCHP(1)= MSOUPO
  478. *
  479. *
  480. * ECRITURE DU CHPOINT
  481. * ===================
  482. *
  483. CALL ACTOBJ('CHPOINT ',MCHPOI,1)
  484. CALL ECROBJ('CHPOINT ',MCHPOI)
  485.  
  486. END
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  

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