This is Contour.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "defs.h" #import "Contour.h" #import <appkit/Button.h> #import <appkit/OpenPanel.h> #import <appkit/Matrix.h> #import <appkit/Cell.h> #import <appkit/Pasteboard.h> #import <appkit/Application.h> #import <appkit/NXColorWell.h> #import <appkit/color.h> #import <objc/Storage.h> #import <math.h> #import <strings.h> #import <defaults/defaults.h> #import <streams/streams.h> #import <sys/types.h> #import <sys/stat.h> #import "TextView.h" @implementation Contour /* Public methods */ + initialize /* Initializes the defaults. */ { const NXDefaultsVector NeXTcontourDefaults = { { "Two_D", "NO" }, { "AeroDynamics", "YES"}, { "Binary_Data", "YES"}, { "number_Of_Functions_Read_In", "5"}, { "colorOption", "NO"}, { "printColorMode", "NO"}, { NULL, NULL } }; NXRegisterDefaults("NeXTcontour", NeXTcontourDefaults); return self; } + new { const char *validSendTypes[2]; self = [[super alloc] init]; openPanel = [OpenPanel new]; validSendTypes[0] = NXAsciiPboardType; validSendTypes[1] = NULL; [NXApp registerServicesMenuSendTypes:validSendTypes andReturnTypes:NULL]; [NXApp setDelegate:self]; return self; } - appWillInit:sender { /* get default parameters and reset buttons */ NXUpdateDefaults(); /* Initialize defaults */ Two_D = strncmp(NXGetDefaultValue("NeXTcontour", "Two_D"),"YES",3)==0 ? YES: NO; number_Of_Functions_Read_In = strncmp(NXGetDefaultValue("NeXTcontour", "number_Of_Functions_Read_In"), "4",3) ==0 ? 4: 1; colorOption = strncmp(NXGetDefaultValue("NeXTcontour", "colorOption"), "YES",3)==0 ? YES: NO; printColorMode = strncmp(NXGetDefaultValue("NeXTcontour", "printColorMode"), "YES",3)==0 ? YES: NO; AeroDynamic_Functions = strncmp(NXGetDefaultValue("NeXTcontour", "AeroDynamics"), "YES",3)==0 ? YES: NO; Binary_Data_Type = strncmp(NXGetDefaultValue("NeXTcontour", "Binary_Data"), "YES",3)==0 ? YES: NO; if(Two_D){ [choose2D3DData setState:1]; [choose2D3DGrid setState:1]; [setDefault2D3D setState:1]; if(AeroDynamic_Functions){ [setDefaultNumberOfFunctions setIntValue:4 at:0]; [numberOfFunctions setIntValue:4 at:0]; number_Of_Functions_Read_In = 4; } } if(!Two_D){ [choose2D3DData setState:0]; [choose2D3DGrid setState:0]; [setDefault2D3D setState:0]; if(AeroDynamic_Functions){ [setDefaultNumberOfFunctions setIntValue:5 at:0]; [numberOfFunctions setIntValue:5 at:0]; number_Of_Functions_Read_In = 5; } } if(AeroDynamic_Functions){ [chooseDiscipline setState:0]; [setDefaultDiscipline setState:0]; } if(!AeroDynamic_Functions){ [chooseDiscipline setState:1]; [setDefaultDiscipline setState:1]; [setDefaultNumberOfFunctions setIntValue:number_Of_Functions_Read_In at:0]; [numberOfFunctions setIntValue:number_Of_Functions_Read_In at:0]; } if(Binary_Data_Type){ [chooseDataType setState:0]; [setDefaultDataForm setState:0]; } if(!Binary_Data_Type){ [chooseDataType setState:1]; [setDefaultDataForm setState:1]; } if(colorOption){ [setDefaultColor setState:0]; [contourLineColor selectCellAt:0:3]; } if(!colorOption){ [setDefaultColor setState:1]; [contourLineColor selectCellAt:0:2]; } if(printColorMode){ [setDefaultPrintColor setState:1]; [printColor setState:1]; } if(!printColorMode){ [setDefaultPrintColor setState:0]; [printColor setState:0]; } [setDefault2D3D display]; [setDefaultColor display]; [setDefaultPrintColor display]; [printColor display]; [setDefaultDiscipline display]; [chooseDiscipline display]; [choose2D3DData display]; [choose2D3DGrid display]; if(colorOption) { [backgroundColor setColor:NX_COLORBLACK]; [foregroundColor setColor:NX_COLORWHITE]; [gridLineColor setColor:NX_COLORLTGRAY]; } if(!colorOption) { [foregroundColor setColor:NX_COLORBLACK]; [backgroundColor setColor:NX_COLORWHITE]; [gridLineColor setColor:NX_COLORLTGRAY]; } gridIsReadIn = NO; solutionIsReadIn = NO; oldMin.x = 0.0; oldMin.y = 0.0; oldMax.x = 1.0; oldMax.y = 1.0; currentMin.x = 0.0; currentMin.y = 0.0; currentMax.x = 1.0; currentMax.y = 1.0; [canvasWindow getFrame:&oldFrame]; return self; } - appDidInit:sender { [canvasWindow setMiniwindowIcon:"NeXTcontour.tiff"]; [controlsPanel setMiniwindowIcon:"NeXTcontour.tiff"]; [preferencesPanel setMiniwindowIcon:"NeXTcontour.tiff"]; [subsetsPanel setMiniwindowIcon:"NeXTcontour.tiff"]; [colorPanel setMiniwindowIcon:"NeXTcontour.tiff"]; [helpPanel setMiniwindowIcon:"NeXTcontour.tiff"]; [levelsPanel setMiniwindowIcon:"NeXTcontour.tiff"]; return self; } - resetDefaults:sender { int s1 = [setDefault2D3D state]; int s2 = [setDefaultDiscipline state]; int s3 = [setDefaultColor state]; int s4 = [setDefaultPrintColor state]; int s5 = [setDefaultDataForm state]; char s[4]; s[0] = '5'; s[1] = '\0'; s[2] = '\0'; s[3] = '\0'; switch(s1){ case 0: Two_D = NO; NXWriteDefault("NeXTcontour", "Two_D", "NO"); [choose2D3DData setState:0]; [choose2D3DGrid setState:0]; break; case 1: Two_D = YES; NXWriteDefault("NeXTcontour", "Two_D", "YES"); [choose2D3DData setState:1]; [choose2D3DGrid setState:1]; break; } switch(s2){ case 0: AeroDynamic_Functions = YES; NXWriteDefault("NeXTcontour", "AeroDynamics", "YES"); [chooseDiscipline setState:0]; if(Two_D){ [setDefaultNumberOfFunctions setIntValue:4 at:0]; number_Of_Functions_Read_In = 4; [numberOfFunctions setIntValue:4 at:0]; NXWriteDefault("NeXTcontour", "number_Of_Functions_Read_In", "4"); } if(!Two_D){ [setDefaultNumberOfFunctions setIntValue:5 at:0]; number_Of_Functions_Read_In = 5; [numberOfFunctions setIntValue:5 at:0]; NXWriteDefault("NeXTcontour", "number_Of_Functions_Read_In", "5"); } break; case 1: AeroDynamic_Functions = NO; [chooseDiscipline setState:1]; NXWriteDefault("NeXTcontour", "AeroDynamics", "NO"); number_Of_Functions_Read_In = [setDefaultNumberOfFunctions intValueAt:0]; [numberOfFunctions setIntValue:number_Of_Functions_Read_In at:0]; sprintf(s,"%d",number_Of_Functions_Read_In); NXWriteDefault("NeXTcontour", "number_Of_Functions_Read_In", s); break; } switch(s3){ case 0: colorOption = YES; NXWriteDefault("NeXTcontour", "colorOption", "YES"); [contourLineColor selectCellAt:0:3]; break; case 1: colorOption = NO; NXWriteDefault("NeXTcontour", "colorOption", "NO"); [contourLineColor selectCellAt:0:2]; break; } switch(s4){ case 0: printColorMode = NO; NXWriteDefault("NeXTcontour", "printColorMode", "NO"); [printColor setState:0]; break; case 1: printColorMode = YES; NXWriteDefault("NeXTcontour", "printColorMode", "YES"); [printColor setState:1]; break; } switch(s5){ case 0: Binary_Data_Type = YES; NXWriteDefault("NeXTcontour", "Binary_Data", "YES"); [chooseDataType setState:0]; break; case 1: Binary_Data_Type = NO; NXWriteDefault("NeXTcontour", "Binary_Data", "NO"); [chooseDataType setState:1]; break; } [printColor display]; [choose2D3DData display]; [choose2D3DGrid display]; [chooseDataType display]; [chooseDiscipline display]; [contourLineColor display]; return self; } - validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom)returnType { NXAtom a; a = NXUniqueString(NXAsciiPboardType); return (a==sendType)? self :nil; } - writeSelectionToPasteboard:pboard types:(NXAtom *)types { int i; NXStream *my_stream; int length, max_length; char *data; my_stream = NXOpenMemory(NULL,0,NX_WRITEONLY); for (i = 0; i < xyData.jmax; i++){ NXPrintf(my_stream,"%g %g \n", xyData.x[i], xyData.f[i]); } NXGetMemoryBuffer(my_stream, &data, &length, &max_length); [pboard declareTypes:&NXAsciiPboardType num:1 owner:self]; [pboard writeType:NXAsciiPboardType data:data length:length]; NXCloseMemory(my_stream, NX_TRUNCATEBUFFER); return self; } - (const char *)provideMainTitle { return [mainTitle stringValueAt:0]; } - (const char *)provideFunctionTitle{ return [functionTitle stringValueAt:0];} - (float)provideGridLineThickness { return [gridLineThickness floatValue]; } - (float)provideContourLineThickness{return [contourLineThickness floatValue];} - (NXCoord *)provideContourLevels:sender { return contourLevels; } - (NXColor) provideGridLineColor { if ((NXDrawingStatus == NX_PRINTING && [printColor state] == 0) || ([printPreviewMode state] != 0 && [printColor state] == 0)){ if([gridLineColorMatrix selectedCol] == 0)return NX_COLORLTGRAY; if([gridLineColorMatrix selectedCol] == 1)return NX_COLORDKGRAY; if([gridLineColorMatrix selectedCol] == 2)return NX_COLORBLACK; } else{ if(colorOption){ return [gridLineColor color]; } else { if([gridLineColorMatrix selectedCol] == 0)return NX_COLORLTGRAY; if([gridLineColorMatrix selectedCol] == 1)return NX_COLORDKGRAY; if([gridLineColorMatrix selectedCol] == 2)return NX_COLORBLACK; } } return NX_COLORBLACK; // Never reached, put in to eliminate Compiler Warning } - (NXColor) provideBackGroundColor { if ((NXDrawingStatus == NX_PRINTING && [printColor state] == 0) || ([printPreviewMode state] != 0 && [printColor state] == 0)){ return NX_COLORWHITE; } else{ return [backgroundColor color]; } } - (NXColor) provideForeGroundColor { if (((NXDrawingStatus == NX_PRINTING && [printColor state] == 0) || ([printPreviewMode state] != 0 && [printColor state] == 0))){ return NX_COLORBLACK; } else{ return [foregroundColor color]; } } - (int) provideContourLineColor { int i = 2; if ((NXDrawingStatus == NX_PRINTING && [printColor state] == 0) || ([printPreviewMode state] != 0 && [printColor state] == 0)){ return i; } else{ if(!colorOption && [contourLineColor selectedCol]==3){ NXBeep(); beepError = 25; /* audible alert */ [contourLineColor selectCellAt:0:2]; } return [contourLineColor selectedCol]; } } - (int) provideContourNumber:sender { return contourNumber;} - (int) provideViewingChoice:sender {return [viewingTransformations selectedRow] + 4* [viewingTransformations selectedCol]; } - (int) provideViewPoint:sender {return [viewPoint state]; } - (int) provideFunctionChoice:sender { return [functionMatrix selectedRow];} - (function_part)provideFunction:sender { return functionH; } - (grid_part) provideGrid:sender { return gridH; } - (NXCoord)provideFsmach { return solnhunk.fsmach; } - (NXCoord)provideAlpha { return solnhunk.alpha; } - (NXCoord)provideRe { return solnhunk.re; } - (NXCoord)provideTime { return solnhunk.time; } - (NXCoord)provideContourmin {return [contourLimits floatValueAt:0];} - (NXCoord)provideContourmax {return [contourLimits floatValueAt:1];} - (NXCoord)provideContourinc {return [contourLimits floatValueAt:2];} - (NXCoord)provideFmin {return [fMin floatValueAt:0];} - (NXCoord)provideFmax {return [fMax floatValueAt:0];} - (NXCoord)provideXmin {return [xyLimits floatValueAt:0];} - (NXCoord)provideXmax {return [xyLimits floatValueAt:1];} - (NXCoord)provideYmin {return [xyLimits floatValueAt:2];} - (NXCoord)provideYmax {return [xyLimits floatValueAt:3];} - (BOOL) doAnimateF { if ( [animate3DFOnOff state] ) return YES; else return NO; } - (BOOL) doAnimateG { if ( [animate3DGOnOff state] ) return YES; else return NO; } - (BOOL) doSetAspectRatio { if ( [setAspectRatio state] ) return NO; else return YES; } - (BOOL) do2D3D { if ( [choose2D3DData state] ) return YES; else return NO; } - (BOOL) do2D3D_grid { if ( [choose2D3DGrid state] ) return YES; else return NO; } - (BOOL) doAeroDynamics { if ( [chooseDiscipline state] ) return NO; else return YES; } - (BOOL) shouldChangeTitleFont { if ( [changeTitleFont state] ) return YES; else return NO; } - (BOOL) shouldChangeLabelFont { if ( [changeLabelFont state] ) return YES; else return NO; } - (BOOL) shouldShowXYLabels { if ( [xyLabelsOn state] ) return YES; else return NO; } - (BOOL) shouldShowUnitsLabel { if ( [unitsLabelOn state] ) return YES; else return NO; } - (BOOL) shouldShowContourValues { if ( [contourValuesOn state] ) return YES; else return NO; } - (BOOL) doZoom { if ( [zoomOnOff state] ) return YES; else return NO; } - (BOOL) doDrawFunction { if ( [drawFunction state] ) return YES; else return NO; } - (BOOL) doDrawGrid { if ( [drawGrid state] ) return YES; else return NO; } - (BOOL) doClearPlot { if ( [clearPlot state] ) return NO; else return YES; } - (BOOL) doSolidLines { if ( [solidContourLines state] ) return NO; else return YES; } - resetCmin:(NXCoord)aNum { [contourLimits setFloatValue:aNum at:0]; return self; } - resetCmax:(NXCoord)aNum { [contourLimits setFloatValue:aNum at:1]; return self; } - resetCinc:(NXCoord)aNum { [contourLimits setFloatValue:aNum at:2]; return self; } - resetFmin:(NXCoord)aNum { [fMin setFloatValue:aNum at:0]; return self; } - resetFmax:(NXCoord)aNum { [fMax setFloatValue:aNum at:0]; return self; } - resetXmin:(NXCoord)aNum { [xyLimits setFloatValue:aNum at:0]; return self; } - resetXmax:(NXCoord)aNum { [xyLimits setFloatValue:aNum at:1]; return self; } - resetYmin:(NXCoord)aNum { [xyLimits setFloatValue:aNum at:2]; return self; } - resetYmax:(NXCoord)aNum { [xyLimits setFloatValue:aNum at:3]; return self; } -resetMinMax:sender { if([self doDrawGrid] && ![self doDrawFunction]){ if(gridhunk.jmax != 0) [self loadGrid:self]; [self findGridMinAndMax]; [self resetGridMinMax:self]; } if([self doDrawFunction]){ [self loadFunctionGrid:self]; [self findFunctionGridMinAndMax]; [self resetFunctionGridMinMax:self]; } return self; } - resetGridMinMax:sender { [self resetXmin:gridH.gridmin.x]; [self resetYmin:gridH.gridmin.y]; [self resetXmax:gridH.gridmax.x]; [self resetYmax:gridH.gridmax.y]; currentMin.x = gridH.gridmin.x; currentMin.y = gridH.gridmin.y; currentMax.x = gridH.gridmax.x; currentMax.y = gridH.gridmax.y; return self; } - resetFunctionGridMinMax:sender { [self resetXmin:functionH.gridmin.x]; [self resetYmin:functionH.gridmin.y]; [self resetXmax:functionH.gridmax.x]; [self resetYmax:functionH.gridmax.y]; currentMin.x = functionH.gridmin.x; currentMin.y = functionH.gridmin.y; currentMax.x = functionH.gridmax.x; currentMax.y = functionH.gridmax.y; return self; } - resetFunctionMinMax:sender { [self resetFmin:functionH.functionmin]; [self resetFmax:functionH.functionmax]; return self; } - resetGridSubsets:sender { int i = 1; [jGridMax setIntValue:gridhunk.jmax at:0]; [kGridMax setIntValue:gridhunk.kmax at:0]; [lGridMax setIntValue:gridhunk.lmax at:0]; [jGridMin setIntValue:i at:0]; [kGridMin setIntValue:i at:0]; [lGridMin setIntValue:i at:0]; [jGridInc setIntValue:i at:0]; [kGridInc setIntValue:i at:0]; [lGridInc setIntValue:i at:0]; return self; } - resetFunctionSubsets:sender { int i = 1; [jFunctionMax setIntValue:solnhunk.jmax at:0]; [kFunctionMax setIntValue:solnhunk.kmax at:0]; [lFunctionMax setIntValue:solnhunk.lmax at:0]; [jFunctionMin setIntValue:i at:0]; [kFunctionMin setIntValue:i at:0]; [lFunctionMin setIntValue:i at:0]; [jFunctionInc setIntValue:i at:0]; [kFunctionInc setIntValue:i at:0]; [lFunctionInc setIntValue:i at:0]; return self; } - resetLineSubsets:sender { int i = 1; int lineChoice = [chooseLineData selectedRow]; BOOL b_2D = [self do2D3D]; if(b_2D){ if(lineChoice == 2 ){ NXBeep(); beepError = 24; /* audible alert */ lineChoice = 0; [chooseLineData selectCellAt:lineChoice:0]; } } switch(lineChoice){ case 0: [jLineMax setIntValue:gridhunk.jmax at:0]; [kLineMax setIntValue:i at:0]; [lLineMax setIntValue:i at:0]; break; case 1: [kLineMax setIntValue:gridhunk.kmax at:0]; [jLineMax setIntValue:i at:0]; [lLineMax setIntValue:i at:0]; break; case 2: [lLineMax setIntValue:gridhunk.lmax at:0]; [kLineMax setIntValue:i at:0]; [jLineMax setIntValue:i at:0]; break; } [jLineMin setIntValue:i at:0]; [kLineMin setIntValue:i at:0]; [lLineMin setIntValue:i at:0]; [jLineInc setIntValue:i at:0]; [kLineInc setIntValue:i at:0]; [lLineInc setIntValue:i at:0]; return self; } - resetAll:sender { [self resetGridSubsets:self]; [self resetFunctionSubsets:self]; [self resetFunctionMinMax:self]; stateChangeGrid = YES; stateChangeFunction = YES; return self; } - resetProjectionData:sender{ stateChangeGrid = YES; stateChangeFunction = YES; return self; } - resetGridLineColorWell:sender{ if([gridLineColorMatrix selectedCol] == 0) [gridLineColor setColor:NX_COLORLTGRAY]; if([gridLineColorMatrix selectedCol] == 1) [gridLineColor setColor:NX_COLORDKGRAY]; if([gridLineColorMatrix selectedCol] == 2) [gridLineColor setColor:NX_COLORBLACK]; [gridLineColor display]; return self; } - resetGridData:sender{ [self resetGridSubsets:self]; stateChangeGrid = YES; return self; } - resetLineData:sender{ [self resetLineSubsets:self]; return self; } - resetFunctionData:sender{ [self resetFunctionSubsets:self]; stateChangeFunction = YES; return self; } - eQuateSubsets:sender{ BOOL b_2D_grid = [self do2D3D_grid]; [jGridMin setIntValue:[jFunctionMin intValueAt:0] at:0]; [jGridMax setIntValue:[jFunctionMax intValueAt:0] at:0]; [jGridInc setIntValue:[jFunctionInc intValueAt:0] at:0]; [kGridMin setIntValue:[kFunctionMin intValueAt:0] at:0]; [kGridMax setIntValue:[kFunctionMax intValueAt:0] at:0]; [kGridInc setIntValue:[kFunctionInc intValueAt:0] at:0]; if(!b_2D_grid){ [lGridMin setIntValue:[lFunctionMin intValueAt:0] at:0]; [lGridMax setIntValue:[lFunctionMax intValueAt:0] at:0]; [lGridInc setIntValue:[lFunctionInc intValueAt:0] at:0]; } if(b_2D_grid){ [lGridMin setIntValue:1 at:0]; [lGridMax setIntValue:1 at:0]; [lGridInc setIntValue:1 at:0]; } [chooseGridPlane selectCellAt:[chooseFunctionPlane selectedRow]:0]; return self; } - drawPlotButton:(int)state { if (state==0) { [plotButton highlight:NO]; /* will display normal title */ } if (state==1) { [plotButton highlight:YES]; /* will display alternate title */ } return self; } - makeContourLevels:sender { float fmin,fmax,finc; int ncont = 0,n; if( ![autoContours state] ){ fmin = [fMin floatValueAt:0]; fmax = [fMax floatValueAt:0]; ncont = [numberContours intValueAt:0]; if(ncont == 0){ ncont = 1; [numberContours setIntValue:ncont at:0]; } finc = (fmax-fmin)/20.; if(ncont != 1)finc = (fmax - fmin)/(ncont-1); if(ncont == 1)finc = 0.0; [self resetCmin:fmin]; /* send contour level info to panel */ [self resetCmax:fmax]; [self resetCinc:finc]; contourNumber = ncont; free(contourLevels); contourLevels = (NXCoord *)malloc(ncont*sizeof(float)); for (n=0; n < ncont; n++){ contourLevels[n] = fmin + n*finc; } } else{ fmin = [contourLimits floatValueAt:0]; fmax = [contourLimits floatValueAt:1]; finc = [contourLimits floatValueAt:2]; if(finc == 0.0 && (fmax != fmin) ){ ncont = [numberContours intValueAt:0]; finc = (fmax-fmin)/ncont; [self resetCinc:finc]; } if(finc != 0)ncont = (int)(ABS(fmax - fmin)/ABS(finc)); if(fmin + ncont*finc != fmax)ncont = ncont + 1; if(fmin == fmax)ncont = 1; contourNumber = ncont; free(contourLevels); contourLevels = (NXCoord *)malloc(ncont*sizeof(float)); for (n=0; n < ncont; n++){ contourLevels[n] = fmin + n*finc; } if(contourLevels[ncont-1] > fmax)contourLevels[ncont-1] = fmax; } return self; } - drawPlot:sender { /* get new subsets and function for plotting */ BOOL animateF = [self doAnimateF]; BOOL animateG = [self doAnimateG]; BOOL b_2D = [self do2D3D]; int planeChoice = [chooseFunctionPlane selectedRow]; int i, i_0 = 0, i_m = 1, i_i = 1; char c_xmin[20],c_xmax[20],c_ymin[20],c_ymax[20]; float xmin,xmax,ymin,ymax; /* error check */ if(animateF && ![self doDrawFunction]) {NXBeep(); beepError = 1; return self; } if(animateG && ![self doDrawGrid]) {NXBeep(); beepError = 1; return self; } if([self doDrawGrid] && gridH.jmax == 0) { NXBeep(); beepError = 2; return self; } if([self doDrawFunction] && functionH.jmax == 0) {NXBeep(); beepError = 3; return self; } /* Need to convert the floating point vlaues of currentMin/Max to strings and back to floats because: when TextFields are read the floating point values in the textfield is converted from a sting to a float. If this is not done then the absolute comparison of the floating points values, (e.g. currentMin.x != [xyLimits floatValueAt:0] ) will fail because of conversion errors, causing all types of problems. thp 1/10/92 */ sprintf(c_xmin,"%g",currentMin.x); sprintf(c_xmax,"%g",currentMax.x); sprintf(c_ymin,"%g",currentMin.y); sprintf(c_ymax,"%g",currentMax.y); xmin = (float)atof(c_xmin); ymin = (float)atof(c_ymin); xmax = (float)atof(c_xmax); ymax = (float)atof(c_ymax); if ( xmin != [xyLimits floatValueAt:0] || xmax != [xyLimits floatValueAt:1] || ymin != [xyLimits floatValueAt:2] || ymax != [xyLimits floatValueAt:3] ) { oldMin.x = currentMin.x; currentMin.x = [xyLimits floatValueAt:0]; oldMax.x = currentMax.x; currentMax.x = [xyLimits floatValueAt:1]; oldMin.y = currentMin.y; currentMin.y = [xyLimits floatValueAt:2]; oldMax.y = currentMax.y; currentMax.y = [xyLimits floatValueAt:3]; } if(animateF && animateG)[self eQuateSubsets:self]; if([printPreviewMode state] !=0){ /* if preview mode reset clearplot */ [clearPlot setState:0]; [clearPlot display]; } /* function choices always take precedence over grid choices */ if(animateG && !animateF)planeChoice = [chooseGridPlane selectedRow]; if(animateF)planeChoice = [chooseFunctionPlane selectedRow]; switch(planeChoice){ case 0: if(animateG && !animateF){ i_0 = [jGridMin intValueAt:0]-1; i_i = [jGridInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [jGridInc setIntValue:i_i at:0]; return self; } i_m = [jGridMax intValueAt:0]-1; } if(animateF){ i_0 = [jFunctionMin intValueAt:0]-1; i_i = [jFunctionInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [jFunctionInc setIntValue:i_i at:0]; return self; } i_m = [jFunctionMax intValueAt:0]-1; } break; case 1: if(animateG && !animateF){ i_0 = [kGridMin intValueAt:0]-1; i_i = [kGridInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [kGridInc setIntValue:i_i at:0]; return self; } i_m = [kGridMax intValueAt:0]-1; } if(animateF){ i_0 = [kFunctionMin intValueAt:0]-1; i_i = [kFunctionInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [kFunctionInc setIntValue:i_i at:0]; return self; } i_m = [kFunctionMax intValueAt:0]-1; } break; case 2: if(animateG && !animateF){ i_0 = [lGridMin intValueAt:0]-1; i_i = [lGridInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [lGridInc setIntValue:i_i at:0]; return self; } i_m = [lGridMax intValueAt:0]-1; } if(animateF){ i_0 = [lFunctionMin intValueAt:0]-1; i_i = [lFunctionInc intValueAt:0]; if(i_i <= 0){ NXBeep(); beepError = 26; i_i = 1; [lFunctionInc setIntValue:i_i at:0]; return self; } i_m = [lFunctionMax intValueAt:0]-1; } break; } if(b_2D || (!animateF && !animateG)){ i_i = 1; i_m = i_0; } for (i = i_0; i <= i_m; i+= i_i){ if(animateG){ switch(planeChoice){ case 0: [jGridMin setIntValue:i+1 at:0]; break; case 1: [kGridMin setIntValue:i+1 at:0]; break; case 2: [lGridMin setIntValue:i+1 at:0]; break; } } if([self doDrawGrid])[self loadGrid:self]; if(animateF){ switch(planeChoice){ case 0: [jFunctionMin setIntValue:i+1 at:0]; break; case 1: [kFunctionMin setIntValue:i+1 at:0]; break; case 2: [lFunctionMin setIntValue:i+1 at:0]; break; } } if(solutionIsReadIn && [self doDrawFunction]){ [self loadFunctionGrid:self]; [self loadFunction:self]; [self makeContourLevels:self]; } if([self doDrawFunction] || [self doDrawGrid]){ if([self checkMinMax] == 1){ /* check on min/max limits for errors */ NXBeep(); beepError = 4; return self; } if(NXDrawingStatus != NX_PRINTING){ [self drawPlotButton:1]; /* display "Plotting" */ [canvas display]; [self drawPlotButton:0]; /* display "Plot" */ } } else{ NXBeep(); beepError = 22; return self; } } stateChangeGrid = NO; /* reset stateChange so old min/max retained*/ stateChangeFunction = NO; /* reset stateChange so old min/max retained*/ return self; } // Go through a particular datahunk and find values for datamin.x, // datamax.x, datamin.y, datamax.y - findGridMinAndMax { int j; gridH.gridmin.x = MAXFLOAT; /* defined in /usr/include/math.h */ gridH.gridmax.x = -MAXFLOAT; gridH.gridmin.y = MAXFLOAT; gridH.gridmax.y = -MAXFLOAT; for (j = 0; j < gridH.jmax*gridH.kmax; j++) { gridH.gridmin.x = MIN(gridH.gridmin.x, gridH.x[j]); gridH.gridmax.x = MAX(gridH.gridmax.x, gridH.x[j]); } for (j = 0; j < gridH.jmax*gridH.kmax; j++) { gridH.gridmin.y = MIN(gridH.gridmin.y, gridH.y[j]); gridH.gridmax.y = MAX(gridH.gridmax.y, gridH.y[j]); } return self; } - findFunctionGridMinAndMax { int j; functionH.gridmin.x = MAXFLOAT; /* defined in /usr/include/math.h */ functionH.gridmax.x = -MAXFLOAT; functionH.gridmin.y = MAXFLOAT; functionH.gridmax.y = -MAXFLOAT; for (j = 0; j < functionH.jmax*functionH.kmax; j++) { functionH.gridmin.x = MIN(functionH.gridmin.x, functionH.x[j]); functionH.gridmax.x = MAX(functionH.gridmax.x, functionH.x[j]); } for (j = 0; j < functionH.jmax*functionH.kmax; j++) { functionH.gridmin.y = MIN(functionH.gridmin.y, functionH.y[j]); functionH.gridmax.y = MAX(functionH.gridmax.y, functionH.y[j]); } return self; } - findFunctionMinAndMax { int j; functionH.functionmin = MAXFLOAT; /* defined in /usr/include/math.h */ functionH.functionmax = -MAXFLOAT; for (j = 0; j < functionH.jmax*functionH.kmax; j++) { functionH.functionmin = MIN(functionH.functionmin, functionH.f[j]); functionH.functionmax = MAX(functionH.functionmax, functionH.f[j]); } return self; } // Use the OpenPanel object to get a filename - openGrid:sender { // char const *fileTypes[2] = {"xy",0}; char const *fileTypes[2] = {0,0}; char fname[1024]; [openPanel setTitle:"OPEN GRID FILE"]; if ([openPanel runModalForTypes:fileTypes]) { strncpy(fname, [openPanel filename], 1024); [self openGridFile:fname]; } return self; } // Use the OpenPanel object to get a filename - openSolution:sender { // char const *fileTypes[2] = {"q",0}; char const *fileTypes[2] = {0,0}; char fname[1024]; [openPanel setTitle:"OPEN DATA FILE"]; if ([openPanel runModalForTypes:fileTypes]) { strncpy(fname, [openPanel filename], 1024); [self openSolnFile:fname]; } return self; } - openGridFile:(char *)dataFile { NXStream *dataStream; if ((dataStream = NXMapFile(dataFile, NX_READONLY)) == NULL) { NXRunAlertPanel("Open", "Cannot open %s", "OK", NULL, NULL, dataFile); return self; } if ([self readGrid:dataStream :dataFile] == 0) { NXRunAlertPanel("Read", "Couldn't read any data from %s", "OK", NULL, NULL, dataFile); NXCloseMemory(dataStream, NX_FREEBUFFER); return self; } NXCloseMemory(dataStream, NX_FREEBUFFER); [canvasWindow setTitleAsFilename:dataFile]; return self; } - openSolnFile:(char *)dataFile { NXStream *dataStream; if ((dataStream = NXMapFile(dataFile, NX_READONLY)) == NULL) { NXRunAlertPanel("Open", "Cannot open %s", "OK", NULL, NULL, dataFile); return self; } if ([self readSoln:dataStream :dataFile] == 0) { NXRunAlertPanel("Read", "Couldn't read any data from %s", "OK", NULL, NULL, dataFile); NXCloseMemory(dataStream, NX_FREEBUFFER); return self; } NXCloseMemory(dataStream, NX_FREEBUFFER); [canvasWindow setTitleAsFilename:dataFile]; return self; } /* Allocate enough memory and read the data points */ - readGrid:(NXStream *)aDataStream :(char *)dataFile { int j, numberofpoints, tmpint = 0; char c; BOOL b_2D = [self do2D3D_grid]; int filesize,expected_filesize = 0, errorAlert = 0; struct stat filestat; /* set plot button title "Reading" */ [plotButton setAltTitle:"Reading"]; [plotButton highlight:YES]; NXPing(); /* force plotButton redraw */ if(![chooseDataType state]){ NXRead(aDataStream, &gridhunk.jmax, sizeof(int)); NXRead(aDataStream, &gridhunk.kmax, sizeof(int)); if(!b_2D){ NXRead(aDataStream, &gridhunk.lmax, sizeof(int)); } else{gridhunk.lmax = 1;} } else{ while((tmpint=NXScanf(aDataStream, "%d", &gridhunk.jmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } while((tmpint=NXScanf(aDataStream, "%d", &gridhunk.kmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } if(!b_2D){ while((tmpint=NXScanf(aDataStream, "%d", &gridhunk.lmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } else{gridhunk.lmax = 1;} } numberofpoints = gridhunk.jmax*gridhunk.kmax*gridhunk.lmax; if(![chooseDataType state]){ /* check file size */ stat(dataFile,&filestat); filesize = filestat.st_size; if(b_2D){ expected_filesize = 2*sizeof(int) + 2*sizeof(float)*numberofpoints; if(filesize != expected_filesize){ errorAlert = NXRunAlertPanel("Read Grid File", "Not a Valid 2D Grid File! %s", "Try Again?","Continue?","Abort?", dataFile); if(errorAlert != NX_ALERTALTERNATE){ gridhunk.jmax = 0; gridhunk.kmax = 0; gridhunk.lmax = 0; } if(errorAlert == NX_ALERTOTHER){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; return self; } if(errorAlert == NX_ALERTDEFAULT){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; [self openGrid:self]; return self; } } } if(!b_2D){ expected_filesize = 3*sizeof(int) + 3*sizeof(float)*numberofpoints; if(filesize != expected_filesize){ errorAlert = NXRunAlertPanel("Read Grid File", "Not a Valid 3D Grid File! %s ", "Try Again?","Continue?","Abort?", dataFile); if(errorAlert != NX_ALERTALTERNATE){ gridhunk.jmax = 0; gridhunk.kmax = 0; gridhunk.lmax = 0; } if(errorAlert == NX_ALERTOTHER){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; return self; } if(errorAlert == NX_ALERTDEFAULT){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; [self openGrid:self]; return self; } } } } free((void *)gridhunk.x); free((void *)gridhunk.y); gridhunk.x = (NXCoord *)malloc(numberofpoints*sizeof(float)); gridhunk.y = (NXCoord *)malloc(numberofpoints*sizeof(float)); if(!b_2D){ free((void *)gridhunk.z); gridhunk.z = (NXCoord *)malloc(numberofpoints*sizeof(float)); } if(![chooseDataType state]){ NXRead(aDataStream, gridhunk.x, numberofpoints*sizeof(float)); NXRead(aDataStream, gridhunk.y, numberofpoints*sizeof(float)); if(!b_2D){NXRead(aDataStream, gridhunk.z, numberofpoints*sizeof(float)); } } else{ for (j=0; j<numberofpoints; j++){ while((tmpint=NXScanf(aDataStream, "%f", &gridhunk.x[j])) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } for (j=0; j<numberofpoints; j++){ while((tmpint=NXScanf(aDataStream, "%f", &gridhunk.y[j])) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } if(!b_2D){ for (j=0; j<numberofpoints; j++){ while((tmpint=NXScanf(aDataStream, "%f", &gridhunk.z[j])) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } } } /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; /* initialize gridH from gridhunk */ /* Initialize as 2D xy plane (jk plane) */ gridH.jmax = gridhunk.jmax; gridH.kmax = gridhunk.kmax; free((void *)gridH.x); free((void *)gridH.y); gridH.x = (NXCoord *)malloc(gridH.jmax*gridH.kmax*sizeof(float)); gridH.y = (NXCoord *)malloc(gridH.jmax*gridH.kmax*sizeof(float)); for (j = 0; j < gridhunk.jmax*gridhunk.kmax; j++){ gridH.x[j] = gridhunk.x[j]; gridH.y[j] = gridhunk.y[j]; } [self findGridMinAndMax]; /* On initial read function-grid min/max set to be same as grid min/max */ gridhunk.gridmin.x = gridH.gridmin.x; gridhunk.gridmin.y = gridH.gridmin.y; gridhunk.gridmax.x = gridH.gridmax.x; gridhunk.gridmax.y = gridH.gridmax.y; /* set min/max forms */ [self resetGridSubsets:self]; if(!gridIsReadIn){ [self resetGridMinMax:self]; } stateChangeGrid = NO; gridIsReadIn = YES; return self; } // Allocate enough memory and read the data points - readSoln:(NXStream *)aDataStream :(char *)dataFile { float gamma = 1.4; int j, numberofpoints,i,tmpint = 0; char c; BOOL b_2D = [self do2D3D]; BOOL aero = [self doAeroDynamics]; int filesize,expected_filesize = 0, errorAlert = 0; struct stat filestat; char title[14]; /* set plot button title "Reading" */ [plotButton setAltTitle:"Reading"]; [plotButton highlight:YES]; NXPing(); /* force plotButton redraw */ number_Of_Functions_Read_In = [numberOfFunctions intValueAt:0]; if(!aero){ [functionMatrix setTitle:"Function 1" at:0:0]; for(i=1; i< number_Of_Functions_Read_In; i++){ sprintf(title,"Function %d",i+1); [functionMatrix setTitle:title at:i:0]; } for(i=number_Of_Functions_Read_In; i<12; i++){ [functionMatrix setTitle:"Inactive" at:i:0]; } [functionMatrix display]; } if(aero){ if(b_2D && number_Of_Functions_Read_In !=4){ NXBeep(); beepError = 27; /* audible alert */ errorAlert = NXRunAlertPanel("Possible Read Data Error", "In 2D AeroDynamic Mode usually \n number of functions = 4 : you have %d", "Reset to 4","Continue?",NULL, number_Of_Functions_Read_In); if(errorAlert == NX_ALERTDEFAULT){ number_Of_Functions_Read_In = 4; [numberOfFunctions setIntValue:4 at:0]; } } if(!b_2D && number_Of_Functions_Read_In !=5){ NXBeep(); beepError = 27; /* audible alert */ errorAlert = NXRunAlertPanel("Possible Read Data Error", "In 3D AeroDynamic Mode usually \n number of functions = 5 : you have %d", "Reset to 5","Continue?",NULL, number_Of_Functions_Read_In); if(errorAlert == NX_ALERTDEFAULT){ number_Of_Functions_Read_In = 5; [numberOfFunctions setIntValue:5 at:0]; } } if((b_2D && number_Of_Functions_Read_In !=4)|| (!b_2D && number_Of_Functions_Read_In !=5)){ [functionMatrix setTitle:"Function 1" at:0:0]; for(i=1; i< number_Of_Functions_Read_In; i++){ sprintf(title,"Function %d",i+1); [functionMatrix setTitle:title at:i:0]; } for(i=number_Of_Functions_Read_In; i<12; i++){ [functionMatrix setTitle:"Inactive" at:i:0]; } } else{ [functionMatrix setTitle:"Q1: Density" at:0:0]; [functionMatrix setTitle:"Q2: U-Momentum" at:1:0]; [functionMatrix setTitle:"Q3: V-Momentum" at:2:0]; if(!b_2D)[functionMatrix setTitle:"Q4: W-Momentum" at:3:0]; if(b_2D)[functionMatrix setTitle:"Inactive" at:3:0]; if(!b_2D)[functionMatrix setTitle:"Q5: Energy" at:4:0]; if(b_2D)[functionMatrix setTitle:"Q4: Energy" at:4:0]; [functionMatrix setTitle:"Mach Number" at:5:0]; [functionMatrix setTitle:"Pressure" at:6:0]; [functionMatrix setTitle:"Cp" at:7:0]; [functionMatrix setTitle:"U-Velocity" at:8:0]; [functionMatrix setTitle:"V-Velocity" at:9:0]; if(!b_2D)[functionMatrix setTitle:"W-Velocity" at:10:0]; if(b_2D)[functionMatrix setTitle:"Inactive" at:10:0]; } [functionMatrix display]; } if(![chooseDataType state]){ NXRead(aDataStream, &solnhunk.jmax, sizeof(int)); NXRead(aDataStream, &solnhunk.kmax, sizeof(int)); if(!b_2D){ NXRead(aDataStream, &solnhunk.lmax, sizeof(int)); } else{solnhunk.lmax = 1;} } else{ while((tmpint=NXScanf(aDataStream, "%d", &solnhunk.jmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } while((tmpint=NXScanf(aDataStream, "%d", &solnhunk.kmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } if(!b_2D){ while((tmpint=NXScanf(aDataStream, "%d", &solnhunk.lmax)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } else{solnhunk.lmax = 1;} } numberofpoints = solnhunk.jmax*solnhunk.kmax*solnhunk.lmax; if(![chooseDataType state]){ /* check file size */ stat(dataFile,&filestat); filesize = filestat.st_size; if(b_2D){ if(!aero)expected_filesize = 2*sizeof(int) + number_Of_Functions_Read_In*sizeof(float)* numberofpoints; if(aero)expected_filesize = 2*sizeof(int) + 4*sizeof(float) + number_Of_Functions_Read_In*sizeof(float)*numberofpoints; if(filesize != expected_filesize){ errorAlert = NXRunAlertPanel("Read Grid File Error", "Not a Valid 2D Data File! %s", "Try Again?","Continue","Abort?", dataFile); if(errorAlert != NX_ALERTALTERNATE){ solnhunk.jmax = 0; solnhunk.kmax = 0; solnhunk.lmax = 0; } if(errorAlert == NX_ALERTOTHER){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; return self; } if(errorAlert == NX_ALERTDEFAULT){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; [self openSolution:self]; return self; } } } if(!b_2D){ if(!aero)expected_filesize = 3*sizeof(int) + number_Of_Functions_Read_In*sizeof(float)* numberofpoints; if(aero)expected_filesize = 3*sizeof(int) + 4*sizeof(float) + number_Of_Functions_Read_In*sizeof(float)*numberofpoints; if(filesize != expected_filesize){ errorAlert = NXRunAlertPanel("Read Data File Error", "Not a Valid 3D Data File! %s", "Try Again?","Continue?","Abort?", dataFile); if(errorAlert != NX_ALERTALTERNATE){ solnhunk.jmax = 0; solnhunk.kmax = 0; solnhunk.lmax = 0; } if(errorAlert == NX_ALERTOTHER){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; return self; } if(errorAlert == NX_ALERTDEFAULT){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; [self openSolution:self]; return self; } } } } /* checkpoint on data grid sizes against grid file*/ if( (gridhunk.jmax != solnhunk.jmax) || (gridhunk.kmax != solnhunk.kmax) || (gridhunk.lmax != solnhunk.lmax) ){ if(gridhunk.jmax == 0 ){ errorAlert = NXRunAlertPanel("Read Data FileError", "Need to Read In A Grid First", "Try Again?","Continue?", "Abort?"); } else{ if(b_2D)errorAlert = NXRunAlertPanel("Read Data FileError", "Inconsistent Dimensions, you had %d %d\n File %s", "Try Again?","Continue?", "Abort?", solnhunk.jmax,solnhunk.kmax,dataFile); if(!b_2D)errorAlert = NXRunAlertPanel("Read Data FileError", "Inconsistent Dimensions, you had %d %d %d\n File %s", "Try Again?","Continue?", "Abort?", solnhunk.jmax,solnhunk.kmax,solnhunk.lmax,dataFile); } if(errorAlert != NX_ALERTALTERNATE){ solnhunk.jmax = 0; solnhunk.kmax = 0; solnhunk.lmax = 0; } if(errorAlert == NX_ALERTOTHER){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; return self; } if(errorAlert == NX_ALERTDEFAULT){ /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; [self openSolution:self]; return self; } } if(![chooseDataType state]){ if(aero){ NXRead(aDataStream, &solnhunk.fsmach, sizeof(float)); NXRead(aDataStream, &solnhunk.alpha, sizeof(float)); NXRead(aDataStream, &solnhunk.re, sizeof(float)); NXRead(aDataStream, &solnhunk.time, sizeof(float)); } } else{ if(aero){ while((tmpint=NXScanf(aDataStream, "%f", &solnhunk.fsmach)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } while((tmpint=NXScanf(aDataStream, "%f", &solnhunk.alpha)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } while((tmpint=NXScanf(aDataStream, "%f", &solnhunk.re)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } while((tmpint=NXScanf(aDataStream, "%f", &solnhunk.time)) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } } free((void *)solnhunk.functions); solnhunk.functions = (NXCoord *)malloc(number_Of_Functions_Read_In* numberofpoints*sizeof(float)); if(aero){ free((void *)solnhunk.pressure); free((void *)solnhunk.mach_number); solnhunk.pressure = (NXCoord *)malloc(numberofpoints*sizeof(float)); solnhunk.mach_number = (NXCoord *)malloc(numberofpoints*sizeof(float)); } if(![chooseDataType state]){ NXRead(aDataStream, solnhunk.functions, number_Of_Functions_Read_In*numberofpoints*sizeof(float)); } else{ for (j=0; j<numberofpoints*number_Of_Functions_Read_In; j++){ while((tmpint=NXScanf(aDataStream, "%f", &solnhunk.functions[j])) == 0){ c = (char)NXGetc(aDataStream); /* throw away the next character */ } } } /*compute pressure and mach number here to speed up plotting */ if(!b_2D && aero){ for(i=0; i < numberofpoints; i++){ solnhunk.mach_number[i] = (solnhunk.functions[i+numberofpoints]* solnhunk.functions[i+numberofpoints] + solnhunk.functions[i+2*numberofpoints]* solnhunk.functions[i+2*numberofpoints] + solnhunk.functions[i+3*numberofpoints]* solnhunk.functions[i+3*numberofpoints]); solnhunk.pressure[i] = (gamma-1.0)* (solnhunk.functions[i+4*numberofpoints] - 0.5* solnhunk.mach_number[i]/solnhunk.functions[i]); solnhunk.mach_number[i] = sqrt(solnhunk.mach_number[i] / (gamma * solnhunk.functions[i] * solnhunk.pressure[i])); } } if(b_2D && aero){ for(i=0; i < numberofpoints; i++){ solnhunk.mach_number[i] = (solnhunk.functions[i+numberofpoints]* solnhunk.functions[i+numberofpoints] + solnhunk.functions[i+2*numberofpoints]* solnhunk.functions[i+2*numberofpoints]); solnhunk.pressure[i] = (gamma-1.0)* (solnhunk.functions[i+3*numberofpoints] - 0.5* solnhunk.mach_number[i]/solnhunk.functions[i]); solnhunk.mach_number[i] = sqrt(solnhunk.mach_number[i] / (gamma * solnhunk.functions[i] * solnhunk.pressure[i])); } } /* reset plot button */ [plotButton setAltTitle:"Plotting"]; [plotButton highlight:NO]; /* initialize functionH from gridhunk */ /* Initialize as 2D xy plane (jk plane) */ functionH.jmax = solnhunk.jmax; functionH.kmax = solnhunk.kmax; free((void *)functionH.x); functionH.x = (NXCoord *)malloc(functionH.jmax*functionH.kmax*sizeof(float)); free((void *)functionH.y); functionH.y = (NXCoord *)malloc(functionH.jmax*functionH.kmax*sizeof(float)); free((void *)functionH.f); functionH.f = (NXCoord *)malloc(functionH.jmax*functionH.kmax*sizeof(float)); for (j=0; j < solnhunk.jmax*solnhunk.kmax; j++){ functionH.x[j] = gridhunk.x[j]; functionH.y[j] = gridhunk.y[j]; functionH.f[j] = solnhunk.functions[j]; } if(!solutionIsReadIn){ [self resetFunctionSubsets:self]; [self resetLineSubsets:self]; } [self findFunctionGridMinAndMax]; [self findFunctionMinAndMax]; if(!solutionIsReadIn){ [self resetFunctionGridMinMax:self]; [self resetFunctionMinMax:self]; } stateChangeFunction = NO; solutionIsReadIn = YES; return self; } - loadGrid:sender { int j, k, l, i, ii; int jdim = gridhunk.jmax; int kdim = gridhunk.kmax; int jmax = gridhunk.jmax; int kmax = gridhunk.kmax; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int planeChoice = [chooseGridPlane selectedRow]; int viewChoice = [viewingTransformations selectedRow] + 4*[viewingTransformations selectedCol]; BOOL b_2D_grid = [self do2D3D_grid]; BOOL b_2D = [self do2D3D]; if(!b_2D && b_2D_grid)[self eQuateSubsets:self]; /* failsafe for 2d/3d */ if(b_2D_grid){ if(viewChoice != 0 && viewChoice != 4 && viewChoice != 3){ NXBeep(); beepError = 11; viewChoice = 0; [viewingTransformations selectCellAt:viewChoice:0]; } if(planeChoice != 2){ NXBeep(); beepError = 12; planeChoice = 2; [chooseGridPlane selectCellAt:planeChoice:0]; } } /* shift indices down 1 */ j_0 = [jGridMin intValueAt:0] - 1; j_i = [jGridInc intValueAt:0]; j_m = [jGridMax intValueAt:0] - 1; k_0 = [kGridMin intValueAt:0] - 1; k_i = [kGridInc intValueAt:0]; k_m = [kGridMax intValueAt:0] - 1; l_0 = [lGridMin intValueAt:0] - 1; l_i = [lGridInc intValueAt:0]; l_m = [lGridMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > gridhunk.jmax){ NXBeep(); beepError = 20; j_i = 1; [jGridInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > gridhunk.jmax-1){ NXBeep(); beepError = 20; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > gridhunk.jmax-1){ NXBeep(); beepError = 20; j_m = gridhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 20; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; j_m = gridhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > gridhunk.kmax){ NXBeep(); beepError = 20; k_i = 1; [kGridInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > gridhunk.kmax-1){ NXBeep(); beepError = 20; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > gridhunk.kmax-1){ NXBeep(); beepError = 20; k_m = gridhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 20; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; k_m = gridhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > gridhunk.lmax){ NXBeep(); beepError = 20; l_i = 1; [lGridInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > gridhunk.lmax-1){ NXBeep(); beepError = 20; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > gridhunk.lmax-1){ NXBeep(); beepError = 20; l_m = gridhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 20; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; l_m = gridhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } switch(planeChoice){ case 0: jdim = (k_m - k_0)/k_i + 1; kdim = (l_m - l_0)/l_i + 1; j_m = j_0; [jGridMax setIntValue:j_m+1 at:0]; j_i = 1; [jGridInc setIntValue:j_i at:0]; break; case 1: jdim = (j_m - j_0)/j_i + 1; kdim = (l_m - l_0)/l_i + 1; k_m = k_0; [kGridMax setIntValue:k_m+1 at:0]; k_i = 1; [kGridInc setIntValue:k_i at:0]; break; case 2: jdim = (j_m - j_0)/j_i + 1; kdim = (k_m - k_0)/k_i + 1; l_m = l_0; [lGridMax setIntValue:l_m+1 at:0]; l_i = 1; [lGridInc setIntValue:l_i at:0]; break; } free((void *)gridH.x); free((void *)gridH.y); gridH.jmax = jdim; gridH.kmax = kdim; gridH.x = (NXCoord *)malloc(jdim*kdim*sizeof(float)); gridH.y = (NXCoord *)malloc(jdim*kdim*sizeof(float)); switch(viewChoice){ case 0: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.x[i]; gridH.y[ii] = gridhunk.y[i]; ii = ii+1; } } } break; case 1: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.x[i]; gridH.y[ii] = gridhunk.z[i]; ii = ii+1; } } } break; case 2: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.y[i]; gridH.y[ii] = gridhunk.z[i]; ii = ii+1; } } } break; case 3: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ switch(planeChoice){ case 2: gridH.x[ii] = (float)j+1; gridH.y[ii] = (float)k+1; break; case 0: gridH.x[ii] = (float)k+1; gridH.y[ii] = (float)l+1; break; case 1: gridH.x[ii] = (float)j+1; gridH.y[ii] = (float)l+1; break; } ii = ii+1; } } } break; case 4: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.y[i]; gridH.y[ii] = gridhunk.x[i]; ii = ii+1; } } } break; case 5: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.z[i]; gridH.y[ii] = gridhunk.x[i]; ii = ii+1; } } } break; case 6: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; gridH.x[ii] = gridhunk.z[i]; gridH.y[ii] = gridhunk.y[i]; ii = ii+1; } } } break; } [self findGridMinAndMax]; /////// if(stateChangeGrid && !stateChangeFunction)[self resetGridMinMax:self]; return self; } - loadFunction:sender { int j, k, l, i, ii; int jdim = solnhunk.jmax; int kdim = solnhunk.kmax; int jmax = solnhunk.jmax; int kmax = solnhunk.kmax; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int planeChoice = [chooseFunctionPlane selectedRow]; int viewChoice = [viewingTransformations selectedRow] + 4*[viewingTransformations selectedCol]; int functionChoice = [functionMatrix selectedRow]; BOOL b_2D = [self do2D3D]; BOOL aero = [self doAeroDynamics]; float gamma = 1.4; int numberofpoints; numberofpoints = solnhunk.jmax*solnhunk.kmax*solnhunk.lmax; /* failsafes for 2d/3d multiple vrs single functions*/ if(!aero && functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(aero){ if((number_Of_Functions_Read_In != 4 && b_2D) || (number_Of_Functions_Read_In != 5 && !b_2D)){ if(functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } } } if(b_2D){ if((functionChoice == 3 || functionChoice == 10 ) && (aero && number_Of_Functions_Read_In == 4)){ NXBeep(); beepError = 14; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(viewChoice != 0 && viewChoice != 4 && viewChoice != 3){ NXBeep(); beepError = 15; viewChoice = 0; [viewingTransformations selectCellAt:viewChoice:0]; } if(planeChoice != 2){ NXBeep(); beepError = 16; planeChoice = 2; [chooseFunctionPlane selectCellAt:planeChoice:0]; } } /* shift indices down 1 */ j_0 = [jFunctionMin intValueAt:0] - 1; j_i = [jFunctionInc intValueAt:0]; j_m = [jFunctionMax intValueAt:0] - 1; k_0 = [kFunctionMin intValueAt:0] - 1; k_i = [kFunctionInc intValueAt:0]; k_m = [kFunctionMax intValueAt:0] - 1; l_0 = [lFunctionMin intValueAt:0] - 1; l_i = [lFunctionInc intValueAt:0]; l_m = [lFunctionMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > solnhunk.jmax){ NXBeep(); beepError = 21; j_i = 1; [jFunctionInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > solnhunk.kmax){ NXBeep(); beepError = 21; k_i = 1; [kFunctionInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > solnhunk.lmax){ NXBeep(); beepError = 21; l_i = 1; [lFunctionInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } switch(planeChoice){ case 0: jdim = (k_m - k_0)/k_i + 1; kdim = (l_m - l_0)/l_i + 1; j_m = j_0; [jFunctionMax setIntValue:j_m+1 at:0]; j_i = 1; [jFunctionInc setIntValue:j_i at:0]; break; case 1: jdim = (j_m - j_0)/j_i + 1; kdim = (l_m - l_0)/l_i + 1; k_m = k_0; [kFunctionMax setIntValue:k_m+1 at:0]; k_i = 1; [kFunctionInc setIntValue:k_i at:0]; break; case 2: jdim = (j_m - j_0)/j_i + 1; kdim = (k_m - k_0)/k_i + 1; l_m = l_0; [lFunctionMax setIntValue:l_m+1 at:0]; l_i = 1; [lFunctionInc setIntValue:l_i at:0]; break; } free((void *)functionH.f); functionH.jmax = jdim; functionH.kmax = kdim; functionH.f = (NXCoord *)malloc(jdim*kdim*sizeof(float)); /* load up subset function for plotting */ if(aero){ if((number_Of_Functions_Read_In == 4 && b_2D) || (number_Of_Functions_Read_In == 5 && !b_2D)){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; switch(functionChoice){ case 0: /* Q1: Density */ functionH.f[ii] = solnhunk.functions[i]; break; case 1: /* Q2: U Momentum */ functionH.f[ii] = solnhunk.functions[i+numberofpoints]; break; case 2: /* Q3: V Momentum */ functionH.f[ii] = solnhunk.functions[i+2*numberofpoints]; break; case 3: /* Q4: W Momentum */ functionH.f[ii] = solnhunk.functions[i+3*numberofpoints]; break; case 4: /* Q5: Energy */ if(!b_2D)functionH.f[ii] = solnhunk.functions[i+4*numberofpoints]; if(b_2D)functionH.f[ii] = solnhunk.functions[i+3*numberofpoints]; break; case 5: /* Mach Number */ functionH.f[ii] = solnhunk.mach_number[i]; break; case 6: /* Pressure */ functionH.f[ii] = solnhunk.pressure[i]; break; case 7: functionH.f[ii] = /* Cp */ 2.0/(gamma*solnhunk.fsmach*solnhunk.fsmach) * (solnhunk.pressure[i]*gamma - 1.); break; case 8: /* U Velocity */ functionH.f[ii] = solnhunk.functions[i+numberofpoints]/solnhunk.functions[i]; break; case 9: /* V Velocity */ functionH.f[ii] = solnhunk.functions[i+2*numberofpoints]/solnhunk.functions[i]; break; case 10: /* W Velocity */ functionH.f[ii] = solnhunk.functions[i+3*numberofpoints]/solnhunk.functions[i]; break; } ii = ii+1; } } } } else{ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.f[ii] = solnhunk.functions[i + functionChoice*numberofpoints]; ii = ii+1; } } } } } if(!aero){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.f[ii] = solnhunk.functions[i + functionChoice*numberofpoints]; ii = ii+1; } } } } [self findFunctionMinAndMax]; [self resetFunctionMinMax:self]; return self; } - loadFunctionGrid:sender { int j, k, l, i, ii; BOOL b_2D = [self do2D3D]; BOOL b_2D_grid = [self do2D3D_grid]; int jdim,kdim,jmax,kmax,planeChoice; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int viewChoice = [viewingTransformations selectedRow] + 4*[viewingTransformations selectedCol]; if(b_2D == b_2D_grid){ jdim = solnhunk.jmax; kdim = solnhunk.kmax; jmax = solnhunk.jmax; kmax = solnhunk.kmax; planeChoice = [chooseFunctionPlane selectedRow];} else{ jdim = gridhunk.jmax; kdim = gridhunk.kmax; jmax = gridhunk.jmax; kmax = gridhunk.kmax; planeChoice = [chooseGridPlane selectedRow];} /* failsafe for 2d/3d */ if(b_2D_grid){ if(viewChoice != 0 && viewChoice != 4 && viewChoice != 3){ NXBeep(); beepError = 18; viewChoice = 0; [viewingTransformations selectCellAt:viewChoice:0]; } if(planeChoice != 2){ NXBeep(); beepError = 19; planeChoice = 2; if(b_2D == b_2D_grid)[chooseFunctionPlane selectCellAt:planeChoice:0]; if(b_2D != b_2D_grid)[chooseGridPlane selectCellAt:planeChoice:0]; } } /* shift indices down 1 */ if(b_2D == b_2D_grid){ j_0 = [jFunctionMin intValueAt:0] - 1; j_i = [jFunctionInc intValueAt:0]; j_m = [jFunctionMax intValueAt:0] - 1; k_0 = [kFunctionMin intValueAt:0] - 1; k_i = [kFunctionInc intValueAt:0]; k_m = [kFunctionMax intValueAt:0] - 1; l_0 = [lFunctionMin intValueAt:0] - 1; l_i = [lFunctionInc intValueAt:0]; l_m = [lFunctionMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > solnhunk.jmax){ NXBeep(); beepError = 21; j_i = 1; [jFunctionInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > solnhunk.kmax){ NXBeep(); beepError = 21; k_i = 1; [kFunctionInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > solnhunk.lmax){ NXBeep(); beepError = 21; l_i = 1; [lFunctionInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } } else{ j_0 = [jGridMin intValueAt:0] - 1; j_i = [jGridInc intValueAt:0]; j_m = [jGridMax intValueAt:0] - 1; k_0 = [kGridMin intValueAt:0] - 1; k_i = [kGridInc intValueAt:0]; k_m = [kGridMax intValueAt:0] - 1; l_0 = [lGridMin intValueAt:0] - 1; l_i = [lGridInc intValueAt:0]; l_m = [lGridMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > solnhunk.jmax){ NXBeep(); beepError = 21; j_i = 1; [jGridInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_m = solnhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 21; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; j_m = solnhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > solnhunk.kmax){ NXBeep(); beepError = 21; k_i = 1; [kGridInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_m = solnhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 21; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; k_m = solnhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > solnhunk.lmax){ NXBeep(); beepError = 21; l_i = 1; [lGridInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_m = solnhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 21; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; l_m = solnhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } } switch(planeChoice){ case 0: jdim = (k_m - k_0)/k_i + 1; kdim = (l_m - l_0)/l_i + 1; j_m = j_0; [jFunctionMax setIntValue:j_m+1 at:0]; j_i = 1; [jFunctionInc setIntValue:j_i at:0]; break; case 1: jdim = (j_m - j_0)/j_i + 1; kdim = (l_m - l_0)/l_i + 1; k_m = k_0; [kFunctionMax setIntValue:k_m+1 at:0]; k_i = 1; [kFunctionInc setIntValue:k_i at:0]; break; case 2: jdim = (j_m - j_0)/j_i + 1; kdim = (k_m - k_0)/k_i + 1; l_m = l_0; [lFunctionMax setIntValue:l_m+1 at:0]; l_i = 1; [lFunctionInc setIntValue:l_i at:0]; break; } free((void *)functionH.x); free((void *)functionH.y); functionH.jmax = jdim; functionH.kmax = kdim; functionH.x = (NXCoord *)malloc(jdim*kdim*sizeof(float)); functionH.y = (NXCoord *)malloc(jdim*kdim*sizeof(float)); /* load up subset function grid for plotting */ /* load up grid */ switch(viewChoice){ case 0: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.x[i]; functionH.y[ii] = gridhunk.y[i]; ii = ii+1; } } } break; case 1: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.x[i]; functionH.y[ii] = gridhunk.z[i]; ii = ii+1; } } } break; case 2: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.y[i]; functionH.y[ii] = gridhunk.z[i]; ii = ii+1; } } } break; case 3: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ switch(planeChoice){ case 2: functionH.x[ii] = (float)j+1; functionH.y[ii] = (float)k+1; break; case 0: functionH.x[ii] = (float)k+1; functionH.y[ii] = (float)l+1; break; case 1: functionH.x[ii] = (float)j+1; functionH.y[ii] = (float)l+1; break; } ii = ii+1; } } } break; case 4: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.y[i]; functionH.y[ii] = gridhunk.x[i]; ii = ii+1; } } } break; case 5: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.z[i]; functionH.y[ii] = gridhunk.x[i]; ii = ii+1; } } } break; case 6: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; functionH.x[ii] = gridhunk.z[i]; functionH.y[ii] = gridhunk.y[i]; ii = ii+1; } } } break; } [self findFunctionGridMinAndMax]; ///// if(stateChangeFunction)[self resetFunctionGridMinMax:self]; return self; } - whyTheBeep:sender { switch(beepError){ case 0: NXRunAlertPanel("The Beep Panel", "BEEP BEEP, We All Need Some Info Sometime\n Just Click Why The Beep? whenever you hear BEEP\n A Service Of NeXTcontour", "OK",NULL,NULL); break; case 1: NXRunAlertPanel("The Beep Happened Because", "Can't animate without drawing function", "OK",NULL,NULL); break; case 2: NXRunAlertPanel("The Beep Happened Because", "No grid available for plotting \n read in a Grid File", "OK",NULL,NULL); break; case 3: NXRunAlertPanel("The Beep Happened Because", "No function available for plotting \n read in a Data File", "OK",NULL,NULL); break; case 4: NXRunAlertPanel("The Beep Happened Because", "You Can't Plot With min = max \n Check min/max Subsets, Plane and Projection", "OK",NULL,NULL); break; case 11: NXRunAlertPanel("The Beep Happened Because", "Viewing Choice Must Be XY or YX for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 12: NXRunAlertPanel("The Beep Happened Because", "Plane Choice Must Be l for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 13: NXRunAlertPanel("The Beep Happened Because", "Function Choice > Number of Functions Available \n I Fixed It For You", "OK",NULL,NULL); break; case 14: NXRunAlertPanel("The Beep Happened Because", "For 2D Cases You Can't Plot W or W-Momentum \n I Fixed It For You", "OK",NULL,NULL); break; case 15: NXRunAlertPanel("The Beep Happened Because", "Viewing Choice Must Be XY or YX for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 16: NXRunAlertPanel("The Beep Happened Because", "Plane Choice Must Be l for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 17: NXRunAlertPanel("The Beep Happened Because", "For 2D Cases You Can't Plot W or W-Momentum \n I Fixed It For You", "OK",NULL,NULL); break; case 18: NXRunAlertPanel("The Beep Happened Because", "Viewing Choice Must Be XY or YX for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 19: NXRunAlertPanel("The Beep Happened Because", "Plane Choice Must Be l for 2D Cases \n I Fixed It For You", "OK",NULL,NULL); break; case 20: NXRunAlertPanel("The Beep Happened Because", "Indices Out Of Range For Grid Subsets\n I Fixed It For You", "OK",NULL,NULL); break; case 21: NXRunAlertPanel("The Beep Happened Because", "Indices Out Of Range For Function Subsets\n I Fixed It For You", "OK",NULL,NULL); break; case 22: NXRunAlertPanel("The Beep Happened Because", "You Need To Choose Plot Grid or Plot Function\n GO FOR IT!", "OK",NULL,NULL); break; case 23: NXRunAlertPanel("The Beep Happened Because", "For 2D Cases You Can't Plot Z Coordnate Data Line\n I Fixed It For You", "OK",NULL,NULL); break; case 24: NXRunAlertPanel("The Beep Happened Because", "For 2D Cases You Can't Plot l Coordnate Data Line\n I Fixed It For You", "OK",NULL,NULL); break; case 25: NXRunAlertPanel("The Beep Happened Because", "Color Option Not Allow By Preferences \n Reset Preferences Or Use Black/Gray \n I Reset Line Color For Now", "OK",NULL,NULL); break; case 26: NXRunAlertPanel("The Beep Happened Because", "You Can not animate with <= zero increment \n I Fixed It For You", "OK",NULL,NULL); break; case 27: NXRunAlertPanel("The Beep Happened Because", "The number of funtions to be read in was checked \n previous warning panel took care of it for you", "OK",NULL,NULL); break; case 28: NXRunAlertPanel("The Beep Happened Because", "You asked for an awful lot of list data \n The alert panel took care of it for you", "OK",NULL,NULL); break; } return self; } - (int)checkMinMax { float xmin = [xyLimits floatValueAt:0]; float xmax = [xyLimits floatValueAt:1]; float ymin = [xyLimits floatValueAt:2]; float ymax = [xyLimits floatValueAt:3]; int error = 0; if(xmin == xmax){ NXRunAlertPanel ("Min/Max Check", "Plot Error xmin = xmax : Check min/max \n Subsets, Plane Choice and Projections", "OK",NULL,NULL); error = 1; } if(ymin == ymax){ NXRunAlertPanel ("Min/Max Check", "Plot Error ymin = ymax : Check min/max \n Subsets, Plane Choice and Projections", "OK",NULL,NULL); error = 1; } return error; } - writeOutLineData:sender { int jdim = solnhunk.jmax; int jmax = solnhunk.jmax; int kmax = solnhunk.kmax; int j, k, l, i, ii, i_minus; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int coordinateChoice = [absissaCoordinate selectedRow]; int lineChoice = [chooseLineData selectedRow]; int functionChoice = [functionMatrix selectedRow]; BOOL b_2D = [self do2D3D]; BOOL aero = [self doAeroDynamics]; float gamma = 1.4; float xyData_save; int numberofpoints = solnhunk.jmax*solnhunk.kmax*solnhunk.lmax; /* failsafes for 2d/3d multiple vrs single functions*/ if(!aero && functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(aero){ if((number_Of_Functions_Read_In != 4 && b_2D) || (number_Of_Functions_Read_In != 5 && !b_2D)){ if(functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } } } if(b_2D){ if((functionChoice == 3 || functionChoice == 10 ) && (aero && number_Of_Functions_Read_In == 4)){ NXBeep(); beepError = 14; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(coordinateChoice == 2 ){ NXBeep(); beepError = 23; /* audible alert */ coordinateChoice = 0; [absissaCoordinate selectCellAt:coordinateChoice:0]; } if(lineChoice == 2 ){ NXBeep(); beepError = 24; /* audible alert */ lineChoice = 0; [chooseLineData selectCellAt:lineChoice:0]; } } /* shift indices down 1 */ j_0 = [jLineMin intValueAt:0] - 1; j_i = [jLineInc intValueAt:0]; j_m = [jLineMax intValueAt:0] - 1; k_0 = [kLineMin intValueAt:0] - 1; k_i = [kLineInc intValueAt:0]; k_m = [kLineMax intValueAt:0] - 1; l_0 = [lLineMin intValueAt:0] - 1; l_i = [lLineInc intValueAt:0]; l_m = [lLineMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > solnhunk.jmax){ NXBeep(); beepError = 21; j_i = 1; [jLineInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_0 = 0; [jLineMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_m = solnhunk.jmax-1; [jLineMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && lineChoice == 0){ NXBeep(); beepError = 21; j_0 = 0; [jLineMin setIntValue:j_0+1 at:0]; j_m = solnhunk.jmax-1; [jLineMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > solnhunk.kmax){ NXBeep(); beepError = 21; k_i = 1; [kLineInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_0 = 0; [kLineMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_m = solnhunk.kmax-1; [kLineMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && lineChoice == 1){ NXBeep(); beepError = 21; k_0 = 0; [kLineMin setIntValue:k_0+1 at:0]; k_m = solnhunk.kmax-1; [kLineMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > solnhunk.lmax){ NXBeep(); beepError = 21; l_i = 1; [lLineInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_0 = 0; [lLineMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_m = solnhunk.lmax-1; [lLineMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && lineChoice == 2){ NXBeep(); beepError = 21; l_0 = 0; [lLineMin setIntValue:l_0+1 at:0]; l_m = solnhunk.lmax-1; [lLineMax setIntValue:l_m+1 at:0]; } switch(lineChoice){ case 0: jdim = (j_m - j_0)/j_i + 1; k_m = k_0; l_m = l_0; k_i = 1; l_i = 1; [kLineMax setIntValue:k_m+1 at:0]; [lLineMax setIntValue:l_m+1 at:0]; [kLineInc setIntValue:k_i at:0]; [lLineInc setIntValue:l_i at:0]; break; case 1: jdim = (k_m - k_0)/k_i + 1; j_m = j_0; l_m = l_0; j_i = 1; l_i = 1; [jLineMax setIntValue:j_m+1 at:0]; [lLineMax setIntValue:l_m+1 at:0]; [jLineInc setIntValue:j_i at:0]; [lLineInc setIntValue:l_i at:0]; break; case 2: jdim = (l_m - l_0)/l_i + 1; k_m = k_0; j_m = j_0; k_i = 1; j_i = 1; [kLineMax setIntValue:k_m+1 at:0]; [jLineMax setIntValue:j_m+1 at:0]; [kLineInc setIntValue:k_i at:0]; [jLineInc setIntValue:j_i at:0]; break; } free((void *)xyData.f); free((void *)xyData.x); xyData.jmax = jdim; xyData.x = (NXCoord *)malloc(jdim*sizeof(float)); xyData.f = (NXCoord *)malloc(jdim*sizeof(float)); if(coordinateChoice == 3){ ii = 0; xyData_save = 0.0; i_minus = l_0*jmax*kmax + k_0*jmax + j_0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; if(b_2D){ xyData.x[ii] = xyData_save + sqrt( (gridhunk.x[i]-gridhunk.x[i_minus])* (gridhunk.x[i]-gridhunk.x[i_minus]) + (gridhunk.y[i]-gridhunk.y[i_minus])* (gridhunk.y[i]-gridhunk.y[i_minus]) ); } if(!b_2D){ xyData.x[ii] = xyData_save + sqrt( (gridhunk.x[i]-gridhunk.x[i_minus])* (gridhunk.x[i]-gridhunk.x[i_minus]) + (gridhunk.y[i]-gridhunk.y[i_minus])* (gridhunk.y[i]-gridhunk.y[i_minus]) + (gridhunk.z[i]-gridhunk.z[i_minus])* (gridhunk.z[i]-gridhunk.z[i_minus]) ); } i_minus = i; xyData_save = xyData.x[ii]; ii = ii+1; } } } } ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ i = l*jmax*kmax + k*jmax + j; switch(coordinateChoice){ case 0: xyData.x[ii] = gridhunk.x[i]; break; case 1: xyData.x[ii] = gridhunk.y[i]; break; case 2: xyData.x[ii] = gridhunk.z[i]; break; case 3: break; case 4: if(lineChoice==0)xyData.x[ii] = j+1; if(lineChoice==1)xyData.x[ii] = k+1; if(lineChoice==2)xyData.x[ii] = l+1; break; } if(aero){ switch(functionChoice){ case 0: xyData.f[ii] = solnhunk.functions[i]; break; case 1: xyData.f[ii] = solnhunk.functions[i+numberofpoints]; break; case 2: xyData.f[ii] = solnhunk.functions[i+2*numberofpoints]; break; case 3: xyData.f[ii] = solnhunk.functions[i+3*numberofpoints]; break; case 4: if(!b_2D)xyData.f[ii] = solnhunk.functions[i+4*numberofpoints]; if(b_2D)xyData.f[ii] = solnhunk.functions[i+3*numberofpoints]; break; case 5: xyData.f[ii] = solnhunk.mach_number[i]; break; case 6: xyData.f[ii] = solnhunk.pressure[i]; break; case 7: xyData.f[ii] = 2.0/(gamma*solnhunk.fsmach*solnhunk.fsmach) * (solnhunk.pressure[i]*gamma - 1.); break; case 8: xyData.f[ii] = solnhunk.functions[i+numberofpoints]/solnhunk.functions[i]; break; case 9: xyData.f[ii] = solnhunk.functions[i+2*numberofpoints]/solnhunk.functions[i]; break; case 10: xyData.f[ii] = solnhunk.functions[i+3*numberofpoints]/solnhunk.functions[i]; break; } } if(!aero){ xyData.f[ii] = solnhunk.functions[i + functionChoice*numberofpoints]; } ii = ii+1; } } } return self; } - (BOOL)appAcceptsAnotherFile:sender /* Added by J. Gregory 9-Oct-91. */ { return YES; } - (int)app:sender openFile:(const char *)fullPath type:(const char *)aType { if(gridIsReadIn && solutionIsReadIn) {gridIsReadIn = NO; solutionIsReadIn = NO;} if(!gridIsReadIn){ [self openGridFile:(char *)fullPath];} else{ [self openSolnFile:(char *)fullPath];} return YES; } /* * This function is called by the PlotView object during zooming. */ - stackOldMinMax:(float)xmin :(float)xmax :(float)ymin :(float)ymax { oldMin = currentMin; /* structure assignment */ oldMax = currentMax; currentMin.x = xmin; currentMax.x = xmax; currentMin.y = ymin; currentMax.y = ymax; return self; } - previousView:sender { NXPoint tmp; [self resetXmin:oldMin.x]; [self resetXmax:oldMax.x]; [self resetYmin:oldMin.y]; [self resetYmax:oldMax.y]; tmp = oldMin; oldMin = currentMin; currentMin = tmp; tmp = oldMax; oldMax = currentMax; currentMax = tmp; [self drawPlotButton:1]; /* display "Plotting" */ [canvas display]; [self drawPlotButton:0]; /* display "Plot" */ return self; } // newTextView: is invoked in response to a new empty window request. It // creates a new window containing a TextView. Note that we want new windows // to be offset from each other by some amount; hence the use of Rect. #define g_ORIGX 150.0 #define g_ORIGY 200.0 static NXRect gRect = {{g_ORIGX, g_ORIGY},{900.0,600.0}}; - listGridData:sender { char data[64]; const char *types[1]; int length, max_length; char *s_data; static int window_number = 0; id newTextView; NXOffsetRect(&gRect, 20.0, -20.0); if (gRect.origin.y < 0) { gRect.origin.y = g_ORIGY; gRect.origin.x = g_ORIGX; } newTextView = [[TextView alloc] initFrame:&gRect]; [[newTextView window] setDelegate:self]; window_number = window_number + 1; sprintf(data, " Grid Data %d",window_number); [[newTextView window] setTitle:data]; theTextView = newTextView; pboardoutput = [Pasteboard new]; /* get the standard selection pasteboard */ types[0] = NXAsciiPboardType; [pboardoutput declareTypes:types num:1 owner:NULL]; sprintf(data, " Grid Data Output \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; sprintf(data, " ---------------- \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; data_stream = NXOpenMemory(NULL,0,NX_WRITEONLY); listGrid_Data = YES; [self listGridLoad:self]; if(!listGrid_Data){ [[newTextView window] close]; return self; } listGrid_Data = NO; NXGetMemoryBuffer(data_stream, &s_data, &length, &max_length); [pboardoutput declareTypes:&NXAsciiPboardType num:1 owner:self]; [pboardoutput writeType:NXAsciiPboardType data:s_data length:length]; NXCloseMemory(data_stream, NX_TRUNCATEBUFFER); [[theTextView provideTextObject] paste:self]; return self; } #define f_ORIGX 200.0 #define f_ORIGY 150.0 static NXRect fRect = {{f_ORIGX, f_ORIGY},{500.0,600.0}}; - listFunctionData:sender { char data[64]; const char *types[1]; int length, max_length; char *s_data; static int window_number = 0; id newTextView; NXOffsetRect(&fRect, 20.0, -20.0); if (fRect.origin.y < 0) { fRect.origin.y = f_ORIGY; fRect.origin.x = f_ORIGX; } newTextView = [[TextView alloc] initFrame:&fRect]; [[newTextView window] setDelegate:self]; window_number = window_number + 1; sprintf(data, " Function Data %d",window_number); [[newTextView window] setTitle:data]; // [[newTextView window] setTitle:"FUNCTION"]; theTextView = newTextView; pboardoutput = [Pasteboard new]; /* get the standard selection pasteboard */ types[0] = NXAsciiPboardType; [pboardoutput declareTypes:types num:1 owner:NULL]; sprintf(data, " Function Data Output \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; sprintf(data, " ---------------- \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; data_stream = NXOpenMemory(NULL,0,NX_WRITEONLY); listSolution_Data = NO; listFunction_Data = YES; [self listFunction_SolutionLoad:self]; // ask the text object to do a paste operation if(!listFunction_Data){ [[newTextView window] close]; return self; } listFunction_Data = NO; NXGetMemoryBuffer(data_stream, &s_data, &length, &max_length); [pboardoutput declareTypes:&NXAsciiPboardType num:1 owner:self]; [pboardoutput writeType:NXAsciiPboardType data:s_data length:length]; NXCloseMemory(data_stream, NX_TRUNCATEBUFFER); [[theTextView provideTextObject] paste:self]; return self; } #define s_ORIGX 100.0 #define s_ORIGY 100.0 static NXRect sRect = {{s_ORIGX, s_ORIGY},{1000.0,600.0}}; - listSolutionData:sender { char data[64]; const char *types[1]; int length, max_length; char *s_data; static int window_number = 0; id newTextView; NXOffsetRect(&sRect, 20.0, -20.0); if (sRect.origin.y < 0) { sRect.origin.y = s_ORIGY; sRect.origin.x = s_ORIGX; } newTextView = [[TextView alloc] initFrame:&sRect]; [[newTextView window] setDelegate:self]; window_number = window_number + 1; sprintf(data, " Solution Data %d",window_number); [[newTextView window] setTitle:data]; // [[newTextView window] setTitle:"SOLUTION"]; theTextView = newTextView; pboardoutput = [Pasteboard new]; /* get the standard selection pasteboard */ types[0] = NXAsciiPboardType; [pboardoutput declareTypes:types num:1 owner:NULL]; sprintf(data, " Solution Data Output \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; sprintf(data, " ---------------- \n"); [pboardoutput writeType:types[0] data:data length:strlen(data)+1]; [[theTextView provideTextObject] paste:self]; data_stream = NXOpenMemory(NULL,0,NX_WRITEONLY); listFunction_Data = NO; listSolution_Data = YES; [self listFunction_SolutionLoad:self]; // ask the text object to do a paste operation if(!listSolution_Data){ [[newTextView window] close]; return self; } listSolution_Data = NO; NXGetMemoryBuffer(data_stream, &s_data, &length, &max_length); [pboardoutput declareTypes:&NXAsciiPboardType num:1 owner:self]; [pboardoutput writeType:NXAsciiPboardType data:s_data length:length]; NXCloseMemory(data_stream, NX_TRUNCATEBUFFER); [[theTextView provideTextObject] paste:self]; return self; } - listGridLoad:sender { int j, k, l, i, ii; int jmax = gridhunk.jmax; int kmax = gridhunk.kmax; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int planeChoice = [chooseGridPlane selectedRow]; BOOL b_2D = [self do2D3D]; int total_points = 100, errorAlert = 0; /* failsafe for 2d/3d */ if(b_2D){ if(planeChoice != 2){ NXBeep(); beepError = 12; planeChoice = 2; [chooseGridPlane selectCellAt:planeChoice:0]; } } /* shift indices down 1 */ j_0 = [jGridMin intValueAt:0] - 1; j_i = [jGridInc intValueAt:0]; j_m = [jGridMax intValueAt:0] - 1; k_0 = [kGridMin intValueAt:0] - 1; k_i = [kGridInc intValueAt:0]; k_m = [kGridMax intValueAt:0] - 1; l_0 = [lGridMin intValueAt:0] - 1; l_i = [lGridInc intValueAt:0]; l_m = [lGridMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > gridhunk.jmax){ NXBeep(); beepError = 20; j_i = 1; [jGridInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > gridhunk.jmax-1){ NXBeep(); beepError = 20; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > gridhunk.jmax-1){ NXBeep(); beepError = 20; j_m = gridhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 20; j_0 = 0; [jGridMin setIntValue:j_0+1 at:0]; j_m = gridhunk.jmax-1; [jGridMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > gridhunk.kmax){ NXBeep(); beepError = 20; k_i = 1; [kGridInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > gridhunk.kmax-1){ NXBeep(); beepError = 20; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > gridhunk.kmax-1){ NXBeep(); beepError = 20; k_m = gridhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 20; k_0 = 0; [kGridMin setIntValue:k_0+1 at:0]; k_m = gridhunk.kmax-1; [kGridMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > gridhunk.lmax){ NXBeep(); beepError = 20; l_i = 1; [lGridInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > gridhunk.lmax-1){ NXBeep(); beepError = 20; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > gridhunk.lmax-1){ NXBeep(); beepError = 20; l_m = gridhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 20; l_0 = 0; [lGridMin setIntValue:l_0+1 at:0]; l_m = gridhunk.lmax-1; [lGridMax setIntValue:l_m+1 at:0]; } total_points = ((j_m-j_0 + 1)/j_i)*((k_m-k_0 + 1)/k_i)*((l_m-l_0 + 1)/l_i); if(total_points > 100){ NXBeep(); beepError = 28; /* audible alert */ errorAlert = NXRunAlertPanel("The Number of Lines > 100", "Number of Lines Of Data Exceeds 100 : You Can \n Abort or Proceed (with possibly a Long Wait)", "Continue?","ABORT?",NULL); if(errorAlert == NX_ALERTALTERNATE){ listGrid_Data = NO; return self;} } if(total_points == 0){ NXBeep(); beepError = 28; /* audible alert */ errorAlert = NXRunAlertPanel("The Number of Lines = 0", "Make Sure Grid Is Available: You Can \n Abort or Proceed (with possibly a Long Wait)", "Continue?","ABORT?",NULL); if(errorAlert == NX_ALERTALTERNATE){ listGrid_Data = NO; return self;} } if(b_2D){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l x y \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f %16.10f \n", j+1,k+1,l+1,gridhunk.x[i],gridhunk.y[i]); ii = ii+1; } } } } if(!b_2D){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0)NXPrintf (data_stream, "\n j k l x y z\n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f %16.10f %16.10f\n", j+1,k+1,l+1,gridhunk.x[i],gridhunk.y[i],gridhunk.z[i]); ii = ii+1; } } } } return self; } - listFunction_SolutionLoad:sender { int j, k, l, i, ii, n; int jmax = solnhunk.jmax; int kmax = solnhunk.kmax; int j_0,j_i,j_m,k_0,k_i,k_m,l_0,l_i,l_m; int planeChoice = [chooseFunctionPlane selectedRow]; int functionChoice = [functionMatrix selectedRow]; BOOL b_2D = [self do2D3D]; BOOL aero = [self doAeroDynamics]; float gamma = 1.4; int numberofpoints; int total_points = 100, errorAlert = 0; numberofpoints = solnhunk.jmax*solnhunk.kmax*solnhunk.lmax; /* failsafes for 2d/3d multiple vrs single functions*/ if(!aero && functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(aero){ if((number_Of_Functions_Read_In != 4 && b_2D) || (number_Of_Functions_Read_In != 5 && !b_2D)){ if(functionChoice+1 > number_Of_Functions_Read_In ){ NXBeep(); beepError = 13; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } } } if(b_2D){ if((functionChoice == 3 || functionChoice == 10 ) && (aero && number_Of_Functions_Read_In == 4)){ NXBeep(); beepError = 14; /* audible alert */ functionChoice = 0; [functionMatrix selectCellAt:functionChoice:0]; } if(planeChoice != 2){ NXBeep(); beepError = 16; planeChoice = 2; [chooseFunctionPlane selectCellAt:planeChoice:0]; } } /* shift indices down 1 */ j_0 = [jFunctionMin intValueAt:0] - 1; j_i = [jFunctionInc intValueAt:0]; j_m = [jFunctionMax intValueAt:0] - 1; k_0 = [kFunctionMin intValueAt:0] - 1; k_i = [kFunctionInc intValueAt:0]; k_m = [kFunctionMax intValueAt:0] - 1; l_0 = [lFunctionMin intValueAt:0] - 1; l_i = [lFunctionInc intValueAt:0]; l_m = [lFunctionMax intValueAt:0] - 1; /* failsafe, j or k can never be <=0 || >= max*/ if(j_i <= 0 || j_i > solnhunk.jmax){ NXBeep(); beepError = 21; j_i = 1; [jFunctionInc setIntValue:j_i at:0]; } if(j_0 < 0 || j_0 > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; } if(j_m < 0 || j_m > solnhunk.jmax-1){ NXBeep(); beepError = 21; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(j_m < j_0 && planeChoice != 0){ NXBeep(); beepError = 21; j_0 = 0; [jFunctionMin setIntValue:j_0+1 at:0]; j_m = solnhunk.jmax-1; [jFunctionMax setIntValue:j_m+1 at:0]; } if(k_i <= 0 || k_i > solnhunk.kmax){ NXBeep(); beepError = 21; k_i = 1; [kFunctionInc setIntValue:k_i at:0]; } if(k_0 < 0 || k_0 > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; } if(k_m < 0 || k_m > solnhunk.kmax-1){ NXBeep(); beepError = 21; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(k_m < k_0 && planeChoice != 1){ NXBeep(); beepError = 21; k_0 = 0; [kFunctionMin setIntValue:k_0+1 at:0]; k_m = solnhunk.kmax-1; [kFunctionMax setIntValue:k_m+1 at:0]; } if(l_i <= 0 || l_i > solnhunk.lmax){ NXBeep(); beepError = 21; l_i = 1; [lFunctionInc setIntValue:l_i at:0]; } if(l_0 < 0 || l_0 > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; } if(l_m < 0 || l_m > solnhunk.lmax-1){ NXBeep(); beepError = 21; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } if(l_m < l_0 && planeChoice != 2){ NXBeep(); beepError = 21; l_0 = 0; [lFunctionMin setIntValue:l_0+1 at:0]; l_m = solnhunk.lmax-1; [lFunctionMax setIntValue:l_m+1 at:0]; } total_points = ((j_m-j_0 + 1)/j_i)*((k_m-k_0 + 1)/k_i)*((l_m-l_0 + 1)/l_i); if(total_points > 100){ NXBeep(); beepError = 28; /* audible alert */ errorAlert = NXRunAlertPanel("The Number of Lines > 100", "Number of Lines Of Data Exceeds 100 : You Can \n Abort or Proceed (with possibly a Long Wait)", "Continue?","ABORT?",NULL); if(errorAlert == NX_ALERTALTERNATE) { listFunction_Data = NO; listSolution_Data = NO; return self;} } if(total_points == 0){ NXBeep(); beepError = 28; /* audible alert */ errorAlert = NXRunAlertPanel("The Number of Lines = 0", "Make Sure Data Is Available : You Can \n Abort or Proceed (with possibly a Long Wait)", "Continue?","ABORT?",NULL); if(errorAlert == NX_ALERTALTERNATE) { listFunction_Data = NO; listSolution_Data = NO; return self;} } if(listFunction_Data){ if(aero){ switch(functionChoice){ case 0: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Density \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i]); ii = ii+1; } } } break; case 1: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l U Momentum \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i+numberofpoints]); ii = ii+1; } } } break; case 2: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l V Momentum \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i+2*numberofpoints]); ii = ii+1; } } } break; case 3: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l W Momentum \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i+3*numberofpoints]); ii = ii+1; } } } break; case 4: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Energy \n"); i = l*jmax*kmax + k*jmax + j; if(!b_2D)NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i+4*numberofpoints]); if(b_2D)NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.functions[i+3*numberofpoints]); ii = ii+1; } } } break; case 5: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Mach Number \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.mach_number[i]); ii = ii+1; } } } break; case 6: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Pressure \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1,solnhunk.pressure[i]); ii = ii+1; } } } break; case 7: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Cp \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1, 2.0/(gamma*solnhunk.fsmach*solnhunk.fsmach) * (solnhunk.pressure[i]*gamma - 1.)); ii = ii+1; } } } break; case 8: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l U Velocity \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1, solnhunk.functions[i+numberofpoints]/ solnhunk.functions[i]); ii = ii+1; } } } break; case 9: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l V Velocity \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1, solnhunk.functions[i+2*numberofpoints] /solnhunk.functions[i]); ii = ii+1; } } } break; case 10: ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l W Velocity \n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1, solnhunk.functions[i+3*numberofpoints]/ solnhunk.functions[i]); ii = ii+1; } } } break; } } if(!aero){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0) NXPrintf(data_stream, "\n j k l Function %d \n", functionChoice+1); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f \n", j+1,k+1,l+1, solnhunk.functions[i+functionChoice*numberofpoints]); ii = ii+1; } } } } } if(listSolution_Data && b_2D && aero){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0)NXPrintf(data_stream, "\n j k l Q1 Q2 Q3 Q4\n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f %16.10f %16.10f %16.10f\n", j+1,k+1,l+1, solnhunk.functions[i], solnhunk.functions[i+numberofpoints], solnhunk.functions[i+numberofpoints*2], solnhunk.functions[i+numberofpoints*3]); ii = ii+1; } } } } if(listSolution_Data && !b_2D && aero){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0)NXPrintf(data_stream, "\n j k l Q1 Q2 Q3 Q4 Q5\n"); i = l*jmax*kmax + k*jmax + j; NXPrintf(data_stream, "%4d %4d %4d %16.10f %16.10f %16.10f %16.10f %16.10f\n", j+1,k+1,l+1, solnhunk.functions[i], solnhunk.functions[i+numberofpoints], solnhunk.functions[i+numberofpoints*2], solnhunk.functions[i+numberofpoints*3], solnhunk.functions[i+numberofpoints*4]); ii = ii+1; } } } } if(listSolution_Data && !aero){ ii = 0; for (l = l_0; l <= l_m; l= l + l_i){ for (k = k_0; k <= k_m; k= k + k_i){ for (j = j_0; j <= j_m; j = j + j_i){ if(ii%100==0)NXPrintf(data_stream, "\n n j k l \n"); i = l*jmax*kmax + k*jmax + j; for(n = 0; n < number_Of_Functions_Read_In; n = n+1){ NXPrintf(data_stream, "Q %4d %4d %4d %4d %16.10f \n", n+1, j+1,k+1,l+1,solnhunk.functions[i+numberofpoints*n]); } ii = ii+1; } } } } return self; } - setWindowSize:sender { NXRect fullFrame,currentFrame; NXSetRect(&fullFrame, 114.0, 0.0, 930.0, 830.0); [canvasWindow getFrame:¤tFrame]; if(!NXEqualRect(¤tFrame, &fullFrame))[canvasWindow getFrame:&oldFrame]; if([chooseScreenSize state])[canvasWindow placeWindow:&fullFrame]; if(![chooseScreenSize state])[canvasWindow placeWindow:&oldFrame]; [canvasWindow orderFront:self]; [self drawPlotButton:1]; /* display "Plotting" */ [canvas display]; [self drawPlotButton:0]; /* display "Plot" */ return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.