Successfully reported this slideshow.
Your SlideShare is downloading. ×

OpenFOAM Programming Tips

More Related Content

OpenFOAM Programming Tips

  1. 1. OpenFOAM Programming Tips Keywords: • OpenFOAM • findPatchID • gSum • faceCells • DynamicList English Fumiya Nozaki Last Updated: 6 May 2015
  2. 2. 2 1. How to get patch’s label from patch’s name label patchID = mesh.boundaryMesh().findPatchID("NAME_OF_PATCH"); Info << "patchID = " << patchID << endl; Example 5 ( inlet { type patch; nFaces 30; startFace 24170; } outlet { type patch; nFaces 57; startFace 24200; } upperWall { type wall; inGroups 1(wall); nFaces 223; startFace 24257; } lowerWall { type wall; inGroups 1(wall); nFaces 250; startFace 24480; } … ) label patchID = mesh.boundaryMesh().findPatchID(“upperWall"); Info << "patchID = " << patchID << endl; ⇒ patchID = 2 0 1 2 3
  3. 3. 3 2. How to calculate the sum over the specified patch label outletPatchID = mesh.boundaryMesh().findPatchID(“outlet"); scalar outFlux = gSum(phi.boundaryField()[outletPatchID]); Info << “Volumetric flux = " << outFlux << “ [m^3/s]” << endl; We can calculate the total outlet flux by summing the field phi over the patch named outlet:  gSum() sums over all the processors in a parallel run  If you calculate the total “inlet” flux using the above code, it takes the negative value because the face normal vectors point in the opposite direction from the inlet velocities. inlet outlet U mesh.Sf()
  4. 4. 4 3. How to get a boundary value of a variable label patchID = mesh.boundaryMesh().findPatchID(“outlet"); forAll(mesh.boundary()[patchID], faceI) { Info<< U.boundaryField()[patchID][faceI] << endl; } We can get the velocity on the outlet patch using the following code: faceI=0 faceI=1 faceI=2 U.boundaryField()[patchID][1] outlet U.boundaryField()[patchID][2] U.boundaryField()[patchID][0]
  5. 5. 5 4. How to get variable values in the cells adjacent to a patch We can get the label list of cells adjacent to patch using faceCells(): label patchID = mesh.boundaryMesh().findPatchID(“outlet"); forAll(mesh.boundary()[patchID], faceI) { Info<< U[mesh.boundary()[patchID].faceCells()[faceI]] << endl; } faceI=0 faceI=1 faceI=2 U[mesh.boundary()[patchID].faceCells()[1]] outlet
  6. 6. 6 5. How to read cellZones FoamFile { version 2.0; format ascii; class regIOobject; location "constant/polyMesh"; object cellZones; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 2 ( rotor { type cellZone; cellLabels List<label> 5 ( 3 4 5 10 11 ) ; }  Format of the cellZones file stator { type cellZone; cellLabels List<label> 4 ( 15 17 20 21 ) ; } ) For want of space The number of cellzones Name of cellzones The number of cells that belong to the cellZone List of cell labels
  7. 7. 7 5. How to read cellZones label cellZoneID = mesh.cellZones().findZoneID("stator"); const labelList& cellLabels = mesh.cellZones()[cellZoneID]; Info<< "cellZoneID: " << cellZoneID << endl; Info<< "cellLabels: " << cellLabels << endl; Continued from the previous page. cellZoneID: 1 cellLabels: 4(15 17 20 21) MRFZone.C Example of use
  8. 8. 8 6. Logical operators boolList A(4); A[0] = true; A[1] = false; A[2] = true; A[3] = false; Info<< "A: " << A << endl; boolList B(4); B[0] = true; B[1] = true; B[2] = false; B[3] = false; Info<< "B: " << B << endl; boolList C = A * B; Info<< "C: " << C << endl; boolList D = A + B; Info<< "D: " << D << endl; A: 4(1 0 1 0) B: 4(1 1 0 0) C: 4(1 0 0 0) D: 4(1 1 1 0) Logical conjunction Logical disjunction
  9. 9. 9 7. How to use DynamicList DynamicList<label> partA(0); partA.append(3); partA.append(1); partA.append(4); partA.append(1); partA.append(5); partA.append(9); partA.append(2); Info<< partA << endl; DynamicList<label> partB(0); partB.append(6); partB.append(5); partB.append(3); partB.append(5); partA.append(partB); Info<< partA << endl; Append an element at the end of the list Initialization 7(3 1 4 1 5 9 2) 11(3 1 4 1 5 9 2 6 5 3 5) Append a List(partB) at the end of partA
  10. 10. 10 7. How to use DynamicList labelList uniqueIndex; uniqueOrder(partA, uniqueIndex); Info<< uniqueIndex << endl; DynamicList<label> uniqueList(0); forAll(uniqueIndex, i) { uniqueList.append(partA[uniqueIndex[i]]); } partA.transfer(uniqueList); Info<< partA << endl; 7(3 6 9 2 10 7 5) Continued from the previous page. Generate (sorted) indices corresponding to unique list values 7(1 2 3 4 5 6 9) 11(3 1 4 1 5 9 2 6 5 3 5) 0 1 2 3 4 5 6 7 8 9 10 Index Create a list of unique values (remove duplicate values) PartA
  11. 11. 11 I will continuously update this slide in the future. Kindly let me know if you have any ideas about what topics to cover.
  12. 12. 12 Thank You!

×