Computational Fluid Dynamics (CFD) workbench using OpenFOAM

A subforum specific to the development of the OpenFoam-based workbenches ( Cfd https://github.com/qingfengxia/Cfd and CfdOF https://github.com/jaheyns/CfdOF )

Moderator: oliveroxtoby

Post Reply
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

Thanks for the testing.
HoWil wrote: Wed Jun 14, 2017 12:28 pm After that I had some problems with your preferences-dialog for your workbench in FC.
I would like to have the possibility to manually set file paths. This enables e.g. the use of an installed version of gmsh and in parallel the use of a downloaded version. The standard gmsh verion in the repo is to old and the official from gmsh.info comes as .tgz and can be run after unzipping.
Agreed, this is on the todo list but fairly far down unfortunately. If you feel like adding this functionality that would be great ;-)
As a stopgap maybe put ~/bin at the front of your $PATH and make symlinks from there to the desired version of your executables?
I do not know if the prerequirements-checker is working on Linux. Should it work or is it only for WIN?
It should work. Is it not working for you? What output are you getting?
The installation of cfMesh from the FC-Preferences page results in "

Code: Select all

Error downloading cfMesh: [Errno 2] No such file or directory: '/home/username/OpenFOAM/username-4.1/cfMesh-v1.1.2.tar.gz'
".
Is "/home/username" the correct path for your home directory? If so, you probably just need to create the path /home/username/OpenFOAM/username-4.1 Please report if that solves the problem and I will make the fix in the code.
I tried the elbow example from https://github.com/opensimsa/opensim/tr ... /CFD/Elbow and it did work with gmesh and without cfMesh. The only setting I had to change was the max. mesh size was set to 0.0 otherwise I got "Error : Self intersecting surface mesh, computing intersections (this could take a while)".
Strangely I don't get this error - max element size is set to 1000 mm when running the .FCMacro file?
Do you plan to give some parts of your work back to FEM-wb? I like your 'advanced' dialog for selecting boundary conditions and would love to see it in FEM-wb!!!
Absolutely, the FEM wb has been very helpful for us and we'd be delighted if any of our code is of use.
Please provide all the information requested in this post before reporting problems with CfdOF.
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

HoWil wrote: Wed Jun 14, 2017 1:40 pm Also @oliveroxtoby ,@johan and (@abogaers) I just wondered ...
* If you could also use matplotlib instead of gnuplot.. would reduce the number of packages needed.
We did look at this but I think there were performance issues. Of course these could probably be circumvented by updating the plot less frequently. Will try to look into it at some point.
* If you could also check/use the settings for gmsh in FEM-wb
I'm not sure it would be obvious to the user that the two are connected - maybe better to have our own path settings.
Please provide all the information requested in this post before reporting problems with CfdOF.
HoWil
Veteran
Posts: 1279
Joined: Sun Jun 14, 2015 7:31 pm
Location: Austria

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by HoWil »

oliveroxtoby wrote: Thu Jun 15, 2017 7:56 am We did look at this but I think there were performance issues. Of course these could probably be circumvented by updating the plot less frequently. Will try to look into it at some point.
Hi oliver,
I had some spare time and added some lines into 'CfdRunnableFoam.py' to support plotting with matplotlib under qt. This could make the separate gnuplot package for CFDFoam obsolete since matplotlib isincluded in FC anyway.

Code: Select all

# ***************************************************************************
# *                                                                         *
# *   Copyright (c) 2015 - Qingfeng Xia <qingfeng.xia()eng.ox.ac.uk>        *
# *   Copyright (c) 2017 - Alfred Bogaers (CSIR) <abogaers@csir.co.za>      *
# *   Copyright (c) 2017 - Oliver Oxtoby (CSIR) <ooxtoby@csir.co.za>        *
# *   Copyright (c) 2017 - Johan Heyns (CSIR) <jheyns@csir.co.za>           *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENCE text file.                                 *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU Library General Public License for more details.                  *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with this program; if not, write to the Free Software   *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************

__title__ = "Classes for New CFD solver"
__author__ = "Qingfeng Xia"
__url__ = "http://www.freecadweb.org"

import os.path
import Gnuplot

from numpy import *

import FreeCAD

import CfdCaseWriterFoam
import CfdTools
import platform
import subprocess


# Added modified code from http://matplotlib.org/examples/user_interfaces/embedding_in_qt4.html
import os
from matplotlib.backends import qt_compat
use_pyside = qt_compat.QT_API == qt_compat.QT_API_PYSIDE
if use_pyside:
    from PySide import QtGui, QtCore
else:
    from PyQt4 import QtGui, QtCore

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar


class MyMplCanvas(FigureCanvas):
    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.canvas = FigureCanvas(fig)

        self.ax = fig.add_subplot(111)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass


class MyDynamicMplCanvas(MyMplCanvas):
    """A canvas that updates itself every 10 milliseconds with a new plot."""

    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)


    def compute_initial_figure(self):
        self.ax.set_title("Simulation residuals")
        self.ax.set_xlabel("Iteration")
        self.ax.set_ylabel("Residual")

        self.ax.set_yscale('log')
        self.ax.grid()

    def update_figure(self, UxResiduals, UyResiduals, UzResiduals, pResiduals):

        self.ax.cla()
        self.ax.set_title("Simulation residuals")
        self.ax.set_xlabel("Iteration")
        self.ax.set_ylabel("Residual")

        self.ax.plot(UxResiduals, label="Ux", color='violet', linewidth=1)
        self.ax.plot(UyResiduals, label="Uy", color='green', linewidth=1)
        self.ax.plot(UzResiduals, label="Uz", color='blue', linewidth=1)
        self.ax.plot(pResiduals, label="p", color='orange', linewidth=1)

        self.ax.grid()
        self.ax.set_yscale('log')
        self.ax.legend()

        self.draw()


class ApplicationWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.main_widget = QtGui.QWidget(self)

        l = QtGui.QVBoxLayout(self.main_widget)
        dc = MyDynamicMplCanvas(self.main_widget, width=6.5, height=5, dpi=100)
        l.addWidget(dc)

        self.dc = dc
        self.navi_toolbar = NavigationToolbar(self.dc, self)
        self.addToolBar(QtCore.Qt.TopToolBarArea, self.navi_toolbar)

        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)












class CfdRunnable(object):
    ##  run the solver and read the result, corresponding to FemTools class
    #  @param analysis - analysis object to be used as the core object.
    #  "__init__" tries to use current active analysis in analysis is left empty.
    #  Rises exception if analysis is not set and there is no active analysis
    #  The constructur of FemTools is for use of analysis without solver object
    def __init__(self, analysis=None, solver=None):
        if analysis and analysis.isDerivedFrom("Fem::FemAnalysisPython"):
            ## @var analysis
            #  FEM analysis - the core object. Has to be present.
            #  It's set to analysis passed in "__init__" or set to current active analysis by default if nothing has been passed to "__init__"
            self.analysis = analysis
        else:
            if FreeCAD.GuiUp:
                import FemGui
                self.analysis = FemGui.getActiveAnalysis()

        self.solver = None
        if solver and solver.isDerivedFrom("Fem::FemSolverObjectPython"):
            ## @var solver
            #  solver of the analysis. Used to store the active solver and analysis parameters
            self.solver = solver
        else:
            if analysis:
                self.solver = CfdTools.getSolver(self.analysis)
            if self.solver == None:
                FreeCAD.Console.printMessage("FemSolver object is missing from Analysis Object")

        if self.analysis:
            self.results_present = False
            self.result_object = None
        else:
            raise Exception('FEM: No active analysis found!')

        self.edit_process = None



    def check_prerequisites(self):
        return "" #CfdTools.check_prerequisites()

    def edit_case(self):
        """ Open case folder externally in file browser. """
        case_path = self.solver.WorkingDir + os.path.sep + self.solver.InputCaseName
        FreeCAD.Console.PrintMessage("Please edit the case input files externally at: {}\n".format(case_path))
        if platform.system() == 'MacOS':
            self.edit_process = subprocess.Popen(['open', '--', case_path])
        elif platform.system() == 'Linux':
            self.edit_process = subprocess.Popen(['xdg-open', case_path])
        elif platform.system() == 'Windows':
            self.edit_process = subprocess.Popen(['explorer', case_path])


class CfdRunnableFoam(CfdRunnable):
    def __init__(self, analysis=None, solver=None):
        super(CfdRunnableFoam, self).__init__(analysis, solver)
        self.writer = CfdCaseWriterFoam.CfdCaseWriterFoam(self.analysis)

        # Set default windows executable to gnuplot instead of older pgnuplot
        import platform
        if platform.system() == 'Windows':
            Gnuplot.GnuplotOpts.gnuplot_command = 'gnuplot.exe'
        gnuplot_cmd = Gnuplot.GnuplotOpts.gnuplot_command
        # For blueCFD, use the supplied Gnuplot
        if CfdTools.getFoamRuntime() == 'BlueCFD':
            gnuplot_cmd = CfdTools.getFoamDir()
            gnuplot_cmd = '{}\\..\\AddOns\\gnuplot\\bin\\gnuplot.exe'.format(gnuplot_cmd)
            Gnuplot.GnuplotOpts.gnuplot_command = '"{}"'.format(gnuplot_cmd)
        # Otherwise, the command 'gnuplot' must be in the path. Possibly make path user-settable.
        # Test to see if it exists, as the exception thrown is cryptic on Windows if it doesn't
        import distutils.spawn
        if distutils.spawn.find_executable(gnuplot_cmd) is None:
            raise IOError("Gnuplot executable " + gnuplot_cmd + " not found in path.")
        self.g = Gnuplot.Gnuplot()

        self.UxResiduals = [1]
        self.UyResiduals = [1]
        self.UzResiduals = [1]
        self.pResiduals = [1]
        self.niter = 0

        self.print_next_error_lines = 0
        self.print_next_error_file = False

    def check_prerequisites(self):
        return ""

    def get_solver_cmd(self, case_dir):
        self.UxResiduals = [1]
        self.UyResiduals = [1]
        self.UzResiduals = [1]
        self.pResiduals = [1]
        self.niter = 0
        self.print_next_error_lines = 0
        self.print_next_error_file = False

        self.g('set style data lines')
        self.g.title("Simulation residuals")
        self.g.xlabel("Iteration")
        self.g.ylabel("Residual")

        self.g("set grid")
        self.g("set logscale y")
        self.g("set yrange [0.95:1.05]")
        self.g("set xrange [0:1]")

        aw = ApplicationWindow()
        aw.show()
        self.aw = aw

        # Environment is sourced in run script, so no need to include in run command
        cmd = CfdTools.makeRunCommand('./Allrun', case_dir, source_env=False)
        FreeCAD.Console.PrintMessage("Solver run command: " + ' '.join(cmd) + "\n")
        return cmd

    def getRunEnvironment(self):
        return CfdTools.getRunEnvironment()

    def getParaviewScript(self):
        # Already created when case created - just return script name
        return os.path.join(self.writer.case_folder, "pvScript.py")

    def process_output(self, text):
        loglines = text.split('\n')
        printlines = []
        for line in loglines:
            # print line,
            split = line.split()

            # Only store the first residual per timestep
            if line.startswith(u"Time = "):
                self.niter += 1

            # print split
            if "Ux," in split and self.niter > len(self.UxResiduals):
                self.UxResiduals.append(float(split[7].split(',')[0]))
            if "Uy," in split and self.niter > len(self.UyResiduals):
                self.UyResiduals.append(float(split[7].split(',')[0]))
            if "Uz," in split and self.niter > len(self.UzResiduals):
                self.UzResiduals.append(float(split[7].split(',')[0]))
            if "p," in split and self.niter > len(self.pResiduals):
                self.pResiduals.append(float(split[7].split(',')[0]))

        # Workaround for 'Interrupted System Call' error - see PEP 475 (not necessary in Python >= 3.5)
        while True:
            try:
                self.g.plot(Gnuplot.Data(self.UxResiduals, with_='line', title="Ux", inline=1),
                            Gnuplot.Data(self.UyResiduals, with_='line', title="Uy", inline=1),
                            Gnuplot.Data(self.UzResiduals, with_='line', title="Uz", inline=1),
                            Gnuplot.Data(self.pResiduals, with_='line', title="p", inline=1))
                self.aw.dc.update_figure(self.UxResiduals, self.UyResiduals, self.UzResiduals, self.pResiduals)

                break
            except IOError as ioe:
                import errno
                if ioe.errno == errno.EINTR:
                    pass
                else:
                    raise

        if self.niter >= 2:
            self.g("set autoscale")  # NOTE: this is just to suppress the empty yrange error when Gnuplot autoscales

    def processErrorOutput(self, err):
        """
        Process standard error text output from solver
        :param err: Standard error output, single or multiple lines
        :return: A message to be printed on console, or None
        """
        ret = ""
        errlines = err.split('\n')
        for errline in errlines:
            if len(errline) > 0:  # Ignore blanks
                if self.print_next_error_lines > 0:
                    ret += errline + "\n"
                    self.print_next_error_lines -= 1
                if self.print_next_error_file and "file:" in errline:
                    ret += errline + "\n"
                    self.print_next_error_file = False
                words = errline.split(' ', 1)  # Split off first field for parallel
                FATAL = "--> FOAM FATAL ERROR"
                FATALIO = "--> FOAM FATAL IO ERROR"
                if errline.startswith(FATAL) or (len(words) > 1 and words[1].startswith(FATAL)):
                    self.print_next_error_lines = 1
                    ret += "OpenFOAM fatal error:\n"
                elif errline.startswith(FATALIO) or (len(words) > 1 and words[1].startswith(FATALIO)):
                    self.print_next_error_lines = 1
                    self.print_next_error_file = True
                    ret += "OpenFOAM IO error:\n"
        if len(ret) > 0:
            return ret
        else:
            return None



I cant say a thing regarding performance but it produces at least the same curves :D . The functionality regarding zooming etc. is similar.
Screenshot from 2017-06-17 18-27-34.png
Screenshot from 2017-06-17 18-27-34.png (145.48 KiB) Viewed 4296 times
You maybe can do the performance testing with a more complex model and alternately disable gnuplot and mpl (by commenting "self.aw.dc.update_figure(self.UxResiduals, self.UyResiduals, self.UzResiduals, self.pResiduals)").
Hoping this is of help.
BR,
HoWil
ps.: until now I could test it only on one comp ... so forgive possible probs
johan
Posts: 14
Joined: Tue Nov 29, 2016 8:37 pm

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by johan »

oliveroxtoby wrote: Wed Jun 14, 2017 5:53 am
wafi wrote: Wed Jun 14, 2017 4:53 am with the Cartesian mesher. But once again, not the mesher is the problem. The mesher is working excellent. In the file "createPatchDict" faces which were defined as i.e. "hull" were suddenly defined as "default Faces". And that is what I do not understand. In the refinement with the region tool all faces belonging to the "hull" were recognized and the refining was done properly.
The mesher selected has some influence on the method of detecting the boundaries. If you can can share a minimal example that demonstrates the bug, we will have a look.
Thanks for the example, as soon as we have some time we will look at it. Just the basic concept how we handle the boundary updates and populate the createPatchDict. The Cart mesher takes the part from which the mesh was created and create a patch for each of the faces associated with this part. This is not dependent on the BC and therefore the mesh can be generated before the BC are assigned. Then when the case is written a geometric similarity check is done comparing the BC faces to the mesh part faces. If there are any small geometric differences between the face you selected for the bc and the mesh face (for example due to boolean operations) then the face will not be selected and will be added to defaultFaces and treated as a slip wall. The safest option would be to select the part from which the mesh was created and only select from its list of faces. We need a more robust method of doing this while still maintaining flexibility, please let us know if you have any clever ideas around this. The reason we did not limit the user to only select bc from the mesh part faces is to accommodate the internal baffles.
wafi
Posts: 82
Joined: Sat Oct 15, 2016 8:45 am

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by wafi »

Hi Johan

I have played a little bit around and I think I found a way to make it more stable. In the cfMeshes/System/fvSolutions I have changed the Simpel nNonOrthogonalCorrectors 10 Now I am getting in nearly all tests the complete hull including keel and rudder.
But ... with a small problem, in the createPatchDic under default faces, the numbers of faces increased, but i.e. face96 face108 face112 face96 face108 face112 face96 face108 face112 .... I saw this up to 8 times. If you try to start the solver, it will crah, deleting with except of the first in this example 3 faces the rest, everything is fine. But one has to check this.

Next to Multiphase solver like Interfoam, I missed forces and forces coefficients, so I added in the .../data/default/system/controlDic
  • libs
    (
    // Needed for availability of porous baffle boundary in potentialFoam
    "libturbulenceModels.so"
    "libforces.so"
    //"libfieldFunctionObjects.so"
    );
    functions
    {
    //#include "streamLines"
    //#include "wallBoundedStreamLines"
    #include "force"
    #include "forceCoeffs"
    }
and added two files as attached in this directory. In this two files the patches (BC) has to be defined in my example they are just called hull including length and area in forceCoeff. Maybe it would be an idea to integrate such options into the BC cards to make this automatically.

unable to upload them, but here the listening:
Force:

Code: Select all

*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  4.1                                   |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/

forces1
{
    type        forces;

    libs ( "libforces.so" );

    writeControl   timeStep;
    timeInterval    1;
    writeFields     yes;

    log         yes;

    patches     (hull);
    //Field names
    p           p;
    U           U;
    rho         rhoInf;      // Indicates incompressible
    rhoInf      1025;           // Redundant for incompressible         

    CofR        (7.2 0 0);  // Axle midpoint on ground
}


// ************************************************************************* //
ForceCoeffs

Code: Select all

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  4.1                                   |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/

forceCoeffs1
{
    type        forceCoeffs;

    libs ( "libforces.so" );

    writeControl   timeStep;
    timeInterval    1;
    writeFields     yes;

    log         yes;

    patches     (hull);
    rho         rhoInf;      // Indicates incompressible
    rhoInf      1025;           // Redundant for incompressible
    liftDir     (0 1 0);
    dragDir     (1 0 0);
    CofR        (7.2 0 0);  // Axle midpoint on ground
    pitchAxis   (0 1 0);
    magUInf     5;
    lRef        12;        // Wheelbase length
    Aref        32.7;        // Estimated
    /*
    binData
    {
        nBin        20;          // output data into 20 bins
        direction   (1 0 0);     // bin direction
        cumulative  yes;
    }
    */
}


// ************************************************************************* //
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

HoWil wrote: Sat Jun 17, 2017 4:35 pm Hi oliver,
I had some spare time and added some lines into 'CfdRunnableFoam.py' to support plotting with matplotlib under qt. This could make the separate gnuplot package for CFDFoam obsolete since matplotlib isincluded in FC anyway.
Hi HoWil

Thanks very much for this. I have played with it a bit, updating the plot only every second, but it's going to require some more thought...the problem is that the actual draw() call has a noticable delay and I am loath to introduce jitters to the user experience if they are, say, busy dragging the model around while the run is going. Offloading this to another thread 'works', sort of, but sadly it isn't correct to have Qt GUI operations happening in another thread. The only answer I can think of is to have the plotter running in a whole other process, being fed data through stdin, say. It seems a bit of a brute force approach but maybe it is the way to go. We would also very much like to get rid of the extra dependency.
Please provide all the information requested in this post before reporting problems with CfdOF.
drei
Posts: 479
Joined: Sun May 11, 2014 7:47 pm
Location: Mexico
Contact:

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by drei »

Hi Oliver,

Just wanted to say thanks for the work that you and your colleagues have done with CFD integration into FreeCAD. As a undergraduate engineering student this is a great help for education in general: removing proprietary licenses and providing good documentation.

Once I get the hang of it, I'll show the proposal to the university's professors and see if they would be interested in contributing as beta testers or just some general input as users.
Need help? Feel free to ask, but please read the guidelines first
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

oliveroxtoby wrote: Tue Jun 13, 2017 9:40 pm
wafi wrote: Sun Jun 11, 2017 7:27 am after testing and play around a little bit, I think there are some bugs:
1. as mentioned earlier not only the figures of fluid properties are not correctly shown, if edit the values again, also the figures of turbulence etc will change due to scaling and one has to be careful, not to miss the change, otherwise the results are not correct.
I've been looking at this a bit and it looks like there is a way to sort it out, thanks to Werner.
This fix has now been implemented, but it required a change to the FreeCAD core which must be version 11832 or later (the dependency checker will test this).
Please provide all the information requested in this post before reporting problems with CfdOF.
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

drei wrote: Wed Jun 28, 2017 10:49 pm Hi Oliver,

Just wanted to say thanks for the work that you and your colleagues have done with CFD integration into FreeCAD. As a undergraduate engineering student this is a great help for education in general: removing proprietary licenses and providing good documentation.

Once I get the hang of it, I'll show the proposal to the university's professors and see if they would be interested in contributing as beta testers or just some general input as users.
It's nice to hear this feedback - thanks!
Please provide all the information requested in this post before reporting problems with CfdOF.
User avatar
oliveroxtoby
Posts: 812
Joined: Fri Dec 23, 2016 9:43 am
Location: South Africa

Re: Computational Fluid Dynamics (CFD) workbench using OpenFOAM

Post by oliveroxtoby »

wafi wrote: Wed Jun 14, 2017 6:09 am Hi Oliver,

please note attached file. I had to delete the meshing due to size.
test.fcstd

Result of this model, Keel and rudder are defined as hull, port and starboard side of hull, are placed in the default faces.
I haven't looked back at your test case, but I think we have finally got to the bottom of this issue - see https://forum.freecadweb.org/viewtopic. ... 90#p195690
Please provide all the information requested in this post before reporting problems with CfdOF.
Post Reply