From b2f6558ae7099ab55285abeab0ae25862664070c Mon Sep 17 00:00:00 2001 From: Harshal Pohekar <106588300+hpohekar@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:59:57 +0530 Subject: [PATCH] docs: PyFluent cheat sheet (#3481) * docs: PyFluent cheat sheet * docs: PyFluent cheat sheet * docs: PyFluent cheat sheet * docs: PyFluent cheat sheet * docs: PyFluent cheat sheet * docs: PyFluent cheat sheet --- .github/workflows/ci.yml | 16 + .gitignore | 1 + doc/source/_static/temp_contour.png | Bin 0 -> 61559 bytes doc/source/cheatsheet/.gitignore | 1 + doc/source/cheatsheet/cheat_sheet.qmd | 1152 +++++++++++++++++++++++++ doc/source/conf.py | 6 + 6 files changed, 1176 insertions(+) create mode 100644 doc/source/_static/temp_contour.png create mode 100644 doc/source/cheatsheet/.gitignore create mode 100644 doc/source/cheatsheet/cheat_sheet.qmd diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fca10c4c4a..76a03d58971 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,6 +115,22 @@ jobs: restore-keys: | Python-${{ runner.os }}-${{ matrix.python-version }} + - name: Install Quarto + uses: quarto-dev/quarto-actions/setup@v2 + with: + tinytex: true + + - name: Check Quarto Version + shell: bash + run: | + quarto --version + + - name: "Install Poppler for PDF to PNG conversion" + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y poppler-utils + - name: Install pyfluent run: make install diff --git a/.gitignore b/.gitignore index 53b9b4e9691..be94946d083 100644 --- a/.gitignore +++ b/.gitignore @@ -127,6 +127,7 @@ ENV*/ # mkdocs documentation /site +/.quarto/ # mypy .mypy_cache/ diff --git a/doc/source/_static/temp_contour.png b/doc/source/_static/temp_contour.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2555beff821ec79fd69e6b52bbea892d46beb5 GIT binary patch literal 61559 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 literal 0 HcmV?d00001 diff --git a/doc/source/cheatsheet/.gitignore b/doc/source/cheatsheet/.gitignore new file mode 100644 index 00000000000..2efb7a86116 --- /dev/null +++ b/doc/source/cheatsheet/.gitignore @@ -0,0 +1 @@ +/.quarto/ \ No newline at end of file diff --git a/doc/source/cheatsheet/cheat_sheet.qmd b/doc/source/cheatsheet/cheat_sheet.qmd new file mode 100644 index 00000000000..713e4c15621 --- /dev/null +++ b/doc/source/cheatsheet/cheat_sheet.qmd @@ -0,0 +1,1152 @@ +--- +title: PyFluent cheat sheet +format: cheat_sheet-pdf +version: 0.1.0 +footer: PyFluent +footerlinks: + - urls: 'https://fluent.docs.pyansys.com/version/stable/' + text: Documentation + - urls: 'https://fluent.docs.pyansys.com/version/stable/getting_started/index.html' + text: Getting started + - urls: 'https://fluent.docs.pyansys.com/version/stable/examples/index.html' + text: Examples + - urls: 'https://fluent.docs.pyansys.com/version/stable/api/index.html' + text: API reference + - urls: 'https://fluent.docs.pyansys.com/version/stable/getting_started/faqs.html' + text: FAQ + - urls: 'https://github.com/ansys/pyfluent/discussions' + text: Discussions + - urls: 'https://github.com/ansys/pyfluent/issues' + text: 'Issues' +execute: + eval: false +jupyter: + jupytext: + text_representation: + extension: .qmd + format_name: quarto + format_version: '1.0' + jupytext_version: 1.16.4 + kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +### Launch and exit a meshing session + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +meshing = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.MESHING) +meshing.exit() +``` + +### Launch and exit a solver session + +```{python} +#| eval: false +solver = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER) +solver.exit() +``` + +### Dimension, Precision, Processor count, Product version + +```{python} +#| eval: false +solver = pyfluent.launch_fluent( + dimension=pyfluent.Dimension.THREE, + precision=pyfluent.Precision.DOUBLE, + processor_count=2, + product_version=pyfluent.FluentVersion.v242 + ) +``` + +### Connect to an existing instance of Fluent + +```{python} +#| eval: false +fluent = pyfluent.connect_to_fluent( + ip="127.0.0.1", + port=50000, + password="abcdefg") +``` + +### Watertight geometry meshing workflow + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +import_file_name = examples.download_file('mixing_elbow.pmdb', 'pyfluent/mixing_elbow') +meshing = pyfluent.launch_fluent( + mode="meshing", precision=pyfluent.Precision.DOUBLE, processor_count=2 +) +wt = meshing.watertight() +wt.import_geometry.file_name.set_state( + import_file_name) +wt.import_geometry.length_unit.set_state('in') +wt.import_geometry() +``` + +### Add local sizing + +```{python} +#| eval: false +wt.add_local_sizing.add_child_to_task() +wt.add_local_sizing() +``` + +### Generate surface mesh + +```{python} +#| eval: false +csm = wt.create_surface_mesh +csmc = csm.cfd_surface_mesh_controls +csmc.max_size.set_state(0.3) +wt.create_surface_mesh() +``` + +### Describe geometry + +```{python} +#| eval: false +wt.describe_geometry.update_child_tasks( + setup_type_changed=False) +wt.describe_geometry.setup_type.set_state("The geometry consists of only fluid regions with no voids") +wt.describe_geometry.update_child_tasks( + setup_type_changed=True) +wt.describe_geometry() +``` + +### Update boundaries + +```{python} +#| eval: false +ub = wt.update_boundaries +ub.boundary_label_list.set_state(["wall-inlet"]) +ub.boundary_label_type_list.set_state(["wall"]) +ub.old_boundary_label_list.set_state( + ["wall-inlet"]) +ub.old_boundary_label_type_list.set_state( + ["velocity-inlet"]) +ub() +``` + +### Update regions + +```{python} +#| eval: false +wt.update_regions() +``` + +### Add boundary layers + +```{python} +#| eval: false +wt.add_boundary_layer.add_child_to_task() +wt.add_boundary_layer.insert_compound_child_task() +wt.task("smooth-transition_1" + ).bl_control_name.set_state( + "smooth-transition_1") +wt.add_boundary_layer.arguments = {} +wt.task("smooth-transition_1")() +``` + +### Generate volume mesh + +```{python} +#| eval: false +wt.create_volume_mesh.volume_fill.set_state( + "poly-hexcore") +vfc = wt.create_volume_mesh.volume_fill_controls +vfc.hex_max_cell_length.set_state(0.3) +wt.create_volume_mesh() +``` + +### Switch to solution mode + +```{python} +#| eval: false +solver = meshing.switch_to_solver() +``` + +### Boundary conditions + +```{python} +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +file_name = examples.download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow") +solver = pyfluent.launch_fluent() +solver.settings.file.read_case( + file_name=file_name) +bc = solver.settings.setup.boundary_conditions +cold_inlet = bc.velocity_inlet["cold-inlet"] +cold_inlet.momentum.velocity.set_state(0.4) +inlet_turbulence = cold_inlet.turbulence +turbulence_specification = inlet_turbulence.turbulence_specification +turbulence_specification.allowed_values() +turbulence_specification.set_state("Intensity and Hydraulic Diameter") +turbulent_intensity = inlet_turbulence.turbulent_intensity +turbulent_intensity.min(), turbulent_intensity.max() +turbulent_intensity.set_state(0.5) +inlet_turbulence.hydraulic_diameter.set_state("4 [in]") +cold_inlet.thermal.temperature.set_state(293.15) +``` + +### Cell zone conditions + +```{python} +#| eval: false +cz = solver.settings.setup.cell_zone_conditions +cz.fluid["elbow-fluid"].laminar.set_state(True) +``` + +### Copy material from database + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +file_name = examples.download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow") +solver = pyfluent.launch_fluent() +solver.settings.file.read_case(file_name=file_name) +materials = solver.settings.setup.materials +fluids = materials.fluid +fluids.make_a_copy(from_="air",to="air-2") +air_copy = fluids["air-2"] +air_copy.viscosity.value.set_state(1.81e-05) +cz = solver.settings.setup.cell_zone_conditions +cz.fluid["elbow-fluid"].material.set_state("air-2") +``` + +### Access the object state using pprint + +```{python} +#| eval: false +from pprint import pprint +pprint(air_copy.get_state(), width=1) +pprint(air_copy.viscosity.option.allowed_values(), width=1) +``` + +### Create new material + +```{python} +#| eval: false +mysolid = materials.solid.create("mysolid") +mysolid.chemical_formula.set_state("SiO2") +mysolid.density.value.set_state(2650) +mysolid.specific_heat.value.set_state(1887) +mysolid.thermal_conductivity.value.set_state(7.6) +``` + +### Energy model + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +file_name = examples.download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow") +solver = pyfluent.launch_fluent() +solver.settings.file.read_case(file_name=file_name) +energy = solver.settings.setup.models.energy +energy.enabled.get_state() +from pprint import pprint +pprint(energy.get_state(), width=1) +energy.enabled.set_state(False) +pprint(energy.get_state(), width=1) +energy.enabled.set_state(True) +pprint(energy.get_state(), width=1) +energy.viscous_dissipation.set_state(True) +pprint(energy.get_state(), width=1) +``` + +### Viscous model + +```{python} +#| eval: false +vs = solver.settings.setup.models.viscous +from pprint import pprint +pprint(vs.get_state(), width=1) +pprint(vs.model.allowed_values(), width=1) +vs.options.corner_flow_correction.is_active() +vs.model.set_state('k-epsilon') +vs.options.corner_flow_correction.is_active() +vs.k_epsilon_model.get_state() +vs.k_omega_model.is_active() +vs.k_epsilon_model.allowed_values() +vs_ops = vs.options +vs_ops.production_kato_launder_enabled.is_active() +vs_ops.production_kato_launder_enabled.get_state() +vs.k_epsilon_model.set_state("realizable") +vs_ops.production_kato_launder_enabled.is_active() +``` + +### Discrete phase model + +```{python} +#| eval: false +dpm = solver.settings.setup.models.discrete_phase +dpm_models = dpm.physical_models +dpm_vmf = dpm_models.virtual_mass_force +dpm_vmf.enabled.get_state() +dpm_vmf.virtual_mass_factor.is_active() +dpm_vmf.enabled.set_state(True) +dpm_vmf.virtual_mass_factor.get_state() +``` + +### Radiation model + +```{python} +#| eval: false +rn = solver.settings.setup.models.radiation +from pprint import pprint +pprint(rn.get_state(), width=1) +pprint(rn.model.allowed_values(), width=1) +rn.model.set_state("monte-carlo") +pprint(rn.get_state(), width=1) +rn.monte_carlo.number_of_histories.set_state(1e7) +rn.multiband.create("solar").set_state({ + "start": 0, + "end": 2.8, +}) +rn.multiband.create("thermal-ir").set_state({ + "start": 2.8, + "end": 100, +}) +radiation_freq = rn.solve_frequency +pprint(radiation_freq.get_state(), width=1) +pprint(rn.get_state(), width=1) +``` + +### Species model + +```{python} +#| eval: false +solver.settings.file.read_case(file_name=file_name) +species = solver.settings.setup.models.species +species.get_state() +from pprint import pprint +pprint(species.model.option.allowed_values(), width=1) +species.model.option.set_state("species-transport") +pprint(species.get_state(), width=1) +species.model.material.get_state() +species.model.material.allowed_values() +``` + +### Battery model + +```{python} +#| eval: false +battery = solver.settings.setup.models.battery +battery.enabled.set_state(True) +battery.solution_method.allowed_values() +``` + +### Steady or transient solution model + +```{python} +#| eval: false +solver_time = solver.settings.setup.general.solver.time +solver_time.get_state() +solver_time.allowed_values() +solver_time.set_state("unsteady-1st-order") +``` + +### Pressure-based or density-based solver + +```{python} +#| eval: false +solver_type = solver.settings.setup.general.solver.type +solver_type.get_state() +solver_type.allowed_values() +solver_type.set_state("density-based-explicit") +solver_type.get_state() +``` + +### Velocity coupling scheme and gradient options + +```{python} +#| eval: false +methods = solver.settings.solution.methods +flow_scheme = methods.p_v_coupling.flow_scheme +flow_scheme.allowed_values() +flow_scheme.set_state("Coupled") +gradient_scheme = methods.gradient_scheme +gradient_scheme.allowed_values() +gradient_scheme.set_state("green-gauss-node-based") +``` + +### Solution controls + +```{python} +#| eval: false +pvc = solver.settings.solution.controls.p_v_controls +emur = pvc.explicit_momentum_under_relaxation +emur.min() +emur.max() +emur.set_state(0.4) +flow_courant_number = pvc.flow_courant_number +flow_courant_number.min() +flow_courant_number.max() +flow_courant_number.set_state(0.3) +``` + +### Create a report definition + +```{python} +#| eval: false +rep_defs = solver.settings.solution.report_definitions +surface = rep_defs.surface +defn_name = "outlet-temp-avg" +surface[defn_name] = {} +out_temp = surface[defn_name] +out_temp.report_type.set_state("surface-massavg") +out_temp.field.set_state("temperature") +``` + +### Initialize and solve + +```{python} +#| eval: false +solution = solver.settings.solution +solution.initialization.hybrid_initialize() +solution.run_calculation.iterate(iter_count=100) +``` + +### CaseFile reader + +```{python} +#| eval: false +from ansys.fluent.core import examples +from ansys.fluent.core.filereader.case_file import CaseFile +case_file_name = examples.download_file( + "Static_Mixer_Parameters.cas.h5", + "pyfluent/static_mixer") +reader = CaseFile(case_file_name=case_file_name) +reader.precision() +reader.num_dimensions() +{p.name: p.value for p in reader.input_parameters()} +{p.name: p.units for p in reader.output_parameters()} +``` + +### Additionl features + +```{python} +#| eval: false +reader = CaseFile( + project_file_name="Dir1/Dir2/project.flprj") +reader.rp_vars() +reader.config_vars() +``` + +### Extract mesh data + +```{python} +#| eval: false +from ansys.fluent.core import examples +from ansys.fluent.core.filereader.case_file import CaseFile +case_file_name = examples.download_file("elbow1.cas.h5", "pyfluent/file_session") +reader = CaseFile(case_file_name=case_file_name) +reader.get_mesh().get_surface_ids() +reader.get_mesh().get_surface_names() +reader.get_mesh().get_surface_locs(3) +reader.get_mesh().get_connectivity(3) +reader.get_mesh().get_vertices(3) +``` + +### DataFile reader + +```{python} +#| eval: false +from ansys.fluent.core import examples +from ansys.fluent.core.filereader.data_file import DataFile +from ansys.fluent.core.filereader.case_file import CaseFile +data_file_name = examples.download_file("elbow1.dat.h5", "pyfluent/file_session") +reader = DataFile( + data_file_name=data_file_name, + case_file_handle=CaseFile(case_file_name)) +reader.case_file +reader.variables() +reader.get_phases() +reader.get_face_variables("phase-1") +``` + +### Single-phase FileSession + +```{python} +#| eval: false +from ansys.fluent.core import examples +from ansys.fluent.core.file_session import FileSession +case_file_name = examples.download_file("elbow1.cas.h5", "pyfluent/file_session") +data_file_name = examples.download_file("elbow1.dat.h5", "pyfluent/file_session") +fs = FileSession() +fs.read_case(case_file_name) +fs.read_data(data_file_name) +fs.fields.field_info.get_scalar_field_range("SV_T") +fs.fields.field_info.get_surfaces_info() +fs.fields.field_info.get_scalar_fields_info() +``` + +### Multiphase FileSession + +```{python} +#| eval: false +from ansys.fluent.core import examples +from ansys.fluent.core.file_session import FileSession +case_file_name = examples.download_file( + "mixing_elbow_mul_ph.cas.h5", + "pyfluent/file_session") +data_file_name = examples.download_file( + "mixing_elbow_mul_ph.dat.h5", + "pyfluent/file_session") +fs = FileSession() +fs.read_case(case_file_name) +fs.read_data(data_file_name) +fs.fields.field_info.get_scalar_field_range( + "phase-2:SV_P") +fs.fields.field_info.get_scalar_fields_info() +``` + +### Post-processing using [ansys-fluent-visualization](https://visualization.fluent.docs.pyansys.com/version/stable/) + +```{python} +#| eval: false +from ansys.fluent.visualization import set_config +set_config(blocking=True, set_view_on_display="isometric") +import ansys.fluent.core as pyfluent +from ansys.fluent.visualization.matplotlib import Plots +from ansys.fluent.visualization.pyvista import Graphics +from ansys.fluent.core.file_session import FileSession +fileSession=FileSession() +fileSession.read_case("elbow1.cas.h5") +fileSession.read_data("elbow1.dat.h5") +graphics = Graphics(session=fileSession) +``` + +### Display mesh at wall + +```{python} +#| eval: false +mesh1 = graphics.Meshes["mesh-1"] +mesh1.show_edges = True +mesh1.surfaces_list = [ "wall"] +mesh1.display("w1") +``` + +### Display temperature contour at symmetry + +```{python} +#| eval: false +contour1 = graphics.Contours["mesh-1"] +contour1.node_values = False +contour1.field = "SV_T" +contour1.surfaces_list = ['symmetry'] +contour1.display('w2') +``` + +### Display velocity vector data at symmetry and wall + +```{python} +#| eval: false +velocity_vector = graphics.Vectors["velocity-vector"] +velocity_vector.field = "SV_T" +velocity_vector.surfaces_list = ['symmetry', 'wall'] +velocity_vector.display("w3") +``` + +![Temperature contour](../_static/temp_contour.png) + +### Accessing field data objects + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +import_file_name = examples.download_file("mixing_elbow.msh.h5", "pyfluent/mixing_elbow") +solver = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER) +solver.settings.file.read(file_type="case", file_name=import_file_name) +init = solver.settings.solution.initialization +init.hybrid_initialize() +field_data = solver.fields.field_data +``` + +### Get surface data + +```{python} +#| eval: false +from ansys.fluent.core.services.field_data import SurfaceDataType +vertices_data = field_data.get_surface_data( + surface_name="cold-inlet", + data_type=SurfaceDataType.Vertices) +vertices_data.size +vertices_data.surface_id +vertices_data[5].x +vertices_data[5].y +vertices_data[5].z +faces_normal_data = field_data.get_surface_data( + data_type=SurfaceDataType.FacesNormal, surface_name="cold-inlet" +) +faces_centroid_data = field_data.get_surface_data( + data_type=SurfaceDataType.FacesCentroid, surface_name="cold-inlet" +) +faces_connectivity_data = field_data.get_surface_data( + data_type=SurfaceDataType.FacesConnectivity, surface_name="cold-inlet" +) +faces_connectivity_data[5].node_count +faces_connectivity_data[5].node_indices +``` + +### Get scalar field data + +```{python} +#| eval: false +abs_press_data = field_data.get_scalar_field_data( + field_name="absolute-pressure", + surface_name="cold-inlet") +abs_press_data.size +abs_press_data[120].scalar_data +``` + +### Get vector field data + +```{python} +#| eval: false +velocity_vector_data = field_data.get_vector_field_data( + field_name="velocity", + surface_name="cold-inlet") +velocity_vector_data.size +velocity_vector_data.scale +``` + +### Get pathlines field data + +```{python} +#| eval: false +path_lines_data = field_data.get_pathlines_field_data( + field_name="velocity", + surface_name="cold-inlet") +path_lines_data["vertices"].size +path_lines_data["lines"].size +path_lines_data["velocity"].size +path_lines_data["lines"][100].node_count +path_lines_data["lines"][100].node_indices +``` + +### Accessing field info objects + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +solver = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER) +solver.settings.file.read(file_type="case-dats", file_name=mixing_elbow_case_path) +init = solver.settings.solution.initialization +init.hybrid_initialize() +field_info = solver.fields.field_info +``` + +### Get fields info and range + +```{python} +#| eval: false +field_info.get_fields_info() +field_info.get_range("velocity") +field_info.get_range("cell-weight") +``` + +### Get vector fields and surfaces info + +```{python} +#| eval: false +field_info.get_vector_fields_info() +field_info.get_surfaces_info() +``` + +### Accessing reduction functions + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core.examples import download_file +solver = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER) +case_path = download_file("Static_Mixer_main.cas.h5", "pyfluent/static_mixer") +solver.settings.file.read(file_type="case", file_name=case_path) +init = solver.settings.solution.initialization +init.hybrid_initialize() +bc = solver.settings.setup.boundary_conditions +solver.fields.reduction.area_average( + expression="AbsolutePressure", + locations= + bc.velocity_inlet +) +``` + +### Usage of reduction context + +```{python} +#| eval: false +init = solver.settings.solution.initialization +init.hybrid_initialize() +bc = solver.settings.setup.boundary_conditions +solver.fields.reduction.area( + locations=[bc.velocity_inlet["inlet1"]] +) +solver.fields.reduction.area( + locations=["inlet1"], + ctxt=solver) +``` + +### Current reduction capabilities + +```{python} +#| eval: false +reduction.area(locations) +reduction.area_average(expression, locations) +reduction.area_integral(expression, locations) +reduction.volume(locations) +reduction.volume_average(expression, locations) +reduction.volume_integral(expression, locations) +reduction.centroid(locations) +reduction.force(locations) +reduction.pressure_force(locations) +reduction.viscous_force(locations) +reduction.moment(expression, locations) +reduction.count(locations) +reduction.count_if(condition, locations) +reduction.minimum(expression, locations) +reduction.maximum(expression, locations) +reduction.mass_average(expression, locations) +reduction.mass_integral(expression, locations) +reduction.mass_flow_average_absolute(expression, locations) +reduction.mass_flow_average(expression, locations) +reduction.mass_flow_integral(expression, locations) +reduction.sum(expression, locations, weight) +reduction.sum_if(expression, condition, locations, weight) +``` + +### Reduction example use cases + +```{python} +#| eval: false +bc = solver.settings.setup.boundary_conditions + +area_inlet_1 = solver.fields.reduction.area( + locations=[bc.velocity_inlet["inlet1"]]) +area_inlet = solver.fields.reduction.area( + locations=[bc.velocity_inlet]) +solver.fields.reduction.area_integral( + expression="AbsolutePressure", + locations=[bc.velocity_inlet["inlet1"]]) +solver.fields.reduction.centroid( + locations=[bc.velocity_inlet["inlet2"]]) +solver.fields.reduction.moment( + expression="Force(['wall'])", + locations=[bc.velocity_inlet["inlet2"]]) +solver.fields.reduction.moment( + expression="['inlet1']", + locations=[bc.velocity_inlet["inlet2"]]) +solver.fields.reduction.sum( + expression="AbsolutePressure", + locations=[bc.velocity_inlet], + weight="Area") +solver.fields.reduction.sum_if( + expression="AbsolutePressure", + condition="AbsolutePressure > 0[Pa]", + locations=[bc.velocity_inlet], + weight="Area") +``` + +### Accessing solution variable objects + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +import_filename = examples.download_file("mixing_elbow.msh.h5", "pyfluent/mixing_elbow") +solver = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER) +solver.settings.file.read(file_type="case", file_name=import_filename) +solution_variable_info = solver.fields.solution_variable_info +solution_variable_data = solver.fields.solution_variable_data +``` + +### Get zone information + +```{python} +#| eval: false +zones_info = solution_variable_info.get_zones_info() +zones_info.domains +zones_info.zones +zone_info = zones_info['wall'] +zone_info +zone_info.name +zone_info.count +zone_info.zone_id +zone_info.zone_type +``` + +### Get solution variable information + +```{python} +#| eval: false +wall_fluid_info = solution_variable_info.get_variables_info( + zone_names=['wall' , "fluid"], + domain_name="mixture") +wall_fluid_info.solution_variables +solution_variable_info_centroid = wall_fluid_info['SV_CENTROID'] +solution_variable_info_centroid +solution_variable_info_centroid.name +solution_variable_info_centroid.dimension +solution_variable_info_centroid.field_type +``` + +### Get solution variable data + +```{python} +#| eval: false +sv_t_wall_fluid= solution_variable_data.get_data( + solution_variable_name="SV_T", + zone_names=["fluid", "wall"], + domain_name="mixture") +sv_t_wall_fluid.domain +sv_t_wall_fluid.zones +fluid_temp = sv_t_wall_fluid['fluid'] +fluid_temp.size +fluid_temp.dtype +fluid_temp +``` + +### Set solution variable data + +```{python} +#| eval: false +wall_temp_array = solution_variable_data.create_empty_array( + "SV_T", "wall", "mixture") +fluid_temp_array = solution_variable_data.create_empty_array( + "SV_T", "fluid", "mixture") +wall_temp_array[:] = 500 +fluid_temp_array[:] = 600 +zone_names_to_solution_variable_data = {'wall':wall_temp_array, 'fluid':fluid_temp_array} +solution_variable_data.set_data( + solution_variable_name="SV_T", + zone_names_to_solution_variable_data= + zone_names_to_solution_variable_data, + domain_name="mixture") +``` + +### Multiple requests in a single transaction + +```{python} +#| eval: false +transaction = solver.fields.field_data.new_transaction() + +transaction.add_surfaces_request( + surface_ids=[1], provide_vertices=True, provide_faces=False, provide_faces_centroid=True +) +transaction.add_surfaces_request( + surface_ids=[2], provide_vertices=True, provide_faces=True +) +transaction.add_scalar_fields_request( + surface_ids=[1,2], field_name="temperature", node_value=True, boundary_value=True +) +transaction.add_vector_fields_request( + surface_ids=[1,2], + field_name="velocity") +transaction.add_pathlines_fields_request( + surface_ids=[1,2], + field_name="temperature") + +payload_data = transaction.get_fields() +``` + +### Field data allowed values + +```{python} +#| eval: false +sfd = field_data.get_scalar_field_data +sfd.field_name.allowed_values() +sfd.surface_name.allowed_values() + +transaction = field_data.new_transaction() +asfr = transaction.add_scalar_fields_request +asfr.field_name.allowed_values() + +sd = field_data.get_surface_data +sd.surface_ids.allowed_values() +``` + +### Monitor convergence of a solution + +```{python} +#| eval: false +# get started with case and data loaded +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +import pandas as pd +from tabulate import tabulate +solver = pyfluent.launch_fluent(start_transcript=False) +import_case = examples.download_file( + file_name="exhaust_system.cas.h5", directory="pyfluent/exhaust_system" +) +import_data = examples.download_file( + file_name="exhaust_system.dat.h5", directory="pyfluent/exhaust_system" +) +solver.file.read_case_data(file_name=import_case) +# check the active report plot monitors using the settings relevant object +solver.settings.solution.monitor.report_plots() +# initialize so that monitors object is usable +solver.solution.initialization.hybrid_initialize() +# check which monitors are available +sorted(solver.monitors.get_monitor_set_names()) +# create and register a callback function that will +def display_monitor_table( + monitor_set_name="mass-bal-rplot"): + def display_table(): + data = solver.monitors.get_monitor_set_data( + monitor_set_name=monitor_set_name) + # extract iteration numbers + iterations = data[0] + # filter out additional callbacks + if len(iterations) > display_table.iter_count: + display_table.iter_count = len(iterations) + # extract results + results = data[1] + # create a DataFrame + df = pd.DataFrame(results, index=iterations) + df.index.name = 'Iteration' + df.reset_index(inplace=True) + # The streamed data contains duplicates, so eliminate them + df = df.drop_duplicates(subset= + 'Iteration') + print(tabulate(df, headers='keys', tablefmt='psql')) + display_table.iter_count = 0 + return display_table + +register_id = solver.monitors.register_callback( + display_monitor_table()) +# run the solver and see the full tabulated monitor data on each iteration +solver.solution.run_calculation.iterate( + iter_count=10) +``` + +### Observing events + +```{python} +#| eval: false +from ansys.fluent.core import MeshingEvent, SolverEvent +def on_case_loaded(session, event_info): + print("Case loaded. Index = ", event_info.index) +callback = meshing.events.register_callback( + MeshingEvent.CASE_LOADED, on_case_loaded) +def on_iteration_ended(session, event_info): + print("Iteration ended. Index = ", event_info.index) +callback_id = solver.events.register_callback( + SolverEvent.ITERATION_ENDED, on_iteration_ended) +``` + +### Transfer a case or mesh file between PyFluent sessions + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core.examples import download_file +from ansys.fluent.core.utils.data_transfer import transfer_case +mesh_file_name = download_file( + "mixing_elbow.msh.h5", + "pyfluent/mixing_elbow" +) +pure_meshing_session = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.PURE_MESHING +) +pure_meshing_session.tui.file.read_mesh( + import_file_name +) +solver_session = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER +) +transfer_case( + source_instance=meshing, + solvers=[solver], + file_type="mesh", + file_name_stem='', + num_files_to_try=1, + clean_up_temp_file=True, + overwrite_previous=True +) +``` + +### [PyAnsys Units](https://units.docs.pyansys.com/version/stable/) to work in arbitrary physical examples + +```{python} +#| eval: false +from ansys.units import Quantity +bc = solver.settings.setup.boundary_conditions +vi = bc.velocity_inlet +hyd_dia = vi["hot-inlet"].turbulence.hydraulic_diameter +hyd_dia.set_state(.02) +hyd_dia.get_state() +hyd_dia.state_with_units() +hyd_dia.set_state(Quantity(15, "mm")) +hyd_dia.state_with_units() +diam = hyd_dia.as_quantity() +diam +diam = diam * 2 +diam +hyd_dia.set_state(diam) +hyd_dia.as_quantity() +``` + +### Local file transfer service + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +from ansys.fluent.core.utils.file_transfer_service import LocalFileTransferStrategy + +mesh_file_name = examples.download_file( + "mixing_elbow.msh.h5", + "pyfluent/mixing_elbow") +meshing_session = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.MESHING, + file_transfer_service= + LocalFileTransferStrategy()) +meshing_session.upload( + file_name=mesh_file_name, + remote_file_name="elbow.msh.h5") +meshing_session.meshing.File.ReadMesh( + FileName="elbow.msh.h5") +meshing_session.meshing.File.WriteMesh( + FileName="write_elbow.msh.h5") +meshing_session.download( + file_name="write_elbow.msh.h5", + local_directory="") +``` + +### Remote file transfer service + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +from ansys.fluent.core import examples +from ansys.fluent.core.utils.file_transfer_service import RemoteFileTransferStrategy + +case_file_name = examples.download_file( + "mixing_elbow.cas.h5", + "pyfluent/mixing_elbow") +solver_session = pyfluent.launch_fluent( + mode=pyfluent.FluentMode.SOLVER, + file_transfer_service= + RemoteFileTransferStrategy()) +solver_session.upload( + file_name=case_file_name, + remote_file_name="elbow.cas.h5") +solver_session.file.read_case( + file_name="elbow.cas.h5") +solver_session.file.write_case( + file_name="write_elbow.cas.h5") +solver_session.download( + file_name="write_elbow.cas.h5", + local_directory="") +``` + +### Record Fluent interactions as Python scripts (journals) + +```{python} +#| eval: false +solver.journal.start( + file_name="pyfluent_journal.py") +solver.journal.stop() +``` + +### PyFluent logging functionality + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +config_dict = pyfluent.logging.get_default_config() +config_dict['handlers']['pyfluent_file'][ + 'filename'] = 'test.log' +pyfluent.logging.enable(custom_config=config_dict) +pyfluent.logging.list_loggers() +logger = pyfluent.logging.get_logger( + 'pyfluent.networking') +logger.setLevel('ERROR') +pyfluent.logging.set_global_level('DEBUG') +``` + +### API search + +```{python} +#| eval: false +# Semantic search +import ansys.fluent.core as pyfluent +pyfluent.search("font") + +# Whole word search +pyfluent.search("ApplicationFontSize", + match_whole_word=True) + +# Wildcard pattern search +pyfluent.search("local*", wildcard=True) +``` + +### Containerization of Fluent + +```{bash} +# Within the PyFluent source navigate to the `docker` directory. +cd pyfluent/docker + +# Copy needed files +python copy_docker_files.py ' directory> + +# Build the Docker image +sudo docker build -t ansys_inc ' directory> +``` + +### Run Docker container using the command line + +```{bash} +# Solver mode +sudo docker run -it --name ansys-inc -e ANSYSLMD_LICENSE_FILE= ansys_inc 3ddp -gu +# Meshing mode +sudo docker run -it --name ansys-inc -e ANSYSLMD_LICENSE_FILE= ansys_inc 3ddp -gu -meshing +``` + +### Run Docker container using PyFluent + +```{python} +#| eval: false +import os +import ansys.fluent.core as pyfluent +os.environ["ANSYSLMD_LICENSE_FILE"] = "" + +custom_config = { + 'fluent_image': 'ansys_inc:latest', + 'mount_source': f"{os.getcwd()}", + 'auto_remove': False} + +solver = pyfluent.launch_fluent( + container_dict=custom_config) +``` + +### Scheme code evaluation + +```{python} +#| eval: false +import ansys.fluent.core as pyfluent +S = pyfluent.services.scheme_eval.Symbol +session.scheme_eval.eval([S('+'), 2, 3]) +session.scheme_eval.eval([S('rpgetvar'), [S('string->symbol'), "mom/relax"]]) +session.scheme_eval.exec(('(ti-menu-load-string "/report/system/proc-stats")',)) +# Returns TUI output string +session.scheme_eval.string_eval("(+ 2 3)") +session.scheme_eval.string_eval("(rpgetvar 'mom/relax)") +session.scheme_eval.scheme_eval("(+ 2 3)") +session.scheme_eval.scheme_eval("(rpgetvar 'mom/relax)") +``` diff --git a/doc/source/conf.py b/doc/source/conf.py index ec4c7b71637..483cb5d730c 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -197,6 +197,12 @@ def _stop_fluent_container(gallery_conf, fname): "navbar_end": ["version-switcher", "theme-switcher", "navbar-icon-links"], "navigation_depth": -1, "collapse_navigation": True, + "cheatsheet": { + "file": "cheatsheet/cheat_sheet.qmd", + "pages": ["index", "getting_started/index", "user_guide/index"], + "title": "PyFluent cheat sheet", + "version": __version__, + }, } # -- Options for HTMLHelp output ---------------------------------------------