|
[Sponsors] |
[blockMesh] #codeStream loop inside a blockMeshDict |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
April 11, 2015, 13:08 |
#codeStream loop inside a blockMeshDict
|
#1 |
Senior Member
Francois Beaubert
Join Date: Mar 2009
Location: Lille, France
Posts: 147
Rep Power: 17 |
Hi all,
I would like to use #codeStream to define the points of splines in a blockMeshDict. Here is the code snippet I use: Code:
spline 0 1 ( #codeStream { codeInclude #{ #include "pointField.H" #}; code #{ label nbPoints = 20; for (label i = 0; i < nbPoints; i++) { scalar xi = 0 + i*$L/(nbPoints-1); scalar yi = $Ri - ($Re-$Ri) * (6*pow(xi/$L,5) - 15*pow(xi/$L,4) + 10*pow(xi/$L,3)); os << point(xi, -yi, 0) << endl; // Info << point(xi, -yi, 0) << endl; } #}; }; ) I've got this error message: Code:
--> FOAM FATAL IO ERROR: Expected a '(' while reading VectorSpace<Form, Cmpt, nCmpt>, found on line 79 the punctuation token ';' file: /home/beaubert/OpenFOAM/beaubert-2.3.0/run/convergentMarie/convergentCase/constant/polyMesh/blockMeshDict.edges at line 79. From function Istream::readBegin(const char*) in file db/IOstreams/IOstreams/Istream.C at line 94. FOAM exiting Any idea ? Thanks a lot for your help Happy foaming François |
|
April 15, 2015, 08:18 |
|
#2 | |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Just remove the red semicolon
Quote:
|
||
April 17, 2015, 09:36 |
|
#3 |
Senior Member
Francois Beaubert
Join Date: Mar 2009
Location: Lille, France
Posts: 147
Rep Power: 17 |
Thank you very much hk318i !
Note for myself: always read twice before posting, especially if it's in front of my nose Here is a working example if someone wants to try this #codeStream feature: Code:
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.3.0 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // convertToMeters 0.001; // Geometry parameters D 44.45; // Pipe diameter Lc 263.36625; // Length of the contraction Re #calc "$D/2.0"; // Exit radius Ri 67.230625; // Inlet radius H #calc "0.1*$D"; // Depth Lp 200; // Length of the pipe Ld #calc "$Lc+$Lp"; // Mesh parameters Nx 20; Ny 20; Nz 1; Gx 0.5; Gy 1; Gz 1; // Vertices of the geometry vertices ( (0 #calc "-$Ri" 0) // Point 0 ($Lc #calc "-$Re" 0) // Point 1 ($Lc $Re 0) // Point 2 (0 $Ri 0) // Point 3 (0 #calc "-$Ri" $H) // Point 4 ($Lc #calc "-$Re" $H) // Point 5 ($Lc $Re $H) // Point 6 (0 $Ri $H) // Point 7 ($Ld #calc "-$Re" 0) // Point 8 ($Ld $Re 0) // Point 9 ($Ld #calc "-$Re" $H) // Point 10 ($Ld $Re $H) // Point 11 ); // Blocks definition blocks ( hex (0 1 2 3 4 5 6 7) ($Nx $Ny $Nz) simpleGrading ($Gx $Gy $Gz) hex (1 8 9 2 5 10 11 6) ($Nx $Ny $Nz) simpleGrading ($Gx $Gy $Gz) ); edges ( BSpline 0 1 ( #codeStream { codeInclude #{ #include "pointField.H" #}; code #{ label nbPoints = 20; for (label i = 0; i < nbPoints; i++) { scalar xi = 0 + i*$Lc/(nbPoints-1); scalar yi = $Ri + ($Re - $Ri) * (6*pow(xi/$Lc,5) - 15*pow(xi/$Lc,4) + 10*pow(xi/$Lc,3) ); os << point(xi, -yi, 0) << endl; Info << point(xi, -yi, 0) << endl; } #}; } ) BSpline 4 5 ( #codeStream { codeInclude #{ #include "pointField.H" #}; code #{ label nbPoints = 20; for (label i = 0; i < nbPoints; i++) { scalar xi = 0 + i*$Lc/(nbPoints-1); scalar yi = $Ri + ($Re - $Ri) * (6*pow(xi/$Lc,5) - 15*pow(xi/$Lc,4) + 10*pow(xi/$Lc,3) ); os << point(xi, -yi, $H) << endl; Info << point(xi, -yi, $H) << endl; } #}; } ) BSpline 3 2 ( #codeStream { codeInclude #{ #include "pointField.H" #}; code #{ label nbPoints = 20; for (label i = 0; i < nbPoints; i++) { scalar xi = 0 + i*$Lc/(nbPoints-1); scalar yi = $Ri + ($Re - $Ri) * (6*pow(xi/$Lc,5) - 15*pow(xi/$Lc,4) + 10*pow(xi/$Lc,3) ); os << point(xi, yi, 0) << endl; Info << point(xi, yi, 0) << endl; } #}; } ) BSpline 7 6 ( #codeStream { codeInclude #{ #include "pointField.H" #}; code #{ label nbPoints = 20; for (label i = 0; i < nbPoints; i++) { scalar xi = 0 + i*$Lc/(nbPoints-1); scalar yi = $Ri + ($Re-$Ri) * (6*pow(xi/$Lc,5) - 15*pow(xi/$Lc,4) + 10*pow(xi/$Lc,3) ); os << point(xi, yi, $H) << endl; Info << point(xi, yi, $H) << endl; } #}; } ) ); // Boundaries boundary ( inlet { type patch; faces ( (0 4 7 3) ); } outlet { type patch; faces ( (8 10 11 9) ); } upperWallUpstream { type wall; faces ( (3 2 6 7) ); } lowerWallUpstream { type wall; faces ( (0 1 5 4) ); } upperWallDownstream { type wall; faces ( (2 9 11 6) ); } lowerWallDownstream { type wall; faces ( (1 8 10 5) ); } frontAndBack { type empty; faces ( (0 1 2 3) (4 5 6 7) (1 8 9 2) (5 10 11 6) ); } ); mergePatchPairs ( ); |
|
April 17, 2015, 10:44 |
|
#4 | |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Don't worry, it happens with every foamer
I have only one comment about your code, which could be useful for someone else in the future. Instead of repeating the code for each edge, you can use the codeStream directly inside edges. Code:
edges (#codeStream { code #{ Calculate all the points....; Then os << "edgetype1 A B" << pointsList ; os << "edgetype2 A B" << pointsList ; #} } ); Code:
#codeStream { codeInclude #{ #include "pointField.H" #include "myfun.H" #}; codeOptions #{ -I$(FOAM_CASE)/constant/polyMesh <-- location of myfun.H #}; codeLibs #{ #}; code #{ type y = myfunName(inputs); os << ........ ; #} myfun.H Code:
using namespace Foam; type myfunName(type inputs) { forAll(y, i) { y[i] = function; } return y; } Hopefully these tips will be useful for someone coming directly from google search. Best wishes, Hassan Quote:
|
||
April 17, 2015, 11:03 |
|
#5 |
Senior Member
Francois Beaubert
Join Date: Mar 2009
Location: Lille, France
Posts: 147
Rep Power: 17 |
Thanks Hassan for your kind and very relevant suggestions.
I was thinking myself of refactoring the code which was submitted here only as proof of concept for myself or other newcomers to #codeStream. Anyway, those are indeed very nice additions to put into the code, thanks ! I may put all this stuff on the wiki when I'll find the time. You're a good example that illustrates why I like so much the OpenFOAM community. Happy foaming |
|
April 29, 2015, 14:25 |
|
#6 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Hello!
I hit one of the codeStream limitations today. I would like to share it with everyone here. Code:
string " int N = 100; scalar cw = $cw*$ftTom; // chord scalar..." is too long (max. 8000 characters) Code:
code #{ #include "myLongCode.H" #}; So to read any variable from the blockMeshDict in this case, you have to lookup it. Code:
scalar a = readScalar(dict.lookup("a")); |
|
October 1, 2015, 08:07 |
|
#7 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
On using codestream... I understand the syntax to duplicate points but I want to then see the points so I can construct the blocks... Maybe this is a stupid question but I'm very very new to CFD and meshing so I don't understand how, once I've duplicated the points, I "know" where each one is and how the block structure should be using the new points... can anyone advise on the best practice for this?
|
|
October 1, 2015, 10:09 |
|
#8 | |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Quote:
Code:
paraFoam -block I am not sure if that what you are looking for or not. Maybe you mean if you have list called points and you want use points[5] in blocks. In this case, based on my experience, you cannot do that directly because the variables are limited to codeStream scope. BUT there is a way around this problem which is including the blocks section inside the same codeStream as points. Then use os stream to print blocks as well. Or you can write a script (using python or octave or m4 .) to create blockMesh file. |
||
October 1, 2015, 10:18 |
|
#9 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
Hi there,
Thanks for that. Actually I wasn't sure if that would work without running blockMesh first... Ok just tried and how is it possible to do this without first building the blocks? Or do I just put: Code:
blocks ( ); |
|
October 1, 2015, 10:26 |
|
#10 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
It works without executing blockMesh, just make sure that boundary is empty as well. It will show you the points and edges
|
|
October 1, 2015, 10:28 |
|
#11 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
perfect! Thanks for that... very difficult to find something so simple online!
|
|
October 1, 2015, 10:55 |
|
#12 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
Sorry, last question.. say I'm trying to duplicate both the z points (as done in the cylinder tutorial) and the y points. I tried to just include a second loop as follows:
Code:
label sy = points.size(); points.setSize(2*sy); for (label i = 0; i < sy; i++) { const point& pt = points[i]; points[i+sy] = point(pt.x(), -pt.y(), pt.z()); } os << points; |
|
October 2, 2015, 04:26 |
|
#13 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
What is pt? This expression looks wrong.
|
|
October 2, 2015, 06:23 |
|
#14 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
I took that directly from the cylinder tutorial (uses potentialFoam) but I believe pt the name of the pointer that points to the location of that point?
|
|
October 2, 2015, 06:36 |
|
#15 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Sorry, I did see the first expression in the loop. The code should work without errors.
|
|
October 2, 2015, 06:38 |
|
#16 |
Senior Member
ArielJ
Join Date: Aug 2015
Posts: 127
Rep Power: 11 |
The code works without errors when I have the second loop to duplicate the y-values but it doesn't actually duplicate the y-values. It does duplicate the z-values successfully but I'm not sure why it isnt' fully working to duplicate everything. Any thoughts?
|
|
October 2, 2015, 06:41 |
|
#17 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
Try to print the points to see the values.
Code:
Info << points << endl; |
|
October 22, 2015, 16:43 |
Why negative volumes?
|
#18 |
New Member
Gianluca
Join Date: Sep 2011
Location: Firenze, Italy
Posts: 11
Rep Power: 15 |
Hi all,
taking inspiration from this thread, I tried to generate my geometry with #codestream directive inside blockMeshDict (the method is really smart indeed and overcomes the difficulty of "manual meshing - the trappist way " with plain text blockMeshDict, so thanks Francois and Hassan for sharing this conversation!). The mesh I obtain is apparently correct but if I run checkMesh against it, the situation is much different: Code:
/*---------------------------------------------------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.3.0 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ Build : 2.3.0-f5222ca19ce6 Exec : checkMesh -constant Date : Oct 22 2015 Time : 21:18:35 Host : "rocchigi1npge" PID : 2009 Case : /home1/rok/Cases/helix nProcs : 1 sigFpe : Enabling floating point exception trapping (FOAM_SIGFPE). fileModificationChecking : Monitoring run-time modified files using timeStampMaster allowSystemOperations : Allowing user-supplied system call operations // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Create time Create polyMesh for time = constant Time = constant Mesh stats points: 63529 faces: 178576 internal faces: 167024 cells: 57600 faces per cell: 6 boundary patches: 1 point zones: 0 face zones: 0 cell zones: 2 Overall number of cells of each type: hexahedra: 57600 prisms: 0 wedges: 0 pyramids: 0 tet wedges: 0 tetrahedra: 0 polyhedra: 0 Checking topology... Boundary definition OK. ***Total number of faces on empty patches is not divisible by the number of cells in the mesh. Hence this mesh is not 1D or 2D. Cell to face addressing OK. Point usage OK. Upper triangular ordering OK. Face vertices OK. Number of regions: 1 (OK). Checking patch topology for multiply connected surfaces... Patch Faces Points Surface topology defaultFaces 11552 11554 ok (closed singly connected) Checking geometry... Overall domain bounding box (-0.07529996 -0.008 -0.07529993) (0.07529996 0 0.0753) Mesh (non-empty, non-wedge) directions (0 0 0) Mesh (non-empty) directions (0 0 0) ***Number of edges not aligned with or perpendicular to non-empty directions: 122876 <<Writing 63529 points on non-aligned edges to set nonAlignedEdges Boundary openness (-4.773914e-18 -8.73355e-16 6.456257e-18) OK. Max cell openness = 3.404553e-16 OK. Max aspect ratio = -1 OK. Minimum face area = 1.547883e-08. Maximum face area = 1.802198e-05. Face area magnitudes OK. ***Zero or negative cell volume detected. Minimum negative volume: -5.256213e-09, Number of negative volume cells: 57600 <<Writing 57600 zero volume cells to set zeroVolumeCells Mesh non-orthogonality Max: 180 average: 178.9199 ***Number of non-orthogonality errors: 167024. <<Writing 167024 non-orthogonal faces to set nonOrthoFaces ***Error in face pyramids: 345600 faces are incorrectly oriented. <<Writing 178576 faces with incorrect orientation to set wrongOrientedFaces Max skewness = 0.1232568 OK. Coupled point location match (average 0) OK. Failed 4 mesh checks. End I checked several time the definition of each block for the vertexes sequence without finding any error. I attached here the blockMeshDict for your reference. So: what I am doing wrong? Thank You Gianluca |
|
October 23, 2015, 08:12 |
|
#20 |
Senior Member
Hassan Kassem
Join Date: May 2010
Location: Germany
Posts: 242
Rep Power: 18 |
I totally agree with Bruno, most probably one there is a block is not following the right had rule.
I tried to run your code using OpenFOAM2.3.x and I got few errors. I don't know if you are facing the same errors or not. I had to modify minor things to run it. I tested it also on OpenFOAM-dev hoping that the new updates will overcome your problem but unfortunately not. The new updates are related to boundary definition only. I attached the modified file here in case you needed it. I just modified the x and y type to scalarField. Also changed the int to label (which is exactly the same (just a habit)). Best Wishes Hassan |
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
[Other] Contribution a new utility: refine wall layer mesh based on yPlus field | lakeat | OpenFOAM Community Contributions | 58 | December 23, 2021 03:36 |
[Other] refineWallLayer Error | Yuby | OpenFOAM Meshing & Mesh Conversion | 2 | November 11, 2021 12:04 |
Star-CCM+ Macro - Loop over just wall boundary conditions | jbatchel | STAR-CCM+ | 5 | March 2, 2018 14:42 |
Pressure distribution on a wall | darazsbence | CFX | 17 | October 6, 2015 11:38 |
How to determine a point is inside a tetrahedral? | G.P. Xia | Main CFD Forum | 16 | January 12, 2000 12:15 |