SUBROUTINE SZGRDM(KFILDO,P,NX,NY, 1 MESHIN,MESHOUT,ITRPLQ,ND2X3) C C JUNE 2006 GLAHN MDL MOS-2000 C MODIFIED FROM SZGRID C JULY 2007 GLAHN ADDED CHECK FOR RATIO BEING A C FACTOR OF 2 AT DO 150 C SEPTEMBER 2007 GLAHN MODIFIED /D DIAGNOSTIC AT 149 C MARCH 2008 COSGROVE ADDED COMMA TO FORMAT 155 FOR IBM C JUNE 2014 GLAHN INSERTED CALL TO W3TAGE BEFORE STOPS C NOVEMBER 2014 GLAHN REVISED W3TAG PER JUDY C C PURPOSE C TO INTERPOLATE OR THIN A GRID SO THAT IT FITS WITHIN C THE SAME AREA, BUT WITH A DIFFERENT MESH LENGTH. THE C NEW GRID DIMENSIONS ARE RETURNED. THE DIFFERENCE C BETWEEN THIS SZGRDM AND SZGRID IS THAT SZGRDM ACCOUNTS C FOR MISSING VALUES AND SZGRID DOES NOT. C C**************** C NOTE: DENSRX HAS NOT BEEN CONVERTED TO HANDLE MISSINGS. C THIS WILL LIKELY NOT BE NEEDED. IF IT IS, USE C DENSRQ TO START. C**************** C C DATA SET USE C KFILDO - UNIT NUMBER OF OUTPUT (PRINT) FILE. (OUTPUT) C C VARIABLES C C KFILDO = UNIT NUMBER OF OUTPUT (PRINT) FILE. (INPUT) C P(IX,JY) = THE INPUT AND OUTPUT GRIDS. C THE INPUT WILL BE OF SIZE NXIN, NYIN, WITH C NOMINAL MESH LENGTH MESHIN. C THE OUTPUT WILL BE OF SIZE NXOUT, NYOUT, WITH C NOMINAL MESH LENGTH MESHOUT. C (INPUT/OUTPUT) C NX = SIZE OF THE INPUT GRID IN NX DIRECTION ON C INPUT; THE SIZE OF THE OUTPUT GRID ON C OUTPUT. (INPUT/OUTPUT) C NY = SIZE OF THE INPUT GRID IN NY DIRECTION ON C INPUT; THE SIZE OF THE OUTPUT GRID ON C OUTPUT. (INPUT/OUTPUT) C MESHIN = NOMINAL MESH LENGTH OF INPUT GRID ON INPUT C AND OF OUTPUT GRID ON OUTPUT. (INPUT/OUTPUT) C MESHOUT = NOMINAL MESH LENGTH OF OUTPUT GRID. (INPUT) C ITRPLQ = TYPE OF INTERPOLATION TO GO FROM ONE MESH C LENGTH TO ONE OF HALF THAT. C 1 = BILINEAR C 2 = BIQUADRATIC C NOT USED WHEN MESHIN LT MESHOUT. C (INPUT) C ND2X3 = SIZE OF COMBINED DIMENSIONS OF P( ). (INPUT) C 1 2 3 4 5 6 7 X C C NONSYSTEM SUBROUTINES USED C DENSRM, DENSRX, THINER, MSHXMS, C DIMENSION P(ND2X3) C C DETERMINE WHETHER ANY ACTION IS NECESSARY. C IF(MESHIN.EQ.MESHOUT)GO TO 300 C IF THE MESH LENGTH OF THE INPUT AND OUTPUT GRIDS ARE C THE SAME, THIS IS A DO NOTHING ROUTINE. C D WRITE(KFILDO,100)MESHIN,MESHOUT,NX,NY,ND2X3,ITRPLQ D100 FORMAT(/' IN SZGRDM AT 100--MESHIN,MESHOUT,NX,NY,ND2X3', D 1 'ITRPLQ',6I10) C C GET THE FLOATING POINT VALUE OF THE NOMINAL MESH LENGTHS C CALL MSHXMS(KFILDO,MESHIN,XMESHI,TRASH) CALL MSHXMS(KFILDO,MESHOUT,XMESHO,TRASH) C RATIO=XMESHI/XMESHO C RATIO IS THE RATIO OF THE INPUT MESH LENGTH TO THE OUTPUT C MESH LENGTH. BECAUSE OF THE TEST ON MESHIN AND MESHOUT, IT C CANNOT BE 1. C C CHECK TO MAKE SURE XMESHI AND XMESHO ARE DIFFERENT C BY A FACTOR OF 2. THIS IS NOT ABSOLUTE INSURANCE. AN C ERROR IN INPUT COULD STILL PASS THIS CHECK. C DO 150 J=-4,+4 C D XX=2.**J D WRITE(KFILDO,149)XMESHI,XMESHO,RATIO,XX D149 FORMAT(/' AT 149 IN SZGRDM--XMESHI,XMESHO,RATIO,XX',4F10.4) C IF(ABS(RATIO-2.**J).LT..01)GO TO 160 150 CONTINUE C C FALL THROUGH HERE MEANS FACTOR OF 2 REQUIRMENT IS NOT C MET. C WRITE(KFILDO,155)XMESHO,XMESHI 155 FORMAT(/' ****OUTPUT MESH LENGTH =',F9.4, 1 ' NOT WITHIN A FACTOR OF 2 OF INPUT MESH LENGTH =',F9.4,/, 2 ' STOP IN SZGRDM AT 155.') CALL W3TAGE('SZGRDM') STOP 155 C THIS SHOULD NOT HAPPEN EXCEPT A CONTROL FILE ERROR C DURING CHECKOUT. C C NOW CALL DENSRM OR DENSRX TO INTERPOLATE OR CALL THINER C TO THIN THE GRID TO THE DESIRED MESH LENGTH. C DENSRM AND DENSRX OPERATE BY HALVING THE MESH C LENGTH, AND THINER DOUBLES THE MESH LENGTH, SO MAY NEED C TO BE CALLED MULTIPLE TIMES. C 160 IF(RATIO.GT.1)THEN NRATIO=NINT(RATIO) C NRATIO SHOULD BE 2, 4, 8, ... 128. ELSE NRATIO=NINT(1./RATIO) C NRATIO SHOULD BE 2, 4, 8, ... 128. ENDIF C C DO THICKENING OR THINNING IN STEPS OF 2. C DO 220 L=1,NINT(LOG10(FLOAT(NRATIO))/LOG10(2.)) C D WRITE(KFILDO,200)L,NRATIO D200 FORMAT(' IN SZGRDM AT 200--L,NRATIO',2I10) C C CALCULATE THE GRID SIZE AND POLE POSITION OF C THE OUTPUT GRID. NO REPOSITIONING IS DONE. C IF(RATIO.GT.1)THEN C IF(ITRPLQ.EQ.1)THEN CALL DENSRM(KFILDO,P,NX,NY,ND2X3) C NOTE THAT DENSRM CHANGES NX AND NY TO THE C APPROPRIATE VALUES FOR THE INTERPOLATED GRID IN P( ). ELSE WRITE(KFILDO,210) 210 FORMAT(/' ****DENSRX TO HANDLE MISSINGS CALLED FROM', 1 ' SZGRDM HAS NOT BEEN CONVERTED TO HANDLE', 2 ' MISSINGS. SWITCH TO LINEAR INTERPOLATION.',/, 3 ' STOP IN SZGRDM AT 210.') CALL W3TAGE('SZGRDM') STOP 210 C C***** CALL DENSRX(KFILDO,P,NX,NY,ND2X3) C NOTE THAT DENSRX CHANGES NX AND NY TO THE C APPROPRIATE VALUES FOR THE INTERPOLATED GRID IN P( ). ENDIF C ELSE C CALL THINER(KFILDO,P,NX,NY) C NOTE THAT THINER CHANGES NX AND NY TO THE C APPROPRIATE VALUES FOR THE THINNED GRID IN P( ). ENDIF C 220 CONTINUE C C SET THE MESH LENGTH TO THE OUTPUT GRID. C MESHIN=MESHOUT C D WRITE(KFILDO,299)MESHIN,MESHOUT,NX,NY,ND2X3 D299 FORMAT(' IN SZGRDM AT 299--MESHIN,MESHOUT,NX,NY,ND2X3', D 1 5I10) C 300 RETURN END