SUBROUTINE LL2pts(ALL,bndpts,lbdpts,XLONPT,YLATPT,IFIRST) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C . . . . C SUBPROGRAM: LL2pts INTERPOLATES FROM LL TO bnd points C PRGMMR: DEAVEN ORG: W/NMC22 DATE: 86-07-21 C C ABSTRACT: INTERPOLATES FROM LL TO boundary points C C PROGRAM HISTORY LOG: C 86-07-21 D DEAVEN C 88-09-21 B SCHMIDT ADDED THE DOCBLOCK C 90-07-02 G DiMego modified to interpolate to string C of lateral boundary points (NGM or ETA) C C USAGE: CALL LL2pts(ALL, bndpts) C $ lbdpts,XLONPT,YLATPT,IFIRST) C INPUT ARGUMENT LIST: C ALL - ARRAY OF source VALUES OF LL GRID C IFIRST - set to zero first-time-thru so that C weighting coefficients are recalculated C C OUTPUT ARGUMENT LIST: C bndpts - ARRAY OF target VALUES along boundary C C SUBPROGRAMS CALLED: C LIBRARY: C COMMON - /GRIDS/ C C ATTRIBUTES: C LANGUAGE: STANDARD FORTRAN C MACHINE: C C$$$ INCLUDE "parmlbc" COMMON /GRIDS/ ALAT( IMAX , JMAX ),ALON( IMAX , JMAX ) COMMON /WGTS/WIJ(KB),WIPJ(KB),WIJP(KB),WIPJP(KB), 1 KIJ(KB),KIPJ(KB),KIJP(KB),KIPJP(KB) DIMENSION XLONPT( KB ) DIMENSION YLATPT( KB ) DIMENSION ALL( IMAX , JMAX ),bndpts( KB ), 3 AIJ( KB ),AIPJ( KB ), 4 AIJP( KB ),AIPJP( KB ) IF ( IFIRST.NE.0 ) GO TO 100 IFIRST = IFIRST + 1 C********************************************************************** C FIRST COLLECT THE I,J POINTS ON THE LL GRID CORRESPONDING TO THE C bnd points (FOUR SETS OF THEM) FOR (I,J), (I+1,J), (I,J+1), AND C (I+1,J+1) C********************************************************************** DO 1 IJ = 1,lbdpts YY = YLATPT(IJ) XX = XLONPT(IJ) IF(XX.GE.360.0)XX = XX - 360.0 IF(XX.LT.0.0)XX = XX + 360.0 DO 2 KJ = 1, JMAX IF ( YY .GT. ALAT(1,KJ)) GO TO 2 JJ = KJ GO TO 3 2 CONTINUE JJ = JMAX 3 DO 4 KI = 1, IMAX IF( XX .LT. ALON(KI,JJ)) GO TO 4 II = KI GO TO 5 4 CONTINUE GO TO 9876 5 CONTINUE IF(II.EQ.1)GO TO 9876 IIP1 = II II = II - 1 GO TO 9874 C these statements will treat interpolation as cyclic east-to-west 9876 IIP1 = 1 II = IMAX 9874 CONTINUE JJ = MAX(1,JJ-1) ALIPJ = ALON(IIP1,JJ) ALIPJP = ALON(IIP1,JJ+1) IF(IIP1.EQ.1)ALIPJ = 360.0 - ALIPJ IF(IIP1.EQ.1)ALIPJP = 360.0 - ALIPJP KIJ(IJ) = (JJ-1) * IMAX + II KIPJ(IJ) = (JJ-1) * IMAX + IIP1 KIJP(IJ) = JJ * IMAX + II KIPJP(IJ) = JJ * IMAX + IIP1 X1 = ALIPJ - ALON(II,JJ) X2 = ALIPJP - ALON(II,JJ+1) Y1 = ALAT(II,JJ+1) - ALAT(II,JJ) Y2 = Y1 DX1 = (XX - ALON(II,JJ)) / X1 DXX1 = (ALIPJ - XX) / X1 DX2 = (XX - ALON(II,JJ+1)) / X2 DXX2 = (ALIPJP - XX) / X2 DY1 = (YY - ALAT(II,JJ)) / Y1 DYY1 = (ALAT(II,JJ+1) - YY) / Y1 DY2 = (YY - ALAT(II,JJ)) / Y2 DYY2 = (ALAT(II,JJ+1) - YY) / Y2 DX = 0.5 * (DX1 + DX2) DXX = 0.5 * (DXX1 + DXX2) DY = 0.5 * (DY1 + DY2) DYY = 0.5 * (DYY1 + DYY2) WIJ(IJ) = DXX * DYY WIPJ(IJ) = DX * DYY WIJP(IJ) = DXX * DY WIPJP(IJ) = DX * DY 1 CONTINUE 100 CONTINUE C********************************************************************* C ALL INDEX AND WEIGHT VECTORS HAVE BEEN COMPUTED ABOVE C NOW DO THE GATHER AND INTERPOLATION BELOW AT VECTOR SPEED C********************************************************************* DO 42 IQ2W6E=1,lbdpts IQ2W6F=KIJ(IQ2W6E) AIJ(IQ2W6E)=ALL(IQ2W6F,1) 42 CONTINUE DO 52 IQ2W6E=1,lbdpts IQ2W6F=KIPJ(IQ2W6E) AIPJ(IQ2W6E)=ALL(IQ2W6F,1) 52 CONTINUE DO 62 IQ2W6E=1,lbdpts IQ2W6F=KIJP(IQ2W6E) AIJP(IQ2W6E)=ALL(IQ2W6F,1) 62 CONTINUE DO 72 IQ2W6E=1,lbdpts IQ2W6F=KIPJP(IQ2W6E) AIPJP(IQ2W6E)=ALL(IQ2W6F,1) 72 CONTINUE DO 82 IQ2W6E=1,lbdpts bndpts(IQ2W6E)=WIJ(IQ2W6E)*AIJ(IQ2W6E)+ * WIPJ(IQ2W6E)*AIPJ(IQ2W6E)+ * WIJP(IQ2W6E)*AIJP(IQ2W6E)+ * WIPJP(IQ2W6E)*AIPJP(IQ2W6E) 82 CONTINUE RETURN END