krig
C KRIG SOURCE FD218221 25/12/09 21:15:03 12416 SUBROUTINE KRIG C C Operateur KRIG (krigeage) C Effectue un krigeage ordinaire pour interpoler une fonction C sur des points cibles, a partir de valeurs sur des points de mesure 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 avec une ligne supplementaire (1 1 1 ... 1 0) pour assurer le krigeage ordinaire C VC(i,j) : Avant appel a DGESV : variance (ou covariance) entre le point mesure i C et le point cible j C la derniere ligne est (1 1 1 ... 1) pour 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 ligne contient les multiplicateurs de Lagrange C pour 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 nombres/objets utiles PARAMETER(XUN=1.D0,DEUX=2.D0) PARAMETER(XNOR=XPI/180.D0) CHARACTER*11 MDIST CHARACTER*8 TYPOBJ LOGICAL BVALE C----------------------------------------------------------------------C C ACQUISITION DES DONNEES D'ENTREE UTILISATEUR C C----------------------------------------------------------------------C C La table (ITB) IF(IERR.NE.0) RETURN C Donne t'on une distance ? C IDIST=1 : Euclidienne (defaut) C IDIST=2 : Spherique C IDIST=3 : Cylindrique (a faire ...) IDIST=1 TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MDIST,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'MOT ') THEN IF (MDIST.EQ.'EUCLIDIENNE') THEN IDIST=1 ELSEIF(MDIST.EQ.'SPHERIQUE') THEN IDIST=2 C Donne t'on un rayon de sphere ? TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,' ',BVALE,IOVALE) IF (TYPOBJ.EQ.'FLOTTANT') THEN RAYON=XVALE ELSE RAYON=1.D0 ENDIF ENDIF ELSE IDIST=1 ENDIF C Noms des dimensions (LISTMOTS : MLMOT1) C Si distance spherique, on impose la liste 'LONG','LATI' IF (IDIST.EQ.2) THEN JGN=4 JGM=2 SEGINI MLMOT1 C Pour les autres distances, acquisition obligatoire d'un LISTMOT ELSE & 'LISTMOTS',IVALE,XVALE,' ',BVALE,MLMOT1) IF (IERR.NE.0) GOTO 999 SEGACT MLMOT1 ENDIF 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 C Nombre de mesures MM=M C Nombre de cibles NN=N C Nombre de coordonnees SEGINI SKRIG C Remplissage des coordonnees des points (mesures/cibles) DO K=1,NC DO I=1,MM C Si les mesures sont fournies sous forme de CHPOINT IP1=IPT1.NUM(1,I) MCOO(I,K)=XFLOT ENDDO DO I=1,NN C Si les cibles sont fournies sous forme de CHPOINT IP2=IPT2.NUM(1,I) CCOO(I,K)=XFLOT ENDDO ENDDO C Remplissage des valeurs de la fonction a kriger DO I=1,MM C Si les mesures sont fournies sous forme de CHPOINT 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 IF (IDIST.EQ.1) THEN DIJ=XZERO DO K=1,NC XI=MCOO(I,K) XJ=MCOO(J,K) DIJ=DIJ+((XI-XJ)**2) ENDDO DIJ=SQRT(DIJ) C Distance sur une sphere (formule de haversine pour calculer C la distance sur une sphere avec les angles de longitude et latitude) ELSEIF (IDIST.EQ.2) THEN XLONGI=XNOR*MCOO(I,1) XLATII=XNOR*MCOO(I,2) XLONGJ=XNOR*MCOO(J,1) XLATIJ=XNOR*MCOO(J,2) DIJ=DEUX*RAYON*ASIN(SQRT( & ((SIN((XLATII-XLATIJ)/DEUX))**2)+ & (COS(XLATII)*COS(XLATIJ)* & ((SIN((XLONGI-XLONGJ)/DEUX))**2)) )) ENDIF 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 IF (IDIST.EQ.1) THEN DIJ=XZERO DO K=1,NC XI=MCOO(I,K) XJ=CCOO(J,K) DIJ=DIJ+((XI-XJ)**2) ENDDO DIJ=SQRT(DIJ) C Distance sur une sphere (formule de haversine pour calculer C la distance sur une sphere avec les angles de longitude et latitude) ELSEIF (IDIST.EQ.2) THEN XLONGI=XNOR*MCOO(I,1) XLATII=XNOR*MCOO(I,2) XLONGJ=XNOR*CCOO(J,1) XLATIJ=XNOR*CCOO(J,2) DIJ=DEUX*RAYON*ASIN(SQRT( & ((SIN((XLATII-XLATIJ)/DEUX))**2)+ & (COS(XLATII)*COS(XLATIJ)* & ((SIN((XLONGI-XLONGJ)/DEUX))**2)))) ENDIF 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