@@ -421,6 +421,15 @@ def initialise_exports(self):
421421 else :
422422 adios4dolfinx .write_mesh (export .filename , mesh = self .mesh .mesh )
423423
424+ elif isinstance (export , exports .SurfaceQuantity | exports .VolumeQuantity ):
425+ # raise not implemented error if the derived quantity don't match the
426+ # type of mesh eg. SurfaceFlux is used with cylindrical mesh
427+ if self .mesh .coordinate_system != "cartesian" :
428+ raise NotImplementedError (
429+ f"Derived quantity exports are not implemented for "
430+ f"{ self .mesh .coordinate_system } meshes"
431+ )
432+
424433 # if name of species is given then replace with species object
425434 if isinstance (export .field , list ):
426435 for idx , field in enumerate (export .field ):
@@ -784,9 +793,24 @@ def create_formulation(self):
784793 self .mesh .mesh , self .temperature_fenics , spe
785794 )
786795 if spe .mobile :
787- self .formulation += ufl .dot (D * ufl .grad (u ), ufl .grad (v )) * self .dx (
788- vol .id
789- )
796+ if self .mesh .coordinate_system == "cartesian" :
797+ self .formulation += ufl .dot (
798+ D * ufl .grad (u ), ufl .grad (v )
799+ ) * self .dx (vol .id )
800+ elif self .mesh .coordinate_system == "cylindrical" :
801+ r = ufl .SpatialCoordinate (self .mesh .mesh )[0 ]
802+ self .formulation += (
803+ r
804+ * ufl .dot (D * ufl .grad (u ), ufl .grad (v / r ))
805+ * self .dx (vol .id )
806+ )
807+ elif self .mesh .coordinate_system == "spherical" :
808+ r = ufl .SpatialCoordinate (self .mesh .mesh )[0 ]
809+ self .formulation += (
810+ r ** 2
811+ * ufl .dot (D * ufl .grad (u ), ufl .grad (v / r ** 2 ))
812+ * self .dx (vol .id )
813+ )
790814
791815 if self .settings .transient :
792816 self .formulation += ((u - u_n ) / self .dt ) * v * self .dx (vol .id )
@@ -1319,7 +1343,24 @@ def create_subdomain_formulation(self, subdomain: _subdomain.VolumeSubdomain):
13191343 form += ((u - u_n ) / self .dt ) * v * self .dx (subdomain .id )
13201344
13211345 if spe .mobile :
1322- form += ufl .inner (D * ufl .grad (u ), ufl .grad (v )) * self .dx (subdomain .id )
1346+ if self .mesh .coordinate_system == "cartesian" :
1347+ form += ufl .dot (D * ufl .grad (u ), ufl .grad (v )) * self .dx (
1348+ subdomain .id
1349+ )
1350+ elif self .mesh .coordinate_system == "cylindrical" :
1351+ r = ufl .SpatialCoordinate (self .mesh .mesh )[0 ]
1352+ form += (
1353+ r
1354+ * ufl .dot (D * ufl .grad (u ), ufl .grad (v / r ))
1355+ * self .dx (subdomain .id )
1356+ )
1357+ elif self .mesh .coordinate_system == "spherical" :
1358+ r = ufl .SpatialCoordinate (self .mesh .mesh )[0 ]
1359+ form += (
1360+ r ** 2
1361+ * ufl .dot (D * ufl .grad (u ), ufl .grad (v / r ** 2 ))
1362+ * self .dx (subdomain .id )
1363+ )
13231364
13241365 # add reaction terms
13251366 for reaction in self .reactions :
0 commit comments