sandbox/acastillo/output_fields/CatalystAdaptor.h

    echo “@include <catalyst.h>” > $BASILISK/ast/std/catalyst.h

    and declade the datatypes at the end of $BASILISK/ast/defaults.h

    echo “typedef conduit_node;” >> $BASILISK/ast/defaults.h

    see https://groups.google.com/g/basilisk-fr/c/CM270hBSfWo

    #ifndef CatalystAdaptor_h
    #define CatalystAdaptor_h
    #pragma autolink -I${CATALYST_INCDIR} -L${CATALYST_LIBDIR} -lcatalyst -DPARAVIEW_IMPL_DIR=\"${CATALYST_LIBDIR}/catalyst\"
    @include <catalyst.h>
    
    //-----------------------------------------------------------------------------
    • Initialize Catalyst.
    //-----------------------------------------------------------------------------
    void do_catalyst_initialization(int argc, char* argv[]){
      conduit_node* catalyst_init_params = conduit_node_create();
      // pass scripts pass on command line.
      for (int cc = 1; cc < argc; ++cc){
        if (strcmp(argv[cc], "--output") == 0 && (cc + 1) < argc) {
          conduit_node_set_path_char8_str(catalyst_init_params, "catalyst/pipelines/0/type", "io");
          conduit_node_set_path_char8_str(catalyst_init_params, "catalyst/pipelines/0/filename", argv[cc + 1]);
          conduit_node_set_path_char8_str(catalyst_init_params, "catalyst/pipelines/0/channel", "grid");
          ++cc;
        }
        else {
          char buf[256];
          snprintf(buf, 256, "catalyst/scripts/script%d", (cc - 1));
          conduit_node_set_path_char8_str(catalyst_init_params, buf, argv[cc]);
        }
      }
      conduit_node_set_path_char8_str(catalyst_init_params, "catalyst_load/implementation", "paraview");
      conduit_node_set_path_char8_str(catalyst_init_params, "catalyst_load/search_paths/paraview", PARAVIEW_IMPL_DIR);
      enum catalyst_status err = catalyst_initialize(catalyst_init_params);
      conduit_node_destroy(catalyst_init_params);
      if (err != catalyst_status_ok)
        printf("Failed to initialize Catalyst: %d\n", err);
    }
    
    //-----------------------------------------------------------------------------
    • Execute per cycle
    //-----------------------------------------------------------------------------
    void do_catalyst_execute(int cycle, double time, CGrid* cgrid, CAttributes* attribs) {
      conduit_node* catalyst_exec_params = conduit_node_create();
      conduit_node_set_path_int64(catalyst_exec_params, "catalyst/state/timestep", cycle);
      conduit_node_set_path_float64(catalyst_exec_params, "catalyst/state/time", time);
    
      // the data must be provided on a named channel. the name is determined by the
      // simulation. for this one, we're calling it "grid".
    
      // declare the type of the channel; we're using Conduit Mesh Blueprint
      // to describe the mesh and fields.
      conduit_node_set_path_char8_str(catalyst_exec_params, "catalyst/channels/grid/type", "mesh");
    
      // now, create the mesh.
      conduit_node* mesh = conduit_node_create();
    
      // add coordsets
      conduit_node_set_path_char8_str(mesh, "coordsets/coords/type", "explicit");
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "coordsets/coords/values/x",
        /*data=*/cgrid->points, /*num_elements=*/cgrid->no_points, /*offset=*/0,
        /*stride=*/3 * sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness=*/CONDUIT_ENDIANNESS_DEFAULT_ID);
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "coordsets/coords/values/y",
        /*data=*/cgrid->points, /*num_elements=*/cgrid->no_points, /*offset=*/1 * sizeof(double),
        /*stride=*/3 * sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness=*/CONDUIT_ENDIANNESS_DEFAULT_ID);
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "coordsets/coords/values/z",
        /*data=*/cgrid->points, /*num_elements=*/cgrid->no_points, /*offset=*/2 * sizeof(double),
        /*stride=*/3 * sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness=*/CONDUIT_ENDIANNESS_DEFAULT_ID);
    
      // add topologies
      conduit_node_set_path_char8_str(mesh, "topologies/mesh/type", "unstructured");
      conduit_node_set_path_char8_str(mesh, "topologies/mesh/coordset", "coords");
      conduit_node_set_path_char8_str(mesh, "topologies/mesh/elements/shape", "hex");
      conduit_node_set_path_external_int64_ptr(mesh, "topologies/mesh/elements/connectivity", cgrid->cells, cgrid->no_cells * pow(2, dimension));
    
      //add velocity (cell-field)
      conduit_node_set_path_char8_str(mesh, "fields/velocity/association", "element");
      conduit_node_set_path_char8_str(mesh, "fields/velocity/topology", "mesh");
      conduit_node_set_path_char8_str(mesh, "fields/velocity/volume_dependent", "false");
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "fields/velocity/values/x",
        /*data=*/attribs->Velocity, /*num_elements=*/cgrid->no_cells, /*offset=*/0,
        /*stride=*/sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness*/ CONDUIT_ENDIANNESS_DEFAULT_ID);
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "fields/velocity/values/y",
        /*data=*/attribs->Velocity, /*num_elements=*/cgrid->no_cells,
        /*offset=*/cgrid->no_cells * sizeof(double),
        /*stride=*/sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness*/ CONDUIT_ENDIANNESS_DEFAULT_ID);
      conduit_node_set_path_external_float64_ptr_detailed(mesh, "fields/velocity/values/z",
        /*data=*/attribs->Velocity, /*num_elements=*/cgrid->no_cells,
        /*offset=*/2 * cgrid->no_cells * sizeof(double),
        /*stride=*/sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness*/ CONDUIT_ENDIANNESS_DEFAULT_ID);
    
      //add pressure (cell-field)
      conduit_node_set_path_char8_str(mesh, "fields/pressure/association", "element");
      conduit_node_set_path_char8_str(mesh, "fields/pressure/topology", "mesh");
      conduit_node_set_path_char8_str(mesh, "fields/pressure/volume_dependent", "false");
      conduit_node_set_path_external_float64_ptr_detailed(
        mesh, "fields/pressure/values",
        /*data=*/attribs->Pressure, /*num_elements=*/cgrid->no_cells,
        /*offset=*/0 * cgrid->no_cells * sizeof(double),
        /*stride=*/sizeof(double), /*element_bytes=*/sizeof(double),
        /*endianness*/ CONDUIT_ENDIANNESS_DEFAULT_ID);
      conduit_node_set_path_external_node(catalyst_exec_params, "catalyst/channels/grid/data", mesh);
    
      // print for debugging purposes, if needed
      // conduit_node_print(catalyst_exec_params);
    
      // print information with details about memory allocation
      // conduit_node* info = conduit_node_create();
      // conduit_node_info(catalyst_exec_params, info);
      // conduit_node_print(info);
      // conduit_node_destroy(info);
    
      enum catalyst_status err = catalyst_execute(catalyst_exec_params);
      if (err != catalyst_status_ok)
        printf("Failed to execute Catalyst: %d\n", err);
    
      conduit_node_destroy(catalyst_exec_params);
      conduit_node_destroy(mesh);
    }
    
    //-----------------------------------------------------------------------------
    • Finalize Catalyst.
    //-----------------------------------------------------------------------------
    void do_catalyst_finalization(){
      conduit_node* catalyst_fini_params = conduit_node_create();
      enum catalyst_status err = catalyst_finalize(catalyst_fini_params);
      if (err != catalyst_status_ok)
        printf("Failed to execute Catalyst: %d\n", err);
      conduit_node_destroy(catalyst_fini_params);
    }
    
    #endif