diff --git a/cat/src/GUI.cfg b/cat/src/GUI.cfg deleted file mode 100644 index 08eb5352ac5b25eceded0f1d7b00d2e12b222a9e..0000000000000000000000000000000000000000 --- a/cat/src/GUI.cfg +++ /dev/null @@ -1,139 +0,0 @@ -Hamburg GUI Config File Version 16 -Screen: 2560x1418 - -WinRows = 3 -WinCols = 3 - -[Window 00] -Array:GQ -Plot:ISOREC -Palette:AUTO -Title:Vorticity -Geometry: 1000 1000 1 1 - -[Window 01] -Array:SPAN -Plot:ISOSH -Palette:AMPLI -Title:Spherical Harmonics Ps -Inactive: 853 367 853 -1 - -[Window 02] -Array:CST -Plot:ISOCS -Palette:T -Title:Temperature [C] -Inactive: 853 367 1706 -1 - -[Window 03] -Array:GP -Plot:MAPHOR -Projection:POLAR -Rotation factor:0 -Palette:P -Title:Surface Pressure [hPa] -Inactive: 853 367 0 389 - -[Window 04] -Array:GU -Plot:MAPTRA -Projection:AZIMUTHAL -Rotation factor:0 -Palette:U -Title:Tracer Level 3 -Inactive: 853 367 853 389 - -[Window 05] -Array:GV -Plot:ISOLON -Palette:U -Title:Meridional Wind [m/s] Latitude 42N -Inactive: 853 367 1706 389 - -[Window 06] -Array:GP -Plot:ISOHOV -Palette:P -Title:Ps Hovmoeller Latitude 42N -Inactive: 853 367 0 779 - -[Window 07] -Array:SCALAR -Plot:ISOTS -Palette:AUTO -Title:Timeseries -Inactive: 853 367 853 779 - -[Window 08] -Array:SCALAR -Plot:ISOTAB -Palette:AUTO -Title:Tables -Inactive: 853 367 1706 779 - -[Control Window] -Geometry: 920 122 820 1172 - -# Scalar attributes for timeseries and table window - -[Scalar 00] -Name:T -Sub: -Unit:C -Scale: - -[Scalar 01] -Name:RMS Div -Sub: -Unit:1/s -Scale:-6 - -[Scalar 02] -Name:PE+KE -Sub: -Unit:m2/s2 -Scale: - -[Scalar 03] -Name:RMS Ps -Sub: -Unit:hPa -Scale: - -[Scalar 04] -Name:Vort -Sub: -Unit:1/s -Scale: - -# Parameter attributes for change menu - -[Parameter 00] -ParName:DISP -ParInc: 0.0100 -ParMin: 0.0000 -ParMax: 1.0000 - -[Parameter 01] -ParName:DTEP -ParInc: 5.0000 -ParMin: -95.0000 -ParMax: 100.0000 - -[Parameter 02] -ParName:DTNS -ParInc: 5.0000 -ParMin: -95.0000 -ParMax: 100.0000 - -[Parameter 03] -ParName:NSYNC -ParInc: 1.0000 -ParMin: 0.0000 -ParMax: 1.0000 - -[Parameter 04] -ParName:EPSYNC -ParInc: 1.0000 -ParMin: 0.0000 -ParMax: 100.0000 diff --git a/cat/src/GUI_last_used.cfg b/cat/src/GUI_last_used.cfg deleted file mode 100644 index 2c23b42c8cb3191277f65bce73b440b843cc0941..0000000000000000000000000000000000000000 --- a/cat/src/GUI_last_used.cfg +++ /dev/null @@ -1,139 +0,0 @@ -Hamburg GUI Config File Version 16 -Screen: 1920x1080 - -WinRows = 3 -WinCols = 3 - -[Window 00] -Array:GQ -Plot:ISOREC -Palette:AUTO -Title:Vorticit -Geometry: 1000 1000 65 28 - -[Window 01] -Array:SPAN -Plot:ISOSH -Palette:AMPLI -Title:Spherical Harmonics Ps -Inactive: 853 367 853 -1 - -[Window 02] -Array:CST -Plot:ISOCS -Palette:T -Title:Temperature [C] -Inactive: 853 367 1706 -1 - -[Window 03] -Array:GP -Plot:MAPHOR -Projection:POLAR -Rotation factor:0 -Palette:P -Title:Surface Pressure [hPa] -Inactive: 853 367 0 389 - -[Window 04] -Array:GU -Plot:MAPTRA -Projection:AZIMUTHAL -Rotation factor:0 -Palette:U -Title:Tracer Level 3 -Inactive: 853 367 853 389 - -[Window 05] -Array:GV -Plot:ISOLON -Palette:U -Title:Meridional Wind [m/s] Latitude 42N -Inactive: 853 367 1706 389 - -[Window 06] -Array:GP -Plot:ISOHOV -Palette:P -Title:Ps Hovmoeller Latitude 42N -Inactive: 853 367 0 779 - -[Window 07] -Array:SCALAR -Plot:ISOTS -Palette:AUTO -Title:Timeseries -Inactive: 853 367 853 779 - -[Window 08] -Array:SCALAR -Plot:ISOTAB -Palette:AUTO -Title:Tables -Inactive: 853 367 1706 779 - -[Control Window] -Geometry: 920 122 1107 678 - -# Scalar attributes for timeseries and table window - -[Scalar 00] -Name:T -Sub: -Unit:C -Scale: - -[Scalar 01] -Name:RMS Div -Sub: -Unit:1/s -Scale:-6 - -[Scalar 02] -Name:PE+KE -Sub: -Unit:m2/s2 -Scale: - -[Scalar 03] -Name:RMS Ps -Sub: -Unit:hPa -Scale: - -[Scalar 04] -Name:Vort -Sub: -Unit:1/s -Scale: - -# Parameter attributes for change menu - -[Parameter 00] -ParName:DISP -ParInc: 0.0100 -ParMin: 0.0000 -ParMax: 1.0000 - -[Parameter 01] -ParName:DTEP -ParInc: 5.0000 -ParMin: -95.0000 -ParMax: 100.0000 - -[Parameter 02] -ParName:DTNS -ParInc: 5.0000 -ParMin: -95.0000 -ParMax: 100.0000 - -[Parameter 03] -ParName:NSYNC -ParInc: 1.0000 -ParMin: 0.0000 -ParMax: 1.0000 - -[Parameter 04] -ParName:EPSYNC -ParInc: 1.0000 -ParMin: 0.0000 -ParMax: 100.0000 diff --git a/cat/src/cat.f90 b/cat/src/cat.f90 index 5465ee077b05be98886a8fa11172f25913ce44dd..b78eb62ba984df20ef82aa7b3efc3924a9c1d1f6 100644 --- a/cat/src/cat.f90 +++ b/cat/src/cat.f90 @@ -1494,8 +1494,9 @@ if (npost > 0) then ! gguixm(:) = gvxm(:) ! double -> single ! call guiput("GVXM" // char(0), gguixm, ngy, 1, 1) ! v - ggxm(:,1) = guxm(:) - ggxm(:,2) = gvxm(:) + ggxm(:,1) = gvym(:) +! ggxm(:,2) = gvxm(:) + ggxm(:,2) = gqym(:) call guiput("GXM" // char(0), ggxm, ngy, 2, 1) ! u & v @@ -1748,14 +1749,14 @@ implicit none !--- calculate zonal means gqxm = sum(gq ,1)*rnx gpsixm = sum(gpsi,1)*rnx -guxm = sum(gq ,1)*rnx -gvxm = sum(gq ,1)*rnx +guxm = sum(gu ,1)*rnx +gvxm = sum(gv ,1)*rnx !--- calculate meridional means gqym = sum(gq ,2)*rny gpsiym = sum(gpsi,2)*rny -guym = sum(gq ,2)*rny -gvym = sum(gq ,2)*rny +guym = sum(gu ,2)*rny +gvym = sum(gv ,2)*rny return end subroutine post diff --git a/cat/src/guix11.001 b/cat/src/guix11.001 deleted file mode 100644 index e198eb49347d71ebf13f3e4d19f89418f443179a..0000000000000000000000000000000000000000 --- a/cat/src/guix11.001 +++ /dev/null @@ -1,4763 +0,0 @@ -/* - guix11 - a GUI for PUMA, PLASIM & CAT - 2016 Edilbert Kirk & Hartmut Borth - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -int Debug = 0; // set in initgui - -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <math.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xos.h> -#include <X11/Xatom.h> -#include <X11/keysym.h> - -#define INT int -#define REAL float -#define INTXU unsigned int -#define INTXS int - -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -#define ROTATE_LEFT (XK_Left) -#define ROTATE_RIGHT (XK_Right) - -#define TOLELO 0x0001 -#define TOLEHI 0x0002 -#define TORILO 0x0004 -#define TORIHI 0x0008 -#define BOLELO 0x0010 -#define BOLEHI 0x0020 -#define BORILO 0x0040 -#define BORIHI 0x0080 -#define TOLEIN 0x0100 -#define TOREIN 0x0200 -#define BOLEIN 0x0400 -#define BOREIN 0x0800 - -#define IPX(l,m,h) (VGAX * (x + (l-m) / (l-h))) -#define IPY(l,m,h) (VGAY * (y + (l-m) / (l-h))) - -#define NUMWIN 9 -#define NUMPAL 13 - -/* Picture types */ - -#define ISOREC 0 -#define ISOHOR 1 -#define ISOCS 2 -#define ISOHOV 3 -#define ISOTS 4 -#define ISOTAB 5 -#define ISOSH 6 -#define ISOLON 7 -#define ISOTRA 8 -#define ISOCOL 9 -#define ISOROT 10 -#define MAPHOR 11 -#define MAPTRA 12 - -/* Models */ - -#define PUMA 0 -#define CAT 4 - -char *IsoNames[] = -{ - "ISOREC", - "ISOHOR", - "ISOCS", - "ISOHOV", - "ISOTS", - "ISOTAB", - "ISOSH", - "ISOLON", - "ISOTRA", - "ISOCOL", - "ISOROT", - "MAPHOR", - "MAPTRA" -}; - -int IsoTypes = sizeof(IsoNames) / sizeof(char *); - -char *PalNames[] = -{ - "AUTO", - "U", - "V", - "T", - "P", - "Q", - "MARST", - "AMPLI", - "VEG", - "OCET", - "OCES", - "DCC", - "DTDT" -}; - -int PalTypes = sizeof(PalNames) / sizeof(char *); - -/* Map projections */ - -#define CYLINDRICAL 0 -#define POLAR 1 -#define AZIMUTHAL 2 - -#define MAXMAPS 3 - -char *ProNames[] = -{ - "CYLINDRICAL", - "POLAR", - "AZIMUTHAL" -}; - - -/* Coordinates of button areas */ - -int ShowQueue = 0; -int ShowOnce = 1; -int OffsetY = 20; - -int Stop_XL; -int Stop_XH; -int Stop_YL; -int Stop_YH; - -int Start_XL; -int Start_XH; -int Start_YL; -int Start_YH; - -int Pause_XL; -int Pause_XH; -int Pause_YL; -int Pause_YH; - -int Help_XL; -int Help_XH; -int Help_YL; -int Help_YH; - -int Minus_XL; -int Minus_XH; -int Minus_YL; -int Minus_YH; - -int FBWD_XL; -int FBWD_XH; -int FBWD_YL; -int FBWD_YH; - -int Plus_XL; -int Plus_XH; -int Plus_YL; -int Plus_YH; - -int FFWD_XL; -int FFWD_XH; -int FFWD_YL; -int FFWD_YH; - -int Parc_XL; -int Parc_XH; -int Parc_XD; -int Parc_YL; -int Parc_YH; -int Parc_YD; - -int Wbox_XL; -int Wbox_XH; -int Wbox_YL; -int Wbox_YH; - -int Grid_XL; -int Grid_XH; -int Grid_YL; -int Grid_YH; - -XPoint StopButton[4] = {{10,10},{40,10},{40,40},{10,40}}; -XPoint StartButton[3] = {{50,10},{80,25},{50,40}}; -XPoint PauseButton1[4] = {{95,10},{102,10},{102,40},{95,40}}; -XPoint PauseButton2[4] = {{108,10},{115,10},{115,40},{108,40}}; - -#define PARCS 100 - -struct ParcStruct -{ - char Name[8]; - float Inc; - float Min; - float Max; - float Val; -}; - -int Parcs; -int cpi = 1; - -struct ParcStruct Parc[PARCS]; - -int screen_num; - -Display *display; -unsigned int ScreenW,ScreenH,ScreenBot; -int SmallScreen; - -static char *progname = "PUMA"; - -int BigEndian; -int ScreenOffset; -int Model; -int CowX = -1; -int CowY = -1; -int CowW; -int CowH; -int NumWin = NUMWIN; -int WinCols = 3; -int WinRows = 3; -int DimT = 100; // Default length of time axis -int DimX; -int DimY; -int DimZ; -int DimXY; -int Uindex = -1; -int Vindex = -1; -int ScreenD; -int OffX; -int OffY = 0; -INTXU WinXSize; -INTXU WinYSize; -int InXSize; -int InYSize; -int Latitudes; -int Lines; -int SizeChanged; -int Shutdown; -int Grid = 1; -int GridLabel = 1; -int WhitePix; -int BlackPix; -int *Flag; -int FlagSize; -int nstep; -int MRpid; -int MRnum; -int wto; -int FirstKey; -int LastKey; -int SymsPerKey; - -REAL arx; -REAL ary; - -KeySym *KeyMap; - -char wtrun[8]; - -unsigned Seed; - -float RotInc = 0.2; -int LineCo[NUMPAL]; -int MapPro[NUMWIN]; -int HovInx[NUMWIN]; -int Indez[NUMWIN]; -int MaxZ[NUMWIN]; -int RedrawFlag[NUMWIN]; -int LevelChanged[NUMWIN]; -int RotLon[NUMWIN]; -double AutoDelta[NUMWIN]; -double AutoXdelt[NUMWIN]; -double AutoLo[NUMWIN]; -REAL *TSdata[NUMWIN]; -REAL *Dmin[NUMWIN]; -REAL *Dmax[NUMWIN]; -REAL *SpeedScale; -XPoint *TSxp[NUMWIN]; - - -#define MAXPAR 16384 -float pax[MAXPAR]; -float pay[MAXPAR]; -long pal[MAXPAR]; - -int Delpar = 8; /* Interval for particle injection */ -int ParInd = 0; -int ColInd = 0; -long TracerColor; - -#define NUMSCALARS 9 - -char TSName[NUMSCALARS][80]; -char TSubsc[NUMSCALARS][80]; -char TSUnit[NUMSCALARS][80]; -char TScale[NUMSCALARS][80]; - -struct PixStruct -{ - int DimX; - int DimY; - Pixmap Pix; -} WinPixMap[NUMWIN]; - -Pixmap pix; - -#define NUMARRAYS 100 - -struct ArrayStruct -{ - char Name[80]; - float *Data; - int DimX; - int DimY; - int DimZ; - int Flag; -} Array[NUMARRAYS]; - -int NumArrays; - -struct WinAttStruct -{ - unsigned int x; - unsigned int y; - unsigned int w; - unsigned int h; - int active; - char array_name[80]; - int Plot; - int Palette; -} WinAtt[NUMWIN]; - -int BorderWidth = 0; -int WM_top_area = 0; // Window manager top area -int WinLM = 0; -int WinRM = 0; -int WinTM = 24; -int WinBM = 0; - -struct ColorStrip -{ - double Lo; - double Hi; - char *Name; - unsigned long pixel; -}; - -#define AUTOCOLORS 14 -struct ColorStrip Autostrip[AUTOCOLORS+1] = -{ - {0.0,0.0,"red"}, - {0.0,0.0,"OrangeRed"}, - {0.0,0.0,"Orange"}, - {0.0,0.0,"yellow"}, - {0.0,0.0,"GreenYellow"}, - {0.0,0.0,"green"}, - {0.0,0.0,"aquamarine"}, - {0.0,0.0,"cyan"}, - {0.0,0.0,"SkyBlue"}, - {0.0,0.0,"blue"}, - {0.0,0.0,"orchid"}, - {0.0,0.0,"magenta"}, - {0.0,0.0,"violet"}, - {0.0,0.0,"DarkViolet"}, - {0.0,0.0,NULL} -}; - -struct ColorStrip Ustrip[] = -{ - {-99.0,-10.0,"red"}, - {-10.0, -5.0,"OrangeRed"}, - { -5.0, 0.0,"Orange"}, - { 0.0, 5.0,"yellow"}, - { 5.0, 10.0,"GreenYellow"}, - { 10.0, 15.0,"green"}, - { 15.0, 20.0,"aquamarine"}, - { 20.0, 25.0,"cyan"}, - { 25.0, 30.0,"SkyBlue"}, - { 30.0, 35.0,"blue"}, - { 35.0, 40.0,"orchid"}, - { 40.0, 45.0,"magenta"}, - { 45.0, 50.0,"violet"}, - { 50.0, 99.0,"DarkViolet"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Qstrip[] = -{ - {-99.0, 0.0,"black"}, - { 0.0, 5.0,"OrangeRed"}, - { 5.0, 10.0,"Orange"}, - { 10.0, 15.0,"yellow"}, - { 15.0, 20.0,"GreenYellow"}, - { 20.0, 25.0,"green"}, - { 25.0, 30.0,"aquamarine"}, - { 30.0, 35.0,"cyan"}, - { 35.0, 40.0,"SkyBlue"}, - { 40.0, 45.0,"blue"}, - { 45.0, 50.0,"orchid"}, - { 50.0, 55.0,"magenta"}, - { 55.0, 60.0,"violet"}, - { 60.0, 99.0,"DarkViolet"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Vstrip[] = -{ - {-99.0,-10.0,"brown"}, - {-10.0, -8.0,"gold"}, - { -8.0, -6.0,"purple"}, - { -6.0, -4.0,"red"}, - { -4.0, -2.0,"OrangeRed"}, - { -2.0, 0.0,"Orange"}, - { 0.0, 2.0,"yellow"}, - { 2.0, 4.0,"GreenYellow"}, - { 4.0, 6.0,"green"}, - { 6.0, 8.0,"aquamarine"}, - { 8.0, 10.0,"cyan"}, - { 10.0, 99.0,"blue"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Tstrip[] = -{ - {-99.0,-50.0,"MidnightBlue"}, - {-50.0,-40.0,"RoyalBlue4"}, - {-40.0,-30.0,"RoyalBlue3"}, - {-30.0,-20.0,"RoyalBlue2"}, - {-20.0,-10.0,"RoyalBlue1"}, - {-10.0, 0.0,"violet"}, - { 0.0, 10.0,"IndianRed1"}, - { 10.0, 20.0,"IndianRed2"}, - { 20.0, 30.0,"IndianRed3"}, - { 30.0, 40.0,"IndianRed4"}, - { 40.0, 50.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Kstrip[] = -{ - {100.0,210.0,"RoyalBlue4"}, - {210.0,220.0,"RoyalBlue3"}, - {220.0,230.0,"RoyalBlue2"}, - {230.0,240.0,"RoyalBlue1"}, - {240.0,250.0,"violet"}, - {250.0,260.0,"IndianRed1"}, - {260.0,270.0,"IndianRed2"}, - {270.0,280.0,"IndianRed3"}, - {280.0,290.0,"IndianRed4"}, - {290.0,400.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Pstrip[] = -{ - { 00.0, 985.0,"RoyalBlue4"}, - { 985.0, 990.0,"RoyalBlue3"}, - { 990.0, 995.0,"RoyalBlue2"}, - { 995.0,1000.0,"RoyalBlue1"}, - {1000.0,1005.0,"violet"}, - {1005.0,1010.0,"IndianRed1"}, - {1010.0,1015.0,"IndianRed2"}, - {1015.0,1020.0,"IndianRed3"}, - {1020.0,1025.0,"IndianRed4"}, - {1025.0,9990.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip MarsTStrip[] = -{ - {-200.0,-90.0,"RoyalBlue4"}, - { -90.0,-80.0,"RoyalBlue3"}, - { -80.0,-70.0,"RoyalBlue2"}, - { -70.0,-60.0,"RoyalBlue1"}, - { -60.0,-50.0,"violet"}, - { -50.0,-40.0,"IndianRed1"}, - { -40.0,-30.0,"IndianRed2"}, - { -30.0,-20.0,"IndianRed3"}, - { -20.0, 0.0,"IndianRed4"}, - { 0.0,100.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip AmpliStrip[] = -{ - { 0.0, 1.0,"DarkBlue"}, - { 8.0, 9.0,"blue"}, - { 8.0, 9.0,"DarkGreen"}, - { 8.0, 9.0,"green"}, - { 8.0, 9.0,"yellow"}, - { 9.0, 10.0,"Orange"}, - { 10.0, 11.0,"OrangeRed"}, - { 11.0, 12.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Vegstrip[] = -{ - {-999.9,0.001,"DarkBlue"}, - { 0.001, 10.0,"brown"}, - { 10.0, 20.0,"SeaGreen4"}, - { 20.0, 30.0,"SeaGreen3"}, - { 30.0, 40.0,"SeaGreen2"}, - { 40.0, 50.0,"SeaGreen1"}, - { 50.0, 60.0,"YellowGreen"}, - { 60.0, 70.0,"green4"}, - { 70.0, 80.0,"green3"}, - { 80.0, 90.0,"green2"}, - { 90.0,999.0,"green1"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Tstripoce[] = -{ - {-99.0, 0.00001,"Black"}, - { 0.00001, 4.0 ,"RoyalBlue4"}, - { 4.0 ,8.0,"RoyalBlue3"}, - { 8.0, 12.0,"RoyalBlue2"}, - { 12.0, 16.0,"RoyalBlue1"}, - { 16.0, 20.0,"violet"}, - { 20.0, 24.0,"IndianRed1"}, - { 24.0, 28.0,"IndianRed2"}, - { 28.0, 32.0,"IndianRed3"}, - { 32.0, 36.0,"IndianRed4"}, - { 36.0, 40.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip Sstripoce[] = -{ - {-99.0, 30.0,"Black"}, - { 30.0, 32.0 ,"RoyalBlue4"}, - { 32.0 ,32.5,"RoyalBlue3"}, - { 32.5, 33.0,"RoyalBlue2"}, - { 33.0, 34.0,"SeaGreen"}, - { 34.0, 34.5,"YellowGreen"}, - { 34.5, 35.0,"LightGreen"}, - { 35.0, 35.5,"Orange"}, - { 35.5, 36.0,"DarkOrange"}, - { 36.0, 36.5,"OrangeRed"}, - { 36.5, 40.0,"red"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip DCCstrip[] = -{ - {-99.0, 0.0, "Black"}, - { 0.0, 10.0,"Yellow"}, - { 10.0, 20.0,"YellowGreen"}, - { 20.0, 30.0,"Green"}, - { 30.0, 40.0,"Aquamarine"}, - { 40.0, 50.0,"Cyan"}, - { 50.0, 60.0,"SkyBlue"}, - { 60.0, 70.0,"Blue"}, - { 70.0, 80.0,"Orchid"}, - { 80.0, 90.0,"Magenta"}, - { 90.0,100.0,"DarkViolet"}, - { 0.0, 0.0,NULL} -}; - -struct ColorStrip DTDTstrip[] = -{ - {-99.0, -5.0,"brown"}, - {- 5.0, -3.0,"gold"}, - { -3.0, -1.5,"purple"}, - { -1.5, -0.5,"red"}, - { -0.5, -0.25,"OrangeRed"}, - { -0.25, 0.0,"Orange"}, - { 0.0, 0.25,"yellow"}, - { 0.25, 0.5,"GreenYellow"}, - { 0.5, 1.5,"green"}, - { 1.5, 3.0,"aquamarine"}, - { 3.0, 5.0,"cyan"}, - { 5.0, 99.0,"blue"}, - { 0.0, 0.0,NULL} -}; - -#define AMPLI_COLS 8 - -struct ColorStrip *Cstrip; -struct ColorStrip *Pallet[NUMPAL] = -{ Autostrip, Ustrip, Vstrip, Tstrip, Pstrip, Qstrip,MarsTStrip,AmpliStrip, - Vegstrip, Tstripoce, Sstripoce, DCCstrip, DTDTstrip}; - -REAL VGAX; -REAL VGAY; -REAL CurVal; - -REAL *Field; // Pointer for ISO data -REAL *Ampli; // Amplitudes of spherical harmonics -XColor *Acol; // Amplitude colors - -Colormap colormap; - -XColor xcolor1,xcolor2; -XColor Red,Green,Blue,Yellow,Grey,LightRed,DarkRed,LightBlue,DarkBlue; -XColor LightGreen,DarkGreen,Dummy; - -unsigned long TSColor[10]; - -Window Win[NUMWIN]; -int win; // Current window -Window Cow; // Control bar -Window HelpWindow; - -XTextProperty WinconName1; -XTextProperty WinconName3; -XTextProperty WinconPause; -XTextProperty WinconReady; -char *PauseTitle = "Run Paused"; -char *ReadyTitle = "Press Start Button"; - -XEvent CowEvent; - -XSizeHints WinSizeHints; -XSizeHints CowSizeHints; -int OutXSize,OutYSize; -int count; -XEvent report; -GC gc; - -/* -char BigFontName[80] = "10x20"; -char FixFontName[80] = "9x15bold"; -char SubFontName[80] = "6x10"; -*/ -char BigFontName[80] = "9x15bold"; -char FixFontName[80] = "8x13"; -char SubFontName[80] = "6x10"; - -XFontStruct *FixFont; -XFontStruct *SubFont; -XFontStruct *BigFont; -int FixFontHeight; -int SubFontHeight; -int BigFontHeight; -int FixFontWidth; -int SubFontWidth; -int BigFontWidth; -int Paused = 0; - -char *display_name = NULL; -XWMHints wm_hints; -XClassHint class_hints; -Atom Delwin; - -char *WindowTitle[NUMWIN]; -XTextProperty WindowName[NUMWIN]; -XTextProperty HelpName; - -char *mona[12] = -{ - "Jan","Feb","Mar", - "Apr","May","Jun", - "Jul","Aug","Sep", - "Oct","Nov","Dec" -}; - -char *wena[7] = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; - -char datch[64]; -char PlanetName[32]; - -char GUI_default[80] = "GUI.cfg"; -char GUI_config[80] = "GUI_last_used.cfg"; - - -#define PSDIM 30 -char *pixelstar[PSDIM] = { -"..............................", -"..............................", -"..............................", -"...**....**....**....**.......", -"...**....**....**....**.......", -"...**....**....**....**.......", -"...**....**....**....**.......", -"...**....**************.......", -"...**....**************.......", -"...**....**....**....**.......", -"...***...**....**....**.......", -"....******.....**....**.......", -".....****......**....**.......", -"..............................", -"..............................", -"..............................", -"..............................", -"..............................", -"..............................", -"..............................", -"..............................", -"..............................", -".......................*......", -"......................***.....", -"...................**.***.**..", -"...................**.***.**..", -"...................**.***.**..", -"...................****.****..", -"...................***...***..", -"...................***...***.."}; - -// Variables used for calculating "frames per second" - -int fps; -int rmuf = 20; // Rotating map update frequency [1/sec] -int rmui = 1; // Rotating map update interval [steps] -int SkipFreq; -int ThisSecond; -int LastSecond; -int LastStep; -int SecEvent; - -int ndatim[6]; /* year, month, day, hour, minute, weekday */ -int LastMinute; /* Last value of ndatim(4) */ -int DeltaTime ; /* Computed timestep interval [min] */ - -struct BMIstruct -{ - int Size; - int Width; - int Height; - short Planes; - short Count; - int Compression; - int SizeImage; - int XPelsPerMeter; - int YPelsPerMeter; - int ClrUsed; - int ClrImportant; -}; - -struct BMIstruct ImageBMI; - -struct MapImageStruct -{ - char *d; // Bitmap data - int w; // Image width - int h; // Image height - int f; // Rotation factor - float l; // Reference longitude - float r; // Rotation speed [deg/step] - XImage *X; // XImage structure -}; - -// Convert an RGB value to an X11 Pixel - -unsigned long create_pixel(long red, long green, long blue) -{ - if (ScreenD == 24) // 24 bit true color - { - return blue | green << 8 | red << 16; - } - else if (ScreenD == 16) // 16 bit RGB 565 - { - return blue >> 3 | (green >> 2) << 5 | (red >> 3) << 11; - } - else return 0; -} - -struct MapImageStruct MapHR; // Hires (2560x1280) Earth image -struct MapImageStruct MapLR[NUMWIN]; - -void ScaleImage(struct MapImageStruct *s, struct MapImageStruct *d) -{ - int a,b,x,y; - unsigned long px; - unsigned long h,w; - double f,g; - - if (d->X) XDestroyImage(d->X); - w = (d->w + 7) & 0xFFF8; - h = d->h; - d->d = malloc(4 * w * h); - d->X = XCreateImage(display,CopyFromParent,ScreenD,ZPixmap,0, - d->d,w,h,8,0); - - f = (double)s->w / (double)d->w; - g = (double)s->h / (double)d->h; - - for (y = 0 ; y < d->h ; ++y) - for (x = 0 ; x < d->w ; ++x) - { - a = x * f; - b = y * g; - XPutPixel(d->X,x,y,XGetPixel(s->X,a,b)); - } -} - - -void PolarImage(struct MapImageStruct *s, struct MapImageStruct *d) -{ - int a,b,x,y; - unsigned long h,w; - double f,lfa,xnp,ynp,xsp,ysp,dx,dy; - - if (d->X) XDestroyImage(d->X); - w = (d->w + 7) & 0xFFF8; - h = d->h; - d->d = malloc(4 * w * h); - d->X = XCreateImage(display,CopyFromParent,ScreenD,ZPixmap,0, - d->d,w,h,8,0); - - f = ary * (double)s->h / (double)d->h; - lfa = (s->w-1) / (2.0 * M_PI); - xnp = (d->w) * 0.25; - ynp = (d->h) * 0.50; - xsp = (d->w) * 0.75; - ysp = ynp; - - for (y = 0 ; y < d->h ; ++y) - { - dy = (ynp - y); - for (x = 0 ; x < d->w/2 ; ++x) /* Northern hemisphere */ - { - dx = (xnp - x); - a = atan2(dx,dy) * lfa; - b = sqrt(dx * dx + dy * dy) * f; - if (a < 0.0) a += (s->w); - if (a >= 0 && a < s->w && b >= 0 && b <= s->h/2) - XPutPixel(d->X,x,y,XGetPixel(s->X,a,b)); - else XPutPixel(d->X,x,y,BlackPix); - } - dy = (ysp - y); - for (x = d->w/2 ; x < d->w ; ++x) /* Southern hemisphere */ - { - dx =(x - xsp); - a = atan2(dx,dy) * lfa; - b = s->h - f * sqrt(dx * dx + dy * dy); - if (a < 0.0) a += (s->w); - if (a >= 0 && a < s->w && b >= 0 && b >= s->h/2 && b <= s->h) - XPutPixel(d->X,x,y,XGetPixel(s->X,a,b)); - else XPutPixel(d->X,x,y,BlackPix); - } - } -} - - -void RevOrtho(double R, double lam0, double phi0, int xx, int yy, double *lam, double *phi) -{ - double rho,c,rhoq,x,y; - - x = xx; - y = yy; - - rhoq = x*x + y*y; - rho = sqrt(rhoq); - if (rho > R) - { - *phi = 999.9; - *lam = 999.9; - } - else if (rho > R / 100000.0) - { - c = asin(rho / R); - *phi = asin(cos(c) * sin(phi0) + y * sin(c) * cos(phi0) / rho); - *lam = lam0 + atan2(x * sin(c) , rho * cos(phi0) * cos(c) - y * sin(phi0) * sin(c)); - } - else - { - *phi = phi0; - *lam = lam0; - } - // printf("[%6.1lf / %6.1lf] --> (%6.1lf / %6.1lf)\n",x,y,*lam,*phi); -} - -/* ==================================================== */ -/* AzimuthalImage - Display map in azimuthal projection */ -/* ==================================================== */ - -void AzimuthalImage(struct MapImageStruct *s, struct MapImageStruct *d) -{ - int lam; // lambda pixel coordinate in source image - int phi; // phi pixel coordinate in source image - int x ; // x pixel coordinate in destination image - int y ; // y pixel coordinate in destination image - int dxc; // pixel coordinate of centre position - int dxl; // pixel coordinate of left most position - int dxr; // pixel coordinate of right most position - int dx ; // centre relative x position - int dy ; // centre relative y position - int p00; // euqator - int l00; // reference longitude - - unsigned int dih; // destination image height - unsigned int diw; // destination image width - unsigned int dpw; // destination image padded width - - double rad; // pixel radius of new image - double ysc; // yscale = source height / destination height - double rho; // distance from centre - double xpi; // x scale factor = 2 * PI / width - double ypi; // y scale factor = PI / height - double xrf; - double yrf; - - XImage *sX; // source image - XImage *dX; // destination image - - - // Destroy old image structure inclusive data storage - - if (d->X) XDestroyImage(d->X); - - // Set width of new image - - diw = d->w; - - // Pad width of new image to a multiple of 8 - - dpw = (diw + 7) & 0xFFF8; - - // Set height of new image - - dih = d->h; - - // Allocate space for image data - - d->d = calloc(dpw * dih,4); - - // Create image structure - - dX = d->X = XCreateImage(display,CopyFromParent,ScreenD,ZPixmap,0,d->d,dpw,dih,8,0); - sX = s->X; - - p00 = s->h >> 1; - rad = dih >> 1; - dxc = diw >> 1; - dxl = MAX(dxc - rad, 0); - dxr = MIN(dxc + rad, diw); - xpi = s->w / M_PI * 0.5; - ypi = s->h / M_PI; - ysc = (double)s->h / (double)dih; - l00 = (int)((d->l * s->w) / 360 + s->w/2) % s->w; - xrf = (double)diw / pow(2.0,31), - yrf = (double)dih / pow(2.0,31); - - // Paint some stars on the sky - - srandom(Seed); - for (y = 0 ; y < (diw * dih) >> 8 ; ++y) - XPutPixel(dX,xrf*random(),yrf*random(),WhitePix); - - for (y = 0 ; y < dih ; ++y) - { - dy = y - rad; - phi = y * ysc; - for (x = dxl ; x < dxr ; ++x) - { - dx = x - dxc; - rho = sqrt(dx * dx + dy * dy); - if (rho < rad) - { - lam = l00 + xpi * atan2(dx / rad, cos(asin(rho / rad))); - phi = p00 + ypi * asin(dy / rad); - XPutPixel(dX,x,y,XGetPixel(sX,lam,phi)); - } - } - } -} - - -void SwapIEEE16(char W[2]) -{ - char B; - - B = W[0]; W[0] = W[1]; W[1] = B; -} - -void SwapIEEE32(char W[4]) -{ - char B; - - B = W[0]; W[0] = W[3]; W[3] = B; - B = W[1]; W[1] = W[2]; W[2] = B; -} - -int ReadINT(FILE *fpi) -{ - int i,k; - i = fread(&k,sizeof(k),1,fpi); - if (BigEndian) SwapIEEE32((char *)&k); - return k; -} - -short ReadSHORT(FILE *fpi) -{ - short i,k; - i = fread(&k,sizeof(k),1,fpi); - if (BigEndian) SwapIEEE16((char *)&k); - return k; -} - -void ReadImage(struct MapImageStruct *ei, char *filename) -{ - char ch; - int i,n,x,y,z; - long r,g,b; - int FileSize; - int Reserved; - int OffBits; - int PicBytes; - int ImgBytes; - int PadWidth; - int PadBytes; - int bpp; - int byr; - FILE *fp; - unsigned char *BuffImageData; - - if (!(fp = fopen(filename,"r"))) return; - ch = fgetc(fp); - if (ch != 'B') return; - ch = fgetc(fp); - if (ch != 'M') return; - FileSize = ReadINT(fp); - Reserved = ReadINT(fp); - OffBits = ReadINT(fp); - - if (Debug) - { - printf("Properties of %s:\n",filename); - printf("FileSize = %d\n",FileSize); - printf("FileOffset = %d\n",OffBits); - } - - ImageBMI.Size = ReadINT(fp); - ImageBMI.Width = ReadINT(fp); - ImageBMI.Height = ReadINT(fp); - ImageBMI.Planes = ReadSHORT(fp); - ImageBMI.Count = ReadSHORT(fp); - ImageBMI.Compression = ReadINT(fp); - ImageBMI.SizeImage = ReadINT(fp); - ImageBMI.XPelsPerMeter = ReadINT(fp); - ImageBMI.YPelsPerMeter = ReadINT(fp); - ImageBMI.ClrUsed = ReadINT(fp); - ImageBMI.ClrImportant = ReadINT(fp); - - PadWidth = (ImageBMI.Width + 7) & 0xFFF8; - bpp = ImageBMI.Count >> 3; - PadBytes = (4 - ((ImageBMI.Width * bpp) % 4)) % 4 ; - - if (Debug) - { - printf("BMI Size = %d\n",ImageBMI.Size); - printf("BMI Width = %d\n",ImageBMI.Width); - printf("BMI Height = %d\n",ImageBMI.Height); - printf("BMI Planes = %d\n",ImageBMI.Planes); - printf("BMI Count = %d\n",ImageBMI.Count); - printf("BMI ClrUsed = %d\n",ImageBMI.ClrUsed); - printf("Pad Bytes = %d\n",PadBytes); - printf("ScreenD= %d\n",ScreenD); - } - - PicBytes = (bpp * ImageBMI.Width + PadBytes) * ImageBMI.Height; - ImgBytes = 4 * PadWidth * ImageBMI.Height; - ei->d = calloc(ImgBytes,1); - BuffImageData = malloc(PicBytes); - fseek(fp,OffBits,SEEK_SET); - n = fread(BuffImageData,PicBytes,1,fp); - fclose(fp); - - ei->X = XCreateImage(display,CopyFromParent,ScreenD,ZPixmap,0, - ei->d,PadWidth,ImageBMI.Height,8,0); - - for (y = 0 ; y < ImageBMI.Height ; ++y) - for (x = 0 ; x < ImageBMI.Width ; ++x) - { - i = bpp * x + (ImageBMI.Height - 1 - y) * (ImageBMI.Width*bpp+PadBytes); - b = BuffImageData[i ]; - g = BuffImageData[i+1]; - r = BuffImageData[i+2]; - XPutPixel(ei->X, x, y, create_pixel(r,g,b)); - } - free(BuffImageData); - ei->w = ImageBMI.Width; - ei->h = ImageBMI.Height; -} - - -void ntocdat(void) -{ - if (ndatim[1] > 0) - { - if (ndatim[5] >= 0) - sprintf(datch,"%s %2d-%s-%04d %2d:%02d",wena[ndatim[5]],ndatim[2],mona[ndatim[1]-1], - ndatim[0],ndatim[3],ndatim[4]); - else - sprintf(datch,"%2d-%s-%04d %2d:%02d",ndatim[2],mona[ndatim[1]-1], - ndatim[0],ndatim[3],ndatim[4]); - } -} - -/* ============================================== */ -/* CharAlloc - Allocate space for character array */ -/* ============================================== */ - -char *CharAlloc(int bytes,char *array_name) -{ - char *result = NULL; - if (bytes > 0) - { - result = (char *)calloc(bytes, sizeof(char)); - if (!result || Debug) - { - if (!result) printf("*** Out of Memory *** on "); - printf("CharAlloc: at%10p %6d char for %-30.30s\n", - result,bytes,array_name); - } - } - return(result); -} - -/* ======================================= */ -/* IntAlloc - Allocate space for int array */ -/* ======================================= */ - -int *IntAlloc(int words,char *array_name) -{ - int *result = NULL; - if (words > 0) - { - result = (int *) calloc(words, sizeof(int)); - if (!result || Debug) - { - if (!result) printf("*** Out of Memory *** on "); - printf("IntAlloc: at%10p %6d int for %s\n", - result,words,array_name); - } - } - return(result); -} - -/* =========================================== */ -/* FloatAlloc - Allocate space for float array */ -/* =========================================== */ - -float *FloatAlloc(int words, char *array_name) -{ - float *result = NULL; - if (words > 0) - { - result = (float *) calloc(words, sizeof(float)); - if (!result || Debug) - { - if (!result) printf("*** Out of Memory *** on "); - printf("FloatAlloc: at%10p %6d float for %s\n", - result,words,array_name); - } - } - return(result); -} - -/* ========================================== */ -/* SizeAlloc - Allocate space for sized array */ -/* ========================================== */ - -void *SizeAlloc(int words, int Size, char *array_name) -{ - void *result = NULL; - if (words > 0) - { - result = (void *) calloc(words, Size); - if (!result || Debug) - { - if (!result) printf("*** Out of Memory *** on "); - printf("SizeAlloc: at%10p %6d void for %s\n", - result,words,array_name); - } - } - return(result); -} - -void LoadFonts(void) -{ - if ((FixFont = XLoadQueryFont(display,FixFontName)) == NULL) - { - printf("%s: Cannot open %s font\n",progname,FixFontName); - exit(-1); - } - if ((SubFont = XLoadQueryFont(display,SubFontName)) == NULL) - { - SubFont = FixFont; - } - if ((BigFont = XLoadQueryFont(display,BigFontName)) == NULL) - { - if ((BigFont = XLoadQueryFont(display,"10x20")) == NULL) - { - printf("%s: Cannot open %s font\n",progname,BigFontName); - exit(-1); - } - } - FixFontWidth = XTextWidth(FixFont,"X",1); - SubFontWidth = XTextWidth(SubFont,"X",1); - BigFontWidth = XTextWidth(BigFont,"X",1); - FixFontHeight = FixFont->ascent + FixFont->descent; - SubFontHeight = SubFont->ascent + SubFont->descent; - BigFontHeight = BigFont->ascent + BigFont->descent; -} - -int AllocateColorCells(struct ColorStrip cs[]) -{ - int i = 0; - XColor xcolor1,xcolor2; - - while (cs[i].Name) - { - XAllocNamedColor(display,colormap,cs[i].Name,&xcolor1,&xcolor2); - cs[i].pixel = xcolor1.pixel; - ++i; - } - return i; -} - -void CalcButtonAreas(void) -{ - int of,ds,bh,fh,fw,j; - - of = OffsetY; - ds = 10; - bh = 30; - fh = BigFontHeight; - fw = BigFontWidth; - - /* 1. Stop Button */ - - StopButton[0].y += OffsetY; - StopButton[1].y += OffsetY; - StopButton[2].y += OffsetY; - StopButton[3].y += OffsetY; - - Stop_XL = ds; - Stop_XH = Stop_XL + bh; - Stop_YL = of + ds; - Stop_YH = Stop_YL + bh; - - /* 2. Start Button */ - - Start_XL = Stop_XH + ds; - Start_XH = Start_XL + bh; - Start_YL = Stop_YL; - Start_YH = Stop_YH; - - StartButton[0].y += OffsetY; - StartButton[1].y += OffsetY; - StartButton[2].y += OffsetY; - - /* 3. Pause Button */ - - Pause_XL = Start_XH + 15; - Pause_XH = Start_XH + 35; - Pause_YL = Start_YL; - Pause_YH = Start_YH; - - PauseButton1[0].y += OffsetY; - PauseButton1[1].y += OffsetY; - PauseButton1[2].y += OffsetY; - PauseButton1[3].y += OffsetY; - - PauseButton2[0].y += OffsetY; - PauseButton2[1].y += OffsetY; - PauseButton2[2].y += OffsetY; - PauseButton2[3].y += OffsetY; - - /* 4. Help Button */ - - Help_XL = 200; - Help_XH = Help_XL + 5 * fw; - Help_YL = Pause_YL; - Help_YH = Pause_YH; - - /* 5. Minus & FBWD Button */ - - Minus_XL = 300; - Minus_XH = Minus_XL + fh; - Minus_YL = Pause_YL + (bh - fh) / 2; - Minus_YH = Minus_YL + fh; - - FBWD_XH = Minus_XL - ds/2; - FBWD_XL = FBWD_XH - fh; - FBWD_YL = Minus_YL; - FBWD_YH = Minus_YH; - - /* 6. Parameter Change Area */ - - Parc_XL = Minus_XH + ds; - Parc_XH = Parc_XL + fw * 14; - Parc_YL = Minus_YL; - Parc_YH = Minus_YH; - Parc_XD = Parc_XH - Parc_XL; - Parc_YD = Parc_YH - Parc_YL; - - /* 7. Plus & FFWD Button */ - - Plus_XL = Parc_XH + ds; - Plus_XH = Plus_XL + fh; - Plus_YL = Minus_YL; - Plus_YH = Minus_YH; - - FFWD_XL = Plus_XH + ds/2; - FFWD_XH = FFWD_XL + fh; - FFWD_YL = Plus_YL; - FFWD_YH = Plus_YH; - - /* 8. Grid on/off box */ - - Grid_XL = Stop_XL; - Grid_XH = Grid_XL + FixFontHeight; - Grid_YL = Stop_YH + 3 * BigFontHeight / 2; - Grid_YH = Grid_YL + FixFontHeight; - - /* Window status and select boxes */ - - Wbox_XL = 580; - Wbox_XH = Wbox_XL + FixFontHeight; - Wbox_YL = 0; - Wbox_YH = NumWin * FixFontHeight; -} - - -/* Hack for getting information of window decoration */ -/* especially borderwidth and titleheight */ -/* These are properties of the window manager and are */ -/* usually adjustable by the user */ - -void TestWindow(int xx, int yy, int wi, int he, int *x, int *y, - int *X, int *Y, unsigned int *W, unsigned int *H) -{ - unsigned int DepthReturn = 0; - unsigned int BorderReturn = 0; - Window TW,Parent,Child; - - TW = XCreateWindow(display,RootWindow(display,screen_num), - xx,yy,wi,he, // x,y,w,h - 0,CopyFromParent,InputOutput, // border, depth, class - CopyFromParent,0,NULL); // visual, valuemask, attributes - XSelectInput(display,TW,ExposureMask); - XMapWindow(display,TW); - XMoveWindow(display,TW,xx,yy); - XNextEvent(display,&CowEvent); // Wait until WM mapped it - XGetGeometry(display,TW,&Parent,x,y,W,H,&BorderReturn,&DepthReturn); - XTranslateCoordinates(display,TW,Parent,0,0,X,Y,&Child); - XDestroyWindow(display,TW); - - if (Debug) - { - printf("TW[%x][%x]: %4d / %4d %4d x %4d x %2d [%2d:%2d]\n", - (int)TW,(int)Parent,*x,*y,*W,*H,DepthReturn,*X,*Y); - } -} - - -void CreateTestWindow(void) -{ - int X,Y,xp,yp; - unsigned int W,H; - - // Open a test window with displacement x = 100 and y = 100 - // Test the returned coordinates for upper left corner - // and compute left margin (border) and top margin (title bar) - - TestWindow(100,100,100,100,&xp,&yp,&X,&Y,&W,&H); - - // Left margin - - if (X >= 100 && X < 110) WinLM = X - 100; - - // Right margin - - WinRM = WinLM; - - // Top margin - - if (Y >= 100 && Y < 150) WinTM = Y - 100; - else if (Y > 0 && Y < 50) WinTM = Y; - - // Bottom margin - - WinBM = WinLM; - - // Open a full screen test window - // Test the returned coordinates for upper left corner - // the y displacement should be WinTM plus Windowmanager menu bar - - TestWindow(0,0,ScreenW,ScreenH,&xp,&yp,&X,&Y,&W,&H); - - // Window manager menu bar on top - - if (yp > WinTM) WM_top_area = yp - WinTM; - - - // Last usable scan line - - ScreenBot = WM_top_area + WinTM + H; - if (ScreenBot > ScreenH) ScreenBot = ScreenH; - - // Are we running on a 27" iMac :-) - - if (ScreenW == 2560 && ScreenH > 1400) ScreenBot -= 100; - - if (Debug) - { - printf("Screen = %4d x %4d x %2d\n",ScreenW,ScreenH,ScreenD); - printf("ScreenBot = %4d\n",ScreenBot); - printf("Top reserved = %4d\n",WM_top_area); - printf("Bot reserved = %4d\n",ScreenH-ScreenBot); - printf("Left margin = %4d\n",WinLM); - printf("Right margin = %4d\n",WinRM); - printf("Top margin = %4d\n",WinTM); - printf("Bot margin = %4d\n",WinBM); - } -} - - -void TrimCopy(char *Trim, char *Line, int n) -{ - int l; - char *s; - - l = strlen(Line); - Line[--l] = 0; // Remove linefeed - while (Line[l-1] == ' ') Line[--l] = 0; // Remove trailing blanks - s = Line; - while (*s == ' ') ++s; // Remove leading blanks - strncpy(Trim,s,n); -} - - -int ReadConfig(char *filename) -{ - FILE *fp; - int i,w,l,s,p; - char Line[256]; - char Plot[80]; - char Palette[80]; - char Projection[80]; - char Rotation[80]; - char *t; - - fp = fopen(filename,"r"); - if (!fp) return 1; - - w = -2; - s = -1; - p = -1; - while (!feof(fp)) - { - t = fgets(Line,256,fp); - if (Line[0] == '#') continue; - if (strncmp(Line,"[Window " , 8) == 0) w = atoi(Line+8); - if (strncmp(Line,"[Control" , 8) == 0) w = -1; - if (strncmp(Line,"[Scalar " , 8) == 0) s = atoi(Line+8); - if (strncmp(Line,"WinRows =" , 9) == 0) - { - WinRows = atoi(Line+9); - if (WinRows < 1) WinRows = 1; - if (WinRows > 3) WinRows = 3; - NumWin = WinCols * WinRows; - } - if (strncmp(Line,"WinCols =" , 9) == 0) - { - WinCols = atoi(Line+9); - if (WinCols < 1) WinCols = 1; - if (WinCols > 3) WinCols = 3; - NumWin = WinCols * WinRows; - } - if (strncmp(Line,"[Parameter " ,11) == 0) - { - p = atoi(Line+11); - if (p >= Parcs) Parcs = p+1; - } - if (strncmp(Line,"Geometry:",9) == 0 && w >= 0 && w < NUMWIN) - { - sscanf(Line+9,"%d %d %d %d",&WinAtt[w].w,&WinAtt[w].h, - &WinAtt[w].x,&WinAtt[w].y); - WinAtt[w].active = 1; - } - if (strncmp(Line,"Inactive:",9) == 0 && w >= 0 && w < NUMWIN) - { - sscanf(Line+9,"%d %d %d %d",&WinAtt[w].w,&WinAtt[w].h, - &WinAtt[w].x,&WinAtt[w].y); - WinAtt[w].active = 0; - } - if (strncmp(Line,"Geometry:",9) == 0 && w == -1) - { - sscanf(Line+9,"%d %d %d %d",&CowW,&CowH,&CowX,&CowY); - } - if (strncmp(Line,"Title:",6) == 0 && w >= -1 && w < NUMWIN) - { - if (w == -1) TrimCopy(PlanetName,Line+6,sizeof(PlanetName)-1); - else TrimCopy(WindowTitle[w]+wto,Line+6,79-wto); - } - if (strncmp(Line,"Array:",6) == 0 && w >= 0 && w < NUMWIN) - TrimCopy(WinAtt[w].array_name,Line+6,79); - if (strncmp(Line,"Plot:",5) == 0 && w >= 0 && w < NUMWIN) - { - TrimCopy(Plot,Line+5,79); - for (i=0 ; i < IsoTypes ; ++i) - if (!strcmp(Plot,IsoNames[i])) WinAtt[w].Plot = i; - } - if (strncmp(Line,"Projection:",11) == 0 && w >= 0 && w < NUMWIN) - { - TrimCopy(Projection,Line+11,79); - for (i=0 ; i < MAXMAPS ; ++i) - if (!strcmp(Projection,ProNames[i])) MapPro[w] = i; - } - if (strncmp(Line,"Rotation factor:",15) == 0 && w >= 0 && w < NUMWIN) - { - TrimCopy(Rotation,Line+15,79); - MapLR[w].f = atoi(Rotation); - } - if (strncmp(Line,"Palette:",8) == 0 && w >= 0 && w < NUMWIN) - { - TrimCopy(Palette,Line+8,79); - for (i=0 ; i < PalTypes ; ++i) - if (!strcmp(Palette,PalNames[i])) WinAtt[w].Palette = i; - } - - // Dimension for time axis - - if (strncmp(Line,"DimT:" ,5) == 0) DimT = atoi(Line+5); - - // Attributes of scalars for timeseries windows - - if (strncmp(Line,"Name:" ,5) == 0 && s >= 0 && s < NUMSCALARS) - TrimCopy(TSName[s],Line+5,79); - if (strncmp(Line,"Sub:" ,4) == 0 && s >= 0 && s < NUMSCALARS) - TrimCopy(TSubsc[s],Line+4,79); - if (strncmp(Line,"Unit:" ,5) == 0 && s >= 0 && s < NUMSCALARS) - TrimCopy(TSUnit[s],Line+5,79); - if (strncmp(Line,"Scale:",6) == 0 && s >= 0 && s < NUMSCALARS) - TrimCopy(TScale[s],Line+6,79); - - // Attributes of parameter in change menu - - if (strncmp(Line,"ParName:",8) == 0 && p >= 0 && p < PARCS) - TrimCopy(Parc[p].Name,Line+8,6); - if (strncmp(Line,"ParInc:" ,7) == 0 && p >= 0 && p < PARCS) - Parc[p].Inc = atof(Line+7); - if (strncmp(Line,"ParMin:" ,7) == 0 && p >= 0 && p < PARCS) - Parc[p].Min = atof(Line+7); - if (strncmp(Line,"ParMax:" ,7) == 0 && p >= 0 && p < PARCS) - Parc[p].Max = atof(Line+7); - if (strcmp(Parc[p].Name,"SELLON") == 0) Parc[p].Inc = 360.0 / (2.0 * Latitudes); - } - fclose(fp); - return 0; -} - - -void CreateControlWindow(void) -{ - int X,Y,W,H,B,D,x,y; - char Title1[256]; - char *WinconTitle1; - char *WinconTitle3 = {"RUN finished - click on red stop button"}; - Window Rootwin; - Window Child; - - // Create title for control window - - strcpy(Title1,"Unknown model"); - if (Model == 0) // PUMA - { - if (MRpid < 0) - strcpy(Title1,"PUMA - KlimaCampus Hamburg"); - else - sprintf(Title1,"Run %d: PUMA - KlimaCampus Hamburg",MRpid); - } - else if (Model == 1) sprintf(Title1,"SAM - KlimaCampus"); - else if (Model == 2) - { - if (MRpid < 0) - sprintf(Title1,"Planet Simulator (%s) - KlimaCampus",PlanetName); - else - sprintf(Title1,"Run %d: Planet Simulator (%s) - KlimaCampus",MRpid,PlanetName); - } - else if (Model == 3) sprintf(Title1,"Planet Simulator / LSG - KlimaCampus"); - else if (Model == 4) sprintf(Title1,"CAT - Computer Aided Turbulence"); - else printf("*** unknown model number %d in guix11 ***\n",Model); - - WinconTitle1 = Title1; - if (CowW < 920 || CowW > ScreenW) CowW = 920; - if (NumWin < 5) CowH = 6 * FixFontHeight + 5; - else CowH = NumWin * FixFontHeight + 5; - if (CowX < 0 || CowX > ScreenW - CowW) CowX = (ScreenW - CowW) / 2; - if (CowY < 0 || CowY > ScreenBot - CowH - WinTM - WinBM) - CowY = ScreenBot - CowH - WinTM - WinBM; - CowSizeHints.flags = PPosition | PSize | PMinSize | PMaxSize; - CowSizeHints.min_width = CowW; - CowSizeHints.min_height = CowH; - CowSizeHints.max_width = ScreenW - WinLM - WinRM; - CowSizeHints.max_height = CowH; - if (MRnum == 2 && MRpid == 1) CowX += ScreenW; - if (Debug) printf("Control Window %d/%d %dx%d\n",CowX,CowY,CowW,CowH); - Cow = XCreateWindow(display,RootWindow(display,screen_num), // display, parent - CowX,CowY,CowW,CowH, - BorderWidth,CopyFromParent,InputOutput, // border, depth, class - CopyFromParent,0,NULL); // visual, valuemask, attributes - XStringListToTextProperty(&WinconTitle1,1,&WinconName1); - XStringListToTextProperty(&WinconTitle3,1,&WinconName3); - XStringListToTextProperty(&PauseTitle,1,&WinconPause); - XStringListToTextProperty(&ReadyTitle,1,&WinconReady); - XSetWMProtocols(display,Cow,&Delwin,1); - XSetWMProperties(display,Cow,&WinconName1,NULL, - NULL,0,&CowSizeHints,&wm_hints,&class_hints); - XSelectInput(display,Cow,ButtonPressMask | KeyPressMask | ExposureMask); - XMapWindow(display,Cow); -} - - -void ShowStep(void) -{ - char Text[80]; - XSetFont(display, gc, BigFont->fid); - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,Grey.pixel); - - if (Model == CAT) // CAT shows timestep - { - sprintf(Text,"GUI step %9d",ndatim[0]); - XDrawImageString(display,Cow,gc,10,BigFontHeight,Text,strlen(Text)); - } - else // PUMA & PLASIM show date and time - { - ntocdat(); - if (ndatim[5] == 6) XSetForeground(display,gc,Red.pixel); // sunday - XDrawImageString(display,Cow,gc,10,BigFontHeight,datch,strlen(datch)); - XSetForeground(display,gc,BlackPix); - } - - if (ShowQueue) - { - sprintf(Text,"%8d Events ",XPending(display)); - XDrawImageString(display,Cow,gc,10,60 + BigFontHeight,Text,strlen(Text)); - } - else if (fps > 1) - { - if (SkipFreq < 2) sprintf(Text,"%5d fps",fps); - else sprintf(Text,"%5d fps [%d]",fps,SkipFreq); - XDrawImageString(display,Cow,gc,10,60 + BigFontHeight,Text,strlen(Text)); - } -} - - -int FormatVal(char *Name, float V, char *Text) -{ - char Format[80]; - - if (V > 9999.9 || V < -999.9) - { - sprintf(Text,"%6.6s = *****",Name); - return strlen(Text); - } - else if (V > 999.99 ) strcpy(Format,"%6.6s =%6.1f"); - else if (V > 99.999 ) strcpy(Format,"%6.6s =%6.2f"); - else if (V > 9.9999) strcpy(Format,"%6.6s =%6.3f"); - else if (V > 0.0 ) strcpy(Format,"%6.6s =%6.4f"); - else if (V > -9.9 ) strcpy(Format,"%6.6s =%6.3f"); - else if (V > -99.9 ) strcpy(Format,"%6.6s =%6.2f"); - else strcpy(Format,"%6.6s =%6.1f"); - - sprintf(Text,Format,Name,V); - return strlen(Text); -} - - -void ShowParcs(void) -{ - char Text[80]; - int len; - float V; - - XSetFont(display, gc, BigFont->fid); - len = FormatVal(Parc[cpi].Name,Parc[cpi].Val,Text); - - XSetBackground(display,gc,WhitePix); - XSetForeground(display,gc,Red.pixel); - XFillRectangle(display,Cow,gc,Minus_XL,Minus_YL,Minus_XH-Minus_XL,Minus_YH-Minus_YL); - XFillRectangle(display,Cow,gc,FBWD_XL,FBWD_YL,FBWD_XH-FBWD_XL,FBWD_YH-FBWD_YL); - XSetForeground(display,gc,WhitePix); - XFillRectangle(display,Cow,gc,Minus_XL+3,(Minus_YH+Minus_YL)/2-1,Minus_XH-Minus_XL-5,3); - XFillRectangle(display,Cow,gc,FBWD_XL+3,(FBWD_YH+FBWD_YL)/2-1,FBWD_XH-FBWD_XL-5,3); - XSetForeground(display,gc,BlackPix); - XDrawImageString(display,Cow,gc,Parc_XL,Parc_YH-3,Text,len); - XSetForeground(display,gc,Green.pixel); - XFillRectangle(display,Cow,gc,Plus_XL,Plus_YL,Plus_XH-Plus_XL,Plus_YH-Plus_YL); - XFillRectangle(display,Cow,gc,FFWD_XL,FFWD_YL,FFWD_XH-FFWD_XL,FFWD_YH-FFWD_YL); - XSetForeground(display,gc,WhitePix); - XFillRectangle(display,Cow,gc,Plus_XL+3,(Plus_YH+Plus_YL)/2-1,Plus_XH-Plus_XL-5,3); - XFillRectangle(display,Cow,gc,FFWD_XL+3,(FFWD_YH+FFWD_YL)/2-1,FFWD_XH-FFWD_XL-5,3); - XFillRectangle(display,Cow,gc,(Plus_XH+Plus_XL)/2-1,Plus_YL+3,3,Plus_YH-Plus_YL-5); - XFillRectangle(display,Cow,gc,(FFWD_XH+FFWD_XL)/2-1,FFWD_YL+3,3,FFWD_YH-FFWD_YL-5); - XSetForeground(display,gc,BlackPix); - XDrawRectangle(display,Cow,gc,Minus_XL,Minus_YL,Minus_XH-Minus_XL,Minus_YH-Minus_YL); - XDrawRectangle(display,Cow,gc,FBWD_XL,FBWD_YL,FBWD_XH-FBWD_XL,FBWD_YH-FBWD_YL); - XDrawRectangle(display,Cow,gc,Parc_XL-1,Parc_YL-1,Parc_XH-Parc_XL+1,Parc_YH-Parc_YL); - XDrawRectangle(display,Cow,gc,Plus_XL,Plus_YL,Plus_XH-Plus_XL,Plus_YH-Plus_YL); - XDrawRectangle(display,Cow,gc,FFWD_XL,FFWD_YL,FFWD_XH-FFWD_XL,FFWD_YH-FFWD_YL); - - /* Show next parameter */ - - strcpy(Text," "); - if (cpi < Parcs-1) FormatVal(Parc[cpi+1].Name,Parc[cpi+1].Val,Text); - len = strlen(Text); - - XSetBackground(display,gc,WhitePix); - XSetForeground(display,gc,BlackPix); - XDrawImageString(display,Cow,gc,Parc_XL,2*Parc_YH-Parc_YL-3,Text,len); - XDrawRectangle(display,Cow,gc,Parc_XL-1,Parc_YH-1,Parc_XH-Parc_XL+1,Parc_YH-Parc_YL); - - /* Show previous parameter */ - - strcpy(Text," "); - if (cpi > 0) FormatVal(Parc[cpi-1].Name,Parc[cpi-1].Val,Text); - len = strlen(Text); - - XSetBackground(display,gc,WhitePix); - XSetForeground(display,gc,BlackPix); - XDrawImageString(display,Cow,gc,Parc_XL,Parc_YL-3,Text,len); - XDrawRectangle(display,Cow,gc,Parc_XL-1,2*Parc_YL-Parc_YH-1,Parc_XH-Parc_XL+1,Parc_YH-Parc_YL); - XSetFont(display, gc, FixFont->fid); - -} - - -void CheckMark(int x, int y, int d) -{ - XDrawLine(display,Cow,gc,x+2,y+2,x+d-1,y+d-1); - XDrawLine(display,Cow,gc,x+3,y+2,x+d-1,y+d-2); - XDrawLine(display,Cow,gc,x+2,y+3,x+d-2,y+d-1); - - XDrawLine(display,Cow,gc,x+d-1,y+1,x+2,y+d-2); - XDrawLine(display,Cow,gc,x+d-2,y+1,x+2,y+d-3); - XDrawLine(display,Cow,gc,x+d-1,y+2,x+3,y+d-2); -} - - -void ShowWindowStatus(void) -{ - char *cp; - char Text[80]; - int len,w,x,d; - - XSetFont(display, gc, FixFont->fid); - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,Grey.pixel); - x = Wbox_XL; - d = FixFontHeight; - for (w=0 ; w < NumWin ; ++w) - { - strncpy(Text,WindowTitle[w]+wto,40); - Text[40] = 0; - cp = strstr(Text,"Level"); - if (cp) *cp = 0; - cp = strstr(Text,"Latitude"); - if (cp) *cp = 0; - len = strlen(Text); - XDrawImageString(display,Cow,gc,x+20,(w+1) * d,Text,len); - } - XSetForeground(display,gc,WhitePix); - for (w=0 ; w < NumWin ; ++w) - { - XFillRectangle(display,Cow,gc,x,w*d,d,d); - } - XSetForeground(display,gc,BlackPix); - for (w=0 ; w < NumWin ; ++w) - { - XDrawRectangle(display,Cow,gc,x,w*d,d,d); - } - for (w=0 ; w < NumWin ; ++w) - if (Win[w]) CheckMark(x,w*d,d); -} - - -void ShowGridStatus(void) -{ - int x,y,d; - - d = FixFontHeight; - x = Grid_XL; - y = Grid_YL; - XSetFont(display, gc, FixFont->fid); - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,Grey.pixel); - XDrawImageString(display,Cow,gc,Grid_XH+FixFontWidth,Grid_YH,"Grid",4); - XSetForeground(display,gc,WhitePix); - XFillRectangle(display,Cow,gc,x,Grid_YL,d,d); - XSetForeground(display,gc,BlackPix); - XDrawRectangle(display,Cow,gc,x,Grid_YL,d,d); - - if (Grid) CheckMark(x,y,d); -} - - -int RedrawControlWindow(void) -{ - char Text[80]; - int status,WinXSize,WinYSize,font_height,width,len; - int i,j,x1,x2,y1,y2,y3; - XWindowAttributes CurAtt; - - status = XGetWindowAttributes(display,Cow,&CurAtt); - WinXSize = CurAtt.width; - WinYSize = CurAtt.height; - - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,WhitePix); - - XSetWindowBackground(display,Cow,Grey.pixel); - XClearWindow(display,Cow); - - /* Red stop button */ - - XSetForeground(display,gc,Red.pixel); - XFillPolygon(display,Cow,gc,StopButton,4,Convex,CoordModeOrigin); - XSetForeground(display,gc,WhitePix); - x1 = StopButton[0].x ; - y1 = StopButton[0].y ; - for (j=0 ; j < PSDIM ; ++j) - for (i=0 ; i < PSDIM ; ++i) - if (pixelstar[j][i] == '*') - XDrawPoint(display,Cow,gc,i+x1,j+y1); - - XSetForeground(display,gc,LightRed.pixel); - x1 = 10; x2 = 40 ; y1 = OffsetY + 10 ; y2 = OffsetY + 40; - XDrawLine(display,Cow,gc,x2 ,y1-1,x2 ,y2 ); - XDrawLine(display,Cow,gc,x2+1,y1-2,x2+1,y2+1); - XDrawLine(display,Cow,gc,x1-1,y1-1,x2 ,y1-1); - XDrawLine(display,Cow,gc,x2+1,y2-2,x2+1,y1-2); - XSetForeground(display,gc,DarkRed.pixel); - XDrawLine(display,Cow,gc,x1-1,y1-1,x1-1,y2 ); - XDrawLine(display,Cow,gc,x1-2,y1-2,x1-2,y2+1); - XDrawLine(display,Cow,gc,x1-1,y2 ,x2 ,y2 ); - XDrawLine(display,Cow,gc,x1-2,y2+1,x2+1,y2+1); - - // Green <play> button - - XSetForeground(display,gc,Green.pixel); - XFillPolygon(display,Cow,gc,StartButton,3,Convex,CoordModeOrigin); - x1 = 50; x2 = 80 ; y1 = OffsetY + 10 ; y2 = OffsetY + 25; y3 = OffsetY + 40; - XSetForeground(display,gc,LightGreen.pixel); - XDrawLine(display,Cow,gc,x1 ,y1-1,x2 ,y2 ); - XDrawLine(display,Cow,gc,x1 ,y1-2,x2+1,y2 ); - XSetForeground(display,gc,DarkGreen.pixel); - XDrawLine(display,Cow,gc,x1-1,y1-1,x1-1,y3+1); - XDrawLine(display,Cow,gc,x1-2,y1-2,x1-2,y3+2); - - // Blue <pause> button - - XSetForeground(display,gc,Blue.pixel); - XFillPolygon(display,Cow,gc,PauseButton1,4,Convex,CoordModeOrigin); - XFillPolygon(display,Cow,gc,PauseButton2,4,Convex,CoordModeOrigin); - - x1 = 95; x2 = 102; y1 = OffsetY + 10; y2 = OffsetY + 40; - XSetForeground(display,gc,DarkBlue.pixel); - XDrawLine(display,Cow,gc,x1-1,y1-1,x1-1,y2 ); - XDrawLine(display,Cow,gc,x1-2,y1-2,x1-2,y2+1); - XDrawLine(display,Cow,gc,x1-1,y2 ,x2 ,y2 ); - XDrawLine(display,Cow,gc,x1-2,y2+1,x2+1,y2+1); - XSetForeground(display,gc,LightBlue.pixel); - XDrawLine(display,Cow,gc,x2 ,y1-1,x2 ,y2 ); - XDrawLine(display,Cow,gc,x2+1,y1-2,x2+1,y2+1); - XDrawLine(display,Cow,gc,x1-1,y1-1,x2 ,y1-1); - XDrawLine(display,Cow,gc,x2+1,y2-2,x2+1,y1-2); - - x1 = 108; x2 = 115; y1 = OffsetY + 10; y2 = OffsetY + 40; - XSetForeground(display,gc,DarkBlue.pixel); - XDrawLine(display,Cow,gc,x1-1,y1-1,x1-1,y2 ); - XDrawLine(display,Cow,gc,x1-2,y1-2,x1-2,y2+1); - XDrawLine(display,Cow,gc,x1-1,y2 ,x2 ,y2 ); - XDrawLine(display,Cow,gc,x1-2,y2+1,x2+1,y2+1); - XSetForeground(display,gc,LightBlue.pixel); - XDrawLine(display,Cow,gc,x2 ,y1-1,x2 ,y2 ); - XDrawLine(display,Cow,gc,x2+1,y1-2,x2+1,y2+1); - XDrawLine(display,Cow,gc,x1-1,y1-1,x2 ,y1-1); - XDrawLine(display,Cow,gc,x2+1,y2-2,x2+1,y1-2); - - // Help button - - x1 = 200; x2 = x1 + 5 * BigFontWidth; y1 = OffsetY + 10; y2 = y1 + 30; - XSetForeground(display,gc,Red.pixel); - XFillRectangle(display,Cow,gc,x1,y1,x2-x1,y2-y1); - XSetForeground(display,gc,BlackPix); - XDrawRectangle(display,Cow,gc,x1-1,y1-1,x2-x1+1,y2-y1+1); - XSetFont(display,gc,BigFont->fid); - XSetForeground(display,gc,Yellow.pixel); - XSetBackground(display,gc,Red.pixel); - XDrawImageString(display,Cow,gc,x1+BigFontWidth/2,(y1+y2)/2+BigFont->ascent/2,"HELP",4); - - ShowStep(); - ShowParcs(); - ShowWindowStatus(); - ShowGridStatus(); - return 0; -} - - -void ClearTracer(void) -{ - int j; - for (j=0 ; j < MAXPAR ; ++j) - { - pax[j] = -1.0; - pay[j] = -1.0; - } -} - - -int CheckEndianess(void) -{ - union EndianCheck - { - char b[sizeof(int)]; - int i; - } ec; - - ec.i = 8; - return (ec.b[0] == 0); -} - - -void initgui_(int *model, int *debug, int *lats, int *mrpid, int *mrnum, char *plan) -{ - int x,y,w,h; - int argc = 1; - int i,j; - unsigned long valuemask = 0; /* ignore XGCvalues and use defaults */ - XGCValues values; - XEvent Event; - struct timeval TimeVal; - - // Check for big endian computer - // The bitmap format ".bmp" ist little endian - - BigEndian = CheckEndianess(); - - // Set seed for random number generator from clock - - gettimeofday(&TimeVal,NULL); - Seed = TimeVal.tv_sec; - - Model = *model; - Debug = *debug; - Latitudes = *lats; - MRpid = *mrpid; - MRnum = *mrnum; - strncpy(PlanetName,plan,sizeof(PlanetName)-1); - - if (MRpid >= 0) - { - sprintf(wtrun,"[%d] ",MRpid); - wto = strlen(wtrun); - } - - if (Debug) printf("initgui(%d,%d)\n",Model,Debug); - if ((display=XOpenDisplay(display_name)) == NULL) - { - fprintf(stderr,"%s: cannot connect to X server %s\n", - progname, XDisplayName(display_name)); - exit(1); - } - screen_num = DefaultScreen(display); - ScreenD = XDefaultDepth(display,screen_num); - ScreenW = DisplayWidth (display,screen_num); - ScreenH = DisplayHeight(display,screen_num); - BlackPix = BlackPixel(display,screen_num); - WhitePix = WhitePixel(display,screen_num); - SmallScreen = ScreenH <= 768; - if (SmallScreen) - { - WinRows = 2; - NumWin = WinCols * WinRows; - Grid = 0; - } - - if (MRnum == 2) ScreenW /= 2; /* Run with two GUI's */ - - /* Fix defaults for multihead displays */ - - if (ScreenH > ScreenW && ScreenH > 1200) ScreenH = 1200; - if (ScreenW > 2 * ScreenH && ScreenW >= 2048) ScreenW /= 2; - - for (i = 0 ; i < NUMWIN ; ++i) - { - WindowTitle[i] = CharAlloc(256,"WindowTitle"); - if (wto == 0) sprintf(WindowTitle[i],"Window %d",i+1); - else sprintf(WindowTitle[i],"%sWindow %d",wtrun,i+1); - WinAtt[i].x = -1; - WinAtt[i].y = -1; - WinAtt[i].w = -1; - WinAtt[i].h = -1; - WinAtt[i].active = 1; - } - - CreateTestWindow(); - - if (MRpid >= 0) sprintf(GUI_default,"GUI_%2.2d.cfg",MRpid); - ReadConfig(GUI_default); - if (MRpid >= 0) sprintf(GUI_config,"GUI_last_used_%2.2d.cfg",MRpid); - ReadConfig(GUI_config); - - LoadFonts(); - CreateControlWindow(); - - OutXSize = (ScreenW-ScreenOffset) / WinCols; - OutYSize = (CowY-ScreenOffset-1-WM_top_area) / WinRows; - WinXSize = OutXSize - WinLM - WinRM; - WinYSize = OutYSize - WinTM - WinBM; - WinSizeHints.flags = PPosition | PSize | PMinSize; - WinSizeHints.min_width = 200; - WinSizeHints.min_height = 100; - if (Debug) - { - printf("Outer windowsize = %dx%d\n",OutXSize,OutYSize); - printf("Inner windowsize = %dx%d\n",WinXSize,WinYSize); - } - - wm_hints.initial_state = NormalState; - wm_hints.input = True; - wm_hints.flags = StateHint | InputHint; - - class_hints.res_name = progname; - class_hints.res_class = "PUMA"; - - Delwin = XInternAtom(display,"WM_DELETE_WINDOW",0); - - ReadImage(&MapHR,"map.bmp"); - - for (i = 0 ; i < NumWin ; ++i) - { - x = WinAtt[i].x; - y = WinAtt[i].y; - w = WinAtt[i].w; - h = WinAtt[i].h; - - if (x < ScreenOffset || x >= ScreenW) x = ScreenOffset+(i%WinCols)*OutXSize; - if (y < ScreenOffset || y >= ScreenH) y = ScreenOffset+(i/WinCols)*OutYSize+WM_top_area; - if (w < WinSizeHints.min_width ) w = WinXSize; - if (h < WinSizeHints.min_height) h = WinYSize; - XStringListToTextProperty(&WindowTitle[i],1,WindowName+i); - if (WinAtt[i].active) - { - if (MRnum == 2 && MRpid == 1) x += ScreenW; - Win[i] = XCreateWindow(display,RootWindow(display,screen_num), // display, parent - x,y,w,h, - BorderWidth,CopyFromParent,InputOutput, // border, depth, class - CopyFromParent,0,NULL); // visual, valuemask, attributes - XSetWMProtocols(display,Win[i],&Delwin,1); - XSetWMProperties(display,Win[i],WindowName+i,NULL, - NULL,0,&WinSizeHints,&wm_hints,&class_hints); - XSelectInput(display,Win[i],ButtonPressMask | KeyPressMask | ExposureMask); - XMapWindow(display,Win[i]); - } - } - - /* Prepare GC */ - - gc = XCreateGC(display, Cow, valuemask, &values); - XSetFont(display, gc, FixFont->fid); - colormap = XDefaultColormap(display,screen_num); - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,WhitePix); - - /* Get keyboard information */ - - XDisplayKeycodes(display,&FirstKey,&LastKey); - KeyMap = XGetKeyboardMapping(display,FirstKey,LastKey-FirstKey+1,&SymsPerKey); - - /* Allocate color cells */ - - for (i=0 ; i < NUMPAL ; ++i) - LineCo[i] = AllocateColorCells(Pallet[i]); - - /* Color cells for control window */ - - XAllocNamedColor(display,colormap,"red" ,&Red ,&Dummy); - XAllocNamedColor(display,colormap,"green" ,&Green ,&Dummy); - XAllocNamedColor(display,colormap,"blue" ,&Blue ,&Dummy); - XAllocNamedColor(display,colormap,"grey" ,&Grey ,&Dummy); - XAllocNamedColor(display,colormap,"yellow" ,&Yellow ,&Dummy); - XAllocNamedColor(display,colormap,"hot pink" ,&LightRed ,&Dummy); - XAllocNamedColor(display,colormap,"dark red" ,&DarkRed ,&Dummy); - XAllocNamedColor(display,colormap,"light blue" ,&LightBlue ,&Dummy); - XAllocNamedColor(display,colormap,"dark blue" ,&DarkBlue ,&Dummy); - XAllocNamedColor(display,colormap,"light green",&LightGreen,&Dummy); - XAllocNamedColor(display,colormap,"dark green" ,&DarkGreen ,&Dummy); - - TSColor[0] = Red.pixel; - TSColor[1] = Green.pixel; - TSColor[2] = Blue.pixel; - TSColor[3] = WhitePix; - TSColor[4] = LightRed.pixel; - TSColor[5] = Grey.pixel; - TSColor[6] = Yellow.pixel; - TSColor[7] = LightBlue.pixel; - TSColor[8] = LightGreen.pixel; - - ClearTracer(); - CalcButtonAreas(); - RedrawControlWindow(); - XSync(display,0); -} - -void FillPoly(int n, REAL Poly[]) -{ - int i; - XPoint xpol[8]; - for (i=0; i < n ; ++i) - { - xpol[i].x = OffX + Poly[i+i ] + 0.5; - xpol[i].y = OffY + Poly[i+i+1] + 0.5; - } - XFillPolygon(display,pix,gc,xpol,n,Convex,CoordModeOrigin); -} - -/* ======= */ -/* IsoArea */ -/* ======= */ - -void IsoArea(INT y, REAL vl, REAL vh, REAL Top[], REAL Bot[], INT Dim) -{ - INT f,x,p; - REAL xl,xr,yt,yb; - REAL Poly[16]; - - // if (Debug) printf("IsoArea %d %10.2f %10.2f %10.2f %10.2f %d\n",y,vl,vh,Top[0],Bot[0],Dim); - for (x=0 ; x < Dim-1 ; x++) - { - Flag[x] = 0; - if (Top[x ] < vl) Flag[x] |= TOLELO; - if (Top[x ] >= vh) Flag[x] |= TOLEHI; - if (Top[x+1] < vl) Flag[x] |= TORILO; - if (Top[x+1] >= vh) Flag[x] |= TORIHI; - if (Bot[x ] < vl) Flag[x] |= BOLELO; - if (Bot[x ] >= vh) Flag[x] |= BOLEHI; - if (Bot[x+1] < vl) Flag[x] |= BORILO; - if (Bot[x+1] >= vh) Flag[x] |= BORIHI; - } - - x = 0; - - while (x < Dim-1) - { - xl = VGAX * x ; - xr = VGAX * (x+1); - yt = VGAY * y ; - yb = VGAY * (y+1); - f = Flag[x]; - - if (f == 0) - { - x++; - while (x < Dim-1 && Flag[x] == 0) - { - x++; - xr = VGAX * x; - } - Poly[0] = Poly[6] = xl; - Poly[1] = Poly[3] = yt; - Poly[2] = Poly[4] = xr; - Poly[5] = Poly[7] = yb; - - FillPoly(4,Poly); - - } - else if (f == (TOLELO | TORILO | BOLELO | BORILO) || - f == (TOLEHI | TORIHI | BOLEHI | BORIHI)) x++; - else if (Top[x] < vl && Top[x+1] >= vl && Bot[x] >= vl && Bot[x+1] < vl) - { - Poly[1] = Poly[3] = yt; - Poly[2] = Poly[4] = xr; - Poly[0] = IPX(Top[x ],vl,Top[x+1]); - Poly[5] = IPY(Top[x+1],vl,Bot[x+1]); - FillPoly(3,Poly); - Poly[1] = Poly[3] = yb; - Poly[2] = Poly[4] = xl; - Poly[0] = IPX(Bot[x ],vl,Bot[x+1]); - Poly[5] = IPY(Top[x ],vl,Bot[x ]); - FillPoly(3,Poly); - ++x; - } - else if (Top[x] >= vl && Top[x+1] < vl && Bot[x] < vl && Bot[x+1] >= vl) - { - Poly[0] = Poly[4] = xl; - Poly[1] = Poly[3] = yt; - Poly[2] = IPX(Top[x ],vl,Top[x+1]); - Poly[5] = IPY(Top[x ],vl,Bot[x ]); - FillPoly(3,Poly); - Poly[0] = Poly[2] = xr; - Poly[3] = Poly[5] = yb; - Poly[1] = IPY(Top[x+1],vl,Bot[x+1]); - Poly[4] = IPX(Bot[x ],vl,Bot[x+1]); - FillPoly(3,Poly); - ++x; - } - else - { - p = 0; - - if (Top[x] < vl) - { - if (Top[x+1] >= vl) - { - Poly[p++] = IPX(Top[x],vl,Top[x+1]); - Poly[p++] = yt; - } - - if (Top[x+1] >= vh) - { - Poly[p++] = IPX(Top[x],vh,Top[x+1]); - Poly[p++] = yt; - } - } - else if (Top[x] >= vh) - { - if (Top[x+1] < vh) - { - Poly[p++] = IPX(Top[x],vh,Top[x+1]); - Poly[p++] = yt; - } - if (Top[x+1] < vl) - { - Poly[p++] = IPX(Top[x],vl,Top[x+1]); - Poly[p++] = yt; - } - } - else - { - Poly[p++] = xl; - Poly[p++] = yt; - if (Top[x+1] < vl) - { - Poly[p++] = IPX(Top[x],vl,Top[x+1]); - Poly[p++] = yt; - } - if (Top[x+1] >= vh) - { - Poly[p++] = IPX(Top[x],vh,Top[x+1]); - Poly[p++] = yt; - } - } - - if (Top[x+1] < vl) - { - if (Bot[x+1] >= vl) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vl,Bot[x+1]); - } - - if (Bot[x+1] >= vh) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vh,Bot[x+1]); - } - } - else if (Top[x+1] >= vh) - { - if (Bot[x+1] < vh) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vh,Bot[x+1]); - } - if (Bot[x+1] < vl) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vl,Bot[x+1]); - } - } - else - { - Poly[p++] = xr; - Poly[p++] = yt; - if (Bot[x+1] < vl) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vl,Bot[x+1]); - } - if (Bot[x+1] >= vh) - { - Poly[p++] = xr; - Poly[p++] = IPY(Top[x+1],vh,Bot[x+1]); - } - } - - if (Bot[x+1] < vl) - { - if (Bot[x] >= vl) - { - Poly[p++] = IPX(Bot[x],vl,Bot[x+1]); - Poly[p++] = yb; - } - if (Bot[x] >= vh) - { - Poly[p++] = IPX(Bot[x],vh,Bot[x+1]); - Poly[p++] = yb; - } - } - else if (Bot[x+1] >= vh) - { - if (Bot[x] < vh) - { - Poly[p++] = IPX(Bot[x],vh,Bot[x+1]); - Poly[p++] = yb; - } - if (Bot[x] < vl) - { - Poly[p++] = IPX(Bot[x],vl,Bot[x+1]); - Poly[p++] = yb; - } - } - else - { - Poly[p++] = xr; - Poly[p++] = yb; - if (Bot[x] < vl) - { - Poly[p++] = IPX(Bot[x],vl,Bot[x+1]); - Poly[p++] = yb; - } - if (Bot[x] >= vh) - { - Poly[p++] = IPX(Bot[x],vh,Bot[x+1]); - Poly[p++] = yb; - } - } - - if (Bot[x] < vl) - { - if (Top[x] >= vl) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vl,Bot[x]); - } - - if (Top[x] >= vh) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vh,Bot[x]); - } - } - else if (Bot[x] >= vh) - { - if (Top[x] < vh) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vh,Bot[x]); - } - if (Top[x] < vl) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vl,Bot[x]); - } - } - else - { - Poly[p++] = xl; - Poly[p++] = yb; - if (Top[x] < vl) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vl,Bot[x]); - } - if (Top[x] >= vh) - { - Poly[p++] = xl; - Poly[p++] = IPY(Top[x],vh,Bot[x]); - } - } - FillPoly(p>>1,Poly); - x++; - } - } -} - - -/* ======= */ -/* isoarea */ -/* ======= */ - -void IsoAreas(struct ColorStrip Strip[]) -{ - INT i; - INT y; - REAL *Top; - REAL *Bot; - - i = 0; - while (Strip[i].Name) - { - Top = Field; - Bot = Field + DimX; - XSetForeground(display,gc,Strip[i].pixel); - for (y = 0 ; y < DimY-1 ; y++) - { - IsoArea(y,Strip[i].Lo,Strip[i].Hi,Top,Bot,DimX); - Top += DimX; - Bot += DimX; - } - ++i; - } -} - -/* ======= */ -/* IsoLine */ -/* ======= */ - -void IsoLine(INT y, REAL v, REAL Top[], REAL Bot[], INT Dim) -{ - INT f,x; - REAL xl,xr,yt,yb; - REAL x1,yo,x2,y2,x3,y3,x4,y4; - - for (x=0 ; x < Dim-1 ; x++) - { - Flag[x] = 0; - if (Top[x ] < v) Flag[x] |= TOLELO; - else Flag[x] |= TOLEHI; - if (Top[x+1] < v) Flag[x] |= TORILO; - else Flag[x] |= TORIHI; - if (Bot[x ] < v) Flag[x] |= BOLELO; - else Flag[x] |= BOLEHI; - if (Bot[x+1] < v) Flag[x] |= BORILO; - else Flag[x] |= BORIHI; - } - - x = 0; - - while (x < Dim-1) - { - xl = VGAX * x ; - xr = VGAX * (x+1); - yt = VGAY * y ; - yb = VGAY * (y+1); - f = Flag[x]; - - if (f == 0 || f == (TOLELO | TORILO | BOLELO | BORILO) || - f == (TOLEHI | TORIHI | BOLEHI | BORIHI)) x++; - else if (f == (TOLELO | BORILO | TORIHI | BOLEHI)) - { - x1 = IPX(Top[x ],v,Top[x+1]); - yo = yt; - x2 = xr; - y2 = IPY(Top[x+1],v,Bot[x+1]); - x3 = IPX(Bot[x ],v,Bot[x+1]); - y3 = yb; - x4 = xl; - y4 = IPY(Top[x ],v,Bot[x ]); - XDrawLine(display,pix,gc,x1,OffY+yo,x2,OffY+y2); - XDrawLine(display,pix,gc,x3,OffY+y3,x4,OffY+y4); - ++x; - } - else if (f == (TORILO | BOLELO | TOLEHI | BORIHI)) - { - x1 = xl; - yo = IPY(Top[x ],v,Bot[x ]); - x2 = IPX(Top[x ],v,Top[x+1]); - y2 = yt; - x3 = xr; - y3 = IPY(Top[x+1],v,Bot[x+1]); - x4 = IPX(Bot[x ],v,Bot[x+1]); - y4 = yb; - XDrawLine(display,pix,gc,x1,OffY+yo,x2,OffY+y2); - XDrawLine(display,pix,gc,x3,OffY+y3,x4,OffY+y4); - ++x; - } - else - { - x1 = x2 = x3 = x4 = -1; - - if ((Top[x ] < v && Top[x+1] >= v) || (Top[x ] >= v && Top[x+1] < v)) - { - x1 = IPX(Top[x ],v,Top[x+1]); - yo = yt; - } - if ((Top[x+1] < v && Bot[x+1] >= v) || (Top[x+1] >= v && Bot[x+1] < v)) - { - x2 = xr; - y2 = IPY(Top[x+1],v,Bot[x+1]); - } - if ((Bot[x+1] < v && Bot[x ] >= v) || (Bot[x+1] >= v && Bot[x ] < v)) - { - x3 = IPX(Bot[x ],v,Bot[x+1]); - y3 = yb; - } - if ((Bot[x ] < v && Top[x ] >= v) || (Bot[x ] >= v && Top[x ] < v)) - { - x4 = xl; - y4 = IPY(Top[x ],v,Bot[x ]); - } - - if (x1 >= 0 && x2 >= 0 && x3 >= 0 && x4 >= 0) - { - XDrawLine(display,pix,gc,x1,OffY+yo,x2,OffY+y2); - XDrawLine(display,pix,gc,x3,OffY+y3,x4,OffY+y4); - } - else if (x1 >= 0) - { - if (x2 >= 0) XDrawLine(display,pix,gc,x1,OffY+yo,x2,OffY+y2); - else if (x3 >= 0) XDrawLine(display,pix,gc,x1,OffY+yo,x3,OffY+y3); - else XDrawLine(display,pix,gc,x1,OffY+yo,x4,OffY+y4); - } - else if (x2 >= 0) - { - if (x3 >= 0) XDrawLine(display,pix,gc,x2,OffY+y2,x3,OffY+y3); - else XDrawLine(display,pix,gc,x2,OffY+y2,x4,OffY+y4); - } - else XDrawLine(display,pix,gc,x3,OffY+y3,x4,OffY+y4); - - x++; - } - } -} - - -/* ======== */ -/* IsoLines */ -/* ======== */ - -void IsoLines(struct ColorStrip Strip[],int Colored) -{ - INT i; - INT y; - REAL *Top; - REAL *Bot; - - XSetForeground(display,gc,BlackPix); - i = 0; - while (Strip[i].Name) - { - Top = Field; - Bot = Field + DimX; - if (Colored) XSetForeground(display,gc,Strip[i].pixel); - for (y = 0 ; y < DimY-1 ; y++) - { - IsoLine(y,Strip[i].Lo,Top,Bot,DimX); - Top += DimX; - Bot += DimX; - } - ++i; - } -} - -int AziPoint(int fpx, int fpy, int *x2, int *y2) -{ - int xc,yc; - double flam,fsin,fcos,roa,pil,piy; - - xc = InXSize >> 1; - yc = InYSize >> 1; - roa = MapLR[win].l * InXSize / 360.0; - pil = 2.0 * M_PI / InXSize; - piy = M_PI / InYSize; - - flam = (fpx - xc - roa) * pil; - if (flam < -M_PI) flam += 2.0 * M_PI; - if (flam > M_PI) flam -= 2.0 * M_PI; - if (flam < -M_PI_2 || flam > M_PI_2) return 1; - fsin = sin(flam); - fcos = cos((fpy-yc) * piy); - *x2 = xc + InYSize/2 * fcos * fsin; - *y2 = yc + InYSize/2 * sin((fpy-yc) * piy); - return 0; -} - -void AziLine(int x1, int y1, int x2, int y2) -{ - int a1,b1,a2,b2; - - if (AziPoint(x1,y1,&a1,&b1)) return; - if (AziPoint(x2,y2,&a2,&b2)) return; - XDrawLine(display,pix,gc,a1,b1,a2,b2); -} - - -/* ======= */ -/* MapLine */ -/* ======= */ - -void MapLine(INT y, REAL v, REAL Top[], REAL Bot[], INT Dim) -{ - INT f,x; - REAL xl,xr,yt,yb; - REAL x1,yo,x2,y2,x3,y3,x4,y4; - - for (x=0 ; x < Dim-1 ; x++) - { - Flag[x] = 0; - if (Top[x ] < v) Flag[x] |= TOLELO; - else Flag[x] |= TOLEHI; - if (Top[x+1] < v) Flag[x] |= TORILO; - else Flag[x] |= TORIHI; - if (Bot[x ] < v) Flag[x] |= BOLELO; - else Flag[x] |= BOLEHI; - if (Bot[x+1] < v) Flag[x] |= BORILO; - else Flag[x] |= BORIHI; - } - - x = 0; - - while (x < Dim-1) - { - xl = VGAX * x ; - xr = VGAX * (x+1); - yt = VGAY * y ; - yb = VGAY * (y+1); - f = Flag[x]; - - if (f == 0 || f == (TOLELO | TORILO | BOLELO | BORILO) || - f == (TOLEHI | TORIHI | BOLEHI | BORIHI)) x++; - else if (f == (TOLELO | BORILO | TORIHI | BOLEHI)) - { - x1 = IPX(Top[x ],v,Top[x+1]); - yo = yt; - x2 = xr; - y2 = IPY(Top[x+1],v,Bot[x+1]); - x3 = IPX(Bot[x ],v,Bot[x+1]); - y3 = yb; - x4 = xl; - y4 = IPY(Top[x ],v,Bot[x ]); - AziLine(x1,OffY+yo,x2,OffY+y2); - AziLine(x3,OffY+y3,x4,OffY+y4); - ++x; - } - else if (f == (TORILO | BOLELO | TOLEHI | BORIHI)) - { - x1 = xl; - yo = IPY(Top[x ],v,Bot[x ]); - x2 = IPX(Top[x ],v,Top[x+1]); - y2 = yt; - x3 = xr; - y3 = IPY(Top[x+1],v,Bot[x+1]); - x4 = IPX(Bot[x ],v,Bot[x+1]); - y4 = yb; - AziLine(x1,OffY+yo,x2,OffY+y2); - AziLine(x3,OffY+y3,x4,OffY+y4); - ++x; - } - else - { - x1 = x2 = x3 = x4 = -1; - - if ((Top[x ] < v && Top[x+1] >= v) || (Top[x ] >= v && Top[x+1] < v)) - { - x1 = IPX(Top[x ],v,Top[x+1]); - yo = yt; - } - if ((Top[x+1] < v && Bot[x+1] >= v) || (Top[x+1] >= v && Bot[x+1] < v)) - { - x2 = xr; - y2 = IPY(Top[x+1],v,Bot[x+1]); - } - if ((Bot[x+1] < v && Bot[x ] >= v) || (Bot[x+1] >= v && Bot[x ] < v)) - { - x3 = IPX(Bot[x ],v,Bot[x+1]); - y3 = yb; - } - if ((Bot[x ] < v && Top[x ] >= v) || (Bot[x ] >= v && Top[x ] < v)) - { - x4 = xl; - y4 = IPY(Top[x ],v,Bot[x ]); - } - - if (x1 >= 0 && x2 >= 0 && x3 >= 0 && x4 >= 0) - { - AziLine(x1,OffY+yo,x2,OffY+y2); - AziLine(x3,OffY+y3,x4,OffY+y4); - } - else if (x1 >= 0) - { - if (x2 >= 0) AziLine(x1,OffY+yo,x2,OffY+y2); - else if (x3 >= 0) AziLine(x1,OffY+yo,x3,OffY+y3); - else AziLine(x1,OffY+yo,x4,OffY+y4); - } - else if (x2 >= 0) - { - if (x3 >= 0) AziLine(x2,OffY+y2,x3,OffY+y3); - else AziLine(x2,OffY+y2,x4,OffY+y4); - } - else AziLine(x3,OffY+y3,x4,OffY+y4); - - x++; - } - } -} - - -/* ======== */ -/* MapLines */ -/* ======== */ - -void MapLines(struct ColorStrip Strip[],int Colored) -{ - INT i; - INT y; - REAL *Top; - REAL *Bot; - - XSetForeground(display,gc,BlackPix); - i = 0; - while (Strip[i].Name) - { - Top = Field; - Bot = Field + DimX; - if (Colored) XSetForeground(display,gc,Strip[i].pixel); - for (y = 0 ; y < DimY-1 ; y++) - { - MapLine(y,Strip[i].Lo,Top,Bot,DimX); - Top += DimX; - Bot += DimX; - } - ++i; - } -} - -int polco = 0; - -void poltra(float lam, float phi, float *x, float *y) -{ - REAL xnp,ynp,xsp,ysp,lfa; - - lfa = (2.0 * M_PI) / (InXSize-1) ; - xnp = (InXSize-1) * 0.25; - ynp = (InYSize-1) * 0.50; - xsp = (InXSize-1) * 0.75; - ysp = ynp; - - /* Northern hemisphere */ - - if (phi < ynp) - { - *x = xnp + sin(lam * lfa) * phi; - *y = ynp + cos(lam * lfa) * phi; - } - - /* Souhern hemisphere */ - - else - { - *x = xsp - sin(lam * lfa) * (phi-ysp); - *y = ysp + cos(lam * lfa) * (phi-ysp); - } -} - - -/* ========== */ -/* TracerPlot */ -/* ========== */ - -void TracerPlot(int w) -{ - int j,ipx,ipy,lpy,lpx,jx,jy,ic,ix,iy,ipr; - int xnp,ynp,xsp,ysp,xc,yc; - float *u; - float *v; - float fpx,fpy,du,dv,ppx,ppy,rx,ry,spfac; - float lfa,lam,phi,hpy,fcos,fsin; - float pil,piy; - float roa; - float flam; - float dpx,dpy; - float rary,alpy; - - if (Uindex < 0 || Vindex < 0) return; // Data missing - - Delpar = (8 * 60) / DeltaTime; // Injection interval - if (LevelChanged[w]) ClearTracer(); - LevelChanged[w] = 0; - if (!SpeedScale) SpeedScale = FloatAlloc(DimY,"SpeedScale"); - u = Array[Uindex].Data + Indez[w] * DimXY; - v = Array[Vindex].Data + Indez[w] * DimXY; - - TracerColor = Yellow.pixel; - if (nstep % (8*Delpar) == 0) ColInd++; - if (ColInd >= AUTOCOLORS) ColInd = 0; - TracerColor = Autostrip[ColInd].pixel; - - dpx = (float)(InXSize-1) / (float)(DimX-1); - dpy = (float)(InYSize-1) / (float)(DimY-1); - lpx = InXSize; - lpy = InYSize; - hpy = 0.5 * dpy; - xc = lpx / 2; - yc = lpy / 2; - pil = 2.0 * M_PI / lpx; - piy = M_PI / lpy; - roa = MapLR[w].l * lpx / 360.0; - rary = 1.0 / ary; - alpy = rary * lpy; - ipr = rary * InYSize / 80.0; // Size of tracer dots - - // Compute scale factors - - if (SizeChanged || nstep < 10) - { - for (j=0 ; j < DimY; ++j) - { - SpeedScale[j] = InXSize * DeltaTime * 60.0 / 40000000.0 - / cos((j-0.5*(DimY-1)) * (M_PI/DimY)); - } - SpeedScale[DimY-1] = SpeedScale[0] = SpeedScale[1]; - } - - // Insert new particles - - if (nstep % Delpar == 0) - { - fpx = dpx * (DimX-1) / 2.0; - for (ipy = 0 ; ipy < lpy ; ipy += dpy) - { - ParInd = (ParInd+1) & (MAXPAR-1); - pax[ParInd] = fpx; - pay[ParInd] = ipy + hpy; - pal[ParInd] = TracerColor; - } - } - - // Move particles - - for (j=0 ; j < MAXPAR ; ++j) - if (pax[j] >= 0.0 && pay[j] >= 0.0) - { - jx = rx = pax[j] / dpx; - jy = ry = pay[j] / dpy; - ic = jx + DimX * jy; - ix = ic + 1; - if (jx >= DimX-1) ix -= DimX; - iy = ic + DimX; - if (iy >= DimX * DimY) iy -= DimX; - rx -= jx; - ry -= jy; - - du = u[ic]+(u[ix]-u[ic])*rx+(u[iy]-u[ic])*ry; - dv = v[ic]+(v[ix]-v[ic])*rx+(v[iy]-v[ic])*ry; - spfac = SpeedScale[jy] + (SpeedScale[jy+1]-SpeedScale[jy]) * ry; - du *= spfac; - dv *= spfac; - fpx = pax[j] + du; - fpy = pay[j] + dv; - if (fpx < 0.0) fpx += lpx; - if (fpx >= lpx) fpx -= lpx; - if (fpy < 0.0 || fpy > lpy-1) - { - pay[j] = -1.0; - continue; - } - pax[j] = fpx; - pay[j] = fpy; - ipx = -1; - if (MapPro[w] == POLAR) - { - lfa = (2.0 * M_PI) / lpx; - xnp = (InXSize-1) * 0.25; - ynp = (InYSize-1) * 0.50; - xsp = (InXSize-1) * 0.75; - ysp = ynp; - lam = fpx; - phi = fpy * rary; - if (fpy < 0.5 * lpy) /* Northern hemisphere */ - { - fpx = xnp - sin(lam * lfa) * (phi + hpy); - fpy = ynp - cos(lam * lfa) * (phi + hpy); - } - else /* Souhern hemisphere */ - { - fpx = xsp + sin(lam * lfa) * (alpy - phi + hpy); - fpy = ysp - cos(lam * lfa) * (alpy - phi + hpy); - } - ipx = rintf(fpx); - ipy = rintf(fpy); - } - else if (MapPro[w] == AZIMUTHAL) - { - flam = (fpx - xc - roa) * pil; - if (flam < -M_PI) flam += 2.0 * M_PI; - if (flam > M_PI) flam -= 2.0 * M_PI; - if (flam < -M_PI_2 || flam > M_PI_2) continue; - fsin = sin(flam); - fcos = cos((fpy-yc) * piy); - fpx = xc + lpy/2 * fcos * fsin; - fpy = yc + lpy/2 * sin((fpy-yc) * piy); - ipx = rintf(fpx); - ipy = rintf(fpy); - } - else - { - ipx = rintf(fpx); - ipy = rintf(fpy); - } - if (ipx >= 0) - { - XSetForeground(display,gc,pal[j]); - if (ipr < 2) XDrawPoint(display,pix,gc,ipx,ipy); - else if (ipr == 2) XFillRectangle(display,pix,gc,ipx,ipy,2,2); - else XFillArc(display,pix,gc,ipx,ipy,ipr,ipr,0,360*64); - } - } -} - - -/* ============= */ -/* AmplitudePlot */ -/* ============= */ - -void AmplitudePlot(void) -{ - int i,j,m,n; - int x,y; - int r,dx,dy; - int mmax; - int imax; - REAL Amax,Fac; - - if (!Ampli) Ampli = FloatAlloc(DimX,"Ampli"); - if (!Acol ) Acol = SizeAlloc(DimX,sizeof(XColor),"Acol"); - - Amax = 0.0; - imax = 0; - for (i=0 ; i < DimX ; ++i) - { - Ampli[i] = log (1.0 + sqrt(Field[2*i]*Field[2*i]+Field[2*i+1]*Field[2*i+1])); - Acol[i].pixel = WhitePix; - if (Ampli[i] > Amax && i > DimY) - { - Amax = Ampli[i]; - imax = i; - } - } - - Fac = 0.0; - if (Amax > 1.e-20) Fac = 1.0 / Amax; - for (i=0 ; i < DimX ; ++i) - { - j = AMPLI_COLS * Ampli[i] * Fac; - if (j >= AMPLI_COLS) j = AMPLI_COLS-1; - Acol[i].pixel = AmpliStrip[j].pixel; - } - - dx = WinXSize / 23; - r = (dx+dx) / 3; - mmax = (InYSize / dx) - 1; - XSetForeground(display,gc,BlackPix); - for (m=0,i=0 ; m < mmax ; ++m) - { - y = FixFontHeight + 4 + m * dx; - for (n=m ; n < DimY ; ++n,++i) - if (n < 22) - { - x = dx/2 + n * dx; - XSetForeground(display,gc,Acol[i].pixel); - XFillArc(display,pix,gc,x,y,r,r,0,360*64); - } - } -} - - -void RedrawIsoWindow(int w) -{ - if (WinPixMap[w].Pix) - XCopyArea(display,WinPixMap[w].Pix,Win[w],gc,0,0,WinPixMap[w].DimX,WinPixMap[w].DimY,0,0); -} - - -void CloseWindow(int i) -{ - INTXS X,Y,xp,yp; - unsigned int border,depth; - Window Rootwin,Child; - - if (Win[i]) - { - XGetGeometry(display,Win[i],&Rootwin,&xp,&yp,&WinAtt[i].w,&WinAtt[i].h,&border,&depth); - XTranslateCoordinates(display,Win[i],Rootwin,0,0,&X,&Y,&Child); - WinAtt[i].x = X - WinLM; - WinAtt[i].y = Y - WinTM; - XDestroyWindow(display,Win[i]); - Win[i] = 0; - ShowWindowStatus(); - } -} - -void ReopenWindow(int i) -{ - if (Win[i] == 0) - { - if (WinAtt[i].x < ScreenOffset) WinAtt[i].x = ScreenOffset + OutXSize * (i % WinCols); - if (WinAtt[i].y < ScreenOffset) WinAtt[i].y = ScreenOffset + OutYSize * (i / WinCols); - Win[i] = XCreateSimpleWindow(display,RootWindow(display,screen_num), - WinAtt[i].x,WinAtt[i].y,WinAtt[i].w,WinAtt[i].h, - BorderWidth,BlackPix,WhitePix); - XSetWMProtocols(display,Win[i],&Delwin,1); - XSetWMProperties(display,Win[i],WindowName+i,NULL, - NULL,0,&WinSizeHints,&wm_hints,&class_hints); - XSelectInput(display,Win[i],ButtonPressMask | KeyPressMask | ExposureMask); - XMapWindow(display,Win[i]); - ShowWindowStatus(); - } -} - -char *HelpText[] = -{ - "Key assignment for azimuthal projection ", - "--------------------------------------------", - "<- cursor left : increase westward rotation", - "-> cursor right : increase eastward rotation", - "============================================", - "Key assignment for 3D variables ", - "--------------------------------------------", - "^ cursor up : display next upper level ", - "v cursor down : display next lower level ", - "============================================", - "Key assignment for Lon/Lev or Hovmoeller ", - "--------------------------------------------", - "^ cursor up : switch latitude northwards", - "v cursor down : switch latitude southwards", - "============================================", - "Mouse button assignment ", - "--------------------------------------------", - "Left button : decrease level or latitude", - "Right button : increase level or latitude", - "Middle button : cycle through projections " -}; - -int HelpLines = sizeof(HelpText) / sizeof(char *); - -void DrawHelpWindow(void) -{ - int x,y,j,l; - - XSetForeground(display,gc,Yellow.pixel); - XSetBackground(display,gc,DarkBlue.pixel); - XSetFont(display,gc,BigFont->fid); - - x = BigFontWidth / 2; - for (j=0 ; j < HelpLines ; ++j) - { - y = BigFontHeight / 2 + BigFont->ascent + j * BigFontHeight; - l = strlen(HelpText[j]); - XDrawImageString(display,HelpWindow,gc,x,y,HelpText[j],l); - } -} - -void DisplayHelpWindow(void) -{ - int x,y,w,h; - char *HelpTitle = "Help"; - - w = BigFontWidth * (strlen(HelpText[0])+1); - h = BigFontHeight * (HelpLines + 1); - x = (ScreenW - w) / 2; - y = (ScreenH - h) / 2; - HelpWindow = XCreateSimpleWindow(display,RootWindow(display,screen_num), - x,y,w,h,BorderWidth,Yellow.pixel,DarkBlue.pixel); - XStringListToTextProperty(&HelpTitle,1,&HelpName); - XSetWMProtocols(display,HelpWindow,&Delwin,1); - XSetWMProperties(display,HelpWindow,&HelpName,NULL,NULL,0,NULL,NULL,NULL); - XSelectInput(display,HelpWindow,ButtonPressMask | ExposureMask); - XMapWindow(display,HelpWindow); - XMoveWindow(display,HelpWindow,x,y); - DrawHelpWindow(); -} - -int HitGridButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Grid_XL ) && - (xe->xbutton.x <= Grid_XH ) && - (xe->xbutton.y >= Grid_YL ) && - (xe->xbutton.y <= Grid_YH )); -} - -int HitPauseButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Pause_XL-2 ) && - (xe->xbutton.x <= Pause_XH+2 ) && - (xe->xbutton.y >= Pause_YL-2 ) && - (xe->xbutton.y <= Pause_YH+2 )); -} - -int HitStartButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Start_XL-2 ) && - (xe->xbutton.x <= Start_XH+2 ) && - (xe->xbutton.y >= Start_YL-2 ) && - (xe->xbutton.y <= Start_YH+2 )); -} - -int HitStopButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Stop_XL-2 ) && - (xe->xbutton.x <= Stop_XH+2 ) && - (xe->xbutton.y >= Stop_YL-2 ) && - (xe->xbutton.y <= Stop_YH+2 )); -} - -int HitHelpButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Help_XL-2 ) && - (xe->xbutton.x <= Help_XH+2 ) && - (xe->xbutton.y >= Help_YL-2 ) && - (xe->xbutton.y <= Help_YH+2 )); -} - -int HitPlusButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Plus_XL ) && - (xe->xbutton.x <= Plus_XH ) && - (xe->xbutton.y >= Plus_YL ) && - (xe->xbutton.y <= Plus_YH )); -} - -int HitFFWDButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= FFWD_XL ) && - (xe->xbutton.x <= FFWD_XH ) && - (xe->xbutton.y >= FFWD_YL ) && - (xe->xbutton.y <= FFWD_YH )); -} - -int HitMinusButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Minus_XL ) && - (xe->xbutton.x <= Minus_XH ) && - (xe->xbutton.y >= Minus_YL ) && - (xe->xbutton.y <= Minus_YH )); -} - -int HitFBWDButton(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= FBWD_XL ) && - (xe->xbutton.x <= FBWD_XH ) && - (xe->xbutton.y >= FBWD_YL ) && - (xe->xbutton.y <= FBWD_YH )); -} - -int HitUpperPanel(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Parc_XL ) && - (xe->xbutton.x <= Parc_XH ) && - (xe->xbutton.y >= Parc_YL-Parc_YD ) && - (xe->xbutton.y <= Parc_YL )); -} - -int HitLowerPanel(XEvent* xe) -{ - return ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Parc_XL ) && - (xe->xbutton.x <= Parc_XH ) && - (xe->xbutton.y >= Parc_YH ) && - (xe->xbutton.y <= Parc_YH+Parc_YD)); -} - -int HitWindowSelect(XEvent* xe) -{ - if ( - (xe->xbutton.button == Button1) && - (xe->xbutton.x >= Wbox_XL) && - (xe->xbutton.x <= Wbox_XH) && - (xe->xbutton.y >= Wbox_YL) && - (xe->xbutton.y <= Wbox_YH)) - return (xe->xbutton.y / FixFontHeight); /* Window number */ - else return -1; -} - -void OnMouseClick(void) -{ - int w; - - if (HitStopButton(&CowEvent)) - { - Shutdown = 1; - } - else if (HitStartButton(&CowEvent)) - { - Paused = 0; - XSetWMName(display,Cow,&WinconName1); - } - else if (HitGridButton(&CowEvent)) - { - Grid = !Grid; - ShowGridStatus(); - for (w=0 ; w < NUMWIN ; ++w) RedrawFlag[w] = 1; - } - else if (HitPauseButton(&CowEvent)) - { - if (Paused) - { - Paused = 0; - XSetWMName(display,Cow,&WinconName1); - } - else - { - Paused = 1; - XSetWMName(display,Cow,&WinconPause); - } - } - else if (HitHelpButton(&CowEvent)) - { - if (!HelpWindow) DisplayHelpWindow(); - } - else if ((w = HitWindowSelect(&CowEvent)) >= 0) - { - if (Win[w]) CloseWindow(w); - else ReopenWindow(w); - } - else if (HitPlusButton(&CowEvent)) - { - Parc[cpi].Val += Parc[cpi].Inc; - if (Parc[cpi].Val > Parc[cpi].Max) Parc[cpi].Val = Parc[cpi].Max; - } - else if (HitFFWDButton(&CowEvent)) - { - Parc[cpi].Val += 10.0 * Parc[cpi].Inc; - if (Parc[cpi].Val > Parc[cpi].Max) Parc[cpi].Val = Parc[cpi].Max; - } - else if (HitMinusButton(&CowEvent)) - { - Parc[cpi].Val -= Parc[cpi].Inc; - if (Parc[cpi].Val < Parc[cpi].Min) Parc[cpi].Val = Parc[cpi].Min; - } - else if (HitFBWDButton(&CowEvent)) - { - Parc[cpi].Val -= 10.0 * Parc[cpi].Inc; - if (Parc[cpi].Val < Parc[cpi].Min) Parc[cpi].Val = Parc[cpi].Min; - } - else if (HitUpperPanel(&CowEvent) && cpi > 0) --cpi; - else if (HitLowerPanel(&CowEvent) && cpi < Parcs-1) ++cpi; -} - - -void SwitchIndez(int w, int d) -{ - int jlat; - REAL delphi; - char *lpt; - char levstr[20]; - - if (Indez[w] < 0 || Indez[w] >= MaxZ[w]) - { - if (Debug) printf("### Indez[%d] = %d\n",w,Indez[w]); - if (Debug) printf("### MaxZ[%d] = %d\n",w, MaxZ[w]); - Indez[w] = 0; - } - if (Indez[w]+d < 0 ) return; - if (Indez[w]+d >= MaxZ[w]) return; - Indez[w] += d; - lpt = strstr(WindowTitle[w],"Level"); - if (lpt) - { - sprintf(levstr," %d",Indez[w]+1); - strcpy(lpt+5,levstr); - XStringListToTextProperty(&WindowTitle[w],1,WindowName+w); - XSetWMProperties(display,Win[w],WindowName+w,NULL, - NULL,0,&WinSizeHints,&wm_hints,&class_hints); - LevelChanged[w] = 1; - return; - } - lpt = strstr(WindowTitle[w],"Latitude"); - if (lpt) - { - delphi = 180.0 / MaxZ[w]; - jlat = 90.0 -Indez[w] * delphi - delphi * 0.5; - if (jlat > 0) sprintf(levstr," %dN", jlat); - else sprintf(levstr," %dS",-jlat); - strcpy(lpt+8,levstr); - XStringListToTextProperty(&WindowTitle[w],1,WindowName+w); - XSetWMProperties(display,Win[w],WindowName+w,NULL, - NULL,0,&WinSizeHints,&wm_hints,&class_hints); - return; - } -} - - -void HandleEvents(void) -{ - int w,Key,KeyIndex; - XEvent WinEvent; - - if (nstep == 1) - { - RedrawControlWindow(); - Paused = 1; /* Start in pause mode */ - } - - - do - { - /* Check for Termination */ - - if (XCheckTypedWindowEvent(display,Cow,ClientMessage,&WinEvent)) - { - /* printf("delwin %d\n",WinEvent.xclient.data.l[0]); */ - Shutdown = 1; - return; - } - - /* Check for user request to close windows */ - - for (w=0 ; w < NumWin ; ++w) - if (Win[w]) - { - if (XCheckTypedWindowEvent(display,Win[w],ClientMessage,&WinEvent)) - CloseWindow(w); - } - - /* Check for user request to close help window */ - - if (HelpWindow && XCheckTypedWindowEvent(display,HelpWindow,ClientMessage,&WinEvent)) - { - XDestroyWindow(display,HelpWindow); - HelpWindow = 0; - } - - /* Check for mouse click */ - - if (XCheckTypedWindowEvent(display,Cow,ButtonPress,&CowEvent)) - { - OnMouseClick(); - RedrawControlWindow(); - } - - /* Check for mouseclicks and expose events */ - - for (w=0 ; w < NumWin ; ++w) - if (Win[w]) - { - if (XCheckTypedWindowEvent(display,Win[w],ButtonPress,&CowEvent)) - { - if (CowEvent.xbutton.button == Button1) SwitchIndez(w,-1); - if (CowEvent.xbutton.button == Button3) SwitchIndez(w, 1); - if (CowEvent.xbutton.button == Button2) - { - if (++MapPro[w] >= MAXMAPS) MapPro[w] = 0; - if (MapPro[w] == AZIMUTHAL && - (WinAtt[w].Plot != MAPHOR && WinAtt[w].Plot != MAPTRA)) - MapPro[w] = 0; - } - RedrawFlag[w] = 1; - } - if (XCheckTypedWindowEvent(display,Win[w],KeyPress,&CowEvent)) - { - KeyIndex = (CowEvent.xkey.keycode - FirstKey) * SymsPerKey; - Key = KeyMap[KeyIndex]; - if (Debug) printf("Windows %d got keyindex %d with symbol %x\n",w,KeyIndex,Key); - if (Key == ROTATE_LEFT && MapLR[w].f < 5) MapLR[w].f++; - if (Key == ROTATE_RIGHT && MapLR[w].f > -5) MapLR[w].f--; - MapLR[w].r = MapLR[w].f * RotInc; - if (Key == XK_Up ) SwitchIndez(w,-1); - if (Key == XK_Down) SwitchIndez(w, 1); - } - if (Paused) - if (XCheckTypedWindowEvent(display,Win[w],Expose,&CowEvent)) - RedrawIsoWindow(w); - } - - if (XCheckTypedWindowEvent(display,Cow,Expose,&CowEvent)) - RedrawControlWindow(); - - if (HelpWindow && XCheckTypedWindowEvent(display,HelpWindow,Expose,&CowEvent)) - DrawHelpWindow(); - - } while (Paused && !Shutdown); -} - -void guiclose_(void) -{ - int w; - - if (MRpid >= 0) return; // Don't wait if multiple instances - XSetWMName(display,Cow,&WinconName3); - - do - { - for (w=0 ; w < NumWin ; ++w) - if (Win[w]) - { - if (XCheckTypedWindowEvent(display,Win[w],Expose,&CowEvent)) - RedrawIsoWindow(w); - } - - if (XCheckTypedWindowEvent(display,Cow,Expose,&CowEvent)) - RedrawControlWindow(); - } - while (!(XCheckTypedWindowEvent(display,Cow,ButtonPress,&CowEvent) && - HitStopButton(&CowEvent))); - -// XCloseDisplay(display); // segmentation fault on sun compiler! -} - -void SaveConfig(void) -{ - int i; - FILE *scp; - INTXS X,Y,xp,yp; - unsigned int w,W,H,border,depth; - Window Rootwin,Child; - XWindowAttributes RootAtt; - - scp = fopen(GUI_config,"w"); - if (scp == NULL) return; - - /* Save window properties */ - - fprintf(scp,"Hamburg GUI Config File Version 16\n"); - fprintf(scp,"Screen: %dx%d\n\n",ScreenW,ScreenH); - fprintf(scp,"WinRows = %d\n",WinRows); - fprintf(scp,"WinCols = %d\n",WinCols); - for (w=0 ; w < NumWin ; ++w) - { - fprintf(scp,"\n[Window %02d]\n",w); - fprintf(scp,"Array:%s\n",WinAtt[w].array_name); - fprintf(scp,"Plot:%s\n",IsoNames[WinAtt[w].Plot]); - if (WinAtt[w].Plot == ISOHOR || WinAtt[w].Plot == MAPHOR || - WinAtt[w].Plot == ISOTRA || WinAtt[w].Plot == MAPTRA) - { - fprintf(scp,"Projection:%s\n",ProNames[MapPro[w]]); - fprintf(scp,"Rotation factor:%d\n",MapLR[w].f); - } - fprintf(scp,"Palette:%s\n",PalNames[WinAtt[w].Palette]); - fprintf(scp,"Title:%s\n",WindowTitle[w]+wto); - if (Win[w]) - { - XGetGeometry(display,Win[w],&Rootwin,&xp,&yp,&W,&H,&border,&depth); - XTranslateCoordinates(display,Win[w],Rootwin,0,0,&X,&Y,&Child); - fprintf(scp,"Geometry: %4d %4d %4d %4d\n",W,H,X-WinLM,Y-WinTM); - if (Debug) - { - printf("Geometry Window %d [%8x]: %4d / %4d %4d x %4d x %2d | %d\n", - w,(int)Win[w],xp,yp,W,H,depth,border); - printf("Translated UL corner: %4d / %4d\n",X,Y); - } - } - else - fprintf(scp,"Inactive: %4d %4d %4d %4d\n", - WinAtt[w].w,WinAtt[w].h,WinAtt[w].x,WinAtt[w].y); - } - XGetGeometry(display,Cow,&Rootwin,&xp,&yp,&W,&H,&border,&depth); - XTranslateCoordinates(display,Cow,Rootwin,0,0,&X,&Y,&Child); - fprintf(scp,"\n[Control Window]\n"); - fprintf(scp,"Geometry: %4d %4d %4d %4d\n",W,H,X-WinLM,Y-WinTM); - - /* Scalar attributes for timeseries and tables */ - - fprintf(scp,"\n# Scalar attributes for timeseries and table window\n"); - - for (i=0 ; i < Parcs ; ++i) - { - fprintf(scp,"\n[Scalar %02d]\n",i); - fprintf(scp,"Name:%s\n",TSName[i]); - fprintf(scp,"Sub:%s\n",TSubsc[i]); - fprintf(scp,"Unit:%s\n",TSUnit[i]); - fprintf(scp,"Scale:%s\n",TScale[i]); - } - - /* Scalar attributes for timeseries and tables */ - - fprintf(scp,"\n# Parameter attributes for change menu\n"); - - for (i=0 ; i < NUMSCALARS ; ++i) - { - if (strlen(Parc[i].Name) == 0) break; - fprintf(scp,"\n[Parameter %02d]\n",i); - fprintf(scp,"ParName:%s\n",Parc[i].Name); - fprintf(scp,"ParInc:%10.4f\n",Parc[i].Inc); - fprintf(scp,"ParMin:%10.4f\n",Parc[i].Min); - fprintf(scp,"ParMax:%10.4f\n",Parc[i].Max); - } - - fclose(scp); -} - -/* Transform a lambda/hi grid to polar stereographic projection */ -/* Input array a and output array b have identical dimensions */ - -void lp2ps(REAL *a, REAL *b) -{ - int i,j,k,l,k1,l1; - REAL xnp,ynp,xsp,ysp,dx,dy,x,y,lfa,ua,ub; - - lfa = (DimX-1) / (2.0 * M_PI); - xnp = (DimX-1) * 0.25; // Northpole at (xnp,ynp) - ynp = (DimY-1) * 0.50; - xsp = (DimX-1) * 0.75; // Southpole at (xsp,ysp) - ysp = ynp; - - // Interpolate b[i][j] from a[k][l] - - /* Northern hemisphere */ - - for (j = 0 ; j < DimY ; ++j) - for (i = 0 ; i <= DimX/2 ; ++i) - { - dx = arx * (xnp - i); - dy = ary * (ynp - j); - x = atan2(dx,dy) * lfa; // angle - y = sqrt(dx * dx + dy * dy); // distance from NP - if (x < 0.0) x += (DimX-1); - k = x; // integer part - l = y; - k1 = k + 1; - if (k1 >= DimX) k1 = 0; - if (l <= DimY/2+1) // Northern hemisphere - { - ua = (k+1-x) * a[k+l*DimX] + (x-k) * a[k1+l*DimX]; - ub = (k+1-x) * a[k+(l+1)*DimX] + (x-k) * a[k+1+(l+1)*DimX]; - b[i+j*DimX] = (l+1-y) * ua + (y-l) * ub; - } - else b[i+j*DimX] = - 99999.0; - } - - /* Souhern hemisphere */ - - for (j = 0 ; j < DimY ; ++j) - for (i = DimX/2+1 ; i < DimX ; ++i) - { - dx = arx * (i - xsp); - dy = ary * (ysp - j); - x = atan2(dx,dy) * lfa; - y = (DimY-1) - sqrt(dx * dx + dy * dy); - if (x < 0.0) x += (DimX-1); - k = x; - l = y; - k1 = k + 1; - if (k1 >= DimX) k1 = 0; - if (l >= DimY/2-3) - { - ua = (k+1-x) * a[k+l*DimX] + (x-k) * a[k1+l*DimX]; - ub = (k+1-x) * a[k+(l+1)*DimX] + (x-k) * a[k+1+(l+1)*DimX]; - b[i+j*DimX] = (l+1-y) * ua + (y-l) * ub; - } - else b[i+j*DimX] = - 99999.0; - } -} - - -/* ======================================================= */ -/* lp2az - transform lon/lat array to azimuthal projection */ -/* ======================================================= */ - -void lp2az(REAL *a, REAL *b, float laz) -{ - int x,y,dxc,k,k1,l; - REAL dx,dy,lam,rho,rad,phi,ua,ub,l00,p00,xpi,ypi; - - rad = DimY >> 1; - dxc = DimX >> 1; - xpi = DimX / M_PI * 0.5; - ypi = DimY / M_PI; - l00 = (int)((laz * DimX) / 360 + dxc) % DimX; - p00 = DimY / 2; - - for (y = 0 ; y < DimY ; ++y) - { - dy = y - rad; - phi = y; - for (x = 0 ; x < DimX ; ++x) - { - dx = x - dxc; - rho = sqrt(dx * dx + dy * dy); - if (rho < rad) - { - lam = l00 + xpi * atan2(dx / rad, cos(asin(rho / rad))); - phi = p00 + ypi * asin(dy / rad); - k = lam; - k1 = k + 1; - if (k1 >= DimX) k1 = 0; - l = phi; - ua = (k+1-lam) * a[k+ l *DimX] + (lam-k) * a[k1 + l *DimX]; - ub = (k+1-lam) * a[k+(l+1)*DimX] + (lam-k) * a[k+1+(l+1)*DimX]; - b[x+y*DimX] = (l+1-y) * ua + (y-l) * ub; - } - else b[x+y*DimX] = - 99999.0; - } - } -} - -void ShowGridCS(void) -{ - int jlev,jlat,x,y,len; - float dx,dy; - char Text[80]; - - /* Grid for zonal mean cross sections */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dy = (InYSize - OffY) / (DimY - 1.0); - for (jlev = 1 ; jlev < DimY-1 ; ++jlev) - { - y = OffY + jlev * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - dx = (InXSize - OffX) / 6.0; /* Every 30 degrees */ - for (jlat = 1 ; jlat < 6 ; ++jlat) - { - x = OffX + jlat * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,InXSize/2-FixFontWidth,InYSize-FixFont->descent,"EQ",2); - XDrawImageString(display,pix,gc,OffX,InYSize-FixFont->descent,"N",1); - XDrawImageString(display,pix,gc,InXSize-FixFontWidth,InYSize-FixFont->descent,"S",1); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridCol(void) -{ - int jlev,jtim,x,y,len; - float dx,dy; - char Text[80]; - - /* Grid for column time series */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dy = (InYSize - OffY) / (DimY - 1.0); - for (jlev = 1 ; jlev < DimY-1 ; ++jlev) - { - y = OffY + jlev * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - dx = (InXSize - OffX) / 4.0; /* 4 slices */ - for (jtim = 1 ; jtim < 4 ; ++jtim) - { - x = OffX + jtim * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,InXSize/2-3*FixFontWidth/2,InYSize-FixFont->descent,"t-2",3); - XDrawImageString(display,pix,gc,InXSize/4-3*FixFontWidth/2,InYSize-FixFont->descent,"t-3",3); - XDrawImageString(display,pix,gc,3*InXSize/4-3*FixFontWidth/2,InYSize-FixFont->descent,"t-1",3); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridLonsi(void) -{ - int jlev,jlat,x,y,len; - float dx,dy; - char Text[80]; - - /* Grid for Longitude Sigma section */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dy = (InYSize - OffY) / (DimY - 1.0); - for (jlev = 1 ; jlev < DimY-1 ; ++jlev) - { - y = OffY + jlev * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - dx = (InXSize - OffX) / 6.0; /* Every 60 degrees */ - for (jlat = 1 ; jlat < 6 ; ++jlat) - { - x = OffX + jlat * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,InXSize/2-3*FixFontWidth/2,InYSize-FixFont->descent,"180",3); - XDrawImageString(display,pix,gc,OffX,InYSize-FixFont->descent,"0",1); - XDrawImageString(display,pix,gc,InXSize-3*FixFontWidth,InYSize-FixFont->descent,"360",3); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridCyl(void) -{ - int jlon,jlat,x,y; - float dx,dy; - - /* Grid for cylinder projection */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dy = (InYSize - OffY) / 6.0; - for (jlat = 1 ; jlat < 6 ; ++jlat) - { - y = OffY + jlat * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - dx = (InXSize - OffX) / 6.0; /* Every 30 degrees */ - for (jlon = 1 ; jlon < 6 ; ++jlon) - { - x = OffX + jlon * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,OffX,OffY+(InYSize-OffY)/2+FixFontHeight/2-FixFont->descent,"EQ",2); - XDrawImageString(display,pix,gc,OffX,OffY+FixFontHeight-FixFont->descent,"N",1); - XDrawImageString(display,pix,gc,OffX,InYSize-FixFont->descent,"-180",4); - XDrawImageString(display,pix,gc,InXSize-3*FixFontWidth,InYSize-FixFont->descent,"180",3); - XDrawImageString(display,pix,gc,OffX+(InXSize-OffX)/2-3*FixFontWidth/2,InYSize-FixFont->descent,"0",1); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridHov(void) -{ - int jlon,jlat,x,y,len; - float dx,dy; - char Text[80]; - - /* Grid for Hovmoeller */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dx = (InXSize - OffX) / 6.0; - for (jlon = 1 ; jlon < 6 ; ++jlon) - { - x = OffX + jlon * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - dy = (InYSize - OffY) / 5.0; /* Every 5 days */ - for (jlat = 1 ; jlat < 5 ; ++jlat) - { - y = OffY + jlat * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,OffX,InYSize-FixFont->descent,"0",1); - XDrawImageString(display,pix,gc,InXSize-3*FixFontWidth,InYSize-FixFont->descent,"360",3); - XDrawImageString(display,pix,gc,OffX+(InXSize-OffX)/2-3*FixFontWidth/2,InYSize-FixFont->descent,"180",3); - XDrawImageString(display,pix,gc,OffX,OffY+FixFontHeight-FixFont->descent,"t0",2); - XDrawImageString(display,pix,gc,OffX,OffY+2*InYSize/5+FixFontHeight/2-FixFont->descent,"t-2",3); - XDrawImageString(display,pix,gc,OffX,OffY+4*InYSize/5+FixFontHeight/2-FixFont->descent,"t-4",3); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridHovT(void) -{ - int jlon,jlat,x,y,len; - float dx,dy; - char Text[80]; - - /* Grid for Hovmoeller */ - - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - dy = (InYSize - OffY) / 6.0; - for (jlat = 1 ; jlat < 6 ; ++jlat) - { - y = OffY + jlat * dy; - XDrawLine(display,pix,gc,OffX,y,InXSize-1,y); - } - dx = (InXSize - OffX) / 5.0; /* Every 5 days */ - for (jlat = 1 ; jlat < 5 ; ++jlat) - { - x = OffX + jlat * dx; - XDrawLine(display,pix,gc,x,OffY,x,InYSize-1); - } - if (GridLabel) - { - XDrawImageString(display,pix,gc,OffX,OffY+FixFontHeight-FixFont->descent,"0",1); - XDrawImageString(display,pix,gc,OffX,OffY+(InYSize-OffY)/2+FixFontHeight/2-FixFont->descent,"180",3); - XDrawImageString(display,pix,gc,OffX,InYSize-FixFont->descent,"360",3); - XDrawImageString(display,pix,gc,InXSize-2*FixFontWidth,InYSize-FixFont->descent,"t0",2); - XDrawImageString(display,pix,gc,3*InXSize/5-3*FixFontWidth/2,InYSize-FixFont->descent,"t-2",3); - XDrawImageString(display,pix,gc, InXSize/5-3*FixFontWidth/2,InYSize-FixFont->descent,"t-4",3); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); -} - -void ShowGridPolar(void) -{ - int dx,dy,x,y,xh,yh,ox,oy; - XPoint pxy[3]; - - /* Grid for polar projection */ - - dx = (InXSize - OffX) / 2; - dy = (InYSize - OffY); - xh = dx / 2; - yh = dy / 2; - ox = dx / 3.414; - oy = dy / 3.414; - - if (Grid) - { - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - XSetLineAttributes(display,gc,1,LineOnOffDash,CapButt,JoinRound); - - /* Northern Hemisphere */ - - XDrawArc(display,pix,gc,OffX+dx/6,OffY+dy/6,2*dx/3,2*dy/3,0,360*64); - XDrawArc(display,pix,gc,OffX+dx/3,OffY+dy/3,dx/3,dy/3,0,360*64); - - XDrawLine(display,pix,gc,OffX,yh,InXSize,yh); - XDrawLine(display,pix,gc,OffX+xh,OffY,OffX+xh,InYSize); - - /* Southern Hemisphere */ - - XDrawArc(display,pix,gc,OffX+7*dx/6,OffY+dy/6,2*dx/3,2*dy/3,0,360*64); - XDrawArc(display,pix,gc,OffX+4*dx/3,OffY+dy/3,dx/3,dy/3,0,360*64); - - x = OffX + dx + xh; - XDrawLine(display,pix,gc,x,OffY,x,InYSize); - - if (GridLabel) - { - x = OffX + xh - FixFontWidth/2; - y = OffY + yh + FixFontHeight/2 - FixFont->descent; - XDrawImageString(display,pix,gc,x,y,"N",1); - XDrawImageString(display,pix,gc,x+dx,y,"S",1); - } - XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinRound); - } - - /* Octagon mask */ - - XSetForeground(display,gc,BlackPix); - pxy[0].x = pxy[1].x = OffX; - pxy[0].y = pxy[2].y = OffY; - pxy[1].y = OffY + oy; - pxy[2].x = OffX + ox; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); - pxy[0].x = OffX + dx - ox; - pxy[1].x = OffX + dx; - pxy[2].x = OffX + dx + ox; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); - pxy[0].x = InXSize - ox; - pxy[1].x = InXSize; - pxy[2].x = InXSize; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); - - pxy[0].x = pxy[1].x = OffX; - pxy[0].y = pxy[2].y = InYSize; - pxy[1].y = InYSize - oy; - pxy[2].x = OffX + ox; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); - pxy[0].x = OffX + dx - ox; - pxy[1].x = OffX + dx; - pxy[2].x = OffX + dx + ox; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); - pxy[0].x = InXSize - ox; - pxy[1].x = InXSize; - pxy[2].x = InXSize; - XFillPolygon(display,pix,gc,pxy,3,Convex,CoordModeOrigin); -} - - -void AutoPalette(int w, struct ColorStrip Strip[], REAL f[], int Dim) -{ - int i,nbands; - double fmin, fmax, frange, delta, fdelta, xdelta, Lo; - - fmin = fmax = f[0]; - for (i=0; i < Dim ; ++i) - { - if (fmin > f[i]) fmin = f[i]; - if (fmax < f[i]) fmax = f[i]; - } - frange = fmax - fmin; - Lo = 0.0; - xdelta = 0.1; - if (frange > 1.0e-10) - { - delta = frange / AUTOCOLORS; - if (delta > AutoDelta[w] / 1.4 && delta < 1.4 * AutoDelta[w]) - { - xdelta = AutoXdelt[w]; - delta = AutoDelta[w]; - Lo = AutoLo[w]; - } - else - { - fdelta = pow(10.0,rint(log10(delta))); - xdelta = fdelta; - nbands = frange / xdelta; - if (nbands < AUTOCOLORS / 2) xdelta = 0.5 * fdelta; - if (nbands > AUTOCOLORS ) xdelta = 2.0 * fdelta; - nbands = frange / xdelta; - if (nbands > AUTOCOLORS ) xdelta = 5.0 * fdelta; - Lo = xdelta * floor(fmin / xdelta); - AutoDelta[w] = delta; - AutoXdelt[w] = xdelta; - AutoLo[w] = Lo; -/* - if (Debug) - { - printf("Autopalette\n"); - printf(" Range: %14.6e\n",frange); - printf(" delta: %14.6e\n",delta); - printf("fdelta: %14.6e\n",fdelta); - printf("xdelta: %14.6e\n",xdelta); - } -*/ - } - } - Strip[0].Lo = Lo; - for (i=0 ; i < AUTOCOLORS ; ++i) - { - Strip[i+1].Lo = Strip[i].Hi = Strip[i].Lo + xdelta; - // if (Debug) printf("Auto[%2d] = %10.4f - %10.4f\n",i,Strip[i].Lo,Strip[i].Hi); - } - return; -} - - -// Interface routine to model code in FORTRAN - -void guiput_(char *aname, float *array, int *dimx, int *dimy, int *dimz) -{ - int i,nb,nf; - - if (Debug) printf("guiput(%s,%12.4e,%d,%d,%d)\n", - aname,*array,*dimx,*dimy,*dimz); - nf = (*dimx) * (*dimz); - if (*dimy > 0) nf *= (*dimy); - else nf *= 2; - nb = nf * sizeof(float); - for (i=0 ; i < NumArrays ; ++i) - if (!strcmp(aname,Array[i].Name)) break; - if (i == NumArrays) - { - ++NumArrays; - strcpy(Array[i].Name,aname); - Array[i].Data = FloatAlloc(nf,aname); - Array[i].DimX = *dimx; - Array[i].DimY = *dimy; - Array[i].DimZ = *dimz; - if (strcmp(aname,"GU") == 0) Uindex = i; - if (strcmp(aname,"GV") == 0) Vindex = i; - } - if (Array[i].Data) memcpy(Array[i].Data,array,nb); - Array[i].Flag = 1; // Data have changed -} - - -void guisend_(char *aname, float *array, int *dimx, int *dimy, int *dimz) -{ - int i,nb,nf; - - nf = (*dimx) * (*dimz); - if (*dimy > 0) nf *= (*dimy); - else nf *= 2; - nb = nf * sizeof(float); - for (i=0 ; i < NumArrays ; ++i) - if (!strcmp(aname,Array[i].Name)) break; - if (i == NumArrays) - { - ++NumArrays; - strcpy(Array[i].Name,aname); - Array[i].DimX = *dimx; - Array[i].DimY = *dimy; - Array[i].DimZ = *dimz; - } - Array[i].Data = array; - Array[i].Flag = 1; // Data have changed -} - - -// Do the plot - -void iso(int w,int PicType,REAL *field,int dimx,int dimy,int dimz,int pal) -{ - char Text[128]; - - int i,j,k,len,lens,xp,yp,status,x; - int y,dx,r,width,height; - INTXU border,depth; - REAL f,o,ra,rb; - int CapLines; - float *tspt; - XEvent WinEvent; - Window Rootwin,Child; - - // if (Debug) printf("iso(%d,%s,%12.4e,%d,%d,%d,%d)\n",w,IsoNames[PicType],*field,dimx,dimy,dimz,pal); - if (Win[w] == 0) return; - win = w; - - // At high frame rates (SkipFreq > 1) some types are redrawn - // at "SkipFreq" intervals - - if (SkipFreq > 1 && (nstep % SkipFreq) != 0 && - (PicType == ISOCS || PicType == ISOHOR || - PicType == MAPHOR || PicType == ISOCOL || - PicType == ISOREC )) return; - - XGetGeometry(display,Win[w],&Rootwin,&xp,&yp,&WinXSize,&WinYSize, - &border,&depth); - WinAtt[w].w = WinXSize; - WinAtt[w].h = WinYSize; - InXSize = WinXSize - OffX; - InYSize = WinYSize - OffY; - - // Determine aspect ratio of window - // width = 2 * height is optimal (1.0) - - if (InXSize > 2 * InYSize) // wide - { - arx = InXSize / (2.0 * InYSize); - ary = 1.0; - } - else // narrow - { - arx = 1.0; - ary = (2.0 * InYSize) / InXSize; - } - - if (PicType != ISOTRA && PicType != MAPTRA) InYSize -= 20; // Room for colorbar - DimX = dimx; - DimY = dimy; - DimZ = dimz; - if (DimY < 0) DimY = -DimY; // Get NTP1 for ISOSH - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - if (DimY > 1) VGAY = (InYSize-1.0) / (DimY-1.0); - else VGAY = 1.0; - Field = field; - - if (PicType == ISOTRA || PicType == MAPTRA) - { - DimX = dimx; // NLON - DimY = dimy; // NLAT - DimZ = dimz; // NLEV - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (MaxZ[w] < DimZ) - { - MaxZ[w] = DimZ; - Indez[w] = DimZ / 4; - SwitchIndez(w,0); // Initialize title - } - } - - if (PicType == ISOREC || PicType == ISOHOR || PicType == MAPHOR) - { - DimX = dimx; // NLON - DimY = dimy; // NLAT - DimZ = dimz; // NLEV - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (MaxZ[w] < DimZ) - { - MaxZ[w] = DimZ; - Indez[w] = DimZ / 4; - SwitchIndez(w,0); // Initialize title - TSdata[w] = FloatAlloc(DimXY,"ISOLON"); - } - if (MapPro[w] == POLAR) - { - Field = TSdata[w]; - lp2ps(field + Indez[w] * DimXY,Field); - } -/* - else if (MapPro[w] == AZIMUTHAL) - { - Field = TSdata[w]; - lp2az(field + Indez[w] * DimXY,Field,MapLR[w].l); - } -*/ - else Field = field + Indez[w] * DimXY; - } - - if (PicType == ISOLON) - { - DimX = dimx; // NLON - DimY = dimz; // NLEV - DimZ = dimy; // NLAT - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (!TSdata[w]) - { - TSdata[w] = FloatAlloc(DimXY,"ISOLON"); - MaxZ[w] = DimZ; - Indez[w] = DimZ / 4; - SwitchIndez(w,0); // Initialize title - } - Field = TSdata[w]; - for (j=0,i=0,k=DimX*Indez[w] ; j < DimY ; ++j,i+=DimX,k+=DimX*DimZ) - { - memcpy(Field+i,field+k,DimX * sizeof(REAL)); // copy latitude - } - } - - if (PicType == ISOHOV) - { - DimX = dimx; // NLON - DimY = DimT; // time - DimZ = dimy; // NLAT - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (!TSdata[w]) - { - TSdata[w] = FloatAlloc(DimXY,"ISOHOV"); - MaxZ[w] = DimZ; - Indez[w] = DimZ / 4; - SwitchIndez(w,0); // Initialize title - } - Field = TSdata[w]; - memmove(Field+DimX,Field,(DimXY-DimX) * sizeof(REAL)); // scroll array - memcpy(Field,field+Indez[w]*DimX,DimX * sizeof(REAL)); // add line - } - - // Advance write pointer HovInx until end of DimX - // then scroll array and reset pointer - - if (PicType == ISOTS) - { - DimX = DimT; // time - DimY = dimx; // # of variables - DimZ = dimz; - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (!TSdata[w]) - { - TSdata[w] = FloatAlloc(DimXY+DimX,"ISOTS"); - } - tspt = TSdata[w]; - ++HovInx[w]; - if (HovInx[w] >= DimX) - { - HovInx[w] = 0; - memmove(tspt,tspt+DimX,DimXY * sizeof(REAL)); // scroll array - } - for (i=HovInx[w]+DimX-1,j=0 ; j < DimY ; i+=DimX,++j) - tspt[i] = field[j]; // add column - Field = tspt+HovInx[w]; - } - - if (PicType == ISOCOL) - { - DimX = DimT; // time - DimY = dimx; // level - DimZ = dimy; // clickable index - DimXY = DimX * DimY; - VGAX = (InXSize-1.0) / (DimX-1.0); - VGAY = (InYSize-1.0) / (DimY-1.0); - if (!TSdata[w]) - { - TSdata[w] = FloatAlloc(DimXY+DimX,"ISOCOL"); - MaxZ[w] = DimZ; - Indez[w] = DimZ / 2; - SwitchIndez(w,0); // Initialize title - } - tspt = TSdata[w]; - ++HovInx[w]; - if (HovInx[w] >= DimX) - { - HovInx[w] = 0; - memmove(tspt,tspt+DimX,DimXY * sizeof(REAL)); // scroll array - } - for (i=HovInx[w]+DimX-1,j=0 ; j < DimY ; i+=DimX,++j) - tspt[i] = field[j+Indez[w]*DimY]; // add column - Field = tspt+HovInx[w]; - } - - if (DimX > FlagSize) - { - if (Flag) free(Flag); - Flag = IntAlloc(DimX,"Flag"); - FlagSize = DimX; - } - - if (PicType == ISOSH) pal = 1; // ISOSH has its own palette - if (pal < 1 || pal >= NUMPAL) - { - Cstrip = Autostrip; - AutoPalette(w,Cstrip,Field,DimXY); - Lines = AUTOCOLORS; - // printf("Autopalette %d for Win %d\n",pal,w); - } - else - { - Cstrip = Pallet[pal]; - Lines = LineCo[pal]; - } - - SizeChanged = (WinPixMap[w].DimX != WinXSize || WinPixMap[w].DimY != WinYSize); - if (SizeChanged) - { - if (WinPixMap[w].Pix) XFreePixmap(display,WinPixMap[w].Pix); - WinPixMap[w].Pix = XCreatePixmap(display,Win[w],WinXSize,WinYSize,ScreenD); - if (Debug) - printf("CreatePixmap %10x %6d bytes\n", - (unsigned int)WinPixMap[w].Pix,WinXSize*WinYSize); - WinPixMap[w].DimX = WinXSize; - WinPixMap[w].DimY = WinYSize; - } - pix = WinPixMap[w].Pix; /* Set current pixmap */ - - /* Draw colour bar */ - - if ((SizeChanged || Cstrip == Autostrip) && - (PicType == ISOCS || PicType == ISOHOR || - PicType == ISOHOV || PicType == ISOLON || - PicType == ISOCOL || PicType == MAPHOR || - PicType == ISOREC )) - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,InYSize,WinXSize,WinYSize); - - CapLines = WinXSize / (20 + 3 * FixFontWidth); - if (CapLines > Lines) CapLines = Lines; - for (i=0 ; i < CapLines ; ++i) - { - XSetForeground(display,gc,Cstrip[i].pixel); - XFillRectangle(display,pix,gc,OffX+5+i*(WinXSize-20)/(CapLines-1), - OffY+InYSize+5,10,10); - XSetForeground(display,gc,BlackPix); - XDrawRectangle(display,pix,gc,OffX+5+i*(WinXSize-20)/(CapLines-1), - OffY+InYSize+5,10,10); - } - XSetForeground(display,gc,WhitePix); - XSetBackground(display,gc,BlackPix); - rb = Cstrip[CapLines-2].Hi - Cstrip[0].Hi; - for (i=0 ; i < CapLines-1 ; ++i) - { - Text[0] = 0; - ra = Cstrip[i].Hi; - j = ra; - if (j > -1000 && j < 10000) sprintf(Text,"%d",j); - if (ra < 100.0 && ra > -9.99) - { - sprintf(Text,"%4.1f",ra); - if (!strcmp(Text+2,".0")) Text[2] = 0; - } - if (ra < 10.0 && ra >= 0.0) - { - sprintf(Text,"%4.2f",ra); - if (!strcmp(Text+1,".00")) Text[1] = 0; - } - len = strlen(Text); - if (len) - { - width = XTextWidth(FixFont,Text,len); - height = FixFont->ascent + FixFont->descent; - xp = OffX + 10 + (i+0.5) * (WinXSize-20)/(CapLines-1) - width/2; - yp = WinYSize - height + 10; - XDrawImageString(display,pix,gc,xp,yp,Text,len); - } - } - } - - /* Draw mode legend */ - - if (SizeChanged && PicType == ISOSH) - { - dx = WinXSize / 23; - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,WinYSize); - - XSetForeground(display,gc,LightGreen.pixel); - XSetBackground(display,gc,BlackPix); - for (i=0 ; i < 21 ; i+=2) - { - sprintf(Text,"%d",i); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - height = FixFont->ascent + FixFont->descent; - xp = dx + i * dx - width/2 - FixFontWidth/2 + 1; - yp = FixFontHeight; - XDrawImageString(display,pix,gc,xp,yp,Text,len); - } - XSetForeground(display,gc,LightBlue.pixel); - for (i=0 ; i < 21 ; i+=2) - { - sprintf(Text,"%d",i); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - height = FixFont->ascent + FixFont->descent; - xp = WinXSize - width - 2; - yp = 2 * FixFontHeight + i * dx; - if (yp+FixFont->descent > InYSize) break; - XDrawImageString(display,pix,gc,xp,yp,Text,len); - } - strcpy(Text,"n/m"); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - xp = WinXSize - width - 2; - yp = FixFontHeight; - XSetForeground(display,gc,WhitePix); - XDrawImageString(display,pix,gc,xp,yp,Text,len); - strcpy(Text,"High "); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - xp = WinXSize/2 - AMPLI_COLS * 10 - width; - yp = WinYSize - FixFontHeight + 10; - r = FixFontHeight-2; - XSetForeground(display,gc,WhitePix); - if (xp > 0) XDrawImageString(display,pix,gc,xp,yp,Text,len); - strcpy(Text," Low"); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - xp = WinXSize/2 + AMPLI_COLS * 10; - if (xp + width < WinXSize) XDrawImageString(display,pix,gc,xp,yp,Text,len); - yp = InYSize; - XDrawLine(display,pix,gc,OffX,yp,WinXSize,yp); - yp = WinYSize - r - FixFont->descent; - - for (i=0 ; i < AMPLI_COLS ; ++i) - { - xp = WinXSize/2 - AMPLI_COLS * 10 + i * 20; - XSetForeground(display,gc,AmpliStrip[AMPLI_COLS-i-1].pixel); - XFillArc(display,pix,gc,xp,yp,r,r,0,360*64); - } - } - - if (SizeChanged && PicType == ISOTS) /* Timeseries Caption */ - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,InYSize,WinXSize,WinYSize); - XSetBackground(display,gc,BlackPix); - - xp = FixFontWidth; - yp = WinYSize - FixFontHeight + 10; - for (j=0 ; j < DimY ; ++j) - { - if (TSName[j][0]) - { - strcpy(Text,TSName[j]); - len = strlen(Text); - width = XTextWidth(FixFont,Text,len); - XSetForeground(display,gc,TSColor[j]); - XDrawImageString(display,pix,gc,xp,yp,Text,len); - xp += width; - } - if (TSubsc[j][0]) - { - XSetFont(display, gc, SubFont->fid); - strcpy(Text,TSubsc[j]); - len = strlen(Text); - width = XTextWidth(SubFont,Text,len); - XSetForeground(display,gc,TSColor[j]); - XDrawImageString(display,pix,gc,xp,yp,Text,len); - xp += width; - XSetFont(display, gc, FixFont->fid); - } - xp += FixFontWidth; - } - } - - if (SizeChanged && PicType == ISOTAB) /* Table Caption */ - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,WinYSize); - XSetBackground(display,gc,BlackPix); - } - - if (PicType == ISOTS) - { - if (TSxp[w] == NULL) TSxp[w] = SizeAlloc(DimX * DimY , sizeof(XPoint),"TSxp"); - if (Dmin[w] == NULL) Dmin[w] = FloatAlloc(DimY ,"Dmin"); - if (Dmax[w] == NULL) Dmax[w] = FloatAlloc(DimY ,"Dmax"); - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - - for (j=0 ; j < DimY ; ++j) Dmin[w][j] = Dmax[w][j] = field[j]; - if (nstep > 2) - { - for (j=0 ; j < DimY ; ++j) - { - for (i=1 ; i < DimX ; ++i) - { - Dmin[w][j] = MIN(Dmin[w][j],Field[i+j*DimX]); - Dmax[w][j] = MAX(Dmax[w][j],Field[i+j*DimX]); - } - } - } - - if (nstep > 2) - for (j=0 ; j < DimY ; ++j) - { - XSetForeground(display,gc,TSColor[j]); - o = Dmin[w][j]; - if ((Dmax[w][j] - Dmin[w][j]) > 1.0e-20) f = (InYSize-2) / (Dmax[w][j] - Dmin[w][j]); - else f = 1.0; - - for (i=1 ; i < DimX ; ++i) - { - TSxp[w][i].x = VGAX * i; - TSxp[w][i].y = InYSize - 1 - f * (Field[i+j*DimX] - o); - } - XDrawLines(display,pix,gc,TSxp[w]+1,DimX-1,CoordModeOrigin); - } - } - - if (PicType == ISOTAB) - { - XSetForeground(display,gc,BlackPix); - XSetBackground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - XSetFont(display, gc, BigFont->fid); - yp = BigFontHeight; - for (j=0 ; j < DimX ; ++j) - if (TSName[j][0]) - { - XSetForeground(display,gc,TSColor[j]); - xp = BigFontWidth; - strcpy(Text,TSName[j]); - len = strlen(Text); - XDrawImageString(display,pix,gc,xp,yp,Text,len); - xp += XTextWidth(BigFont,Text,len); - if (TSubsc[j][0]) - { - XSetFont(display, gc, FixFont->fid); - XDrawImageString(display,pix,gc,xp,yp,TSubsc[j],strlen(TSubsc[j])); - XSetFont(display, gc, BigFont->fid); - } - xp = 8 * BigFontWidth; - if (TSUnit[j][0]) - { - sprintf(Text,"= %7.3f [%s]",field[j],TSUnit[j]); - if (TScale[j][0]) strcat(Text," 10"); - len = strlen(Text); - XDrawImageString(display,pix,gc,xp,yp,Text,len); - if (TScale[j][0] > ' ') - { - lens = strlen(TScale[j]); - XSetFont(display, gc, FixFont->fid); - XDrawImageString(display,pix,gc,xp+len*BigFontWidth,yp-BigFontHeight+FixFontHeight,TScale[j],lens); - XSetFont(display, gc, BigFont->fid); - } - } - yp += BigFontHeight; - } - XSetFont(display, gc, FixFont->fid); - } - - if (PicType == ISOTRA) - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - if (SizeChanged) ClearTracer(); - TracerPlot(w); - } - if (PicType == MAPTRA) - { - if (SizeChanged) ClearTracer(); - if (MapHR.X) - { - if (MapPro[w] == AZIMUTHAL) - { - if (RedrawFlag[w] || MapLR[w].w != WinXSize || MapLR[w].h != InYSize || - (nstep % rmui == 0 && MapLR[w].f != 0)) - { - RedrawFlag[w] = 0; - MapLR[w].w = WinXSize; - MapLR[w].h = InYSize; - MapLR[w].l += MapLR[w].r; - if (MapLR[w].l < -180.0) MapLR[w].l += 360.0; - if (MapLR[w].l > 180.0) MapLR[w].l -= 360.0; - AzimuthalImage(&MapHR,&MapLR[w]); - } - } - else - { - if (RedrawFlag[w] || MapLR[w].w != WinXSize || MapLR[w].h != InYSize) - { - RedrawFlag[w] = 0; - MapLR[w].w = WinXSize; - MapLR[w].h = InYSize; - if (MapPro[w] == 1) PolarImage(&MapHR,&MapLR[w]); - else ScaleImage(&MapHR,&MapLR[w]); - } - } - XPutImage(display,pix,gc,MapLR[w].X,0,0,0,0,MapLR[w].w,MapLR[w].h); - } - else - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - } - TracerPlot(w); - } - - // Now perform the plotting of areas and lines for simple - // rectangles with no transformation/projection involved - - if (PicType == ISOCS || PicType == ISOHOR || - PicType == ISOLON || PicType == ISOCOL || - PicType == ISOREC ) - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - IsoAreas(Cstrip); - IsoLines(Cstrip,0); - } - - // Plotting of azimuthal or polar projection - - if (PicType == MAPHOR) - { - if (MapHR.X) - { - if (MapPro[w] == AZIMUTHAL) - { - if (RedrawFlag[w] || MapLR[w].w != WinXSize || MapLR[w].h != InYSize || - (nstep % rmui == 0 && MapLR[w].f != 0)) - { - RedrawFlag[w] = 0; - MapLR[w].w = WinXSize; - MapLR[w].h = InYSize; - MapLR[w].l += MapLR[w].r; - if (MapLR[w].l < -180.0) MapLR[w].l += 360.0; - if (MapLR[w].l > 180.0) MapLR[w].l -= 360.0; - AzimuthalImage(&MapHR,&MapLR[w]); - } - XPutImage(display,pix,gc,MapLR[w].X,0,0,0,0,MapLR[w].w,MapLR[w].h); - MapLines(Cstrip,1); - } - else - { - if (RedrawFlag[w] || MapLR[w].w != WinXSize || MapLR[w].h != InYSize) - { - RedrawFlag[w] = 0; - MapLR[w].w = WinXSize; - MapLR[w].h = InYSize; - if (MapPro[w] == 1) PolarImage(&MapHR,&MapLR[w]); - else ScaleImage(&MapHR,&MapLR[w]); - } - XPutImage(display,pix,gc,MapLR[w].X,0,0,0,0,MapLR[w].w,MapLR[w].h); - IsoLines(Cstrip,1); - } - } - else - { - XSetForeground(display,gc,BlackPix); - XFillRectangle(display,pix,gc,0,0,WinXSize,InYSize); - IsoLines(Cstrip,1); - } - } - - // Hovmoeller diagram - - if (PicType == ISOHOV) - { - IsoAreas(Cstrip); - } - - // amplitudes of coeeficients of spherical harmonics - - if (PicType == ISOSH) - { - AmplitudePlot(); - } - - if (Grid && PicType == ISOCS) ShowGridCS(); - if (Grid && PicType == ISOLON) ShowGridLonsi(); - if (Grid && PicType == ISOHOV && MapPro[w] == 0) ShowGridHov(); - if (Grid && PicType == ISOHOV && MapPro[w] == 1) ShowGridHovT(); - if (PicType == ISOHOR && MapPro[w] == 1) ShowGridPolar(); - if (Grid && PicType == ISOHOR && MapPro[w] == 0) ShowGridCyl(); - if (Grid && PicType == ISOCOL) ShowGridCol(); - - // copy drawn image into visible display - - XCopyArea(display,pix,Win[w],gc,0,0,WinXSize,WinYSize,0,0); -} - - -/* ==================================================================== */ -/* iguistep - this function is called from the model for every timestep */ -/* ==================================================================== */ - -int iguistep_(float pparcs[],int kdatim[]) -{ - int i,j,w; // Loop indices - struct timeval TimeVal; // Retrieve time info - - if (Debug) printf("iguistep(%12.2e,%d-%d-%d)\n", - pparcs[0],kdatim[0],kdatim[1],kdatim[2]); - nstep++; - memcpy(ndatim,kdatim,sizeof(ndatim)); - DeltaTime = ndatim[4] - LastMinute; - if (DeltaTime < 0) DeltaTime += 60; - if (DeltaTime ==0) DeltaTime = 60; - LastMinute = ndatim[4]; - - // Compute frames per second every 20 calls - - gettimeofday(&TimeVal,NULL); - LastSecond = ThisSecond; - ThisSecond = TimeVal.tv_sec; - - if ((SecEvent = ThisSecond) > LastSecond) - { - fps = nstep - LastStep; - LastStep = nstep; - rmui = fps / rmuf; - if (rmui < 1) rmui = 1; - } - - SkipFreq = 1 + fps / 30; // Reduce plot rate on fast cpu's - if (SkipFreq < 0 || SkipFreq > 10) SkipFreq = 0; - - for (w=0 ; w < NumWin ; ++w) - { - for (j=0 ; j < NumArrays ; ++j) - { - if (!strcmp(WinAtt[w].array_name,Array[j].Name)) - { - if (Array[j].Flag || RedrawFlag[w]) - iso(w,WinAtt[w].Plot,Array[j].Data,Array[j].DimX,Array[j].DimY, - Array[j].DimZ,WinAtt[w].Palette); - } - } - } - - for (i=0 ; i < Parcs ; ++i) Parc[i].Val = pparcs[i]; - ShowStep(); - ShowParcs(); - HandleEvents(); - if (XCheckTypedWindowEvent(display,Cow,Expose,&CowEvent)) - RedrawControlWindow(); - for (i=0 ; i < Parcs ; ++i) pparcs[i] = Parc[i].Val; - - XSync(display,1); - if (Shutdown && MRpid < 1) SaveConfig(); - if (Debug) printf("iguistep returns %d\n",Shutdown); - return Shutdown; -} - -int nresources_(double *ut, double *st, long *mem, long *par, long *paf, - long *swa, long *dr, long *dw) -{ - struct rusage ru; - getrusage(RUSAGE_SELF,&ru); - *ut = ru.ru_utime.tv_sec + 0.000001 * ru.ru_utime.tv_usec; - *st = ru.ru_stime.tv_sec + 0.000001 * ru.ru_stime.tv_usec; - *mem = ru.ru_maxrss; - *par = ru.ru_minflt; - *paf = ru.ru_majflt; - *swa = ru.ru_nswap; - *dr = ru.ru_inblock; - *dw = ru.ru_oublock; - return 1; -} - -/* ------------------------------------------------ */ -/* Stub routines for Absoft Compiler and others, */ -/* which require, that FORTRAN callable C-functions */ -/* are written in uppercase letters only */ -/* ------------------------------------------------ */ - - -void INITGUI(int *model, int *debug, int *lats, int *mrpid, int *mrnum, char *plan) -{ - initgui_(model,debug,lats,mrpid,mrnum,plan); -} - -void GUICLOSE(void) -{ - guiclose_(); -} - -int IGUISTEP(float pparcs[], int kdatim[]) -{ - return iguistep_(pparcs,kdatim); -} - -void GUIPUT(char *aname, float *array, int *dimx, int *dimy, int *dimz) -{ - guiput_(aname, array, dimx, dimy, dimz); -} - -int NRESOURCES(double *ut, double *st, long *mem, long *par, long *paf, - long *swa, long *dr, long *dw) -{ - return nresources_(ut,st,mem,par,paf,swa,dr,dw); -} - -/* ------------------------------------------------ */ -/* Stub routines for IBM Compiler and others, */ -/* which require, that FORTRAN callable C-functions */ -/* are written in lowercase without underscore */ -/* ------------------------------------------------ */ - - -void initgui(int *model, int *debug, int *lats, int *mrpid, int *mrnum, char *plan) -{ - initgui_(model,debug,lats,mrpid,mrnum,plan); -} - -void guiclose(void) -{ - guiclose_(); -} - -int iguistep(float pparcs[], int kdatim[]) -{ - return iguistep_(pparcs,kdatim); -} - -void guiput(char *aname, float *array, int *dimx, int *dimy, int *dimz) -{ - guiput_(aname, array, dimx, dimy, dimz); -} - -int iguinan_(double *p) -{ - return isnan(*p); -} - -int nresources(double *ut, double *st, long *mem, long *par, long *paf, - long *swa, long *dr, long *dw) -{ - return nresources_(ut,st,mem,par,paf,swa,dr,dw); -} diff --git a/cat/src/guix11.c b/cat/src/guix11.c index 240154d4e6d12ea80f89b486e33b3c417188a08f..185fe96d0136d725fa619ac76ca2aed059c9f4e7 100644 --- a/cat/src/guix11.c +++ b/cat/src/guix11.c @@ -2593,8 +2593,8 @@ void IsoLines(struct ColorStrip Strip[],int Colored) void LinePlot(int w) { - int i,j,xp,yp; - double zmin,zmax,zrange,rrange,zdelta,f; + int i,j,k,xp,yp; + double zmin,zmax,zrange,zdelta,f; char Text[128]; // allocate space for plot data @@ -2614,16 +2614,20 @@ void LinePlot(int w) // compute scaling parameter - if (zrange < 1e-10) f = 0.0; + if (zrange < 1e-20) zdelta = 0.1; else { - rrange = pow(10.0,rint(log10(zrange)) + 1.0); - if (rrange > 5.0 * zrange) rrange *= 0.2; - if (rrange > 2.0 * zrange) rrange *= 0.5; - f = (InYSize-2-2*FixFontHeight) / rrange; - zmin = 0.1 * (rint(10.0 * zmin / rrange) * rrange); + zdelta = pow(10.0,rint(log10(zrange))); + if (zdelta * 0.2 > 0.1 * zrange) zdelta *= 0.2; + if (zdelta * 0.5 > 0.1 * zrange) zdelta *= 0.5; } - if (LineScale[w] < f || fabs(LineMin[w]-zmin) > 0.2 * fabs(zmin)) + + zmin = (floor(zmin / zdelta) - 1.0) * zdelta; + zmax = ( ceil(zmax / zdelta) + 1.0) * zdelta; + if (zmax > zmin) f = InYSize / (zmax - zmin); + else f = 1.0; + + if (LineScale[w] < f || fabs(LineMin[w]-zmin) > 0.9 * fabs(zdelta)) { LineScale[w] = f; LineMin[w] = zmin; @@ -2652,10 +2656,10 @@ void LinePlot(int w) if (f > 0.0) { - if (fabs(zmin) > 0.009 && fabs(zmin+rrange) < 9999.0) - sprintf(Text,"Range: %10.4f %10.4f",zmin,zmin+rrange); + if (fabs(zmin) > 0.009 && fabs(zmax) < 9999.0) + sprintf(Text,"Range: %10.4f %10.4f",zmin,zmax); else - sprintf(Text,"Range: %10.2e %10.2e",zmin,zmin+rrange); + sprintf(Text,"Range: %10.2e %10.2e",zmin,zmax); xp = FixFontWidth; yp = WinYSize - FixFontHeight/2; XDrawImageString(display,pix,gc,xp,yp,Text,strlen(Text)); @@ -2669,16 +2673,24 @@ void LinePlot(int w) for (i=0 ; i < DimX ; ++i) { - LIxp[w][i].y = InYSize - 2 - 2 * FixFontHeight - f * (Field[i+j*DimX] - zmin); - // if (Debug) printf(" %3d",LIxp[w][i].y); + LIxp[w][i].y = InYSize - f * (Field[i+j*DimX] - zmin); } - // if (Debug) printf("\n"); - // draw data XSetForeground(display,gc,Simplestrip[j].pixel); XDrawLines(display,pix,gc,LIxp[w],DimX,CoordModeOrigin); - } + + // Check scaling + +/* + xp = 0; + yp = 0; + i = VGAX * (DimX-1); + j = VGAY * (DimY-1); + + XSetForeground(display,gc,Yellow.pixel); + XDrawRectangle(display,pix,gc,xp,yp,i,j); +*/ }