Télécharger manuch.eso

Retour à la liste

Numérotation des lignes :

manuch
  1. C MANUCH SOURCE MB234859 25/04/07 21:15:01 12226
  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. ICOD=1
  250. *
  251. 20 CONTINUE
  252. *
  253. *
  254. * LECTURE DU NOM
  255. * **************
  256. *
  257. CALL LIRCHA(MOYY,0,IRETOU)
  258. IF (IRETOU.EQ.0) THEN
  259. IF (ILU.EQ.1) THEN
  260. CALL ERREUR(80)
  261. RETURN
  262. ELSE
  263. GOTO 21
  264. ENDIF
  265. ENDIF
  266. IF (IERR.NE.0) RETURN
  267. *
  268. IF (IRETOU.GT.LOCOMP) THEN
  269. CALL ERREUR(536)
  270. RETURN
  271. ENDIF
  272. *
  273. *
  274. * LECTURE DES VALEURS CORRESPONDANTES...
  275. * **************************************
  276. *
  277. * ...SOUS-FORME DE FLOTTANT ?
  278. CALL LIRREE(VFLOT,0,IFLO)
  279. *
  280. * ...OU SOUS-FORME DE LISTREEL ?
  281. IF (IFLO.EQ.0) THEN
  282. CALL LIROBJ('LISTREEL',MLREE1,ICOD,ILIS)
  283. *
  284. * LE MOT LU N'EST PAS UN NOM DE COMPOSANTE
  285. IF (ICOD.EQ.0.AND.ILIS.EQ.0) THEN
  286. CALL REFUS
  287. GOTO 21
  288. ENDIF
  289. *
  290. IF (IERR.NE.0) RETURN
  291. *
  292. SEGACT MLREE1
  293. N = MLREE1.PROG(/1)
  294. *
  295. IF (N.NE.NBP1.AND.N.NE.1) CALL ERREUR(726)
  296. IF (IERR.NE.0) RETURN
  297. *
  298. * ...FINALEMENT NON, C'EST BIEN UN UNIQUE FLOTTANT !
  299. IF (N.EQ.1) THEN
  300. VFLOT = MLREE1.PROG(1)
  301. IFLO = 1
  302. ENDIF
  303. ENDIF
  304. *
  305. *
  306. * MEMORISATION DES NOMS DANS MLMOTS
  307. * MEMORISATION DES VALEURS DANS MLREEL OU IPLREE
  308. * **********************************************
  309. *
  310. NC = NC + 1
  311. *
  312. IF (ILU.EQ.0) THEN
  313. JGM = NC
  314. JG = NC
  315. SEGADJ MLMOTS,MLREEL,IPLREE
  316. ENDIF
  317. *
  318. MOTS(NC) = MOYY
  319. *
  320. IF (IFLO.NE.0) THEN
  321. IPLREE(NC) = 0
  322. PROG(NC) = VFLOT
  323. ELSE
  324. KVARI = .TRUE.
  325. IPLREE(NC) = MLREE1
  326. ENDIF
  327. ICOD=0
  328. *
  329. IF (ILU.EQ.0.OR.NC.LT.NCC) GOTO 20
  330. 21 CONTINUE
  331. *
  332. ENDIF
  333. *
  334. *
  335. *
  336. * +---------------------------------------------------------------+
  337. * | L E C T U R E D E S M O T S - C L E S |
  338. * +---------------------------------------------------------------+
  339. * (DANS LE CAS OU ILS SONT PLACES EN FIN D'INSTRUCTION)
  340. *
  341. 200 CONTINUE
  342. CALL LIRMOT(MOOPT,LMOOPT,IMOT,0)
  343. IF (IERR.NE.0) RETURN
  344. *
  345. * MOT-CLE "TITR"
  346. * ==============
  347. IF (IMOT.EQ.1) THEN
  348. CALL LIRCHA(TITRE,1,IRETOU)
  349. IF (IERR.NE.0) RETURN
  350. GOTO 200
  351. *
  352. * MOT-CLE "NATU"
  353. * ==============
  354. ELSEIF (IMOT.EQ.2) THEN
  355. CALL LIRMOT(ADDI,3,ATTRI(1),1)
  356. IF (IERR .NE. 0) RETURN
  357. ATTRI(1) = ATTRI(1) - 1
  358. GOTO 200
  359. ENDIF
  360. *
  361. *
  362. *
  363. * +---------------------------------------------------------------+
  364. * | C R E A T I O N D U C H P O I N T |
  365. * +---------------------------------------------------------------+
  366. *
  367. *
  368. IF (.NOT.KPOI1.AND.KVARI) CALL ERREUR(1040)
  369. IF (IERR.NE.0) RETURN
  370. *
  371. IF (NBP1.NE.NBP2.AND.ATTRI(1).EQ.0) CALL ERREUR(1041)
  372. IF (IERR.NE.0) RETURN
  373. *
  374. *
  375. * INITIALISATION DES SEGMENTS MSOUPO ET MPOVAL DU CHPOINT
  376. * =======================================================
  377. *
  378. SEGINI MSOUPO
  379. IGEOC = MELEME
  380. N = NBP2
  381. *
  382. SEGINI MPOVAL
  383. IPOVAL = MPOVAL
  384. *
  385. *
  386. * BOUCLE SUR LES COMPOSANTES A CREER
  387. * ==================================
  388. *
  389. DO IC=1,NC
  390. *
  391. NOHARM(IC) = NIFOUR
  392. NOCOMP(IC) = MOTS(IC)
  393. *l
  394. IF (IPLREE(IC).EQ.0) THEN
  395. *
  396. * -------------------
  397. * COMPOSANTE UNIFORME
  398. * -------------------
  399. *
  400. VFLOT=PROG(IC)
  401. *
  402. * Maillage initial sans noeuds multiples
  403. IF (NBP1.EQ.NBP2) THEN
  404. DO K=1,NBP1
  405. VPOCHA(K,IC) = VFLOT
  406. ENDDO
  407. *
  408. * Noeuds multiples + Nature DIFFUSE
  409. ELSEIF (ATTRI(1).EQ.1) THEN
  410. DO K=1,NBP2
  411. VPOCHA(K,IC) = VFLOT
  412. ENDDO
  413. *
  414. * Noeuds multiples + Nature DISCRETE
  415. ELSEIF (ATTRI(1).EQ.2) THEN
  416. DO K=1,NBP1
  417. K1=ICP1(K)
  418. VPOCHA(K1,IC) = VPOCHA(K1,IC) + VFLOT
  419. ENDDO
  420. ENDIF
  421. *
  422. ELSE
  423. *
  424. * -------------------
  425. * COMPOSANTE VARIABLE
  426. * -------------------
  427. *
  428. MLREE1=IPLREE(IC)
  429. SEGACT MLREE1
  430. *
  431. * Maillage initial sans noeuds multiples
  432. IF (NBP1.EQ.NBP2) THEN
  433. DO K=1,NBP1
  434. VPOCHA(K,IC) = MLREE1.PROG(K)
  435. ENDDO
  436. *
  437. * Noeuds multiples + Nature DIFFUSE
  438. ELSEIF (ATTRI(1).EQ.1) THEN
  439. SEGINI ICP2
  440. DO K=1,NBP1
  441. K1=ICP1(K)
  442. VFLOT=MLREE1.PROG(K)
  443. IF (ICP2(K1).EQ.1.AND.VPOCHA(K1,IC).NE.VFLOT) THEN
  444. MOTERR=MOTS(IC)
  445. CALL ERREUR(1042)
  446. RETURN
  447. ENDIF
  448. VPOCHA(K1,IC) = VPOCHA(K1,IC) + VFLOT
  449. ICP2(K1)=1
  450. ENDDO
  451. SEGSUP ICP2
  452. *
  453. * Noeuds multiples + Nature DISCRETE
  454. ELSEIF (ATTRI(1).EQ.2) THEN
  455. DO K=1,NBP1
  456. K1=ICP1(K)
  457. VPOCHA(K1,IC) = VPOCHA(K1,IC) + MLREE1.PROG(K)
  458. ENDDO
  459. ENDIF
  460. *
  461. ENDIF
  462. *
  463. ENDDO
  464. *
  465. *
  466. * Un peu de menage...
  467. IF (ISYNTA1.NE.1) THEN
  468. SEGSUP MLMOTS,MLREEL
  469. ENDIF
  470. SEGSUP IPLREE
  471. IF (KPOI1) SEGSUP ICP1
  472. *
  473. *
  474. * CREATION DU CHAPEAU
  475. * ===================
  476. *
  477. NSOUPO = 1
  478. NAT = 1
  479. SEGINI MCHPOI
  480. MOCHDE = TITRE
  481. MTYPOI = ' '
  482. DO I=1,NAT
  483. JATTRI(I) = ATTRI(I)
  484. ENDDO
  485. IFOPOI = IFOUR
  486. IPCHP(1)= MSOUPO
  487. *
  488. *
  489. * ECRITURE DU CHPOINT
  490. * ===================
  491. *
  492. CALL ACTOBJ('CHPOINT ',MCHPOI,1)
  493. CALL ECROBJ('CHPOINT ',MCHPOI)
  494.  
  495. END
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  

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