CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM > OpenFOAM Programming & Development

Coupling Openfoam solver and keras trained neutral network model

Register Blogs Community New Posts Updated Threads Search

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   March 11, 2022, 04:38
Default Coupling Openfoam solver and keras trained neutral network model
  #1
New Member
 
Ahmed Hafez
Join Date: Jul 2018
Posts: 26
Rep Power: 7
AhmedHafez is on a distinguished road
Hello,
I try to couple simpleFoam solver and keras neutral network trained model.
Anyone have an idea to do so?

the following link suggest to use frugally-deep header library or #include <Python.h>

https://www.researchgate.net/publica...itutive_models

I installed frugally-deep and check it is working with ordinary C++ program
However when I try to implement the same in OpenFoam I got compilation error.

Anyone have an idea how to utilize frugally-deep in openFoam or even have an alternative way to use keras trained model.

below is added code to simpleFoam and the error
Code:
...........................
#include <fdeep/fdeep.hpp>
int main(int argc, char *argv[])
{
.........................
	const auto model = fdeep::load_model("fdeep_model.json");
	const auto result = model.predict(
	{fdeep::tensor(fdeep::tensor_shape(static_cast<std::size_t>(4)),
	std::vector<float>{1, 2, 3, 4})});
	std::cout << fdeep::show_tensors(result) << std::endl;
..........................
}
The error

Code:
In file included from /usr/local/include/fplus/fplus.hpp:21,
                 from /usr/local/include/fdeep/common.hpp:31,
                 from /usr/local/include/fdeep/fdeep.hpp:9,
                 from adFoam.C:83:
/usr/local/include/fplus/optimize.hpp: In lambda function:
/usr/local/include/fplus/optimize.hpp:119:24: error: call of overloaded ‘sqrt(double&)’ is ambiguous
  119 |         return sqrt(acc);
      |                        ^
In file included from /usr/include/features.h:461,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/os_defines.h:39,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:528,
                 from /usr/include/c++/9/cstdint:38,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/int16.H:40,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/int.H:40,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/label.H:42,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/labelList.H:44,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/UPstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Pstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/parRun.H:39,
                 from /usr/lib/openfoam/openfoam2106/src/finiteVolume/lnInclude/fvCFD.H:4,
                 from adFoam.C:77:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:143:1: note: candidate: ‘double sqrt(double)’
  143 | __MATHCALL (sqrt,, (_Mdouble_ __x));
      | ^~~~~~~~~~
In file included from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/scalar.H:42,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/zeroI.H:30,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/zero.H:157,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/UList.H:51,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/List.H:46,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/labelList.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/UPstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Pstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/parRun.H:39,
                 from /usr/lib/openfoam/openfoam2106/src/finiteVolume/lnInclude/fvCFD.H:4,
                 from adFoam.C:77:
/usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Scalar.H:184:11: note: candidate: ‘Foam::floatScalar Foam::sqrt(Foam::floatScalar)’
  184 | transFunc(sqrt)
      |           ^~~~
/usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/floatScalar.H:92:15: note: in definition of macro ‘transFunc’
   92 | inline Scalar func(const Scalar s)                              \
      |               ^~~~
In file included from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/scalar.H:43,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/zeroI.H:30,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/zero.H:157,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/UList.H:51,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/List.H:46,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/labelList.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/UPstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Pstream.H:45,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/parRun.H:39,
                 from /usr/lib/openfoam/openfoam2106/src/finiteVolume/lnInclude/fvCFD.H:4,
                 from adFoam.C:77:
/usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Scalar.H:184:11: note: candidate: ‘Foam::doubleScalar Foam::sqrt(Foam::doubleScalar)’
  184 | transFunc(sqrt)
      |           ^~~~
/usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/doubleScalar.H:93:15: note: in definition of macro ‘transFunc’
   93 | inline Scalar func(const Scalar s)                              \
      |               ^~~~
In file included from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/TimeState.H:41,
                 from /usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/Time.H:50,
                 from /usr/lib/openfoam/openfoam2106/src/finiteVolume/lnInclude/fvCFD.H:6,
                 from adFoam.C:77:
/usr/lib/openfoam/openfoam2106/src/OpenFOAM/lnInclude/dimensionedScalar.H:68:19: note: candidate: ‘Foam::dimensionedScalar Foam::sqrt(const dimensionedScalar&)’
   68 | dimensionedScalar sqrt(const dimensionedScalar&);
      |                   ^~~~
make: *** [/usr/lib/openfoam/openfoam2106/wmake/rules/General/transform:35: Make/linux64GccDPInt32Opt/simple2Foam.o] Error 1
AhmedHafez is offline   Reply With Quote

Old   March 11, 2022, 06:41
Default
  #2
Senior Member
 
Josh Williams
Join Date: Feb 2021
Location: Scotland
Posts: 112
Rep Power: 5
joshwilliams is on a distinguished road
I think I recall trying Frugally deep but I could not wrap my head around it. In the end I ended up using keras2cpp. My supervisor's former student has a github repo where they use it and I found it pretty useful -- it is probably a good starting point for your implementation.


I find the keras2cpp to be much simpler (just one file that you include in compilation). It requires your network architecture in a json file, and then your weights as a .h5 file, which you can get like so:
Code:
with open("./cpp_models/model_arch.json", "w") as fout:
  fout.write(model.to_json())
model.save("cpp_models/model_weights.h5")

Then there is a file called `dump_to_simple_cpp.py' or something in the keras2cpp library which can be used to generate a model that can be read by the keras2cpp C++ code. I remember I had to make some modifications to this `dump' file as I think it had some issues recognising input layers, so I skipped them. There were a few other things specific to my case.
joshwilliams is offline   Reply With Quote

Old   March 11, 2022, 13:33
Default
  #3
New Member
 
Ahmed Hafez
Join Date: Jul 2018
Posts: 26
Rep Power: 7
AhmedHafez is on a distinguished road
Thank you for your reply ,I will check it.

Quote:
Originally Posted by joshwilliams View Post
I think I recall trying Frugally deep but I could not wrap my head around it. In the end I ended up using keras2cpp. My supervisor's former student has a github repo where they use it and I found it pretty useful -- it is probably a good starting point for your implementation.


I find the keras2cpp to be much simpler (just one file that you include in compilation). It requires your network architecture in a json file, and then your weights as a .h5 file, which you can get like so:
Code:
with open("./cpp_models/model_arch.json", "w") as fout:
  fout.write(model.to_json())
model.save("cpp_models/model_weights.h5")

Then there is a file called `dump_to_simple_cpp.py' or something in the keras2cpp library which can be used to generate a model that can be read by the keras2cpp C++ code. I remember I had to make some modifications to this `dump' file as I think it had some issues recognising input layers, so I skipped them. There were a few other things specific to my case.
AhmedHafez is offline   Reply With Quote

Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On



All times are GMT -4. The time now is 12:09.