Closed BKN-AI closed 1 year ago
ArityMismatch: Failure to conjugate test function in complex Form`
You are running DOLFINx with the complex build of PETSc. See: https://jsdokken.com/dolfinx-tutorial/chapter1/complex_mode.html for how complex numbers alters the variational form (in particular, ufl.dot should be replaced with ufl.inner).
I have just followed the tutorial in 0.6.0 for linearelasticity and get this error when running:
problem = fem.petsc.LinearProblem(a, L, bcs=[bc], petsc_options={"ksp_type": "preonly", "pc_type": "lu"})
Error:
`--------------------------------------------------------------------------- ArityMismatch Traceback (most recent call last) Cell In[7], line 1 ----> 1 problem = fem.petsc.LinearProblem(a, L, bcs=[bc], petsc_options={"ksp_type": "preonly", "pc_type": "lu"}) 2 uh = problem.solve()
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/fem/petsc.py:569, in LinearProblem.init(self, a, L, bcs, u, petsc_options, form_compiler_options, jit_options) 566 self._a = _create_form(a, form_compiler_options=form_compiler_options, jit_options=jit_options) 567 self._A = create_matrix(self._a) --> 569 self._L = _create_form(L, form_compiler_options=form_compiler_options, jit_options=jit_options) 570 self._b = create_vector(self._L) 572 if u is None: 573 # Extract function space from TrialFunction (which is at the 574 # end of the argument list as it is numbered as 1, while the 575 # Test function is numbered as 0)
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/fem/forms.py:176, in form(form, dtype, form_compiler_options, jit_options) 173 return list(map(lambda sub_form: _create_form(sub_form), form)) 174 return form --> 176 return _create_form(form)
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/fem/forms.py:171, in form.._create_form(form)
168 """Recursively convert ufl.Forms to dolfinx.fem.Form, otherwise
169 return form argument"""
170 if isinstance(form, ufl.Form):
--> 171 return _form(form)
172 elif isinstance(form, collections.abc.Iterable):
173 return list(map(lambda sub_form: _create_form(sub_form), form))
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/fem/forms.py:145, in form.._form(form)
142 if mesh is None:
143 raise RuntimeError("Expecting to find a Mesh in the form.")
--> 145 ufcx_form, module, code = jit.ffcx_jit(mesh.comm, form,
146 form_compiler_options=form_compiler_options,
147 jit_options=jit_options)
149 # For each argument in form extract its function space
150 V = [arg.ufl_function_space()._cpp_object for arg in form.arguments()]
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/jit.py:56, in mpi_jit_decorator..mpi_jit(comm, *args, kwargs)
51 @functools.wraps(local_jit)
52 def mpi_jit(comm, *args, *kwargs):
53
54 # Just call JIT compiler when running in serial
55 if comm.size == 1:
---> 56 return local_jit(args, kwargs)
58 # Default status (0 == ok, 1 == fail)
59 status = 0
File /usr/local/dolfinx-complex/lib/python3.10/dist-packages/dolfinx/jit.py:204, in ffcx_jit(ufl_object, form_compiler_options, jit_options) 202 # Switch on type and compile, returning cffi object 203 if isinstance(ufl_object, ufl.Form): --> 204 r = ffcx.codegeneration.jit.compile_forms([ufl_object], options=p_ffcx, p_jit) 205 elif isinstance(ufl_object, ufl.FiniteElementBase): 206 r = ffcx.codegeneration.jit.compile_elements([ufl_object], options=p_ffcx, p_jit)
File /usr/local/lib/python3.10/dist-packages/ffcx/codegeneration/jit.py:186, in compile_forms(forms, options, cache_dir, timeout, cffi_extra_compile_args, cffi_verbose, cffi_debug, cffi_libraries) 183 for name in form_names: 184 decl += form_template.format(name=name) --> 186 impl = _compile_objects(decl, forms, form_names, module_name, p, cache_dir, 187 cffi_extra_compile_args, cffi_verbose, cffi_debug, cffi_libraries) 188 except Exception: 189 # remove c file so that it will not timeout next time 190 c_filename = cache_dir.joinpath(module_name + ".c")
File /usr/local/lib/python3.10/dist-packages/ffcx/codegeneration/jit.py:250, in _compile_objects(decl, ufl_objects, object_names, module_name, options, cache_dir, cffi_extra_compile_args, cffi_verbose, cffi_debug, cffi_libraries) 246 import ffcx.compiler 248 # JIT uses modulename as prefix, which is needed to make names of all struct/function 249 # unique across modules --> 250 , code_body = ffcx.compiler.compile_ufl_objects(ufl_objects, prefix=module_name, options=options) 252 ffibuilder = cffi.FFI() 253 ffibuilder.set_source(module_name, code_body, include_dirs=[ffcx.codegeneration.get_include_path()], 254 extra_compile_args=cffi_extra_compile_args, libraries=cffi_libraries)
File /usr/local/lib/python3.10/dist-packages/ffcx/compiler.py:97, in compile_ufl_objects(ufl_objects, object_names, prefix, options, visualise) 95 # Stage 1: analysis 96 cpu_time = time() ---> 97 analysis = analyze_ufl_objects(ufl_objects, options) 98 _print_timing(1, time() - cpu_time) 100 # Stage 2: intermediate representation
File /usr/local/lib/python3.10/dist-packages/ffcx/analysis.py:86, in analyze_ufl_objects(ufl_objects, options) 83 else: 84 raise TypeError("UFL objects not recognised.") ---> 86 form_data = tuple(_analyze_form(form, options) for form in forms) 87 for data in form_data: 88 elements += [convert_element(e) for e in data.unique_sub_elements]
File /usr/local/lib/python3.10/dist-packages/ffcx/analysis.py:86, in(.0)
83 else:
84 raise TypeError("UFL objects not recognised.")
---> 86 form_data = tuple(_analyze_form(form, options) for form in forms)
87 for data in form_data:
88 elements += [convert_element(e) for e in data.unique_sub_elements]
File /usr/local/lib/python3.10/dist-packages/ffcx/analysis.py:164, in _analyze_form(form, options) 161 complex_mode = "_Complex" in options["scalar_type"] 163 # Compute form metadata --> 164 form_data = ufl.algorithms.compute_form_data( 165 form, 166 do_apply_function_pullbacks=True, 167 do_apply_integral_scaling=True, 168 do_apply_geometry_lowering=True, 169 preserve_geometry_types=(ufl.classes.Jacobian,), 170 do_apply_restrictions=True, 171 do_append_everywhere_integrals=False, # do not add dx integrals to dx(i) in UFL 172 complex_mode=complex_mode) 174 # If form contains a quadrature element, use the custom quadrature scheme 175 custom_q = None
File /usr/local/lib/python3.10/dist-packages/ufl/algorithms/compute_form_data.py:407, 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) 403 # TODO: This is a very expensive check... Replace with something 404 # faster! 405 preprocessed_form = reconstruct_form_from_integral_data(self.integral_data) --> 407 check_form_arity(preprocessed_form, self.original_form.arguments(), complex_mode) # Currently testing how fast this is 409 # TODO: This member is used by unit tests, change the tests to 410 # remove this! 411 self.preprocessed_form = preprocessed_form
File /usr/local/lib/python3.10/dist-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 /usr/local/lib/python3.10/dist-packages/ufl/algorithms/check_arities.py:170, in check_integrand_arity(expr, arguments, complex_mode) 168 for arg, conj in arg_tuples: 169 if arg.number() == 0 and not conj: --> 170 raise ArityMismatch("Failure to conjugate test function in complex Form") 171 elif arg.number() > 0 and conj: 172 raise ArityMismatch("Argument {0} is spuriously conjugated in complex Form".format(arg))
ArityMismatch: Failure to conjugate test function in complex Form`