Télécharger tens2.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : tens2.dgibi
  2. 'OPTI' echo 0 ;
  3. ************************************************************************
  4. ************************************************************************
  5. ************************************************************************
  6. * NOM : TENS2
  7. * DESCRIPTION : Test de la décomposition principale, en particulier
  8. * les valeurs propres et la recomposition.
  9. * On teste les cas où les valeurs propres sont proches.
  10. * TENS PRIN et TENS RECO
  11. * D'autres options de TENS sont egalement testees
  12. * 'INVE' 'DET' pour les matrices de rotation
  13. * (orthonormales non symetriques)
  14. *
  15. * LANGAGE : GIBIANE-CAST3M
  16. * AUTEUR : Stephane GOUNAND (CEA/DES/ISAS/DM2S/SEMT/LTA)
  17. * mel : stephane.gounand@cea.fr
  18. **********************************************************************
  19. * VERSION : v1, 09/10/2025, version initiale
  20. * HISTORIQUE : v1, 09/10/2025, création
  21. * HISTORIQUE :
  22. * HISTORIQUE :
  23. ************************************************************************
  24. *
  25. interact=faux ;
  26. *
  27. * erreur relative entre deux champs normee point par point
  28. *
  29. 'DEBP' errchpor ch1*'CHPOINT' ch2*'CHPOINT' ;
  30. nc1 = 'EXTR' ch1 'COMP' ;
  31. nc2 = 'EXTR' ch2 'COMP' ;
  32. nct = 'UNIQ' (nc1 'ET' nc2) ;
  33. first = vrai ;
  34. 'REPE' iict ('DIME' nct) ;
  35. ict = &iict ;
  36. nocomp = 'EXTR' nct ict ;
  37. ach1i = 'ABS' ('EXCO' nocomp ch1 'SCAL') ;
  38. 'SI' first ;
  39. chmaxa = ach1i ;
  40. first = faux ;
  41. 'SINO' ;
  42. chg = 'MASQ' chmaxa 'EGSUPE' ach1i ;
  43. chd = '-' 1. chg ;
  44. chmaxa = (chg '*' chmaxa) '+' (chd '*' ach1i) ;
  45. 'FINS' ;
  46. ach2i = 'ABS' ('EXCO' nocomp ch2 'SCAL') ;
  47. chg = 'MASQ' chmaxa 'EGSUPE' ach2i ;
  48. chd = '-' 1. chg ;
  49. chmaxa = (chg '*' chmaxa) '+' (chd '*' ach2i) ;
  50. 'FIN' iict ;
  51. * Seuillage
  52. vpetit = 'VALE' 'PETIT' ;
  53. chg = 'MASQ' chmaxa 'EGSUPE' vpetit ;
  54. chd = '-' 1. chg ;
  55. chmaxa = (chg '*' chmaxa) '+' (chd '*' vpetit) ;
  56. dc12 = '/' ('ABS' ('-' ch1 ch2)) chmaxa ;
  57. 'FINP' dc12 ;
  58. *
  59. * Test si les vecteurs propres sont bien des vecteurs propres
  60. *
  61. 'DEBP' tvectp ;
  62. 'ARGU' tensym*'CHPOINT' ;
  63. 'ARGU' chvecp*'CHPOINT' ;
  64. 'ARGU' tolrel*'FLOTTANT' ;
  65. lok = vrai ;
  66. amax = 'TENS' 'NORMINF' tensym ;
  67. amax = 'BORN' amax 'MINIMUM' ('VALE' 'PETIT') ;
  68. tol = amax '*' tolrel ;
  69. * Passage CHPOINT -> TABLE Tenseur symetrique
  70. ttens = 'TABL' ;
  71. vdim = 'VALE' 'DIME' ;
  72. 'REPE' ii vdim ;
  73. i = &ii ;
  74. ttens . i = 'TABL' ;
  75. 'REPE' ij i ;
  76. j = &ij ;
  77. ngij = 'CHAI' 'G' i j ;
  78. ttens . i . j = 'EXCO' ngij tensym ;
  79. 'SI' ('NEG' i j);
  80. ttens . j . i = ttens . i . j ;
  81. 'FINS' ;
  82. 'FIN' ij ;
  83. 'FIN' ii ;
  84. * Passage CHPOINT -> TABLE Vecteurs propres
  85. tvecp = 'TABL' ;
  86. vdim = 'VALE' 'DIME' ;
  87. 'REPE' ii vdim ;
  88. i = &ii ;
  89. tvecp . i = 'TABL' ;
  90. 'REPE' ij vdim ;
  91. j = &ij ;
  92. ngij = 'CHAI' 'CO' j i ;
  93. tvecp . i . j = 'EXCO' ngij chvecp ;
  94. 'FIN' ij ;
  95. 'FIN' ii ;
  96. * Passage CHPOINT -> TABLE Valeurs propres
  97. tvalp = 'TABL' ;
  98. vdim = 'VALE' 'DIME' ;
  99. 'REPE' ii vdim ;
  100. i = &ii ;
  101. tvalp . i = 'TABL' ;
  102. ngii = 'CHAI' 'SI' i i ;
  103. tvalp . i = 'EXCO' ngii chvecp ;
  104. 'FIN' ii ;
  105. * Verif Vecteurs propres
  106. tprod = 'TABL' ;
  107. 'REPE' ii vdim ;
  108. i = &ii ;
  109. tprod . i = 'TABL' ;
  110. 'REPE' ij vdim ;
  111. j = &ij ;
  112. chprod = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  113. 'REPE' ik vdim ;
  114. k = &ik ;
  115. 'SI' ('EGA' j k) ;
  116. inc = '*' ('-' ttens . k . j tvalp . i) tvecp . i . k ;
  117. 'SINO' ;
  118. inc = '*' ttens . k . j tvecp . i . k ;
  119. 'FINS' ;
  120. chprod = chprod '+' inc ;
  121. 'FIN' ik ;
  122. tprod . i . j = chprod ;
  123. 'FIN' ij ;
  124. 'FIN' ii ;
  125. 'REPE' ii vdim ;
  126. i = &ii ;
  127. 'REPE' ij vdim ;
  128. j= &ij ;
  129. chprod = tprod . i . j ;
  130. vprod = 'MASQ' ('ABS' chprod) 'INFERIEUR' tol ;
  131. nprod = 'MINI' vprod ;
  132. tnprod = '>' nprod 0. ;
  133. lok = lok 'ET' tnprod ;
  134. 'SI' ('NON' tnprod) ;
  135. 'MESS' '!!! Le vecteur i=' i ' nest pas un vecteur propre' ;
  136. * 'MESS' 'par sa composante j=' j ' dont la norme' ' ' nprod ' >' ' ' tol ;
  137. 'MESS' 'par sa composante j=' j ;
  138. nocor = 'POIN' vprod 'MINI' ;
  139. 'MESS' '!!! Nb points a problemes = ' ('NBEL' nocor) ;
  140. 'FINS' ;
  141. 'FIN' ij ;
  142. 'FIN' ii ;
  143. 'SI' ('NON' lok) ; 'ERRE' stop ; 'FINS' ;
  144. 'FINP' lok ;
  145. *
  146. * Test si les colonnes d'une matrice sont bien orthonormales
  147. * (matrice de rotation et matrice de vecteurs propres)
  148. *
  149. 'DEBP' ttensrot ;
  150. 'ARGU' rottot*'CHPOINT' ;
  151. 'ARGU' tol*'FLOTTANT' ;
  152. lok = vrai ;
  153. * Identite
  154. rott1 = 'TENS' 'IDEN' rottot ;
  155. drott1 = '-' rott1 rottot ;
  156. ndrott1 = 'TENS' drott1 'NORMINF' ;
  157. nndrott1 = 'MAXI' ndrott1 'ABS' ;
  158. tdrott1 = '<' nndrott1 tol ;
  159. lok = lok 'ET' tdrott1 ;
  160. 'SI' ('NON' tdrott1) ; 'MESS' '!!! Calcul identite' ' ' nndrott1 ' >' ' ' tol ; 'FINS' ;
  161. * Determinant unite
  162. drott2 = '-' ('TENS' 'DET' rottot) 1. ;
  163. nndrott2 = 'MAXI' drott2 'ABS' ;
  164. tdrott2 = '<' nndrott2 tol ;
  165. lok = lok 'ET' tdrott2 ;
  166. 'SI' ('NON' tdrott2) ; 'MESS' '!!! Determinant non unite' ' ' nndrott2 ' >' ' ' tol ; 'FINS' ;
  167. * Verif orthonormalite
  168. trot = 'TABL' ;
  169. vdim = 'VALE' 'DIME' ;
  170. 'REPE' ii vdim ;
  171. i = &ii ;
  172. trot . i = 'TABL' ;
  173. 'REPE' ij vdim ;
  174. j = &ij ;
  175. ngij = 'CHAI' 'CO' i j ;
  176. trot . i . j = 'EXCO' ngij rottot ;
  177. 'FIN' ij ;
  178. 'FIN' ii ;
  179. * Pscal des colonnes de trot
  180. tpsca = 'TABL' ;
  181. 'REPE' ij vdim ;
  182. j = &ij ;
  183. tpsca . j = 'TABL' ;
  184. 'REPE' ik vdim ;
  185. k = &ik ;
  186. pjk = 'VIDE' 'CHPOINT'/'DISCRET' ;
  187. 'REPE' ii vdim ;
  188. i = &ii ;
  189. pjk = pjk '+' (trot . i . j '*' trot . i . k) ;
  190. 'FIN' ii ;
  191. tpsca . j . k = pjk ;
  192. 'FIN' ik ;
  193. 'FIN' ij ;
  194. * Verif trot orthonormale
  195. 'REPE' ij vdim ;
  196. j = &ij ;
  197. 'REPE' ik vdim ;
  198. k = &ik ;
  199. 'SI' ('EGA' j k) ;
  200. dpsca = (tpsca . j . k) '-' 1.d0 ;
  201. 'SINO' ;
  202. dpsca = tpsca . j . k ;
  203. 'FINS' ;
  204. ddpsca = 'MAXI' dpsca 'ABS' ;
  205. tdpsca = '<' ddpsca tol ;
  206. lok = lok 'ET' tdpsca ;
  207. 'SI' ('NON' tdpsca) ;
  208. 'MESS' '!!! Matrice non orthonormale' ' ' ddpsca ' >' ' ' tol ;
  209. 'MESS' 'colonne' ' ' j '.pscal.colonne' ' ' k '=' ddpsca ;
  210. 'FINS' ;
  211. 'FIN' ik ;
  212. 'FIN' ij ;
  213. * Transpose = inverse
  214. trottot = 'TENS' 'TRANS' rottot ;
  215. irottot = 'TENS' 'INVE' rottot ;
  216. drott3 = '-' trottot irottot ;
  217. ndrott3 = 'TENS' drott3 'NORMINF' ;
  218. nndrott3 = 'MAXI' ndrott3 'ABS' ;
  219. tdrott3 = '<' nndrott3 tol ;
  220. lok = lok 'ET' tdrott3 ;
  221. 'SI' ('NON' tdrott3) ; 'MESS' '!!! Inverse.NE.Transpose' ' ' nndrott3 ' >' ' ' tol ; 'FINS' ;
  222. * Inverse correcte
  223. tirot = 'TABL' ;
  224. vdim = 'VALE' 'DIME' ;
  225. 'REPE' ii vdim ;
  226. i = &ii ;
  227. tirot . i = 'TABL' ;
  228. 'REPE' ij vdim ;
  229. j = &ij ;
  230. ngij = 'CHAI' 'CO' i j ;
  231. tirot . i . j = 'EXCO' ngij irottot ;
  232. 'FIN' ij ;
  233. 'FIN' ii ;
  234. * Produit
  235. vdim = 'VALE' 'DIME' ;
  236. *tprod = 'TABL' ;
  237. 'REPE' ij vdim ;
  238. j = &ij ;
  239. * tprod . j = 'TABL' ;
  240. 'REPE' ik vdim ;
  241. k = &ik ;
  242. ngjk = 'CHAI' 'CO' j k ;
  243. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  244. 'REPE' ii vdim ;
  245. i = &ii ;
  246. gjk = gjk '+' (trot . j . i '*' trot . i . k) ;
  247. 'FIN' ii ;
  248. * tprod . j .k = gjk ;
  249. 'SI' ('EGA' j k) ;
  250. vref = 1. ;
  251. 'SINO' ;
  252. vref = 0. ;
  253. 'FINS' ;
  254. drott4 = '-' gjk vref ;
  255. nndrott4 = 'MAXI' drott2 'ABS' ;
  256. tdrott4 = '<' nndrott4 tol ;
  257. lok = lok 'ET' tdrott4 ;
  258. 'SI' ('NON' tdrott4) ; 'MESS' '!!! M*M^-1 non unite' ' j=' j ' k =' k ' ' nndrott4 ' >' ' ' tol ; 'FINS' ;
  259. 'FIN' ik ;
  260. 'FIN' ij ;
  261. 'SI' ('NON' lok) ; 'ERRE' stop ; 'FINS' ;
  262. 'FINP' lok ;
  263. *
  264. lok = vrai ;
  265. pet = 'VALE' 'PETIT' ; lpet = 'LOG' pet ;
  266. pre = 'VALE' 'PREC' ; lpre = 'LOG' pre ;
  267. *
  268. tol = '*' pre 10. ;
  269. tolrot = '*' pre 10. ;
  270. tolvecp = '*' pre 30. ;
  271. tolrec3d = '*' pre 30. ;
  272. *
  273. 'OPTION' 'DIME' 1 'ELEM' 'SEG2' ;
  274. 'OPTI' 'MODE' unid plan ;
  275. 'MESS' ' ********** ' ;
  276. 'MESS' ' * 1D * ' ;
  277. 'MESS' ' ********** ' ;
  278. *
  279. nx = 100000 ;
  280. *nx = 3000000 ;
  281. *nx = 1 ;
  282. p1 = 'POIN' 0. ; p2 = 'POIN' 1. ;
  283. el = 'DROI' nx p1 p2 ;
  284. mod = 'MODE' el 'MECANIQUE' ;
  285. * Scaling global des termes de la matrice
  286. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  287. epsg = 'EXP' puig ;
  288. *
  289. d1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  290. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  291. v1 = 'MANU' 'CHPO' el 1 'CO11' 1. 'NATURE' 'DIFFUS' ;
  292. ltens = ttensrot v1 tolrot ;
  293. lok = lok 'ET' ltens ;
  294. 'SI' ('NON' ltens) ;
  295. 'MESS' '!!! Test tenseur de rotation not ok' ;
  296. 'SINO' ;
  297. 'MESS' 'Test tenseur de rotation OK' ;
  298. 'FINS' ;
  299. dec = d1 'ET' v1 ;
  300. *
  301. cha = 'TENS' 'RECO' dec ;
  302. *
  303. * Décomposition spectrale
  304. *
  305. decb = 'TENS' 'PRIN' cha ;
  306. * Seulement les vp
  307. decbb = 'TENS' 'VALP' cha ;
  308. legvp = '<' ('MAXI' ('-' ('EXCO' ('MOTS' 'SI11') decb) decbb) 'ABS') pet ;
  309. lok = lok 'ET' legvp ;
  310. 'SI' ('NON' legvp) ;
  311. 'MESS' '!!! Test valeurs propres egales not ok' ;
  312. 'SINO' ;
  313. 'MESS' 'Test valeurs propres egales OK' ;
  314. 'FINS' ;
  315.  
  316. decc = 'EXCO' 'CO11' decb ;
  317. ltens = ttensrot decc tolrot ;
  318. lok = lok 'ET' ltens ;
  319. 'SI' ('NON' ltens) ;
  320. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  321. 'SINO' ;
  322. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  323. 'FINS' ;
  324. lvect = tvectp cha decb tolvecp ;
  325. 'SI' ('NON' lvect) ;
  326. 'MESS' '!!! Test vecteurs propres not ok' ;
  327. 'SINO' ;
  328. 'MESS' 'Test vecteurs propres OK' ;
  329. 'FINS' ;
  330. *
  331. chab = 'TENS' 'RECO' decb ;
  332. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  333. * Test valeur propre
  334. dd1 = 'MAXI' ('-' d1 d1b) 'ABS' ;
  335. tdd1 = '<' dd1 tol ;
  336. lok = lok 'ET' tdd1 ;
  337. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul err valp 1' ' ' dd1 ' >' ' ' tol ; 'FINS' ;
  338. * Test recomposition matrice
  339. dcha = '-' chab cha ;
  340. ndcha = 'MAXI' ('TENS' dcha 'NORMINF') 'ABS' ;
  341. tdcha = '<' ndcha tol ;
  342. lok = lok 'ET' tdcha ;
  343. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ' ' ndcha ' >' ' ' tol ; 'FINS' ;
  344. 'SI' lok ; 'MESS' 'OK' ; 'FINS' ;
  345. *
  346. 'OPTION' 'DIME' 2 'ELEM' 'TRI3' ;
  347. 'OPTI' 'MODE' plan defo ;
  348. 'MESS' ' ********** ' ;
  349. 'MESS' ' * 2D * ' ;
  350. 'MESS' ' ********** ' ;
  351. *
  352. 'REPE' iikas 2 ;
  353. ikas = &iikas ;
  354. * Scaling global des termes de la matrice
  355. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  356. epsg = 'EXP' puig ;
  357. vp1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  358. * Valeurs propres distinctes
  359. 'SI' ('EGA' ikas 1) ;
  360. 'MESS' 'Valeurs propres distinctes' ;
  361. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  362. 'FINS' ;
  363. * Valeurs propres proches
  364. 'SI' ('EGA' ikas 2) ;
  365. 'MESS' 'Valeurs propres proches' ;
  366. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  367. eps = 'EXP' puin ;
  368. vp2 = vp1 '+' (('BRUI' 'BLAN' 'UNIF' 0. 1. el) '*' eps '*' epsg) ;
  369. 'FINS' ;
  370. * Les plus grandes valeurs dans d1, les plus petites dans d2
  371. m1 = 'MASQ' vp1 'EGSUPE' vp2 ;
  372. m2 = '-' 1. m1 ;
  373. d1 = ('*' vp1 m1) '+' ('*' vp2 m2) ;
  374. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  375. d2 = ('*' vp1 m2) '+' ('*' vp2 m1) ;
  376. d2 = 'NOMC' 'SI22' d2 'NATURE' 'DIFFUS' ;
  377. *
  378. ang = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  379. ca = 'COS' ang ; sa = 'SIN' ang ; msa = sa '*' -1. ;
  380. *
  381. rot11 = 'NOMC' 'CO11' ca 'NATURE' 'DIFFUS' ;
  382. rot21 = 'NOMC' 'CO21' sa 'NATURE' 'DIFFUS' ;
  383. rot12 = 'NOMC' 'CO12' msa 'NATURE' 'DIFFUS' ;
  384. rot22 = 'NOMC' 'CO22' ca 'NATURE' 'DIFFUS' ;
  385. rottot = rot11 'ET' rot21 'ET' rot12 'ET' rot22 ;
  386. * Vérif tenseur de rotation
  387. ltens = ttensrot rottot tolrot ;
  388. lok = lok 'ET' ltens ;
  389. 'SI' ('NON' ltens) ;
  390. 'MESS' '!!! Test tenseur de rotation not ok' ;
  391. 'SINO' ;
  392. 'MESS' 'Test tenseur de rotation OK' ;
  393. 'FINS' ;
  394. vprot = d1 'ET' d2 'ET' rottot ;
  395. *
  396. vdim = 'VALE' 'DIME' ;
  397. cha = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  398. 'REPE' ij vdim ;
  399. j = &ij ;
  400. 'REPE' ik j ;
  401. k = &ik ;
  402. ngjk = 'CHAI' 'G' j k ;
  403. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  404. 'REPE' ii vdim ;
  405. i = &ii ;
  406. nqji = 'CHAI' 'CO' i j ;
  407. nli = 'CHAI' 'SI' i i ;
  408. nqik = 'CHAI' 'CO' i k ;
  409. qji = 'EXCO' vprot nqji ;
  410. li = 'EXCO' vprot nli ;
  411. qik = 'EXCO' vprot nqik ;
  412. gjk = gjk '+' (qji '*' li '*' qik) ;
  413. 'FIN' ii ;
  414. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  415. cha = cha 'ET' gjk ;
  416. 'FIN' ik ;
  417. 'FIN' ij ;
  418. *
  419. * Décomposition spectrale
  420. *
  421. decb = 'TENS' 'PRIN' cha ;
  422. * Seulement les vp
  423. decbb = 'TENS' 'VALP' cha ;
  424. legvp = '<' ('MAXI' ('-' ('EXCO' ('MOTS' 'SI11' 'SI22') decb) decbb) 'ABS') pet ;
  425. lok = lok 'ET' legvp ;
  426. 'SI' ('NON' legvp) ;
  427. 'MESS' '!!! Test valeurs propres egales not ok' ;
  428. 'SINO' ;
  429. 'MESS' 'Test valeurs propres egales OK' ;
  430. 'FINS' ;
  431. *
  432. decc = 'EXCO' ('MOTS' 'CO11' 'CO12' 'CO21' 'CO22') decb ;
  433. ltens = ttensrot decc tolrot ;
  434. lok = lok 'ET' ltens ;
  435. 'SI' ('NON' ltens) ;
  436. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  437. 'SINO' ;
  438. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  439. 'FINS' ;
  440. lvect = tvectp cha decb tolvecp ;
  441. 'SI' ('NON' lvect) ;
  442. 'MESS' '!!! Test vecteurs propres not ok' ;
  443. 'SINO' ;
  444. 'MESS' 'Test vecteurs propres OK' ;
  445. 'FINS' ;
  446. *
  447. chab = 'TENS' 'RECO' decb ;
  448. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  449. d2b = 'EXCO' 'SI22' decb 'SI22' ;
  450. * Test valeurs propres
  451. dd1 = 'NOMC' 'SCAL' ('ABS' ('-' d1 d1b)) ;
  452. mdd1 = 'MASQ' dd1 'INFERIEUR' ('*' tol epsg) ;
  453. mmdd1 = 'MINI' mdd1 ;
  454. tdd1 = '>' mmdd1 0. ;
  455. lok = lok 'ET' tdd1 ;
  456. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul valp1' ; 'FINS' ;
  457. dd2 = 'NOMC' 'SCAL' ('ABS' ('-' d2 d2b)) ;
  458. mdd2 = 'MASQ' dd2 'INFERIEUR' ('*' tol epsg) ;
  459. mmdd2 = 'MINI' mdd2 ;
  460. tdd2 = '>' mmdd2 0. ;
  461. lok = lok 'ET' tdd2 ;
  462. 'SI' ('NON' tdd2) ; 'MESS' '!!! Calcul valp2' ; 'FINS' ;
  463. * Test recomposition matrice
  464. dcha = 'TENS' 'NORMINF' ('-' chab cha) ;
  465. mdcha = 'MASQ' dcha 'INFERIEUR' ('*' tol epsg) ;
  466. mmdcha = 'MINI' mdcha ;
  467. tdcha = '>' mmdcha 0. ;
  468. lok = lok 'ET' tdcha ;
  469. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ; 'FINS' ;
  470. 'SI' lok ; 'MESS' 'OK' ; 'SINO' ; 'ERRE' stop ; 'FINS' ;
  471. 'FIN' iikas ;
  472. *
  473. *
  474. *
  475. 'OPTION' 'DIME' 3 'ELEM' 'TET4' ;
  476. 'OPTI' 'MODE' 'TRID' ;
  477. 'MESS' ' ********** ' ;
  478. 'MESS' ' * 3D * ' ;
  479. 'MESS' ' ********** ' ;
  480. *
  481. 'REPE' iikas 3 ;
  482. ikas = &iikas ;
  483. * Scaling global des termes de la matrice
  484. puig = 'BRUI' 'BLAN' 'UNIF' 0. ('/' lpet -2.) el ;
  485. epsg = 'EXP' puig ;
  486. vp1 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  487. *
  488. 'SI' ('EGA' ikas 1) ;
  489. 'MESS' 'Valeurs propres distinctes' ;
  490. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  491. vp3 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  492. 'FINS' ;
  493. 'SI' ('EGA' ikas 2) ;
  494. 'MESS' 'Deux valeurs propres proches' ;
  495. vp2 = '*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) epsg ;
  496. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  497. eps = 'EXP' puin ;
  498. vp3 = vp2 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  499. 'FINS' ;
  500. 'SI' ('EGA' ikas 3) ;
  501. 'MESS' 'Trois valeurs propres proches' ;
  502. puin = 'ENTI' 'PROC' ('BRUI' 'BLAN' 'UNIF' lpre ('*' lpre -1.d0) el) ;
  503. eps = 'EXP' puin ;
  504. vp2 = vp1 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  505. vp3 = vp1 '+' ('*' ('BRUI' 'BLAN' 'UNIF' 0. 1. el) (eps '*' epsg)) ;
  506. 'FINS' ;
  507. * Les plus grandes valeurs dans d1, les plus petites dans d3, les autres au milieu
  508. m12 = 'MASQ' vp1 'EGSUPE' vp2 ; m21 = 1. '-' m12 ;
  509. m23 = 'MASQ' vp2 'EGSUPE' vp3 ; m32 = 1. '-' m23 ;
  510. m13 = 'MASQ' vp1 'EGSUPE' vp3 ; m31 = 1. '-' m13 ;
  511. * Pour trouver ces formules, on a énuméré les cas et utilisé le fait que le ET logique est la multiplication
  512. * Plus grandes valeurs
  513. d1vp1 = m12 '*' m13 ; d1vp2 = m21 '*' m23 ; d1vp3 = m31 '*' m32 ;
  514. * Plus petites valeurs
  515. d3vp1 = m21 '*' m31 ; d3vp2 = m12 '*' m32 ; d3vp3 = m13 '*' m23 ;
  516. *
  517. d2vp1 = 1. '-' (d1vp1 '+' d3vp1) ;
  518. d2vp2 = 1. '-' (d1vp2 '+' d3vp2) ;
  519. d2vp3 = 1. '-' (d1vp3 '+' d3vp3) ;
  520. *
  521. d1 = ('*' d1vp1 vp1) '+' ('*' d1vp2 vp2) '+' ('*' d1vp3 vp3) ;
  522. d1 = 'NOMC' 'SI11' d1 'NATURE' 'DIFFUS' ;
  523. d2 = ('*' d2vp1 vp1) '+' ('*' d2vp2 vp2) '+' ('*' d2vp3 vp3) ;
  524. d2 = 'NOMC' 'SI22' d2 'NATURE' 'DIFFUS' ;
  525. d3 = ('*' d3vp1 vp1) '+' ('*' d3vp2 vp2) '+' ('*' d3vp3 vp3) ;
  526. d3 = 'NOMC' 'SI33' d3 'NATURE' 'DIFFUS' ;
  527. *
  528. * Génération d'une matrice de rotation quelconque
  529. * Algo III.4 Graphics Gems III par James Arvo (1995)
  530. *
  531. theta = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  532. phi = 'BRUI' 'BLAN' 'UNIF' 0. 180. el ;
  533. zed = 'BRUI' 'BLAN' 'UNIF' 0.5 0.5 el ;
  534. * Rotation autour de l'axe z
  535. ct = 'COS' theta ; st = 'SIN' theta ; mst = st '*' -1. ;
  536. trz = 'TABL' ;
  537. trz . 1 = 'TABL' ;
  538. trz . 1 . 1 = ct ; trz . 1 . 2 = st ; trz . 1 . 3 = 0. ;
  539. trz . 2 = 'TABL' ;
  540. trz . 2 . 1 = mst ; trz . 2 . 2 = ct ; trz . 2 . 3 = 0. ;
  541. trz . 3 = 'TABL' ;
  542. trz . 3 . 1 = 0. ; trz . 3 . 2 = 0. ; trz . 3 . 3 = 1. ;
  543. * Matrice de Householder H = 2 vvt - I
  544. cp = 'COS' phi ; sp = 'SIN' phi ; sqz = '**' zed 0.5 ; msqz = '**' (1. '-' zed) 0.5 ;
  545. v1 = cp '*' sqz ; v2 = sp '*' sqz ; v3 = msqz ;
  546. th = 'TABL' ;
  547. th . 1 = 'TABL' ;
  548. th . 1 . 1 = 2. '*' v1 '*' v1 '-' 1. ; th . 1 . 2 = 2. '*' v1 '*' v2 ; th . 1 . 3 = 2. '*' v1 '*' v3 ;
  549. th . 2 = 'TABL' ;
  550. th . 2 . 1 = th . 1 . 2 ; th . 2 . 2 = 2. '*' v2 '*' v2 '-' 1. ; th . 2 . 3 = 2. '*' v2 '*' v3 ;
  551. th . 3 = 'TABL' ;
  552. th . 3 . 1 = th . 1 . 3 ; th . 3 . 2 = th . 2 . 3 ; th . 3 . 3 = 2. '*' v3 '*' v3 '-' 1. ;
  553. * Le produit de H et R
  554. vdim = 'VALE' 'DIME' ;
  555. charot = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  556. 'REPE' ij vdim ;
  557. j = &ij ;
  558. 'REPE' ik vdim ;
  559. k = &ik ;
  560. ngjk = 'CHAI' 'CO' j k ;
  561. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  562. 'REPE' ii vdim ;
  563. i = &ii ;
  564. gjk = gjk '+' (th . j . i '*' trz . i . k) ;
  565. 'FIN' ii ;
  566. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  567. charot = charot 'ET' gjk ;
  568. 'FIN' ik ;
  569. 'FIN' ij ;
  570. * Vérif tenseur de rotation
  571. ltens = ttensrot charot tolrot ;
  572. lok = lok 'ET' ltens ;
  573. 'SI' ('NON' ltens) ;
  574. 'MESS' '!!! Test tenseur de rotation not ok' ;
  575. 'SINO' ;
  576. 'MESS' 'Test tenseur de rotation OK' ;
  577. 'FINS' ;
  578. vprot = d1 'ET' d2 'ET' d3 'ET' charot ;
  579. *dbg mpn6 = 'MANU' 'POI1' ('NOEU' 6) ;
  580. *dbg vprot = 'REDU' vprot mpn6 ;
  581. *dbg d1 = 'REDU' d1 mpn6 ;
  582. *dbg d2 = 'REDU' d2 mpn6 ;
  583. *dbg d3 = 'REDU' d3 mpn6 ;
  584. * Rotation de la matrice diagonale des vps
  585. cha = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  586. 'REPE' ij vdim ;
  587. j = &ij ;
  588. 'REPE' ik j ;
  589. k = &ik ;
  590. ngjk = 'CHAI' 'G' j k ;
  591. gjk = 'VIDE' 'CHPOINT'/'DIFFUS' ;
  592. 'REPE' ii vdim ;
  593. i = &ii ;
  594. nqji = 'CHAI' 'CO' i j ;
  595. nli = 'CHAI' 'SI' i i ;
  596. nqik = 'CHAI' 'CO' i k ;
  597. qji = 'EXCO' vprot nqji ;
  598. li = 'EXCO' vprot nli ;
  599. qik = 'EXCO' vprot nqik ;
  600. gjk = gjk '+' (qji '*' li '*' qik) ;
  601. 'FIN' ii ;
  602. gjk = 'NOMC' ngjk gjk 'NATURE' 'DIFFUS' ;
  603. cha = cha 'ET' gjk ;
  604. 'FIN' ik ;
  605. 'FIN' ij ;
  606. *
  607. * Décomposition spectrale
  608. *
  609. decb = 'TENS' 'PRIN' cha ;
  610. * Seulement les vp
  611. decbb = 'TENS' 'VALP' cha ;
  612. decbr = 'EXCO' ('MOTS' 'SI11' 'SI22' 'SI33') decb ;
  613. ddecb = ERRCHPOR decbb decbr ;
  614. legvp = '<' ('MAXI' ddecb 'ABS') ('VALE' 'PREC') ;
  615. lok = lok 'ET' legvp ;
  616. 'SI' ('NON' legvp) ;
  617. 'MESS' '!!! Test valeurs propres egales not ok' ;
  618. 'SINO' ;
  619. 'MESS' 'Test valeurs propres egales OK' ;
  620. 'FINS' ;
  621. decc = 'EXCO' ('MOTS' 'CO11' 'CO12' 'CO13' 'CO21' 'CO22' 'CO23' 'CO31' 'CO32' 'CO33') decb ;
  622. *
  623. ltens = ttensrot decc tolrot ;
  624. lok = lok 'ET' ltens ;
  625. 'SI' ('NON' ltens) ;
  626. 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ;
  627. 'SINO' ;
  628. 'MESS' 'Test vecteurs propres orthonormaux OK' ;
  629. 'FINS' ;
  630. lvect = tvectp cha decb tolvecp ;
  631. 'SI' ('NON' lvect) ;
  632. 'MESS' '!!! Test vecteurs propres not ok' ;
  633. 'SINO' ;
  634. 'MESS' 'Test vecteurs propres OK' ;
  635. 'FINS' ;
  636. *
  637. chab = 'TENS' 'RECO' decb ;
  638. d1b = 'EXCO' 'SI11' decb 'SI11' ;
  639. d2b = 'EXCO' 'SI22' decb 'SI22' ;
  640. d3b = 'EXCO' 'SI33' decb 'SI33' ;
  641. * Test valeurs propres
  642. dd1 = 'NOMC' 'SCAL' ('ABS' ('-' d1 d1b)) ;
  643. mdd1 = 'MASQ' dd1 'INFERIEUR' ('*' tol epsg) ;
  644. mmdd1 = 'MINI' mdd1 ;
  645. tdd1 = '>' mmdd1 0. ;
  646. lok = lok 'ET' tdd1 ;
  647. 'SI' ('NON' tdd1) ; 'MESS' '!!! Calcul valp1' ; 'FINS' ;
  648. dd2 = 'NOMC' 'SCAL' ('ABS' ('-' d2 d2b)) ;
  649. mdd2 = 'MASQ' dd2 'INFERIEUR' ('*' tol epsg) ;
  650. mmdd2 = 'MINI' mdd2 ;
  651. tdd2 = '>' mmdd2 0. ;
  652. lok = lok 'ET' tdd2 ;
  653. 'SI' ('NON' tdd2) ; 'MESS' '!!! Calcul valp2' ; 'FINS' ;
  654. dd3 = 'NOMC' 'SCAL' ('ABS' ('-' d3 d3b)) ;
  655. mdd3 = 'MASQ' dd3 'INFERIEUR' ('*' tol epsg) ;
  656. mmdd3 = 'MINI' mdd3 ;
  657. tdd3 = '>' mmdd3 0. ;
  658. lok = lok 'ET' tdd3 ;
  659. 'SI' ('NON' tdd3) ; 'MESS' '!!! Calcul valp3' ; 'FINS' ;
  660. * Test recomposition matrice
  661. tolreco = tolrec3d ;
  662. dcha = 'TENS' 'NORMINF' ('-' chab cha) ;
  663. mdcha = 'MASQ' dcha 'INFERIEUR' ('*' tolreco epsg) ;
  664. mmdcha = 'MINI' mdcha ;
  665. tdcha = '>' mmdcha 0. ;
  666. lok = lok 'ET' tdcha ;
  667. 'SI' ('NON' tdcha) ; 'MESS' '!!! Calcul recomposition' ; 'FINS' ;
  668. 'SI' lok ; 'MESS' 'OK' ; 'SINO' ; 'ERRE' stop ; 'FINS' ;
  669. 'FIN' iikas ;
  670. *
  671. 'SI' ('NON' lok) ;
  672. 'MESSAGE' ('CHAINE' 'Il y a eu des erreurs') ;
  673. 'ERREUR' 5 ;
  674. 'SINON' ;
  675. 'MESSAGE' ('CHAINE' 'Tout sest bien passe !') ;
  676. 'FINSI' ;
  677. *
  678. 'SI' interact ;
  679. 'OPTION' 'ECHO' 1 'DONN' 5 ;
  680. 'FINSI' ;
  681. *
  682. * End of dgibi file TENS2
  683. *
  684. 'FIN' ;
  685.  
  686.  
  687.  

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