Download iplnu2.eso

Back to the list

   1 : C IPLNU2    SOURCE    FANDEUR   11/07/19    21:16:12     7039           
   2 : 
   3 :         SUBROUTINE IPLNU2(INUA,ITR1,ITR2,MAX1,IVAL)
   4 : c
   5 : c fonction
   6 : c     cette sous routine interpole une fonction de n variables dont
   7 : c     certains couple (x,f(x)) on ete stockés dans un objet de type
   8 : c     nuage. On utilise une methode des elements diffus. En chaque 
   9 : c     point on cheche la forme lineaire qui minimise la distance ponderée 
  10 : c     de l'hyperplan plan au point du nuage. La valeur obtenue est 
  11 : c     celle de la forme lineaire au point considere.
  12 : c
  13 : c variables
  14 : c     inua pointeur sur l'objet de type nuage
  15 : c     itr1 pointeur sur le segment mtr1 de iplnu2.eso
  16 : c                   qui contient une correspondance entre la position
  17 : c                   des variables dans les tableua du nuage
  18 : c     itr2  pointeur sur le segment mtr2 qui contient les variables x
  19 : c                    dans xi et les valeurs f(x) dans yi
  20 : c     max1  pointeur sur l'objet qui contient le max des composantes du nuage
  21 : c
  22 : c appelé par iplnu2.eso
  23 : c date 05/07/94
  24 : c auteur A de Gayffier 
  25 : c langage fortran 77 + esope
  26 : c                                
  27 :       IMPLICIT INTEGER(I-N)
  28 :       IMPLICIT    REAL*8(A-H,O-Z) 
  29 :       PARAMETER ( GRAND = 1.D50) 
  30 : -INC CCOPTIO
  31 : -INC SMNUAGE
  32 :       SEGMENT MTR1
  33 :          INTEGER IADD(NNMM)
  34 :       ENDSEGMENT
  35 :       SEGMENT MTR2
  36 :          REAL*8  XI(NN),YI(MM)
  37 :       ENDSEGMENT
  38 :       SEGMENT MA 
  39 : *     ce segment contient la matrice du syteme lineaire
  40 : *     a contient les termes et indx contient les indices de permutation
  41 : *     une fois la decomposition effectuée 
  42 :          REAL*8 A(NN+1,NN+1),D
  43 :          INTEGER INDX(NN+1)
  44 :       ENDSEGMENT
  45 :       SEGMENT MB 
  46 :          REAL*8 B(NN+1,MM)
  47 :       ENDSEGMENT
  48 :       SEGMENT MDX
  49 :           REAL*8 DX(NN+1)
  50 :       ENDSEGMENT
  51 :       SEGMENT MDIS
  52 :           REAL*8 DIMINI(NN+1)
  53 :           INTEGER NNBCP(NN+1)
  54 :       ENDSEGMENT
  55 :       SEGMENT MAX1
  56 :           REAL*8 MAXV(NNMM)
  57 :       ENDSEGMENT
  58 : c
  59 : c   on active tous les segments necessaires
  60 : c
  61 :       MNUAGE = INUA   
  62 : c      SEGACT ,MNUAGE
  63 : c
  64 :       NVAR   = NUAPOI(/1)
  65 :       DO 10 I=1,NVAR 
  66 :         NUAVFL = NUAPOI(I)
  67 :         SEGACT ,NUAVFL
  68 :  10   CONTINUE
  69 : *
  70 :       NBCOUP = NUAFLO(/1)
  71 : *
  72 :       IF (NBCOUP .EQ. 0) THEN
  73 : *    nuage vide operation impossible
  73 :         CALL ERREUR(680)
  74 :         SEGDES ,MNUAGE
  75 :         RETURN
  76 :       ENDIF
  77 : *
  78 :       MTR1 = ITR1
  79 :       MTR2 = ITR2
  80 :       SEGACT MTR1,MTR2*MOD
  81 : c      SEGACT ,MAX1
  82 :       NN = XI(/1)
  83 :       MM = YI(/1)
  84 :       NNMM = IADD(/1)
  85 : c
  86 : c      IF ( NVAR .NE. (NN+MM)) THEN
  87 : c        write(ioimp,*) 'ERREUR DANS LA DIMENSION DES MTR'
  88 : c      ENDIF
  89 : c
  90 :       SEGINI ,MA,MB,MDIS
  91 : c    initialisation du tableau pour stocker les distances
  92 : *    on place des valeurs tres grandes
  93 :       DO 1 I=1,NN+1
  94 :         DIMINI(I)= GRAND
  95 :  1    CONTINUE
  96 : c
  97 : c   calcul de la distance cararctéristique du nuage
  98 : c
  99 :       DO 60 I=1,NBCOUP
 100 :         SUM = 0.D0
 101 :         DO 30 J=1,NN  
 102 :            NUAVFL = NUAPOI(IADD(J))
 103 : c        on divise les distances par les maximums de chaque composante
 104 :            DUM = (XI(J)-NUAFLO(I))/MAXV(IADD(J))
 105 :            SUM = SUM + DUM*DUM
 106 :  30     CONTINUE
 107 :         DIST = SQRT(SUM)
 108 : c   stockage des plus petites valeurs
 109 :         DO 50 J=1,NN+1
 110 :            IF ( DIST .LT. DIMINI(J) )THEN
 111 :              DO 40 K=NN+1,J+1,-1
 112 :                DIMINI(K)=DIMINI(K-1)
 113 :                NNBCP(K)=NNBCP(K-1)
 114 :  40          CONTINUE
 115 :              DIMINI(J)=DIST
 116 :              NNBCP(J)=I
 117 :              GOTO 60
 118 :            ENDIF
 119 :  50     CONTINUE
 120 :  60   CONTINUE
 121 : c
 122 :       DCARA =0.D0
 123 :       DO 65 J=1,NN+1
 124 :         DCARA = DCARA + DIMINI(J)
 125 :   65  CONTINUE
 126 :       DCARA = DCARA / (NN+1.D0)
 127 : c
 128 : c   affichage de mise au point avec opti impi 9022 ;
 129 : c
 130 :       IF (IIMPI .EQ. 9022) WRITE(6,1001) DCARA
 131 :       IF (IIMPI .EQ. 9022) THEN
 132 :            WRITE(ioimp,1002) (NN+1)
 133 :            write(ioimp,1005) (DIMINI(I),I=1,NN+1)
 134 : *               boucle sur les composantes
 135 :            DO 67 I=1,NN 
 136 :              NUAVFL = NUAPOI(IADD(I))              
 137 :              WRITE(ioimp,1004) NUANOM(IADD(I))
 138 :              write(ioimp,1003) (NUAFLO(NNBCP(J))/MAXV(IADD(I)),J=1,NN+1)
 139 :              WRITE(ioimp,*)
 140 :    67      CONTINUE
 141 :            DO 68 I=NN+1,NNMM
 142 :              NUAVFL = NUAPOI(IADD(I))              
 143 :              WRITE(ioimp,1004) NUANOM(IADD(I))
 144 :              write(ioimp,1003) (NUAFLO(NNBCP(J))/MAXV(IADD(I)),J=1,NN+1)
 145 :              WRITE(ioimp,*)
 146 :    68      CONTINUE
 147 :       ENDIF  
 148 :  1001 FORMAT('La distance caractéristique vaut ',G10.4)
 149 :  1002 FORMAT('Distance et coordonées des',1X,I2,1X,'points 
 150 :      &        les plus proches sont')
 151 :  1003 FORMAT(30(G10.4,1X))
 152 :  1004 FORMAT('Composante ',A)
 153 :  1005 FORMAT('Distance au point courant:',/,30(G10.4))
 154 : *
 155 :       SEGSUP ,MDIS
 156 : c
 157 : c On sort l'initialisation de ce segment de la boucle
 158 :       SEGINI MDX
 159 : c
 160 : c   boucle sur les points du nuage (nbcoup)
 161 : c
 162 :       DO 110 I=1,NBCOUP
 163 : c  
 164 : c     boucle sur les monomes du polynome d'interpolation (1,x,y,...)
 165 : c  remplissage complet de DX (segment MDX)
 166 :         DX(1)=1.D0
 167 :         SUM = 0.D0
 168 :         DO 70 J=2,(NN+1)  
 169 :            NUAVFL = NUAPOI(IADD(J-1))  
 170 : c        on divise les distances par les maximums de chaque composante
 171 :            DX(J)=(XI(J-1)-NUAFLO(I))/MAXV(IADD(J-1))
 172 :            SUM = SUM + DX(J)*DX(J)
 173 :  70     CONTINUE
 174 :         DIST = SQRT(SUM)
 175 : C
 176 : *  fonction de ponderation de la distance
 177 :         Z = DIST/DCARA
 178 :         IF (IVAL .EQ. 1 ) THEN
 179 :           WDED = 1.D0/(Z+1.D0)
 180 :         ELSE
 181 :           WDED = EXP(-Z*Z)
 182 :         ENDIF
 183 : c       remplissage de a et de b
 184 :         DO 100 J=1,(NN+1)
 185 :           r_z = WDED*DX(J)
 186 :           DO 80 K=1,(NN+1)
 187 : C*            A(J,K) = A(J,K) + WDED*DX(J) * DX(K)
 188 :               A(J,K) = A(J,K) + r_z * DX(K)
 189 :  80       CONTINUE
 190 :           DO 90 K=1,MM
 191 :               NUAVFL = NUAPOI(IADD(NN+K))
 192 : C*            B(J,K)=B(J,K) + WDED*DX(J)*NUAFLO(I)
 193 :               B(J,K)=B(J,K) + r_z * NUAFLO(I)
 194 :  90      CONTINUE
 195 : c
 196 :  100    CONTINUE
 197 : c
 198 :  110  CONTINUE
 199 : c
 200 :       SEGSUP,MDX
 201 : c
 202 : c  phase de resolution
 203 : c
 204 : c  on resoud a.x=b pp fois
 205 : c
 205 :        CALL IPLNU3(MA)
 206 : 
 207 :        DO 120 I=1,MM
 207 :          CALL IPLNU4(MA,MB,I)
 208 :  120   CONTINUE        
 209 : c
 210 : c   on replace le resultat dans mtr2
 211 : c   dans les B(*,I) sont stockees les dérivées partielles de la fonction
 212 : c
 213 :         DO 130 I=1,MM
 214 :           YI(I)=B(1,I)
 215 :  130    CONTINUE
 216 : c
 217 : c  on ferme et on détruit les segments activés
 218 : c
 219 :         DO 140 I=1,NVAR 
 220 :           NUAVFL = NUAPOI(I)
 221 :           SEGDES ,NUAVFL
 222 :  140    CONTINUE
 223 : c
 224 : c        SEGDES MNUAGE
 225 :         SEGSUP MA,MB
 226 : c
 227 :         RETURN
 228 :         END
 229 : 
 230 :  

© Cast3M 2003 - All rights reserved.
Disclaimer