I am trying to compute the drag and lift coefficients for the flow around a cylinder, but unfortunately get stranded by this ArityMismatch error, can anyone tell me how should I modify the code? ( The body part of the code is almost the same as the example given in the fenics tutorial)
Thanks in advance for any generous help!
def compute_drag_lift_coefficients(u,p):
# Define normal vector along the cylinder surface
n = FacetNormal(mesh)
stress_tensor=sigma(U,p_n)
boundary_parts = MeshFunction("size_t", mesh, mesh.topology().dim() - 1)
boundary_parts.set_all(0)
class CylinderBoundary(SubDomain):
def inside(self,x,on_boundary):
tol=1E-14
return on_boundary and x[0]>0.1 and x[0]<0.3 and x[1] >0.1 and x[1] <0.3
Cy=MeshFunction("size_t",mesh,mesh.topology().dim()-1)
Cy.set_all(0)
Gamma_1=CylinderBoundary()
Gamma_1.mark(boundary_parts,1)
ds=Measure('ds',domain=mesh,subdomain_id=1)
force = dot(stress_tensor,n)
drag_force=assemble(force[0]*ds)
lift_force=assemble(force[1]*ds)
# Compute drag and lift coefficients
drag_coefficient = 2 * drag_force / (rho * 1.0 * 0.41 * 2.2)
lift_coefficient = 2 * lift_force / (rho * 1.0 * 0.41 * 2.2)
return drag_coefficient, lift_coefficient
drag_coefficient, lift_coefficient = compute_drag_lift_coefficients(u_,p_)
print("drag coefficient:",drag_coefficient,"lift coefficient",lift_coefficient)
The error is like:
ArityMismatch Traceback (most recent call last)
Cell In[18], line 31
27 lift_coefficient = 2 * lift_force / (rho * 1.0 * 0.41 * 2.2)
29 return drag_coefficient, lift_coefficient
---> 31 drag_coefficient, lift_coefficient = compute_drag_lift_coefficients(u_,p_)
32 print("drag coefficient:",drag_coefficient,"lift coefficient",lift_coefficient)
Cell In[18], line 23, in compute_drag_lift_coefficients(u, p)
18 ds=Measure('ds',domain=mesh,subdomain_id=1)
22 force = dot(stress_tensor,n)
---> 23 drag_force=assemble((force[0]*ds))
24 lift_force=assemble(force[1]*ds)
25 # Compute drag and lift coefficients
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dolfin/fem/assembling.py:198, in assemble(form, tensor, form_compiler_parameters, add_values, finalize_tensor, keep_diagonal, backend)
196 dolfin_form = form
197 else:
--> 198 dolfin_form = _create_dolfin_form(form, form_compiler_parameters)
200 # Create tensor
201 comm = dolfin_form.mesh().mpi_comm()
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dolfin/fem/assembling.py:56, in _create_dolfin_form(form, form_compiler_parameters, function_spaces)
54 return form
55 elif isinstance(form, ufl.Form):
---> 56 return Form(form,
57 form_compiler_parameters=form_compiler_parameters,
58 function_spaces=function_spaces)
59 else:
60 raise TypeError("Invalid form type %s" % (type(form),))
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dolfin/fem/form.py:43, in Form.__init__(self, form, **kwargs)
40 if form_compiler_parameters is None:
41 form_compiler_parameters = {"external_include_dirs": dolfin_pc["include_dirs"]}
---> 43 ufc_form = ffc_jit(form, form_compiler_parameters=form_compiler_parameters,
44 mpi_comm=mesh.mpi_comm())
45 ufc_form = cpp.fem.make_ufc_form(ufc_form[0])
47 function_spaces = kwargs.get("function_spaces")
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dolfin/jit/jit.py:47, in mpi_jit_decorator.<locals>.mpi_jit(*args, **kwargs)
45 # Just call JIT compiler when running in serial
46 if MPI.size(mpi_comm) == 1:
---> 47 return local_jit(*args, **kwargs)
49 # Default status (0 == ok, 1 == fail)
50 status = 0
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dolfin/jit/jit.py:97, in ffc_jit(ufl_form, form_compiler_parameters)
95 p.update(dict(parameters["form_compiler"]))
96 p.update(form_compiler_parameters or {})
---> 97 return ffc.jit(ufl_form, parameters=p)
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/jitcompiler.py:217, in jit(ufl_object, parameters, indirect)
214 kind, module_name = compute_jit_prefix(ufl_object, parameters)
216 # Inspect cache and generate+build if necessary
--> 217 module = jit_build(ufl_object, module_name, parameters)
219 # Raise exception on failure to build or import module
220 if module is None:
221 # TODO: To communicate directory name here, need dijitso params to call
222 #fail_dir = dijitso.cache.create_fail_dir_path(signature, dijitso_cache_params)
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/jitcompiler.py:130, in jit_build(ufl_object, module_name, parameters)
123 params = dijitso.validate_params({
124 "cache": cache_params,
125 "build": build_params,
126 "generator": parameters, # ffc parameters, just passed on to jit_generate
127 })
129 # Carry out jit compilation, calling jit_generate only if needed
--> 130 module, signature = dijitso.jit(jitable=ufl_object,
131 name=module_name,
132 params=params,
133 generate=jit_generate)
134 return module
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/dijitso/jit.py:165, in jit(jitable, name, params, generate, send, receive, wait)
161 error("Please provide only one of generate or receive.")
163 elif generate:
164 # 1) Generate source code
--> 165 header, source, dependencies = generate(jitable, name, signature, params["generator"])
166 # Ensure we got unicode from generate
167 header = as_unicode(header)
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/jitcompiler.py:65, in jit_generate(ufl_object, module_name, signature, parameters)
62 elif isinstance(ufl_object, ufl.Mesh):
63 compile_object = compile_coordinate_mapping
---> 65 code_h, code_c, dependent_ufl_objects = compile_object(ufl_object,
66 prefix=module_name, parameters=parameters, jit=True)
68 # Jit compile dependent objects separately,
69 # but pass indirect=True to skip instantiating objects.
70 # (this is done in here such that it's only triggered
71 # if parent jit module is missing, and it's done after
72 # compile_object because some misformed ufl objects may
73 # require analysis to determine (looking at you Expression...))
74 dependencies = []
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/compiler.py:142, in compile_form(forms, object_names, prefix, parameters, jit)
139 def compile_form(forms, object_names=None,
140 prefix="Form", parameters=None, jit=False):
141 """This function generates UFC code for a given UFL form or list of UFL forms."""
--> 142 return compile_ufl_objects(forms, "form", object_names,
143 prefix, parameters, jit)
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/compiler.py:185, in compile_ufl_objects(ufl_objects, kind, object_names, prefix, parameters, jit)
183 # Stage 1: analysis
184 cpu_time = time()
--> 185 analysis = analyze_ufl_objects(ufl_objects, kind, parameters)
186 _print_timing(1, time() - cpu_time)
188 # Stage 2: intermediate representation
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/analysis.py:89, in analyze_ufl_objects(ufl_objects, kind, parameters)
86 forms = ufl_objects
88 # Analyze forms
---> 89 form_datas = tuple(_analyze_form(form, parameters)
90 for form in forms)
92 # Extract unique elements accross all forms
93 for form_data in form_datas:
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/analysis.py:89, in <genexpr>(.0)
86 forms = ufl_objects
88 # Analyze forms
---> 89 form_datas = tuple(_analyze_form(form, parameters)
90 for form in forms)
92 # Extract unique elements accross all forms
93 for form_data in form_datas:
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ffc/analysis.py:169, in _analyze_form(form, parameters)
162 if r == "uflacs":
163 # Temporary workaround to let uflacs have a different
164 # preprocessing pipeline than the legacy quadrature
165 # representation. This approach imposes a limitation that,
166 # e.g. uflacs and qudrature, representations cannot be mixed
167 # in the same form.
168 from ufl.classes import Jacobian
--> 169 form_data = compute_form_data(form,
170 do_apply_function_pullbacks=True,
171 do_apply_integral_scaling=True,
172 do_apply_geometry_lowering=True,
173 preserve_geometry_types=(Jacobian,),
174 do_apply_restrictions=True)
175 elif r == "tsfc":
176 try:
177 # TSFC provides compute_form_data wrapper using correct
178 # kwargs
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/algorithms/compute_form_data.py:418, in compute_form_data(form, do_apply_function_pullbacks, do_apply_integral_scaling, do_apply_geometry_lowering, preserve_geometry_types, do_apply_default_restrictions, do_apply_restrictions, do_estimate_degrees, do_append_everywhere_integrals, complex_mode)
415 if not complex_mode:
416 preprocessed_form = remove_complex_nodes(preprocessed_form)
--> 418 check_form_arity(preprocessed_form, self.original_form.arguments(), complex_mode) # Currently testing how fast this is
420 # TODO: This member is used by unit tests, change the tests to
421 # remove this!
422 self.preprocessed_form = preprocessed_form
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/algorithms/check_arities.py:177, in check_form_arity(form, arguments, complex_mode)
175 def check_form_arity(form, arguments, complex_mode=False):
176 for itg in form.integrals():
--> 177 check_integrand_arity(itg.integrand(), arguments, complex_mode)
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/algorithms/check_arities.py:159, in check_integrand_arity(expr, arguments, complex_mode)
156 arguments = tuple(sorted(set(arguments),
157 key=lambda x: (x.number(), x.part())))
158 rules = ArityChecker(arguments)
--> 159 arg_tuples = map_expr_dag(rules, expr, compress=False)
160 args = tuple(a[0] for a in arg_tuples)
161 if args != arguments:
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/corealg/map_dag.py:37, in map_expr_dag(function, expression, compress)
28 def map_expr_dag(function, expression, compress=True):
29 """Apply a function to each subexpression node in an expression DAG.
30
31 If *compress* is ``True`` (default) the output object from
(...)
35 Return the result of the final function call.
36 """
---> 37 result, = map_expr_dags(function, [expression], compress=compress)
38 return result
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/corealg/map_dag.py:86, in map_expr_dags(function, expressions, compress)
84 r = handlers[v._ufl_typecode_](v)
85 else:
---> 86 r = handlers[v._ufl_typecode_](v, *[vcache[u] for u in v.ufl_operands])
88 # Optionally check if r is in rcache, a memory optimization
89 # to be able to keep representation of result compact
90 if compress:
File ~/anaconda3/envs/fenicsproject/lib/python3.8/site-packages/ufl/algorithms/check_arities.py:48, in ArityChecker.sum(self, o, a, b)
46 def sum(self, o, a, b):
47 if a != b:
---> 48 raise ArityMismatch("Adding expressions with non-matching form arguments {0} vs {1}.".format(_afmt(a), _afmt(b)))
49 return a
ArityMismatch: Adding expressions with non-matching form arguments ('v_1',) vs ().