SUBROUTINE inter_barx ( idatmax,xidat,fdat,imodmax,ximod,fmod ) c .... Auteurs : Robert Sadourny , P. Le Van ..... c IMPLICIT NONE c ---------------------------------------------------------- c INTERPOLATION BARYCENTRIQUE BASEE SUR LES AIRES c VERSION UNIDIMENSIONNELLE , EN LONGITUDE . c ---------------------------------------------------------- c c idat : indice du champ de donnees, de 1 a idatmax c imod : indice du champ du modele, de 1 a imodmax c fdat(idat) : champ de donnees (entrees) c fmod(imod) : champ du modele (sorties) c xidat(idat): abscisses des interfaces des mailles donnees c ximod(imod): abscisses des interfaces des mailles modele c ( L'indice 1 correspond a l'interface mailLE 1 / maille 2) c ( Les abscisses sont exprimes en degres) INTEGER idatmax, imodmax REAL xidat(idatmax),fdat(idatmax),ximod(imodmax),fmod(imodmax) c ... Variables locales ... REAL xxid(idatmax+1), xxd(idatmax+1), fdd(idatmax+1) REAL fxd(idatmax+1), xchan(idatmax+1), fdchan(idatmax+1) REAL xxim(imodmax) REAL x0,xim0,dx,dxm REAL chmin,chmax,pi INTEGER imod,idat,i,ichang,id0,id1,nid,idatmax1 pi = 2. * ASIN(1.) c ----------------------------------------------------- c REDEFINITION DE L'ORIGINE DES ABSCISSES c A L'INTERFACE OUEST DE LA PREMIERE MAILLE DU MODELE c ----------------------------------------------------- DO imod = 1,imodmax xxim(imod) = ximod(imod) ENDDO CALL minmax( imodmax,xxim,chmin,chmax) IF( chmax.LT.6.50 ) THEN c PRINT 3 c PRINT *,' conversion des longit. ximod (donnees en radians)' c , ,' en degres .' c PRINT 3 DO imod = 1, imodmax xxim(imod) = xxim(imod) * 180./pi ENDDO ENDIF xim0 = xxim(imodmax) - 360. DO imod = 1, imodmax xxim(imod) = xxim(imod) - xim0 ENDDO idatmax1 = idatmax +1 DO idat = 1, idatmax xxd(idat) = xidat(idat) ENDDO CALL minmax( idatmax,xxd,chmin,chmax) IF( chmax.LT.6.50 ) THEN c PRINT 3 c PRINT *,' conversion des longit. ximod (donnees en radians)' c , ,' en degres .' c PRINT 3 DO idat = 1, idatmax xxd(idat) = xxd(idat) * 180./pi ENDDO ENDIF DO idat = 1, idatmax xxd(idat) = AMOD( xxd(idat) - xim0, 360. ) fdd(idat) = fdat (idat) ENDDO c PRINT *,' xxd redef. origine abscisses ' c PRINT 2,(xxd(i),i=1,idatmax) DO i = 2, idatmax IF( ( xxd(i) - xxd(i-1)).LT.0. ) THEN ichang = i GO TO 5 ENDIF ENDDO GO TO 6 c c *** reorganisation des longitudes entre 0. et 360. degres **** c 5 nid = idatmax - ichang +1 DO i = 1, nid xchan (i) = xxd(i+ichang -1 ) fdchan(i) = fdd(i+ichang -1 ) ENDDO DO i=1,ichang -1 xchan (i+ nid) = xxd(i) fdchan(i+nid) = fdd(i) ENDDO DO i =1,idatmax xxd(i) = xchan(i) fdd(i) = fdchan(i) ENDDO 6 continue c ------------------------------------------------ c translation des champs de donnees par rapport c a la nouvelle origine, avec redondance de la c maille a cheval sur les bords c ----------------------------------------------- id0 = 0 id1 = 0 DO idat = 1, idatmax IF ( xxd( idatmax1- idat ).LT.360.) GO TO 10 id1 = id1 + 1 ENDDO 10 DO idat = 1, idatmax IF (xxd(idat).GT.0.) GO TO 20 id0 = id0 + 1 END DO 20 IF( id1.EQ.0 ) GO TO 30 DO idat = 1, id1 xxid(idat) = xxd(idatmax - id1 + idat) - 360. fxd (idat) = fdd(idatmax - id1 + idat) END DO DO idat = 1, idatmax - id1 xxid(idat + id1) = xxd(idat) fxd (idat + id1) = fdd(idat) END DO 30 IF(id0.EQ.0) GO TO 40 DO idat = 1, idatmax - id0 xxid(idat) = xxd(idat + id0) fxd (idat) = fdd(idat + id0) END DO DO idat = 1, id0 xxid (idatmax - id0 + idat) = xxd(idat) + 360. fxd (idatmax - id0 + idat) = fdd(idat) END DO GO TO 50 40 DO idat = 1, idatmax xxid(idat) = xxd(idat) fxd (idat) = fdd(idat) ENDDO 50 xxid(idatmax1) = xxid(1) + 360. fxd (idatmax1) = fxd(1) c ------------------------------------ c initialisation du champ du modele DO imod = 1, imodmax fmod(imod) = 0. END DO c PRINT *,' id0 id1 ',id0,id1 c PRINT *,' xxim apres translation ' c PRINT 2,(xxim(i),i=1,imodmax) c PRINT *,' xxid apres translation ' c PRINT 2,(xxid(i),i=1,idatmax) c --------------------------------------- c iteration x0 = xim0 dxm = 0. imod = 1 idat = 1 100 IF (xxim(imod).LT.xxid(idat)) THEN dx = xxim(imod) - x0 dxm = dxm + dx fmod(imod) = (fmod(imod) + dx * fxd(idat)) / dxm x0 = xxim(imod) dxm = 0. imod = imod + 1 IF (imod.LE.imodmax) GO TO 100 ELSE IF (xxim(imod).GT.xxid(idat)) THEN dx = xxid(idat) - x0 dxm = dxm + dx fmod(imod) = fmod(imod) + dx * fxd(idat) x0 = xxid(idat) idat = idat + 1 GO TO 100 ELSE dx = xxim(imod) - x0 dxm = dxm + dx fmod(imod) = (fmod(imod) + dx * fxd(idat)) / dxm x0 = xxim(imod) dxm = 0. imod = imod + 1 idat = idat + 1 IF (imod.LE.imodmax) GO TO 100 END IF 3 FORMAT(1x,70(1h-)) 2 FORMAT(1x,8f8.2) RETURN END