Changes

#195 (Dec 3, 2022, 12:02:07 AM)

  1. Rev update and other dox fixes — galbramc / detail
  2. More VLM error handling updates — galbramc / detail
  3. Update documentation for masstran. Update VLM input error messages. — galbramc / detail
  4. Use the body _name if there is only one body in exodus writer — galbramc / detail
  5. Rev updates to 1.22 — galbramc / detail
  6. README updates — galbramc / detail
  7. Another exodus suppression — galbramc / detail

#194 (Nov 30, 2022, 11:23:26 AM)

  1. Initial commit of 2023 training — galbramc / detail
  2. add comments to cyli_box.csm — jfdannen / detail
  3. unset LD_PRELOAD when checking NETCDFINC — galbramc / detail
  4. Another debug attempt — galbramc / detail
  5. Debugging exodus makefile — galbramc / detail
  6. change sprintf to snprintf in Slugs — jfdannen / detail
  7. Missed one — galbramc / detail
  8. More example updates — galbramc / detail
  9. Replace last sprintf with snprintf — galbramc / detail
  10. fix examples — ryan / detail
  11. fix examples — ryan / detail
  12. Fix double free in astrosAIM — galbramc / detail
  13. Updated config file generator for SU2-7.4.0 — nitin / detail
  14. Warning fix. Double memory free fix. More sprintf replacements. — galbramc / detail
  15. Replace aim sprintf with snprintf — galbramc / detail
  16. scan-build fix — galbramc / detail
  17. Windoze fix — galbramc / detail
  18. masstran now supports analysis sensitvities — galbramc / detail
  19. More example updates for new structures design variable relations — galbramc / detail
  20. Fix for old training — galbramc / detail
  21. Lots of lint fixes — galbramc / detail
  22. Fix array bounds erros and update tests for new structures design variables — galbramc / detail
  23. scan-build fixes — galbramc / detail
  24. Fix legacy example — galbramc / detail
  25. Warning fix — galbramc / detail
  26. Fix previous commits. Add more info in caps_setValue error message. masstranAIM fix. — galbramc / detail
  27. fix of design variables — ryan / detail
  28. fix of design variables — ryan / detail
  29. fix of design variables — ryan / detail
  30. fix of design variables — ryan / detail
  31. add cvxopt debug messages — dongjoon / detail
  32. add more debugging statements — dongjoon / detail
  33. add debugging corsairlite statements
    dongjoon / detail
  34. update corsairlite example for debugging — dongjoon / detail
  35. scan-build fixes — galbramc / detail
  36. Suppress warning — galbramc / detail
  37. Update cyli_box example with semi-colon separated capsGroup tags — galbramc / detail
  38. Add print statements for debugging — dongjoon / detail
  39. add more debugOutput statements to show timing in SLCP — dongjoon / detail
  40. account for forward- and backward-slashes when opening a .udc — jfdannen / detail
  41. update ereped6a and project verification data again; fix recently-added bug that causes a memory fault for some non-manifold Edges — jfdannen / detail
  42. add Trace button in .csm editor to trace all top-level Parameters; reorganize session10 files to make it easier to build large, multi-component, multi-view models; update ereped6a, hollowC6, hollowC7, hollowCA, hollowCB, and project 3 verification data on 7.6.0 (because of issues highlighted by Xcode 14 on M1); update ereped6a and project3 verification data on 7.4.1 (because of issues highlighted by Xcode 14 on M1); add description of -dxdd flag to ESP-help — jfdannen / detail
  43. update testScript.txt; fix possible buffer overflow in SPECIAL command — jfdannen / detail
  44. update verification data for clearance1 and clerance4 to allow for slight differenes due to chaotic behavior of the EGADS tessellator — jfdannen / detail
  45. convert all (deprecated) sprintf calls to snprintf — jfdannen / detail
  46. update Verification.sh to use serveESP — jfdannen / detail
  47. fix bug where result of SPECIAL/clearance was not recycled — jfdannen / detail
  48. update .tsen files for designG5 and designG6 — jfdannen / detail
  49. remove suppressions of sensitivity checks on designH2, designJ1c, designJ1d, and designJ5; add suppressions of sensitivity checks to designG5 and designG6 (for rounded tips); fix valgrind error in sensitivities in udpWaffle — jfdannen / detail
  50. fix some compiler warnings in most recent commit — jfdannen / detail
  51. add ocsmClearance; add clearance* test cases — jfdannen / detail
  52. Update makeEnv for macOS 13 — galbramc / detail
  53. Replace DEBUG sprintf with snprintf — galbramc / detail
  54. Try again: reorder includes! — haimes / detail
  55. Try again: MSVC 2022 seems to have snprintf defined! — haimes / detail
  56. sprintf -> snprintf mods — haimes / detail
  57. Replace sprintf with snprintf in egadsTopo — galbramc / detail
  58. Suppress clang deprication warning of sprintf in OCC — galbramc / detail
  59. Suppresse NETCDF/HDF5 memory leaks — galbramc / detail
  60. Upgrade to SU2 7.4.0 — galbramc / detail
  61. More general ubuntu suppression — galbramc / detail

#193 (Nov 10, 2022, 9:14:12 AM)

  1. Fix skipping geometry Design_Variable in TACS — galbramc / detail
  2. fix bug in serveESP that did not properly update the build status message after File->Edit->Save; implement analytic sensitivities in udpWaffle; add designX* test cases; make sure userPointer gets reset after perturbation is removed — jfdannen / detail
  3. Ubuntu valgrid supression — galbramc / detail
  4. scipy 1.9.2. and 1.9.3 have valgrind issues — galbramc / detail

#192 (Nov 8, 2022, 6:30:12 AM)

  1. More attempts at fixing the exodus makefile — galbramc / detail
  2. Stanalizer fix — galbramc / detail
  3. Finally got netcdf.h check correct on both macOS and Linux — galbramc / detail
  4. Another sanitizer fix — galbramc / detail
  5. sanitizer fixes — galbramc / detail
  6. Check for exodusWriter when running plato examples — galbramc / detail
  7. Write out surface to volume index map for plato — galbramc / detail
  8. Lint fix for mses — galbramc / detail
  9. Fix output redirect for detecing netcdf.h — galbramc / detail
  10. Update fun3d test to Mesh_Morph. Add first plato mesh generation examples. — galbramc / detail
  11. Allow tetgen to write MultiDomain mesh files. Updates to Exodus mesh writer. — galbramc / detail
  12. More checks when reading mapbc files in aimMesh — galbramc / detail
  13. Fun3D lint fixes — galbramc / detail
  14. Add seacas to macys — galbramc / detail
  15. Add SEACAS environment variable for exodus — galbramc / detail

#191 (Nov 5, 2022, 12:02:10 AM)

  1. fix - unused variables — ryan / detail
  2. fix - null catch in avlaim — ryan / detail
  3. fix fun3d morphing — ryan / detail
  4. Lint fixes — galbramc / detail
  5. Warning fix — galbramc / detail
  6. Fix last commit — galbramc / detail
  7. Fix waring and add missing files — galbramc / detail
  8. Support tetgen generated regions — galbramc / detail
  9. More lint fixes — galbramc / detail
  10. Fix lint warnings — galbramc / detail
  11. Update Makefile for plato. Add element group names for aflr3 and tetgen. — galbramc / detail
  12. Add plato skeleton AIM — galbramc / detail
  13. Initial cut at an exodus writer — galbramc / detail
  14. Fix for incorrect Design_Variable in masstranAIM — galbramc / detail
  15. Allow unconverged SmoothUV status to continue during parameterization — haimes / detail
  16. Fix masstran derivatives with multiple bodies — galbramc / detail
  17. Fix closeBound to write bound and vertexset files for journaling — haimes / detail
  18. fix typo in corsairlite slcp — dongjoon / detail
  19. delete redundant kulfan csm and finalize multifidelity scripts — dongjoon / detail
  20. Fix warnings from last commit — galbramc / detail
  21. small fix on Kulfan MSES wrapper and removing remnants of full corsair — dongjoon / detail
  22. Remove some depricated checks — galbramc / detail
  23. Journal the writing of files — haimes / detail
  24. Move up setting outLevel — galbramc / detail
  25. Use ocsmLoadFromModel for static geometry. Expost stepSize for finite differnce in pyCAPS. — galbramc / detail
  26. Add the ability to control the sensitivity finite-difference step size from CAPS proper — haimes / detail
  27. Remove old html doc before copying — galbramc / detail
  28. Update cart3dAIM dox — galbramc / detail
  29. Update pyCAPS dox dependencies — galbramc / detail
  30. update corsairlite files to python3.8 compatible — dongjoon / detail
  31. Use TIM viewer in pyCAPS view methods — galbramc / detail
  32. Allow ftype=None for FieldIn/FieldOut data sets — galbramc / detail
  33. update corsairlite slcp wrapper with speed-up updates — dongjoon / detail
  34. Move DESPMTR check into just TACS — galbramc / detail
  35. Don't write DESPMTR to bdf files — galbramc / detail
  36. Fix segFault from last commit, again — haimes / detail
  37. Fix segFault from last commit — haimes / detail
  38. First cut at using MD5 checksums to check API inputs for continuation mode — haimes / detail
  39. update designV1,gsen for 7.4 — jfdannen / detail
  40. add ocsmAdjoint and testOcsmAdjoint (in serveESP); allow timPlotter to have two y-axes; add plotter3.py test case — jfdannen / detail
  41. update adjoint test to remove (incorrect) compiler warning — jfdannen / detail
  42. remove data/ide (because it is redundant with data/tutorial6); eliminate automatic build when entering CAPS mode (depend on the lazy evaluation in CAPS); enable sensitivity calculations for scribes and trims; add designW* test cases; fix bug that put wrong _edgeID on scribed Edges; update attrScribe, scribeWing, and scribedSphere test cases; create splitEdges.udc; add splitEdges* test cases — jfdannen / detail
  43. remember name of Pyscript file for next Tool->Pyscript; clean up ESP messages after builds; remove code in esp.timSetCaps that removed the _finalize method; fix memory problem in timViewer for very long scene-graph meta-data buffers; reset magic number to zero to catch cases when a MODL is tried to be used after ocsmFree; modify IMPORT so that it properly marks NODE_BODYs; force tessellation if needed in timViewer; fix bug in ocsmLoadFromEgads that did not properly initialize the .ileft and .irite Branches; remove underscore attributes in .egads files in ocsmLoadFromEgads; force python garbage collection at end of each pyscript execution; add interactive testScript — jfdannen / detail
  44. add PLOT_TESSSENS and PLOT_TEMPCOMPS flags to help in debugging tessellation sensitivities; remove tessellation velocity calculation shortcut to make Edge and Face tessellation velocities consistent; refactor signalError() and signalError2(); allow plotTypes =7 for x-component, =8 for y-component, =9 for z-component of sensitivity — jfdannen / detail
  45. clarify description of SELECT x -1 ibody1 — jfdannen / detail
  46. update to account for latest EGADS fix to EG_generalBoolean — jfdannen / detail
  47. add ocsmRegBcstCB to ocsm.def — jfdannen / detail
  48. update Building button to show progress of build in ESP; fix memory leak when ELEVATE command fails (like it often does in the combine.udc); extend SELECT command to SELECT all Faces/Edges/Nodes in current Body that match a Face in another Body; add SELECT NOT to SELECT the Faces/Edges/Nodes not selected and vice versa; fix bug associated with determining if an Edge is a subset of another; update to account for change in EG_isEquivalent; fix bug that did not copy attributes from an Edge in a WireBody that was INTERSECTed with a SolidBody to the new Edge; add PRINT_LAST_EGO compile-time flag to print the last ego after every step in an ocsmBuild; fix bug in sensCSM when trying to remove .csm or .cpc extension from the casename when it did not exist; extend SELECT command to SELECT all Faces/Edges/Nodes in current Body that are within another Body — jfdannen / detail
  49. Add simple figure for tri ordering with mixed quad faces — galbramc / detail
  50. Allow unconverged SmoothUV status to continue during parameterization — haimes / detail
  51. Fix the new isEquivalent for periodic curves split into 2 Edges — haimes / detail
  52. modified Ints to Int32 and added egadslite tests — docampo / detail
  53. recompiled pdf references were with ?? — docampo / detail
  54. removed EL flag from some of the effectiveTopology functions — docampo / detail
  55. fixed typos — docampo / detail
  56. Remove bug that would error out if there were no Faces during generalBoolean operations — haimes / detail
  57. Upgrade cvxopt build for gcc 12 on viggen — galbramc / detail
  58. Suppress scipy memory leak — galbramc / detail

#190 (Oct 1, 2022, 11:50:02 PM)

  1. Fix masstran memory leak — galbramc / detail
  2. masstran AIM updates — galbramc / detail
  3. Another OCSM FD sensitivity update — haimes / detail
  4. The calling sequence (SetDtime) was wrong and should be after setting the parameter when calculating sensitivities — haimes / detail
  5. add some debugging output capabilities to corsairlite and properly pass problemObj in Kulfan.py — dongjoon / detail
  6. Compile fix for Windoze — galbramc / detail
  7. Fix continuation with a function that returned an error — galbramc / detail
  8. Fix memory leak — galbramc / detail
  9. Fix masstran units and warning — galbramc / detail
  10. Update aim_copyValue — galbramc / detail
  11. Add geometric sensitvities to masstran AIM — galbramc / detail
  12. Suppress 'could not create compact unwind on M1' for now. — galbramc / detail
  13. Allow for FD sensitivities within the AIM sensitivity functions — haimes / detail
  14. add torch tests for kulfan corsairlite examples — dongjoon / detail
  15. update problem.__init__ to work if running pyscript but not from capsMode — jfdannen / detail
  16. Simplify multifidelity examples. Fig unit bug in caps.py. Support pint dimensionless to caps.py. Support udunits import in corsairlite. — galbramc / detail
  17. Fix typo in comment — haimes / detail
  18. Fix multifidelity corsairlite examples — dongjoon / detail
  19. Another cart3d twist example fix — galbramc / detail
  20. Cart3D example fixes — galbramc / detail
  21. Support Cart3D preSpec inputs and bodies. — galbramc / detail
  22. Forgot the pickle — galbramc / detail
  23. One more makefile fix — galbramc / detail
  24. corsair lite makefile example fix — galbramc / detail
  25. Dissable failing corsair examples again — galbramc / detail
  26. Fix corsairlite execution script — galbramc / detail
  27. fix DUMP x.sens for degenerate Edges; add combine.udc so that old .csm scripts that used the (now deprecated) COMBINE command still work; add combine* test cases; add makeErep journal entry so that ereped can be tested; modify at-itype, at-nface, and at-nedge if there is an erep; add POWLE and POWTE arguments to udfDroop; add new droop* test cases; add udfNaca6mc to warp the input thickness distribution with the sum of multiple NACA 6-series meanlines; add naca6mc* test cases — jfdannen / detail
  28. protect against string overflows in strncpy and strncat; fix mesgCallbackFromOpenCSM so that it does not try to broadcast text when in batch mode; initial version of udpNaca6mc — jfdannen / detail
  29. Remove dependencies from file copies — haimes / detail
  30. clean up usage of include files; update dependencies in Makefile and NMakefile — jfdannen / detail
  31. remove pyscript from lint in serveESP.make — jfdannen / detail
  32. update serveCSM.make to fix stanilizer error for pyscript — jfdannen / detail
  33. another attempt to move building of pyscript from Makefile to serveESP.make — jfdannen / detail
  34. move building of pyscript from Makefile to serveESP.make — jfdannen / detail
  35. fix recently added bug in ereped that only allowed 9 colors; remove timHold from viewBodys.py; add batch flag to ESP structure; add assert command in browserToServer; add method of verifying ereped and plugs if running from journal and in -batch mode; next versions of udfDroop2 and udfDroop3; migrate testing in Makefile.DARWIN64 and Makefile.LINUX64 from serveCSM to serveESP; fix bug in esp.SetCaps() in pyESP — jfdannen / detail
  36. next version of udfDroop2; first version of udfDroop3 — jfdannen / detail
  37. next (still incomplete) version of udfDroop2 — jfdannen / detail
  38. initial version of udfDroop2 — jfdannen / detail
  39. Update isEquivalent to fix previous problem — haimes / detail
  40. Allow for senses to be flipped when applying EG_isEquivalent — haimes / detail
  41. added the ego. wrap to the getfield operation — docampo / detail
  42. update udpTire for new include scheme — jfdannen / detail
  43. Fix Edge mapping problem introduced since Rev 1.21 — haimes / detail
  44. changed .obj -> .ego — docampo / detail
  45. Add TOML to egadslite dep — galbramc / detail
  46. compiling for Julia 1.6 and 1.8. test fails for 1.8 — docampo / detail
  47. Update makeEnv to reflect newer MAC OS revs — haimes / detail
  48. Add the Julia interface to the EGADS API documentation — haimes / detail
  49. Try to fix stanalyzer errors again — haimes / detail
  50. Fix jlEGADS makefiles — galbramc / detail
  51. Try to fix stanalyzer errors — haimes / detail
  52. Suppress gcc-12 warning — galbramc / detail
  53. Effective Topology: apply last change only for EFaces with more than 1 Face — haimes / detail
  54. Effective Topology: check result of getEdgeUV against invEval and pick the closer — haimes / detail
  55. Another python valgrind suppression — galbramc / detail
  56. Add Ubuntu 22.04 valgrind suppressions — galbramc / detail
  57. Use system valgrind — galbramc / detail
  58. Small cleanup of email template — galbramc / detail
  59. Remove torch for now — galbramc / detail
  60. Log parser fixes — galbramc / detail
  61. Suppress torch memory leaks — galbramc / detail
  62. Upgrade sanitizer path to 14.0.0 — galbramc / detail
  63. Try dissabling CUDA for pytorch — galbramc / detail
  64. Look for fatal msvc errors — galbramc / detail
  65. Look for fatal gnu/clang errors — galbramc / detail
  66. Revert to serveCSM for plugs — galbramc / detail
  67. Update lingering serveCSM to serveESP — galbramc / detail
  68. Very strange... — galbramc / detail
  69. Allow multiple csm patterns — galbramc / detail
  70. Only check error handling when running all csm files — galbramc / detail
  71. Support changing outLevel and running select files — galbramc / detail
  72. Don't do jlEGADS testing just yet — galbramc / detail
  73. Revert ESP_venv for ESP_Beta — galbramc / detail
  74. Move virtualenv into ESP directory — galbramc / detail
  75. Only run minimal CAPS examples in beta — galbramc / detail
  76. Install torch for beta — galbramc / detail

#188 (Sep 6, 2022, 7:56:59 AM)

  1. Fix uninitialized journaling — galbramc / detail
  2. Run all phasing examples for corsairlite — galbramc / detail
  3. corsair fix for Python 3.10. Minor pyCAPS warning fix. — galbramc / detail
  4. Fix scan-build warning — galbramc / detail
  5. Fix for aim_relPath. Fix for sheet bodies with aim_storeMeshRef. — galbramc / detail
  6. fix test_pyOCSM to account for updated MESSAGE statement — jfdannen / detail
  7. extend MESSAGE to optionally write to a file; modify message test case; update ESP-help and ESP_QuickReference — jfdannen / detail
  8. fix memory leak when a UDF returns an error; remove extra prints when udfFlend or udfOffset detect an error; update sanitize targets in Makefile.LINUX — jfdannen / detail
  9. allow OFFSET to function properly when the number of Edges in the offset is fewer than the original Body; fix escape-close-parenthesis in ESP_QuickReference; add ability to create periodic SPLINE in sketcher by using SSLOPE(0); add sslope6* test cases — jfdannen / detail
  10. pip install torch for corsair — galbramc / detail
  11. Smartsr error log parse — galbramc / detail

#187 (Sep 3, 2022, 12:02:09 AM)

  1. fix morph example — ryan / detail
  2. Fix last commit — galbramc / detail
  3. Fix pyCAPS getValue for string and pointers — galbramc / detail
  4. Fix destroy_aimStorage to resolve segfault — galbramc / detail
  5. lint fixes — galbramc / detail
  6. I think we have mighty morphing powers — galbramc / detail
  7. test/fix morph — ryan / detail
  8. Skip wake with morphing for now. — galbramc / detail
  9. Fixes for mighty morphing powers, still needs some more testing. — galbramc / detail
  10. fix missing file — ryan / detail
  11. fix missing file — ryan / detail
  12. // This software has been cleared for public release on 05 Nov 2020, case number 88ABW-2020-3462.

    #include <string.h>
    #include <stdio.h>
    #include <errno.h>
    #include <ctype.h>

    #include "egads.h"        // Bring in egads utilss
    #include "capsTypes.h"    // Bring in CAPS types
    #include "aimUtil.h"      // Bring in AIM utils
    #include "aimMesh.h"      // Bring in AIM meshing

    #include "miscUtils.h"    // Bring in misc. utility functions
    #include "meshUtils.h"    // Bring in meshing utility functions
    #include "cfdTypes.h"     // Bring in cfd specific types
    #include "cfdUtils.h"
    #include "tecplotUtils.h" // Bring in tecplot utility functions
    #include "fun3dUtils.h"   // Bring in fun3d utility header
    #include "fun3dInputs.h"
    #include "ugridWriter.h"


    #ifdef WIN32
    #define strcasecmp  stricmp
    #define strncasecmp _strnicmp
    #endif


    // Extract the FEPOINT Tecoplot data from a FUN3D Aero-Loads file (connectivity is ignored) - dataMatrix = [numVariable][numDataPoint]
    int fun3d_readAeroLoad(void *aimInfo, char *filename, int *numVariable, char **variableName[],
                           int *numDataPoint, double ***dataMatrix)
    {

        int status = CAPS_SUCCESS; // Function return
        int i, j; // Indexing

        size_t linecap = 0;

        char *line = NULL; // Temporary line holder
        char *tempStr = NULL, *tempStr2 = NULL; // Temporary strings
        int stringLen = 0; // Length of string holder

        FILE *fp = NULL; // File pointer

        // Open file
        fp = aim_fopen(aimInfo, filename, "r");
        if (fp == NULL) {
            AIM_ERROR(aimInfo, "Unable to open file: %s\n", filename);
            return CAPS_IOERR;
        }

        printf("Reading FUN3D AeroLoad File - %s!!!!!!\n", filename);

        *numVariable = 0;
        *numDataPoint = 0;
        // Loop through file line by line until we have determined how many variables and data points there are
        while (*numVariable == 0 || *numDataPoint == 0) {

            // Get line from file
            status = getline(&line, &linecap, fp);
            if ((status < 0) || (line == NULL)) break;

            // Get variable list if available in file line
            if (strncmp("variables=", line, strlen("variables=")) == 0) {

                // Pull out substring at first occurrence of "
                tempStr = strstr(line, "\"");

                // Create a temperory string of the variables in a the folling format - ["a","ae"]
                stringLen  = strlen(tempStr)-1 + 2;

                tempStr2 = (char *) EG_alloc((stringLen +1)*sizeof(char *));
                if (tempStr2 == NULL) {
                    fclose(fp);
                    if (line != NULL) EG_free(line);
                    return EGADS_MALLOC;
                }

                tempStr2[0] = '[';
                strncpy(tempStr2+1, tempStr, strlen(tempStr)-1);
                tempStr2[stringLen-1] = ']';
                tempStr2[stringLen] = '\0';

                // Sort string into an array of strings
                status =  string_toStringDynamicArray(tempStr2, numVariable, variableName);

                if (tempStr2 != NULL) EG_free(tempStr2);
                tempStr2 = NULL;

                if (status != CAPS_SUCCESS) goto cleanup;

                // Print out list of variables found in load file
                printf("Variables found in file %s:\n",filename);
                for (i = 0; i < *numVariable; i++) printf("Variable %d = %s\n", i, (*variableName)[i]);
            }

            // Get the number of data points in file if available in file line
            if (strncmp("zone t=", line, strlen("zone t=")) == 0) {

                // Pull out substring at first occurrence of i=
                tempStr = strstr(line, "i=");

                // Retrieve the i= value
                sscanf(&tempStr[2], "%d", numDataPoint);

                // Print out the number of data points found in load file
                printf("Number of data points = %d, in file %s\n", *numDataPoint, filename);
            }

        }

        if (*numVariable != 0 && *numDataPoint != 0) {

            // Allocate dataMatrix array
            AIM_FREE(*dataMatrix);

            AIM_ALLOC(*dataMatrix, (*numVariable), double *, aimInfo, status);
            for (i = 0; i < *numVariable; i++) (*dataMatrix)[i] = NULL;

            for (i = 0; i < *numVariable; i++) {
                AIM_ALLOC((*dataMatrix)[i], (*numDataPoint), double, aimInfo, status);
            }

            // Loop through the file and fill up the data matrix
            for (j = 0; j < *numDataPoint; j++) {
                for (i = 0; i < *numVariable; i++) {
                    fscanf(fp, "%lf", &(*dataMatrix)[i][j]);
                }
            }

            // Output the first row of the dataMatrix
            //for (i = 0; i < *numVariable; i++) printf("Variable %d - %.6f\n", i, (*dataMatrix)[i][0]);

        } else {

            printf("No data values extracted from file - %s",filename);
            status = CAPS_BADVALUE;
        }

    cleanup:
        if (fp != NULL) fclose(fp);

        if (status != CAPS_SUCCESS) {
          if (*dataMatrix != NULL) {
            for (j = 0; j < *numVariable; j++) {
              AIM_FREE((*dataMatrix)[j]);
            }
            AIM_FREE((*dataMatrix));
          }
        }

        EG_free(line);
        return status;
    }


    static int
    fun3d_read2DBinaryUgrid(void *aimInfo, FILE *fp, meshStruct *surfaceMesh)
    {
      int    status = CAPS_SUCCESS;

      int    numNode, numLine, numTriangle, numQuadrilateral;
      int    numTetrahedral, numPyramid, numPrism, numHexahedral;
      int    i, elementIndex, numPoint, bcID;
      double *coords = NULL;

      /* we get a binary UGRID file */
      status = fread(&numNode,          sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numTriangle,      sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numQuadrilateral, sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numTetrahedral,   sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numPyramid,       sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numPrism,         sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
      status = fread(&numHexahedral,    sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

      if ( numTetrahedral   +
           numPyramid       +
           numPrism         +
           numHexahedral  > 0) {
        AIM_ERROR(aimInfo, "Expecting a 2D ugrid file!!!");
        status = CAPS_IOERR;
        goto cleanup;
      }

      /*
      printf("\n Header from UGRID file: %d  %d %d  %d %d %d %d\n", numNode,
             numTriangle, numQuadrilateral, numTetrahedral, numPyramid, numPrism,
             numHexahedral);
       */

      AIM_ALLOC(coords, 3*numNode, double, aimInfo, status);

      /* read all of the vertices */
      status = fread(coords, sizeof(double), 3*numNode, fp);
      if (status != 3*numNode) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

      surfaceMesh->analysisType = UnknownMeshAnalysis;

      // Set that this is a volume mesh
      surfaceMesh->meshType = Surface2DMesh;

      // Numbers
      surfaceMesh->numNode = numNode;
      surfaceMesh->numElement = numTriangle + numQuadrilateral;

      surfaceMesh->meshQuickRef.useStartIndex = (int) true;

      surfaceMesh->meshQuickRef.numTriangle      = numTriangle;
      surfaceMesh->meshQuickRef.numQuadrilateral = numQuadrilateral;

      // Nodes - allocate
      AIM_ALLOC(surfaceMesh->node, surfaceMesh->numNode, meshNodeStruct, aimInfo, status);

      // Initialize
      for (i = 0; i < surfaceMesh->numNode; i++) {
          status = initiate_meshNodeStruct(&surfaceMesh->node[i],
                                            surfaceMesh->analysisType);
          AIM_STATUS(aimInfo, status);
      }

      // Nodes - set
      for (i = 0; i < surfaceMesh->numNode; i++) {

        // Copy node data
        surfaceMesh->node[i].nodeID = i+1;

        surfaceMesh->node[i].xyz[0] = coords[3*i+0];
        surfaceMesh->node[i].xyz[1] = coords[3*i+1];
        surfaceMesh->node[i].xyz[2] = coords[3*i+2];
      }
      AIM_FREE(coords);

      // Elements - allocate
      AIM_ALLOC(surfaceMesh->element, surfaceMesh->numElement, meshElementStruct, aimInfo, status);

      // Initialize
      for (i = 0; i < surfaceMesh->numElement; i++ ) {
          status = initiate_meshElementStruct(&surfaceMesh->element[i],
                                               surfaceMesh->analysisType);
          AIM_STATUS(aimInfo, status);
      }

      // Start of element index
      elementIndex = 0;

      // Elements -Set triangles
      if (numTriangle > 0)
        surfaceMesh->meshQuickRef.startIndexTriangle = elementIndex;

      numPoint = mesh_numMeshConnectivity(Triangle);
      for (i = 0; i < numTriangle; i++) {

          surfaceMesh->element[elementIndex].elementType = Triangle;
          surfaceMesh->element[elementIndex].elementID   = elementIndex+1;

          status = mesh_allocMeshElementConnectivity(&surfaceMesh->element[elementIndex]);
          if (status != CAPS_SUCCESS) goto cleanup;

          // read the element connectivity
          status = fread(surfaceMesh->element[elementIndex].connectivity,
                         sizeof(int), numPoint, fp);
          if (status != numPoint) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

          elementIndex += 1;
      }

      // Elements -Set quadrilateral
      if (numQuadrilateral > 0)
        surfaceMesh->meshQuickRef.startIndexQuadrilateral = elementIndex;

      numPoint = mesh_numMeshConnectivity(Quadrilateral);
      for (i = 0; i < numQuadrilateral; i++) {

          surfaceMesh->element[elementIndex].elementType = Quadrilateral;
          surfaceMesh->element[elementIndex].elementID   = elementIndex+1;

          status = mesh_allocMeshElementConnectivity(&surfaceMesh->element[elementIndex]);
          if (status != CAPS_SUCCESS) goto cleanup;

          // read the element connectivity
          status = fread(surfaceMesh->element[elementIndex].connectivity,
                         sizeof(int), numPoint, fp);
          if (status != numPoint) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

          elementIndex += 1;
      }

      // skip face ID section of the file
      status = fseek(fp, (numTriangle + numQuadrilateral)*sizeof(int), SEEK_CUR);
      if (status != 0) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

      // Get the number of Line elements
      status = fread(&numLine, sizeof(int), 1, fp);
      if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

      // Elements - re-allocate with Line elements
      surfaceMesh->meshQuickRef.numLine = numLine;
      AIM_REALL(surfaceMesh->element, surfaceMesh->numElement+numLine, meshElementStruct, aimInfo, status);

      surfaceMesh->meshQuickRef.startIndexLine = elementIndex;

      // Initialize
      for (i = surfaceMesh->numElement; i < surfaceMesh->numElement+numLine; i++ ) {
          status = initiate_meshElementStruct(&surfaceMesh->element[i],
                                               surfaceMesh->analysisType);
          AIM_STATUS(aimInfo, status);
      }
      surfaceMesh->numElement += numLine;

      numPoint = mesh_numMeshConnectivity(Line);
      for (i = 0; i < numLine; i++) {

        surfaceMesh->element[elementIndex].elementType = Line;
        surfaceMesh->element[elementIndex].elementID   = elementIndex+1;

        status = mesh_allocMeshElementConnectivity(&surfaceMesh->element[elementIndex]);
        AIM_STATUS(aimInfo, status);

        // read the element connectivity
        status = fread(surfaceMesh->element[elementIndex].connectivity,
                       sizeof(int), numPoint, fp);
        if (status != numPoint) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }
        status = fread(&bcID, sizeof(int), 1, fp);
        if (status != 1) { status = CAPS_IOERR; AIM_STATUS(aimInfo, status); }

        surfaceMesh->element[elementIndex].markerID = bcID;

        elementIndex += 1;
      }

      status = CAPS_SUCCESS;

      cleanup:
          if (status != CAPS_SUCCESS)
            printf("Premature exit in getUGRID status = %d\n", status);

          EG_free(coords); coords = NULL;

          return status;
    }


    // Create a 3D BC for FUN3D from a 2D mesh
    int fun3d_2DBC(void *aimInfo,
                   cfdBoundaryConditionStruct *bcProps)
    {
        int status; // Function return status

        int i; // Indexing

        int faceBCIndex = -1, extrusionBCIndex = -1;

        // Find the faceBCIndex for the symmetry plane
        for (i = 0; i < bcProps->numSurfaceProp-1; i++) {
          if (bcProps->surfaceProp[i].surfaceType == Symmetry) {
            faceBCIndex = bcProps->surfaceProp[i].bcID;
            break;
          }
        }

        if (faceBCIndex == -1) {
          // Add plane boundary condition
          AIM_REALL(bcProps->surfaceProp, bcProps->numSurfaceProp+1, cfdSurfaceStruct, aimInfo, status);
          bcProps->numSurfaceProp += 1;

          status = initiate_cfdSurfaceStruct(&bcProps->surfaceProp[bcProps->numSurfaceProp-1]);
          AIM_STATUS(aimInfo, status);

          bcProps->surfaceProp[bcProps->numSurfaceProp-1].surfaceType = Symmetry;
          bcProps->surfaceProp[bcProps->numSurfaceProp-1].symmetryPlane = 1;

          // Find largest index value for bcID and set it plus 1 to the new surfaceProp
          for (i = 0; i < bcProps->numSurfaceProp-1; i++) {
              if (bcProps->surfaceProp[i].bcID >= faceBCIndex) {
                faceBCIndex = bcProps->surfaceProp[i].bcID + 1;
              }
          }
          bcProps->surfaceProp[bcProps->numSurfaceProp-1].bcID = faceBCIndex;
        }


        // Add extruded plane boundary condition
        AIM_REALL(bcProps->surfaceProp, bcProps->numSurfaceProp+1, cfdSurfaceStruct, aimInfo, status);
        bcProps->numSurfaceProp += 1;

        status = initiate_cfdSurfaceStruct(&bcProps->surfaceProp[bcProps->numSurfaceProp-1]);
        AIM_STATUS(aimInfo, status);

        bcProps->surfaceProp[bcProps->numSurfaceProp-1].surfaceType = Symmetry;
        bcProps->surfaceProp[bcProps->numSurfaceProp-1].symmetryPlane = 2;

        // Find largest index value for bcID and set it plus 1 to the new surfaceProp
        for (i = 0; i < bcProps->numSurfaceProp-1; i++) {
            if (bcProps->surfaceProp[i].bcID >= extrusionBCIndex) {
              extrusionBCIndex = bcProps->surfaceProp[i].bcID + 1;
            }
        }
        bcProps->surfaceProp[bcProps->numSurfaceProp-1].bcID = extrusionBCIndex;

        status = CAPS_SUCCESS;

    cleanup:
        return status;
    }


    // Create a 3D mesh for FUN3D from a 2D mesh
    int fun3d_2DMesh(void *aimInfo,
                     aimMeshRef *meshRef,
                     const char *projectName,
                     const mapAttrToIndexStruct *groupMap)
    {

        int status; // Function return status

        int i; // Indexing

        int faceBCIndex = -1, extrusionBCIndex = -1;

        double extrusion = -1.0; // Extrusion length

        // Flip coordinates
        int xMeshConstant = (int) true, yMeshConstant = (int) true, zMeshConstant= (int) true; // 2D mesh checks
        double tempCoord;

        meshStruct surfaceMesh;
        meshStruct volumeMesh;

        char filename[PATH_MAX];
    //    int elementIndex;
        FILE *fp = NULL;

        status = initiate_meshStruct(&surfaceMesh);
        AIM_STATUS(aimInfo, status);

        status = initiate_meshStruct(&volumeMesh);
        AIM_STATUS(aimInfo, status);

        sprintf(filename, "%s%s", meshRef->fileName, MESHEXTENSION);

        fp = fopen(filename, "rb");
        if (fp == NULL) {
          AIM_ERROR(aimInfo, "Cannot open file: %s\n", filename);
          status = CAPS_IOERR;
          goto cleanup;
        }

        status = fun3d_read2DBinaryUgrid(aimInfo, fp, &surfaceMesh);
        AIM_STATUS(aimInfo, status);

        // add boundary elements if they are missing
        if (surfaceMesh.meshQuickRef.numLine == 0) {
            status = mesh_addTess2Dbc(aimInfo, &surfaceMesh, groupMap);
            if (status != CAPS_SUCCESS) goto cleanup;
        }

        // Set the symmetry index for all Tri/Quad
        for (i = 0; i < surfaceMesh.numElement; i++) {

            if (surfaceMesh.element[i].elementType != Triangle &&
                surfaceMesh.element[i].elementType != Quadrilateral) {
                continue;
            }

            surfaceMesh.element[i].markerID = faceBCIndex;
        }

    #ifdef I_DONT_THINK_WE_NEED_THIS
        // Determine a suitable boundary index of the extruded plane
        *extrusionBCIndex = faceBCIndex;
        for (i = 0; i < surfaceMesh.meshQuickRef.numLine; i++) {

            if (surfaceMesh.meshQuickRef.startIndexLine >= 0) {
                elementIndex = surfaceMesh.meshQuickRef.startIndexLine + i;
            } else {
                elementIndex = surfaceMesh.meshQuickRef.listIndexLine[i];
            }

            marker = surfaceMesh.element[elementIndex].markerID;

            if (marker > *extrusionBCIndex)  {
                *extrusionBCIndex = marker;
            }
        }
        *extrusionBCIndex += 1;
    #endif

        // Check to make sure the face is on the y = 0 plane
        for (i = 0; i < surfaceMesh.numNode; i++) {

            if (surfaceMesh.node[i].xyz[1] != 0.0) {
                printf("\nSurface mesh is not on y = 0.0 plane, FUN3D could fail during execution for this 2D mesh!!!\n");
                break;
            }
        }

        // Constant x?
        for (i = 0; i < surfaceMesh.numNode; i++) {
            if ((surfaceMesh.node[i].xyz[0] - surfaceMesh.node[0].xyz[0]) > 1E-7) {
                xMeshConstant = (int) false;
                break;
            }
        }

        // Constant y?
        for (i = 0; i < surfaceMesh.numNode; i++) {
            if ((surfaceMesh.node[i].xyz[1] - surfaceMesh.node[0].xyz[1] ) > 1E-7) {
                yMeshConstant = (int) false;
                break;
            }
        }

        // Constant z?
        for (i = 0; i < surfaceMesh.numNode; i++) {
            if ((surfaceMesh.node[i].xyz[2] - surfaceMesh.node[0].xyz[2]) > 1E-7) {
                zMeshConstant = (int) false;
                break;
            }
        }

        if (yMeshConstant != (int) true) {
            printf("FUN3D expects 2D meshes be in the x-z plane... attempting to rotate mesh!\n");

            if (xMeshConstant == (int) true && zMeshConstant == (int) false) {
                printf("Swapping y and x coordinates!\n");
                for (i = 0; i < surfaceMesh.numNode; i++) {
                    tempCoord = surfaceMesh.node[i].xyz[0];
                    surfaceMesh.node[i].xyz[0] = surfaceMesh.node[i].xyz[1];
                    surfaceMesh.node[i].xyz[1] = tempCoord;
                }

            } else if(xMeshConstant == (int) false && zMeshConstant == (int) true) {

                printf("Swapping y and z coordinates!\n");
                for (i = 0; i < surfaceMesh.numNode; i++) {
                    tempCoord = surfaceMesh.node[i].xyz[2];
                    surfaceMesh.node[i].xyz[2] = surfaceMesh.node[i].xyz[1];
                    surfaceMesh.node[i].xyz[1] = tempCoord;
                }

            } else {
                AIM_ERROR(aimInfo, "Unable to rotate mesh!\n");
                status = CAPS_NOTFOUND;
                goto cleanup;
            }
        }

        status = extrude_SurfaceMesh(extrusion, extrusionBCIndex, &surfaceMesh, &volumeMesh);
        AIM_STATUS(aimInfo, status);

        strcpy(filename, projectName);

        // Write AFLR3
    /*@-nullpass@*/
         status = mesh_writeAFLR3(aimInfo, filename,
                                  0, // write binary file
                                  &volumeMesh,
                                  1.0);
    /*@+nullpass@*/
         AIM_STATUS(aimInfo, status);

        status = CAPS_SUCCESS;

    cleanup:
        if (status != CAPS_SUCCESS) {
            printf("Error: Premature exit in fun3d_2DMesh status = %d\n", status);
        }

    /*@-dependenttrans@*/
        if (fp != NULL) fclose(fp);
    /*@+dependenttrans@*/

        // Destroy meshes
        (void) destroy_meshStruct(&surfaceMesh);
        (void) destroy_meshStruct(&volumeMesh);

        return status;
    }


    // Remove unused nodes from dataMatrix and update connectivity matrix
    static int fun3d_removeUnused(void *aimInfo, int numVariable, int *numNode,  int used[],
                                  double ***data, /*@null@*/ int *numConnect,
                                  /*@null@*/ int *dataConnectMatrix)
    {
        int i, j, k; //Indexing
        int status;

        int *usedNode=NULL; // Freeable

        double **dataMatrix;

        dataMatrix = *data;

        // Copy used node array
        usedNode = (int *) EG_alloc(*numNode*sizeof(int));
        if (usedNode == NULL) {
            status = EGADS_MALLOC;
            goto cleanup;
        }
        for (i = 0; i < *numNode; i++) usedNode[i] = used[i];

        // Remove unused nodes
        j = 0;
        for (i = 0; i< *numNode; i++ ) {
            if (usedNode[i] == (int) false || usedNode[i] < 0) continue;

            usedNode[i] = j+1; // Set i-th node to essentially the node ID,  1-bias

            j +=1;
        }

        j = 0;
        for (i = 0; i< *numNode; i++ ) {
            if (usedNode[i] == (int) false || usedNode[i] < 0) continue;

            for (k = 0; k < numVariable; k++) {
                dataMatrix[k][j] = dataMatrix[k][i]; //Re-order dataMatrix - bubbling i'th index to j
            }

            j += 1;
        }

        *numNode = j; // New number of nodes

        // Redo connectivity
        if (dataConnectMatrix != NULL) {
            AIM_NOTNULL(numConnect, aimInfo, status);
            j = 0;
            for (i = 0; i < *numConnect; i++) {

                if (usedNode[dataConnectMatrix[4*i+ 0]-1] == (int) false) continue;
                if (usedNode[dataConnectMatrix[4*i+ 1]-1] == (int) false) continue;
                if (usedNode[dataConnectMatrix[4*i+ 2]-1] == (int) false) continue;
                if (usedNode[dataConnectMatrix[4*i+ 3]-1] == (int) false) continue;

                for (k = 0; k < 4; k++) {
                   dataConnectMatrix[4*j+ k] = usedNode[dataConnectMatrix[4*i+ k]-1];
                }

                j += 1;
            }

            *numConnect = j; // New number of elements
        }

        status = CAPS_SUCCESS;

    cleanup:
        if (status != CAPS_SUCCESS)
            printf("Error: Premature exit in fun3d_removeUnused status = %d\n",
                   status);

        if (usedNode != NULL) EG_free(usedNode);
        return status;
    }


    // Write FUN3D data transfer files
    int fun3d_dataTransfer(void *aimInfo,
                           const char *projectName,
                           const mapAttrToIndexStruct *groupMap,
                           const cfdBoundaryConditionStruct bcProps,
                           aimMeshRef *meshRef,
                           /*@null@*/ cfdModalAeroelasticStruct *eigenVector)
    {

        /*! \page dataTransferFUN3D FUN3D Data Transfer
         *
         * \section dataToFUN3D Data transfer to FUN3D (FieldIn)
         *
         * <ul>
         *  <li> <B>"Displacement"</B> </li> <br>
         *   Retrieves nodal displacements (as from a structural solver)
         *   and updates FUN3D's surface mesh; a new [project_name]_body1.dat file is written out which may
         *   be loaded into FUN3D to update the surface mesh/move the volume mesh using the FUN3D command line option
         *   -\-read_surface_from_file
         * </ul>
         *
         * <ul>
         *  <li> <B>"EigenVector_#"</B> </li> <br>
         *   Retrieves modal eigen-vectors from a structural solver, where "#" should be replaced by the
         *   corresponding mode number for the eigen-vector (eg. EigenVector_3 would correspond to the third mode,
         *   while EigenVector_6 would be the sixth mode) . A [project_name]_body1_mode#.dat file is written
         *   out for each mode.
         * </ul>
         *
         */

        int status; // Function return status
        int i, j, ibound, ibody, iface, iglobal, eigenIndex; // Indexing

        int stringLength = 0;

        char *filename = NULL;

        // Discrete data transfer variables
        capsDiscr *discr;
        char **boundName = NULL;
        int numBoundName = 0;
        enum capsdMethod dataTransferMethod;
        int numDataTransferPoint;
        int dataTransferRank;
        double *dataTransferData;
        char   *units;

        int state, nGlobal, *globalOffset=NULL, nFace;
        ego body, *faces=NULL;

        int alen, ntri, atype, itri, ielem;
        const double *face_xyz, *face_uv, *reals;
        const int *face_ptype, *face_pindex, *face_tris, *face_tric, *nquad=NULL;
        const char *string, *groupName = NULL;

        // Variables used in global node mapping
        int ptype, pindex;
        double xyz[3];

        // Data transfer Out variables
        const char *dataOutName[] = {"x","y","z", "id", "dx", "dy", "dz"};
        const int dataOutFormat[] = {Double, Double, Double, Integer, Double, Double, Double};

        double **dataOutMatrix = NULL;
        int *dataConnectMatrix = NULL;

        int numOutVariable = 7;
        int numOutDataPoint = 0;
        int numOutDataConnect = 0;

        const char fileExtBody[] = "_body1";
        const char fileExt[] = ".dat";
        const char fileExtMode[] = "_mode";

        int foundDisplacement = (int) false, foundEigenVector = (int) false;

        int marker;

        int numUsedNode = 0, numUsedConnectivity = 0, usedElems;
        int *usedNode = NULL;

        status = aim_getBounds(aimInfo, &numBoundName, &boundName);
        AIM_STATUS(aimInfo, status);

        foundDisplacement = foundEigenVector = (int) false;
        for (ibound = 0; ibound < numBoundName; ibound++) {
          AIM_NOTNULL(boundName, aimInfo, status);

          status = aim_getDiscr(aimInfo, boundName[ibound], &discr);
          if (status != CAPS_SUCCESS) continue;

          status = aim_getDataSet(discr,
                                  "Displacement",
                                  &dataTransferMethod,
                                  &numDataTransferPoint,
                                  &dataTransferRank,
                                  &dataTransferData,
                                  &units);

          if (status == CAPS_SUCCESS) { // If we do have data ready is the rank correct

            foundDisplacement = (int) true;

            if (dataTransferRank != 3) {
              AIM_ERROR(aimInfo, "Displacement transfer data found however rank is %d not 3!!!!\n", dataTransferRank);
              status = CAPS_BADRANK;
              goto cleanup;
            }
            break;
          }

          if (eigenVector != NULL) {
            for (eigenIndex = 0; eigenIndex < eigenVector->numEigenValue; eigenIndex++) {

              status = aim_getDataSet(discr,
                                      eigenVector->eigenValue[eigenIndex].name,
                                      &dataTransferMethod,
                                      &numDataTransferPoint,
                                      &dataTransferRank,
                                      &dataTransferData,
                                      &units);

              if (status == CAPS_SUCCESS) { // If we do have data ready is the rank correct

                foundEigenVector = (int) true;

                if (dataTransferRank != 3) {
                  AIM_ERROR(aimInfo, "EigenVector transfer data found however rank is %d not 3!!!!\n", dataTransferRank);
                  status = CAPS_BADRANK;
                  goto cleanup;
                }
                break;
              }
            } // Loop through EigenValues

            if (foundEigenVector == (int) true) break;

          } // If eigen-vectors provided
        } // Loop through transfer names

        if (foundDisplacement != (int) true && foundEigenVector != (int) true) {
          printf("Info: No recognized data transfer names found.\n");
          status = CAPS_NOTFOUND;
          goto cleanup;
        }

        // Ok looks like we have displacements/EigenVectors to get so lets continue
        printf("Writing FUN3D data transfer files\n");

        // Allocate data arrays that are going to be output
        AIM_ALLOC(dataOutMatrix, numOutVariable, double*, aimInfo, status);
        for (i = 0; i < numOutVariable; i++) dataOutMatrix[i] = NULL;

        AIM_ALLOC(globalOffset, meshRef->nmap+1, int, aimInfo, status);
        numOutDataPoint = 0;
        ielem = 0;
        globalOffset[0] = 0;
        for (i = 0; i < meshRef->nmap; i++) {
          if (meshRef->maps[i].tess == NULL) continue;

          status = EG_statusTessBody(meshRef->maps[i].tess, &body, &state, &nGlobal);
          AIM_STATUS(aimInfo, status);

          // re-allocate data arrays
          for (j = 0; j < numOutVariable; j++) {
            AIM_REALL(dataOutMatrix[j], numOutDataPoint + nGlobal, double, aimInfo, status);
          }
          AIM_REALL(usedNode, numOutDataPoint + nGlobal, int, aimInfo, status);
          for (j = globalOffset[0]; j < numOutDataPoint + nGlobal; j++) usedNode[j] = (int) false;


          for (iglobal = 0; iglobal < nGlobal; iglobal++) {
            status = EG_getGlobal(meshRef->maps[i].tess,
                                  iglobal+1, &ptype, &pindex, xyz);
            AIM_STATUS(aimInfo, status);

            // First just set the Coordinates
            dataOutMatrix[0][globalOffset[i]+iglobal] = xyz[0];
            dataOutMatrix[1][globalOffset[i]+iglobal] = xyz[1];
            dataOutMatrix[2][globalOffset[i]+iglobal] = xyz[2];

            // Volume mesh node ID
            dataOutMatrix[3][globalOffset[i]+iglobal] = meshRef->maps[i].map[iglobal];

            // Delta displacements
            dataOutMatrix[4][i] = 0;
            dataOutMatrix[5][i] = 0;
            dataOutMatrix[6][i] = 0;
          }

          // check if the tessellation has a mixture of quad and tess
          status = EG_attributeRet(meshRef->maps[i].tess, ".mixed",
                                   &atype, &alen, &nquad, &reals, &string);
          if (status != EGADS_SUCCESS &&
              status != EGADS_NOTFOUND) AIM_STATUS(aimInfo, status);

          status = EG_getBodyTopos(body, NULL, FACE, &nFace, &faces);
          AIM_STATUS(aimInfo, status);
          for (iface = 0; iface < nFace; iface++) {
            // get the face tessellation
            status = EG_getTessFace(meshRef->maps[i].tess, iface+1, &alen, &face_xyz, &face_uv,
                                    &face_ptype, &face_pindex, &ntri, &face_tris, &face_tric);
            AIM_STATUS(aimInfo, status);
            AIM_NOTNULL(faces, aimInfo, status);

            status = retrieve_CAPSGroupAttr(faces[iface], &groupName);
            if (status == EGADS_SUCCESS) {
              AIM_NOTNULL(groupName, aimInfo, status);
              status = get_mapAttrToIndexIndex(groupMap, groupName, &marker);
              if (status != CAPS_SUCCESS) {
                AIM_ERROR(aimInfo, "No capsGroup \"%s\" not found in attribute map", groupName);
                goto cleanup;
              }
            } else {
              AIM_ERROR(aimInfo, "No capsGroup on face %d", iface+1);
              print_AllAttr(aimInfo, faces[iface]);
              goto cleanup;
            }

            //  To keep with the moving_bodying input we will assume used nodes are all inviscid and viscous surfaces instead
            //                        usedNode[k] = (int) true;
            usedElems = (int) false;
            for (j = 0; j < bcProps.numSurfaceProp; j++) {
              if (marker != bcProps.surfaceProp[j].bcID) continue;

              if (bcProps.surfaceProp[j].surfaceType == Viscous ||
                  bcProps.surfaceProp[j].surfaceType == Inviscid) {
                  usedElems = (int) true;
              }
              break;
            }

            if (nquad == NULL) { // all triangles

              // re-allocate data arrays
              AIM_REALL(dataConnectMatrix, 4*(numOutDataConnect + ntri), int, aimInfo, status);

              for (itri = 0; itri < ntri; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = globalOffset[i] + iglobal;
                  usedNode[globalOffset[i]+iglobal-1] = usedElems;
                }
                // repeat the last node for triangles
                dataConnectMatrix[4*ielem+3] = dataConnectMatrix[4*ielem+2];
              }

              numOutDataConnect += ntri;

            } else { // mixture of tri and quad elements

              // re-allocate data arrays
              AIM_REALL(dataConnectMatrix, 4*(numOutDataConnect + ntri-nquad[iface]), int, aimInfo, status);

              // process triangles
              for (itri = 0; itri < ntri-2*nquad[iface]; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = globalOffset[i] + iglobal;
                  usedNode[globalOffset[i]+iglobal-1] = usedElems;
                }
                // repeat the last node for triangle
                dataConnectMatrix[4*ielem+3] = dataConnectMatrix[4*ielem+2];
              }
              // process quads
              for (; itri < ntri; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = globalOffset[i] + iglobal;
                  usedNode[globalOffset[i]+iglobal-1] = usedElems;
                }

                // add the last node from the 2nd triangle to make the quad
                itri++;
                status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+2], &iglobal);
                AIM_STATUS(aimInfo, status);
                dataConnectMatrix[4*ielem+3] = globalOffset[i] + iglobal;
                usedNode[globalOffset[i]+iglobal-1] = usedElems;
              }

              numOutDataConnect += ntri-nquad[iface];
            }

          }
          AIM_FREE(faces);

          numOutDataPoint += nGlobal;
          globalOffset[i+1] = globalOffset[i] + nGlobal;
        }

        // Re-loop through transfers - if we are doing displacements
        if (foundDisplacement == (int) true) {

          for (ibound = 0; ibound < numBoundName; ibound++) {
            AIM_NOTNULL(boundName, aimInfo, status);

            status = aim_getDiscr(aimInfo, boundName[ibound], &discr);
            if (status != CAPS_SUCCESS) continue;

            status = aim_getDataSet(discr,
                                    "Displacement",
                                    &dataTransferMethod,
                                    &numDataTransferPoint,
                                    &dataTransferRank,
                                    &dataTransferData,
                                    &units);
            if (status != CAPS_SUCCESS) continue; // If no elements in this object skip to next transfer name

            if (numDataTransferPoint != discr->nPoints &&
                numDataTransferPoint > 1) {
              AIM_ERROR(aimInfo, "Developer error!! %d != %d", numDataTransferPoint, discr->nPoints);
              status = CAPS_MISMATCH;
              goto cleanup;
            }

            for (i = 0; i < discr->nPoints; i++) {

              ibody   = discr->tessGlobal[2*i+0];
              iglobal = discr->tessGlobal[2*i+1];

              status = EG_getGlobal(discr->bodys[ibody-1].tess,
                                    iglobal, &ptype, &pindex, xyz);
              AIM_STATUS(aimInfo, status);

              // Find the disc tessellation in the original list of tessellations
              for (j = 0; j < meshRef->nmap; j++) {
                if (discr->bodys[ibody-1].tess == meshRef->maps[j].tess) {
                  break;
                }
              }
              if (j == meshRef->nmap) {
                AIM_ERROR(aimInfo, "Could not find matching tessellation!");
                status = CAPS_MISMATCH;
                goto cleanup;
              }

              if (numDataTransferPoint == 1) {
                // A single point means this is an initialization phase

                // Apply delta displacements
                dataOutMatrix[0][globalOffset[j]+iglobal-1] += dataTransferData[0];
                dataOutMatrix[1][globalOffset[j]+iglobal-1] += dataTransferData[1];
                dataOutMatrix[2][globalOffset[j]+iglobal-1] += dataTransferData[2];

                // save delta displacements
                dataOutMatrix[4][globalOffset[j]+iglobal-1] = dataTransferData[0];
                dataOutMatrix[5][globalOffset[j]+iglobal-1] = dataTransferData[1];
                dataOutMatrix[6][globalOffset[j]+iglobal-1] = dataTransferData[2];

              } else {
                // Apply delta displacements
                dataOutMatrix[0][globalOffset[j]+iglobal-1] += dataTransferData[3*i+0];
                dataOutMatrix[1][globalOffset[j]+iglobal-1] += dataTransferData[3*i+1];
                dataOutMatrix[2][globalOffset[j]+iglobal-1] += dataTransferData[3*i+2];

                dataOutMatrix[4][globalOffset[j]+iglobal-1] = dataTransferData[3*i+0];
                dataOutMatrix[5][globalOffset[j]+iglobal-1] = dataTransferData[3*i+1];
                dataOutMatrix[6][globalOffset[j]+iglobal-1] = dataTransferData[3*i+2];
              }
            }
          } // End numBoundName loop

          // Remove unused nodes
          numUsedNode = numOutDataPoint;
          numUsedConnectivity = numOutDataConnect;
          AIM_NOTNULL(usedNode, aimInfo, status);
          status = fun3d_removeUnused(aimInfo, numOutVariable, &numUsedNode, usedNode,
                                      &dataOutMatrix, &numUsedConnectivity,
                                      dataConnectMatrix);
          AIM_STATUS(aimInfo, status);

          stringLength = strlen(projectName) + strlen(fileExtBody) + strlen(fileExt) + 1;
          AIM_ALLOC(filename, stringLength+1, char, aimInfo, status);

          strcpy(filename, projectName);
          strcat(filename, fileExtBody);
          strcat(filename, fileExt);
          filename[stringLength] = '\0';

          // Write out displacement in tecplot file
          /*@-nullpass@*/
          status = tecplot_writeFEPOINT(aimInfo, filename,
                                        "FUN3D AeroLoads",
                                        NULL,
                                        numOutVariable,
                                        (char **)dataOutName,
                                        numUsedNode, // numOutDataPoint,
                                        dataOutMatrix,
                                        dataOutFormat,
                                        numUsedConnectivity, //numOutDataConnect, // numConnectivity
                                        dataConnectMatrix, // connectivity matrix
                                        NULL); // Solution time
          /*@+nullpass@*/
          AIM_STATUS(aimInfo, status);
          AIM_FREE(filename);
        } // End if found displacements

        // Re-loop through transfers - if we are doing eigen-vectors
        if ((foundEigenVector == (int) true) && (eigenVector != NULL)) {

          for (eigenIndex = 0; eigenIndex < eigenVector->numEigenValue; eigenIndex++) {

            // Zero out the eigen-vectors each time we are writing out a new one
            for (i = 0; i < numOutDataPoint; i++ ) {

              // Delta eigen-vectors
              dataOutMatrix[4][i] = 0;
              dataOutMatrix[5][i] = 0;
              dataOutMatrix[6][i] = 0;
            }

            for (ibound = 0; ibound < numBoundName; ibound++) {
              AIM_NOTNULL(boundName, aimInfo, status);

              status = aim_getDiscr(aimInfo, boundName[ibound], &discr);
              if (status != CAPS_SUCCESS) continue;

              status = aim_getDataSet(discr,
                                      eigenVector->eigenValue[eigenIndex].name,
                                      &dataTransferMethod,
                                      &numDataTransferPoint,
                                      &dataTransferRank,
                                      &dataTransferData,
                                      &units);
              if (status != CAPS_SUCCESS) continue; // If no elements in this object skip to next transfer name

              if (numDataTransferPoint != discr->nPoints &&
                  numDataTransferPoint > 1) {
                AIM_ERROR(aimInfo, "Developer error!! %d != %d", numDataTransferPoint, discr->nPoints);
                status = CAPS_MISMATCH;
                goto cleanup;
              }

              for (i = 0; i < discr->nPoints; i++) {

                ibody   = discr->tessGlobal[2*i+0];
                iglobal = discr->tessGlobal[2*i+1];

                // Find the disc tessellation in the original list of tessellations
                for (j = 0; j < meshRef->nmap; j++) {
                  if (discr->bodys[ibody-1].tess == meshRef->maps[j].tess) {
                    break;
                  }
                }
                if (j == meshRef->nmap) {
                  AIM_ERROR(aimInfo, "Could not find matching tessellation!");
                  status = CAPS_MISMATCH;
                  goto cleanup;
                }

                if (numDataTransferPoint == 1) {
                  // A single point means this is an initialization phase

                  // save Eigen-vector
                  dataOutMatrix[4][globalOffset[j]+iglobal-1] = dataTransferData[0];
                  dataOutMatrix[5][globalOffset[j]+iglobal-1] = dataTransferData[1];
                  dataOutMatrix[6][globalOffset[j]+iglobal-1] = dataTransferData[2];

                } else {
                  // save Eigen-vector
                  dataOutMatrix[4][globalOffset[j]+iglobal-1] = dataTransferData[3*i+0];
                  dataOutMatrix[5][globalOffset[j]+iglobal-1] = dataTransferData[3*i+1];
                  dataOutMatrix[6][globalOffset[j]+iglobal-1] = dataTransferData[3*i+2];
                }
              }
            } // End dataTransferDiscreteObj loop

            // Remove unused nodes
            numUsedNode = numOutDataPoint;
            AIM_NOTNULL(usedNode, aimInfo, status);

            if (eigenIndex == 0) {
              numUsedConnectivity = numOutDataConnect;
              status = fun3d_removeUnused(aimInfo, numOutVariable, &numUsedNode,
                                          usedNode, &dataOutMatrix,
                                          &numUsedConnectivity, dataConnectMatrix);
              AIM_STATUS(aimInfo, status);
            } else {
              status = fun3d_removeUnused(aimInfo, numOutVariable, &numUsedNode,
                                          usedNode, &dataOutMatrix, NULL, NULL);
              AIM_STATUS(aimInfo, status);
            }

            stringLength = strlen(projectName) +
                           strlen(fileExtBody) +
                           strlen(fileExtMode) +
                           strlen(fileExt) + 5;

            AIM_ALLOC(filename, stringLength+1, char, aimInfo, status);

            sprintf(filename, "%s%s%s%d%s",
                    projectName,
                    fileExtBody,
                    fileExtMode,  // Change modeNumber so it always starts at 1!
                    eigenIndex+1, // eigenVector->eigenValue[eigenIndex].modeNumber,
                    fileExt);

            // Write out eigen-vector in tecplot file
            /*@-nullpass@*/
            status = tecplot_writeFEPOINT(aimInfo,
                                          filename,
                                          "FUN3D Modal",
                                          NULL,
                                          numOutVariable,
                                          (char **)dataOutName,
                                          numUsedNode, //numOutDataPoint,
                                          dataOutMatrix,
                                          dataOutFormat,
                                          numUsedConnectivity, //numOutDataConnect, // numConnectivity
                                          dataConnectMatrix, // connectivity matrix
                                          NULL); // Solution time
            /*@+nullpass@*/
            AIM_STATUS(aimInfo, status);
            AIM_FREE(filename);

          } // End eigenvector names
        } // End if found eigenvectors

        status = CAPS_SUCCESS;

        // Clean-up
    cleanup:

        if (status != CAPS_SUCCESS &&
            status != CAPS_NOTFOUND) printf("Error: Premature exit in fun3d_dataTransfer status = %d\n", status);

        if (dataOutMatrix != NULL) {
          for (i = 0; i < numOutVariable; i++) {
            AIM_FREE(dataOutMatrix[i]);
          }
        }

        AIM_FREE(faces);
        AIM_FREE(dataOutMatrix);
        AIM_FREE(dataConnectMatrix);

        AIM_FREE(filename);
        AIM_FREE(boundName);
        AIM_FREE(usedNode);

        return status;
    }


    // Write FUN3D fun3d.nml file
    int fun3d_writeNML(void *aimInfo, capsValue *aimInputs, cfdBoundaryConditionStruct bcProps)
    {

        int status; // Function return status

        int i; // Indexing

        FILE *fnml = NULL;
        char filename[PATH_MAX];
        char fileExt[] ="fun3d.nml";

        printf("Writing fun3d.nml\n");
        if (aimInputs[Design_Functional-1].nullVal == NotNull ||
            aimInputs[Design_SensFile-1].vals.integer == (int)true) {
    #ifdef WIN32
            snprintf(filename, PATH_MAX, "Flow\\%s", fileExt);
    #else
            snprintf(filename, PATH_MAX, "Flow/%s", fileExt);
    #endif
        } else {
            strcpy(filename, fileExt);
        }

        fnml = aim_fopen(aimInfo, filename, "w");
        if (fnml == NULL) {
            AIM_ERROR(aimInfo, "Unable to open file - %s\n", filename);
            status = CAPS_IOERR;
            goto cleanup;
        }

        // &project
        fprintf(fnml,"&project\n");
        fprintf(fnml," project_rootname = \"%s\"\n",
                aimInputs[Proj_Name-1].vals.string);
        fprintf(fnml,"/\n\n");

        // &raw_grid
        fprintf(fnml,"&raw_grid\n");
        //fprintf(fnml," grid_format = \"%s\"\n",
        //        aimInputs[Mesh_Format-1].vals.string);

    //    if (aimInputs[Mesh_ASCII_Flag-1].vals.integer == (int) true) {
    //        fprintf(fnml," data_format = \"ascii\"\n");
    //    } else fprintf(fnml," data_format = \"stream\"\n");

        fprintf(fnml," grid_format = \"AFLR3\"\n");
        fprintf(fnml," data_format = \"stream\"\n");

        if (aimInputs[Two_Dimensional-1].vals.integer == (int) true) {
            fprintf(fnml," twod_mode = .true.\n");
          //fprintf(fnml," ignore_euler_number = .true.\n");
        }

        fprintf(fnml,"/\n\n");

        // &reference_physical_properties
        fprintf(fnml,"&reference_physical_properties\n");

        if (aimInputs[Mach-1].nullVal != IsNull) {
            fprintf(fnml," mach_number = %f\n", aimInputs[Mach-1].vals.real);
        }

        if (aimInputs[Re-1].nullVal != IsNull) {
            fprintf(fnml," reynolds_number = %f\n", aimInputs[Re-1].vals.real);
        }

        if (aimInputs[Alpha-1].nullVal != IsNull) {
            fprintf(fnml," angle_of_attack = %f\n", aimInputs[Alpha-1].vals.real);
        }

        if (aimInputs[Beta-1].nullVal != IsNull) {
            fprintf(fnml," angle_of_yaw = %f\n", aimInputs[Beta-1].vals.real);
        }

        if (aimInputs[Reference_Temperature-1].nullVal != IsNull) {
                fprintf(fnml," temperature = %f\n", aimInputs[Reference_Temperature-1].vals.real);

                if (aimInputs[Reference_Temperature-1].units != NULL) {
                    fprintf(fnml," temperature_units = \'%s\'\n", aimInputs[Reference_Temperature-1].units);
                }
        }

        fprintf(fnml,"/\n\n");

        // &governing_equations
        fprintf(fnml,"&governing_equations\n");

        if (aimInputs[Viscoux-1].nullVal != IsNull) {
            fprintf(fnml," viscous_terms = \"%s\"\n", aimInputs[Viscoux-1].vals.string);
        }

        if (aimInputs[Equation_Type-1].nullVal != IsNull) {
            fprintf(fnml," eqn_type = \"%s\"\n", aimInputs[Equation_Type-1].vals.string);
        }

        fprintf(fnml,"/\n\n");

        // &nonlinear_solver_parameters
        fprintf(fnml,"&nonlinear_solver_parameters\n");

        if (aimInputs[Time_Accuracy-1].nullVal != IsNull) {
            fprintf(fnml," time_accuracy = \"%s\"\n",
                    aimInputs[Time_Accuracy-1].vals.string);
        }

        if (aimInputs[Time_Step-1].nullVal != IsNull) {
            fprintf(fnml," time_step_nondim = %f\n", aimInputs[Time_Step-1].vals.real);
        }

        if (aimInputs[Num_Subiter-1].nullVal != IsNull) {
            fprintf(fnml," subiterations = %d\n",
                    aimInputs[Num_Subiter-1].vals.integer);
        }

        if (aimInputs[Temporal_Error-1].nullVal != IsNull) {

            fprintf(fnml," temporal_err_control = .true.\n");
            fprintf(fnml," temporal_err_floor = %f\n",
                    aimInputs[Temporal_Error-1].vals.real);

        }

        if (aimInputs[CFL_Schedule-1].nullVal != IsNull) {
            fprintf(fnml," schedule_cfl = %f %f\n",
                    aimInputs[CFL_Schedule-1].vals.reals[0],
                    aimInputs[CFL_Schedule-1].vals.reals[1]);
        }

        if (aimInputs[CFL_Schedule_Iter-1].nullVal != IsNull) {
            fprintf(fnml," schedule_iteration = %d %d\n",
                    aimInputs[CFL_Schedule_Iter-1].vals.integers[0],
                    aimInputs[CFL_Schedule_Iter-1].vals.integers[1]);
        }

        fprintf(fnml,"/\n\n");

        // &code_run_control
        fprintf(fnml,"&code_run_control\n");

        if (aimInputs[Num_Iter-1].nullVal != IsNull) {
            fprintf(fnml," steps = %d\n", aimInputs[Num_Iter-1].vals.integer);
        }

        if (aimInputs[Restart_Read-1].nullVal != IsNull) {
            fprintf(fnml," restart_read = '%s'\n",
                    aimInputs[Restart_Read-1].vals.string);
        }


        fprintf(fnml,"/\n\n");

        //&force_moment_integ_properties
        fprintf(fnml,"&force_moment_integ_properties\n");

        if (aimInputs[Reference_Area-1].nullVal != IsNull) {
            fprintf(fnml," area_reference = %f\n",
                    aimInputs[Reference_Area-1].vals.real);
        }

        if (aimInputs[Moment_Length-1].nullVal != IsNull) {
            fprintf(fnml," x_moment_length = %f\n",
                    aimInputs[Moment_Length-1].vals.reals[0]);

            fprintf(fnml," y_moment_length = %f\n",
                    aimInputs[Moment_Length-1].vals.reals[1]);
        }

        if (aimInputs[Moment_Center-1].nullVal != IsNull) {
            fprintf(fnml," x_moment_center = %f\n",
                    aimInputs[Moment_Center-1].vals.reals[0]);

            fprintf(fnml," y_moment_center = %f\n",
                    aimInputs[Moment_Center-1].vals.reals[1]);

            fprintf(fnml," z_moment_center = %f\n",
                    aimInputs[Moment_Center-1].vals.reals[2]);
        }

        fprintf(fnml,"/\n\n");

        //&boundary_conditions
        fprintf(fnml,"&boundary_conditions\n");

        // Loop through boundary conditions
        for (i = 0; i < bcProps.numSurfaceProp ; i++) {

            // Temperature
            if (bcProps.surfaceProp[i].wallTemperatureFlag == (int) true) {
                fprintf(fnml," wall_temperature(%d) = %f\n",bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].wallTemperature);
                fprintf(fnml," wall_temp_flag(%d) = .true.\n",bcProps.surfaceProp[i].bcID);
            }

            // Total pressure and temperature
            if (bcProps.surfaceProp[i].surfaceType == SubsonicInflow) {

                fprintf(fnml, " total_pressure_ratio(%d) = %f\n", bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].totalPressure);

                fprintf(fnml, " total_temperature_ratio(%d) = %f\n", bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].totalTemperature);
            }

            // Static pressure
            if (bcProps.surfaceProp[i].surfaceType == BackPressure ||
                    bcProps.surfaceProp[i].surfaceType == SubsonicOutflow) {

                fprintf(fnml, " static_pressure_ratio(%d) = %f\n", bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].staticPressure);
            }

            // Mach number
            if (bcProps.surfaceProp[i].surfaceType == MachOutflow ||
                    bcProps.surfaceProp[i].surfaceType == MassflowOut) {

                fprintf(fnml, " mach_bc(%d) = %f\n", bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].machNumber);
            }

            // Massflow
            if (bcProps.surfaceProp[i].surfaceType == MassflowIn ||
                    bcProps.surfaceProp[i].surfaceType == MassflowOut) {

                fprintf(fnml, " massflow(%d) = %f\n", bcProps.surfaceProp[i].bcID,
                        bcProps.surfaceProp[i].massflow);
            }

            // Fixed inflow and outflow
            /*if (bcProps.surfaceProp[i].surfaceType == FixedInflow ||
                bcProps.surfaceProp[i].surfaceType == FixedOutflow) {

                fprintf(fnml, " qset(%d,1) = %f\n", bcProps.surfaceProp[i].bcID,
                                                    bcProps.surfaceProp[i].staticDensity);

                fprintf(fnml, " qset(%d,2) = %f\n", bcProps.surfaceProp[i].bcID,
                                                    bcProps.surfaceProp[i].uVelocity);

                fprintf(fnml, " qset(%d,3) = %f\n", bcProps.surfaceProp[i].bcID,
                                                    bcProps.surfaceProp[i].vVelocity);

                fprintf(fnml, " qset(%d,4) = %f\n", bcProps.surfaceProp[i].bcID,
                                                    bcProps.surfaceProp[i].wVelocity);

                fprintf(fnml, " qset(%d,5) = %f\n", bcProps.surfaceProp[i].bcID,
                                                    bcProps.surfaceProp[i].staticDensity);
            }*/
        }

        fprintf(fnml,"/\n\n");

        // &noninertial_reference_frame
        fprintf(fnml,"&noninertial_reference_frame\n");


        if (aimInputs[NonInertial_Rotation_Rate-1].nullVal   != IsNull ||
            aimInputs[NonInertial_Rotation_Center-1].nullVal != IsNull) {

            fprintf(fnml," noninertial = .true.\n");
        }

        if (aimInputs[NonInertial_Rotation_Center-1].nullVal != IsNull) {
            fprintf(fnml," rotation_center_x = %f\n",
                    aimInputs[NonInertial_Rotation_Center-1].vals.reals[0]);
            fprintf(fnml," rotation_center_y = %f\n",
                    aimInputs[NonInertial_Rotation_Center-1].vals.reals[1]);
            fprintf(fnml," rotation_center_z = %f\n",
                    aimInputs[NonInertial_Rotation_Center-1].vals.reals[2]);
        }

        if (aimInputs[NonInertial_Rotation_Rate-1].nullVal != IsNull) {
            fprintf(fnml," rotation_rate_x = %f\n",
                    aimInputs[NonInertial_Rotation_Rate-1].vals.reals[0]);
            fprintf(fnml," rotation_rate_y = %f\n",
                    aimInputs[NonInertial_Rotation_Rate-1].vals.reals[1]);
            fprintf(fnml," rotation_rate_z = %f\n",
                    aimInputs[NonInertial_Rotation_Rate-1].vals.reals[2]);

        }

        fprintf(fnml,"/\n\n");

        status = CAPS_SUCCESS;

    cleanup:

        if (status != CAPS_SUCCESS)
            printf("Error: Premature exit in fun3d_writeNML status = %d\n", status);

        if (fnml != NULL) fclose(fnml);

        return status;
    }


    // Write FUN3D movingbody.input file
    int fun3d_writeMovingBody(void *aimInfo, double fun3dVersion, cfdBoundaryConditionStruct bcProps,
                              cfdModalAeroelasticStruct *modalAeroelastic)
    {

        int status; // Function return status

        int i, eigenIndex; // Indexing
        int counter = 0;
        FILE *fp = NULL;
        char *filename = NULL;
        char fileExt[] ="moving_body.input";

        int bodyIndex = 1;
        int stringLength;

        printf("Writing moving_body.input");

        stringLength = strlen(fileExt) + 1;

        AIM_ALLOC(filename,stringLength +1, char, aimInfo, status);

        strcpy(filename, fileExt);
        filename[stringLength] = '\0';

        fp = aim_fopen(aimInfo, filename, "w");
        if (fp == NULL) {
            AIM_ERROR(aimInfo, "Unable to open file - %s\n", filename);
            status = CAPS_IOERR;
            goto cleanup;
        }

        // &body_definitions
        fprintf(fp,"&body_definitions\n");

        fprintf(fp," n_moving_bodies = %d\n", bodyIndex);

        counter = 0;
        for (i = 0; i < bcProps.numSurfaceProp; i++) {

            if (bcProps.surfaceProp[i].surfaceType == Viscous ||
                    bcProps.surfaceProp[i].surfaceType == Inviscid) {

                fprintf(fp," defining_bndry(%d,%d) = %d\n", counter+1,
                        bodyIndex,
                        bcProps.surfaceProp[i].bcID);

                counter += 1;
            }
        }

        fprintf(fp," n_defining_bndry(%d) = %d\n", bodyIndex, counter);

        fprintf(fp," motion_driver(%d) = ", bodyIndex);
        if (modalAeroelastic != NULL) {
            fprintf(fp,"\"aeroelastic\"\n");
        }

        fprintf(fp," mesh_movement(%d) = ", bodyIndex);
        if (modalAeroelastic != NULL) {
            fprintf(fp,"\"deform\"\n");
        }

        fprintf(fp,"/\n\n");

        if (modalAeroelastic != NULL) {

            // &aeroelastic_modal_data
            fprintf(fp,"&aeroelastic_modal_data\n");

            fprintf(fp," nmode(%d) = %d\n", bodyIndex, modalAeroelastic->numEigenValue);

            if (fun3dVersion < 13.1) {
                fprintf(fp," uinf(%d) = %f\n", bodyIndex, modalAeroelastic->freestreamVelocity);
                fprintf(fp," qinf(%d) = %f\n", bodyIndex, modalAeroelastic->freestreamDynamicPressure);
                fprintf(fp," grefl(%d) = %f\n", bodyIndex, modalAeroelastic->lengthScaling);
            } else {
                fprintf(fp," uinf = %f\n", modalAeroelastic->freestreamVelocity);
                fprintf(fp," qinf = %f\n", modalAeroelastic->freestreamDynamicPressure);
                fprintf(fp," grefl = %f\n",modalAeroelastic->lengthScaling);
            }

            fprintf(fp, "\n");


            for (i = 0; i < modalAeroelastic->numEigenValue; i++) {

                eigenIndex = i + 1; // Change mode number so that it always starts at 1
                // modalAeroelastic->eigenValue[i].modeNumber

                fprintf(fp, " ! Mode %d of %d (structural mode %d)\n", eigenIndex,
                        modalAeroelastic->numEigenValue,
                        modalAeroelastic->eigenValue[i].modeNumber);

                fprintf(fp," freq(%d,%d) = %f\n", eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].frequency);
                fprintf(fp," damp(%d,%d) = %f\n", eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].damping);

                fprintf(fp," gmass(%d,%d) = %f\n"  , eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].generalMass);
                fprintf(fp," gdisp0(%d,%d) = %f\n" , eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].generalDisplacement);
                fprintf(fp," gvel0(%d,%d) = %f\n"  , eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].generalVelocity);
                fprintf(fp," gforce0(%d,%d) = %f\n", eigenIndex, bodyIndex, modalAeroelastic->eigenValue[i].generalForce);

                fprintf(fp, "\n");
            }
            fprintf(fp,"/\n\n");
        }

        status = CAPS_SUCCESS;

    cleanup:
        if (status != CAPS_SUCCESS)
            printf("Error: Premature exit in fun3d_writeMovingBody status = %d\n",
                   status);

        if (fp != NULL) fclose(fp);

        if (filename != NULL) EG_free(filename);

        return status;
    }


    // Write FUN3D parameterization/sensitivity file
    // Will not calculate shape sensitivities if there are no geometry design variable; will
    // simple check and dump out the body meshes in model.tec files
    int  fun3d_writeParameterization(void *aimInfo,
                                     int numDesignVariable,
                                     cfdDesignVariableStruct designVariable[],
                                     aimMeshRef *meshRef)
    {

        int status; // Function return status

        int i, j, k, m, row, col; // Indexing

        int stringLength = 7;

        // Data transfer Out variables
        char **dataOutName= NULL;

        double ***dataOutMatrix = NULL;
        int *dataOutFormat = NULL;
        int *dataConnectMatrix = NULL;

        int numOutVariable = 4; // x, y, z, id, ... + 3* active GeomIn
        int numOutDataPoint = 0;
        int numOutDataConnect = 0;

        // Variables used in global node mapping
        int ptype, pindex;
        double xyz[3];

        const char *geomInName;
        int numPoint;
        double *dxyz = NULL;

        int index;
        int iface, iglobal;
        int state, nFace;
        ego body, *faces=NULL;

        int alen, ntri, atype, itri, ielem;
        const double *face_xyz, *face_uv, *reals;
        const int *face_ptype, *face_pindex, *face_tris, *face_tric, *nquad=NULL;
        const char *string;

        char message[100];
        char filePre[] = "model.tec.";
        char fileExt[] = ".sd1";
        char *filename = NULL;
        char folder[]  = "Rubberize";
        char zoneTitle[100];

        capsValue *geomInVal;
        int *geomSelect = NULL;

        AIM_ALLOC(geomSelect, numDesignVariable, int, aimInfo, status);

        // Determine number of geometry input variables

        for (i = 0; i < numDesignVariable; i++) {
            geomSelect[i] = (int) false;

            printf("DesignVariable = %s\n", designVariable[i].name);

            index = aim_getIndex(aimInfo, designVariable[i].name, GEOMETRYIN);
            if (index == CAPS_NOTFOUND) continue;
            if (index < CAPS_SUCCESS ) {
              status = index;
              AIM_STATUS(aimInfo, status);
            }

            if(aim_getGeomInType(aimInfo, index) != 0) {
                AIM_ERROR(aimInfo, "GeometryIn value %s is a configuration parameter and not a valid design parameter - can't get sensitivity\n",
                          designVariable[i].name);
                status = CAPS_BADVALUE;
                goto cleanup;
            }


            status = aim_getValue(aimInfo, index, GEOMETRYIN, &geomInVal);
            AIM_STATUS(aimInfo, status);

            numOutVariable += 3*geomInVal->length; // xD1, yD1, zD1, ...

            // Don't compute sensitivities if not needed
            geomSelect[i] = (int) true;
        }

        // No need to write Rubberize files without GeometryIn design variables
        if (numOutVariable == 4) {
            status = CAPS_SUCCESS;
            goto cleanup;
        }

        if (numOutVariable > 99999999) {
            AIM_ERROR(aimInfo, "Array of design variable names will be over-run!");
            status = CAPS_RANGEERR;
            goto cleanup;
        }

        // Allocate our names
        AIM_ALLOC(dataOutName, numOutVariable, char*, aimInfo, status);
        for (i = 0; i < numOutVariable; i++) dataOutName[i] = NULL;

        stringLength = 11;
        j = 1;
        k = 1;
        for (i = 0; i < numOutVariable; i++) {
            AIM_ALLOC(dataOutName[i], stringLength+1, char, aimInfo, status);

            // Set names
            if      (i == 0) sprintf(dataOutName[i], "%s", "x");
            else if (i == 1) sprintf(dataOutName[i], "%s", "y");
            else if (i == 2) sprintf(dataOutName[i], "%s", "z");
            else if (i == 3) sprintf(dataOutName[i], "%s", "id");
            else {

                if      (j == 1) sprintf(dataOutName[i], "%s%d", "xD", k);
                else if (j == 2) sprintf(dataOutName[i], "%s%d", "yD", k);
                else if (j == 3) {
                    sprintf(dataOutName[i], "%s%d", "zD", k);
                    j = 0;
                    k += 1;
                }
                j += 1;
            }
        }

        AIM_ALLOC(dataOutFormat, numOutVariable, int, aimInfo, status);

        // Set data out formatting
        for (i = 0; i < numOutVariable; i++) {
            if (strcasecmp(dataOutName[i], "id") == 0) {
                dataOutFormat[i] = (int) Integer;
            } else {
                dataOutFormat[i] = (int) Double;
            }
        }

        // Allocate data arrays that are going to be output
        AIM_ALLOC(dataOutMatrix, meshRef->nmap, double**, aimInfo, status);
        for (i = 0; i < meshRef->nmap; i++) dataOutMatrix[i] = NULL;

        for (i = 0; i < meshRef->nmap; i++) {
          AIM_ALLOC(dataOutMatrix[i], numOutVariable, double*, aimInfo, status);
          for (j = 0; j < numOutVariable; j++) dataOutMatrix[i][j] = NULL;
        }

        for (i = 0; i < meshRef->nmap; i++) {
          if (meshRef->maps[i].tess == NULL) continue;

          status = EG_statusTessBody(meshRef->maps[i].tess, &body, &state, &numOutDataPoint);
          AIM_STATUS(aimInfo, status);

          // allocate data arrays
          for (j = 0; j < numOutVariable; j++) {
            AIM_ALLOC(dataOutMatrix[i][j], numOutDataPoint, double, aimInfo, status);
          }

          for (iglobal = 0; iglobal < numOutDataPoint; iglobal++) {
            status = EG_getGlobal(meshRef->maps[i].tess,
                                  iglobal+1, &ptype, &pindex, xyz);
            AIM_STATUS(aimInfo, status);

            // First just set the Coordinates
            dataOutMatrix[i][0][iglobal] = xyz[0];
            dataOutMatrix[i][1][iglobal] = xyz[1];
            dataOutMatrix[i][2][iglobal] = xyz[2];

            // Volume mesh node ID
            dataOutMatrix[i][3][iglobal] = meshRef->maps[i].map[iglobal];
          }
        }

        // Loop over the geometry in values and compute sensitivities for all bodies
        m = 4;
        for (j = 0; j < numDesignVariable; j++) {

          if (geomSelect[j] == (int) false) continue;

          geomInName = designVariable[j].name;
          index = aim_getIndex(aimInfo, geomInName, GEOMETRYIN);

          status = aim_getValue(aimInfo, index, GEOMETRYIN, &geomInVal);
          AIM_STATUS(aimInfo, status);

          for (row = 0; row < geomInVal->nrow; row++) {
            for (col = 0; col < geomInVal->ncol; col++) {

              for (i = 0; i < meshRef->nmap; i++) {
                if (meshRef->maps[i].tess == NULL) continue;
                status = aim_tessSensitivity(aimInfo,
                                             geomInName,
                                             row+1, col+1, // row, col
                                             meshRef->maps[i].tess,
                                             &numPoint, &dxyz);
                AIM_STATUS(aimInfo, status, "Sensitivity for: %s\n", geomInName);
                AIM_NOTNULL(dxyz, aimInfo, status);

                for (k = 0; k < numPoint; k++) {
                  dataOutMatrix[i][m+0][k] = dxyz[3*k + 0]; // dx/dGeomIn
                  dataOutMatrix[i][m+1][k] = dxyz[3*k + 1]; // dy/dGeomIn
                  dataOutMatrix[i][m+2][k] = dxyz[3*k + 2]; // dz/dGeomIn
                }
                AIM_FREE(dxyz);
              }
              m += 3;
            }
          }
        }

        // Write sensitivity files for each body tessellation

        for (i = 0; i < meshRef->nmap; i++) {
          if (meshRef->maps[i].tess == NULL) continue;
          status = EG_statusTessBody(meshRef->maps[i].tess, &body, &state, &numOutDataPoint);
          AIM_STATUS(aimInfo, status);

          // check if the tessellation has a mixture of quad and tess
          status = EG_attributeRet(meshRef->maps[i].tess, ".mixed",
                                   &atype, &alen, &nquad, &reals, &string);
          if (status != EGADS_SUCCESS &&
              status != EGADS_NOTFOUND) AIM_STATUS(aimInfo, status);

          status = EG_getBodyTopos(body, NULL, FACE, &nFace, &faces);
          AIM_STATUS(aimInfo, status);

          ielem = 0;
          numOutDataConnect = 0;
          for (iface = 0; iface < nFace; iface++) {
            // get the face tessellation
            status = EG_getTessFace(meshRef->maps[i].tess, iface+1, &alen, &face_xyz, &face_uv,
                                    &face_ptype, &face_pindex, &ntri, &face_tris, &face_tric);
            AIM_STATUS(aimInfo, status);

            if (nquad == NULL) { // all triangles

              // re-allocate data arrays
              AIM_REALL(dataConnectMatrix, 4*(numOutDataConnect + ntri), int, aimInfo, status);

              for (itri = 0; itri < ntri; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = iglobal;
                }
                // repeat the last node for triangles
                dataConnectMatrix[4*ielem+3] = dataConnectMatrix[4*ielem+2];
              }

              numOutDataConnect += ntri;

            } else { // mixture of tri and quad elements

              // re-allocate data arrays
              AIM_REALL(dataConnectMatrix, 4*(numOutDataConnect + ntri-nquad[iface]), int, aimInfo, status);

              // process triangles
              for (itri = 0; itri < ntri-2*nquad[iface]; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = iglobal;
                }
                // repeat the last node for triangle
                dataConnectMatrix[4*ielem+3] = dataConnectMatrix[4*ielem+2];
              }
              // process quads
              for (; itri < ntri; itri++, ielem++) {
                for (j = 0; j < 3; j++) {
                  status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+j], &iglobal);
                  AIM_STATUS(aimInfo, status);
                  dataConnectMatrix[4*ielem+j] = iglobal;
                }

                // add the last node from the 2nd triangle to make the quad
                itri++;
                status = EG_localToGlobal(meshRef->maps[i].tess, iface+1, face_tris[3*itri+2], &iglobal);
                AIM_STATUS(aimInfo, status);
                dataConnectMatrix[4*ielem+3] = iglobal;
              }

              numOutDataConnect += ntri-nquad[iface];
            }

          }
          AIM_FREE(faces);

          sprintf(message,"%s %d,", "sensitivity file for body", i+1);

          stringLength = strlen(folder) + 1 + strlen(filePre) + 7 + strlen(fileExt) + 1 ;

          AIM_REALL(filename, stringLength, char, aimInfo, status);

    #ifdef WIN32
          sprintf(filename, "%s\\%s%d%s", folder, filePre, i+1, fileExt);
    #else
          sprintf(filename, "%s/%s%d%s",  folder, filePre, i+1, fileExt);
    #endif

          sprintf(zoneTitle, "%s_%d", "Body", i+1);
          /*@-nullpass@*/
          status = tecplot_writeFEPOINT(aimInfo,
                                        filename,
                                        message,
                                        zoneTitle,
                                        numOutVariable,
                                        dataOutName,
                                        numOutDataPoint,
                                        dataOutMatrix[i],
                                        dataOutFormat,
                                        numOutDataConnect,
                                        dataConnectMatrix,
                                        NULL);
          /*@+nullpass@*/
          AIM_STATUS(aimInfo, status);
        }

        status = CAPS_SUCCESS;

    cleanup:
        (void) string_freeArray(numOutVariable, &dataOutName);
    #ifdef S_SPLINT_S
        EG_free(dataOutName);
    #endif

        if (dataOutMatrix != NULL) {
            for (i = 0; i < meshRef->nmap; i++) {
              if (dataOutMatrix[i] != NULL) {
                  for (j = 0; j < numOutVariable; j++) {
                      AIM_FREE(dataOutMatrix[i][j]);
                  }
              }
              AIM_FREE(dataOutMatrix[i]);
            }
        }

        AIM_FREE(dataOutMatrix);
        AIM_FREE(dataOutFormat);
        AIM_FREE(dataConnectMatrix);
        AIM_FREE(faces);

        AIM_FREE(dxyz);
        AIM_FREE(filename);
        AIM_FREE(geomSelect);

        return status;
    }


    static int _writeFunctinoalComponent(void *aimInfo, FILE *fp, cfdDesignFunctionalCompStruct *comp)
    {
        int status = CAPS_SUCCESS;

        const char *names[] = {"cl", "cd",                   // Lift, drag coefficients
                               "clp", "cdp",                 // Lift, drag coefficients: pressure contributions
                               "clv", "cdv",                 // Lift, drag coefficients: shear contributions
                               "cmx", "cmy", "cmz",          // x/y/z-axis moment coefficients
                               "cmxp", "cmyp", "cmzp",       // x/y/z-axis moment coefficients: pressure contributions
                               "cmxv", "cmyv", "cmzv",       // x/y/z-axis moment coefficients: shear contributions
                               "cx", "cy", "cz",             // x/y/z-axis force coefficients
                               "cxp", "cyp", "czp",          // x/y/z-axis force coefficients: pressure contributions
                               "cxv", "cyv", "czv",          // x/y/z-axis force coefficients: shear contributions
                               "powerx", "powery", "powerz", // x/y/z-axis power coefficients
                               "clcd",                       // Lift-to-drag ratio
                               "fom"    ,                    // Rotorcraft figure of merit
                               "propeff",                    // Rotorcraft propulsive efficiency
                               "rtr"    ,                    // thrust Rotorcraft thrust function
                               "pstag"  ,                    // RMS of stagnation pressure in cutting plane disk
                               "distort",                    // Engine inflow distortion
                               "boom"   ,                    // targ Near-field p/p∞ pressure target
                               "sboom"  ,                    // Coupled sBOOM ground-based noise metrics
                               "ae"     ,                    // Supersonic equivalent area target distribution
                               "press"  ,                    // box RMS of pressure in user-defined box, also pointwise dp/dt, dρ/dt
                               "cpstar" ,                    // Target pressure distributions
                               "sgen"                        // Entropy generation
                              };

        int i, found = (int)false;
        char *function=NULL, *c=NULL;

        for (i = 0; i < sizeof(names)/sizeof(char*); i++)
            if ( strcasecmp(names[i], comp->name) == 0 ) {
                found = (int)true;
                break;
            }

        if (found == (int) false) {
            AIM_ERROR(aimInfo, "Unknown function: '%s'", comp->name);
            AIM_ADDLINE(aimInfo, "Available functions:");
            for (i = 0; i < sizeof(names)/sizeof(char*); i++)
                AIM_ADDLINE(aimInfo, "'%s'", names[i]);
            status = CAPS_BADVALUE;
            goto cleanup;
        }

        // make the name lower case
        AIM_STRDUP(function, comp->name, aimInfo, status);
        for (c = function; *c != '\0'; ++c) *c = tolower(*c);

        // fprintf(fp, "Components of function   1: boundary id (0=all)/name/value/weight/target/power\n");
        fprintf(fp, " %d %s          %f %f %f %f\n", comp->bcID,
                                                     function,
                                                     0.0,
                                                     comp->weight,
                                                     comp->target,
                                                     comp->power);

        status = CAPS_SUCCESS;

    cleanup:
        AIM_FREE(function);
        return status;
    }


    // Write FUN3D  rubber.data file
    // Will not write shape entries unless explicitly told to check if they are need
    int fun3d_writeRubber(void *aimInfo,
                          cfdDesignStruct design,
                          int checkGeomShape,
                          double fun3dVersion,
                          aimMeshRef *meshRef)
    {
        int status; // Function return status

        int i, j, k, m; // Indexing

        int numBody = 0, numShapeVar = 0;

        char file[] = "rubber.data";
        FILE *fp = NULL;

        printf("Writing %s \n", file);
        if (meshRef == NULL) return CAPS_NULLVALUE;

        // Open file
        fp = aim_fopen(aimInfo, file, "w");
        if (fp == NULL) {
            AIM_ERROR(aimInfo, "Unable to open file: %s\n", file);
            status = CAPS_IOERR;
            goto cleanup;
        }

        numBody = meshRef->nmap;

        if (checkGeomShape == (int) true) {
            // Determine number of geometry input variables
            for (i = 0; i < design.numDesignVariable; i++) {

                if (design.designVariable[i].type != DesignVariableGeometry) continue;

                numShapeVar += design.designVariable[i].var->length; // xD1, yD1, zD1, ...
            }
        }

        // Don't write out body information if there are no geometry design variables
        if (numShapeVar == 0) numBody = 0;


        fprintf(fp, "################################################################################\n");
        fprintf(fp, "########################### Design Variable Information ########################\n");
        fprintf(fp, "################################################################################\n");
        fprintf(fp, "Global design variables (Mach number, AOA, Yaw, Noninertial rates)\n");
        fprintf(fp, "Var Active         Value               Lower Bound            Upper Bound\n");

        for (i = 0; i < design.numDesignVariable; i++) {

            if (strcasecmp(design.designVariable[i].name, "Mach") != 0) continue;

            if (design.designVariable[i].var->length < 1) {
                status = CAPS_RANGEERR;
                goto cleanup;
            }

            fprintf(fp, "Mach    1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[0],
                                                             design.designVariable[i].lowerBound[0],
                                                             design.designVariable[i].upperBound[0]);
            break;
        }

        if (i >= design.numDesignVariable) fprintf(fp, "Mach    0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");

        for (i = 0; i < design.numDesignVariable; i++) {

            if (strcasecmp(design.designVariable[i].name, "Alpha") != 0) continue;

            if (design.designVariable[i].var->length < 1) {
                status = CAPS_RANGEERR;
                goto cleanup;
            }

            fprintf(fp, "AOA     1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[0],
                                                             design.designVariable[i].lowerBound[0],
                                                             design.designVariable[i].upperBound[0]);
            break;
        }

        if (i >= design.numDesignVariable) fprintf(fp, "AOA     0   0.000000000000000E+00  0.000000000000000E+00  0.00000000000000E+00\n");


        if (fun3dVersion > 12.4) {
            // FUN3D version 13.1 - version 12.4 doesn't have these available

            for (i = 0; i < design.numDesignVariable; i++) {

                if (strcasecmp(design.designVariable[i].name, "Beta") != 0) continue;

                if (design.designVariable[i].var->length < 1) {
                    status = CAPS_RANGEERR;
                    goto cleanup;
                }

                fprintf(fp, "Yaw     1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[0],
                                                                 design.designVariable[i].lowerBound[0],
                                                                 design.designVariable[i].upperBound[0]);
                break;
            }

            if (i >= design.numDesignVariable) fprintf(fp, "Yaw     0   0.000000000000000E+00  0.000000000000000E+00  0.00000000000000E+00\n");

            for (i = 0; i < design.numDesignVariable; i++) {

                if (strcasecmp(design.designVariable[i].name, "NonInertial_Rotation_Rate") != 0) continue;

                if (design.designVariable[i].var->length < 3) {
                    status = CAPS_RANGEERR;
                    goto cleanup;
                }

                fprintf(fp, "xrate   1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[0],
                                                                 design.designVariable[i].lowerBound[0],
                                                                 design.designVariable[i].upperBound[0]);
                break;
            }

            if (i >= design.numDesignVariable) fprintf(fp, "xrate   0   0.000000000000000E+00  0.000000000000000E+00  0.00000000000000E+00\n");

            for (i = 0; i < design.numDesignVariable; i++) {

                if (strcasecmp(design.designVariable[i].name, "NonInertial_Rotation_Rate") != 0) continue;

                if (design.designVariable[i].var->length < 3) {
                    status = CAPS_RANGEERR;
                    goto cleanup;
                }

                fprintf(fp, "yrate   1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[1],
                                                                 design.designVariable[i].lowerBound[1],
                                                                 design.designVariable[i].upperBound[1]);
                break;
            }

            if (i >= design.numDesignVariable) fprintf(fp, "yrate   0   0.000000000000000E+00  0.000000000000000E+00  0.00000000000000E+00\n");

            for (i = 0; i < design.numDesignVariable; i++) {

                if (strcasecmp(design.designVariable[i].name, "NonInertial_Rotation_Rate") != 0) continue;

                if (design.designVariable[i].var->length < 3) {
                    status = CAPS_RANGEERR;
                    goto cleanup;
                }

                fprintf(fp, "zrate   1   %.15E  %.15E  %.15E\n", design.designVariable[i].value[2],
                                                                 design.designVariable[i].lowerBound[2],
                                                                 design.designVariable[i].upperBound[2]);
                break;
            }

            if (i >= design.numDesignVariable) fprintf(fp, "zrate   0   0.000000000000000E+00  0.000000000000000E+00  0.00000000000000E+00\n");
        }

        fprintf(fp, "Number of bodies\n");
        fprintf(fp, "%d\n", numBody);
        for (i = 0; i < numBody; i++) {
            fprintf(fp, "Rigid motion design variables for 'Body %d'\n", i+1);
            fprintf(fp, "Var Active         Value               Lower Bound            Upper Bound\n");
            fprintf(fp, "RotRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotOrgx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotOrgy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotOrgz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "RotVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            fprintf(fp, "TrnVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00\n");
            if (fun3dVersion > 12.4) {
                // FUN3D version 13.1 - version 12.4 doesn't have option 5
                fprintf(fp, "Parameterization Scheme (Massoud=1 Bandaids=2 Sculptor=4 User-Defined=5)\n");
                fprintf(fp, "5\n");
            } else {

                fprintf(fp, "Parameterization Scheme (Massoud=1 Bandaids=2 Sculptor=4)\n");
                fprintf(fp, "1\n");
            }

            fprintf(fp, "Number of shape variables for 'Body %d'\n", i+1);
            fprintf(fp, "%d\n", numShapeVar);
            fprintf(fp, "Index Active         Value               Lower Bound            Upper Bound\n");

            m = 1;
            for (j = 0; j < design.numDesignVariable; j++) {

                if (design.designVariable[j].type != DesignVariableGeometry) continue;

                for (k = 0; k < design.designVariable[j].var->length; k++ ) {

                    fprintf(fp, "%d    1   %.15E  %.15E  %.15E\n", m, design.designVariable[j].value[k],
                                                                      design.designVariable[j].lowerBound[k],
                                                                      design.designVariable[j].upperBound[k]);

                    m += 1;
                }
            }
        }

        fprintf(fp, "################################################################################\n");
        fprintf(fp, "############################### Function Information ###########################\n");
        fprintf(fp, "################################################################################\n");
        fprintf(fp, "Number of composite functions for design problem statement\n");
        fprintf(fp, "%d\n", design.numDesignFunctional);

        for (i = 0; i < design.numDesignFunctional; i++) {
            fprintf(fp, "################################################################################\n");
            fprintf(fp, "Cost function (1) or constraint (2)\n");
            fprintf(fp, "1\n");
            fprintf(fp, "If constraint, lower and upper bounds\n");
            fprintf(fp, "0.0 0.0\n");
            fprintf(fp, "Number of components for function   %d\n", i+1);
            fprintf(fp, "%d\n", design.designFunctional[i].numComponent);
            fprintf(fp, "Physical timestep interval where function is defined\n");
            fprintf(fp, "1 1\n");
            fprintf(fp, "Composite function weight, target, and power\n");
            fprintf(fp, "1.0 0.0 1.0\n");
            fprintf(fp, "Components of function   %d: boundary id (0=all)/name/value/weight/target/power\n", i+1);

            for (j = 0; j < design.designFunctional[i].numComponent; j++) {
                //fprintf(fp, "0 clcd          0.000000000000000    1.000   10.00000 2.000\n");
                status = _writeFunctinoalComponent(aimInfo, fp, &design.designFunctional[i].component[j]);
                if (status != CAPS_SUCCESS) goto cleanup;
            }

            fprintf(fp, "Current value of function   %d\n", i+1);
            fprintf(fp, "0.000000000000000\n");
            fprintf(fp, "Current derivatives of function wrt global design variables\n");
            fprintf(fp, "0.000000000000000\n");
            fprintf(fp, "0.000000000000000\n");

            if (fun3dVersion > 12.4) {
                // FUN3D version 13.1 - version 12.4 doesn't have these available
                fprintf(fp, "0.000000000000000\n"); // Yaw
                fprintf(fp, "0.000000000000000\n"); // xrate
                fprintf(fp, "0.000000000000000\n"); // yrate
                fprintf(fp, "0.000000000000000\n"); // zrate
            }

            for (j = 0; j < numBody; j++) {
                fprintf(fp, "Current derivatives of function wrt rigid motion design variables of body %d\n", j+1);
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "0.000000000000000\n");
                fprintf(fp, "Current derivatives of function wrt shape design variables of body %d\n", j+1);

                for (k = 0; k < design.numDesignVariable; k++) {

                    if (design.designVariable[k].type != DesignVariableGeometry) continue;

                    for (m = 0; m < design.designVariable[k].var->length; m++ ) fprintf(fp, "0.000000000000000\n");
                }
            }
        }

        status = CAPS_SUCCESS;

    cleanup:
        if (status != CAPS_SUCCESS)
            printf("Error: Premature exit in fun3d_writeRubber status = %d\n",
                   status);

        if (fp != NULL) fclose(fp);

        return status;

        /* Version 13.1 - template
    ################################################################################
    ########################### Design Variable Information ########################
    ################################################################################
    Global design variables (Mach number, AOA, Yaw, Noninertial rates)
    Var Active         Value               Lower Bound            Upper Bound
    Mach    0   0.800000000000000E+00  0.000000000000000E+00  0.900000000000000E+00
      AOA    1   1.000000000000000E+00  0.000000000000000E+00  5.000000000000000E+00
      Yaw    0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    xrate    0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    yrate    0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    zrate    0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    Number of bodies
    2
    Rigid motion design variables for 'wing'
    Var Active         Value               Lower Bound            Upper Bound
    RotRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    Parameterization Scheme (Massoud=1 Bandaids=2 Sculptor=4 User-Defined=5)
    1
    Number of shape variables for 'wing'
    3
    Index Active         Value               Lower Bound            Upper Bound
    1    1   1.000000000000000E+00  0.000000000000000E+00  2.000000000000000E+00
    2    1   1.000000000000000E+00  0.000000000000000E+00  2.000000000000000E+00
    3    1   1.000000000000000E+00  0.000000000000000E+00  2.000000000000000E+00
    Rigid motion design variables for 'tail'
    Var Active         Value               Lower Bound            Upper Bound
    RotRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotOrgz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    RotVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnRate  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnFreq  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnAmpl  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecx  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecy  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    TrnVecz  0   0.000000000000000E+00  0.000000000000000E+00  0.000000000000000E+00
    Parameterization Scheme (Massoud=1 Bandaids=2 Sculptor=4 User-Defined=5)
    2
    Number of shape variables for 'tail'
    2
    Index Active         Value               Lower Bound            Upper Bound
    1    1   2.000000000000000E+00 -1.000000000000000E+00  5.000000000000000E+00
    2    1   2.000000000000000E+00 -1.000000000000000E+00  5.000000000000000E+00
    ################################################################################
    ############################### Function Information ###########################
    ################################################################################
    Number of composite functions for design problem statement
    2
    ################################################################################
    Cost function (1) or constraint (2)
    1
    If constraint, lower and upper bounds
    0.0 0.0
    Number of components for function   1
    1
    Physical timestep interval where function is defined
    1 1
    Composite function weight, target, and power
    1.0 0.0 1.0
    Components of function   1: boundary id (0=all)/name/value/weight/target/power
    0 cl            0.000000000000000    1.000   10.00000 2.000
    Current value of function   1
    0.000000000000000
    Current derivatives of function wrt global design variables
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt rigid motion design variables of body   1
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt shape design variables of body   1
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt rigid motion design variables of body   2
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt shape design variables of body   2
    0.000000000000000
    0.000000000000000
    ################################################################################
    Cost function (1) or constraint (2)
    2
    If constraint, lower and upper bounds
    -0.03 -0.01
    Number of components for function   2
    1
    Physical timestep interval where function is defined
    1 1
    Composite function weight, target, and power
    1.0 0.0 1.0
    Components of function   2: boundary id (0=all)/name/value/weight/target/power
    0 cmy           0.000000000000000    1.000    0.00000 1.000
    Current value of function   2
    0.000000000000000
    Current derivatives of function wrt global design variables
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt rigid motion design variables of body   1
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt shape design variables of body   1
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt rigid motion design variables of body   2
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    0.000000000000000
    Current derivatives of function wrt shape design variables of body   2
    0.000000000000000
    0.000000000000000
         */
    }

    // Finds a line in rubber.data that matches header
    static int findHeader(const char *header, char **line, size_t *nline, int *iline, FILE *fp)
    {
        int i;
        while (getline(line, nline, fp) != -1) {
            (*iline)++;
            if (nline == 0) continue;
            if ((*line)[0] == '#') continue;
            i = 0;
            while ((*line)[i] == ' ' && (*line)[i] != '\0') i++;
            if (strncasecmp(header, &(*line)[i], strlen(header)) == 0)
              break;
        }
        if (feof(fp)) return CAPS_IOERR;

        return CAPS_SUCCESS;
    }


    // Read objective value and derivatives from FUN3D rubber.data file
    // Will not read shape entries unless explicitly told to check if they are needed
    int fun3d_readRubber(void *aimInfo,
                         cfdDesignStruct design,
                         int checkGeomShape,
                         double fun3dVersion,
                         aimMeshRef *meshRef)
    {
        int status; // Function return status

        int i, j, k, ibody; // Indexing

        int numShapeVar = 0;

        size_t nline;
        int iline=0;
        char *line=NULL;
        char file[] = "rubber.data";
        double dfun_dvar = 0;
        FILE *fp = NULL;

        int numBody;

        // Get AIM bodies
        numBody = meshRef->nmap;

        printf("Reading %s \n", file);

        // Open file
        fp = aim_fopen(aimInfo, file, "r");
        if (fp == NULL) {
            AIM_ERROR(aimInfo, "Unable to open file: %s\n", file);
            status = CAPS_IOERR;
            goto cleanup;
        }

        for (i = 0; i < design.numDesignFunctional; i++) {

            status = findHeader("Current value of function", &line, &nline, &iline, fp);
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);

            // Get the line with the objective value
            status = getline(&line, &nline, fp); iline++;
            if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
            AIM_NOTNULL(line, aimInfo, status);

            status = sscanf(line, "%lf", &design.designFunctional[i].value);
            if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);

            // skip: Current derivatives of function wrt rigid motion design variables of
            status = getline(&line, &nline, fp); iline++;
            if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
            AIM_NOTNULL(line, aimInfo, status);

            // read the dFun/dMach
            status = getline(&line, &nline, fp); iline++;
            if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
            AIM_NOTNULL(line, aimInfo, status);

            for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                if (strcasecmp(design.designFunctional[i].dvar[j].name, "Mach") != 0) continue;

                status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[0]);
                if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                break;
            }

            // read the dFun/dAOA
            status = getline(&line, &nline, fp); iline++;
            if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
            AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
            AIM_NOTNULL(line, aimInfo, status);

            for (j = 0; j < design.numDesignVariable; j++) {

                if (strcasecmp(design.designFunctional[i].dvar[j].name, "Alpha") != 0) continue;

                status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[0]);
                if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                break;
            }

            if (fun3dVersion > 12.4) {
                // FUN3D version 13.1 - version 12.4 doesn't have these available

                // read the dFun/dBeta
                status = getline(&line, &nline, fp); iline++;
                if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                AIM_NOTNULL(line, aimInfo, status);

                for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                    if (strcasecmp(design.designFunctional[i].dvar[j].name, "Beta") != 0) continue;

                    status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[0]);
                    if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                    AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                    break;
                }

                // read the dFun/dNonInertial_Rotation_Rate[0]
                status = getline(&line, &nline, fp); iline++;
                if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                AIM_NOTNULL(line, aimInfo, status);

                for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                    if (strcasecmp(design.designFunctional[i].dvar[j].name, "NonInertial_Rotation_Rate") != 0) continue;

                    status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[0]);
                    if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                    AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                    break;
                }

                // read the dFun/dNonInertial_Rotation_Rate[1]
                status = getline(&line, &nline, fp); iline++;
                if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                AIM_NOTNULL(line, aimInfo, status);

                for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                    if (strcasecmp(design.designFunctional[i].dvar[j].name, "NonInertial_Rotation_Rate") != 0) continue;

                    status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[1]);
                    if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                    AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                    break;
                }

                // read the dFun/dNonInertial_Rotation_Rate[2]
                status = getline(&line, &nline, fp); iline++;
                if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                AIM_NOTNULL(line, aimInfo, status);

                for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                    if (strcasecmp(design.designFunctional[i].dvar[j].name, "NonInertial_Rotation_Rate") != 0) continue;

                    status = sscanf(line, "%lf", &design.designFunctional[i].dvar[j].value[2]);
                    if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                    AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                    break;
                }
            }


            numShapeVar = 0; // Need to re-zero every functional loop

            if (checkGeomShape == (int) true) {
                // zero out previous derivatives
                for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {
                    if (design.designFunctional[i].dvar[j].type != DesignVariableGeometry) continue;
                    numShapeVar++;
                    for (k = 0; k < design.designVariable[j].var->length; k++ ) {
                      design.designFunctional[i].dvar[j].value[k] = 0;
                    }
                }
            }

            // No body information if there are no Geometry derivatives
            if (numShapeVar == 0) numBody = 0;

            for (ibody = 0; ibody < numBody; ibody++) {

              // Rigid motion design variables
              status = findHeader("Current derivatives of", &line, &nline, &iline, fp);
              AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);

              // Skip reading rigid motion design variables for now
             
              // Read shape design variables
              status = findHeader("Current derivatives of", &line, &nline, &iline, fp);
              AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);

              for (j = 0; j < design.designFunctional[i].numDesignVariable; j++) {

                  if (design.designFunctional[i].dvar[j].type != DesignVariableGeometry) continue;

                  for (k = 0; k < design.designVariable[j].var->length; k++ ) {

                      // read the dFun/dDesignVar[k]
                      status = getline(&line, &nline, fp); iline++;
                      if (status == -1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                      AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);
                      AIM_NOTNULL(line, aimInfo, status);

                      status = sscanf(line, "%lf", &dfun_dvar);
                      if (status != 1) status = CAPS_IOERR; else status = CAPS_SUCCESS;
                      AIM_STATUS(aimInfo, status, "rubber.data line %d", iline);

                      // accumulate derivatives across bodies
                      design.designFunctional[i].dvar[j].value[k] += dfun_dvar;
                  }
              }
            }
        }

        status = CAPS_SUCCESS;

    cleanup:

        if (line != NULL) free(line); // Must use free!
        if (fp   != NULL) fclose(fp);

        return status;
    }

    // Make FUN3D directory structure/tree
    int fun3d_makeDirectory(void *aimInfo)
    {
        int status; // Function return status

        char filename[PATH_MAX];

        char flow[] = "Flow";
        char datafile[] = "datafiles";
        char adjoint[] = "Adjoint";
        char rubber[] = "Rubberize";

        printf("Creating FUN3D directory tree\n");

        // Flow
        status = aim_mkDir(aimInfo, flow);
        AIM_STATUS(aimInfo, status);

        // Datafiles
        sprintf(filename, "%s/%s", flow, datafile);
        status = aim_mkDir(aimInfo, filename);
        AIM_STATUS(aimInfo, status);

        // Adjoint
        status = aim_mkDir(aimInfo, adjoint);
        AIM_STATUS(aimInfo, status);

        // Rubber
        status = aim_mkDir(aimInfo, rubber);
        AIM_STATUS(aimInfo, status);

        status = CAPS_SUCCESS;

    cleanup:
        return status;
    }



    // Morphing input
    // First time through and morphing
    // -  Write bodies and mesh to disc only if mesh is linked a
    // -  AIM_CP_FIle the meshfile
    //


    // aim_storeMeshRef(aimInfo, meshRef, MESHEXTENSION);
    //aim_storeMeshRef(aimInfo, meshRef, MESHEXTENSION);
    //
    //aimMeshRef meshRef2;
    //aim_initMeshRef(&meshRef2);
    //aim_loadMeshRef(aimInfo, &meshRef2);
    //aim_freeMeshRef(&meshRef2);

    // Logic for selecting/setting mesh pointer if morphing the mesh
    int fun3d_morphMeshLogic(void *aimInfo, int storeAllowed, aimMeshRef **meshRef, aimMeshRef *meshRefObj)
    {
        int status = CAPS_SUCCESS;

        AIM_NOTNULL(meshRefObj, aimInfo, status);

        if (*meshRef != NULL && storeAllowed == (int) true) { // If we are NOT null lets store the mesh - if allowed

            status = aim_storeMeshRef(aimInfo, *meshRef, MESHEXTENSION);
            AIM_STATUS(aimInfo, status);

            *meshRef =  meshRefObj;

           // Lets "reload" the meshRef now - A little awkward but.....
           status = aim_loadMeshRef(aimInfo, *meshRef);
           AIM_STATUS(aimInfo, status);

        } else if (*meshRef != NULL  && storeAllowed == (int) false) { // If we are NOT null

             // Do nothing

        } else { // *meshRef == NULL

            *meshRef =  meshRefObj;

            // Lets "load" the meshRef now
            status = aim_loadMeshRef(aimInfo, *meshRef);
            AIM_STATUS(aimInfo, status);
        }

        cleanup:
            return status;
    }


    //{
    //    int status = CAPS_SUCCESS;
    //
    //    AIM_NOTNULL(meshRefObj, aimInfo, status);
    //
    //    if (*meshRef != NULL && storeAllowed == (int) true) { // If we are NOT null lets store the mesh
    //        status = aim_storeMeshRef(aimInfo, *meshRef, MESHEXTENSION);
    //        AIM_STATUS(aimInfo, status);
    //
    //        meshRef = NULL;
    //    }
    //
    //    *meshRef =  meshRefObj;
    //
    //    // Lets "reload" the meshRef now - A little awkward but.....
    //    status = aim_loadMeshRef(aimInfo, *meshRef);
    //    AIM_STATUS(aimInfo, status);
    //
    //    cleanup:
    //        return status;
    //}

    // Map the old surface tessellation on to the new bodies
    int fun3d_morpMeshUpdate(void *aimInfo,  aimMeshRef *meshRef, int numBody, ego *bodies)
    {
        int status = CAPS_SUCCESS;
        int i=0;
        int state, numVert;
        ego bodyMapping;
        ego body;
        ego tess;

        // Have the number of bodies changed?
        if (meshRef->nmap != numBody) {
            printf("The number of original surface meshes does NOT equal the number of current bodies!\n");
            AIM_STATUS(aimInfo, CAPS_MISMATCH);
        }

        // Are the bodies topological equivalent?
        for (i = 0; i < meshRef->nmap; i++) {

            status = EG_statusTessBody(meshRef->maps[i].tess, &body, &state, &numVert);
            AIM_STATUS(aimInfo, status);

            status = EG_mapBody(body, bodies[i], "_faceID",  &bodyMapping); // "_faceID" - same as in OpenCSM
            if (status != EGADS_SUCCESS || bodyMapping != NULL) {

                printf("New and old body %d (of %d) do not appear to be topologically equivalent!\n", i+1, meshRef->nmap);

                if (bodyMapping != NULL) {
                    printf("Body mapping isn't NULL!\n");
                }

                AIM_STATUS(aimInfo, CAPS_MISMATCH);
            }
        }

        // Now lets "tweak" the surface tessellation - map the old tessellation to the new bodies
        for (i = 0; i < meshRef->nmap; i++) {

            status = EG_copyObject(bodies[i], NULL, &body);
            AIM_STATUS(aimInfo, status);

            status = EG_mapTessBody(meshRef->maps[i].tess,
                                    body,
                                    &tess);
            AIM_STATUS(aimInfo, status);

            status = EG_deleteObject(meshRef->maps[i].tess);
            meshRef->maps[i].tess = tess;

        }

        cleanup:
            return status;
    }
    ryan / detail
  13. Remove old egads file in aim_storeMeshRef. Set AIMptr to NULL when unlinking. — galbramc / detail
  14. add assert in udfOffset to eliminate warnings on gcc — jfdannen / detail
  15. fix bug that caused ereped to not work for a named Body; fix bug that added bar at end of file that was being editted in ESP; extend ereped so that it can be applied if there are multiple Bodys on the stack; add ereped8 test case; fix ESP hint associated with ELEVATE command; fix bug when SELECT EGDE with a bounding box was applied to a Body with degenerate Edges; add extractBodys test case; fix array bounds error in udpEqn2body; fix bug in ereped initializations for a single Body — jfdannen / detail
  16. remove use of _scaleuv Attribute — jfdannen / detail
  17. allow very long message to be sent from browser to server; add setCsmFile instead of setScmFileBeg/Mid/End; if error occurs when processing a timMesg, put the tim back into READY mode; post message when erep is successfully generated; implement udpEqn2body for SheetBodys; update frustrum3 test case; use __usedBodys__ attribute when computing velocity of Faces or Edges for RULE and BLEND; fix bug in sensCSM that did not reset maximum errors for Bodys when in -tess mode; fix big that did not copy .hasdots during RESTORE . (dot) — jfdannen / detail
  18. A different possible fix for the MemcheckOcsm on the rule28 cases — haimes / detail
  19. A different possible fix for the MemcheckOcsm on the rule28 cases — haimes / detail
  20. A possible fix for the MemcheckOcsm on the rule28 cases — haimes / detail
  21. Effective Topology: Mark Planar/Periodic EFaces not to tessellate Edges based on Face Curvature — haimes / detail
  22. Fix scan-build warning from last commit again — haimes / detail
  23. Fix scan-build warning from last commit — haimes / detail
  24. Effective Topology: Fix NM Sheetbody Node removal — haimes / detail
  25. Fix NULL bays at end with multiNode Rule — haimes / detail
  26. Updated ruled sensitvities for multiNode — galbramc / detail
  27. A minor update of the documentation of EG_approximate — haimes / detail
  28. Update the docs to specify the additions to EG_approximate and EG_ruled — haimes / detail
  29. Fix _close! function to properly check garbage collection for both egads and egadslite — galbramc / detail
  30. Fix jlEGADS makefiles for zsh — galbramc / detail
  31. jlEGADS makefile adjusments. Other small cleanup. — galbramc / detail
  32. delete manifest from lite — docampo / detail
  33. now ?? — docampo / detail
  34. egads also used from egadscommon.jl dependencies — docampo / detail
  35. remove unnecesary ENVS — docampo / detail
  36. now with actually things inside — docampo / detail
  37. created egads common folders — docampo / detail

#186 (Aug 6, 2022, 10:00:03 PM)

  1. numpy suppression — galbramc / detail

#185 (Aug 6, 2022, 12:02:10 AM)

  1. Suppress lint warnings — galbramc / detail
  2. Fix for last commit — galbramc / detail
  3. Add aim_storeMeshRef and aim_loadMeshRef — galbramc / detail
  4. Doc updates — haimes / detail
  5. Fix typo in doc, and short Python Units Appendix — galbramc / detail
  6. Minor documentation (and coding) changes for the Python 1-to-1 CAPS interface — haimes / detail
  7. Document 1-to-1 pyCAPS API. Change pyCAPS setLimits/getLimits to setLimitsSize/getLimitsSize. Add support for limit arrays to pyCAPS. — galbramc / detail
  8. Addition of a CAPS API function that anly returns a Value Object's size — haimes / detail
  9. Try again! — haimes / detail
  10. Only set limits on OpenCSM DESPMTRs — haimes / detail
  11. Completed the first cut for per element support of limits — haimes / detail
  12. Adjust Value functions to support per element limits — haimes / detail
  13. Update bfr instructions — galbramc / detail
  14. Fix lint error — haimes / detail
  15. readd multifidelity phasing examples — dongjoon / detail
  16. Read/write and update setLimits/getLimits for per element limits — haimes / detail
  17. Skeleton additions for adding per element limits — haimes / detail
  18. update Makefile.LINUX64 — jfdannen / detail
  19. add udfDumpPmtrs and associated test case; implement RESTORE .. (dot dot) to duplicate all Bodys (and Mark) back to the Mark and RESTORE ... (dot dot dot) to duplicate entire stack; add restore3 test case; allow UDF to not return a Body or Bodys; update udfOffset so that it can handle concave corners (but not case where Edges disappear) — jfdannen / detail
  20. temporarily remove offset9* test cases — jfdannen / detail
  21. update udfOffset for negative distance — jfdannen / detail
  22. fix hint associated with JOIN; change JOIN so that it can make non-manifold WireBodys; modify numWireBody* test cases; create ELEVATE command, which only elevates WireBody to SheetBody and SheetBody to SolidBody;  remove COMBINE command and instruct user to use JOIN and ELEVATE instead; update UNION and JOIN such that if toMark is set but the operation fails, the stack is left unaltered; add unionSolids* test cases; fix typos in ESP-help (and OpenCSM.h) — jfdannen / detail
  23. Rule with Loops of differing number of Edges passes simple test with null 'bay' — haimes / detail
  24. Can rule with sections of different number of Edges -- still need to check null bays, multiplicity > 1, curved EndCaps & EG_splineGeom_dot — haimes / detail
  25. Close memory leak in EGADSlite associated with full attributes — haimes / detail
  26. Fix scan-build problem — haimes / detail
  27. Fix warning from last commit — haimes / detail
  28. Second (but incomplete) cut at Rule with differring numbers of Edges — haimes / detail
  29. Another minor correction to last commit — haimes / detail
  30. Minor correction to last commit — haimes / detail
  31. First (but incomplete) cut at Rule with differring numbers of Edges — haimes / detail
  32. Don't allow for Figure 8 Nodes in ELoops (for now) — haimes / detail
  33. Another def file fix — haimes / detail
  34. Add setTessParam to lite def file — haimes / detail
  35. Updates to egadslite to support pyEGADS.egadslite — galbramc / detail
  36. First cut at pyEGADS.egadslite — galbramc / detail
  37. Remove manifest files for jlEGADS. Check array size for makeGeometry. Fix makeGeometry tests. Some references fixes. — galbramc / detail
  38. Fix some pyEGADS refrencing. Check data length for pyEGADS makeGeometry. — galbramc / detail
  39. Fix topObj during EGADSlite import — haimes / detail
  40. Add U periodic options to EG_approximate for surfaces — haimes / detail
  41. try — docampo / detail
  42. Allow for full attribution in EGADSlite — haimes / detail
  43. Add reference counting for jlEGADS finalizers. Lots of other jlEGADS cleanup. — galbramc / detail
  44. Always build egadslite — galbramc / detail
  45. Update julia path on linux — galbramc / detail
  46. Remove jlEGADS from Sanitizer and Valgrind — galbramc / detail
  47. mark helix3 and frustrum3 as expected successes — jfdannen / detail

#184 (Jul 25, 2022, 8:02:59 AM)

  1. Support for higher precssion xfoil executables. Add BoundaryLayerIntersect meshProp for AFLR4 and AFLR3. — galbramc / detail
  2. Compile needed aflr43 files — galbramc / detail
  3. Upgrade to AFLR 10.22.23 — galbramc / detail
  4. Uprev CAPS — haimes / detail
  5. Update corasairlite README to indicate hoburg_blackbox.py requies scipy. Remove hoburg_lsqp.py from testing. — galbramc / detail
  6. delete duplicate file — dongjoon / detail
  7. add (unneeded) initializations in udfOffset to resolve incorrect lint complaints — jfdannen / detail
  8. implement udpEqn2body for WireBodys; modify inflatedBody2b to use the replicate.udc; implement udfOffset; create offset* test cases; improve error handling associated with SELECT SORT; modify flend5* test cases to use udfOffset — jfdannen / detail
  9. uprev to v1.22 — jfdannen / detail
  10. fix bug that did not update at-parameters for REORDER command; fix bug that changed the input Body to REORDER; fix sensitivity bug whan a RULE/BLEND xsect is RESTOREd after being used — jfdannen / detail
  11. initialize *info in ocsmBodyDetails; return sensible error message when a SET is applied to a CONPMTR, CFGPMTR, or DESPMTR — jfdannen / detail
  12. update duct7.vfy files — jfdannen / detail
  13. Fix for last commit — galbramc / detail
  14. Various Julia cleanup and fixes — galbramc / detail
  15. Update julia Makefile — galbramc / detail
  16. Remove jlEGADS environment variable — galbramc / detail
  17. added package install — docampo / detail
  18. added Makefile — docampo / detail
  19. first jlEGADS — docampo / detail
  20. First cut at fitting periodic curves — haimes / detail
  21. Fix a number of bugs in the Effective Topology — haimes / detail
  22. Uprev EGADS — haimes / detail
  23. Forgot DARWIN64.clang and DARWIN64.gcc — galbramc / detail
  24. Move DARWIN64 ifort link flag to support EGADS test builds — galbramc / detail
  25. Fix for ifort on newer versions of macOS — galbramc / detail
  26. Add jlEGADS test to Sanitizer and valgrind — galbramc / detail
  27. Correct path — galbramc / detail
  28. Add julia testing — galbramc / detail
  29. Small fix in xfoil executables — galbramc / detail
  30. Higher output precision xfoil executables — galbramc / detail
  31. Upgrade to AFLR 10.22.23 — galbramc / detail
  32. Another regsx fix — galbramc / detail
  33. Fix email template — galbramc / detail
  34. Ignore ifort warnings — galbramc / detail

#183 (Jul 12, 2022, 8:00:01 PM)

  1. Fix sensitivites with AFLR and TRANSP. Fix check for return codes in caps_info/caps_analysisInfo in pyCAPS. — galbramc / detail
  2. Don't run corsairlite scipy exemples without scipy — galbramc / detail
  3. Remove unused variable to fix stanalizer — galbramc / detail
  4. cCAPS example fix — galbramc / detail
  5. Stanalizer fixes — galbramc / detail
  6. Fixes for dealing with TRANSP surfaces. Add AFLR3 TRANSP tests. — galbramc / detail
  7. Turn off wake for all tetgen examples — galbramc / detail
  8. Fix SU2 to support internal BCs. TetGen does not support internal surfaces. — galbramc / detail
  9. Add TRANSP_UG3_GBC testing. Don't allow TRANSP_SRC_UG3_GBC for AFLR with CAPS. echo exectables when running tests. — galbramc / detail
  10. Codify corsairlite phasing example as commandline scripts — galbramc / detail
  11. Only set signals from the python Main Thread. — galbramc / detail
  12. Catch import signal ValueError. — galbramc / detail
  13. CorsairLite doc update — haimes / detail
  14. Various small cleanups — galbramc / detail
  15. Fix signal handling in pyCAPS — galbramc / detail
  16. return stub.py to expected state at beginning of tutorial6 — jfdannen / detail
  17. add wingBEM2 test case; add duct7 test case; add replicate.udc and ereped6* and ereped7 test cases; add sharpFin test case; typo fix in documentation — jfdannen / detail
  18. protect for degenerate Edges in sensCSM; fix ESP bug that dropped user out of CapsMode if a non-existant pyscript is attempted; update ESP_QuickReference — jfdannen / detail
  19. fix typos in ESP-help — jfdannen / detail
  20. update compare1b.vfy — jfdannen / detail
  21. modify ESP-help to reflect the fact that legacy tutorials have been moved; update message when user quits a phase in the IDE — jfdannen / detail
  22. fix bug in computing tessellation sensitivities for a NodeBody — jfdannen / detail
  23. try invEvaluateGuess for very hard cases in udfCompare; update compare1b test case — jfdannen / detail
  24. update date in ESP-help — jfdannen / detail
  25. finished draft of tutorial6 write-up — jfdannen / detail
  26. third cut at tutorial6 write-up — jfdannen / detail
  27. Add _USE_MATH_DEFINES for MSVC — galbramc / detail
  28. Add error functions erf and erfc to Surreal — galbramc / detail
  29. README update — haimes / detail
  30. Config update — haimes / detail
  31. Fix bug returning wrong parameters in pyEGADS effectiveMap — galbramc / detail
  32. Use updated wget for ESP_PreBuilt.bat — galbramc / detail
  33. Beta script updates — galbramc / detail
  34. Trying to limit pip install conflits. Cleaner batch pip install function. — galbramc / detail
  35. Skip some long running tests with Sanitizer and Valgrind — galbramc / detail

#181 (Jul 2, 2022, 5:34:06 AM)

  1. Missed one more — galbramc / detail
  2. More python suppressions — galbramc / detail

#180 (Jul 1, 2022, 4:02:06 PM)

  1. Small Makefile cleanup — galbramc / detail
  2. Add intentPhase to corsair capsPhase examples — galbramc / detail
  3. Upgrade AFLR version check to 10.22.22 libraries. Add more AFLR3 tests. — galbramc / detail
  4. allow asterisk as a wildcard in the DisplayFilter — jfdannen / detail
  5. fix bug in IDE that did not properly journal updates to the intent phrase — jfdannen / detail
  6. second cut at tutorial6 write-up — jfdannen / detail
  7. More defensive Surreal defines — galbramc / detail
  8. Some config updates — haimes / detail
  9. Suppress AFLR uninitialized data — galbramc / detail
  10. Yet more numpy suppressions — galbramc / detail
  11. Another numpy suppression — galbramc / detail
  12. Upgrade to AFLR 10.22.22 on Windoze. Suppress numpy leak. — galbramc / detail

#179 (Jun 26, 2022, 8:28:14 AM)

  1. Update training solution — galbramc / detail
  2. Fix bug not removing .tessType for Tri EGADS tessellations — galbramc / detail
  3. Updated training box wing to remove capsIgnore — galbramc / detail
  4. Cleanup corsair examples a little — galbramc / detail
  5. Add intentPhrase and history to pyCAPS — galbramc / detail
  6. Replaced viscous wall bc to inviscid for Wing1 — nitin / detail
  7. changed viscous wall bc to inviscid for Wing1 — nitin / detail
  8. delete corsairlite example multifidelity — dongjoon / detail
  9. Bug fix for cart3d with geometric sensitvities — galbramc / detail
  10. Add symmetry inputs to cart3d — galbramc / detail
  11. Updated SU2 AIM for compatibility with the latest (SU2-7.3.1) — nitin / detail
  12. Protect value index from changes in aimCalcOutput — galbramc / detail
  13. lint fixes — galbramc / detail
  14. fix tabs to spasces — dongjoon / detail
  15. Fix warning — galbramc / detail
  16. Fix aimTransfer to use surface to volume maps — galbramc / detail
  17. modify corsair examples to generate pickle — dongjoon / detail
  18. Lint and memory leak fixes — galbramc / detail
  19. delete duplicate examples/corsairlite/phase_design directory — dongjoon / detail
  20. Update multifidelity examples with no hard coded paths and phaseStart — dongjoon / detail
  21. Update corsairlite examples with multifidelity phasing — dongjoon / detail
  22. Fix copy/pasta mistake — galbramc / detail
  23. Fix boundary indexing for aflr3 to mach capsGroup indexing — galbramc / detail
  24. lint fixes — galbramc / detail
  25. Fix AFLR NMakefiles — galbramc / detail
  26. Plug memory leak in aflr3 and run new Symmetry testing with MESH — galbramc / detail
  27. Reorder AFLR libraries — galbramc / detail
  28. Upgrade to AFLR 10.22.21 with support for sensitvities on symmetry planes — galbramc / detail
  29. os independent file paths for corsair examples — galbramc / detail
  30. Ignore corsairlite for legacy regression tests — galbramc / detail
  31. Use cdef in fun3dNamelist.pyx to avoid segfault during garbage collection — galbramc / detail
  32. Forgot a file — galbramc / detail
  33. embedded python updates — galbramc / detail
  34. Fix divide by zero — galbramc / detail
  35. Relax tolerances for cvxopt — galbramc / detail
  36. Replaced serveCSM with serveESP — nitin / detail
  37. added figures to html version, consistent with pdf — nitin / detail
  38. Update corsairlite kulfan models — dongjoon / detail
  39. Copy hoburg.pl for corsair testing. Ignore corsair in C regressions — galbramc / detail
  40. Cleanup corsairlite capsPhase examples a little — galbramc / detail
  41. Run corsairlite qp for MINIMAL testing — galbramc / detail
  42. Fix examples copy for corsairlite — galbramc / detail
  43. Enable corsairlite test again. — galbramc / detail
  44. Don't test corsairlite yet — galbramc / detail
  45. Defer scipy import error for corsair kulfan datatype — galbramc / detail
  46. Add corsairlite examples — galbramc / detail
  47. Add corsairlite — galbramc / detail
  48. Some dox cleanup — galbramc / detail
  49. Add caps.phaseNewCSM to pyCAPS. Enalbe use of phaseNewCSM in pyCAPS Problem. — galbramc / detail
  50. Updated CAPS overview dox, *_dox.cfg, *_header.tex to fix warnings — nitin / detail
  51. Add caps_phaseNewCSM to the CAPS API — haimes / detail
  52. Fix bug specifuing Mesh_Sizing on Edges for aflr4 — galbramc / detail
  53. Update phasing tests. Fix Multiple_Mesh for TetGen. — galbramc / detail
  54. Make updates fix directory removal under error — haimes / detail
  55. Cleanup phasing in pyCAPS — galbramc / detail
  56. first cut at tutorial6 write-up — jfdannen / detail
  57. more documentation updates — jfdannen / detail
  58. remove erroneous non-manifold warning associated with NodeBodys — jfdannen / detail
  59. fix bug when visualizing new-style quads and .mixed=NULL; do not process _makeQuads on a Face if the Body has a _makeQuads Attribute — jfdannen / detail
  60. fix bug in ESP.js that did not properly clear the display when velocities were cleared — jfdannen / detail
  61. fix bug that did not persist Edge Attributes to new non-manifold Edges that are generated by EXTRACTing Faces; add attributeA test case; add duct6 test case — jfdannen / detail
  62. fix threading for python — jfdannen / detail
  63. fix bug in ESP.js associated with clearing velocities for a scalar; update tutorials 1 to 5 for v1.21 — jfdannen / detail
  64. modify way python is initialized and finalized to work around a problem in numpy - take 3 — jfdannen / detail
  65. modify way python is initialized and finalized to work around a problem in numpy - take 2 — jfdannen / detail
  66. modify way python is initialized and finalized to work around a problem in numpy — jfdannen / detail
  67. copy CFGPMTRs and DESPMTRs from temporary CAPS MODL back into the ESP MODL in CapsCommit and CapsSuspend; automatically rebuild MODL in CapsCommit and CapsSuspend — jfdannen / detail
  68. fix recently-added typo to timPyscript.c — jfdannen / detail
  69. add sanitize-thread target to Makefile.DARWIN64 — jfdannen / detail
  70. fix error message associated with not enough arguments to SPHERE; fix bug when user double-clicks in MessageWindow (Chrome and Safari) — jfdannen / detail
  71. fix setting of PYTHONHOME for a double-quoted string — haimes / detail
  72. generate WARNING if importing an .egads file that has an Attribute that cannot be evaluated — jfdannen / detail
  73. fix bug associated with EnterSketcher — jfdannen / detail
  74. remove debug print statement — jfdannen / detail
  75. fix bug that did not allow sketches to be saved from serveESP — jfdannen / detail
  76. remove side effects from assert() statements, which work differently on Windoze — jfdannen / detail
  77. allow pyscripts to end without a newline — jfdannen / detail
  78. fix bug associated with finishing non-manifold WireBodys — jfdannen / detail
  79. allow overlay to execute a mesg even when in TIM_EXECUTING; update tutorial6 files — jfdannen / detail
  80. remove debug printing of long cast — jfdannen / detail
  81. suppress profile printing if outLevel==0; fix filename updates in ESP after saving new file and after exporting the feature tree — jfdannen / detail
  82. limit size of inflatedBody2a to reduce its CPU time — jfdannen / detail
  83. update testing scripts from serveCSM to serveESP — jfdannen / detail
  84. update testing scripts from serveCSM to serveESP — jfdannen / detail
  85. change deprecated e.srcElement to e.target in .js files — jfdannen / detail
  86. add tutorial6/model2c — jfdannen / detail
  87. numerous updates to ESP-help; add .csm filename to ListPhases in the IDE; automagically add .py extension if omitted; add created/updated phase to ListAnalyses in the IDE; break model2 into model2a, model2b, model2; do not allow non-manifold WireBodys in RULE, BLEND, LOFT, and SWEEP; add nmWireBody test cases; list associated Analyses in ListBounds in the IDE; fix bug that did not persist attributes on scribed Edges during a boolean operation; add attribute9* test cases; add Insert button to ESP editor; fix bug in serveESP that did not update filename creating a new .csm file — jfdannen / detail
  88. update EGADS thread during ocsmBuild; do not execute overlay (plotter, viewer, flowchart) when in continuation mode; move data/ide to data/tutorial6; timFlowchart, timPlotter, and timViewer hold pyscript by default (use nohold to run asynchronously); add inflatedBody* test cases; explicitly document the rules associated with the propagation of Xsect Attributes during EXTRUDE and REVOLVE; fix memory leaks in buildSceneGraph and timPyscript; remove upper limit check on nedge in udpEllipse; add thickPrint* test cases; extend COMBINE to make a non-manifold WireBody for a set of connected WireBodys; add pipeNetwork* test cases — jfdannen / detail
  89. numerous updates — jfdannen / detail
  90. add sub03 and f104 to studentGallery — jfdannen / detail
  91. Fix up EMP_ThreadDestroy for the M1 — haimes / detail
  92. Stanalizer fixes for Lazy Surreal — galbramc / detail
  93. Use std c++11 for Surreal tests. Fix in depricated EG_loadTess. — galbramc / detail
  94. Use Lazy Expressions for Surreal for slightly better performance on windoze — galbramc / detail
  95. Minor config changes — haimes / detail
  96. Config change for Windows to always start browsers in the background — haimes / detail
  97. Windows configuration change to promote Edge — haimes / detail
  98. update README.txt with note about Safari block-ups — jfdannen / detail
  99. Add makeNmWireBody to pyEGADS — galbramc / detail
  100. Don't clobber LD_LIBRARY_PATH with ESPenv — galbramc / detail
  101. Configuration changes and signature change for EG_makeNmWireBody — haimes / detail
  102. Upgrade to AFLR 10.22.22 on Unix systems — galbramc / detail
  103. Upgrade jenkins to SU2 7.3.1 — galbramc / detail
  104. Look for more tessellation errors in the log file — galbramc / detail
  105. Upgrade to AFLR 10.22.21 — galbramc / detail
  106. Add random sleep for Windoze pip install to avoid install conflicts — galbramc / detail
  107. Install corsairlite dependencies for ESP_Beta testing — galbramc / detail
  108. Python suppression — galbramc / detail
  109. More error checking in ESPbfr.bat — galbramc / detail
  110. Attempt Python 3.9.13 again — galbramc / detail
  111. macM1 uses 3.8.11 — galbramc / detail
  112. Revert back to ESP_Python 3.8.9 for now — galbramc / detail
  113. install matplotlib and scipy for corsairlite — galbramc / detail
  114. install packaging for corsairlite — galbramc / detail
  115. Upgade to ESP_Python-3.9.13 — galbramc / detail
  116. Install dill and cvxopt — galbramc / detail
  117. Fix funny permissions on DARWIN64 mastros — galbramc / detail
  118. Update macOS intel/M1 mastros with old macOS target — galbramc / detail
  119. astros has array out-of-bound problems — galbramc / detail
  120. Don't define ASTROS_ROOT on machines without astros — galbramc / detail
  121. Restore mastros on macOS, macM1, and restore astros on Linux — galbramc / detail
  122. Uses msys64 wget on Windoze — galbramc / detail
  123. fix formatting error associated with expected errors for frustrum3 and helix3 — jfdannen / detail
  124. fix formatting error associated with expected errors for frustrum3 and helix3 — jfdannen / detail

#178 (May 7, 2022, 12:02:09 AM)

  1. Include IDE's parent info in phaseUtil and fix some minor issues — haimes / detail
  2. Complete phaseUtil — haimes / detail
  3. Add AnalysisIn derivatives in sens file for tacs and fun3d — galbramc / detail
  4. Add the phaseUtil app -- still needs filling out — haimes / detail
  5. Change skeleton AIM so it can be used as part of the ESP IDE tutorial — haimes / detail
  6. Add mses executables to ESPbfr — galbramc / detail
  7. Protect FunID read against a corrupt file — haimes / detail
  8. Revert adding debug in Problem.__init__ — galbramc / detail
  9. Output file position on Journal read during debugging — haimes / detail
  10. Guard pyCAPS.Problem.__init__ caps calls with caps_debug — galbramc / detail
  11. Stanalizer fix — galbramc / detail
  12. Fix memory leak in Cart3D data transfer — galbramc / detail
  13. Fix bug in last commit. Cleanup caps_preAnalysiX. Add forgotten Cart3D FSI example. — galbramc / detail
  14. Put user name and date/time stamp in capsLock — haimes / detail
  15. fix memory leak in msesAIM — galbramc / detail
  16. Lint fixes — galbramc / detail
  17. another scan-build fix — galbramc / detail
  18. scan-build fixes — galbramc / detail
  19. Add environment variable to output Journal entries as they process — haimes / detail
  20. Fix warning — galbramc / detail
  21. Dedicated function to call aim_UpdateState. Re-formulate phasing/continuation in pyCAPS Problem constructor. Indent AIM error messages. Add Displacement data transfer to Cart3D for FSI. Only allow cals to caps_getDataSet in aimPreAnalysis. Do not allow disk manipulation in aimUpdateState. — galbramc / detail
  22. Fix childByName when in debug mode — haimes / detail
  23. Finally the correct Windoze executable — galbramc / detail
  24. Update avl exec on Linux and Windoze — galbramc / detail
  25. Fix both the documentation and the code so they are consistent with adding const to the AIM functions Pre and Exec — haimes / detail
  26. update jfd3AIM to adjust for recent API changes — jfdannen / detail
  27. Reinstate no intent phrase flag — haimes / detail
  28. Try that again — galbramc / detail
  29. Update macOS avl executables without X11 dylib dependency — galbramc / detail
  30. Don't journal on initPhrase calls in caps_open — haimes / detail
  31. Revert last commit — haimes / detail
  32. Turn off journaling of intentPhrase in caps_open — haimes / detail
  33. lint fixes — galbramc / detail
  34. So many def files... — galbramc / detail
  35. Fixes for delaundo — galbramc / detail
  36. Another forgotten def file — galbramc / detail
  37. Missed one — galbramc / detail
  38. aimUpdateState is no longer optional — galbramc / detail
  39. Forgot def file — galbramc / detail
  40. Add aimUpdateState to su2 AIM, and fix warnings — galbramc / detail
  41. Add aimUpdateState to nastran and poinwise AIMs — galbramc / detail
  42. Add aimUpdateState to hsm, interference, masstran, mystran, and aimUtil.h — galbramc / detail
  43. Fix writing a Integer Value Object that is NULL — haimes / detail
  44. Add aimUpdateState to fun3dAIM. Call aim_UpdateState in post analysis during reload. — galbramc / detail
  45. Fix lint issue on skeletonAIM — haimes / detail
  46. Fix warnings from last commit — haimes / detail
  47. Protect against writing NULL double value objects; Update skeleton AIM — haimes / detail
  48. Fix applying offset to NULL pointer — galbramc / detail
  49. Update avl reference data. Plug memory leak in egadsTess — galbramc / detail
  50. Fix aimUpdateState in egadsTess AIM — galbramc / detail
  51. Don't run mystran_PyTest on Windoze — galbramc / detail
  52. Forgot def file — galbramc / detail
  53. Remove on too many lines — galbramc / detail
  54. Fix warning from last commit — galbramc / detail
  55. More aimUpdateState updates. Remove some redundant tests — galbramc / detail
  56. Add aimUpdateState to a number of AIMs. Turn on CLink between Phases. — galbramc / detail
  57. Misseed one astros in training — galbramc / detail
  58. Allow aim_relPath to cross Phases — haimes / detail
  59. Guard againts running mastros test when mastros does not exist — galbramc / detail
  60. Fixes for calling aimUpdateState in caps_preAnalysis — galbramc / detail
  61. remove try/catch from IDE demo pyscript files; use skeletonAIM instead of jfd3AIM in IDE demo; only show Display table entries (Node/Edge/Face/Csystem/Pips) if it contains any child entities; fix sensitivity bug associated with UDP/UDFs that requires finite differences coupled with an OUTPMTR that is tied to a mass property; add udpTest; initial commit of new timGloves and associated files — jfdannen / detail
  62. remove Gloves and Mitten from Tool menu — jfdannen / detail
  63. add ocsmPrintProfile to explicitly print the profile of CPU usage (instead of printing automatically during ocsmBuild); automagically run pyscript.py when running in continuation mode; change Cvals via script when in CAPS mode; change DESPMTRs via script when in CAPS mode; offer to steal capsLock in CAPS mode; add ogive* test cases — jfdannen / detail
  64. protect non-script caps_ calls with caps_debug; fix bug in timCapsMode that sometimes reverted to original .csm file; update demo_tim.txt; remove duplicate entries from ListHistory; fix typo in ESP-help associated with EVALUATE command — jfdannen / detail
  65. remove -caps command-line option (replaced by timCapsMode); add cleanup process in pyscript.py only between scripts (not at end); fix bug that did not profile MESSAGE statements; reset profile info at beginning of ocsmBuild; fix bug that did not print OUTPMTRs during call to ocsmPrintPmtrs — jfdannen / detail
  66. compile serveESP in Makefile and NMakefile — jfdannen / detail
  67. inform user when CAPS overrides .csm value(s); first attemp at re-running pyscript in continuation mode — jfdannen / detail
  68. add indication for Phases that are a predecessor of current Phase in ListPhases — jfdannen / detail
  69. add calls to caps_debug around List* messages in timCapsMode; update data/ide/*.py to directly rebuild the geometry; reorder Caps menu options — jfdannen / detail
  70. fix ListHistory in timCapsMode — jfdannen / detail
  71. update demo_tim.txt — jfdannen / detail
  72. modify demo_caps.txt and demo_tim.txt; make changes needed to make both demos operate properly — jfdannen / detail
  73. fix stanalyzer error — jfdannen / detail
  74. more modifications to support timCapsMode — jfdannen / detail
  75. temporary commit to be used for debugging — jfdannen / detail
  76. remove debug print statement — jfdannen / detail
  77. additional bugs fixed in timCapsMode; add unequalRules test case to show how to RULE between xsects with different nnumber of Edges — jfdannen / detail
  78. remove temporary printf statements — jfdannen / detail
  79. rename capsIde to capsMode; restrict SPHEREs to have a positive radius; allow multiple ESP-help tabs in browser; partial implementation of timCapsMode — jfdannen / detail
  80. revert previous commit — jfdannen / detail
  81. fix previous commit — jfdannen / detail
  82. remove unneeded windoze headers from tim.c — jfdannen / detail
  83. Fix continuation marker in serveESP.mak — haimes / detail
  84. Fix headers for Windows in timPyscript — haimes / detail
  85. fix windoze problem with includes in pervious commit — jfdannen / detail
  86. only allow one open ESP-help tab at a time; implement timFlowchart; modify interpolateUpper.py and conserveUpper.py to demonstrate flowcharting tool — jfdannen / detail
  87. Documentation updates — haimes / detail
  88. More Doc updates — haimes / detail
  89. Some Documentation updates — haimes / detail
  90. Fix the fix for memory issue with getting units from imports — haimes / detail
  91. Fix memory issue with getting units from imports — haimes / detail
  92. Document some of the new updates to SETP/IGES handling — haimes / detail
  93. Support units on both STEP and IGES exports — haimes / detail
  94. Add an option to do less checking with makeTopology on a Loop — haimes / detail
  95. Another touch of splitPeriodics — haimes / detail
  96. Try that again -- revert and get the if statement correct! — haimes / detail
  97. Try that again — haimes / detail
  98. Don't update the shape in splitPeriodics if it fails curve simplification — haimes / detail
  99. Fix scan-build warning from last commit — haimes / detail
  100. Implement EG_makeNMWireBody — haimes / detail
  101. add frustrum3 and helix3 to expected failures — jfdannen / detail
  102. Windoze requires exe extension — galbramc / detail
  103. Add mses to ESPbfr.tgz with tighter convergence tolerance — galbramc / detail
  104. Another python suppression — galbramc / detail
  105. change testing from serveCSM to serveESP — jfdannen / detail
  106. Third time is the charm — galbramc / detail
  107. Try updating Windoze avl again... — galbramc / detail
  108. Update avl exec on Linux and Windoze — galbramc / detail
  109. Try that again — galbramc / detail
  110. Update macOS avl executables without X11 dylib dependency — galbramc / detail
  111. Remove redundant testing — galbramc / detail
  112. Remove mastros.exe on macys and viggen because it does not work — galbramc / detail

#177 (Apr 3, 2022, 1:44:40 PM)

  1. Plug memory leak — galbramc / detail
  2. More mses tests. Add aimUpdateStatus to avlAIM. Other small fixes. — galbramc / detail
  3. Allow for debug mode coming into caps_outputObjects — haimes / detail
  4. Allow for debug mode coming into caps_outputObjects — haimes / detail
  5. Don't look for python deprecation warnings — galbramc / detail
  6. Look for python deprecation warnings — galbramc / detail
  7. Limit threading with OMP_NUM_THREADS — galbramc / detail
  8. Don't pipe sanitize pyOCSM testing — galbramc / detail
  9. add numpy valgrind suppression — galbramc / detail

#175 (Apr 2, 2022, 12:02:10 AM)

  1. in pyCAPS.Problem(), use running Caps Problem if it already exists — jfdannen / detail
  2. Add phasing xfoil tests — galbramc / detail
  3. Add Phasing test to pyCAPS unit testing. Fix probemName misspelling. — galbramc / detail
  4. Turn off Analysis links for now — haimes / detail
  5. Fix the warnings from the last commit — haimes / detail
  6. First cut at Analysis disk links for new Phases — haimes / detail
  7. Reduce execution time in legacy xfoil example — galbramc / detail
  8. Faster geometry construction for ESP_Commit — galbramc / detail
  9. Add some more timing — galbramc / detail
  10. Remove incorrect CL derivatives from msesAIM. Run one test per aim for MINIMAL tests. — galbramc / detail
  11. Fix last commit — haimes / detail
  12. Prepare the AIM utilities for Analysis directory links — haimes / detail
  13. Missed one free — galbramc / detail
  14. lint fixes — galbramc / detail
  15. Use aimUpdateState in msesAIM. Cache sensitvities in msesAIM. Expose more inputs in msesAIM. — galbramc / detail
  16. Implement undocumented caps_modifiedDesPmtrs so that the IDE can know which DESPMTRs have been modified by CAPS — haimes / detail
  17. Some more mses updates and regression script fix — galbramc / detail
  18. Don't check alpha for TargetCL Cart3D test — galbramc / detail
  19. Add TargetCL to Cart3D and enable Cart3D 2D mode — galbramc / detail
  20. Try that again — galbramc / detail
  21. Fix infinite loop in convert_doubleToString — galbramc / detail
  22. Fix calling updateState when an AnalysisIn Object has changed — haimes / detail
  23. Add the AIM function aimUpdateState which will allays be the first function executed in the sequence — haimes / detail
  24. A few more mses corrections — galbramc / detail
  25. Adjust mses data — galbramc / detail
  26. mses updates — galbramc / detail
  27. Remove caps_resetAnalysis from the API — haimes / detail
  28. Use curvature weighted point distribution for avl/xfoil/mses — galbramc / detail
  29. Remove caps_resetAnalysis from pyCAPS — galbramc / detail
  30. Don't write 'empty' rubberize files — galbramc / detail
  31. "fix" to fun3dAIM when to write/read shape sensitivities — ryan / detail
  32. Fix intent phrase sync issue on initialization — haimes / detail
  33. Add initial history for GeometryIn, Analysis and AnalysisIn Objects — haimes / detail
  34. Fix journaling so that changing DESPMTR (GeometryIn) dimensioning is handled — haimes / detail
  35. Remove old caps_open CSM reload option and replace it with the new — haimes / detail
  36. Fix history addition for reloading CSM and new GeometryIn Value Object — haimes / detail
  37. Relax tolerance and try to get consistent xfoil results on all machines — galbramc / detail
  38. Update mses data. — galbramc / detail
  39. Update xfoil data. Don't set OCS_CONPMTR when journaling — galbramc / detail
  40. More robust xfoil execution — galbramc / detail
  41. Update legacy test xfoil data — galbramc / detail
  42. Adjust tolerances — galbramc / detail
  43. Add mses OpenMDAO example — galbramc / detail
  44. Missed some test that needed updated reference data — galbramc / detail
  45. Use EGADS tessellator for airfoil files — galbramc / detail
  46. Fix warning clang 13.1.6 warning — galbramc / detail
  47. Fix full path on CSM filename for oPNewCSM option with caps_open — haimes / detail
  48. Forgot to close a file — galbramc / detail
  49. Fix msesAIM sensitivities — galbramc / detail
  50. Support a directory of CSM/UDC files at init or CSM reload for caps_open; test for all analyses past post for completing a Phase — haimes / detail
  51. Don't write fun3d Rubberize files when not needed — galbramc / detail
  52. Don't write out body information to rubber.data for only AnalysisIn sensitvities — galbramc / detail
  53. Stanalizer fix — galbramc / detail
  54. Add avl 3.40 min version error message — galbramc / detail
  55. Remove libquadmath dependency on DARWIN64 — galbramc / detail
  56. Add avl 3.40 to ESPbfr — galbramc / detail
  57. Plug one more memory leak — galbramc / detail
  58. Fix array bound issue in avlmrf — galbramc / detail
  59. Move variable declarations to top of functions — galbramc / detail
  60. Fix avl NMakefile. Fix uninitialized data. — galbramc / detail
  61. Lint and memory leak fixes — galbramc / detail
  62. aimBackdoor has been removed from the avl AIM — galbramc / detail
  63. avl fixes — galbramc / detail
  64. Upgrade to avl 3.41 — galbramc / detail
  65. Change caps_delete to caps_markForDelete in pyCAPS — galbramc / detail
  66. Change caps_delete to caps_markForDelete — haimes / detail
  67. Preserve pyCAPS objects when calling caps_delete. caps_delete and pyCAPS delete will be renamed. — galbramc / detail
  68. Revert astros example — galbramc / detail
  69. Fix last scan-build error — haimes / detail
  70. Add history to geometry objects that are either new inputs or all outputs when reloading a CSM file — haimes / detail
  71. Fix scan-build complaint — haimes / detail
  72. lint fixes — galbramc / detail
  73. Restote attributes and history on geometry objects with a CSM reload — haimes / detail
  74. Update legacy su2 test — galbramc / detail
  75. Add some egadsTess NodeBody tests — galbramc / detail
  76. Fix BC indexing for meshRef — galbramc / detail
  77. Add history to geometry outs and other minor updates — haimes / detail
  78. Use enum instead of numerical value for checking stFlag — haimes / detail
  79. Also return row vector in caps_getValue — galbramc / detail
  80. Patch up some potential problems with restart/journaling and changing OpenCSM dimensions — haimes / detail
  81. Add read-only option on caps_open -- not well tested — haimes / detail
  82. remove jfd3AIM from aim/Makefile — jfdannen / detail
  83. add hfd3AIM for testing Bounds and DataSets — jfdannen / detail
  84. Add new caps_delete to pyCAPS — galbramc / detail
  85. allow for .py scripts to run both in serveESP -caps and in python; add ocsmSetAuxPtr and ocsmGetAuxPtr in OpenCSM API — jfdannen / detail
  86. fix stanalyzer problem in timCapsIde.c — jfdannen / detail
  87. update serveESP.mak in previous commit to include timCapsIde.obj — jfdannen / detail
  88. change display scaling so that if there is only one NodeBody it still gets displayed; initial implementation of timCapsIde — jfdannen / detail
  89. allow nesting of TIMs to MAX_TIM_NESTING=10 — jfdannen / detail
  90. fix bugs in File->Open and File->Edit for cases with and without UDCs — jfdannen / detail
  91. fix bug in ocsmSave that did not write DIMENSION statements correctly when writing either a .csm or .cpc file with a variable nrow and/or ncol; update calls to caps_open to handle UDCs — jfdannen / detail
  92. change -caps mode to accommodate both fore- and back-slashed in filenames; use ocsmTessellate in serveESP; update serveESP.make and serveESP.mak to define USING_CAPS (so that serveESP can be built without CAPS); remove unneeded code that generates a warning with new clang version; use updated caps_open so that cases with UDCs work properly — jfdannen / detail
  93. remove unneeded code that generates a clang warning — jfdannen / detail
  94. add ocsmAdjustUDCs to OpenCSM API to copy all UDCs to the same directory as the .csm file; implement File->New, File->Open, and File-Edit->OK in caps mode — jfdannen / detail
  95. more improvements for ListHistory; use caps_open in read-only mode in ListPhases and ListHistory — jfdannen / detail
  96. do not let esp.UpdateESP rebuild (force rebuild in .py script) — jfdannen / detail
  97. extend ListHistory to GEOMETRYIN and GEOMETRYOUT — jfdannen / detail
  98. update Makefiles for cases without python; add many features to -caps mode; add data/ide/* to test -caps mode; fix many bugs in -caps mode; expose ocsmTessellate — jfdannen / detail
  99. Straighten out non-manifold WireBodies — haimes / detail
  100. Supress informational message on initial triangulation problem with Planar Faces — haimes / detail
  101. Guard against infinite loop on planar surfaces with bad initial triangulation — haimes / detail
  102. More support for tessellations without face tessellations — galbramc / detail
  103. Enable EG_finishTess to fill in missing face tessellation. — galbramc / detail
  104. Remove warnings generated by a new compiler — haimes / detail
  105. Look for python unit test timing in log parse — galbramc / detail
  106. Reduce CAPS ESP_Commit testing — galbramc / detail
  107. scipy is now available on Monterey — galbramc / detail
  108. Look for planar meshing errors — galbramc / detail
  109. Update avl and DAWIN64/mastros.exe executables — galbramc / detail
  110. astros.exe does not work on Monterey — galbramc / detail
  111. Upgrade macOS santizer library path — galbramc / detail
  112. Remove libquadmath dependency on DARWIN64 — galbramc / detail
  113. Correct avl version number to 3.40 — galbramc / detail
  114. Reduce avl NVMAX for DARWINM1 — galbramc / detail
  115. Upgrade to avl 3.41 — galbramc / detail
  116. Upgrade to MYSTRAN 13.3A on Windoze — galbramc / detail

#174 (Mar 5, 2022, 12:02:06 AM)

  1. Reconcile addHistory with writeSerialNum — haimes / detail
  2. Add history to caps_makeValue — haimes / detail
  3. Upgrade to mystran 13.3a — galbramc / detail
  4. Take away double CSM build ifdef in caps_open — haimes / detail
  5. Add CAPS open option to ignore object delete markers; return delete status in caps_info — haimes / detail
  6. Actually write the serial number in caps_writeSerialNum — haimes / detail
  7. Update legacy example — galbramc / detail
  8. lint fix and update astros Design example — galbramc / detail
  9. Stanalizer fix — galbramc / detail
  10. Fix warning — galbramc / detail
  11. Fix memory leaks. Journal caps_setValue(NULL). — galbramc / detail
  12. Only write sNum to the Problem file if that is all that is needed — haimes / detail
  13. Minor fixes & move sNum to beginning of problem file — haimes / detail
  14. Remove Bound directory during deletion and fix up internal Parameter index when there are deletions — haimes / detail
  15. re-expose su2 variables for aeroelastic cases — nitin / detail
  16. New phase deletion fleshed out — haimes / detail
  17. Remove capsLock beforey renmaing a phase on caps_close — galbramc / detail
  18. Fix logic for tracking pyCPAS ProblemState — galbramc / detail
  19. Update makefiles to run skeletonAIM example — galbramc / detail
  20. Fix skeleton AIM — galbramc / detail
  21. Hold on to and delete User Value Objects at a complete CAPS close; change the meaning of caps_delete (still need to do the deletion at start of a new phase) — haimes / detail
  22. SU2 AIM updated for SU2-7.3.0, Changed boundary markers from numbers to strings — nitin / detail
  23. SU2 AIM updated for SU2-7.3.0, Changed boundary markers from numbers to strings — nitin / detail
  24. Fix mses memory leak — galbramc / detail
  25. Fix legacy script. Add caps_intentPhrase to pyCAPS. — galbramc / detail
  26. scan-build fix — galbramc / detail
  27. Add Cheby_Mode output and sensitvities to msesAIM — galbramc / detail
  28. lint fixes — galbramc / detail
  29. Fix warnings — galbramc / detail
  30. Make relaoding AIMs lazy. Remove unused problem->exec. Enable Journaling/Phasing for aflr3 and fun3d. — galbramc / detail
  31. Fix caps_size in debug mode for Dynamic Outputs — haimes / detail
  32. Implementation of new History tracking — haimes / detail
  33. dox fix — ryan / detail
  34. lint fixes for aflr4 — galbramc / detail
  35. Enable phasing and journaling for aflr4AIM — galbramc / detail
  36. lint fixes — galbramc / detail
  37. Don't call analsysisInfo with problem object — galbramc / detail
  38. scan-build fixes — galbramc / detail
  39. Close ugrid file after reading header — galbramc / detail
  40. Use correct CAPSLONG in pyCAPS on Windoze — galbramc / detail
  41. Update caps_jrnlRead with funID — galbramc / detail
  42. Add funID to caps_jrnlWrite. Fix call to caps_ownerInfo. Fix memory leak in egadsTess. — galbramc / detail
  43. Update pyCAPS for new history tracking. Fixes in su2. Test Phasing with egads/tetgen/su2. — galbramc / detail
  44. Move CAPS towards the new history tracking — haimes / detail
  45. Revert changes in CAPS/src from previous accidental commit — galbramc / detail
  46. Fix training files from last commit. Remove bodyTessMappingStruct in lieu of .mixed attribute. Fixes for Journaling. Fixes for autoExec when the upstream AIM unputs are dirty. Store mesh on disk for egadsTessAIM to work with Journaling and Phasing. Update tetgenAIM to work with Journaling and Phasing. Add tetgen pyCAPS unit tests. — galbramc / detail
  47. Remove caps_freeOwner from pyCAPS. Add commented out caps_getHistory and caps_intentPhrase for the future. — galbramc / detail
  48. Put caps_freeOwner back in the def file — haimes / detail
  49. remove caps_setOwner from caps.py — jfdannen / detail
  50. Prepare for history changes — haimes / detail
  51. Add aim_readBinaryUgridHeader — galbramc / detail
  52. Remove addHistory and getHistory from pyCAPS — galbramc / detail
  53. Allow for removing the entire phase at caps_close — haimes / detail
  54. Don't call caps_delete in pyCAPS for now — galbramc / detail
  55. Add aim_rmFile — galbramc / detail
  56. Change pyCAPS caps_triangulate to caps_getTriangles — galbramc / detail
  57. Add caps_printErrors; change caps_triangulate to caps_getTriangles and other fixes — haimes / detail
  58. Some dox cleanup for tacsAIM — galbramc / detail
  59. tacs dox fix — ryan / detail
  60. fixes for 'Flow' directory switching for fun3dAIM — ryan / detail
  61. Update flowchart viewing and check for parameter value object uniqueness — haimes / detail
  62. Track closure of problem object to avoid calling caps_delete. This will leak attributes for now if the problem object is explicitly closed. — galbramc / detail
  63. Track closure of problem object to avoid calling caps_delete. This will leak attributes for now if the problem object is explicitly closed. — galbramc / detail
  64. Training fix — galbramc / detail
  65. Undo accidental change — galbramc / detail
  66. Some more training fixes — galbramc / detail
  67. Fix comments in training examples — galbramc / detail
  68. dox fixes — galbramc / detail
  69. Require using Design_Variable_Relation for bdf files. — galbramc / detail
  70. dox fix to clarify symmetry boundary condition requirements for fun3d — ryan / detail
  71. Disable autoExecution for functions in capsBase when in debug mode — haimes / detail
  72. Add newline to printing of tuples that are NULL — haimes / detail
  73. Fix memory leak from last commits — haimes / detail
  74. Remove debug prints — haimes / detail
  75. Update outputObjects and add Body and Tess count to AIM info for printObjects — haimes / detail
  76. Remove the regeneration of FieldIn DataSets during AIM restart — haimes / detail
  77. Revamp the way postAnalysis gets invoked during recycling — haimes / detail
  78. Fix jouranling bug — galbramc / detail
  79. Remove first OCSM build when starting a new phase updating the CSM script; don't write out value objects with the link nullified — haimes / detail
  80. Add None arguments to outputObjects — galbramc / detail
  81. Add stream output option to caps_outputObjects — haimes / detail
  82. Add outputObjects to capsProblem — galbramc / detail
  83. Fix bug found by Stanalyzer output — haimes / detail
  84. First cut at DongJoon's CAPS flowchart (debugging) — haimes / detail
  85. Makefile updates to supress Python builds — haimes / detail
  86. first implementation of CAPS menu in ESP — jfdannen / detail
  87. update statement descriptions in ESP-help — jfdannen / detail
  88. allow branching of Phases when running serveESP in -caps mode — jfdannen / detail
  89. caps_PrintObjects signature changed — haimes / detail
  90. allow wild-carding (with 0) in SELECT ADD and SELECT SUB; update connect9a and connect9b; update Makefile.DARWIN64 for 3-way testing — jfdannen / detail
  91. in timViewer, use smoothing shading when looking at BOUNDS; allow wild-carding (with 0) in SELECT ADD and SELECT SUB; update Makefile.DARWIN64 for 3-way testing — jfdannen / detail
  92. add viewing of BOUNDS in timViewer; allow GetToken in tim.c to work if the text string does not end in a delimiter; improve error message generated when SKVAR does not contain triplets; improve CAPS summary at end if running in -caps mode — jfdannen / detail
  93. in timViewer, use a tessellation associated with the AIM if available, otherwise share the tessellation with OpenCSM — jfdannen / detail
  94. fix (long) cast in previous commit — jfdannen / detail
  95. extend STORE such that if index=-1, the first available index is used; fix bug that generated two copies of Bodys on stack when RESTOREing with index<0; if running serveESP in -caps mode, get MODL from CAPS (instead of building it in OpenCSM); extend timViewer to view Bodys associated with an AIM — jfdannen / detail
  96. fix bug that either hangs or seg faults serveESP if user closes browser while timPyscript is executing.  this is done by not calling Py_Finalize, which will result in a memory leak; fix bug that occasionally does not show pyscript file when serveESP is starterd with a .py file — jfdannen / detail
  97. fix bug in esp.py to account from change from timPython to timPyscript — jfdannen / detail
  98. improve error message when project.csm exists before the project directorry when running serveESP in -caps mode — jfdannen / detail
  99. improve the creation, editting, and removal of Caps Values in -caps mode; allow multi-valued Caps Values in ESP; add udfShadow and shadow* test cases — jfdannen / detail
  100. added numpts argument to udpKulfan, which helps avoid small dimples near the leading edge of a very thin section — jfdannen / detail
  101. add debug GRAFICs to udpKulfan — jfdannen / detail
  102. add SELECT LOOP to get Edges associated with a Loop in a Face; allow unary + or - in front of (multi-valued) Parameter when used alone in an expression; add sectionsWithHoles* test cases — jfdannen / detail
  103. create hollowSheet and hollowSolid test cases to show all possibile uses of HOLLOW command; improve description of HOLLOW in OpenCSM.h; if HOLLOW fails, input Body is left on the stack; add hollowE* test cases to show some of the limitations of HOLLOW; change timPython to timPyscript to get around problems with linking with python on Windoze; have OpenCSM return SUCCESS even when all the Bodys have been recycled; put note in ESP-help and OpenCSM.h that warns users that results from HOLLOW and SWEEP may be unpredicable due to OpenCASCADE issues; add timPlotter and plotter* test cases — jfdannen / detail
  104. Config change — haimes / detail
  105. Explicitly open files as bindary in EG_saveTess/EG_loadTess. — galbramc / detail
  106. Upgrade to Mystran 13.3a — galbramc / detail
  107. Another python suppression — galbramc / detail
  108. Update jenkins to run skeletonAIM example — galbramc / detail
  109. Upgrade to SU2-v7.3.0 for Jenkins — galbramc / detail
  110. Update error messages — galbramc / detail

#172 (Feb 5, 2022, 12:02:08 AM)

  1. Fix caps_rmWild to support spaces in path — haimes / detail
  2. Try to get by Cart3D tests again — haimes / detail
  3. Make sure there is enough room for commands with quoted paths — haimes / detail
  4. Allow for spaces in Problem paths — haimes / detail
  5. Documentation updates and raise an error when caps_open is given a path with an included space — haimes / detail
  6. Fix last commit — galbramc / detail
  7. Try to plug unitialized values from last commit — haimes / detail
  8. Implement a debug mode that does not journal or autoExec/autoFill — haimes / detail
  9. Update .sens file for tacsAIM and fun3dAIM. Add Phasing test for avl. — galbramc / detail
  10. add functional to fun3d options (undocumented) — ryan / detail
  11. Fix writeTecplot — galbramc / detail
  12. Fix for updated pyCAPS constructors — galbramc / detail
  13. Fix last commit — galbramc / detail
  14. Another try at fixing the memory leak. Update pyCAPS for the new caps_triangulate. Add caps_phaseStatus to pyCAPS. — galbramc / detail
  15. Lets try that again — galbramc / detail
  16. Another memory leak fix — galbramc / detail
  17. Update caps.def — galbramc / detail
  18. Update aimTransferUtilTest to test caps_ functions — galbramc / detail
  19. Fix memory leaks from last commit — haimes / detail
  20. Add mesh information to the data returned from caps_triangulate — haimes / detail
  21. Adjust the calling sequence of caps_open to be consistent with the documentation — haimes / detail
  22. Fix deriv bug in caps_writeValue — galbramc / detail
  23. Fix memory corruption from cut & paste — haimes / detail
  24. Add file handling functions to the def file — haimes / detail
  25. Fix SegFault in caps_open CSM reload — haimes / detail
  26. Regression test fixes — galbramc / detail
  27. Update legacy test for PointwiseV18.5R1 — galbramc / detail
  28. Try to fix Stanalyzer error from last commit — haimes / detail
  29. Some corrections to Phase start with CSM reload — haimes / detail
  30. Try again to fix Stanalyzer (scan-build) errors — haimes / detail
  31. Try to fix Stanalyzer (scan-build) errors — haimes / detail
  32. Implementation of new phase startup with CSM script reload -- needs more tessting — haimes / detail
  33. Suppress lint — galbramc / detail
  34. Ignore zero lenth units string in caps_makeValue — galbramc / detail
  35. Fix warning and relax tolerance — galbramc / detail
  36. Fix for caps_getDeriv. Lots of updates to msesAIM — galbramc / detail
  37. Fix for caps_hasDeriv — galbramc / detail
  38. Allow pyCAPS.Problem construction with a capsObj — galbramc / detail
  39. Add missing reference quanteties — galbramc / detail
  40. Updated legacy 'truth' avl values — galbramc / detail
  41. Upgrade pointwimse AIM to support Pointwise 18.5. Rotate airfoils for astros. Add error checking for capsReference quantities in avl. — galbramc / detail
  42. fix bug in ocsmPrintEgo when called on BSPLINE Curve or Surface; require positive scale factors in udfNuscale when applied to a SolidBody; add initial version of timPlotter and test cases; change GetToken in tim.c so that tokens can have unlimited length — jfdannen / detail
  43. fix errors that occur because Py_Finalize cannot be used more than once (because of a numpy bug); fix bug that did not show Cvals for -caps runs in serveESP and Brchs when running without -caps — jfdannen / detail
  44. update Caps Value handling in ESP — jfdannen / detail
  45. do not show Branches in serveESP when in -caps mode; allow serveESP to change .csm file when in -caps mode; fix OpenCSM.c to remove stanalizer error — jfdannen / detail
  46. for a UDP/UDF, only use finite differences if one of its arguements is ATTRREAL and has non-zero dots — jfdannen / detail
  47. add growing3.py test case — jfdannen / detail
  48. modify timPython to get around numPy problems associated with Py_Finalize; modify tim interface to allow a tim to perform cleanup at the end of serveESP — jfdannen / detail
  49. fix tessellation sensitivity bug associated with SheetBodys that are INTERSECTed with a SolidBody; add designP5* test cases; fix Node sensitivity for two parallel Edges; move timViewer from Makefile to serveESP.make; add tufts for Nodes when displaying tessellation sesnitivities in serveESP; ensure that tessellation sensitivities on the boundaries of Face and ends of Edges agree with Edge and Node sensitivities; update .tsen files — jfdannen / detail
  50. remove serveESP from Makefile and NMakefile; create serveESP.make and serveESP.mak — jfdannen / detail
  51. index.lt.0 in RESTORE is now a wildcard, meaning that Bodys in all storages that match name are put onto the stack; initial integration of CAPS into serveESP — jfdannen / detail
  52. update ESP_QuickReference; update ESP so that double-clicking in MessageWindow takes you to filename:linenum that is clicked on, else takes you to last filename:linenum in MessageWindow; update sensCSM to use RMS errors; reduce ratio of errors for alerts from 5 to 2; update .gsen and .tsen files for 7.4.1 and 7.6.0 — jfdannen / detail
  53. fix ocsm.def for last commit — jfdannen / detail
  54. implement Debug in .csm editor; fix a few bugs in parent/child Body pointers — jfdannen / detail
  55. fix bugs associated with running a .py file — jfdannen / detail
  56. improve tessellation sensitivities for Edges and Faces that are not trimmed by a boolean operation; update .tsen files — jfdannen / detail
  57. Effective Topology: fix memory problem with interior Edge (in Loop twice) — haimes / detail
  58. Remove Degenerate EEdges once Faces are merged in an EFace — haimes / detail
  59. Documentation updates — haimes / detail
  60. Only consider Python 3.8 or newer in makeEnv/winEnv — galbramc / detail
  61. Some config updates — haimes / detail
  62. Export Body CSystems that ar free-standing (aLen = 9) — haimes / detail
  63. Update egads_dot.h. Explicit makefile in scan-build/scan-view. — galbramc / detail
  64. change startup messages in wvServer from stderr to stdout — jfdannen / detail
  65. Add missing DEGENERATE Edge check to EG_exportModel — galbramc / detail
  66. Properly reflect the move of OCC copies in this repository — haimes / detail
  67. Fix array out-of-bounds in EG_extrude_dot — galbramc / detail
  68. When splitting periodic Faces convert the order 1 BSpline to a Line; allow for calling wv_cleanupServers when there are active server threads — haimes / detail
  69. Don't fix Faces for EG_makeTopology(SOLIDBODY) — galbramc / detail
  70. Upgrade to PointwiseV18.5R1 on macOS — galbramc / detail
  71. Another python suppression — galbramc / detail
  72. Don't build CAPS for OpenCSM with lint — galbramc / detail
  73. Upgrade to Pointwise V18.5R1 on reynolds. Compile serveESP for stanalizer — galbramc / detail
  74. Build serveESP — galbramc / detail
  75. Add csmOCCFailure_7.6.txt file — galbramc / detail
  76. Remove csmOCCFailure_7.6.txt directory — galbramc / detail