C file-name GXRESULT.FOR 140323 C----------------------------------------------------------------------- SUBROUTINE GXRESULT C... Subroutine to create condensed result file and display in default browser INCLUDE 'farray' INCLUDE 'satgrd' INCLUDE 'satear' INCLUDE 'grdear' INCLUDE 'lbnamer' INCLUDE 'd_earth/cmnmbf' COMMON /CGLDIM/NX0,NY0,NZ0 COMMON/LPAREA/MIMD LOGICAL MIMD COMMON/PRINFO/NPROC,MYID,NNN1 COMMON /INDAUX/L0ISL,L0IST,L0SL,L0ST,NSTO,NSOL,L0SLRS,L0TTRS, 1 L0TTFL,L0TTLS,L0MAXC,L0MAXV,L0MINV,L0RATE,L0MAXI,L0NETT, 1 L0TTFLM,L0TTFLX,L0TTFLY,L0TTFLZ COMMON/IHILO/IXHI3D,IYHI3D,IZHI3D,IXLO3D,IYLO3D,IZLO3D,IMAXC(150) COMMON /UVWGBF/ IUC1GCV,IVC1GCV,IWC1GCV,IFILGCV(9) COMMON/GENI/NXNY,NXM1NY,NXNYST,NDIR,KDUMM,NXST,NYST,NXNYFM, 1IZ,NFM,NWHOLE,IGSH,MVAR,KTRAN,NJ,NM,NXNYNZ,NXM1,IPAT1,NYM1, 1NYP1,NZM1,J0FRST,IZFSTP,IPAT2,ITHY,ITER,IXPRL0,IYPRL0,NWHF, 1NDVDP,IPRL,IBTAU,ILTLS,ISKIN,ISTAN,IYPLS,ISTRS,NFMAK1,NFMAK2, 1IREWR,NPHI2,NFTOT,MINF,M0FRST,LOOPZ,NPHI3,KXY0,NPHI4,ITEM1, 1ITEM2,ISPH1,ISPH2,IPOT,ICON2,IPRPS,IRADX,IRADY,IRADZ,IVFOL COMMON/GXMON2/PLTCLSX; LOGICAL PLTCLSX DIMENSION IMONTH(12),LDAY(7),LMONTH(12),ITIME(20) CHARACTER LINE*80,OUTPUT*80,CH2*2,CH4*4,TEMLIN*80 CHARACTER*80 OUT0,UNIT1,UNIT2 CHARACTER*32 PCX_BACK CHARACTER DAY(7)*9,MONTH(12)*9 CHARACTER*256 FILNAM,BUF1,CHGR_GEN*13,BUFF(5)*80,CURRENT_DIR,WPNAM LOGICAL NOSOR,SOLVE,LVAL INTEGER M4*4 EXTERNAL MCLOCK DATA IMONTH /31,28,31,30,31,30,31,31,30,31,30,31/ DATA LDAY /6,8,6,6,7,9,8 / DATA LMONTH /7,8,5,5,3,4,4,6,9,7,8,8/ DATA DAY/'Friday ','Saturday ','Sunday ','Monday ', 1 'Tuesday ','Wednesday','Thursday '/ DATA MONTH/'January ','February ','March ','April ', 1 'May ','June ','July ','August ', 1 'September','October ','November ','December '/ C---------------------------------------------------------------------- FILNAM='minires.htm' LU=231 110 CONTINUE OPEN(LU,FILE=FILNAM,STATUS='UNKNOWN',IOSTAT=IERR) CLOSE(LU,STATUS='DELETE',IOSTAT=IERR) IF(IERR/=0) THEN BUFF(1)='Error opening file '//FILNAM(:LENGZZ(FILNAM)) BUFF(3)='Is it already opened in another program?' BUFF(4)= 1 'If so, close the other program and click OK to try again,' BUFF(5)='or Cancel to abort saving mini result' CALL IOEMZZ(IERR,BUFF(2)) ! get system error message IACT=1; CALL ERRMSG(BUFF,5,222,IACT) ! display error dialog IF(IACT.EQ.0 )THEN CLOSE(LU,IOSTAT=IOS); GO TO 110 ! go to top and try again ELSE RETURN ! exit ENDIF ENDIF OPEN(LU,FILE=FILNAM,STATUS='NEW',IOSTAT=IERR) IF(IERR/=0) GO TO 110 WRITE(LU,'('''')') WRITE(LU,'('''')') WRITE(LU,'('''' 1 )') WRITE(LU,'(''Convergence Report'')') WRITE(LU,'('''')') WRITE(LU,'('''')') !DEC$ IF .NOT.DEFINED(_RHINO_) WRITE(LU,'(''The '',
     1  ''CHAM LOGO'')') !DEC$ ELSE WRITE(LU, 1'('''', 1 ''The '',
     1  ''RhinoCFD LOGO'')') !DEC$ ENDIF C ITIME(1)=-999 CALL MCLOCK(ITIME) IY=ITIME(1); IM=ITIME(2); ID=ITIME(3); IH=ITIME(4); IMIN=ITIME(5) IS=ITIME(6); LC=1; LINE=' ' ICPU=NINT(FLOAT((ITIME(19)+ITIME(20)))/1000.) c IF(IY==(-999)) THEN OUTPUT=LINE ELSE c assemble time information CALL NUM2(IH,CH2) LINE(LC:LC+1)=CH2; LC=LC+2 LINE(LC:LC)=':'; LC=LC+1 CALL NUM2(IMIN,CH2) LINE(LC:LC+1)=CH2; LC=LC+2 LINE(LC:LC)=':'; LC=LC+1 CALL NUM2(IS,CH2) LINE(LC:LC+1)=CH2; LC=LC+2 LINE(LC:LC+3)=' on '; LC=LC+3 c calculate the day of the week IF(MOD(IY,4)==0) IMONTH(2)=29 IREF=0 DO I=1983,IY IREF=IREF+1 IF(MOD(I-1,4)==0) IREF=IREF+1 ENDDO ISUM=0; I1=IM-1 DO I=1,I1 ISUM=ISUM+IMONTH(I) ENDDO ISUM=ISUM+ID+IREF ISUM=MOD(ISUM,7) IF(ISUM==0) ISUM=7 c glue together output buffer LDAYT=LDAY(ISUM); LMONT=LMONTH(IM) CALL NUM4(IY,CH4); CALL NUM2(ID,CH2) OUTPUT=' ' OUTPUT(1:LC)=LINE(1:LC) TEMLIN(1:9)=DAY(ISUM) OUTPUT(LC+1:LDAYT+LC)=TEMLIN(1:LDAYT); LC=LC+LDAYT+1 OUTPUT(LC:LC+1)=', '; LC=LC+2 OUTPUT(LC:LC+1)=CH2; LC=LC+2 OUTPUT(LC:LC)=' '; LC=LC+1 TEMLIN(1:9)=MONTH(IM) OUTPUT(LC:LC+LMONT-1)=TEMLIN(1:LMONT); LC=LC+LMONT OUTPUT(LC:LC)=' ' ; LC=LC+1 OUTPUT(LC:LC+3)=CH4 ENDIF BUF1=OUTPUT IF(BUF1/=' ') THEN WRITE(LU,'(''

Convergence information for '', 1 ''run completed at '',A,''

'')') BUF1(1:LENGZZ(BUF1)) ELSE WRITE(LU,'(''

Convergence information for '', 1 ''run completed

'')') ENDIF IF(STEADY) THEN WRITE(LU,'(''

on sweep '',I6,''

'')') 1 ISWEEP ELSE WRITE(LU,'(''

on time step'',I6,'' elapsed '', 1 ''time '',A,''s

'')') ISTEP, CHGR_GEN(TIM) ENDIF IF(MESS(1:40)/=' ') THEN LL=LENGZZ(MESS) WRITE(LU,'(''

Title: '',A,''

'')') 1 MESS(1:LL) ENDIF WPNAM=CURRENT_DIR() LL=LENGZZ(WPNAM) WRITE(LU,'(''

Working directory: '' 1 ,A,''

'')') WPNAM(1:LL) WRITE(LU, 1 '('''')') WRITE(LU,'('''')') WRITE(LU,'('''')') WRITE(LU,'('''')') WRITE(LU,'('''')') WRITE(LU,'('''')') IF(.NOT.USP) THEN WRITE(LU,'('''')') ENDIF WRITE(LU,'('''')') C... indices for velocities IF(CCM) THEN IU1=IUC1; IV1=IVC1; IW1=IWC1 IU2=IUC2; IV2=IVC2; IW2=IWC2 ELSEIF(GCV) THEN IU1=IUC1GCV; IV1=IVC1GCV; IW1=IWC1GCV IU2=0; IV2=0; IW2=0 ELSE IU1=3; IV1=5; IW1=7 IU2=4; IV2=6; IW2=8 ENDIF C... tolerances for red, orange & yellow TOL1SCL=2.0; CALL GETSDR('MINIRES','RED', TOL1SCL) ! scalars TOL2SCL=1.0; CALL GETSDR('MINIRES','ORANGE', TOL2SCL) TOL3SCL=0.1; CALL GETSDR('MINIRES','YELLOW', TOL3SCL) TOL1VEL=5.0; CALL GETSDR('MINIRES','RED-V', TOL1VEL) ! velocities TOL2VEL=2.0; CALL GETSDR('MINIRES','ORANGE-V',TOL2VEL) TOL3VEL=1.0; CALL GETSDR('MINIRES','YELLOW-V',TOL3VEL) C NRED=0 IF(.NOT.USP) THEN DO IV=1,NSOL ! loop over all solved variables M=MSL(IV); NOSOR=.TRUE.; UNIT1=''; UNIT2='' IF(M>=IU1.AND.M<=ITWO(IW1,IW2,ONEPHS)) THEN TOL1=TOL1VEL; TOL2=TOL2VEL; TOL3=TOL3VEL ELSE TOL1=TOL1SCL; TOL2=TOL2SCL; TOL3=TOL3SCL ENDIF IF(M==ILTLS) THEN ! skip those without meaningful values to report CYCLE ELSEIF(NAME(M)=='VFOL'.OR.NAME(M)=='VFL2') THEN CYCLE ELSEIF(GCV.OR.CCM) THEN ! skip U1 - W2 for CMM & GCV IF(M>=3.AND.M<=8) CYCLE ENDIF IF(M==1) THEN ! Assign more helpful display names IF(ONEPHS) THEN BUF1=NAME(M)//' (Continuity)' ELSE BUF1=NAME(M)//' (Overall Continuity)' ENDIF UNIT1=' (kg/s)'; UNIT2=' (Pa)' ELSEIF(M==IU1.OR.M==IU2) THEN BUF1=NAME(M)//' (X Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==IV1.OR.M==IV2) THEN BUF1=NAME(M)//' (Y Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==IW1.OR.M==IW2) THEN BUF1=NAME(M)//' (Z Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==9.AND..NOT.ONEPHS) THEN BUF1=NAME(M)//' (Phase 1 Continuity)' UNIT1=' (kg/s)' ELSEIF(M==10.AND..NOT.ONEPHS) THEN BUF1=NAME(M)//' (Phase 2 Continuity)' UNIT1=' (kg/s)' ELSEIF(M==9.AND..NOT.ONEPHS) THEN BUF1=NAME(M)//' (Shadow Phase Continuity)' UNIT1=' (kg/s)' ELSEIF(M==12) THEN BUF1=NAME(M)//' (Turbulent Kinetic Energy)' UNIT1=' (W)'; UNIT2=' (J/kg)'; NOSOR=.FALSE. ELSEIF(M==13) THEN BUF1=NAME(M)//' (Rate of Dissipation of KE)' UNIT1=' (W/s)'; UNIT2=' (J/kg/s)'; NOSOR=.FALSE. ELSEIF(NAME(M)=='OMEG') THEN BUF1=NAME(M)//' (Turbulence Frequency)' UNIT1=' (kg/s/s)'; UNIT2=' (1/s)'; NOSOR=.FALSE. ELSEIF(M==14.OR.M==15) THEN BUF1=NAME(M)//' (Enthalpy)' UNIT1='(W)'; UNIT2=' (J/kg)' ELSEIF(M==ITEM1.OR.M==ITEM2) THEN BUF1=NAME(M)//' (Temperature)' UNIT1='(W)' IF(TEMP0==0.0) THEN UNIT2=' (K)' ELSE UNIT2=' (°C)' ENDIF ELSEIF(M==LBT3) THEN BUF1=NAME(M)//' (Radiant Temperature)' UNIT1='(W)' IF(TEMP0==0.0) THEN UNIT2=' (K)' ELSE UNIT2=' (°C)' ENDIF ELSEIF(NAME(M)=='MH2O') THEN BUF1=NAME(M)//' (Specific Humidity)' UNIT1='(kg/s)'; UNIT2=' (kg/kg)' ELSE BUF1=NAME(M) UNIT1=' '; UNIT2=' ' ENDIF C... Create table entry WRITE(LU,'('' '')') WRITE(LU,'('' '')') TRIM(BUF1) ! name IF(NOSOR) THEN WRITE(LU,'('' '')') 1 CHGR_GEN(F(L0NETT+IV)),UNIT1(1:LENGZZ(UNIT1))! nett source ELSE WRITE(LU,'('' '')') ! No nett source for velocity, KE or EP ENDIF TOTR=TOTRES(M) IF(SELREF) THEN RESID=100.*TOTR IF(RESID<=TOL3) THEN BUF1='('' '')' ELSEIF(RESID<=TOL2) THEN BUF1= 1 '('' '')' ELSEIF(RESID<=TOL1) THEN BUF1= 1 '('' '')' ELSE BUF1= 1 '('' '')' NRED=NRED+1 ENDIF ELSE IF(RESREF(M)>0.0) THEN RESID=TOTR*RESREF(M) ELSE RESID=TOTR ENDIF BUF1='('' '')' ENDIF WRITE(LU,BUF1) CHGR_GEN(RESID) ! residual WRITE(LU,'('' '')') 1 CHGR_GEN(F(L0MAXC+IV)),UNIT2(1:LENGZZ(UNIT2)) ! max correction IJKM=IMAXC(M) ! stored index of maxcorr location IF(IJKM==0) CYCLE IF(MIMD.AND.NPROC>1) THEN NXNYM=NX0*NY0; NYM=NY0 ELSE NXNYM=NX*NY; NYM=NY ENDIF IZM=1+(IJKM-1)/NXNYM; IJ=1+MOD(IJKM-1,NXNYM) ! recover IX,IY,IZ IXM=1+(IJ-1)/NYM; IYM=1+MOD(IJKM-1,NYM) WRITE(LU,'('' '')') 1 IXM,IYM,IZM ! location WRITE(LU,'('' '')') ENDDO C... close tags WRITE(LU,'(''
'', 1 ''
'',A,'''',2A,'' N/A '',A,'''',A,'''',A,'''',A,'''',A,'''',2A,''('',I4,'','',I4,'','',I4,'')
'')') IF(SOLVE(LBT3).AND.(SOLVE(ITEM1).OR.SOLVE(14))) THEN IV1=ISL(LBT3) ; IV2=ITWO(ISL(14),ISL(ITEM1),SOLVE(14)) IV3=ITWO(14,ITEM1,SOLVE(14)) WRITE(LU,'( 1 ''
'',1X,2A,''
'')') 1 NAME(IV3),CHGR_GEN(F(L0NETT+IV1)+F(L0NETT+IV2)),' (W)' ENDIF ELSE ! USP section DO IV=1,NSOL M=MSL(IV); M4=INT(M,4); NOSOR=.TRUE.; UNIT1=''; UNIT2='' IF(M==ILTLS) CYCLE IF(M>=IU1.AND.M<=IW1) THEN TOL1=TOL1VEL; TOL2=TOL2VEL; TOL3=TOL3VEL ELSE TOL1=TOL1SCL; TOL2=TOL2SCL; TOL3=TOL3SCL ENDIF IF(M==1) THEN ! Assign more helpful display names BUF1=NAME(M)//' (Continuity)' UNIT1=' (kg/s)'; UNIT2=' (Pa)' ELSEIF(M==IU1) THEN BUF1=NAME(M)//' (X Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==IV1) THEN BUF1=NAME(M)//' (Y Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==IW1) THEN BUF1=NAME(M)//' (Z Velocity)'; NOSOR=.FALSE.; UNIT2=' (m/s)' ELSEIF(M==12) THEN BUF1=NAME(M)//' (Turbulent Kinetic Energy)' UNIT1=' (W)'; UNIT2=' (J/kg)'; NOSOR=.FALSE. ELSEIF(M==13) THEN BUF1=NAME(M)//' (Rate of Dissipation of KE)' UNIT1=' (W/s)'; UNIT2=' (J/kg/s)'; NOSOR=.FALSE. ELSEIF(NAME(M)=='OMEG') THEN BUF1=NAME(M)//' (Turbulence Frequency)' UNIT1=' (kg/s/s)'; UNIT2=' (1/s)'; NOSOR=.FALSE. ELSEIF(M==14.OR.M==15) THEN BUF1=NAME(M)//' (Enthalpy)' UNIT1='(W)'; UNIT2=' (J/kg)' ELSEIF(M==ITEM1.OR.M==ITEM2) THEN BUF1=NAME(M)//' (Temperature)' UNIT1='(W)' IF(TEMP0==0.0) THEN UNIT2=' (K)' ELSE UNIT2=' (°C)' ENDIF ELSEIF(M==LBT3) THEN BUF1=NAME(M)//' (Radiant Temperature)' UNIT1='(W)' IF(TEMP0==0.0) THEN UNIT2=' (K)' ELSE UNIT2=' (°C)' ENDIF ELSEIF(NAME(M)=='MH2O') THEN BUF1=NAME(M)//' (Specific Humidity)' UNIT1='(kg/s)'; UNIT2=' (kg/kg)' ELSE BUF1=NAME(M) UNIT1=' '; UNIT2=' ' ENDIF WRITE(LU,'('' '')') WRITE(LU,'('' '',A,'''')') TRIM(BUF1) ! name IF(NOSOR) THEN WRITE(LU,'('' '',2A,'''')') 1 CHGR_GEN(UGETMONC(M4,2)),UNIT1(1:LENGZZ(UNIT1))! nett source ELSE WRITE(LU,'('' N/A '')') ! No nett source for velocity, KE or EP ENDIF TOTR= UGETMON(M4,2) ! total residual IF(SELREF) THEN RESID=100.*TOTR IF(RESID<=TOL3) THEN BUF1='('' '',A,'''')' ELSEIF(RESID<=TOL2) THEN BUF1= 1 '('' '',A,'''')' ELSEIF(RESID<=TOL1) THEN BUF1= 1 '('' '',A,'''')' ELSE BUF1= 1 '('' '',A,'''')' NRED=NRED+1 ENDIF ELSE IF(RESREF(M)>0.0) THEN RESID=TOTR*RESREF(M) ELSE RESID=TOTR ENDIF BUF1='('' '',A,'''')' ENDIF WRITE(LU,BUF1) CHGR_GEN(RESID) ! residual WRITE(LU,'('' '',2A,'''')') 1 CHGR_GEN(UGETMONC(M4,1)),UNIT2(1:LENGZZ(UNIT2)) ! max correction WRITE(LU,'('' '')') ENDDO WRITE(LU,'('''')') ENDIF WRITE(LU,'(''

An explanation of the above'' 1,'' table is given here.

'')') WRITE(LU,'(''

To see the full source and '', 1''residual printout, click here then search for 1"Sources and sinks".

'')') IF(NRED>0) THEN WRITE(LU,'(''

High residual errors have '' 1 ''been detected in this run. Please review the results '' 1 ''carefully before proceeding!

'')') ENDIF IF(PLTCLSX) THEN ! Classic GXMONI CALL GET_DEFAULT_PLOTTYPE(ITYPE,PCX_BACK) LVAL=.FALSE.; CALL GETSDL('GXMONI','PLOTALL',LVAL) IF(LVAL) THEN ! all four plots are saved WRITE(LU,'(''

Convergence monitor plots'', 1 ''

'')') WRITE(LU, 1 '(''

Spot value & Residual, Minimum '' 1 ,''& Maximum value, Maximum correction & Residual, Maximum '', 1 ''correction & Nett sum

'')') WRITE(LU,'(''

'')') WPNAM='gxmoni_spot.'//PCX_BACK; LL=LENGZZ(WPNAM) WRITE(LU,'('' '')') 1 WPNAM(:LL),WPNAM(:LL) WPNAM='gxmoni_mnmx.'//PCX_BACK; LL=LENGZZ(WPNAM) WRITE(LU,'(''Minimum/Maximum value plot '')') 1 WPNAM(:LL),WPNAM(:LL) WPNAM='gxmoni_mxcr.'//PCX_BACK; LL=LENGZZ(WPNAM) WRITE(LU,'(''Maximum correction + residual plot'')') 1 WPNAM(:LL),WPNAM(:LL) WPNAM='gxmoni_mxc.'//PCX_BACK; LL=LENGZZ(WPNAM) WRITE(LU,'(''Maximum correction + nett source sum plot'')') 1 WPNAM(:LL),WPNAM(:LL) WRITE(LU, 1 '(''

Click each plot to see the full'' 1 ,'' image

'')') ELSE ! only gxmoni is saved WRITE(LU,'(''

Convergence monitor plot: '', 1 ''

'')') WRITE(LU,'(''

'')') WPNAM='gxmoni.'//PCX_BACK; LL=LENGZZ(WPNAM) WRITE(LU,'(''Spot value plot '')') 1 WPNAM(:LL),WPNAM(:LL) WRITE(LU, 1 '(''

Click the plot to see the full'' 1 ,'' image

'')') ENDIF ELSE ! New style GXMONI CALL EAR_PLOTALL WRITE(LU,'(''

Convergence monitor plots'', 1 ''

'')') WRITE(LU, 1 '(''

Spot value, Residual, Maximum '' 1,'' value, Minimum value, Maximum correction, Nett source

'')') WRITE(LU,'(''

'')') OUTPUT='.png' CALL REMSPC(OUTPUT,LENGZZ(OUTPUT)) WPNAM='convergence-spot'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Spot value plot '')') 1 WPNAM(:LL),WPNAM(:LL) C WPNAM='convergence-residual'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Residual value plot '')') 1 WPNAM(:LL),WPNAM(:LL) C WPNAM='convergence-domainMax'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Domain maximum plot '')') 1 WPNAM(:LL),WPNAM(:LL) C WPNAM='convergence-domainMin'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Domain minimum plot '')') 1 WPNAM(:LL),WPNAM(:LL) C WPNAM='convergence-maxCorrection'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Maximum correction plot '')') 1 WPNAM(:LL),WPNAM(:LL) C WPNAM='convergence-netsources'//OUTPUT(:LENGZZ(OUTPUT)) LL=LENGZZ(WPNAM) WRITE(LU,'('''', 1 ''Nett sources plot '')') 1 WPNAM(:LL),WPNAM(:LL) C ENDIF WRITE(LU,'(''

CPU time of run'',I8, 1 '' s

'')') ICPU WRITE(LU,'('''')') WRITE(LU,'('''')') C... close file CLOSE(LU,STATUS='KEEP',IOSTAT=IERR) C... display in browser IF(IERR==0) CALL START_BROWSER(FILNAM) END C--------------------------------------------------------------------------------- CHARACTER*(*) FUNCTION CHGR_GEN(RVAL) USE Inf_NaN_Detection CHARACTER*13 BUFF IF(ISNAN(RVAL)) THEN CHGR_GEN='NaN' ELSEIF(ISINF(RVAL)) THEN CHGR_GEN='Infinity' ELSE WRITE(BUFF,'(1PG12.3)') RVAL CHGR_GEN=BUFF ENDIF END