krig
C KRIG SOURCE FD218221 25/09/03 21:15:02 12354 SUBROUTINE KRIG C Typages implicites habituels IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C Les includes necessaires -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMLMOTS -INC SMLREEL -INC SMEVOLL -INC SMELEME -INC SMCHPOI -INC SMTABLE C Un segment pour stocker les donnees C NC : nombre de coordonnees des points C MM : nombre de points de mesure C NN : nombre de points cibles C MCOO(i,k) : k-eme coordonnee du i-eme point de mesure C MVAL(i,1) : valeur fonction au i-eme point de mesure C CCOO(j,k) : k-eme coordonnee du j-eme point cible C DM(i1,i2) : distance entre les points de mesure i1 et i2 C DC(i,j) : distance entre le point de mesure i et le point cible j C VM(i1,i2) : variance (ou covariance) entre les points de mesure i1 et i2 C la derniere ligne est (1 1 1 ... 1 0) pour assurer le krigeage ordinaire C VC(i,j) : Avant appel a DGESV : variance (ou covariance) entre le points mesure i C et point cible j la derniere ligne est (1 1 1 ... 1) C pour assurer le krigeage ordinaire C Apres appel a DGESV : poids d'interpolation pour la i-eme mesure C pour interpoler au j-eme point cible C la derniere contient les multiplicateurs de Lagrange C pour assurer le krigeage ordinaire SEGMENT SKRIG REAL*8 MCOO(MM,NC) REAL*8 MVAL(MM,1) REAL*8 CCOO(NN,NC) REAL*8 DM(MM,MM) REAL*8 DC(MM,NN) REAL*8 VM(MM+1,MM+1) REAL*8 VC(MM+1,NN) REAL*8 WC(MM+1,NN) INTEGER IPIV(MM+1) ENDSEGMENT C Quelques SEGMENTs LISTREEL POINTEUR MLREE4.MLREEL C Quelques objets utiles PARAMETER(XUN=1.D0) CHARACTER*8 TYPOBJ LOGICAL BVALE C----------------------------------------------------------------------C C ACQUISITION DES DONNEES D'ENTREE UTILISATEUR C C----------------------------------------------------------------------C C La table (ITAB) IF(IERR.NE.0) RETURN C Noms des dimensions (LISTMOTS : MLMOT1) & 'LISTMOTS',IVALE,XVALE,' ',BVALE,MLMOT1) IF (IERR.NE.0) GOTO 999 SEGACT MLMOT1 C Mesures (CHPOINT : MCHPO1) & 'CHPOINT',IVALE,XVALE,' ',BVALE,MCHPO1) IF (IERR.NE.0) GOTO 999 SEGACT MCHPO1 C Maillage de POI1 support des mesures (IPT1) CALL EXTR21(MCHPO1,1,IPT1) C Nombre de points de mesure (M) M=IPT1.NUM(/2) C Nom de la composante a kirger (MOT : COMP) IF (IERR.NE.0) GOTO 999 C Cibles (CHPOINT : MCHPO2) & 'CHPOINT ',IVALE,XVALE,' ',BVALE,MCHPO2) IF (IERR.NE.0) GOTO 999 SEGACT MCHPO2 C Maillage de POI1 support des cibles (IPT2) CALL EXTR21(MCHPO2,1,IPT2) C Nombre de points cibles (N) N=IPT2.NUM(/2) C Variogramme ? (IVAR=1) ou covariogramme ? (IVAR=2) (EVOLUTIO : MEVOL1) IVAR=0 TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,' ',BVALE,MEVOL1) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'EVOLUTIO') THEN IVAR=1 ELSE & IOIND,TYPOBJ,IVALE,XVALE,' ',BVALE,MEVOL1) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'EVOLUTIO') THEN IVAR=2 ELSE MOTERR(1:40)='VARIOGRAMME ou COVARIOGRAMME ' RETURN ENDIF ENDIF C Recuperation des 2 LISTREELs du variogramme/covariogramme SEGACT MEVOL1 KEVOL1=MEVOL1.IEVOLL(1) SEGACT KEVOL1 MLREE1=KEVOL1.IPROGX MLREE2=KEVOL1.IPROGY C Rangement des donnees dans un segment SKRIG MM=M NN=N SEGINI SKRIG DO K=1,NC DO I=1,MM IP1=IPT1.NUM(1,I) MCOO(I,K)=XFLOT ENDDO DO I=1,NN IP2=IPT2.NUM(1,I) CCOO(I,K)=XFLOT ENDDO ENDDO DO I=1,MM IP1=IPT1.NUM(1,I) MVAL(I,1)=XFLOT ENDDO C----------------------------------------------------------------------C C CALCUL DES DISTANCES C C----------------------------------------------------------------------C C Entre les points de mesure 2 a 2 DO I=1,MM DO J=I,MM C Distance euclidienne DIJ=XZERO DO K=1,NC XI=MCOO(I,K) XJ=MCOO(J,K) DIJ=DIJ+((XI-XJ)**2) ENDDO DIJ=SQRT(DIJ) DM(I,J)=DIJ DM(J,I)=DIJ ENDDO ENDDO C Entre les points cibles et les points de mesure DO I=1,MM DO J=1,NN C Distance euclidienne DIJ=XZERO DO K=1,NC XI=MCOO(I,K) XJ=CCOO(J,K) DIJ=DIJ+((XI-XJ)**2) ENDDO DIJ=SQRT(DIJ) DC(I,J)=DIJ ENDDO ENDDO C----------------------------------------------------------------------C C CALCUL DES (CO)VARIANCES : C C MATRICE ET VECTEURS SECOND MEMBRES C C----------------------------------------------------------------------C C Entre les points de mesure 2 a 2 DO I=1,MM DO J=I,MM DIJ=DM(I,J) C Interpolation depuis l'EVOLUTIO du variogramme/covariogramme IF (IRET.NE.1) GOTO 999 VM(I,J)=VIJ VM(J,I)=VIJ ENDDO ENDDO C Ajout d'une ligne pour imposer le krigeage ordinaire (somme des inconnues = 1) DO J=1,MM VM(MM+1,J)=XUN VM(J,MM+1)=XUN ENDDO VM(MM+1,MM+1)=XZERO C Entre les points cibles et les points de mesure DO I=1,MM DO J=1,NN DIJ=DC(I,J) C Interpolation depuis l'EVOLUTIO du variogramme/covariogramme IF (IRET.NE.1) GOTO 999 VC(I,J)=VIJ WC(I,J)=VIJ ENDDO ENDDO C Ajout d'une ligne pour imposer le krigeage ordinaire (somme des inconnues = 1) DO J=1,NN VC(MM+1,J)=XUN WC(MM+1,J)=XUN ENDDO C----------------------------------------------------------------------C C RESOLUTION DU SYSTEME LINEAIRE C C----------------------------------------------------------------------C C Resolution du systeme VM * WC = VC a l'aide du solveur de LAPACK C Sortie en cas d'erreur IF (INFO.NE.0) THEN PRINT*,'ERROR IN DGESV SOLVER, INFO=',INFO PRINT*,'CHECK THE LINEAR SYSTEM' RETURN ENDIF C----------------------------------------------------------------------C C INTERPOLATION LINEAIRE DES VALEURS AUX POINTS CIBLES C C----------------------------------------------------------------------C C Estimation de la fonction JG=NN SEGINI MLREE3 DO J=1,NN XVAL=XZERO DO I=1,MM XVAL=XVAL+(WC(I,J)*MVAL(I,1)) ENDDO ENDDO C Variance d'estimation JG=NN SEGINI MLREE4 DO J=1,NN C Si on a utilise les variances, produit scalaire simple IF (IVAR.EQ.1) THEN XVAL=XZERO DO I=1,MM+1 XVAL=XVAL+(WC(I,J)*VC(I,J)) ENDDO C Si on a utilise les covariances, petite soustraction a faire ELSEIF (IVAR.EQ.2) THEN IF (IRET.NE.1) GOTO 999 XVAL=XSIG DO I=1,MM+1 XVAL=XVAL-(WC(I,J)*VC(I,J)) ENDDO ENDIF ENDDO C----------------------------------------------------------------------C C ECRITURE DES RESULTATS C C----------------------------------------------------------------------C C Resultats sous forme de CHPOINT C Variance d'estimation CALL MANUCH SEGACT MCHPO4*MOD MCHPO4.JATTRI(1)=MCHPO2.JATTRI(1) C Estimation de la fonction CALL MANUCH SEGACT MCHPO3*MOD MCHPO3.JATTRI(1)=MCHPO2.JATTRI(1) C On fait le menage avant de partir SEGDES MLMOT1 SEGDES MEVOL1 SEGDES KEVOL1 SEGSUP MLREE3,MLREE4 SEGDES MCHPO1 SEGDES MCHPO2,MCHPO3,MCHPO4 C Et c'est fini ! RETURN C En cas d'erreur 999 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales