C                                                                               
C                                                                               
C     PROGRAM TO COMPUTE THE GEOID FROM THE GEM10 COEFFICIENTS                  
C                                                                               
C     INPUT: LAT1,LAT2 = MAXIMUM AND MINIMUM LATITUDE OF THE AREA               
C                        OF INTEREST (DEGREES)                                  
C            LON1,LON2 = MAXIMUM AND MINIMUM LONGITUDE OF THE AREA              
C                        OF INTEREST (DEGREES)                                  
C                  INT = GRID INTERVAL (IN DEGREES) ON WHICH GEOID              
C                        HEIGHTS ARE SOUGHT                                     
C                    N = DEGREE AND ORDER OF SPHERICAL HARMONIC                 
C                        EXPANSION                                              
C                                                                               
C     OUTPUT       UND = MATRIX OF GRID GEOID HEIGHTS                           
C                                                                               
C                                                                               
      IMPLICIT REAL*8 (A-H,O-Z)                                                 
C                                                                               
C   WORKSPACE ALLOCATION                                                        
C                                                                               
C     PN - IS A MATRIX OF DIMENSIONS (NE+1) X (NE+1) WHERE NE IS                
C          THE MAX DEGREE OF SPHERICAL HARMONIC EXPANSION(NE.GE.N)              
C          (CURRENTLY PN IS DIMENSIONED NROW X NROW, NROW=40)                   
C                                                                               
C     VC, VS -ARE VECTORS OF LENGTH .GE. (N+1)*(N+2)/2                          
C                                                                               
C     UND - IS A MATRIX OF SIZE LATR X LONR WHERE                               
C             LATR = (LAT1-LAT2)/INT   AND                                      
C             LONR = (LON1-LON2)/INT                                            
C           CURRENTLY UND IS DIMENSIONED (ILATR X ILONR) =(20 X 40)             
C                                                                               
C                                                                               
      DIMENSION PN(40,40)                                                       
      DIMENSION UND(20,40)                                                      
      DIMENSION VC(500),VS(500)                                                 
C                                                                               
C                                                                               
C   PARAMETERS                                                                  
C                                                                               
C      GM - GRAVITATIONAL CONSTANT                                              
C                                                                               
C       A - SEMI MAJOR AXIS OF THE ELLIPSOID IMPLIED BY THE                     
C          POTENTIAL COEFFICIENTS                                               
C                                                                               
C     FINV - CORRESPONDING FLATTENING (INVERSE)                                 
C                                                                               
C    GE,GP - GRAVITY AT EQUATOR AND POLES                                       
C                                                                               
C      RJ2 - SECOND ZONAL HARMONIC OF THE GEOPOTENTIAL                          
C                                                                               
C                                                                               
      DATA GM/3.986005D14/ , A/6378140.D0/ , FINV/298.257D0/,                   
     #   GE/9.7803/,GP/9.8322/,DR/0.017453293D0/                                
      DATA RJ2/1082.63D0/                                                       
      ILATR=20                                                                  
      NROW=40                                                                   
C                                                                               
      READ(5,8) LAT1,LAT2,LON1,LON2,INT,N                                       
    8 FORMAT(6I4)                                                               
        NP1=N+1                                                                 
      IDP1=NP1                                                                  
       LATR=(LAT1-LAT2)/INT                                                     
      LONR=(LON1-LON2)/INT                                                      
C                                                                               
      F = 1./FINV                                                               
      E2 = 2.*F - F**2                                                          
      B = A*(1.-F)                                                              
C                                                                               
      ID=IDP1-1                                                                 
      NCOL=ID                                                                   
      LMAX=ID                                                                   
C                                                                               
C                                                                               
C     READ POTENTIAL COEFFICIENTS FROM DISK UNIT 8 (ZONAL POTENTIAL             
C     COEFFICIENTS ARE READ FIRST, FOLLOWED BY THE TESSERAL AND                 
C     SECTORIAL ONES).                                                          
C                                                                               
C                                                                               
      LENGTH=IDP1*(IDP1+1)/2                                                    
      READ(8) IDP1,LENGTH,(VC(I),I=1,IDP1)                                      
      DO 10 I=1,IDP1                                                            
   10 VS(I)=0.                                                                  
      IDP11=IDP1+1                                                              
      READ(8) (VC(I),I=IDP11,LENGTH)                                            
      READ(8) (VS(I),I=IDP11,LENGTH)                                            
       WRITE(6,100) (VC(I),VS(I),I=1,LENGTH)                                    
  100 FORMAT(2F20.5)                                                            
C                                                                               
C                                                                               
C   COMPUTE THE FIRST THREE NORMALIZED EVEN ZONAL HARMONICS OF THE              
C   NORMAL GRAVITATIONAL FIELD                                                  
      XJN2 = -RJ2/DSQRT(5.D0)                                                   
      XJN4 = (E2**2/35.D0)*(10.D0*RJ2/E2-1.D0)                                  
      XJN6 = -(E2**3/21.D0)*(15.D0*RJ2/E2-2.D0)/DSQRT(13.D0)                    
C                                                                               
C                                                                               
C     SUBTRACT THE NORMAL POTENTIAL FROM THE GEOPOTENTIAL                       
C     IN ORDER TO OBTAIN THE DISTURBING POTENTIAL.                              
C                                                                               
      VC(3) = VC(3) - XJN2                                                      
      VC(5) = VC(5) - XJN4                                                      
      VC(7) = VC(7) - XJN6                                                      
C                                                                               
      LATST=1                                                                   
      IF(LAT1.EQ.90) LATST=2                                                    
      DO 20 LAT=LATST,LATR                                                      
      LATD=(LAT1-(LAT-1)*INT)                                                   
      XLAT=(LAT1-(LAT-1)*INT)*DR                                                
      XLATG =DATAN((1.D0-E2)*DTAN(XLAT))                                        
      IF(LAT.EQ.1 .OR. LAT.EQ.LATR) XLATG = XLAT                                
      PHI = XLATG/DR                                                            
      CF = DCOS(PHI*DR)                                                         
      SF = DSIN(PHI*DR)                                                         
C                                                                               
C                                                                               
C     COMPUTE NORMAL GRAVITY FROM SOMIGLIANA'S FORMULA                          
C                                                                               
C                                                                               
      GAMMA=(A*GE*CF**2+B*GP*SF**2)/DSQRT(A**2*CF**2+B**2*SF**2)                
      R = A/DSQRT(1.+E2*SF**2/(1.-E2))                                          
      CALL LEGDRE(1,PHI,PN,NROW,NP1)                                            
      DO 21 LON = 1,LONR                                                        
      LOND = LON2 + (LON-1)*INT                                                 
      XLAMDA = DFLOAT(LON2) + (LON-1)*DFLOAT(INT)                               
      SUM = 0.                                                                  
      DO 16 L=2,LMAX                                                            
      SUM1 = 0.                                                                 
      L1 = L + 1                                                                
      DO 15 MM = 1,L1                                                           
      M = MM - 1                                                                
      M1 = MM                                                                   
      LC = (2*(NCOL+1)-M1)*(M1-1)/2 + L1                                        
      C = VC(LC)                                                                
      S = VS(LC)                                                                
      SUM1=SUM1+(C*DCOS(M*XLAMDA*DR)+S*DSIN(M*XLAMDA*DR))*PN(L1,M1)             
   15 CONTINUE                                                                  
      SUM=SUM+(A/R)**L*SUM1*1.D-6                                               
   16 CONTINUE                                                                  
      GEOIDH = (GM/(GAMMA*R))*SUM                                               
      WRITE(6,1000) LATD,LOND,GEOIDH                                            
 1000 FORMAT(5X,'LAT. = ',I6,'  LONG. = ',I6,'  GEOID HT. = ',F8.4,/)           
      UND(LAT,LON) = GEOIDH                                                     
   21 CONTINUE                                                                  
   20 CONTINUE                                                                  
      CALL MOUTD(UND,ILATR,LAT,LON)                                             
      N1=1                                                                      
      N2=10                                                                     
      IF(N2.GT.LON) N2=LON                                                      
   45 CONTINUE                                                                  
      DO 30 I = 1,LAT                                                           
  30  WRITE(6,200) (UND(I,J),J=N1,N2)                                           
  200 FORMAT(//,10F12.5)                                                        
      WRITE(6,201)                                                              
  201 FORMAT(///)                                                               
      IF(N2.EQ.LON) GO TO 50                                                    
      N1=N2+1                                                                   
      N2=N2+10                                                                  
      IF(N2.GT.LON) N2=LON                                                      
      GO TO 45                                                                  
   50 STOP                                                                      
      END                                                                       
