C----------------------------------------------------------------------- SUBROUTINE SPTGPMD(IROMB,MAXWV,KMAX,MI,MJ, & KWSKIP,KGSKIP,NISKIP,NJSKIP, & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C C SUBPROGRAM: SPTGPMD TRANSFORM SPECTRAL TO MERCATOR GRADIENTS C PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-02-29 C C ABSTRACT: THIS SUBPROGRAM PERFORMS A SPHERICAL TRANSFORM C FROM SPECTRAL COEFFICIENTS OF SCALAR FIELDS C TO GRADIENT FIELDS ON A MERCATOR GRID. C THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. C THE WAVE AND GRID FIELDS MAY HAVE GENERAL INDEXING, C BUT EACH WAVE FIELD IS IN SEQUENTIAL 'IBM ORDER', C I.E. WITH ZONAL WAVENUMBER AS THE SLOWER INDEX. C THE MERCATOR GRID IS IDENTIFIED BY THE LOCATION C OF ITS FIRST POINT AND BY ITS RESPECTIVE INCREMENTS. C THE TRANSFORMS ARE ALL MULTIPROCESSED OVER SECTOR POINTS. C TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. C C PROGRAM HISTORY LOG: C 96-02-29 IREDELL C 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED C C USAGE: CALL SPTGPMD(IROMB,MAXWV,KMAX,MI,MJ, C & KWSKIP,KGSKIP,NISKIP,NJSKIP, C & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM) C INPUT ARGUMENTS: C IROMB - INTEGER SPECTRAL DOMAIN SHAPE C (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) C MAXWV - INTEGER SPECTRAL TRUNCATION C KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. C MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION C MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION C KWSKIP - INTEGER SKIP NUMBER BETWEEN WAVE FIELDS C (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0) C KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS C (DEFAULTS TO MI*MJ IF KGSKIP=0) C NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS C (DEFAULTS TO 1 IF NISKIP=0) C NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS C (DEFAULTS TO MI IF NJSKIP=0) C RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES C RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES C DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT C D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX. C DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD. C (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI, C THE LATITUDE INCREMENT DLAT IS DETERMINED AS C DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) C WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS) C DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT C D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX. C DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD. C WAVE - REAL (*) WAVE FIELDS C OUTPUT ARGUMENTS: C XM - REAL (*) MERCATOR X-GRADIENTS C YM - REAL (*) MERCATOR Y-GRADIENTS C C SUBPROGRAMS CALLED: C SPWGET GET WAVE-SPACE CONSTANTS C SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE C SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR C C ATTRIBUTES: C LANGUAGE: FORTRAN 77 C C$$$ REAL WAVE(*),XM(*),YM(*) REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C CALCULATE PRELIMINARY CONSTANTS CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 MDIM=2*MX+1 KW=KWSKIP IF(KW.EQ.0) KW=2*MX C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C CALCULATE GRADIENTS C$OMP PARALLEL DO PRIVATE(KWS) DO K=1,KMAX KWS=(K-1)*KW CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),1) WZ(1:2*MX,K)=0. ENDDO CALL SPTGPMV(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, & RLAT1,RLON1,DLAT,DLON,WD,WZ,XM,YM) C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - END