Commit 9ac46dc3 authored by Sebastian Eibl's avatar Sebastian Eibl
Browse files

fixed all flake8 warnings except E241 for all mesapd related files

parent 1cd917f0
Pipeline #25510 passed with stages
in 147 minutes and 52 seconds
......@@ -3,66 +3,67 @@
from jinja2 import Environment, FileSystemLoader
import os
class Parameter:
def __init__(self, name, type, defValue=""):
"""Propery of a data strcuture
def __init__(self, name, type, defValue=""):
"""Propery of a data strcuture
Parameters
----------
name : str
name of the property
type : str
type of the property
defValue : str
default value the property should be initialized with
"""
Parameters
----------
name : str
name of the property
type : str
type of the property
defValue : str
default value the property should be initialized with
"""
self.name = name
self.type = type
self.defValue = defValue
self.name = name
self.type = type
self.defValue = defValue
def __str__(self):
return "name: {}, type: {}, defValue: {}".format(self.name, self.type, self.defValue)
def __str__(self):
return "name: {}, type: {}, defValue: {}".format(self.name, self.type, self.defValue)
class Config:
def __init__(self):
self.parameters = []
def __init__(self):
self.parameters = []
def parameterExists(self, name):
for v in self.parameters:
if v.name==name:
return True
return False
def parameterExists(self, name):
for v in self.parameters:
if v.name == name:
return True
return False
def addParameter(self, name, type, defValue):
if self.parameterExists( name ):
print("parameters already added: " + name)
else:
self.parameters.append( Parameter(name, type, defValue) )
def addParameter(self, name, type, defValue):
if self.parameterExists(name):
print("parameters already added: " + name)
else:
self.parameters.append(Parameter(name, type, defValue))
def generateFile(self, template):
context = dict()
context["parameters"] = self.parameters
def generateFile(self, template):
context = dict()
context["parameters"] = self.parameters
path = ""
filename = template.replace(".templ", "")
dirname = os.path.dirname(__file__)
env = Environment(loader=FileSystemLoader(dirname))
print("generating: " + path + filename)
fout = open(path + filename, "wb")
content = env.get_template(template).render(context)
fout.write(content.encode('utf8'))
fout.close()
path = ""
filename = template.replace(".templ", "")
dirname = os.path.dirname(__file__)
env = Environment(loader=FileSystemLoader(dirname))
print("generating: " + path + filename)
with open(path + filename, "wb") as fout:
content = env.get_template(template).render(context)
fout.write(content.encode('utf8'))
def generate(self):
print("="*90)
print("Config File:")
print("")
print("{0: <30}{1: <30}{2: <30}".format("Name", "Type", "Def. Value"))
print("="*90)
for param in self.parameters:
print("{0: <30.29}{1: <30.29}{2: <30.29}".format(param.name, param.type, param.defValue))
print("="*90)
def generate(self):
print("=" * 90)
print("Config File:")
print("")
print("{0: <30}{1: <30}{2: <30}".format("Name", "Type", "Def. Value"))
print("=" * 90)
for param in self.parameters:
print("{0: <30.29}{1: <30.29}{2: <30.29}".format(param.name, param.type, param.defValue))
print("=" * 90)
self.generateFile("Parameters.templ.h")
self.generateFile("Parameters.templ.cpp")
self.generateFile("Parameters.templ.h")
self.generateFile("Parameters.templ.cpp")
......@@ -30,7 +30,8 @@ if __name__ == '__main__':
ps.add_property("type", "uint_t", defValue="0", syncMode="ON_GHOST_CREATION")
ps.add_property("flags", "walberla::mesa_pd::data::particle_flags::FlagT", defValue="", syncMode="ON_GHOST_CREATION")
ps.add_property("flags", "walberla::mesa_pd::data::particle_flags::FlagT", defValue="",
syncMode="ON_GHOST_CREATION")
ps.add_property("nextParticle", "int", defValue="-1", syncMode="NEVER")
ps.add_include("blockforest/BlockForest.h")
......
......@@ -20,14 +20,14 @@ cfg.addParameter("visSpacing", "int64_t", "1000")
cfg.addParameter("vtk_out", "std::string", '"vtk_out"')
cfg.addParameter("sqlFile", "std::string", '"benchmark.sqlite"')
cfg.addParameter("recalculateBlockLevelsInRefresh", "bool", "false");
cfg.addParameter("alwaysRebalanceInRefresh", "bool", "true");
cfg.addParameter("reevaluateMinTargetLevelsAfterForcedRefinement", "bool", "false");
cfg.addParameter("allowRefreshChangingDepth", "bool", "false");
cfg.addParameter("recalculateBlockLevelsInRefresh", "bool", "false")
cfg.addParameter("alwaysRebalanceInRefresh", "bool", "true")
cfg.addParameter("reevaluateMinTargetLevelsAfterForcedRefinement", "bool", "false")
cfg.addParameter("allowRefreshChangingDepth", "bool", "false")
cfg.addParameter("allowMultipleRefreshCycles", "bool", "false");
cfg.addParameter("checkForEarlyOutInRefresh", "bool", "true");
cfg.addParameter("checkForLateOutInRefresh", "bool", "true");
cfg.addParameter("allowMultipleRefreshCycles", "bool", "false")
cfg.addParameter("checkForEarlyOutInRefresh", "bool", "true")
cfg.addParameter("checkForLateOutInRefresh", "bool", "true")
cfg.addParameter("regridMin", "uint_t", 'uint_c(100)')
cfg.addParameter("regridMax", "uint_t", 'uint_c(1000)')
......@@ -35,8 +35,8 @@ cfg.addParameter("maxBlocksPerProcess", "int", 'int_c(1000)')
cfg.addParameter("baseWeight", "real_t", 'real_t(10.0)')
cfg.addParameter("metisipc2redist", "real_t", 'real_t(1000.0)')
cfg.addParameter("LBAlgorithm", "std::string", '"Hilbert"')
cfg.addParameter("metisAlgorithm", "std::string", '"PART_GEOM_KWAY"' );
cfg.addParameter("metisWeightsToUse", "std::string", '"BOTH_WEIGHTS"' );
cfg.addParameter("metisEdgeSource", "std::string", '"EDGES_FROM_EDGE_WEIGHTS"' );
cfg.addParameter("metisAlgorithm", "std::string", '"PART_GEOM_KWAY"')
cfg.addParameter("metisWeightsToUse", "std::string", '"BOTH_WEIGHTS"')
cfg.addParameter("metisEdgeSource", "std::string", '"EDGES_FROM_EDGE_WEIGHTS"')
cfg.generate()
......@@ -2,51 +2,49 @@
import os
import time
import math
import random
import re
from influxdb import InfluxDBClient
from git import Repo
class Upload:
def __init__(self):
try:
self.write_user_pw = os.environ["INFLUXDB_MESAPD_PW"]
except KeyError:
import sys
print('Password for the InfluxDB write_user was not set.\n',
'See https://docs.gitlab.com/ee/ci/variables/#secret-variables', file=sys.stderr)
exc_info = sys.exc_info()
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
self.client = InfluxDBClient('i10grafana.informatik.uni-erlangen.de', 8086,
'mesa_pd', self.write_user_pw, 'mesa_pd')
def process(self, filename):
tts = dict()
with open(filename) as f:
for s in f.readlines():
m = re.search(r'\[0\]\s*(\w*)\s*\|[\s\d\.\%]*\|\s*([\d\.]*)', s)
if (m != None):
tts[m.group(1)] = float(m.group(2))
json_body = [
{
'measurement': 'mesa_pd_benchmark',
'tags': {
'host' : os.uname()[1],
'image' : os.environ["DOCKER_IMAGE_NAME"],
},
'time': int(time.time()),
'fields': tts
}
]
print(tts)
self.client.write_points(json_body, time_precision='s')
def __init__(self):
try:
self.write_user_pw = os.environ["INFLUXDB_MESAPD_PW"]
except KeyError:
import sys
print('Password for the InfluxDB write_user was not set.\n',
'See https://docs.gitlab.com/ee/ci/variables/#secret-variables', file=sys.stderr)
exc_info = sys.exc_info()
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
self.client = InfluxDBClient('i10grafana.informatik.uni-erlangen.de', 8086,
'mesa_pd', self.write_user_pw, 'mesa_pd')
def process(self, filename):
tts = dict()
with open(filename) as f:
for s in f.readlines():
m = re.search(r'\[0\]\s*(\w*)\s*\|[\s\d\.\%]*\|\s*([\d\.]*)', s)
if m is not None:
tts[m.group(1)] = float(m.group(2))
json_body = [
{
'measurement': 'mesa_pd_benchmark',
'tags': {
'host': os.uname()[1],
'image': os.environ["DOCKER_IMAGE_NAME"],
},
'time': int(time.time()),
'fields': tts
}
]
print(tts)
self.client.write_points(json_body, time_precision='s')
if __name__ == "__main__":
up = Upload()
up.process("mesa_pd.txt")
up = Upload()
up.process("mesa_pd.txt")
# -*- coding: utf-8 -*-
import os
import time
import math
import random
import re
from influxdb import InfluxDBClient
from git import Repo
class Upload:
def __init__(self):
try:
self.write_user_pw = os.environ["INFLUXDB_WRITE_USER"]
except KeyError:
import sys
print('Password for the InfluxDB write_user was not set.\n',
'See https://docs.gitlab.com/ee/ci/variables/#secret-variables', file=sys.stderr)
exc_info = sys.exc_info()
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
self.client = InfluxDBClient('i10grafana.informatik.uni-erlangen.de', 8086,
'pe', self.write_user_pw, 'pe')
def process(self, filename, model, friction, sync, parallelization):
with open(filename) as f:
s = f.read()
m = re.search('PUpS: (\S*)', s)
json_body = [
{
'measurement': 'pe_benchmark',
'tags': {
'host' : os.uname()[1],
'image' : os.environ["DOCKER_IMAGE_NAME"],
'model' : model,
'friction' : friction,
'sync' : sync,
'parallelization' : parallelization
},
'time': int(time.time()),
'fields': {'PUpS': float(m.group(1))}
}
]
print(float(m.group(1)))
self.client.write_points(json_body, time_precision='s')
def __init__(self):
try:
self.write_user_pw = os.environ["INFLUXDB_WRITE_USER"]
except KeyError:
import sys
print('Password for the InfluxDB write_user was not set.\n',
'See https://docs.gitlab.com/ee/ci/variables/#secret-variables', file=sys.stderr)
exc_info = sys.exc_info()
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
if __name__ == "__main__":
up = Upload()
up.process("GranularGas_DEM_NN.txt", "DEM", "Coulomb", "next neighbors", "8P1T")
up.process("GranularGas_DEM_SO.txt", "DEM", "Coulomb", "shadow owners", "8P1T")
up.process("GranularGas_HCSITS_NN_IFC.txt", "HCSITS", "InelasticFrictionlessContact", "next neighbors", "8P1T")
up.process("GranularGas_HCSITS_NN_AICCBD.txt", "HCSITS", "ApproximateInelasticCoulombContactByDecoupling", "next neighbors", "8P1T")
up.process("GranularGas_HCSITS_NN_ICCBD.txt", "HCSITS", "InelasticCoulombContactByDecoupling", "next neighbors", "8P1T")
up.process("GranularGas_HCSITS_NN_IGMDC.txt", "HCSITS", "InelasticGeneralizedMaximumDissipationContact", "next neighbors", "8P1T")
up.process("GranularGas_HCSITS_SO_IFC.txt", "HCSITS", "InelasticFrictionlessContact", "shadow owners", "8P1T")
self.client = InfluxDBClient('i10grafana.informatik.uni-erlangen.de', 8086,
'pe', self.write_user_pw, 'pe')
def process(self, filename, model, friction, sync, parallelization):
with open(filename) as f:
s = f.read()
m = re.search(r'PUpS: (\S*)', s)
json_body = [
{
'measurement': 'pe_benchmark',
'tags': {
'host': os.uname()[1],
'image': os.environ["DOCKER_IMAGE_NAME"],
'model': model,
'friction': friction,
'sync': sync,
'parallelization': parallelization
},
'time': int(time.time()),
'fields': {'PUpS': float(m.group(1))}
}
]
print(float(m.group(1)))
self.client.write_points(json_body, time_precision='s')
if __name__ == "__main__":
up = Upload()
up.process("GranularGas_DEM_NN.txt", "DEM", "Coulomb", "next neighbors", "8P1T")
up.process("GranularGas_DEM_SO.txt", "DEM", "Coulomb", "shadow owners", "8P1T")
up.process("GranularGas_HCSITS_NN_IFC.txt", "HCSITS", "InelasticFrictionlessContact", "next neighbors", "8P1T")
up.process("GranularGas_HCSITS_NN_AICCBD.txt", "HCSITS", "ApproximateInelasticCoulombContactByDecoupling",
"next neighbors", "8P1T")
up.process("GranularGas_HCSITS_NN_ICCBD.txt", "HCSITS", "InelasticCoulombContactByDecoupling", "next neighbors",
"8P1T")
up.process("GranularGas_HCSITS_NN_IGMDC.txt", "HCSITS", "InelasticGeneralizedMaximumDissipationContact",
"next neighbors", "8P1T")
up.process("GranularGas_HCSITS_SO_IFC.txt", "HCSITS", "InelasticFrictionlessContact", "shadow owners", "8P1T")
......@@ -54,10 +54,14 @@ if __name__ == '__main__':
ps.add_property("dw", "walberla::mesa_pd::Vec3", defValue="real_t(0)", syncMode="NEVER")
# Properties for lbm_mesapd_coupling:
ps.add_property("hydrodynamicForce", "walberla::mesa_pd::Vec3", defValue="real_t(0)", syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("hydrodynamicTorque", "walberla::mesa_pd::Vec3", defValue="real_t(0)", syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("oldHydrodynamicForce", "walberla::mesa_pd::Vec3", defValue="real_t(0)", syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("oldHydrodynamicTorque", "walberla::mesa_pd::Vec3", defValue="real_t(0)", syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("hydrodynamicForce", "walberla::mesa_pd::Vec3", defValue="real_t(0)",
syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("hydrodynamicTorque", "walberla::mesa_pd::Vec3", defValue="real_t(0)",
syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("oldHydrodynamicForce", "walberla::mesa_pd::Vec3", defValue="real_t(0)",
syncMode="ON_OWNERSHIP_CHANGE")
ps.add_property("oldHydrodynamicTorque", "walberla::mesa_pd::Vec3", defValue="real_t(0)",
syncMode="ON_OWNERSHIP_CHANGE")
ch = mpd.add(data.ContactHistory())
ch.add_property("tangentialSpringDisplacement", "walberla::mesa_pd::Vec3", defValue="real_t(0)")
......
......@@ -31,7 +31,9 @@ class ContactHistory():
if not (prop['type'] == type and prop['name'] == name and prop['defValue'] == defValue):
new_prop = create_contact_history_property(name, type, defValue=defValue)
raise RuntimeError(
f"{TerminalColor.RED} property definition differs from previous one:\nPREVIOUS {prop}\nNEW {new_prop} {TerminalColor.DEFAULT}")
f"{TerminalColor.RED} property definition differs from previous one:\n"
f"PREVIOUS {prop}\n"
f"NEW {new_prop} {TerminalColor.DEFAULT}")
print(f"{TerminalColor.YELLOW} reusing property: {name} {TerminalColor.DEFAULT}")
def add_include(self, include):
......
......@@ -32,7 +32,9 @@ class ContactStorage():
if not (prop['type'] == type and prop['name'] == name and prop['defValue'] == defValue):
new_prop = create_contact_storage_property(name, type, defValue=defValue)
raise RuntimeError(
f"{TerminalColor.RED} property definition differs from previous one:\nPREVIOUS {prop}\nNEW {new_prop} {TerminalColor.DEFAULT}")
f"{TerminalColor.RED} property definition differs from previous one:\n"
f"PREVIOUS {prop}\n"
f"NEW {new_prop} {TerminalColor.DEFAULT}")
print(f"{TerminalColor.YELLOW} reusing property: {name} {TerminalColor.DEFAULT}")
def add_include(self, include):
......
......@@ -72,7 +72,9 @@ class ParticleStorage():
if not (prop['type'] == type and prop['name'] == name and prop['defValue'] == defValue):
new_prop = create_particle_property(name, type, defValue=defValue, syncMode=syncMode)
raise RuntimeError(
f"{TerminalColor.RED} property definition differs from previous one:\nPREVIOUS {prop}\nNEW {new_prop} {TerminalColor.DEFAULT}")
f"{TerminalColor.RED} property definition differs from previous one:\n"
f"PREVIOUS {prop}\n"
f"NEW {new_prop} {TerminalColor.DEFAULT}")
print(f"{TerminalColor.YELLOW} reusing particle property: {name} {TerminalColor.DEFAULT}")
def add_include(self, include):
......
......@@ -7,11 +7,15 @@ from mesa_pd.utility import generate_file
class DetectAndStoreContacts:
def __init__(self):
self.context = {'interface': [create_access("uid", "walberla::id_t", access="g"),
create_access("flags", "walberla::mesa_pd::data::particle_flags::FlagT", access="g"),
create_access("position", "walberla::mesa_pd::Vec3", access="g"),
create_access("rotation", "walberla::mesa_pd::Rot3", access="g"),
create_access("shape", "BaseShape*", access="g")]}
self.context = {
'interface': [
create_access("uid", "walberla::id_t", access="g"),
create_access("flags", "walberla::mesa_pd::data::particle_flags::FlagT", access="g"),
create_access("position", "walberla::mesa_pd::Vec3", access="g"),
create_access("rotation", "walberla::mesa_pd::Rot3", access="g"),
create_access("shape", "BaseShape*", access="g")
]
}
def generate(self, module):
ctx = {'module': module, **self.context}
......
......@@ -6,12 +6,15 @@ from mesa_pd.utility import generate_file
class ExplicitEuler:
def __init__(self, integrate_rotation=True):
self.context = {'bIntegrateRotation': integrate_rotation, 'interface': []}
self.context['interface'].append(create_access("position", "walberla::mesa_pd::Vec3", access="gs"))
self.context['interface'].append(create_access("linearVelocity", "walberla::mesa_pd::Vec3", access="gs"))
self.context['interface'].append(create_access("invMass", "walberla::real_t", access="g"))
self.context['interface'].append(create_access("force", "walberla::mesa_pd::Vec3", access="gs"))
self.context['interface'].append(create_access("flags", "walberla::mesa_pd::data::particle_flags::FlagT", access="g"))
self.context = {'bIntegrateRotation': integrate_rotation,
'interface': [
create_access("position", "walberla::mesa_pd::Vec3", access="gs"),
create_access("linearVelocity", "walberla::mesa_pd::Vec3", access="gs"),
create_access("invMass", "walberla::real_t", access="g"),
create_access("force", "walberla::mesa_pd::Vec3", access="gs"),
create_access("flags", "walberla::mesa_pd::data::particle_flags::FlagT", access="g")
]
}
if integrate_rotation:
self.context['interface'].append(create_access("rotation", "walberla::mesa_pd::Rot3", access="gs"))
......@@ -25,6 +28,7 @@ class ExplicitEuler:
ctx["InterfaceTestName"] = "ExplicitEulerInterfaceCheck"
ctx["KernelInclude"] = "kernel/ExplicitEuler.h"
ctx["ExplicitInstantiation"] = "template void kernel::ExplicitEuler::operator()(const size_t p_idx1, Accessor& ac) const;"
ctx["ExplicitInstantiation"] = \
"template void kernel::ExplicitEuler::operator()(const size_t p_idx1, Accessor& ac) const;"
generate_file(module['test_path'], 'tests/CheckInterface.templ.cpp', ctx,
'kernel/interfaces/ExplicitEulerInterfaceCheck.cpp')
......@@ -6,19 +6,26 @@ from mesa_pd.utility import generate_file
class ForceLJ:
def __init__(self):
self.context = {'interface': []}
self.context['interface'].append(create_access("position", "walberla::mesa_pd::Vec3", access="g"))
self.context['interface'].append(create_access("force", "walberla::mesa_pd::Vec3", access="r"))
self.context['interface'].append(create_access("type", "uint_t", access="g"))
self.context = {
'interface': [
create_access("position", "walberla::mesa_pd::Vec3", access="g"),
create_access("force", "walberla::mesa_pd::Vec3", access="r"),
create_access("type", "uint_t", access="g")
]
}
def generate(self, module):
ctx = {'module': module, **self.context}
ctx["parameters"] = ["epsilon", "sigma"]
ctx = {
'module': module,
**self.context,
"parameters": ["epsilon", "sigma"]
}
generate_file(module['module_path'], 'kernel/ForceLJ.templ.h', ctx)
ctx["InterfaceTestName"] = "ForceLJInterfaceCheck"
ctx["KernelInclude"] = "kernel/ForceLJ.h"
ctx["ExplicitInstantiation"] = "template void kernel::ForceLJ::operator()(const size_t p_idx1, const size_t p_idx2, Accessor& ac) const;"
ctx["ExplicitInstantiation"] = \
"template void kernel::ForceLJ::operator()(const size_t p_idx1, const size_t p_idx2, Accessor& ac) const;"
generate_file(module['test_path'], 'tests/CheckInterface.templ.cpp', ctx,
'kernel/interfaces/ForceLJInterfaceCheck.cpp')
......@@ -6,10 +6,13 @@ from mesa_pd.utility import generate_file
class HeatConduction:
def __init__(self):
self.context = {'interface': []}
self.context['interface'].append(create_access("temperature", "walberla::real_t", access="g"))
self.context['interface'].append(create_access("heatFlux", "walberla::real_t", access="gsr"))
self.context['interface'].append(create_access("type", "uint_t", access="g"))
self.context = {
'interface': [
create_access("temperature", "walberla::real_t", access="g"),
create_access("heatFlux", "walberla::real_t", access="gsr"),
create_access("type", "uint_t", access="g")
]
}
def generate(self, module):
ctx = {'module': module,
......@@ -20,6 +23,10 @@ class HeatConduction:
ctx["InterfaceTestName"] = "HeatConductionInterfaceCheck"
ctx["KernelInclude"] = "kernel/HeatConduction.h"
ctx["ExplicitInstantiation"] = "template void kernel::HeatConduction::operator()(const size_t p_idx1, const size_t p_idx2, Accessor& ac) const;"
ctx["ExplicitInstantiation"] = \
"template void kernel::HeatConduction::operator()(" \
"const size_t p_idx1, " \
"const size_t p_idx2, " \
"Accessor& ac) const;"
generate_file(module['test_path'], 'tests/CheckInterface.templ.cpp', ctx,
'kernel/interfaces/HeatConductionInterfaceCheck.cpp')
......@@ -24,7 +24,13 @@ class SpringDashpot:
ctx["InterfaceTestName"] = "SpringDashpotInterfaceCheck"
ctx["KernelInclude"] = "kernel/SpringDashpot.h"
ctx[
"ExplicitInstantiation"] = "template void kernel::SpringDashpot::operator()(const size_t p_idx1, const size_t p_idx2, Accessor& ac, const Vec3& contactPoint, const Vec3& contactNormal, const real_t& penetrationDepth) const;"
ctx["ExplicitInstantiation"] = \
"template void kernel::SpringDashpot::operator()(" \
"const size_t p_idx1, " \
"const size_t p_idx2, " \
"Accessor& ac, " \
"const Vec3& contactPoint, " \
"const Vec3& contactNormal, " \
"const real_t& penetrationDepth) const;"
generate_file(module['test_path'], 'tests/CheckInterface.templ.cpp', ctx,
'kernel/interfaces/SpringDashpotInterfaceCheck.cpp')
......@@ -6,20 +6,27 @@ from mesa_pd.utility import generate_file
class TemperatureIntegration:
def __init__(self):
self.context = {'interface': []}
self.context['interface'].append(create_access("temperature", "walberla::real_t", access="gs"))
self.context['interface'].append(create_access("heatFlux", "walberla::real_t", access="gs"))
self.context['interface'].append(create_access("invMass", "walberla::real_t", access="g"))
self.context['interface'].append(create_access("type", "uint_t", access="g"))
self.context = {
'interface': [
create_access("temperature", "walberla::real_t", access="gs"),
create_access("heatFlux", "walberla::real_t", access="gs"),
create_access("invMass", "walberla::real_t", access="g"),
create_access("type", "uint_t", access="g")
]
}
def generate(self, module):
ctx = {'module': module, **self.context}
ctx["parameters"] = ["invSpecificHeat"]
ctx = {
'module': module,