Skip to content

Commit 9a4a7ee

Browse files
Update openfoam application definitions
This commit adds a definition for openfoam.org (called openfoam-org), and updated the previous openfoam application definition to inherit from the openfoam-org definition.
1 parent 2cce1a7 commit 9a4a7ee

File tree

2 files changed

+275
-203
lines changed

2 files changed

+275
-203
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
# Copyright 2022-2024 The Ramble Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4+
# https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5+
# <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6+
# option. This file may not be copied, modified, or distributed
7+
# except according to those terms.
8+
9+
import os
10+
from ramble.appkit import *
11+
from ramble.expander import Expander
12+
13+
14+
class OpenfoamOrg(SpackApplication):
15+
'''Define the Openfoam application'''
16+
name = 'openfoam-org'
17+
18+
maintainers('douglasjacobsen')
19+
20+
tags('cfd', 'fluid', 'dynamics')
21+
22+
define_compiler('gcc9', spack_spec='[email protected]')
23+
24+
software_spec('ompi412',
25+
spack_spec='[email protected] +legacylaunchers +cxx',
26+
compiler='gcc9')
27+
28+
software_spec('openfoam',
29+
spack_spec='openfoam-org@10',
30+
compiler='gcc9')
31+
32+
workload('motorbike', executables=['clean', 'get_inputs', 'configure_mesh', 'surfaceFeatures',
33+
'blockMesh', 'decomposePar1', 'snappyHexMesh',
34+
'configure_simplefoam',
35+
'redistributePar',
36+
'decomposePar2', 'patchSummary',
37+
'potentialFoam', 'checkMesh',
38+
'simpleFoam'])
39+
40+
workload('motorbike_20m', executables=['clean', 'get_inputs', 'configure_mesh', 'surfaceFeatures',
41+
'blockMesh', 'decomposePar1', 'snappyHexMesh',
42+
'configure_simplefoam',
43+
'redistributePar',
44+
'decomposePar2', 'patchSummary',
45+
'potentialFoam', 'checkMesh',
46+
'simpleFoam'])
47+
48+
workload('motorbike_42m', executables=['clean', 'get_inputs', 'configure_mesh', 'surfaceFeatures',
49+
'blockMesh', 'decomposePar1', 'snappyHexMesh',
50+
'configure_simplefoam',
51+
'redistributePar',
52+
'decomposePar2', 'patchSummary',
53+
'potentialFoam', 'checkMesh',
54+
'simpleFoam'])
55+
56+
workload_variable('input_path', default='$FOAM_TUTORIALS/incompressible/simpleFoam/motorBike',
57+
description='Path to the tutorial input',
58+
workloads=['motorbike*'])
59+
workload_variable('geometry_path', default='$FOAM_TUTORIALS/resources/geometry/motorBike.obj.gz',
60+
description='Path to the geometry resource',
61+
workloads=['motorbike*'])
62+
workload_variable('decomposition_path', default='system/decomposeParDict',
63+
description='Path to decomposition files',
64+
workloads=['motorbike*'])
65+
workload_variable('control_path', default='system/controlDict',
66+
description='Path to control file',
67+
workloads=['motorbike*'])
68+
workload_variable('block_mesh_path', default='system/blockMeshDict',
69+
description='Path to block mesh file',
70+
workloads=['motorbike*'])
71+
workload_variable('hex_mesh_path', default='system/snappyHexMeshDict',
72+
description='Path to hexh mesh file',
73+
workloads=['motorbike*'])
74+
75+
workload_variable('end_time', default='250',
76+
description='End time for simulation',
77+
workloads=['motorbike*'])
78+
workload_variable('write_interval', default='500',
79+
description='Interval to write output files',
80+
workloads=['motorbike*'])
81+
workload_variable('start_from', default='startTime',
82+
description='How to start a new simulation',
83+
workloads=['motorbike*'])
84+
workload_variable('mesh_size', default='(20 8 8)',
85+
description='Mesh size for simulation',
86+
workload='motorbike')
87+
workload_variable('mesh_size', default='(100 40 40)',
88+
description='Mesh size for simulation',
89+
workload='motorbike_20m')
90+
workload_variable('mesh_size', default='(130 52 52)',
91+
description='Mesh size for simulation',
92+
workload='motorbike_42m')
93+
workload_variable('max_local_cells', default='100000',
94+
description='Max local cells for simulation',
95+
workloads=['motorbike*'])
96+
workload_variable('max_global_cells', default='50000000',
97+
description='Max global cells for simulation',
98+
workloads=['motorbike*'])
99+
100+
workload_variable('n_ranks_hex', default='16',
101+
description='Number of ranks to use for snappyHexMesh',
102+
workloads=['motorbike*'])
103+
workload_variable('hex_flags', default='-overwrite',
104+
description='Flags for snappyHexMesh',
105+
workloads=['motorbike*'])
106+
workload_variable('potential_flags', default='-writePhi',
107+
description='Flags for potentialFoam',
108+
workloads=['motorbike*'])
109+
workload_variable('simple_flags', default='',
110+
description='Flags for simpleFoam',
111+
workloads=['motorbike*'])
112+
113+
workload_variable('dict_delim', description='Delimiter for dictionary entries',
114+
default='/', workloads=['motorbike*'])
115+
116+
workload_variable('coeffs_dict', description='Coeffs dictionary name',
117+
default='hierarchicalCoeffs', workloads=['motorbike*'])
118+
119+
executable('clean', template=['rm -rf processor* constant system log.*'])
120+
121+
executable('get_inputs', template=['cp -Lr {input_path}/* {experiment_run_dir}/.',
122+
'mkdir -p constant/triSurface',
123+
'mkdir -p constant/geometry',
124+
'cp {geometry_path} constant/triSurface/.',
125+
'cp {geometry_path} constant/geometry/.',
126+
'ln -sf {experiment_run_dir}0/U.orig {experiment_run_dir}/0/U'],
127+
use_mpi=False)
128+
129+
executable('configure_mesh', template=['. $WM_PROJECT_DIR/bin/tools/RunFunctions',
130+
'foamDictionary -entry "numberOfSubdomains" -set "{n_ranks_hex}" {decomposition_path}',
131+
'foamDictionary -entry "{coeffs_dict}{dict_delim}n" -set "({min({n_ranks_hex}, {processes_per_node})} {ceil({n_ranks_hex}/{processes_per_node})} 1)" {decomposition_path}',
132+
'foamDictionary -entry "castellatedMeshControls{dict_delim}maxLocalCells" -set "{max_local_cells}" {hex_mesh_path}',
133+
'foamDictionary -entry "castellatedMeshControls{dict_delim}maxGlobalCells" -set "{max_global_cells}" {hex_mesh_path}',
134+
'sed "s/(20 8 8)/{mesh_size}/" -i {block_mesh_path}'],
135+
use_mpi=False)
136+
137+
executable('configure_simplefoam', template=['. $WM_PROJECT_DIR/bin/tools/RunFunctions',
138+
'foamDictionary -entry "numberOfSubdomains" -set "{n_ranks}" {decomposition_path}',
139+
'foamDictionary -entry "{coeffs_dict}{dict_delim}n" -set "({processes_per_node} {n_nodes} 1)" {decomposition_path}',
140+
'foamDictionary -entry "endTime" -set "{end_time}" {control_path}',
141+
'foamDictionary -entry "writeInterval" -set "{write_interval}" {control_path}',
142+
'foamDictionary -entry "startFrom" -set "{start_from}" {control_path}',
143+
'foamDictionary system/fvSolution -entry relaxationFactors{dict_delim}fields -add "{}"',
144+
'foamDictionary system/fvSolution -entry relaxationFactors{dict_delim}fields{dict_delim}p -set "0.3"',
145+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}nPreSweeps -set "0"',
146+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}nPostSweeps -set "2"',
147+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}cacheAgglomeration -set "on"',
148+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}agglomerator -set "faceAreaPair"',
149+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}nCellsInCoarsestLevel -set "10"',
150+
'foamDictionary system/fvSolution -entry solvers{dict_delim}p{dict_delim}mergeLevels -set "1"',
151+
'foamDictionary system/fvSolution -entry SIMPLE{dict_delim}consistent -set "yes"'],
152+
use_mpi=False)
153+
154+
executable('surfaceFeatures', template=['surfaceFeatures', 'surfaceFeatureExtract'],
155+
use_mpi=False,
156+
redirect='{experiment_run_dir}/log.surfaceFeatures')
157+
158+
executable('blockMesh', 'blockMesh',
159+
use_mpi=False,
160+
redirect='{experiment_run_dir}/log.blockMesh')
161+
162+
executable('decomposePar1', template=['decomposePar -noZero -force'],
163+
use_mpi=False,
164+
redirect='{experiment_run_dir}/log.decomposePar1')
165+
166+
executable('decomposePar2', template=['rm -rf processor*/0', 'decomposePar -copyZero -fields'],
167+
use_mpi=False,
168+
redirect='{experiment_run_dir}/log.decomposePar2')
169+
170+
executable('snappyHexMesh', template=['snappyHexMesh -parallel {hex_flags}'], use_mpi=True, variables={'n_ranks': '{n_ranks_hex}'},
171+
redirect='{experiment_run_dir}/log.snappyHexMesh')
172+
173+
executable('redistributePar', 'redistributePar -noZero -overwrite -parallel', use_mpi=True,
174+
redirect='{experiment_run_dir}/log.redistributePar')
175+
176+
executable('patchSummary', 'patchSummary -parallel', use_mpi=True,
177+
redirect='{experiment_run_dir}/log.patchSummary')
178+
executable('checkMesh', "checkMesh -parallel -constant", use_mpi=True,
179+
redirect='{experiment_run_dir}/log.checkMesh')
180+
executable('potentialFoam', 'potentialFoam -parallel {potential_flags}', use_mpi=True,
181+
redirect='{experiment_run_dir}/log.potentialFoam')
182+
executable('simpleFoam', 'simpleFoam -parallel {simple_flags}', use_mpi=True,
183+
redirect='{experiment_run_dir}/log.simpleFoam')
184+
185+
workload_variable('export_prefix', default='-x',
186+
description='Prefix for exporting an environment variable with mpirun',
187+
workloads=['*'])
188+
189+
workload_variable('workload_exports', default='{export_prefix} {export_variables}',
190+
description='Placeholder variable which holds all variable exports',
191+
workloads=['*'])
192+
193+
workload_variable('export_variables',
194+
description='Comma separated list of all env-var names that need to be exported',
195+
default="PATH,LD_LIBRARY_PATH,FOAM_APP,FOAM_APPBIN,FOAM_ETC," +
196+
"FOAM_EXT_LIBBIN,FOAM_INST_DIR,FOAM_JOB_DIR,FOAM_LIBBIN," +
197+
"FOAM_MPI,FOAM_RUN,FOAM_SETTINGS,FOAM_SIGFPE,FOAM_SITE_APPBIN," +
198+
"FOAM_SITE_LIBBIN,FOAM_SOLVERS,FOAM_SRC,FOAM_TUTORIALS," +
199+
"FOAM_USER_APPBIN,FOAM_USER_LIBBIN,FOAM_UTILITIES,WM_ARCH," +
200+
"WM_ARCH_OPTION,WM_CC,WM_CFLAGS,WM_COMPILER,WM_COMPILER_LIB_ARCH," +
201+
"WM_COMPILER_TYPE,WM_COMPILE_OPTION,WM_CXX,WM_CXXFLAGS,WM_DIR," +
202+
"WM_LABEL_OPTION,WM_LABEL_SIZE,WM_LDFLAGS,WM_LINK_LANGUAGE,WM_MPLIB," +
203+
"WM_OPTIONS,WM_OSTYPE,WM_PRECISION_OPTION,WM_PROJECT,WM_PROJECT_DIR," +
204+
"WM_PROJECT_INST_DIR,WM_PROJECT_USER_DIR,WM_PROJECT_VERSION," +
205+
"WM_THIRD_PARTY_DIR,MPI_ARCH_FLAGS,MPI_ARCH_INC,MPI_ARCH_LIBS," +
206+
"MPI_ARCH_PATH,MPI_BUFFER_SIZE,MPI_ROOT",
207+
workloads=['*'])
208+
209+
log_prefix = os.path.join(Expander.expansion_str('experiment_run_dir'), 'log.')
210+
211+
figure_of_merit('Number of cells', log_file=(log_prefix + 'snappyHexMesh'),
212+
fom_regex=r'Layer mesh\s+:\s+cells:(?P<ncells>[0-9]+)\s+.*',
213+
group_name='ncells', units='')
214+
215+
figure_of_merit('snappyHexMesh Time ({n_ranks_hex} ranks)', log_file=(log_prefix + 'snappyHexMesh'),
216+
fom_regex=r'Finished meshing in = (?P<mesh_time>[0-9]+\.?[0-9]*).*',
217+
group_name='mesh_time', units='s')
218+
219+
figure_of_merit('simpleFoam Time ({n_ranks} ranks)', log_file=(log_prefix + 'simpleFoam'),
220+
fom_regex=r'\s*ExecutionTime = (?P<foam_time>[0-9]+\.?[0-9]*).*',
221+
group_name='foam_time', units='s')
222+
223+
figure_of_merit('potentialFoam Time ({n_ranks} ranks)', log_file=(log_prefix + 'potentialFoam'),
224+
fom_regex=r'\s*ExecutionTime = (?P<foam_time>[0-9]+\.?[0-9]*).*',
225+
group_name='foam_time', units='s')
226+
227+
success_criteria('snappyHexMesh_completed', mode='string', match='Finalising parallel run',
228+
file='{experiment_run_dir}/log.snappyHexMesh')
229+
230+
success_criteria('simpleFoam_completed', mode='string', match='Finalising parallel run',
231+
file='{experiment_run_dir}/log.simpleFoam')
232+
233+
def _define_commands(self, exec_graph):
234+
export_prefix = self.expander.expand_var_name('export_prefix')
235+
export_vars = self.expander.expand_var_name('export_variables').split(',')
236+
237+
export_args = []
238+
for var in export_vars:
239+
export_args.append(f'{export_prefix} {var}')
240+
241+
export_str = " ".join(export_args)
242+
243+
self.define_variable('workload_exports', export_str)
244+
245+
super()._define_commands(exec_graph)

0 commit comments

Comments
 (0)