From 8a41a3973167302b1b5e76614a16a7baea3a4979 Mon Sep 17 00:00:00 2001 From: darcones Date: Tue, 9 May 2023 10:30:50 +0200 Subject: [PATCH 01/32] First implementation metadata report --- .../sensor_definition/base_sensor.py | 15 +++++++++++++++ .../sensor_definition/reaction_force_sensor.py | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 8af3897..900872f 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -45,6 +45,15 @@ def measure(self): def base_unit(): """Defines the base unit of this sensor""" + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = {} + metadata["name"] = self.name + metadata["type"] = self.__class__.__name__ + metadata["units"] = self.units.units + metadata["magnitud"] = self.units.units.magnitude_name + return metadata + def get_data_list(self) -> pint.Quantity[list]: """Returns the measured data with respective unit @@ -142,3 +151,9 @@ def measure(self): @abstractmethod def base_unit(): """Defines the base unit of this sensor, must be specified by child""" + + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = super().report_metadata() + metadata["where"] = self.where + return metadata diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py index f32b383..77b2be4 100644 --- a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py @@ -88,6 +88,12 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: self.data.append(reaction_force_vector) self.time.append(t) + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = super().report_metadata() + metadata["surface"] = self.surface + return metadata + @staticmethod def base_unit() -> ureg: """Defines the base unit of this sensor From 19c41331810ac29f4f0580f396a1b4a816a53172 Mon Sep 17 00:00:00 2001 From: darcones Date: Tue, 9 May 2023 12:01:11 +0200 Subject: [PATCH 02/32] Testing sensor metadata reporting --- src/fenicsxconcrete/sensor_definition/base_sensor.py | 4 ++-- .../sensor_definition/reaction_force_sensor.py | 2 +- tests/sensor_definition/test_point_sensors.py | 5 +++++ tests/sensor_definition/test_reaction_force_sensor.py | 9 +++++++++ tests/sensor_definition/test_sensors.py | 10 ++++++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 900872f..233e631 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -50,8 +50,8 @@ def report_metadata(self) -> dict: metadata = {} metadata["name"] = self.name metadata["type"] = self.__class__.__name__ - metadata["units"] = self.units.units - metadata["magnitud"] = self.units.units.magnitude_name + metadata["units"] = f"{self.units.u}" + metadata["dimensionality"] = f"{self.units.dimensionality}" return metadata def get_data_list(self) -> pint.Quantity[list]: diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py index 77b2be4..a798bf4 100644 --- a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py @@ -91,7 +91,7 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() - metadata["surface"] = self.surface + metadata["surface"] = self.surface.__name__ return metadata @staticmethod diff --git a/tests/sensor_definition/test_point_sensors.py b/tests/sensor_definition/test_point_sensors.py index 12bb452..9ea4a2f 100644 --- a/tests/sensor_definition/test_point_sensors.py +++ b/tests/sensor_definition/test_point_sensors.py @@ -27,3 +27,8 @@ def test_point_sensor(point_sensor) -> None: # check that something is stored data = fem_problem.sensors[sensor.name].get_last_entry() assert data is not None + + # check that location metadata is reported correctly + # other metadata tested in test_sensors.py + metadata = sensor.report_metadata() + assert metadata["where"] == sensor_location diff --git a/tests/sensor_definition/test_reaction_force_sensor.py b/tests/sensor_definition/test_reaction_force_sensor.py index 2dd386b..8fc10f7 100644 --- a/tests/sensor_definition/test_reaction_force_sensor.py +++ b/tests/sensor_definition/test_reaction_force_sensor.py @@ -77,6 +77,12 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: assert force_top == pytest.approx(-1 * force_bottom) # checking equal forces on sides assert force_left == pytest.approx(force_bottom) + # checking report metadata + # TODO Figure out how to identify which boundary is applied + assert fem_problem.sensors.ReactionForceSensor.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensor2.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensor3.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensor4.report_metadata()["surface"] == "boundary" if dim == 3: force_front = fem_problem.sensors.ReactionForceSensor5.get_last_entry().magnitude[1] @@ -86,6 +92,9 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: assert force_front == pytest.approx(-1 * force_back) # checking equal forces left-front assert force_left == pytest.approx(force_front) + # checking report metadata + assert fem_problem.sensors.ReactionForceSensor5.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensor6.report_metadata()["surface"] == "boundary" @pytest.mark.parametrize("dim", [2, 3]) diff --git a/tests/sensor_definition/test_sensors.py b/tests/sensor_definition/test_sensors.py index 65be7b9..1cff267 100644 --- a/tests/sensor_definition/test_sensors.py +++ b/tests/sensor_definition/test_sensors.py @@ -41,6 +41,16 @@ def test_base_sensor() -> None: assert u_sensor.get_last_entry().units == ureg.millimeter # check magnitude assert m_data.magnitude == pytest.approx(mm_data.magnitude / 1000) + # testing metadata report + metadata = u_sensor.report_metadata() + true_metadata = { + "name": "DisplacementSensor", + "type": "DisplacementSensor", + "units": "millimeter", + "dimensionality": "[length]" + } + for key in true_metadata: + assert key in metadata and true_metadata[key] == metadata[key] @pytest.mark.parametrize("sensor", [DisplacementSensor, ReactionForceSensor, StressSensor, StrainSensor]) From cc96dc7d925660e7762cba40846859cc8eeafaf1 Mon Sep 17 00:00:00 2001 From: darcones Date: Tue, 9 May 2023 14:33:03 +0200 Subject: [PATCH 03/32] Fix format and units --- src/fenicsxconcrete/sensor_definition/base_sensor.py | 4 ++-- .../sensor_definition/reaction_force_sensor.py | 4 ++-- tests/sensor_definition/test_sensors.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 233e631..2fce074 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -50,7 +50,7 @@ def report_metadata(self) -> dict: metadata = {} metadata["name"] = self.name metadata["type"] = self.__class__.__name__ - metadata["units"] = f"{self.units.u}" + metadata["units"] = f"{self.units.units}" metadata["dimensionality"] = f"{self.units.dimensionality}" return metadata @@ -155,5 +155,5 @@ def base_unit(): def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() - metadata["where"] = self.where + metadata["where"] = self.where return metadata diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py index a798bf4..f869509 100644 --- a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py @@ -91,9 +91,9 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() - metadata["surface"] = self.surface.__name__ + metadata["surface"] = self.surface.__name__ return metadata - + @staticmethod def base_unit() -> ureg: """Defines the base unit of this sensor diff --git a/tests/sensor_definition/test_sensors.py b/tests/sensor_definition/test_sensors.py index 1cff267..bbba1c7 100644 --- a/tests/sensor_definition/test_sensors.py +++ b/tests/sensor_definition/test_sensors.py @@ -47,7 +47,7 @@ def test_base_sensor() -> None: "name": "DisplacementSensor", "type": "DisplacementSensor", "units": "millimeter", - "dimensionality": "[length]" + "dimensionality": "[length]", } for key in true_metadata: assert key in metadata and true_metadata[key] == metadata[key] From e06cd4009460ab0018635aae4019db8890832ff5 Mon Sep 17 00:00:00 2001 From: darcones Date: Tue, 9 May 2023 15:19:47 +0200 Subject: [PATCH 04/32] Fixed units for push tests --- src/fenicsxconcrete/sensor_definition/base_sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 2fce074..6e83cb6 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -50,7 +50,7 @@ def report_metadata(self) -> dict: metadata = {} metadata["name"] = self.name metadata["type"] = self.__class__.__name__ - metadata["units"] = f"{self.units.units}" + metadata["units"] = f"{self.units._units}" metadata["dimensionality"] = f"{self.units.dimensionality}" return metadata From 4dc82e800a5b967d6d5512ba1f705444258411ea Mon Sep 17 00:00:00 2001 From: darcones Date: Tue, 9 May 2023 16:54:56 +0200 Subject: [PATCH 05/32] Initial schema --- .../sensor_definition/sensor_schema.json | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 src/fenicsxconcrete/sensor_definition/sensor_schema.json diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.json b/src/fenicsxconcrete/sensor_definition/sensor_schema.json new file mode 100644 index 0000000..f80767e --- /dev/null +++ b/src/fenicsxconcrete/sensor_definition/sensor_schema.json @@ -0,0 +1,199 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "SensorsList", + "type": "object", + "properties": { + "sensors": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/definitions/BaseSensor" + }, + { + "$ref": "#/definitions/PointSensor" + }, + { + "$ref": "#/definitions/DisplacementSensor" + }, + { + "$ref": "#/definitions/ReactionForceSensor" + }, + { + "$ref": "#/definitions/StrainSensor" + }, + { + "$ref": "#/definitions/StressSensor" + } + ] + } + } + }, + "definitions": { + "baseSensorProperties": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "A unique identifier for the sensor" + }, + "type": { + "type": "string", + "description": "The python class for the sensor" + }, + "unit": { + "type": "string", + "description": "The unit of measurement for the sensor" + }, + "dimensionality": { + "type": "string", + "description": "The dimensionality of measurement for the sensor between brackets []" + } + }, + "required": [ + "id", + "type", + "unit", + "dimensionality" + ] + }, + "pointSensorProperties": { + "allOf": [ + { + "$ref": "#/definitions/baseSensorProperties" + }, + { + "type": "object", + "properties": { + "where": { + "type": "array", + "description": "Location of the sensor" + } + }, + "required": [ + "where" + ] + } + ] + }, + "BaseSensor": { + "allOf": [ + { + "$ref": "#/definitions/baseSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "BaseSensor", + "description": "The type of sensor" + } + }, + "required": [ + "type" + ] + } + ] + }, + "PointSensor": { + "allOf": [ + { + "$ref": "#/definitions/pointSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PointSensor", + "description": "The type of sensor" + } + }, + "required": [ + "type" + ] + } + ] + }, + "DisplacementSensor": { + "allOf": [ + { + "$ref": "#/definitions/pointSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "DisplacementSensor", + "description": "The type of sensor" + } + }, + "required": [ + "type" + ] + } + ] + }, + "ReactionForceSensor": { + "allOf": [ + { + "$ref": "#/definitions/baseSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "ReactionForceSensor", + "description": "The type of sensor" + }, + "surface": { + "type": "string", + "description": "Surface where the reactionforce is measured" + } + }, + "required": [ + "type", + "surface" + ] + } + ] + }, + "StrainSensor": { + "allOf": [ + { + "$ref": "#/definitions/pointSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "StrainSensor", + "description": "The type of sensor" + } + }, + "required": [ + "type" + ] + } + ] + }, + "StressSensor": { + "allOf": [ + { + "$ref": "#/definitions/pointSensorProperties" + }, + { + "type": "object", + "properties": { + "type": { + "const": "StressSensor", + "description": "The type of sensor" + } + }, + "required": [ + "type" + ] + } + ] + } + } + } \ No newline at end of file From d51906524d53ef92a512a5e8492206ea0d9a2572 Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 10 May 2023 15:07:49 +0200 Subject: [PATCH 06/32] Implemented sensor metadata report and schema --- .vscode/settings.json | 8 + .../finite_element_problem/base_material.py | 19 ++ .../sensor_definition/sensor_schema.json | 199 ------------------ .../sensor_definition/sensor_schema.py | 119 +++++++++++ .../test_base_material.py | 20 ++ 5 files changed, 166 insertions(+), 199 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 src/fenicsxconcrete/sensor_definition/sensor_schema.json create mode 100644 src/fenicsxconcrete/sensor_definition/sensor_schema.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5af6191 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "basic" +} \ No newline at end of file diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 8e270a1..2d5e85f 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -1,3 +1,4 @@ +import json from abc import ABC, abstractmethod from pathlib import Path, PosixPath @@ -99,6 +100,24 @@ def delete_sensor(self) -> None: del self.sensors self.sensors = self.SensorDict() + def export_sensor_metadata(self, path: Path) -> None: + """Exports sensor metadata to JSON file according to the appropriate schema. + + Args: + path : Path + Path where the metadata should be stored + + """ + + sensors_metadata_dict = {} + + for key, value in self.sensors.items(): + sensors_metadata_dict[key] = value.report_metadata() + sensors_metadata_dict[key]["name"] = key + + with open(path, "w") as f: + json.dump(sensors_metadata_dict, f) + class SensorDict(dict): """ Dict that also allows to access the parameter p["parameter"] via the matching attribute p.parameter diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.json b/src/fenicsxconcrete/sensor_definition/sensor_schema.json deleted file mode 100644 index f80767e..0000000 --- a/src/fenicsxconcrete/sensor_definition/sensor_schema.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "SensorsList", - "type": "object", - "properties": { - "sensors": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/definitions/BaseSensor" - }, - { - "$ref": "#/definitions/PointSensor" - }, - { - "$ref": "#/definitions/DisplacementSensor" - }, - { - "$ref": "#/definitions/ReactionForceSensor" - }, - { - "$ref": "#/definitions/StrainSensor" - }, - { - "$ref": "#/definitions/StressSensor" - } - ] - } - } - }, - "definitions": { - "baseSensorProperties": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "A unique identifier for the sensor" - }, - "type": { - "type": "string", - "description": "The python class for the sensor" - }, - "unit": { - "type": "string", - "description": "The unit of measurement for the sensor" - }, - "dimensionality": { - "type": "string", - "description": "The dimensionality of measurement for the sensor between brackets []" - } - }, - "required": [ - "id", - "type", - "unit", - "dimensionality" - ] - }, - "pointSensorProperties": { - "allOf": [ - { - "$ref": "#/definitions/baseSensorProperties" - }, - { - "type": "object", - "properties": { - "where": { - "type": "array", - "description": "Location of the sensor" - } - }, - "required": [ - "where" - ] - } - ] - }, - "BaseSensor": { - "allOf": [ - { - "$ref": "#/definitions/baseSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "BaseSensor", - "description": "The type of sensor" - } - }, - "required": [ - "type" - ] - } - ] - }, - "PointSensor": { - "allOf": [ - { - "$ref": "#/definitions/pointSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "PointSensor", - "description": "The type of sensor" - } - }, - "required": [ - "type" - ] - } - ] - }, - "DisplacementSensor": { - "allOf": [ - { - "$ref": "#/definitions/pointSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "DisplacementSensor", - "description": "The type of sensor" - } - }, - "required": [ - "type" - ] - } - ] - }, - "ReactionForceSensor": { - "allOf": [ - { - "$ref": "#/definitions/baseSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "ReactionForceSensor", - "description": "The type of sensor" - }, - "surface": { - "type": "string", - "description": "Surface where the reactionforce is measured" - } - }, - "required": [ - "type", - "surface" - ] - } - ] - }, - "StrainSensor": { - "allOf": [ - { - "$ref": "#/definitions/pointSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "StrainSensor", - "description": "The type of sensor" - } - }, - "required": [ - "type" - ] - } - ] - }, - "StressSensor": { - "allOf": [ - { - "$ref": "#/definitions/pointSensorProperties" - }, - { - "type": "object", - "properties": { - "type": { - "const": "StressSensor", - "description": "The type of sensor" - } - }, - "required": [ - "type" - ] - } - ] - } - } - } \ No newline at end of file diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.py b/src/fenicsxconcrete/sensor_definition/sensor_schema.py new file mode 100644 index 0000000..11bcde7 --- /dev/null +++ b/src/fenicsxconcrete/sensor_definition/sensor_schema.py @@ -0,0 +1,119 @@ +def generate_sensor_schema() -> dict: + """Function that returns the sensor schema. Necessary to include the schema in the package accessible. + + Returns: + Schema for sensor's list metadata + """ + + schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "SensorsList", + "type": "object", + "properties": { + "sensors": { + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/definitions/BaseSensor"}, + {"$ref": "#/definitions/PointSensor"}, + {"$ref": "#/definitions/DisplacementSensor"}, + {"$ref": "#/definitions/ReactionForceSensor"}, + {"$ref": "#/definitions/StrainSensor"}, + {"$ref": "#/definitions/StressSensor"}, + ] + }, + } + }, + "definitions": { + "baseSensorProperties": { + "type": "object", + "properties": { + "id": {"type": "string", "description": "A unique identifier for the sensor"}, + "type": {"type": "string", "description": "The python class for the sensor"}, + "unit": {"type": "string", "description": "The unit of measurement for the sensor"}, + "dimensionality": { + "type": "string", + "description": "The dimensionality of measurement for the sensor between brackets []", + }, + }, + "required": ["id", "type", "unit", "dimensionality"], + }, + "pointSensorProperties": { + "allOf": [ + {"$ref": "#/definitions/baseSensorProperties"}, + { + "type": "object", + "properties": {"where": {"type": "array", "description": "Location of the sensor"}}, + "required": ["where"], + }, + ] + }, + "BaseSensor": { + "allOf": [ + {"$ref": "#/definitions/baseSensorProperties"}, + { + "type": "object", + "properties": {"type": {"const": "BaseSensor", "description": "The type of sensor"}}, + "required": ["type"], + }, + ] + }, + "PointSensor": { + "allOf": [ + {"$ref": "#/definitions/pointSensorProperties"}, + { + "type": "object", + "properties": {"type": {"const": "PointSensor", "description": "The type of sensor"}}, + "required": ["type"], + }, + ] + }, + "DisplacementSensor": { + "allOf": [ + {"$ref": "#/definitions/pointSensorProperties"}, + { + "type": "object", + "properties": {"type": {"const": "DisplacementSensor", "description": "The type of sensor"}}, + "required": ["type"], + }, + ] + }, + "ReactionForceSensor": { + "allOf": [ + {"$ref": "#/definitions/baseSensorProperties"}, + { + "type": "object", + "properties": { + "type": {"const": "ReactionForceSensor", "description": "The type of sensor"}, + "surface": { + "type": "string", + "description": "Surface where the reactionforce is measured", + }, + }, + "required": ["type", "surface"], + }, + ] + }, + "StrainSensor": { + "allOf": [ + {"$ref": "#/definitions/pointSensorProperties"}, + { + "type": "object", + "properties": {"type": {"const": "StrainSensor", "description": "The type of sensor"}}, + "required": ["type"], + }, + ] + }, + "StressSensor": { + "allOf": [ + {"$ref": "#/definitions/pointSensorProperties"}, + { + "type": "object", + "properties": {"type": {"const": "StressSensor", "description": "The type of sensor"}}, + "required": ["type"], + }, + ] + }, + }, + } + return schema diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py index 6084fd4..c031b28 100644 --- a/tests/finite_element_problem/test_base_material.py +++ b/tests/finite_element_problem/test_base_material.py @@ -1,3 +1,7 @@ +import json +import os +from pathlib import Path + import pytest from fenicsxconcrete.experimental_setup.cantilever_beam import CantileverBeam @@ -65,6 +69,22 @@ def test_sensor_options() -> None: # check that some data is in sensor assert problem.sensors[sensor.name].data != [] + # check export sensor data + problem.export_sensor_metadata(Path("sensor_metadata.json")) + expected_metadata = { + "DisplacementSensor": { + "name": "DisplacementSensor", + "type": "DisplacementSensor", + "units": "meter", + "dimensionality": "[length]", + "where": [1, 0.0, 0.0], + } + } + with open("sensor_metadata.json", "r") as f: + sensor_metadata = json.load(f) + assert sensor_metadata == expected_metadata + os.remove("sensor_metadata.json") + # check cleaning of sensor data problem.clean_sensor_data() assert problem.sensors[sensor.name].data == [] From bae469d32a0b2e325e0425d5e47b7bc2cd63fa19 Mon Sep 17 00:00:00 2001 From: darcones Date: Thu, 11 May 2023 15:48:48 +0200 Subject: [PATCH 07/32] Validation of sensors against schema --- .../finite_element_problem/base_material.py | 29 ++++++++++++++++--- .../sensor_definition/base_sensor.py | 2 +- .../sensor_definition/sensor_schema.py | 6 ++-- .../test_base_material.py | 26 ++++++++++------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 2d5e85f..efb7ace 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -2,11 +2,13 @@ from abc import ABC, abstractmethod from pathlib import Path, PosixPath +import jsonschema import pint from fenicsxconcrete.experimental_setup.base_experiment import Experiment from fenicsxconcrete.helper import LogMixin, Parameters from fenicsxconcrete.sensor_definition.base_sensor import BaseSensor +from fenicsxconcrete.sensor_definition.sensor_schema import generate_sensor_schema from fenicsxconcrete.unit_registry import ureg @@ -100,7 +102,7 @@ def delete_sensor(self) -> None: del self.sensors self.sensors = self.SensorDict() - def export_sensor_metadata(self, path: Path) -> None: + def export_sensors_metadata(self, path: Path) -> None: """Exports sensor metadata to JSON file according to the appropriate schema. Args: @@ -109,15 +111,34 @@ def export_sensor_metadata(self, path: Path) -> None: """ - sensors_metadata_dict = {} + sensors_metadata_dict = {"sensors": []} for key, value in self.sensors.items(): - sensors_metadata_dict[key] = value.report_metadata() - sensors_metadata_dict[key]["name"] = key + sensors_metadata_dict["sensors"].append(value.report_metadata()) + # sensors_metadata_dict[key]["name"] = key with open(path, "w") as f: json.dump(sensors_metadata_dict, f) + def import_sensors_from_metadata(self, path: Path) -> None: + """Import sensor metadata to JSON file and validate with the appropriate schema. + + Args: + path : Path + Path where the metadata file is + + """ + + sensors_metadata_dict = {} + with open(path, "r") as f: + sensors_metadata_dict = json.load(f) + schema = generate_sensor_schema() + jsonschema.validate(instance=sensors_metadata_dict, schema=schema) + sensors_metadata_dict["DisplacementSensor2"] = {"name": "Dummy", "type": "Fail"} + jsonschema.validate(instance=sensors_metadata_dict, schema=schema) + + print("all ok") + class SensorDict(dict): """ Dict that also allows to access the parameter p["parameter"] via the matching attribute p.parameter diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 6e83cb6..d7f862a 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -48,7 +48,7 @@ def base_unit(): def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = {} - metadata["name"] = self.name + metadata["id"] = self.name metadata["type"] = self.__class__.__name__ metadata["units"] = f"{self.units._units}" metadata["dimensionality"] = f"{self.units.dimensionality}" diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.py b/src/fenicsxconcrete/sensor_definition/sensor_schema.py index 11bcde7..9167c63 100644 --- a/src/fenicsxconcrete/sensor_definition/sensor_schema.py +++ b/src/fenicsxconcrete/sensor_definition/sensor_schema.py @@ -6,7 +6,7 @@ def generate_sensor_schema() -> dict: """ schema = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/2020-12/schema#", "title": "SensorsList", "type": "object", "properties": { @@ -30,13 +30,13 @@ def generate_sensor_schema() -> dict: "properties": { "id": {"type": "string", "description": "A unique identifier for the sensor"}, "type": {"type": "string", "description": "The python class for the sensor"}, - "unit": {"type": "string", "description": "The unit of measurement for the sensor"}, + "units": {"type": "string", "description": "The unit of measurement for the sensor"}, "dimensionality": { "type": "string", "description": "The dimensionality of measurement for the sensor between brackets []", }, }, - "required": ["id", "type", "unit", "dimensionality"], + "required": ["id", "type", "units", "dimensionality"], }, "pointSensorProperties": { "allOf": [ diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py index c031b28..b9c59d3 100644 --- a/tests/finite_element_problem/test_base_material.py +++ b/tests/finite_element_problem/test_base_material.py @@ -70,20 +70,21 @@ def test_sensor_options() -> None: assert problem.sensors[sensor.name].data != [] # check export sensor data - problem.export_sensor_metadata(Path("sensor_metadata.json")) + problem.export_sensors_metadata(Path("sensors_metadata.json")) expected_metadata = { - "DisplacementSensor": { - "name": "DisplacementSensor", - "type": "DisplacementSensor", - "units": "meter", - "dimensionality": "[length]", - "where": [1, 0.0, 0.0], - } + "sensors": [ + { + "id": "DisplacementSensor", + "type": "DisplacementSensor", + "units": "meter", + "dimensionality": "[length]", + "where": [1, 0.0, 0.0], + } + ] } - with open("sensor_metadata.json", "r") as f: + with open("sensors_metadata.json", "r") as f: sensor_metadata = json.load(f) assert sensor_metadata == expected_metadata - os.remove("sensor_metadata.json") # check cleaning of sensor data problem.clean_sensor_data() @@ -92,3 +93,8 @@ def test_sensor_options() -> None: # delete sensor problem.delete_sensor() assert problem.sensors == {} + + # check import sensor data + problem.import_sensors_from_metadata(Path("sensors_metadata.json")) + + os.remove("sensors_metadata.json") From 78b8d3b7e8c3bec1696dfb3485de6f4ac4d6e478 Mon Sep 17 00:00:00 2001 From: darcones Date: Thu, 11 May 2023 16:12:47 +0200 Subject: [PATCH 08/32] Updated environment --- environment.yml | 1 + src/fenicsxconcrete/finite_element_problem/base_material.py | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/environment.yml b/environment.yml index cb7cb6e..013d1ae 100644 --- a/environment.yml +++ b/environment.yml @@ -8,6 +8,7 @@ dependencies: - matplotlib - python-gmsh - meshio + - jsonschema # tests - pytest - coverage diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index efb7ace..3826362 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -134,10 +134,6 @@ def import_sensors_from_metadata(self, path: Path) -> None: sensors_metadata_dict = json.load(f) schema = generate_sensor_schema() jsonschema.validate(instance=sensors_metadata_dict, schema=schema) - sensors_metadata_dict["DisplacementSensor2"] = {"name": "Dummy", "type": "Fail"} - jsonschema.validate(instance=sensors_metadata_dict, schema=schema) - - print("all ok") class SensorDict(dict): """ From b909283f9f462d9b77c75d92d5628b9c573f4533 Mon Sep 17 00:00:00 2001 From: darcones Date: Thu, 11 May 2023 16:20:17 +0200 Subject: [PATCH 09/32] Fixed test_sensor --- tests/sensor_definition/test_sensors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sensor_definition/test_sensors.py b/tests/sensor_definition/test_sensors.py index bbba1c7..bf72f2b 100644 --- a/tests/sensor_definition/test_sensors.py +++ b/tests/sensor_definition/test_sensors.py @@ -44,7 +44,7 @@ def test_base_sensor() -> None: # testing metadata report metadata = u_sensor.report_metadata() true_metadata = { - "name": "DisplacementSensor", + "id": "DisplacementSensor", "type": "DisplacementSensor", "units": "millimeter", "dimensionality": "[length]", From aa7bb1c609602d94afa915ff0d982c8b8c8a7e71 Mon Sep 17 00:00:00 2001 From: darcones Date: Thu, 11 May 2023 17:27:11 +0200 Subject: [PATCH 10/32] Initial rebuilding sensor --- .../finite_element_problem/base_material.py | 23 +++++++++++++++++++ .../sensor_definition/base_sensor.py | 3 +++ .../sensor_definition/displacement_sensor.py | 8 +++++++ .../reaction_force_sensor.py | 2 ++ .../sensor_definition/sensor_schema.py | 4 ++++ .../sensor_definition/strain_sensor.py | 8 +++++++ .../sensor_definition/stress_sensor.py | 8 +++++++ .../test_base_material.py | 10 +++++++- 8 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 3826362..5babc74 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -1,3 +1,4 @@ +import importlib import json from abc import ABC, abstractmethod from pathlib import Path, PosixPath @@ -129,12 +130,34 @@ def import_sensors_from_metadata(self, path: Path) -> None: """ + # Load and validate sensors_metadata_dict = {} with open(path, "r") as f: sensors_metadata_dict = json.load(f) schema = generate_sensor_schema() jsonschema.validate(instance=sensors_metadata_dict, schema=schema) + for sensor in sensors_metadata_dict["sensors"]: + # Dynamically import the module containing the class + module_name = "fenicsxconcrete.sensor_definition." + sensor["sensor_file"].lower() + module = importlib.import_module(module_name) + + # Create a dictionary of keyword arguments from the remaining properties in the dictionary + kwargs = { + k: v for k, v in sensor.items() if k not in ["id", "type", "sensor_file", "units", "dimensionality"] + } + + # Dynamically retrieve the class by its name + class_name = sensor["type"] + MySensorClass = getattr(module, class_name) + + # Instantiate an object of the class with the given properties + sensor_i = MySensorClass(**kwargs) + + # TODO Rebuild units and dimensionality from metadata + + self.add_sensor(sensor_i) + class SensorDict(dict): """ Dict that also allows to access the parameter p["parameter"] via the matching attribute p.parameter diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index d7f862a..7066be8 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os from abc import ABC, abstractmethod import pint @@ -50,6 +51,7 @@ def report_metadata(self) -> dict: metadata = {} metadata["id"] = self.name metadata["type"] = self.__class__.__name__ + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] metadata["units"] = f"{self.units._units}" metadata["dimensionality"] = f"{self.units.dimensionality}" return metadata @@ -155,5 +157,6 @@ def base_unit(): def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] metadata["where"] = self.where return metadata diff --git a/src/fenicsxconcrete/sensor_definition/displacement_sensor.py b/src/fenicsxconcrete/sensor_definition/displacement_sensor.py index e769552..f6d7562 100644 --- a/src/fenicsxconcrete/sensor_definition/displacement_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/displacement_sensor.py @@ -1,3 +1,5 @@ +import os + import dolfinx as df from fenicsxconcrete.finite_element_problem.base_material import MaterialProblem @@ -45,6 +47,12 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: self.data.append(displacement_data) self.time.append(t) + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = super().report_metadata() + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] + return metadata + @staticmethod def base_unit() -> ureg: """Defines the base unit of this sensor diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py index f869509..88b3bd3 100644 --- a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py @@ -1,3 +1,4 @@ +import os from collections.abc import Callable import dolfinx as df @@ -92,6 +93,7 @@ def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() metadata["surface"] = self.surface.__name__ + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] return metadata @staticmethod diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.py b/src/fenicsxconcrete/sensor_definition/sensor_schema.py index 9167c63..65fe49c 100644 --- a/src/fenicsxconcrete/sensor_definition/sensor_schema.py +++ b/src/fenicsxconcrete/sensor_definition/sensor_schema.py @@ -35,6 +35,10 @@ def generate_sensor_schema() -> dict: "type": "string", "description": "The dimensionality of measurement for the sensor between brackets []", }, + "sensor_file": { + "type": "string", + "description": "Python file where the sensor is defined whithout extension", + }, }, "required": ["id", "type", "units", "dimensionality"], }, diff --git a/src/fenicsxconcrete/sensor_definition/strain_sensor.py b/src/fenicsxconcrete/sensor_definition/strain_sensor.py index 72293ad..5ef406c 100644 --- a/src/fenicsxconcrete/sensor_definition/strain_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/strain_sensor.py @@ -1,3 +1,5 @@ +import os + import dolfinx as df import ufl @@ -59,6 +61,12 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: self.data.append(strain_data) self.time.append(t) + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = super().report_metadata() + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] + return metadata + @staticmethod def base_unit() -> ureg: """Defines the base unit of this sensor diff --git a/src/fenicsxconcrete/sensor_definition/stress_sensor.py b/src/fenicsxconcrete/sensor_definition/stress_sensor.py index ef69a85..519b91c 100644 --- a/src/fenicsxconcrete/sensor_definition/stress_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/stress_sensor.py @@ -1,3 +1,5 @@ +import os + import dolfinx as df import ufl @@ -58,6 +60,12 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: self.data.append(stress_data) self.time.append(t) + def report_metadata(self) -> dict: + """Generates dictionary with the metadata of this sensor""" + metadata = super().report_metadata() + metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] + return metadata + @staticmethod def base_unit() -> ureg: """Defines the base unit of this sensor diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py index b9c59d3..75fcc4d 100644 --- a/tests/finite_element_problem/test_base_material.py +++ b/tests/finite_element_problem/test_base_material.py @@ -67,7 +67,8 @@ def test_sensor_options() -> None: problem.solve() # check that some data is in sensor - assert problem.sensors[sensor.name].data != [] + measure = problem.sensors[sensor.name].data + assert measure != [] # check export sensor data problem.export_sensors_metadata(Path("sensors_metadata.json")) @@ -76,6 +77,7 @@ def test_sensor_options() -> None: { "id": "DisplacementSensor", "type": "DisplacementSensor", + "sensor_file": "displacement_sensor", "units": "meter", "dimensionality": "[length]", "where": [1, 0.0, 0.0], @@ -98,3 +100,9 @@ def test_sensor_options() -> None: problem.import_sensors_from_metadata(Path("sensors_metadata.json")) os.remove("sensors_metadata.json") + + # repeat solving and plotting + problem.solve() + + # repeat check that some data is in imported sensor + assert problem.sensors[sensor.name].data == pytest.approx(measure) From b039860f6b2b91ab0860869364a0e21fb5939d67 Mon Sep 17 00:00:00 2001 From: darcones Date: Fri, 12 May 2023 09:34:00 +0200 Subject: [PATCH 11/32] Rebuild sensors works without units --- src/fenicsxconcrete/finite_element_problem/base_material.py | 2 +- tests/finite_element_problem/test_base_material.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 5babc74..6e05589 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -152,7 +152,7 @@ def import_sensors_from_metadata(self, path: Path) -> None: MySensorClass = getattr(module, class_name) # Instantiate an object of the class with the given properties - sensor_i = MySensorClass(**kwargs) + sensor_i = MySensorClass(name=sensor["id"], **kwargs) # TODO Rebuild units and dimensionality from metadata diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py index 75fcc4d..0083c34 100644 --- a/tests/finite_element_problem/test_base_material.py +++ b/tests/finite_element_problem/test_base_material.py @@ -1,5 +1,6 @@ import json import os +from copy import deepcopy from pathlib import Path import pytest @@ -67,7 +68,7 @@ def test_sensor_options() -> None: problem.solve() # check that some data is in sensor - measure = problem.sensors[sensor.name].data + measure = deepcopy(problem.sensors[sensor.name].data) assert measure != [] # check export sensor data @@ -105,4 +106,4 @@ def test_sensor_options() -> None: problem.solve() # repeat check that some data is in imported sensor - assert problem.sensors[sensor.name].data == pytest.approx(measure) + assert problem.sensors[sensor.name].data[0] == pytest.approx(measure[0]) From 6e1caad0b6d20bc0294ba436416986b1988eada7 Mon Sep 17 00:00:00 2001 From: darcones Date: Fri, 12 May 2023 09:37:03 +0200 Subject: [PATCH 12/32] Set units in rebuilt sensors --- src/fenicsxconcrete/finite_element_problem/base_material.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 6e05589..1ec73d2 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -153,8 +153,7 @@ def import_sensors_from_metadata(self, path: Path) -> None: # Instantiate an object of the class with the given properties sensor_i = MySensorClass(name=sensor["id"], **kwargs) - - # TODO Rebuild units and dimensionality from metadata + sensor_i.set_units(units=sensor["units"]) self.add_sensor(sensor_i) From a4a46a11efb2cdc7382154b4a8753c952418db2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Andr=C3=A9s=20Arcones?= <81630834+danielandresarcones@users.noreply.github.com> Date: Fri, 12 May 2023 09:58:37 +0200 Subject: [PATCH 13/32] Delete settings.json --- .vscode/settings.json | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5af6191..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "python.testing.pytestArgs": [ - "tests" - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "python.analysis.typeCheckingMode": "basic" -} \ No newline at end of file From d8d88d057bef1d2114017c50dee5009577a56c4c Mon Sep 17 00:00:00 2001 From: darcones Date: Fri, 12 May 2023 14:26:18 +0200 Subject: [PATCH 14/32] Initial GRF translation --- environment.yml | 1 + src/fenicsxconcrete/gaussian_random_field.py | 399 +++++++++++++++++++ 2 files changed, 400 insertions(+) create mode 100644 src/fenicsxconcrete/gaussian_random_field.py diff --git a/environment.yml b/environment.yml index 013d1ae..8eb2e98 100644 --- a/environment.yml +++ b/environment.yml @@ -9,6 +9,7 @@ dependencies: - python-gmsh - meshio - jsonschema + - scipy # tests - pytest - coverage diff --git a/src/fenicsxconcrete/gaussian_random_field.py b/src/fenicsxconcrete/gaussian_random_field.py new file mode 100644 index 0000000..9ce49aa --- /dev/null +++ b/src/fenicsxconcrete/gaussian_random_field.py @@ -0,0 +1,399 @@ +import logging + +import dolfinx +import numpy as np +import scipy as sc +import ufl + + +class Randomfield(object): + def __init__( + self, fct_space, cov_name="squared_exp", mean=0, rho1=1, rho2=1, sigma=1, k=None, ktol=None, _type="" + ): + """ + Class for random field + generates a random field using Karahune Loeve decomposition + field of form: mean + sum_i sqr(lambda_i) EV_i xi_i + lambda_i, EV_i: eigenvalues and -vectors of covariance matrix C=c(r) + xi_i: new variables of random field (in general gaussian distributed N(0,1**2) + c(r=|x-y|): covariance function for distance between to space nodes x and y + + + Attributes: + logger: logger object + cov_name: name of covariance function to use + mean: mean of random field + rho1: correlation length x + rho2: correlation length z + sigma2: sigma**2 in covariance function + V: FE fct space for problem + k: number of eigenvectors to compute + ktol: tolerance to chose k (norm eigenvalue_k < ktol) + C: correlation matrix + M: mass matrix for eigenvalue problem + lambdas: eigenvalues + EV: eigenvectors + field: a representation of the field + values: values of the variables (set by user or choosen randomly) + values_means: values of the variables for asymptotic expansion to be set by user + _type: special case for correlation matrix + + Args: + fct_space: FE function space + cov_name: string with name of covariance function (e.g. exp, squared_exp ..) + mean: mean value of random field + rho1: correlation length x + rho2: correlation length z + sigma: covariance standard deviation + k: number of eigenvectors to compute + ktol: tolerance to chose k (norm eigenvalue_k < ktol) + _type: special cases + """ + + self.logger = logging.getLogger(__name__) + + self.cov_name = cov_name # name of covariance function to use + self.cov = getattr(self, "cov_" + cov_name) # select the right function + self.mean = mean # mean of random field + # self.rho = rho # correlation length + self.rho1 = rho1 # correlation length x + self.rho2 = rho2 # correlation length z + self.sigma2 = sigma**2 # sigma**2 in covariance function + self.V = fct_space # FE fct space for problem + if k: + self.k = k + self.ktol = ktol + + self.C = None # correlation matrix + self.M = None # mass matrix for eigenvalue problem + self.lambdas = [] # eigenvalues + self.EV = [] # eigenvectors + self.k = k # number of eigenvalues + self._type = _type # specail case for correlation matrix + + self.field = None # a representation of the field + self.values = np.zeros(self.k) # values of the variables (set by user or choosen randomly) + + self.values_means = np.zeros(self.k) # values of the variables for asymptotic expansion to be set by user!! + + def __str__(self): + """ + Overloaded description of the field. + """ + name = self.__class__.__name__ + name += "random field with cov fct %s, mean %s, rho1 %s, rho2 %s, k %s, sig2 %s" + return name % (self.cov_name, self.mean, self.rho1, self.rho2, self.k, self.sigma2) + + def __repr__(self): + """ + Overloaded description of the field. + """ + + return str(self) + + def cov_exp(self, r): + """ + Exponential covariance function: sig^2 exp(-r/rho) + + Args: + r: correlation lenghth + + Returns: + The covarinace sig^2 exp(-r/rho) + """ + return self.sigma2 * np.exp(-1 / self.rho * r) + + def cov_squared_exp(self, r1, r2): + """ + 2D-Exponential covariance function + + Args: + r1: correlation length in x + r2: correlation length in y + + Returns: + The covariance Squared Exponential covariance function + """ + return self.sigma2 * np.exp((-1 / (2 * self.rho1**2) * r1**2) - (1 / (2 * self.rho2**2) * r2**2)) + + def generate_C(self): + """ + Generate the covariance matrix for the random field representation + based on tutorial at http://www.wias-berlin.de/people/marschall/lesson3.html + + Returns: + self + """ + + # directly use dof coordinates (dof_to_vertex map does not work in higher order spaces) + coords = self.V.tabulate_dof_coordinates() + + self.logger.debug("shape coordinates %s", coords.shape) + + # evaluate covariance matrix + L = coords.shape[0] + c0 = np.repeat(coords, L, axis=0) + c1 = np.tile(coords, [L, 1]) + if self._type == "x": + r = np.absolute(c0[:, 0] - c1[:, 0]) + else: + r1 = c0[:, 0] - c1[:, 0] + r2 = c0[:, 1] - c1[:, 1] + C = self.cov(r1, r2) + + C.shape = [L, L] + + self.C = np.copy(C) + + return self + + def solve_covariance_EVP(self): + """ + Solve generalized eigenvalue problem to generate decomposition of C + based on tutorial at http://www.wias-berlin.de/people/marschall/lesson3.html + + Returns: + self + """ + + def get_A(A, B): + return np.dot(A, np.dot(B, A)) + + self.generate_C() + + # mass matrix + u = ufl.TrialFunction(self.V) + v = ufl.TestFunction(self.V) + + # assemble mass matrix and convert to scipy + aa = dolfinx.fem.form(ufl.dot(u, v) * ufl.dx) + M = dolfinx.fem.assemble_matrix(aa) # dolfin.assemble(u * v * ufl.dx) + self.M = M + self.M = M.to_dense() + + self.logger.debug("shape of M %s", self.M.shape) + + # solve generalized eigenvalue problem + A = get_A(self.M, self.C) + + self.logger.debug("shape of A %s", A.shape) + w, v = sc.linalg.eigh(A, self.M) + + self.logger.info("EVP size: %s, %s, %s", A.shape, w.shape, v.shape) + + # start with largest eigenvalue + w_reverse = w[::-1] + v_reverse = np.flip(v, 1) + + # compute self.k if self.ktol is given + if self.ktol != None: + self.logger.debug("self.ktol %s", self.ktol) + normed_lambdas = w_reverse / w_reverse[0] + self.logger.debug("normed_lambdas %s", normed_lambdas) + self.k = np.argmax(normed_lambdas <= self.ktol) + 1 # EV with smaller ktol will not be used + self.logger.info("required number of modes is %s (according tolerance %s)", self.k, self.ktol) + if self.k == 0: + raise ValueError('cannot select enough modes - tolerance "ktol" to small') + + # selected vectors / all values for plotting afterwards + self.lambdas = w_reverse + self.EV = v_reverse[:, 0 : self.k] + + self.logger.debug("eigenvalues %s", self.lambdas) + + return self + + def create_random_field(self, _type="random", _dist="N", plot=False, evp="generalized"): + """ + Create a fixed random field using random or fixed values for the new variables + + Args: + _type: how to choose the values for the random field variables (random or given) + _dist: which type of random field if 'N' standard gaussian if 'LN' lognormal field computed as exp(gauss field) + plot: if True plot eigenvalue decay + + Returns + Self + """ + + # generate decomposition: + + if len(self.lambdas) <= self.k: + if evp == "generalized": + self.solve_covariance_EVP() # generalized eigenvalue problem + elif evp == "standard": + self.solve_covariance_EVP_02() # standard eigenvalue problem + else: + raise ValueError(f"Eigenvalue problems can only be in standard or generalized form. Introduced {evp}.") + # else already computed + + if plot: + import matplotlib.pyplot as plt + + plt.figure() + plt.title("Eigenvalue decay of covariance matrix") + plt.semilogy(np.arange(len(self.lambdas)) + 1, self.lambdas) + plt.axvline(x=self.k - 1) + plt.show() + + # generate representations of variables + # create the output field gaussian random field + self.field = dolfinx.fem.Function(self.V) + new_data = np.zeros(len(self.field.vector[:])) + new_data += np.copy(self.mean) + + if _type == "random": + # random selection of gaussian variables + self.values = np.random.normal(0, 1, self.k) + self.logger.info("choose random values for xi %s", self.values) + elif _type == "given": + self.logger.info("choose given values for xi %s", self.values) + + # compute field representation with number of modes given in self.k or by self.ktol + self.lambdas = self.lambdas[0 : self.k] + self.EV = self.EV[:, 0 : self.k] + new = np.dot(self.EV, np.diag(np.sqrt(self.lambdas))) + new_data += np.dot(new, self.values) + + if _dist == "N": + self.logger.info("N given -> computes standard gauss field") + self.field.vector[:] = new_data[:] + elif _dist == "LN": + self.logger.info("LN given -> computes exp(gauss field)") + self.field.vector[:] = np.exp(new_data[:]) + else: + self.logger.error("distribution type <%s> not implemented", _dist) + raise ValueError("distribution type not implemented") + + return self + + def modes(self, num, plot=False): + """ + Create fenics functions for the first 'num' modes of the random field (= sqrt(\lambda)*eigenvector) + + Args: + num: specify number of functions needed + plot: plots the eigenvalue decay and modes if true + Returns: + out: Output field + """ + + # output field + out = list() + # check if eigenvectors already computed + if len(self.lambdas) < num: + self.solve_covariance_EVP() # generalized eigenvalue problem + + # transform discrete EV to fenics functions + for i in range(num): + fct = dolfinx.fem.Function(self.V) + fct.vector[:] = self.EV[:, i] * np.sqrt(self.lambdas[i]) + out.append(fct) + + self.logger.info( + f"eigenvalue[{self.k}-1]/eigenvalue[0]: {self.lambdas[self.k-1]/self.lambdas[0]}; eigenvalue[{self.k}-1] = {self.lambdas[self.k-1]} " + ) + + if plot: + import matplotlib.pyplot as plt + + plt.figure(1) + plt.title("Eigenvalue decay of covariance matrix") + plt.semilogy(np.arange(len(self.lambdas)) + 1, 1 / self.lambdas[0] * self.lambdas, "-*r", label="normed") + plt.axvline(x=num) # start with 1!! + # plt.show() + if self.V.mesh().topology().dim() == 1: + plt.figure(2) + plt.title("Eigenvectors \Phi_i \sqrt(\lambda_i)") + for i in range(num): + plt.plot( + out[i].function_space().tabulate_dof_coordinates()[:], + out[i].vector()[:], + "*", + label="EV %s" % (i), + ) # plotting over dof coordinates!! only as points because order not ongoing + plt.legend() + else: + for i in range(num): + plt.figure("10" + str(i)) + dolfinx.plot(self.V.mesh()) + plt_mode = dolfinx.plot(out[i]) + plt.colorbar(plt_mode) + plt.title("Eigen mode scaled with \sqrt(\lambda_i) %s" % (i)) + + plt.show() + + self.mode_data = out + + return out + + def save_modes_txt(self, file): + """ + Save modes in txt file for 1D problems + + Args: + file: filedirectory name + + Returns: + True if success + """ + self.logger.info("saving modes in txt file %s", file) + try: + a = len(self.mode_data) + except: + # generate modes + out = self.modes(self.k) + a = len(self.mode_data) + + if self.V.mesh().topology().dim() == 1: + x = self.V.tabulate_dof_coordinates()[:] + data_out = np.zeros((len(x), a)) + for i in range(a): + data_out[:, i] = self.mode_data[i].vector()[:] + + np.savetxt(file + ".txt", np.c_[x, data_out]) + + if self.V.mesh().topology().dim() > 1: + # save as pxdmf file + ##file_pvd=dolfin.File(file+'.pvd') + # file_xdmf = dolfin.XDMFFile(file+'.xdmf') + for i in range(a): + self.mode_data[i].rename("E_i", "E_i") + ##file_pvd << self.mode_data[i],i + # file_xdmf.write(self.mode_data[i],i) + + return True + + def solve_covariance_EVP_02(self): + """ + Solve eigenvalue problem assuming massmatrix == I --> standard eigenvalue problem + to generate decomposition of C + Returns: + self + """ + + self.generate_C() + + # solve generalized eigenvalue problem + A = self.C + w, v = np.linalg.eigh(A) # solve standard eigenvalue problem (faster) Eigenvalues in increasing order!! + + self.logger.info("EVP size: %s, %s, %s", A.shape, w.shape, v.shape) + + # start with largest eigenvalue + w_reverse = w[::-1] + v_reverse = np.flip(v, 1) + + # compute self.k if self.ktol is given + if self.ktol != None: + normed_lambdas = w_reverse / w_reverse[0] + self.logger.debug("normed_lambdas %s", normed_lambdas) + self.k = np.argmax(normed_lambdas <= self.ktol) + 1 # index starts with 0 + self.logger.info("required number of modes is %s (according tolerance %s)", self.k, self.ktol) + + # selected vectors / all values for plotting afterwards + self.lambdas = w_reverse + self.EV = v_reverse[:, 0 : self.k] + + self.logger.info("eigenvalues %s", self.lambdas) + return self From 05e76bba310acd6a5b7e16aa5c8d1167ce94e507 Mon Sep 17 00:00:00 2001 From: darcones Date: Fri, 12 May 2023 15:29:49 +0200 Subject: [PATCH 15/32] Working GRF problem --- .../linear_elasticity_grf.py | 143 ++++++++++++++++++ src/fenicsxconcrete/gaussian_random_field.py | 4 +- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py new file mode 100644 index 0000000..04e06a5 --- /dev/null +++ b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py @@ -0,0 +1,143 @@ +from pathlib import Path, PosixPath + +import dolfinx as df +import numpy as np +import pint +import ufl +from petsc4py.PETSc import ScalarType + +from fenicsxconcrete.experimental_setup.base_experiment import Experiment +from fenicsxconcrete.finite_element_problem.linear_elasticity import LinearElasticity +from fenicsxconcrete.gaussian_random_field import Randomfield + + +class LinearElasticityGRF(LinearElasticity): + """Material definition for linear elasticity""" + + def __init__( + self, + experiment: Experiment, + parameters: dict[str, pint.Quantity], + pv_name: str = "pv_output_full", + pv_path: str = None, + ) -> None: + super().__init__(experiment, parameters, pv_name, pv_path) + # TODO There should be more elegant ways of doing this + self.pv_egrf_file = Path(pv_path) / (pv_name + "egrf.xdmf") + self.pv_nugrf_file = Path(pv_path) / (pv_name + "nugrf.xdmf") + + def setup(self) -> None: + self.field_function_space = df.fem.FunctionSpace(self.experiment.mesh, ("CG", 1)) + self.lambda_ = df.fem.Function(self.field_function_space) + self.mu = df.fem.Function(self.field_function_space) + + lame1, lame2 = self.get_lames_constants() + self.lambda_.vector[:] = lame1 + self.mu.vector[ + : + ] = lame2 # make this vector as a fenics constant array. Update the lame1 and lame2 in each iteration. + + # define function space ets. + self.V = df.fem.VectorFunctionSpace(self.mesh, ("Lagrange", self.p["degree"])) # 2 for quadratic elements + self.V_scalar = df.fem.FunctionSpace(self.mesh, ("Lagrange", self.p["degree"])) + + # Define variational problem + self.u_trial = ufl.TrialFunction(self.V) + self.v = ufl.TestFunction(self.V) + + # initialize L field, not sure if this is the best way... + zero_field = df.fem.Constant(self.mesh, ScalarType(np.zeros(self.p["dim"]))) + self.L = ufl.dot(zero_field, self.v) * ufl.dx + + # apply external loads + external_force = self.experiment.create_force_boundary(self.v) + if external_force: + self.L = self.L + external_force + + body_force = self.experiment.create_body_force(self.v) + if body_force: + self.L = self.L + body_force + + # boundary conditions only after function space + bcs = self.experiment.create_displacement_boundary(self.V) + + self.a = ufl.inner(self.sigma(self.u_trial), self.epsilon(self.v)) * ufl.dx + self.weak_form_problem = df.fem.petsc.LinearProblem( + self.a, + self.L, + bcs=bcs, + petsc_options={"ksp_type": "preonly", "pc_type": "lu"}, + ) + + # Random E and nu fields. + def random_field_generator( + self, + field_function_space, + cov_name, + mean, + correlation_length1, + correlation_length2, + variance, + no_eigen_values, + ktol, + ): + random_field = Randomfield( + field_function_space, + cov_name, + mean, + correlation_length1, + correlation_length2, + variance, + no_eigen_values, + ktol, + ) + # random_field.solve_covariance_EVP() + return random_field + + def parameters_conversion(self, lognormal_mean, lognormal_sigma): + from math import sqrt + + normal_mean = np.log(lognormal_mean / sqrt(1 + (lognormal_sigma / lognormal_mean) ** 2)) + normal_sigma = np.log(1 + (lognormal_sigma / lognormal_mean) ** 2) + return normal_mean, normal_sigma + + def get_lames_constants( + self, + ): + # Random E and nu fields. + E_mean, E_variance = self.parameters_conversion(self.p["E"], 100e9) # 3 + Nu_mean, Nu_variance = self.parameters_conversion(self.p["nu"], 0.3) # 0.03 + + self.E_randomfield = self.random_field_generator( + self.field_function_space, "squared_exp", E_mean, 0.3, 0.05, E_variance, 3, 0.01 + ) + self.E_randomfield.create_random_field(_type="random", _dist="LN") + + self.nu_randomfield = self.random_field_generator( + self.field_function_space, "squared_exp", Nu_mean, 0.3, 0.05, Nu_variance, 3, 0.01 + ) + self.nu_randomfield.create_random_field(_type="random", _dist="LN") + + lame1 = (self.E_randomfield.field.vector[:] * self.nu_randomfield.field.vector[:]) / ( + (1 + self.nu_randomfield.field.vector[:]) * (1 - 2 * self.nu_randomfield.field.vector[:]) + ) + lame2 = self.E_randomfield.field.vector[:] / (2 * (1 + self.nu_randomfield.field.vector[:])) + return lame1, lame2 + + # TODO move this to sensor definition!?!?! + def pv_plot(self, t: int = 0) -> None: + # TODO add possibility for multiple time steps??? + # Displacement Plot + + # "Displacement.xdmf" + # pv_output_file + # TODO Look into how to unify in one file + with df.io.XDMFFile(self.mesh.comm, self.pv_output_file, "w") as xdmf: + xdmf.write_mesh(self.mesh) + xdmf.write_function(self.displacement) + with df.io.XDMFFile(self.mesh.comm, self.pv_egrf_file, "w") as xdmf: + xdmf.write_mesh(self.mesh) + xdmf.write_function(self.E_randomfield.field) + with df.io.XDMFFile(self.mesh.comm, self.pv_nugrf_file, "w") as xdmf: + xdmf.write_mesh(self.mesh) + xdmf.write_function(self.nu_randomfield.field) diff --git a/src/fenicsxconcrete/gaussian_random_field.py b/src/fenicsxconcrete/gaussian_random_field.py index 9ce49aa..39fd563 100644 --- a/src/fenicsxconcrete/gaussian_random_field.py +++ b/src/fenicsxconcrete/gaussian_random_field.py @@ -12,7 +12,7 @@ def __init__( ): """ Class for random field - generates a random field using Karahune Loeve decomposition + generates a random field using Karhunen Loeve decomposition field of form: mean + sum_i sqr(lambda_i) EV_i xi_i lambda_i, EV_i: eigenvalues and -vectors of covariance matrix C=c(r) xi_i: new variables of random field (in general gaussian distributed N(0,1**2) @@ -101,6 +101,7 @@ def cov_exp(self, r): Returns: The covarinace sig^2 exp(-r/rho) """ + # TODO: This does not work if rho return self.sigma2 * np.exp(-1 / self.rho * r) def cov_squared_exp(self, r1, r2): @@ -134,6 +135,7 @@ def generate_C(self): L = coords.shape[0] c0 = np.repeat(coords, L, axis=0) c1 = np.tile(coords, [L, 1]) + # TODO: This does not work if "x" if self._type == "x": r = np.absolute(c0[:, 0] - c1[:, 0]) else: From 452cc0a0e0a37e500cdc84d6d3082c81b7104355 Mon Sep 17 00:00:00 2001 From: darcones Date: Mon, 15 May 2023 09:56:22 +0200 Subject: [PATCH 16/32] Modified paraview output --- .../finite_element_problem/base_material.py | 5 +++ .../linear_elasticity_grf.py | 39 ++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 1ec73d2..15bc576 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -3,6 +3,7 @@ from abc import ABC, abstractmethod from pathlib import Path, PosixPath +import dolfinx as df import jsonschema import pint @@ -65,6 +66,10 @@ def __init__( self.residual = None # initialize residual + # set up xdmf file with mesh info + with df.io.XDMFFile(self.mesh.comm, self.pv_output_file, "w") as f: + f.write_mesh(self.mesh) + # setup the material object to access the function self.setup() diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py index 04e06a5..7b1fcf1 100644 --- a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py +++ b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py @@ -23,8 +23,7 @@ def __init__( ) -> None: super().__init__(experiment, parameters, pv_name, pv_path) # TODO There should be more elegant ways of doing this - self.pv_egrf_file = Path(pv_path) / (pv_name + "egrf.xdmf") - self.pv_nugrf_file = Path(pv_path) / (pv_name + "nugrf.xdmf") + self.pv_file = Path(pv_path) / (pv_name + ".xdmf") def setup(self) -> None: self.field_function_space = df.fem.FunctionSpace(self.experiment.mesh, ("CG", 1)) @@ -125,19 +124,23 @@ def get_lames_constants( return lame1, lame2 # TODO move this to sensor definition!?!?! - def pv_plot(self, t: int = 0) -> None: - # TODO add possibility for multiple time steps??? - # Displacement Plot - - # "Displacement.xdmf" - # pv_output_file - # TODO Look into how to unify in one file - with df.io.XDMFFile(self.mesh.comm, self.pv_output_file, "w") as xdmf: - xdmf.write_mesh(self.mesh) - xdmf.write_function(self.displacement) - with df.io.XDMFFile(self.mesh.comm, self.pv_egrf_file, "w") as xdmf: - xdmf.write_mesh(self.mesh) - xdmf.write_function(self.E_randomfield.field) - with df.io.XDMFFile(self.mesh.comm, self.pv_nugrf_file, "w") as xdmf: - xdmf.write_mesh(self.mesh) - xdmf.write_function(self.nu_randomfield.field) + def pv_plot(self, t: pint.Quantity | float = 1) -> None: + """creates paraview output at given time step + + Args: + t: time point of output (default = 1) + """ + print("create pv plot for t", t) + try: + _t = t.magnitude + except: + _t = t + + self.displacement.name = "Displacement" + self.E_randomfield.field.name = "E_field" + self.nu_randomfield.field.name = "nu_field" + + with df.io.XDMFFile(self.mesh.comm, self.pv_output_file, "a") as f: + f.write_function(self.displacement, _t) + f.write_function(self.E_randomfield.field, _t) + f.write_function(self.nu_randomfield.field, _t) From d75f441c1a0b846c30e06cf6ea41d1784ebe4b28 Mon Sep 17 00:00:00 2001 From: darcones Date: Mon, 15 May 2023 11:10:51 +0200 Subject: [PATCH 17/32] Made DisplacementSensor JSON serializable --- src/fenicsxconcrete/sensor_definition/base_sensor.py | 5 ++++- tests/sensor_definition/test_point_sensors.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py index 7066be8..1f46263 100644 --- a/src/fenicsxconcrete/sensor_definition/base_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/base_sensor.py @@ -158,5 +158,8 @@ def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] - metadata["where"] = self.where + if isinstance(self.where, list): + metadata["where"] = self.where + else: + metadata["where"] = list(self.where) return metadata diff --git a/tests/sensor_definition/test_point_sensors.py b/tests/sensor_definition/test_point_sensors.py index 9ea4a2f..57f36f3 100644 --- a/tests/sensor_definition/test_point_sensors.py +++ b/tests/sensor_definition/test_point_sensors.py @@ -1,3 +1,4 @@ +import numpy as np import pytest from fenicsxconcrete.finite_element_problem.linear_elasticity import LinearElasticity @@ -32,3 +33,8 @@ def test_point_sensor(point_sensor) -> None: # other metadata tested in test_sensors.py metadata = sensor.report_metadata() assert metadata["where"] == sensor_location + # check if location is not a list + sensor_location = np.array([0.0, 0.0, 0.0]) + sensor = point_sensor(sensor_location) + metadata = sensor.report_metadata() + assert metadata["where"] == pytest.approx(sensor_location) From ed89c6a8ff9a07b0c80e2366fd88653725e2c724 Mon Sep 17 00:00:00 2001 From: darcones Date: Mon, 15 May 2023 13:25:18 +0200 Subject: [PATCH 18/32] GRF parameters as input --- .../linear_elasticity_grf.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py index 7b1fcf1..c01f25a 100644 --- a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py +++ b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py @@ -104,16 +104,30 @@ def get_lames_constants( self, ): # Random E and nu fields. - E_mean, E_variance = self.parameters_conversion(self.p["E"], 100e9) # 3 - Nu_mean, Nu_variance = self.parameters_conversion(self.p["nu"], 0.3) # 0.03 + E_mean, E_variance = self.parameters_conversion(self.p["E"], self.p["E_std"]) # 3 + Nu_mean, Nu_variance = self.parameters_conversion(self.p["nu"], self.p["nu_std"]) # 0.03 self.E_randomfield = self.random_field_generator( - self.field_function_space, "squared_exp", E_mean, 0.3, 0.05, E_variance, 3, 0.01 + self.field_function_space, + "squared_exp", + E_mean, + self.p["correlation_length_1"], + self.p["correlation_length_2"], + E_variance, + 3, + 0.01, ) self.E_randomfield.create_random_field(_type="random", _dist="LN") self.nu_randomfield = self.random_field_generator( - self.field_function_space, "squared_exp", Nu_mean, 0.3, 0.05, Nu_variance, 3, 0.01 + self.field_function_space, + "squared_exp", + Nu_mean, + self.p["correlation_length_1"], + self.p["correlation_length_2"], + Nu_variance, + 3, + 0.01, ) self.nu_randomfield.create_random_field(_type="random", _dist="LN") From cf9154dcdd68050c03a58281873bd9d79bcb32a3 Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 17 May 2023 10:07:24 +0200 Subject: [PATCH 19/32] Descriptive names to ReactionForceSensors in test --- .../test_reaction_force_sensor.py | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/sensor_definition/test_reaction_force_sensor.py b/tests/sensor_definition/test_reaction_force_sensor.py index 8fc10f7..4bb03d6 100644 --- a/tests/sensor_definition/test_reaction_force_sensor.py +++ b/tests/sensor_definition/test_reaction_force_sensor.py @@ -50,27 +50,27 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: fem_problem = LinearElasticity(cube, fem_parameters) # define reactionforce sensors - sensor = ReactionForceSensor(surface=cube.boundary_left()) + sensor = ReactionForceSensor(surface=cube.boundary_left(), name="ReactionForceSensorLeft") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_right()) + sensor = ReactionForceSensor(surface=cube.boundary_right(), name="ReactionForceSensorRight") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_top()) + sensor = ReactionForceSensor(surface=cube.boundary_top(), name="ReactionForceSensorTop") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_bottom()) + sensor = ReactionForceSensor(surface=cube.boundary_bottom(), name="ReactionForceSensorBottom") fem_problem.add_sensor(sensor) if dim == 3: - sensor = ReactionForceSensor(surface=cube.boundary_front()) + sensor = ReactionForceSensor(surface=cube.boundary_front(), name="ReactionForceSensorFront") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_back()) + sensor = ReactionForceSensor(surface=cube.boundary_back(), name="ReactionForceSensorBack") fem_problem.add_sensor(sensor) fem_problem.experiment.apply_displ_load(0.002 * ureg("m")) fem_problem.solve() - force_left = fem_problem.sensors.ReactionForceSensor.get_last_entry().magnitude[0] - force_right = fem_problem.sensors.ReactionForceSensor2.get_last_entry().magnitude[0] - force_top = fem_problem.sensors.ReactionForceSensor3.get_last_entry().magnitude[-1] - force_bottom = fem_problem.sensors.ReactionForceSensor4.get_last_entry().magnitude[-1] + force_left = fem_problem.sensors.ReactionForceSensorLeft.get_last_entry().magnitude[0] + force_right = fem_problem.sensors.ReactionForceSensorRight.get_last_entry().magnitude[0] + force_top = fem_problem.sensors.ReactionForceSensorTop.get_last_entry().magnitude[-1] + force_bottom = fem_problem.sensors.ReactionForceSensorBottom.get_last_entry().magnitude[-1] # checking opposing forces left-right and top-bottom assert force_left == pytest.approx(-1 * force_right) @@ -79,22 +79,22 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: assert force_left == pytest.approx(force_bottom) # checking report metadata # TODO Figure out how to identify which boundary is applied - assert fem_problem.sensors.ReactionForceSensor.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensor2.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensor3.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensor4.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorLeft.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorRight.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorTop.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorBottom.report_metadata()["surface"] == "boundary" if dim == 3: - force_front = fem_problem.sensors.ReactionForceSensor5.get_last_entry().magnitude[1] - force_back = fem_problem.sensors.ReactionForceSensor6.get_last_entry().magnitude[1] + force_front = fem_problem.sensors.ReactionForceSensorFront.get_last_entry().magnitude[1] + force_back = fem_problem.sensors.ReactionForceSensorBack.get_last_entry().magnitude[1] # checking opposing forces front-back assert force_front == pytest.approx(-1 * force_back) # checking equal forces left-front assert force_left == pytest.approx(force_front) # checking report metadata - assert fem_problem.sensors.ReactionForceSensor5.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensor6.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorFront.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorBack.report_metadata()["surface"] == "boundary" @pytest.mark.parametrize("dim", [2, 3]) From e7c91aeef78dcc19cc00861625af65cafdedb26f Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 17 May 2023 13:17:19 +0200 Subject: [PATCH 20/32] Updated ReactionForceSensor for reproductibility --- .../reaction_force_sensor.py | 28 ++++++++--- .../test_reaction_force_sensor.py | 48 +++++++++++++------ 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py index 88b3bd3..51d03f1 100644 --- a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py +++ b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py @@ -1,5 +1,5 @@ import os -from collections.abc import Callable +from typing import TypedDict import dolfinx as df import ufl @@ -10,6 +10,18 @@ from fenicsxconcrete.unit_registry import ureg +class Surface(TypedDict): + """A typed dictionary class to define a surface + + Attributes: + function: name of the function to be called to ge the surface + args: additional arguments to be passed to such a function + """ + + function: str + args: dict + + class ReactionForceSensor(BaseSensor): """A sensor that measures the reaction force at a specified surface @@ -18,19 +30,19 @@ class ReactionForceSensor(BaseSensor): time: list of time stamps units : pint definition of the base unit a sensor returns name : name of the sensor, default is class name, but can be changed - surface : function that defines the surface where the reaction force is measured + surface : dictionary that defines the surface where the reaction force is measured """ - def __init__(self, surface: Callable | None = None, name: str | None = None) -> None: + def __init__(self, surface: Surface | None = None, name: str | None = None) -> None: """ initializes a reaction force sensor, for further details, see base class Arguments: - surface : a function that defines the reaction boundary, default is the bottom surface + surface : a dictionary that defines the function for the reaction boundary, default is the bottom surface name : name of the sensor, default is class name, but can be changed """ super().__init__(name=name) - self.surface = surface + self.surface_dict = surface def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: """ @@ -42,8 +54,10 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: t : time of measurement for time dependent problems, default is 1 """ # boundary condition - if self.surface is None: + if self.surface_dict is None: self.surface = problem.experiment.boundary_bottom() + else: + self.surface = getattr(problem.experiment, self.surface_dict["function"])(**self.surface_dict["args"]) v_reac = df.fem.Function(problem.V) @@ -92,7 +106,7 @@ def measure(self, problem: MaterialProblem, t: float = 1.0) -> None: def report_metadata(self) -> dict: """Generates dictionary with the metadata of this sensor""" metadata = super().report_metadata() - metadata["surface"] = self.surface.__name__ + metadata["surface"] = self.surface_dict metadata["sensor_file"] = os.path.splitext(os.path.basename(__file__))[0] return metadata diff --git a/tests/sensor_definition/test_reaction_force_sensor.py b/tests/sensor_definition/test_reaction_force_sensor.py index 4bb03d6..ee918b3 100644 --- a/tests/sensor_definition/test_reaction_force_sensor.py +++ b/tests/sensor_definition/test_reaction_force_sensor.py @@ -17,9 +17,9 @@ def test_reaction_force_sensor() -> None: # define sensors sensor1 = ReactionForceSensor() fem_problem.add_sensor(sensor1) - sensor2 = ReactionForceSensor(surface=setup.boundary_bottom()) + sensor2 = ReactionForceSensor(surface={"function": "boundary_bottom", "args": {}}) fem_problem.add_sensor(sensor2) - sensor3 = ReactionForceSensor(surface=setup.boundary_top(), name="top_sensor") + sensor3 = ReactionForceSensor(surface={"function": "boundary_top", "args": {}}, name="top_sensor") fem_problem.add_sensor(sensor3) fem_problem.experiment.apply_displ_load(-0.001 * ureg("m")) @@ -50,18 +50,20 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: fem_problem = LinearElasticity(cube, fem_parameters) # define reactionforce sensors - sensor = ReactionForceSensor(surface=cube.boundary_left(), name="ReactionForceSensorLeft") + sensor = ReactionForceSensor(surface={"function": "boundary_left", "args": {}}, name="ReactionForceSensorLeft") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_right(), name="ReactionForceSensorRight") + sensor = ReactionForceSensor(surface={"function": "boundary_right", "args": {}}, name="ReactionForceSensorRight") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_top(), name="ReactionForceSensorTop") + sensor = ReactionForceSensor(surface={"function": "boundary_top", "args": {}}, name="ReactionForceSensorTop") fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_bottom(), name="ReactionForceSensorBottom") + sensor = ReactionForceSensor(surface={"function": "boundary_bottom", "args": {}}, name="ReactionForceSensorBottom") fem_problem.add_sensor(sensor) if dim == 3: - sensor = ReactionForceSensor(surface=cube.boundary_front(), name="ReactionForceSensorFront") + sensor = ReactionForceSensor( + surface={"function": "boundary_front", "args": {}}, name="ReactionForceSensorFront" + ) fem_problem.add_sensor(sensor) - sensor = ReactionForceSensor(surface=cube.boundary_back(), name="ReactionForceSensorBack") + sensor = ReactionForceSensor(surface={"function": "boundary_back", "args": {}}, name="ReactionForceSensorBack") fem_problem.add_sensor(sensor) fem_problem.experiment.apply_displ_load(0.002 * ureg("m")) @@ -79,10 +81,22 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: assert force_left == pytest.approx(force_bottom) # checking report metadata # TODO Figure out how to identify which boundary is applied - assert fem_problem.sensors.ReactionForceSensorLeft.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensorRight.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensorTop.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensorBottom.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorLeft.report_metadata()["surface"] == { + "function": "boundary_left", + "args": {}, + } + assert fem_problem.sensors.ReactionForceSensorRight.report_metadata()["surface"] == { + "function": "boundary_right", + "args": {}, + } + assert fem_problem.sensors.ReactionForceSensorTop.report_metadata()["surface"] == { + "function": "boundary_top", + "args": {}, + } + assert fem_problem.sensors.ReactionForceSensorBottom.report_metadata()["surface"] == { + "function": "boundary_bottom", + "args": {}, + } if dim == 3: force_front = fem_problem.sensors.ReactionForceSensorFront.get_last_entry().magnitude[1] @@ -93,8 +107,14 @@ def test_full_boundary_reaction(dim: int, degree: int) -> None: # checking equal forces left-front assert force_left == pytest.approx(force_front) # checking report metadata - assert fem_problem.sensors.ReactionForceSensorFront.report_metadata()["surface"] == "boundary" - assert fem_problem.sensors.ReactionForceSensorBack.report_metadata()["surface"] == "boundary" + assert fem_problem.sensors.ReactionForceSensorFront.report_metadata()["surface"] == { + "function": "boundary_front", + "args": {}, + } + assert fem_problem.sensors.ReactionForceSensorBack.report_metadata()["surface"] == { + "function": "boundary_back", + "args": {}, + } @pytest.mark.parametrize("dim", [2, 3]) From 4639954f7cf1daa029a92dc002e23e1ec5d580fc Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 17 May 2023 14:12:17 +0200 Subject: [PATCH 21/32] Update format of merge --- src/fenicsxconcrete/finite_element_problem/base_material.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 91f9c80..05e1d10 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -4,8 +4,8 @@ from dataclasses import dataclass from pathlib import Path, PosixPath -import jsonschema import dolfinx as df +import jsonschema import pint import ufl @@ -61,7 +61,6 @@ class QuadratureFields: damage: ufl.core.expr.Expr | df.fem.Function | None = None - class MaterialProblem(ABC, LogMixin): def __init__( self, From ddf2564c9e073862381819c68065784e8aef15ef Mon Sep 17 00:00:00 2001 From: darcones Date: Mon, 22 May 2023 13:01:38 +0200 Subject: [PATCH 22/32] Moved local repo --- .conda/LICENSE | 0 .conda/conda_build_config.yaml | 0 .conda/meta.yaml | 0 .github/workflows/publish_conda.yml | 0 .github/workflows/push_formatting.yaml | 0 .github/workflows/push_tests.yml | 0 .gitignore | 0 .pre-commit-config.yaml | 0 .readthedocs.yaml | 0 CITATION.cff | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 0 docs/Makefile | 0 docs/api/fenicsxconcrete.boundary_conditions.rst | 0 docs/api/fenicsxconcrete.experimental_setup.rst | 0 docs/api/fenicsxconcrete.finite_element_problem.rst | 0 docs/api/fenicsxconcrete.rst | 0 docs/api/fenicsxconcrete.sensor_definition.rst | 0 docs/api/fenicsxconcrete.util.rst | 0 docs/api/modules.rst | 0 docs/conf.py | 0 docs/examples/3_point_bending.py | 0 docs/examples/README.rst | 0 docs/examples/cylinder.py | 0 docs/index.md | 0 docs/make.bat | 0 docs/requirements.txt | 0 environment.yml | 0 pyproject.toml | 0 src/fenicsxconcrete/README.md | 0 src/fenicsxconcrete/__init__.py | 0 src/fenicsxconcrete/boundary_conditions/__init__.py | 0 src/fenicsxconcrete/boundary_conditions/bcs.py | 0 src/fenicsxconcrete/boundary_conditions/boundary.py | 0 src/fenicsxconcrete/experimental_setup/__init__.py | 0 src/fenicsxconcrete/experimental_setup/am_multiple_layers.py | 0 src/fenicsxconcrete/experimental_setup/base_experiment.py | 0 src/fenicsxconcrete/experimental_setup/cantilever_beam.py | 0 src/fenicsxconcrete/experimental_setup/compression_cylinder.py | 0 src/fenicsxconcrete/experimental_setup/simple_beam.py | 0 src/fenicsxconcrete/experimental_setup/simple_cube.py | 0 src/fenicsxconcrete/experimental_setup/tensile_beam.py | 0 src/fenicsxconcrete/finite_element_problem/__init__.py | 0 src/fenicsxconcrete/finite_element_problem/base_material.py | 0 src/fenicsxconcrete/finite_element_problem/linear_elasticity.py | 0 src/fenicsxconcrete/sensor_definition/README.md | 0 src/fenicsxconcrete/sensor_definition/__init__.py | 0 src/fenicsxconcrete/sensor_definition/base_sensor.py | 0 src/fenicsxconcrete/sensor_definition/displacement_sensor.py | 0 src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py | 0 src/fenicsxconcrete/sensor_definition/sensor_schema.py | 0 src/fenicsxconcrete/sensor_definition/strain_sensor.py | 0 src/fenicsxconcrete/sensor_definition/stress_sensor.py | 0 src/fenicsxconcrete/util/__init__.py | 0 src/fenicsxconcrete/util/logger.py | 0 src/fenicsxconcrete/util/parameters.py | 0 src/fenicsxconcrete/util/projection.py | 0 src/fenicsxconcrete/util/quadrature.py | 0 src/fenicsxconcrete/util/unit_registry.py | 0 tests/README.md | 0 tests/boundary_conditions/test_bcs_get_boundary_dofs.py | 0 tests/boundary_conditions/test_boundary_create_facet_tags.py | 0 tests/boundary_conditions/test_boundary_line_at.py | 0 tests/boundary_conditions/test_boundary_plane_at.py | 0 tests/boundary_conditions/test_boundary_point_at.py | 0 tests/boundary_conditions/test_boundary_show_marked.py | 0 tests/boundary_conditions/test_boundary_within_range.py | 0 tests/boundary_conditions/test_dirichlet_bcs.py | 0 tests/boundary_conditions/test_neumann_bcs.py | 0 tests/experimental_setup/test_experimental_setups.py | 0 tests/finite_element_problem/test_am_layers.py | 0 tests/finite_element_problem/test_base_material.py | 0 tests/finite_element_problem/test_default_dictionaries.py | 0 tests/finite_element_problem/test_linear_cantilever_beam.py | 0 tests/finite_element_problem/test_linear_cylinder.py | 0 tests/finite_element_problem/test_linear_simple_beam.py | 0 tests/finite_element_problem/test_linear_simple_cube.py | 0 tests/finite_element_problem/test_linear_tensile_beam.py | 0 tests/sensor_definition/test_point_sensors.py | 0 tests/sensor_definition/test_reaction_force_sensor.py | 0 tests/sensor_definition/test_sensors.py | 0 tests/test_basic_logging.py | 0 tests/test_helpers.py | 0 84 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .conda/LICENSE mode change 100644 => 100755 .conda/conda_build_config.yaml mode change 100644 => 100755 .conda/meta.yaml mode change 100644 => 100755 .github/workflows/publish_conda.yml mode change 100644 => 100755 .github/workflows/push_formatting.yaml mode change 100644 => 100755 .github/workflows/push_tests.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .pre-commit-config.yaml mode change 100644 => 100755 .readthedocs.yaml mode change 100644 => 100755 CITATION.cff mode change 100644 => 100755 CONTRIBUTING.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 docs/Makefile mode change 100644 => 100755 docs/api/fenicsxconcrete.boundary_conditions.rst mode change 100644 => 100755 docs/api/fenicsxconcrete.experimental_setup.rst mode change 100644 => 100755 docs/api/fenicsxconcrete.finite_element_problem.rst mode change 100644 => 100755 docs/api/fenicsxconcrete.rst mode change 100644 => 100755 docs/api/fenicsxconcrete.sensor_definition.rst mode change 100644 => 100755 docs/api/fenicsxconcrete.util.rst mode change 100644 => 100755 docs/api/modules.rst mode change 100644 => 100755 docs/conf.py mode change 100644 => 100755 docs/examples/3_point_bending.py mode change 100644 => 100755 docs/examples/README.rst mode change 100644 => 100755 docs/examples/cylinder.py mode change 100644 => 100755 docs/index.md mode change 100644 => 100755 docs/make.bat mode change 100644 => 100755 docs/requirements.txt mode change 100644 => 100755 environment.yml mode change 100644 => 100755 pyproject.toml mode change 100644 => 100755 src/fenicsxconcrete/README.md mode change 100644 => 100755 src/fenicsxconcrete/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/boundary_conditions/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/boundary_conditions/bcs.py mode change 100644 => 100755 src/fenicsxconcrete/boundary_conditions/boundary.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/am_multiple_layers.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/base_experiment.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/cantilever_beam.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/compression_cylinder.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/simple_beam.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/simple_cube.py mode change 100644 => 100755 src/fenicsxconcrete/experimental_setup/tensile_beam.py mode change 100644 => 100755 src/fenicsxconcrete/finite_element_problem/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/finite_element_problem/base_material.py mode change 100644 => 100755 src/fenicsxconcrete/finite_element_problem/linear_elasticity.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/README.md mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/base_sensor.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/displacement_sensor.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/sensor_schema.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/strain_sensor.py mode change 100644 => 100755 src/fenicsxconcrete/sensor_definition/stress_sensor.py mode change 100644 => 100755 src/fenicsxconcrete/util/__init__.py mode change 100644 => 100755 src/fenicsxconcrete/util/logger.py mode change 100644 => 100755 src/fenicsxconcrete/util/parameters.py mode change 100644 => 100755 src/fenicsxconcrete/util/projection.py mode change 100644 => 100755 src/fenicsxconcrete/util/quadrature.py mode change 100644 => 100755 src/fenicsxconcrete/util/unit_registry.py mode change 100644 => 100755 tests/README.md mode change 100644 => 100755 tests/boundary_conditions/test_bcs_get_boundary_dofs.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_create_facet_tags.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_line_at.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_plane_at.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_point_at.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_show_marked.py mode change 100644 => 100755 tests/boundary_conditions/test_boundary_within_range.py mode change 100644 => 100755 tests/boundary_conditions/test_dirichlet_bcs.py mode change 100644 => 100755 tests/boundary_conditions/test_neumann_bcs.py mode change 100644 => 100755 tests/experimental_setup/test_experimental_setups.py mode change 100644 => 100755 tests/finite_element_problem/test_am_layers.py mode change 100644 => 100755 tests/finite_element_problem/test_base_material.py mode change 100644 => 100755 tests/finite_element_problem/test_default_dictionaries.py mode change 100644 => 100755 tests/finite_element_problem/test_linear_cantilever_beam.py mode change 100644 => 100755 tests/finite_element_problem/test_linear_cylinder.py mode change 100644 => 100755 tests/finite_element_problem/test_linear_simple_beam.py mode change 100644 => 100755 tests/finite_element_problem/test_linear_simple_cube.py mode change 100644 => 100755 tests/finite_element_problem/test_linear_tensile_beam.py mode change 100644 => 100755 tests/sensor_definition/test_point_sensors.py mode change 100644 => 100755 tests/sensor_definition/test_reaction_force_sensor.py mode change 100644 => 100755 tests/sensor_definition/test_sensors.py mode change 100644 => 100755 tests/test_basic_logging.py mode change 100644 => 100755 tests/test_helpers.py diff --git a/.conda/LICENSE b/.conda/LICENSE old mode 100644 new mode 100755 diff --git a/.conda/conda_build_config.yaml b/.conda/conda_build_config.yaml old mode 100644 new mode 100755 diff --git a/.conda/meta.yaml b/.conda/meta.yaml old mode 100644 new mode 100755 diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/push_formatting.yaml b/.github/workflows/push_formatting.yaml old mode 100644 new mode 100755 diff --git a/.github/workflows/push_tests.yml b/.github/workflows/push_tests.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml old mode 100644 new mode 100755 diff --git a/.readthedocs.yaml b/.readthedocs.yaml old mode 100644 new mode 100755 diff --git a/CITATION.cff b/CITATION.cff old mode 100644 new mode 100755 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.boundary_conditions.rst b/docs/api/fenicsxconcrete.boundary_conditions.rst old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.experimental_setup.rst b/docs/api/fenicsxconcrete.experimental_setup.rst old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.finite_element_problem.rst b/docs/api/fenicsxconcrete.finite_element_problem.rst old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.rst b/docs/api/fenicsxconcrete.rst old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.sensor_definition.rst b/docs/api/fenicsxconcrete.sensor_definition.rst old mode 100644 new mode 100755 diff --git a/docs/api/fenicsxconcrete.util.rst b/docs/api/fenicsxconcrete.util.rst old mode 100644 new mode 100755 diff --git a/docs/api/modules.rst b/docs/api/modules.rst old mode 100644 new mode 100755 diff --git a/docs/conf.py b/docs/conf.py old mode 100644 new mode 100755 diff --git a/docs/examples/3_point_bending.py b/docs/examples/3_point_bending.py old mode 100644 new mode 100755 diff --git a/docs/examples/README.rst b/docs/examples/README.rst old mode 100644 new mode 100755 diff --git a/docs/examples/cylinder.py b/docs/examples/cylinder.py old mode 100644 new mode 100755 diff --git a/docs/index.md b/docs/index.md old mode 100644 new mode 100755 diff --git a/docs/make.bat b/docs/make.bat old mode 100644 new mode 100755 diff --git a/docs/requirements.txt b/docs/requirements.txt old mode 100644 new mode 100755 diff --git a/environment.yml b/environment.yml old mode 100644 new mode 100755 diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/README.md b/src/fenicsxconcrete/README.md old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/__init__.py b/src/fenicsxconcrete/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/boundary_conditions/__init__.py b/src/fenicsxconcrete/boundary_conditions/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/boundary_conditions/bcs.py b/src/fenicsxconcrete/boundary_conditions/bcs.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/boundary_conditions/boundary.py b/src/fenicsxconcrete/boundary_conditions/boundary.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/__init__.py b/src/fenicsxconcrete/experimental_setup/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py b/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/base_experiment.py b/src/fenicsxconcrete/experimental_setup/base_experiment.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/cantilever_beam.py b/src/fenicsxconcrete/experimental_setup/cantilever_beam.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/compression_cylinder.py b/src/fenicsxconcrete/experimental_setup/compression_cylinder.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/simple_beam.py b/src/fenicsxconcrete/experimental_setup/simple_beam.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/simple_cube.py b/src/fenicsxconcrete/experimental_setup/simple_cube.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/experimental_setup/tensile_beam.py b/src/fenicsxconcrete/experimental_setup/tensile_beam.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/finite_element_problem/__init__.py b/src/fenicsxconcrete/finite_element_problem/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/README.md b/src/fenicsxconcrete/sensor_definition/README.md old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/__init__.py b/src/fenicsxconcrete/sensor_definition/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/displacement_sensor.py b/src/fenicsxconcrete/sensor_definition/displacement_sensor.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.py b/src/fenicsxconcrete/sensor_definition/sensor_schema.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/strain_sensor.py b/src/fenicsxconcrete/sensor_definition/strain_sensor.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/sensor_definition/stress_sensor.py b/src/fenicsxconcrete/sensor_definition/stress_sensor.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/__init__.py b/src/fenicsxconcrete/util/__init__.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/logger.py b/src/fenicsxconcrete/util/logger.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/parameters.py b/src/fenicsxconcrete/util/parameters.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/projection.py b/src/fenicsxconcrete/util/projection.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/quadrature.py b/src/fenicsxconcrete/util/quadrature.py old mode 100644 new mode 100755 diff --git a/src/fenicsxconcrete/util/unit_registry.py b/src/fenicsxconcrete/util/unit_registry.py old mode 100644 new mode 100755 diff --git a/tests/README.md b/tests/README.md old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_bcs_get_boundary_dofs.py b/tests/boundary_conditions/test_bcs_get_boundary_dofs.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_create_facet_tags.py b/tests/boundary_conditions/test_boundary_create_facet_tags.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_line_at.py b/tests/boundary_conditions/test_boundary_line_at.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_plane_at.py b/tests/boundary_conditions/test_boundary_plane_at.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_point_at.py b/tests/boundary_conditions/test_boundary_point_at.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_show_marked.py b/tests/boundary_conditions/test_boundary_show_marked.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_boundary_within_range.py b/tests/boundary_conditions/test_boundary_within_range.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_dirichlet_bcs.py b/tests/boundary_conditions/test_dirichlet_bcs.py old mode 100644 new mode 100755 diff --git a/tests/boundary_conditions/test_neumann_bcs.py b/tests/boundary_conditions/test_neumann_bcs.py old mode 100644 new mode 100755 diff --git a/tests/experimental_setup/test_experimental_setups.py b/tests/experimental_setup/test_experimental_setups.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_am_layers.py b/tests/finite_element_problem/test_am_layers.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_default_dictionaries.py b/tests/finite_element_problem/test_default_dictionaries.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_linear_cantilever_beam.py b/tests/finite_element_problem/test_linear_cantilever_beam.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_linear_cylinder.py b/tests/finite_element_problem/test_linear_cylinder.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_linear_simple_beam.py b/tests/finite_element_problem/test_linear_simple_beam.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_linear_simple_cube.py b/tests/finite_element_problem/test_linear_simple_cube.py old mode 100644 new mode 100755 diff --git a/tests/finite_element_problem/test_linear_tensile_beam.py b/tests/finite_element_problem/test_linear_tensile_beam.py old mode 100644 new mode 100755 diff --git a/tests/sensor_definition/test_point_sensors.py b/tests/sensor_definition/test_point_sensors.py old mode 100644 new mode 100755 diff --git a/tests/sensor_definition/test_reaction_force_sensor.py b/tests/sensor_definition/test_reaction_force_sensor.py old mode 100644 new mode 100755 diff --git a/tests/sensor_definition/test_sensors.py b/tests/sensor_definition/test_sensors.py old mode 100644 new mode 100755 diff --git a/tests/test_basic_logging.py b/tests/test_basic_logging.py old mode 100644 new mode 100755 diff --git a/tests/test_helpers.py b/tests/test_helpers.py old mode 100644 new mode 100755 From d39bf0899e29c68f2e9a767db1d371dba4925f24 Mon Sep 17 00:00:00 2001 From: darcones Date: Mon, 22 May 2023 13:36:01 +0200 Subject: [PATCH 23/32] Test sensor schema completeness --- tests/sensor_definition/test_sensor_schema.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 tests/sensor_definition/test_sensor_schema.py diff --git a/tests/sensor_definition/test_sensor_schema.py b/tests/sensor_definition/test_sensor_schema.py new file mode 100755 index 0000000..89b9bb2 --- /dev/null +++ b/tests/sensor_definition/test_sensor_schema.py @@ -0,0 +1,39 @@ +import importlib +import inspect +import os +from abc import ABC + +from fenicsxconcrete.sensor_definition.base_sensor import BaseSensor +from fenicsxconcrete.sensor_definition.sensor_schema import generate_sensor_schema + + +def import_classes_from_module(module_name): + module = importlib.import_module(module_name) + class_names = set() + + module_path = os.path.dirname(module.__file__) + for file_name in os.listdir(module_path): + if file_name.endswith(".py") and file_name != "__init__.py": + file_path = os.path.join(module_path, file_name) + module_name = f"{module_name}.{os.path.splitext(file_name)[0]}" + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + for name, obj in inspect.getmembers(module): + if inspect.isclass(obj) and obj is not ABC and issubclass(obj, BaseSensor): + class_names.add(obj.__name__) + + return class_names + + +def test_classes_in_dictionary(): + module_name = "fenicsxconcrete.sensor_definition" + + # Import all classes from the module + classes = import_classes_from_module(module_name) + dict_sensors_schema = generate_sensor_schema() + + # Check if the classes are present in the dictionary keys + for cls in classes: + assert cls in dict_sensors_schema["definitions"] From 14605911ee68ecf2a5ded322a9cc5fbe9c7e49ea Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 31 May 2023 09:34:33 +0200 Subject: [PATCH 24/32] Test sensor schema --- tests/sensor_definition/test_sensor_schema.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 tests/sensor_definition/test_sensor_schema.py diff --git a/tests/sensor_definition/test_sensor_schema.py b/tests/sensor_definition/test_sensor_schema.py new file mode 100755 index 0000000..89b9bb2 --- /dev/null +++ b/tests/sensor_definition/test_sensor_schema.py @@ -0,0 +1,39 @@ +import importlib +import inspect +import os +from abc import ABC + +from fenicsxconcrete.sensor_definition.base_sensor import BaseSensor +from fenicsxconcrete.sensor_definition.sensor_schema import generate_sensor_schema + + +def import_classes_from_module(module_name): + module = importlib.import_module(module_name) + class_names = set() + + module_path = os.path.dirname(module.__file__) + for file_name in os.listdir(module_path): + if file_name.endswith(".py") and file_name != "__init__.py": + file_path = os.path.join(module_path, file_name) + module_name = f"{module_name}.{os.path.splitext(file_name)[0]}" + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + for name, obj in inspect.getmembers(module): + if inspect.isclass(obj) and obj is not ABC and issubclass(obj, BaseSensor): + class_names.add(obj.__name__) + + return class_names + + +def test_classes_in_dictionary(): + module_name = "fenicsxconcrete.sensor_definition" + + # Import all classes from the module + classes = import_classes_from_module(module_name) + dict_sensors_schema = generate_sensor_schema() + + # Check if the classes are present in the dictionary keys + for cls in classes: + assert cls in dict_sensors_schema["definitions"] From 4e52050c037c8d052601083edc805f39ae67809a Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 31 May 2023 10:04:21 +0200 Subject: [PATCH 25/32] Revert "Moved local repo" This reverts commit ddf2564c9e073862381819c68065784e8aef15ef. --- .conda/LICENSE | 0 .conda/conda_build_config.yaml | 0 .conda/meta.yaml | 0 .github/workflows/publish_conda.yml | 0 .github/workflows/push_formatting.yaml | 0 .github/workflows/push_tests.yml | 0 .gitignore | 0 .pre-commit-config.yaml | 0 .readthedocs.yaml | 0 CITATION.cff | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 0 docs/Makefile | 0 docs/api/fenicsxconcrete.boundary_conditions.rst | 0 docs/api/fenicsxconcrete.experimental_setup.rst | 0 docs/api/fenicsxconcrete.finite_element_problem.rst | 0 docs/api/fenicsxconcrete.rst | 0 docs/api/fenicsxconcrete.sensor_definition.rst | 0 docs/api/fenicsxconcrete.util.rst | 0 docs/api/modules.rst | 0 docs/conf.py | 0 docs/examples/3_point_bending.py | 0 docs/examples/README.rst | 0 docs/examples/cylinder.py | 0 docs/index.md | 0 docs/make.bat | 0 docs/requirements.txt | 0 environment.yml | 0 pyproject.toml | 0 src/fenicsxconcrete/README.md | 0 src/fenicsxconcrete/__init__.py | 0 src/fenicsxconcrete/boundary_conditions/__init__.py | 0 src/fenicsxconcrete/boundary_conditions/bcs.py | 0 src/fenicsxconcrete/boundary_conditions/boundary.py | 0 src/fenicsxconcrete/experimental_setup/__init__.py | 0 src/fenicsxconcrete/experimental_setup/am_multiple_layers.py | 0 src/fenicsxconcrete/experimental_setup/base_experiment.py | 0 src/fenicsxconcrete/experimental_setup/cantilever_beam.py | 0 src/fenicsxconcrete/experimental_setup/compression_cylinder.py | 0 src/fenicsxconcrete/experimental_setup/simple_beam.py | 0 src/fenicsxconcrete/experimental_setup/simple_cube.py | 0 src/fenicsxconcrete/experimental_setup/tensile_beam.py | 0 src/fenicsxconcrete/finite_element_problem/__init__.py | 0 src/fenicsxconcrete/finite_element_problem/base_material.py | 0 src/fenicsxconcrete/finite_element_problem/linear_elasticity.py | 0 src/fenicsxconcrete/sensor_definition/README.md | 0 src/fenicsxconcrete/sensor_definition/__init__.py | 0 src/fenicsxconcrete/sensor_definition/base_sensor.py | 0 src/fenicsxconcrete/sensor_definition/displacement_sensor.py | 0 src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py | 0 src/fenicsxconcrete/sensor_definition/sensor_schema.py | 0 src/fenicsxconcrete/sensor_definition/strain_sensor.py | 0 src/fenicsxconcrete/sensor_definition/stress_sensor.py | 0 src/fenicsxconcrete/util/__init__.py | 0 src/fenicsxconcrete/util/logger.py | 0 src/fenicsxconcrete/util/parameters.py | 0 src/fenicsxconcrete/util/projection.py | 0 src/fenicsxconcrete/util/quadrature.py | 0 src/fenicsxconcrete/util/unit_registry.py | 0 tests/README.md | 0 tests/boundary_conditions/test_bcs_get_boundary_dofs.py | 0 tests/boundary_conditions/test_boundary_create_facet_tags.py | 0 tests/boundary_conditions/test_boundary_line_at.py | 0 tests/boundary_conditions/test_boundary_plane_at.py | 0 tests/boundary_conditions/test_boundary_point_at.py | 0 tests/boundary_conditions/test_boundary_show_marked.py | 0 tests/boundary_conditions/test_boundary_within_range.py | 0 tests/boundary_conditions/test_dirichlet_bcs.py | 0 tests/boundary_conditions/test_neumann_bcs.py | 0 tests/experimental_setup/test_experimental_setups.py | 0 tests/finite_element_problem/test_am_layers.py | 0 tests/finite_element_problem/test_base_material.py | 0 tests/finite_element_problem/test_default_dictionaries.py | 0 tests/finite_element_problem/test_linear_cantilever_beam.py | 0 tests/finite_element_problem/test_linear_cylinder.py | 0 tests/finite_element_problem/test_linear_simple_beam.py | 0 tests/finite_element_problem/test_linear_simple_cube.py | 0 tests/finite_element_problem/test_linear_tensile_beam.py | 0 tests/sensor_definition/test_point_sensors.py | 0 tests/sensor_definition/test_reaction_force_sensor.py | 0 tests/sensor_definition/test_sensors.py | 0 tests/test_basic_logging.py | 0 tests/test_helpers.py | 0 84 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .conda/LICENSE mode change 100755 => 100644 .conda/conda_build_config.yaml mode change 100755 => 100644 .conda/meta.yaml mode change 100755 => 100644 .github/workflows/publish_conda.yml mode change 100755 => 100644 .github/workflows/push_formatting.yaml mode change 100755 => 100644 .github/workflows/push_tests.yml mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .pre-commit-config.yaml mode change 100755 => 100644 .readthedocs.yaml mode change 100755 => 100644 CITATION.cff mode change 100755 => 100644 CONTRIBUTING.md mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 docs/Makefile mode change 100755 => 100644 docs/api/fenicsxconcrete.boundary_conditions.rst mode change 100755 => 100644 docs/api/fenicsxconcrete.experimental_setup.rst mode change 100755 => 100644 docs/api/fenicsxconcrete.finite_element_problem.rst mode change 100755 => 100644 docs/api/fenicsxconcrete.rst mode change 100755 => 100644 docs/api/fenicsxconcrete.sensor_definition.rst mode change 100755 => 100644 docs/api/fenicsxconcrete.util.rst mode change 100755 => 100644 docs/api/modules.rst mode change 100755 => 100644 docs/conf.py mode change 100755 => 100644 docs/examples/3_point_bending.py mode change 100755 => 100644 docs/examples/README.rst mode change 100755 => 100644 docs/examples/cylinder.py mode change 100755 => 100644 docs/index.md mode change 100755 => 100644 docs/make.bat mode change 100755 => 100644 docs/requirements.txt mode change 100755 => 100644 environment.yml mode change 100755 => 100644 pyproject.toml mode change 100755 => 100644 src/fenicsxconcrete/README.md mode change 100755 => 100644 src/fenicsxconcrete/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/boundary_conditions/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/boundary_conditions/bcs.py mode change 100755 => 100644 src/fenicsxconcrete/boundary_conditions/boundary.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/am_multiple_layers.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/base_experiment.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/cantilever_beam.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/compression_cylinder.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/simple_beam.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/simple_cube.py mode change 100755 => 100644 src/fenicsxconcrete/experimental_setup/tensile_beam.py mode change 100755 => 100644 src/fenicsxconcrete/finite_element_problem/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/finite_element_problem/base_material.py mode change 100755 => 100644 src/fenicsxconcrete/finite_element_problem/linear_elasticity.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/README.md mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/base_sensor.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/displacement_sensor.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/sensor_schema.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/strain_sensor.py mode change 100755 => 100644 src/fenicsxconcrete/sensor_definition/stress_sensor.py mode change 100755 => 100644 src/fenicsxconcrete/util/__init__.py mode change 100755 => 100644 src/fenicsxconcrete/util/logger.py mode change 100755 => 100644 src/fenicsxconcrete/util/parameters.py mode change 100755 => 100644 src/fenicsxconcrete/util/projection.py mode change 100755 => 100644 src/fenicsxconcrete/util/quadrature.py mode change 100755 => 100644 src/fenicsxconcrete/util/unit_registry.py mode change 100755 => 100644 tests/README.md mode change 100755 => 100644 tests/boundary_conditions/test_bcs_get_boundary_dofs.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_create_facet_tags.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_line_at.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_plane_at.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_point_at.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_show_marked.py mode change 100755 => 100644 tests/boundary_conditions/test_boundary_within_range.py mode change 100755 => 100644 tests/boundary_conditions/test_dirichlet_bcs.py mode change 100755 => 100644 tests/boundary_conditions/test_neumann_bcs.py mode change 100755 => 100644 tests/experimental_setup/test_experimental_setups.py mode change 100755 => 100644 tests/finite_element_problem/test_am_layers.py mode change 100755 => 100644 tests/finite_element_problem/test_base_material.py mode change 100755 => 100644 tests/finite_element_problem/test_default_dictionaries.py mode change 100755 => 100644 tests/finite_element_problem/test_linear_cantilever_beam.py mode change 100755 => 100644 tests/finite_element_problem/test_linear_cylinder.py mode change 100755 => 100644 tests/finite_element_problem/test_linear_simple_beam.py mode change 100755 => 100644 tests/finite_element_problem/test_linear_simple_cube.py mode change 100755 => 100644 tests/finite_element_problem/test_linear_tensile_beam.py mode change 100755 => 100644 tests/sensor_definition/test_point_sensors.py mode change 100755 => 100644 tests/sensor_definition/test_reaction_force_sensor.py mode change 100755 => 100644 tests/sensor_definition/test_sensors.py mode change 100755 => 100644 tests/test_basic_logging.py mode change 100755 => 100644 tests/test_helpers.py diff --git a/.conda/LICENSE b/.conda/LICENSE old mode 100755 new mode 100644 diff --git a/.conda/conda_build_config.yaml b/.conda/conda_build_config.yaml old mode 100755 new mode 100644 diff --git a/.conda/meta.yaml b/.conda/meta.yaml old mode 100755 new mode 100644 diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/push_formatting.yaml b/.github/workflows/push_formatting.yaml old mode 100755 new mode 100644 diff --git a/.github/workflows/push_tests.yml b/.github/workflows/push_tests.yml old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml old mode 100755 new mode 100644 diff --git a/.readthedocs.yaml b/.readthedocs.yaml old mode 100755 new mode 100644 diff --git a/CITATION.cff b/CITATION.cff old mode 100755 new mode 100644 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/docs/Makefile b/docs/Makefile old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.boundary_conditions.rst b/docs/api/fenicsxconcrete.boundary_conditions.rst old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.experimental_setup.rst b/docs/api/fenicsxconcrete.experimental_setup.rst old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.finite_element_problem.rst b/docs/api/fenicsxconcrete.finite_element_problem.rst old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.rst b/docs/api/fenicsxconcrete.rst old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.sensor_definition.rst b/docs/api/fenicsxconcrete.sensor_definition.rst old mode 100755 new mode 100644 diff --git a/docs/api/fenicsxconcrete.util.rst b/docs/api/fenicsxconcrete.util.rst old mode 100755 new mode 100644 diff --git a/docs/api/modules.rst b/docs/api/modules.rst old mode 100755 new mode 100644 diff --git a/docs/conf.py b/docs/conf.py old mode 100755 new mode 100644 diff --git a/docs/examples/3_point_bending.py b/docs/examples/3_point_bending.py old mode 100755 new mode 100644 diff --git a/docs/examples/README.rst b/docs/examples/README.rst old mode 100755 new mode 100644 diff --git a/docs/examples/cylinder.py b/docs/examples/cylinder.py old mode 100755 new mode 100644 diff --git a/docs/index.md b/docs/index.md old mode 100755 new mode 100644 diff --git a/docs/make.bat b/docs/make.bat old mode 100755 new mode 100644 diff --git a/docs/requirements.txt b/docs/requirements.txt old mode 100755 new mode 100644 diff --git a/environment.yml b/environment.yml old mode 100755 new mode 100644 diff --git a/pyproject.toml b/pyproject.toml old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/README.md b/src/fenicsxconcrete/README.md old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/__init__.py b/src/fenicsxconcrete/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/boundary_conditions/__init__.py b/src/fenicsxconcrete/boundary_conditions/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/boundary_conditions/bcs.py b/src/fenicsxconcrete/boundary_conditions/bcs.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/boundary_conditions/boundary.py b/src/fenicsxconcrete/boundary_conditions/boundary.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/__init__.py b/src/fenicsxconcrete/experimental_setup/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py b/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/base_experiment.py b/src/fenicsxconcrete/experimental_setup/base_experiment.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/cantilever_beam.py b/src/fenicsxconcrete/experimental_setup/cantilever_beam.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/compression_cylinder.py b/src/fenicsxconcrete/experimental_setup/compression_cylinder.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/simple_beam.py b/src/fenicsxconcrete/experimental_setup/simple_beam.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/simple_cube.py b/src/fenicsxconcrete/experimental_setup/simple_cube.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/experimental_setup/tensile_beam.py b/src/fenicsxconcrete/experimental_setup/tensile_beam.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/finite_element_problem/__init__.py b/src/fenicsxconcrete/finite_element_problem/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/README.md b/src/fenicsxconcrete/sensor_definition/README.md old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/__init__.py b/src/fenicsxconcrete/sensor_definition/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/base_sensor.py b/src/fenicsxconcrete/sensor_definition/base_sensor.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/displacement_sensor.py b/src/fenicsxconcrete/sensor_definition/displacement_sensor.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py b/src/fenicsxconcrete/sensor_definition/reaction_force_sensor.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/sensor_schema.py b/src/fenicsxconcrete/sensor_definition/sensor_schema.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/strain_sensor.py b/src/fenicsxconcrete/sensor_definition/strain_sensor.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/sensor_definition/stress_sensor.py b/src/fenicsxconcrete/sensor_definition/stress_sensor.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/__init__.py b/src/fenicsxconcrete/util/__init__.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/logger.py b/src/fenicsxconcrete/util/logger.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/parameters.py b/src/fenicsxconcrete/util/parameters.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/projection.py b/src/fenicsxconcrete/util/projection.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/quadrature.py b/src/fenicsxconcrete/util/quadrature.py old mode 100755 new mode 100644 diff --git a/src/fenicsxconcrete/util/unit_registry.py b/src/fenicsxconcrete/util/unit_registry.py old mode 100755 new mode 100644 diff --git a/tests/README.md b/tests/README.md old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_bcs_get_boundary_dofs.py b/tests/boundary_conditions/test_bcs_get_boundary_dofs.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_create_facet_tags.py b/tests/boundary_conditions/test_boundary_create_facet_tags.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_line_at.py b/tests/boundary_conditions/test_boundary_line_at.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_plane_at.py b/tests/boundary_conditions/test_boundary_plane_at.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_point_at.py b/tests/boundary_conditions/test_boundary_point_at.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_show_marked.py b/tests/boundary_conditions/test_boundary_show_marked.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_boundary_within_range.py b/tests/boundary_conditions/test_boundary_within_range.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_dirichlet_bcs.py b/tests/boundary_conditions/test_dirichlet_bcs.py old mode 100755 new mode 100644 diff --git a/tests/boundary_conditions/test_neumann_bcs.py b/tests/boundary_conditions/test_neumann_bcs.py old mode 100755 new mode 100644 diff --git a/tests/experimental_setup/test_experimental_setups.py b/tests/experimental_setup/test_experimental_setups.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_am_layers.py b/tests/finite_element_problem/test_am_layers.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_base_material.py b/tests/finite_element_problem/test_base_material.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_default_dictionaries.py b/tests/finite_element_problem/test_default_dictionaries.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_linear_cantilever_beam.py b/tests/finite_element_problem/test_linear_cantilever_beam.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_linear_cylinder.py b/tests/finite_element_problem/test_linear_cylinder.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_linear_simple_beam.py b/tests/finite_element_problem/test_linear_simple_beam.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_linear_simple_cube.py b/tests/finite_element_problem/test_linear_simple_cube.py old mode 100755 new mode 100644 diff --git a/tests/finite_element_problem/test_linear_tensile_beam.py b/tests/finite_element_problem/test_linear_tensile_beam.py old mode 100755 new mode 100644 diff --git a/tests/sensor_definition/test_point_sensors.py b/tests/sensor_definition/test_point_sensors.py old mode 100755 new mode 100644 diff --git a/tests/sensor_definition/test_reaction_force_sensor.py b/tests/sensor_definition/test_reaction_force_sensor.py old mode 100755 new mode 100644 diff --git a/tests/sensor_definition/test_sensors.py b/tests/sensor_definition/test_sensors.py old mode 100755 new mode 100644 diff --git a/tests/test_basic_logging.py b/tests/test_basic_logging.py old mode 100755 new mode 100644 diff --git a/tests/test_helpers.py b/tests/test_helpers.py old mode 100755 new mode 100644 From 5b8329059b99cd8357ebe560707bc5068e7a9413 Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 31 May 2023 10:56:46 +0200 Subject: [PATCH 26/32] Updated with new solution fields --- .../linear_elasticity_grf.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py index c01f25a..2a85a38 100644 --- a/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py +++ b/src/fenicsxconcrete/finite_element_problem/linear_elasticity_grf.py @@ -7,8 +7,10 @@ from petsc4py.PETSc import ScalarType from fenicsxconcrete.experimental_setup.base_experiment import Experiment +from fenicsxconcrete.finite_element_problem.base_material import MaterialProblem, QuadratureFields, SolutionFields from fenicsxconcrete.finite_element_problem.linear_elasticity import LinearElasticity from fenicsxconcrete.gaussian_random_field import Randomfield +from fenicsxconcrete.util import Parameters, ureg class LinearElasticityGRF(LinearElasticity): @@ -44,6 +46,13 @@ def setup(self) -> None: self.u_trial = ufl.TrialFunction(self.V) self.v = ufl.TestFunction(self.V) + self.fields = SolutionFields(displacement=df.fem.Function(self.V, name="displacement")) + self.q_fields = QuadratureFields( + measure=ufl.dx, + plot_space_type=("DG", self.p["degree"] - 1), + stress=self.sigma(self.fields.displacement), + strain=self.epsilon(self.fields.displacement), + ) # initialize L field, not sure if this is the best way... zero_field = df.fem.Constant(self.mesh, ScalarType(np.zeros(self.p["dim"]))) self.L = ufl.dot(zero_field, self.v) * ufl.dx @@ -65,6 +74,7 @@ def setup(self) -> None: self.a, self.L, bcs=bcs, + u=self.fields.displacement, petsc_options={"ksp_type": "preonly", "pc_type": "lu"}, ) @@ -150,11 +160,11 @@ def pv_plot(self, t: pint.Quantity | float = 1) -> None: except: _t = t - self.displacement.name = "Displacement" + self.fields.displacement.name = "Displacement" self.E_randomfield.field.name = "E_field" self.nu_randomfield.field.name = "nu_field" with df.io.XDMFFile(self.mesh.comm, self.pv_output_file, "a") as f: - f.write_function(self.displacement, _t) + f.write_function(self.fields.displacement, _t) f.write_function(self.E_randomfield.field, _t) f.write_function(self.nu_randomfield.field, _t) From dadc43a49f827ceab29d5aec9715860c65a6d85b Mon Sep 17 00:00:00 2001 From: darcones Date: Fri, 18 Aug 2023 09:27:25 +0200 Subject: [PATCH 27/32] Added deepcopy method to SensorDict --- src/fenicsxconcrete/finite_element_problem/base_material.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 17a79b1..17459c5 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -1,6 +1,9 @@ +from __future__ import annotations + import importlib import json from abc import ABC, abstractmethod +from copy import deepcopy from dataclasses import dataclass from pathlib import Path, PosixPath @@ -230,3 +233,6 @@ def __setitem__(self, initial_key: str, value: BaseSensor) -> None: value.name = key super().__setitem__(key, value) + + def __deepcopy__(self, memo: dict) -> SensorDict: + return self.__class__({k: deepcopy(v, memo) for k, v in self.items()}) From 624caee53f19ce4b9288ddc76e00f64011bb0b01 Mon Sep 17 00:00:00 2001 From: aradermacher Date: Thu, 5 Oct 2023 11:43:37 +0200 Subject: [PATCH 28/32] 122 make sure that parameter have correct units (#141) * set default parameters in base experiment instead of in each child once, move all parameter decleration into default_parameters function * add dimensionaly test of eyperiment parameters * add parameter dimensionalty test in material problems * fixed thix test missing default parameter * add set to default parameters in doc examples * add test for dimensionality check and exclude old default_parameter test * add default parameter test * changed degree in cylinder example to element_order * Update src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py Co-authored-by: Sjard Mathis Rosenbusch <69848361+srosenbu@users.noreply.github.com> * Update src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py Co-authored-by: Sjard Mathis Rosenbusch <69848361+srosenbu@users.noreply.github.com> * Update src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py Co-authored-by: Sjard Mathis Rosenbusch <69848361+srosenbu@users.noreply.github.com> * add Sjards comments * add Sjards comments --------- Co-authored-by: aradermacher Co-authored-by: Sjard Mathis Rosenbusch <69848361+srosenbu@users.noreply.github.com> --- docs/examples/3_point_bending.py | 3 +- docs/examples/cylinder.py | 1 + .../experimental_setup/am_multiple_layers.py | 9 +-- .../experimental_setup/base_experiment.py | 31 ++++++-- .../experimental_setup/cantilever_beam.py | 10 +-- .../compression_cylinder.py | 10 +-- .../experimental_setup/simple_beam.py | 10 +-- .../experimental_setup/simple_cube.py | 19 ++--- .../experimental_setup/tensile_beam.py | 9 +-- .../finite_element_problem/base_material.py | 38 +++++++--- .../finite_element_problem/concrete_am.py | 22 +++--- .../concrete_thermo_mechanical.py | 29 +++---- .../linear_elasticity.py | 42 +++++++++-- .../test_experimental_setups.py | 75 +++++++++++++++---- .../finite_element_problem/test_am_layers.py | 7 +- .../test_default_dictionaries.py | 59 ++++++++++----- .../test_linear_cylinder.py | 1 + .../test_linear_simple_cube.py | 6 +- .../test_thermo_mechanical_cube.py | 4 +- .../test_thixotropy_uniaxial.py | 10 +-- 20 files changed, 254 insertions(+), 141 deletions(-) diff --git a/docs/examples/3_point_bending.py b/docs/examples/3_point_bending.py index a87d60c..4a08d88 100644 --- a/docs/examples/3_point_bending.py +++ b/docs/examples/3_point_bending.py @@ -17,7 +17,7 @@ # Setting up the Beam # ------------------- # First, initialize the setup for the simply supported beam with a distributed load. -# Define the geometry, the mesh, and the load. +# Define the geometry, the mesh, and the load. Not defined parameters are set to default values (from class function default_parameters). # Note, all parameters must be pint objects: parameters = {} @@ -36,6 +36,7 @@ # Initializing the Linear Elasticity Problem # ------------------------------------------ # Second, initialize the linear elastic problem using the setup object and further material parameters: +# Again not defined parameters are set to default values (from class function default_parameters). parameters["rho"] = 7750 * ureg("kg/m^3") parameters["E"] = 210e9 * ureg("N/m^2") diff --git a/docs/examples/cylinder.py b/docs/examples/cylinder.py index 0f96e8a..b50e384 100644 --- a/docs/examples/cylinder.py +++ b/docs/examples/cylinder.py @@ -21,6 +21,7 @@ # * `mesh_density` (mesh density) in 1/m # # The parameters must be defined as `pint` objects +# Parameters required but not defined are set to default values (from class function default_parameters). # # Example code # ------------ diff --git a/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py b/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py index 949ee66..3c0d439 100644 --- a/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py +++ b/src/fenicsxconcrete/experimental_setup/am_multiple_layers.py @@ -34,13 +34,7 @@ def __init__(self, parameters: dict[str, pint.Quantity]): """ - # initialize default parameters for the setup - default_p = Parameters() - # default_p['dummy'] = 'example' * ureg('') # example default parameter for this class - - # updating parameters, overriding defaults - default_p.update(parameters) - super().__init__(default_p) + super().__init__(parameters) @staticmethod def default_parameters() -> dict[str, pint.Quantity]: @@ -52,6 +46,7 @@ def default_parameters() -> dict[str, pint.Quantity]: """ setup_parameters = {} + setup_parameters["degree"] = 2 * ureg("") # polynomial degree # geometry setup_parameters["dim"] = 2 * ureg("") setup_parameters["num_layers"] = 10 * ureg("") # number of layers in y diff --git a/src/fenicsxconcrete/experimental_setup/base_experiment.py b/src/fenicsxconcrete/experimental_setup/base_experiment.py index c6ebeb2..5167603 100644 --- a/src/fenicsxconcrete/experimental_setup/base_experiment.py +++ b/src/fenicsxconcrete/experimental_setup/base_experiment.py @@ -30,14 +30,33 @@ def __init__(self, parameters: dict[str, pint.Quantity]) -> None: """ # initialize parameter attributes - default_setup_parameters = Parameters() - # setting up default setup parameters - default_setup_parameters["degree"] = 2 * ureg("") # polynomial degree + setup_parameters = Parameters() + # setting up default setup parameters defined in each child + default_p = self.default_parameters() + setup_parameters.update(default_p) # update with input parameters - default_setup_parameters.update(parameters) + setup_parameters.update(parameters) + + # get logger info which parameters are set to default values + # plus check dimensionality of input parameters + keys_set_default = [] + for key in dict(default_p): + if key not in parameters: + keys_set_default.append(key) + else: + # check if units are compatible + dim_given = parameters[key].dimensionality + dim_default = default_p[key].dimensionality + if dim_given != dim_default: + raise ValueError( + f"given units for {key} are not compatible with default units: {dim_given} != {dim_default}" + ) + self.logger.info(f"for the following parameters, the default values are used: {keys_set_default}") + # as attribute - self.parameters = default_setup_parameters + self.parameters = setup_parameters + # remove units for use in fem model self.p = self.parameters.to_magnitude() @@ -59,6 +78,8 @@ def default_parameters() -> dict[str, pint.Quantity]: """ + pass + @abstractmethod def create_displacement_boundary(self, V: df.fem.FunctionSpace) -> list[df.fem.bcs.DirichletBCMetaClass] | None: """defines empty displacement boundary conditions (to be done in child) diff --git a/src/fenicsxconcrete/experimental_setup/cantilever_beam.py b/src/fenicsxconcrete/experimental_setup/cantilever_beam.py index 6cf1daf..7b06b38 100644 --- a/src/fenicsxconcrete/experimental_setup/cantilever_beam.py +++ b/src/fenicsxconcrete/experimental_setup/cantilever_beam.py @@ -27,14 +27,7 @@ def __init__(self, parameters: dict[str, pint.Quantity] | None = None): """ - # initialize default parameters for the setup - default_p = Parameters() - # default_p['dummy'] = 'example' * ureg('') # example default parameter for this class - - # updating parameters, overriding defaults - default_p.update(parameters) - - super().__init__(default_p) + super().__init__(parameters) def setup(self) -> None: """defines the mesh for 2D or 3D @@ -77,6 +70,7 @@ def default_parameters() -> dict[str, pint.Quantity]: """ setup_parameters = {} + setup_parameters["length"] = 1 * ureg("m") setup_parameters["height"] = 0.3 * ureg("m") setup_parameters["width"] = 0.3 * ureg("m") # only relevant for 3D case diff --git a/src/fenicsxconcrete/experimental_setup/compression_cylinder.py b/src/fenicsxconcrete/experimental_setup/compression_cylinder.py index f94ebfa..a58c2d2 100644 --- a/src/fenicsxconcrete/experimental_setup/compression_cylinder.py +++ b/src/fenicsxconcrete/experimental_setup/compression_cylinder.py @@ -90,12 +90,7 @@ def __init__(self, parameters: dict[str, pint.Quantity] | None = None) -> None: """ - # initialize a set of default parameters - p = Parameters() - - p.update(parameters) - - super().__init__(p) + super().__init__(parameters) # initialize variable top_displacement self.top_displacement = df.fem.Constant(domain=self.mesh, c=0.0) # applied via fkt: apply_displ_load(...) @@ -127,7 +122,7 @@ def setup(self) -> None: # until the bottom surface area matches that of a circle with the initially defined radius def create_cylinder_mesh(radius, p): # generate cylinder mesh using gmsh - mesh = generate_cylinder_mesh(radius, p["height"], p["mesh_density"], p["degree"]) + mesh = generate_cylinder_mesh(radius, p["height"], p["mesh_density"], p["element_order"]) facets = df.mesh.locate_entities_boundary(mesh, 2, plane_at(0.0, 2)) tdim = mesh.topology.dim f_v = mesh.topology.connectivity(tdim - 1, 0).array.reshape(-1, 3) @@ -169,6 +164,7 @@ def default_parameters() -> dict[str, pint.Quantity]: """ default_parameters = {} + default_parameters["element_order"] = 2 * ureg("") # polynomial degree # boundary setting default_parameters["bc_setting"] = "free" * ureg("") # boundary setting, two options available: fixed and free diff --git a/src/fenicsxconcrete/experimental_setup/simple_beam.py b/src/fenicsxconcrete/experimental_setup/simple_beam.py index c9733bf..edfecdb 100644 --- a/src/fenicsxconcrete/experimental_setup/simple_beam.py +++ b/src/fenicsxconcrete/experimental_setup/simple_beam.py @@ -31,14 +31,7 @@ def __init__(self, parameters: dict[str, pint.Quantity]) -> None: """ - # initialize default parameters for the setup - default_p = Parameters() - default_p["degree"] = 2 * ureg("") # polynomial degree - - # updating parameters, overriding defaults - default_p.update(parameters) - - super().__init__(default_p) + super().__init__(parameters) def setup(self): """defines the mesh for 2D or 3D @@ -81,6 +74,7 @@ def default_parameters() -> dict[str, pint.Quantity]: """ setup_parameters = {} + setup_parameters["load"] = 10000 * ureg("N/m^2") setup_parameters["length"] = 1 * ureg("m") setup_parameters["height"] = 0.3 * ureg("m") diff --git a/src/fenicsxconcrete/experimental_setup/simple_cube.py b/src/fenicsxconcrete/experimental_setup/simple_cube.py index f48ad05..33e0fca 100644 --- a/src/fenicsxconcrete/experimental_setup/simple_cube.py +++ b/src/fenicsxconcrete/experimental_setup/simple_cube.py @@ -9,7 +9,7 @@ from fenicsxconcrete.boundary_conditions.bcs import BoundaryConditions from fenicsxconcrete.experimental_setup.base_experiment import Experiment -from fenicsxconcrete.util import Parameters, ureg +from fenicsxconcrete.util import LogMixin, Parameters, ureg class SimpleCube(Experiment): @@ -33,17 +33,7 @@ def __init__(self, parameters: dict[str, pint.Quantity] | None = None) -> None: see default_parameters for a first guess """ - # initialize a set of default parameters - default_p = Parameters() - default_p["height"] = 1 * ureg("m") - default_p["width"] = 1 * ureg("m") - default_p["length"] = 1 * ureg("m") - default_p["T_0"] = ureg.Quantity(20.0, ureg.degC) - default_p["T_bc"] = ureg.Quantity(20.0, ureg.degC) - - default_p.update(parameters) - - super().__init__(default_p) + super().__init__(parameters) @staticmethod def default_parameters() -> dict[str, pint.Quantity]: @@ -56,6 +46,11 @@ def default_parameters() -> dict[str, pint.Quantity]: setup_parameters = {} + setup_parameters["height"] = 1 * ureg("m") + setup_parameters["width"] = 1 * ureg("m") + setup_parameters["length"] = 1 * ureg("m") + setup_parameters["T_0"] = ureg.Quantity(20.0, ureg.degC) + setup_parameters["T_bc"] = ureg.Quantity(20.0, ureg.degC) setup_parameters["dim"] = 3 * ureg("") setup_parameters["num_elements_length"] = 2 * ureg("") setup_parameters["num_elements_width"] = 2 * ureg("") diff --git a/src/fenicsxconcrete/experimental_setup/tensile_beam.py b/src/fenicsxconcrete/experimental_setup/tensile_beam.py index 50b2980..1567ef3 100644 --- a/src/fenicsxconcrete/experimental_setup/tensile_beam.py +++ b/src/fenicsxconcrete/experimental_setup/tensile_beam.py @@ -26,14 +26,8 @@ def __init__(self, parameters: dict[str, pint.Quantity] | None = None) -> None: see default_parameters for a first guess """ - # initialize a set of "basic parameters" - default_p = Parameters() - # default_p['dummy'] = 'example' * ureg('') # example default parameter for this class - # updating parameters, overriding defaults - default_p.update(parameters) - - super().__init__(default_p) + super().__init__(parameters) def setup(self) -> None: """defines the mesh for 2D or 3D @@ -76,6 +70,7 @@ def default_parameters() -> dict[str, pint.Quantity]: """ setup_parameters = {} + setup_parameters["length"] = 1 * ureg("m") setup_parameters["height"] = 0.3 * ureg("m") setup_parameters["width"] = 0.3 * ureg("m") # only relevant for 3D case diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 6411b40..7a2f9b7 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -92,16 +92,34 @@ def __init__( self.experiment = experiment self.mesh = self.experiment.mesh - # setting up default material parameters - default_fem_parameters = Parameters() - default_fem_parameters["g"] = 9.81 * ureg("m/s^2") - default_fem_parameters["dt"] = 1.0 * ureg("s") - - # adding experimental parameters to dictionary to combine to one - default_fem_parameters.update(self.experiment.parameters) + # initialize parameter attributes + setup_parameters = Parameters() + # setting up default setup parameters defined in each child + _, default_p = self.default_parameters() + setup_parameters.update(default_p) + # update with experiment parameters + setup_parameters.update(self.experiment.parameters) # update with input parameters - default_fem_parameters.update(parameters) - self.parameters = default_fem_parameters + setup_parameters.update(parameters) + + # get logger info which input parameters are set to default values + # plus check dimensionality of input parameters + keys_set_default = [] + for key in dict(default_p): + if key not in parameters: + keys_set_default.append(key) + else: + # check if units are compatible + dim_given = parameters[key].dimensionality + dim_default = default_p[key].dimensionality + if dim_given != dim_default: + raise ValueError( + f"given units for {key} are not compatible with default units: {dim_given} != {dim_default}" + ) + self.logger.info(f"for the following parameters, the default values are used: {keys_set_default}") + + # set parameters as attribute + self.parameters = setup_parameters # remove units for use in fem model self.p = self.parameters.to_magnitude() self.experiment.p = self.p # update experimental parameter list for use in e.g. boundary definition @@ -135,6 +153,8 @@ def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: """returns a dictionary with required parameters and a set of working values as example""" # this must de defined in each setup class + pass + @abstractmethod def setup(self) -> None: # initialization of this specific problem diff --git a/src/fenicsxconcrete/finite_element_problem/concrete_am.py b/src/fenicsxconcrete/finite_element_problem/concrete_am.py index a168871..6c5a437 100644 --- a/src/fenicsxconcrete/finite_element_problem/concrete_am.py +++ b/src/fenicsxconcrete/finite_element_problem/concrete_am.py @@ -48,19 +48,19 @@ def __init__( """ - # adding default material parameter, will be overridden by outside input - default_p = Parameters() - default_p["stress_state"] = "plane_strain" * ureg("") # default stress state for 2D optional "plane_stress" - - # updating parameters, overriding defaults - default_p.update(parameters) + # # adding default material parameter, will be overridden by outside input + # default_p = Parameters() + # # default stress state for 2D optional "plane_stress" + # + # # updating parameters, overriding defaults + # default_p.update(parameters) if nonlinear_problem: self.nonlinear_problem = nonlinear_problem else: self.nonlinear_problem = ConcreteThixElasticModel # default material - super().__init__(experiment, default_p, pv_name, pv_path) + super().__init__(experiment, parameters, pv_name, pv_path) @staticmethod def parameter_description() -> dict[str, str]: @@ -73,12 +73,13 @@ def parameter_description() -> dict[str, str]: description = { "general parameters": { "rho": "density of fresh concrete", + "g": "gravity", "nu": "Poissons Ratio", "degree": "Polynomial degree for the FEM model", "q_degree": "Polynomial degree for which the quadrature rule integrates correctly", "load_time": "time in which the load is applied", "stress_state": "for 2D plain stress or plane strain", - "dt": "time step", # default set in material base class + "dt": "time step", }, "ThixElasticModel": { "E_0": "Youngs Modulus at age=0", @@ -112,10 +113,13 @@ def default_parameters( joined_parameters = { # Material parameter for concrete model with structural build-up "rho": 2070 * ureg("kg/m^3"), # density of fresh concrete + "g": 9.81 * ureg("m/s^2"), # gravity "nu": 0.3 * ureg(""), # Poissons Ratio # other model parameters - # "degree": 2 * ureg(""), # polynomial degree --> default defined in base_experiment!! + "degree": 2 * ureg(""), # polynomial degree "q_degree": 2 * ureg(""), # quadrature rule + "stress_state": "plane_strain" * ureg(""), # for 2D stress state + "dt": 1.0 * ureg("s"), # time step "load_time": 60 * ureg("s"), # body force load applied in s } if not non_linear_problem or non_linear_problem == ConcreteThixElasticModel: diff --git a/src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py b/src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py index 2f53779..86891e2 100644 --- a/src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py +++ b/src/fenicsxconcrete/finite_element_problem/concrete_thermo_mechanical.py @@ -32,22 +32,23 @@ def __init__( pv_path: str | None = None, ) -> None: - # adding default material parameter, will be overridden by outside input - default_p = Parameters() - # default_p['dummy'] = 'example' * ureg('') # example default parameter for this class + # # adding default material parameter, will be overridden by outside input + # default_p = Parameters() + # # default_p['dummy'] = 'example' * ureg('') # example default parameter for this class + # + # # updating parameters, overriding defaults + # default_p.update(parameters) - # updating parameters, overriding defaults - default_p.update(parameters) - - super().__init__(experiment, default_p, pv_name, pv_path) + super().__init__(experiment, parameters, pv_name, pv_path) @staticmethod def parameter_description() -> dict[str, str]: description = { "igc": "Ideal gas constant", "rho": "Density of concrete", - "themal_cond": "Thermal conductivity", - "vol_heat_cap": "TODO", + "g": "Gravitational acceleration", + "thermal_cond": "effective thermal conductivity", + "vol_heat_cap": "volumetric heat capacity", "Q_pot": "potential heat per weight of binder", "Q_inf": "potential heat per concrete volume", "B1": "numerical shape parameter for heat release function", @@ -68,6 +69,7 @@ def parameter_description() -> dict[str, str]: "ft_inf": "reference value for the tensile strength, default infinity, otherwise at alpha_tx", "a_ft": "exponential parameter to change the shape of the function ft(DOH)", "evolution_ft": "flag to turn off the evolution of the tensile strength", + "dt": "time step", } return description @@ -85,6 +87,7 @@ def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: default_parameters = { "igc": 8.3145 * ureg("J/K/mol"), "rho": 2350.0 * ureg("kg/m^3"), + "g": 9.81 * ureg("m/s^2"), "thermal_cond": 2.0 * ureg("W/(m*K)"), "vol_heat_cap": 2.4e6 * ureg("J/(m^3 * K)"), # "Q_pot": 500e3 * ureg("J/kg"), only needed for postprocessing @@ -95,6 +98,7 @@ def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: "alpha_max": 0.875 * ureg(""), "alpha_tx": 0.68 * ureg(""), "T_ref": ureg.Quantity(25.0, ureg.degC), + "degree": 2 * ureg(""), "q_degree": 2 * ureg(""), "E_28": 15 * ureg("MPa"), "nu": 0.2 * ureg(""), @@ -106,16 +110,16 @@ def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: "ft_inf": 467000 * ureg(""), "a_ft": 1.0 * ureg(""), "evolution_ft": "True" * ureg(""), + "dt": 1.0 * ureg("s"), } - default_parameters["E_act"] = 5653.0 * default_parameters["igc"] * ureg("J/mol") + default_parameters["E_act"] = 5653.0 * ureg("K") * default_parameters["igc"] + return experiment, default_parameters def compute_residuals(self) -> None: pass def setup(self) -> None: - # TODO: the next line only makes a test pass. I don't like it either - _ = self.p["rho"] self.t = 0.0 self.rule = QuadratureRule(cell_type=self.mesh.ufl_cell(), degree=self.p["q_degree"]) @@ -193,7 +197,6 @@ def solve(self) -> None: # set current DOH for computation of Young's modulus self.mechanics_problem.q_array_alpha[:] = self.temperature_problem.q_alpha.vector.array - # print('Solving: u') # TODO ouput only a certain log level INFO # mechanics paroblem is not required for temperature, could crash in frist time steps but then be useful try: diff --git a/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py b/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py index bd32428..e2c3fef 100644 --- a/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py +++ b/src/fenicsxconcrete/finite_element_problem/linear_elasticity.py @@ -21,14 +21,14 @@ def __init__( ) -> None: """defines default parameters, for the rest, see base class""" - # adding default material parameter, will be overridden by outside input - default_p = Parameters() - default_p["stress_state"] = "plane_strain" * ureg("") # default stress state in 2D, optional "plane_stress" + # # adding default material parameter, will be overridden by outside input + # default_p = Parameters() + # default_p["stress_state"] = "plane_strain" * ureg("") # default stress state in 2D, optional "plane_stress" + # + # # updating parameters, overriding defaults + # default_p.update(parameters) - # updating parameters, overriding defaults - default_p.update(parameters) - - super().__init__(experiment, default_p, pv_name, pv_path) + super().__init__(experiment, parameters, pv_name, pv_path) def setup(self) -> None: # compute different set of elastic moduli @@ -84,6 +84,27 @@ def setup(self) -> None: petsc_options={"ksp_type": "preonly", "pc_type": "lu"}, ) + @staticmethod + def parameter_description() -> dict[str, str]: + """static method returning a description dictionary for required parameters + + Returns: + description dictionary + + """ + description = { + "g": "gravity", + "dt": "time step", + "rho": "density of fresh concrete", + "E": "Young's Modulus", + "nu": "Poissons Ratio", + "stress_state": "for 2D plain stress or plane strain", + "degree": "Polynomial degree for the FEM model", + "dt": "time step", + } + + return description + @staticmethod def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: """returns a dictionary with required parameters and a set of working values as example""" @@ -91,10 +112,17 @@ def default_parameters() -> tuple[Experiment, dict[str, pint.Quantity]]: experiment = CantileverBeam(CantileverBeam.default_parameters()) model_parameters = {} + model_parameters["g"] = 9.81 * ureg("m/s^2") + model_parameters["dt"] = 1.0 * ureg("s") + model_parameters["rho"] = 7750 * ureg("kg/m^3") model_parameters["E"] = 210e9 * ureg("N/m^2") model_parameters["nu"] = 0.28 * ureg("") + model_parameters["stress_state"] = "plane_strain" * ureg("") + model_parameters["degree"] = 2 * ureg("") # polynomial degree + model_parameters["dt"] = 1.0 * ureg("s") + return experiment, model_parameters # Stress computation for linear elastic problem diff --git a/tests/experimental_setup/test_experimental_setups.py b/tests/experimental_setup/test_experimental_setups.py index a491a41..82e5981 100644 --- a/tests/experimental_setup/test_experimental_setups.py +++ b/tests/experimental_setup/test_experimental_setups.py @@ -1,5 +1,6 @@ import copy +import pint import pytest from fenicsxconcrete.experimental_setup.am_multiple_layers import AmMultipleLayers @@ -12,6 +13,39 @@ from fenicsxconcrete.finite_element_problem.linear_elasticity import LinearElasticity from fenicsxconcrete.util import ureg +# # makes no sense anymore since the default parameter are used in each experiment or material problem +# # plus was not tested since twice the same names!! +# @pytest.mark.parametrize( +# "setup", +# [ +# CantileverBeam, +# TensileBeam, +# SimpleBeam, +# CompressionCylinder, +# AmMultipleLayers, +# SimpleCube, +# ], +# ) +# def test_default_parameters(setup: Experiment) -> None: +# """This function creates experimental setups with the respective default dictionaries +# +# This makes sure all relevant values are included""" +# default_material = LinearElasticity +# +# setup_parameters = setup.default_parameters() +# +# # initialize with default parameters +# experiment = setup(setup_parameters) +# +# # test that each parameter is truly required +# for key in setup_parameters: +# with pytest.raises(KeyError): +# less_parameters = copy.deepcopy(setup_parameters) +# less_parameters.pop(key) +# experiment = setup(less_parameters) +# fem_problem = default_material(experiment, default_material.default_parameters()[1]) +# fem_problem.solve() + @pytest.mark.parametrize( "setup", @@ -25,24 +59,16 @@ ], ) def test_default_parameters(setup: Experiment) -> None: - """This function creates experimental setups with the respective default dictionaries - - This makes sure all relevant values are included""" - default_material = LinearElasticity + """This function tests if the default_parameters are complete""" + # default_material = LinearElasticity setup_parameters = setup.default_parameters() - # initialize with default parameters - experiment = setup(setup_parameters) - - # test that each parameter is truly required - for key in setup_parameters: - with pytest.raises(KeyError): - less_parameters = copy.deepcopy(setup_parameters) - less_parameters.pop(key) - experiment = setup(less_parameters) - fem_problem = default_material(experiment, default_material.default_parameters()[1]) - fem_problem.solve() + try: + experiment = setup(setup_parameters) + except KeyError: + print("default parameter dictionary is wrong") + raise ValueError # to imporve coverage, I want to test the error messages @@ -63,3 +89,22 @@ def test_default_parameters(setup: Experiment) -> None: with pytest.raises(ValueError): setup_parameters["dim"] = 4 * ureg("") # there is no 4D setup test_setup = setup(setup_parameters) + + +@pytest.mark.parametrize( + "setup", + [ + CantileverBeam, + TensileBeam, + SimpleBeam, + CompressionCylinder, + AmMultipleLayers, + SimpleCube, + ], +) +def test_dimensionality_check(setup: Experiment) -> None: + setup_parameters = setup.default_parameters() + + with pytest.raises(ValueError): + setup_parameters["dim"] = 3 * ureg("s") # dimension should be dimensionless + test_setup = setup(setup_parameters) diff --git a/tests/finite_element_problem/test_am_layers.py b/tests/finite_element_problem/test_am_layers.py index 477c932..74dddde 100644 --- a/tests/finite_element_problem/test_am_layers.py +++ b/tests/finite_element_problem/test_am_layers.py @@ -38,13 +38,8 @@ def set_test_parameters(dim: int, mat_type: str = "thix") -> Parameters: if dim == 2: setup_parameters["stress_state"] = "plane_stress" * ureg("") - # default material parameters as start - if mat_type == "thix": - _, default_params = ConcreteAM.default_parameters(ConcreteThixElasticModel) - else: - raise ValueError(f"Unknown material type {mat_type}") + # default material parameters from material problem - setup_parameters.update(default_params) if dim == 3: setup_parameters["q_degree"] = 4 * ureg("") diff --git a/tests/finite_element_problem/test_default_dictionaries.py b/tests/finite_element_problem/test_default_dictionaries.py index da4d680..0e9bfa8 100644 --- a/tests/finite_element_problem/test_default_dictionaries.py +++ b/tests/finite_element_problem/test_default_dictionaries.py @@ -6,26 +6,51 @@ from fenicsxconcrete.finite_element_problem.concrete_am import ConcreteAM from fenicsxconcrete.finite_element_problem.concrete_thermo_mechanical import ConcreteThermoMechanical from fenicsxconcrete.finite_element_problem.linear_elasticity import LinearElasticity +from fenicsxconcrete.util import ureg + + +# @pytest.mark.parametrize("material_model", [LinearElasticity, ConcreteAM, ConcreteThermoMechanical]) +# def test_default_dictionaries(material_model: MaterialProblem) -> None: +# """This function creates experimental setups with the respective default dictionaries +# +# This makes sure all relevant values are included""" +# +# default_setup, default_parameters = material_model.default_parameters() +# +# fem_problem = material_model(default_setup, default_parameters) +# fem_problem.solve() +# +# # test that each parameter is truly required +# # a loop over all default parameters removes each on in turn and expects a key error from the initialized problem +# for key in default_parameters: +# with pytest.raises(KeyError) as ex: +# less_parameters = copy.deepcopy(default_parameters) +# less_parameters.pop(key) +# fem_problem = material_model(default_setup, less_parameters) +# fem_problem.solve() +# print(key, "seems to be an unneccessary key in the default dictionary") +# print(ex) +# since the default parameter are used in each experiment or material problem this test makes no sence anymore +@pytest.mark.parametrize("material_model", [LinearElasticity, ConcreteAM, ConcreteThermoMechanical]) +def test_dimensionality_check(material_model: MaterialProblem) -> None: + default_setup, default_parameters = material_model.default_parameters() -@pytest.mark.parametrize("material_model", [LinearElasticity, ConcreteAM, ConcreteThermoMechanical]) -def test_default_dictionaries(material_model: MaterialProblem) -> None: - """This function creates experimental setups with the respective default dictionaries + with pytest.raises(ValueError): + default_parameters["g"] = 3 * ureg("m") # gravity should be m/s² + fem_problem = material_model(default_setup, default_parameters) - This makes sure all relevant values are included""" + +@pytest.mark.parametrize("material_model", [LinearElasticity, ConcreteAM, ConcreteThermoMechanical]) +def test_default_parameters(material_model: MaterialProblem) -> None: + """This function tests if the default_parameters are complete""" + # default_material = LinearElasticity default_setup, default_parameters = material_model.default_parameters() - fem_problem = material_model(default_setup, default_parameters) - fem_problem.solve() - - # test that each parameter is truly required - # a loop over all default parameters removes each on in turn and expects a key error from the initialized problem - for key in default_parameters: - with pytest.raises(KeyError) as ex: - less_parameters = copy.deepcopy(default_parameters) - less_parameters.pop(key) - fem_problem = material_model(default_setup, less_parameters) - fem_problem.solve() - print(key, "seems to be an unneccessary key in the default dictionary") - print(ex) + try: + fem_problem = material_model(default_setup, default_parameters) + fem_problem.solve() + except KeyError: + print("default parameter dictionary is wrong") + raise ValueError diff --git a/tests/finite_element_problem/test_linear_cylinder.py b/tests/finite_element_problem/test_linear_cylinder.py index 441b060..4835015 100644 --- a/tests/finite_element_problem/test_linear_cylinder.py +++ b/tests/finite_element_problem/test_linear_cylinder.py @@ -21,6 +21,7 @@ def simple_setup( parameters["height"] = 0.012 * ureg("m") parameters["dim"] = 3 * ureg("") parameters["bc_setting"] = bc_setting * ureg("") + parameters["element_order"] = 2 * ureg("") parameters["degree"] = 2 * ureg("") parameters.update(p) diff --git a/tests/finite_element_problem/test_linear_simple_cube.py b/tests/finite_element_problem/test_linear_simple_cube.py index 3b621f3..5a8ea2a 100644 --- a/tests/finite_element_problem/test_linear_simple_cube.py +++ b/tests/finite_element_problem/test_linear_simple_cube.py @@ -105,7 +105,8 @@ def test_disp(dim: int) -> None: @pytest.mark.parametrize("dim", [2, 3]) def test_strain_state_error(dim: int) -> None: - setup_parameters = SimpleCube.default_parameters() + # setup_parameters = SimpleCube.default_parameters() + setup_parameters = {} # use default parameters setup_parameters["dim"] = dim * ureg("") setup_parameters["strain_state"] = "wrong" * ureg("") setup = SimpleCube(setup_parameters) @@ -117,7 +118,8 @@ def test_strain_state_error(dim: int) -> None: @pytest.mark.parametrize("dim", [2, 3]) @pytest.mark.parametrize("degree", [1, 2]) def test_multiaxial_strain(dim: int, degree: int) -> None: - setup_parameters = SimpleCube.default_parameters() + # setup_parameters = SimpleCube.default_parameters() + setup_parameters = {} # use default parameters setup_parameters["dim"] = dim * ureg("") setup_parameters["degree"] = degree * ureg("") setup_parameters["strain_state"] = "multiaxial" * ureg("") diff --git a/tests/finite_element_problem/test_thermo_mechanical_cube.py b/tests/finite_element_problem/test_thermo_mechanical_cube.py index 56e8da2..cb1cefa 100644 --- a/tests/finite_element_problem/test_thermo_mechanical_cube.py +++ b/tests/finite_element_problem/test_thermo_mechanical_cube.py @@ -158,9 +158,7 @@ def test_hydration_with_body_forces(dim: int): parameters["rho"] = 2350 * ureg("kg/m^3") # in kg/m^3 density of concrete parameters["density_binder"] = 1440 * ureg("kg/m^3") # in kg/m^3 density of the binder - parameters["thermal_cond"] = 2.0 * ureg( - "W/(m^3*K)" - ) # effective thermal conductivity, approx in Wm^-3K^-1, concrete! + parameters["thermal_cond"] = 2.0 * ureg("W/(m*K)") # effective thermal conductivity, approx in W(mK)^-1, concrete! # self.specific_heat_capacity = 9000 # effective specific heat capacity in J kg⁻1 K⁻1 parameters["vol_heat_cap"] = 2.4e6 * ureg("J/(m^3 * K)") # volumetric heat cap J/(m3 K) # parameters["b_ratio"] = 0.2 # volume percentage of binder diff --git a/tests/finite_element_problem/test_thixotropy_uniaxial.py b/tests/finite_element_problem/test_thixotropy_uniaxial.py index 72fd0d6..532c60e 100644 --- a/tests/finite_element_problem/test_thixotropy_uniaxial.py +++ b/tests/finite_element_problem/test_thixotropy_uniaxial.py @@ -64,12 +64,11 @@ def test_disp(dim: int, degree: int): # setting up the problem experiment = SimpleCube(parameters) - # get default parameters and change accordingly to cases + # get description of parameters des = ConcreteAM.parameter_description() print(des) - _, default_params = ConcreteAM.default_parameters(ConcreteThixElasticModel) - parameters.update(default_params) + # use default parameters (default) and change accordingly to cases parameters["degree"] = degree * ureg("") if dim == 3: parameters["q_degree"] = 4 * ureg("") @@ -139,6 +138,7 @@ def check_disp_case(problem: ConcreteAM, dt: pint.Quantity, E_o_time: list[float if problem.p["dim"] == 2: # standard uniaxial checks for last time step + print("analytic_eps", analytic_eps, problem.p["nu"] * analytic_eps) # strain in yy direction assert problem.sensors["StrainSensor"].data[-1][-1] == pytest.approx(analytic_eps) # strain in xx direction @@ -198,5 +198,5 @@ def check_disp_case(problem: ConcreteAM, dt: pint.Quantity, E_o_time: list[float # if __name__ == "__main__": # # test_disp(2, 2) -# -# # test_disp(3, 2) + +# test_disp(3, 1) From a41414a4addb4c84dec5975a8b63d100675e4238 Mon Sep 17 00:00:00 2001 From: Sjard Mathis Rosenbusch <69848361+srosenbu@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:05:02 +0200 Subject: [PATCH 29/32] Set dolfinx version to 0.6.0 (#144) * Set dolfinx version to 0.6.0 * Move dependencies to environment.yaml * Reset mpi version * add conda-lock.yml --------- Co-authored-by: Philipp Diercks --- conda-lock.yml | 4908 +++++++++++++++++++++++++++++++++++++++++++++++ environment.yml | 28 +- pyproject.toml | 14 +- 3 files changed, 4937 insertions(+), 13 deletions(-) create mode 100644 conda-lock.yml diff --git a/conda-lock.yml b/conda-lock.yml new file mode 100644 index 0000000..df14a1f --- /dev/null +++ b/conda-lock.yml @@ -0,0 +1,4908 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV --file conda-lock.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile conda-lock.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f environment.yml --lockfile conda-lock.yml +version: 1 +metadata: + content_hash: + linux-64: b3bc921f3b2ec6c9fc6b9f5479fa5d65e011bd6f00f3f2c719e1f507a9c774fa + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - environment.yml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + category: main + optional: false +- name: ca-certificates + version: 2023.7.22 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda + hash: + md5: a73ecd2988327ad4c8f2c331482917f2 + sha256: 525b7b6b5135b952ec1808de84e5eca57c7c7ff144e29ef3e96ae4040ff432c1 + category: main + optional: false +- name: conda-ecosystem-user-package-isolation + version: '1.0' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/conda-ecosystem-user-package-isolation-1.0-ha770c72_1.tar.bz2 + hash: + md5: ae754334312bf9346a0f75d1d21bc24f + sha256: 0692b32ffc84f4b98f05b700693ae40607af9431c56ddcc42bd130238723bbec + category: main + optional: false +- name: fenics-ufcx + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/fenics-ufcx-0.6.0-h56297ac_0.conda + hash: + md5: 6424710417c308e1e5a711de04e7b4cb + sha256: d3abe7a32493d2c69f86b18961837a629156fcbb38bb8509da6479f3e8d689f0 + category: main + optional: false +- name: font-ttf-dejavu-sans-mono + version: '2.37' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + hash: + md5: 0c96522c6bdaed4b1566d11387caaf45 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + category: main + optional: false +- name: font-ttf-inconsolata + version: '3.000' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + hash: + md5: 34893075a5c9e55cdafac56607368fc6 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + category: main + optional: false +- name: font-ttf-source-code-pro + version: '2.038' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + hash: + md5: 4d59c254e01d9cde7957100457e2d5fb + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + category: main + optional: false +- name: font-ttf-ubuntu + version: '0.83' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2 + hash: + md5: 19410c3df09dfb12d1206132a1d357c5 + sha256: 470d5db54102bd51dbb0c5990324a2f4a0bc976faa493b22193338adb9882e2e + category: main + optional: false +- name: kernel-headers_linux-64 + version: 2.6.32 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_16.conda + hash: + md5: 7ca122655873935e02c91279c5b03c8c + sha256: aaa8aa6dc776d734a6702032588ff3c496721da905366d91162e3654c082aef0 + category: main + optional: false +- name: ld_impl_linux-64 + version: '2.40' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + hash: + md5: 7aca3059a1729aa76c597603f10b0dd3 + sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd + category: main + optional: false +- name: libboost-headers + version: 1.82.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.82.0-ha770c72_6.conda + hash: + md5: a943dcb8fd22cf23ce901ac84f6538c2 + sha256: c996950b85808115ea833e577a0af2969dbb0378c299560c2b945401a7770823 + category: main + optional: false +- name: libgcc-devel_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-devel_linux-64-12.3.0-h8bca6fd_2.conda + hash: + md5: ed613582de7b8569fdc53ca141be176a + sha256: 7e12d0496389017ca526254913b24d9024e1728c849a0d6476a4b7fde9d03cba + category: main + optional: false +- name: libstdcxx-devel_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-devel_linux-64-12.3.0-h8bca6fd_2.conda + hash: + md5: 7268a17e56eb099d1b8869bbbf46de4c + sha256: e8483069599561ef24b884c898442eadc510190f978fa388db3281b10c3c084e + category: main + optional: false +- name: libstdcxx-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda + hash: + md5: 9172c297304f2a20134fc56c97fbe229 + sha256: ab22ecdc974cdbe148874ea876d9c564294d5eafa760f403ed4fd495307b4243 + category: main + optional: false +- name: mpi + version: '1.0' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-openmpi.tar.bz2 + hash: + md5: 1dcc49e16749ff79ba2194fa5d4ca5e7 + sha256: 54cf44ee2c122bce206f834a825af06e3b14fc4fd58c968ae9329715cc281d1e + category: main + optional: false +- name: mumps-include + version: 5.2.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-include-5.2.1-ha770c72_11.tar.bz2 + hash: + md5: 765196257c11b54dc52522d2fcafdd69 + sha256: 583922c671eb90e576a96432fe1439bc5eb46f88c4a0a4867fba39653c09c6de + category: main + optional: false +- name: nlohmann_json + version: 3.11.2 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2 + hash: + md5: b7743cf3f8da023abe95afc215111555 + sha256: 55ac71e0431267b30b3bc9ea0238d1b9dc69644938d213511749c71b91506a7b + category: main + optional: false +- name: pybind11-abi + version: '4' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + hash: + md5: 878f923dd6acc8aeb47a75da6c4098be + sha256: d4fb485b79b11042a16dc6abfb0c44c4f557707c2653ac47c81e5d32b24a3bb0 + category: main + optional: false +- name: python_abi + version: '3.10' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda + hash: + md5: 26322ec5d7712c3ded99dd656142b8ce + sha256: 456bec815bfc2b364763084d08b412fdc4c17eb9ccc66a36cb775fa7ac3cbaec + category: main + optional: false +- name: tzdata + version: 2023c + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda + hash: + md5: 939e3e74d8be4dac89ce83b20de2492a + sha256: 0449138224adfa125b220154408419ec37c06b0b49f63c5954724325903ecf55 + category: main + optional: false +- name: utfcpp + version: 3.2.5 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/utfcpp-3.2.5-ha770c72_0.conda + hash: + md5: b3599de486d88c2c447501cd2b053a99 + sha256: 91c89693a4bd7f9aec874528506ba08dfc6c9acc3aec88dfb315dad6adba0c8b + category: main + optional: false +- name: fonts-conda-forge + version: '1' + manager: conda + platform: linux-64 + dependencies: + font-ttf-dejavu-sans-mono: '' + font-ttf-inconsolata: '' + font-ttf-source-code-pro: '' + font-ttf-ubuntu: '' + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + hash: + md5: f766549260d6815b0c52253f1fb1bb29 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + category: main + optional: false +- name: libgomp + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda + hash: + md5: e2042154faafe61969556f28bade94b9 + sha256: e1e82348f8296abfe344162b3b5f0ddc2f504759ebeb8b337ba99beaae583b15 + category: main + optional: false +- name: sysroot_linux-64 + version: '2.12' + manager: conda + platform: linux-64 + dependencies: + kernel-headers_linux-64: 2.6.32 + url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_16.conda + hash: + md5: 071ea8dceff4d30ac511f4a2f8437cd1 + sha256: 4c024b2eee24c6da7d3e08723111ec02665c578844c5b3e9e6b38f89000bec41 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + category: main + optional: false +- name: binutils_impl_linux-64 + version: '2.40' + manager: conda + platform: linux-64 + dependencies: + ld_impl_linux-64: '2.40' + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-hf600244_0.conda + hash: + md5: 33084421a8c0af6aef1b439707f7662a + sha256: a7e0ea2b71a5b03d82e5a58fb6b612ab1c44d72ce161f9aa441f7ba467cd4c8d + category: main + optional: false +- name: fonts-conda-ecosystem + version: '1' + manager: conda + platform: linux-64 + dependencies: + fonts-conda-forge: '' + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + hash: + md5: fee5683a3f04bd15cbd8318b096a27ab + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + category: main + optional: false +- name: binutils_linux-64 + version: '2.40' + manager: conda + platform: linux-64 + dependencies: + binutils_impl_linux-64: 2.40.* + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hbdbef99_2.conda + hash: + md5: adfebae9fdc63a598495dfe3b006973a + sha256: 333f3339d94c93bcc02a723e3e460cb6ff6075e05f5247e15bef5dcdcec541a3 + category: main + optional: false +- name: libgcc-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda + hash: + md5: c28003b0be0494f9a7664389146716ff + sha256: d361d3c87c376642b99c1fc25cddec4b9905d3d9b9203c1c545b8c8c1b04539a + category: main + optional: false +- name: alsa-lib + version: 1.2.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda + hash: + md5: 75dae9a4201732aa78a530b826ee5fe0 + sha256: 51147922bad9d3176e780eb26f748f380cd3184896a9f9125d8ac64fe330158b + category: main + optional: false +- name: aom + version: 3.6.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/aom-3.6.1-h59595ed_0.conda + hash: + md5: 8457db6d1175ee86c8e077f6ac60ff55 + sha256: 006d10fe845374e71fb15a6c1f58ae4b3efef69be02b0992265abfb5c4c2e026 + category: main + optional: false +- name: attr + version: 2.5.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + hash: + md5: d9c69a24ad678ffce24c6543a0176b00 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + category: main + optional: false +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2 + hash: + md5: a1fd65c7ccbf10880423d82bca54eb54 + sha256: cb521319804640ff2ad6a9f118d972ed76d86bea44e5626c09a13d38f562e1fa + category: main + optional: false +- name: c-ares + version: 1.20.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.20.1-hd590300_1.conda + hash: + md5: 2facbaf5ee1a56967aecaee89799160e + sha256: 1700d9ebfd3b21c8b50e12a502f26e015719e1f3dbb5d491b5be061cf148ca7a + category: main + optional: false +- name: dav1d + version: 1.2.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + hash: + md5: 418c6ca5929a611cbd69204907a83995 + sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 + category: main + optional: false +- name: double-conversion + version: 3.3.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + hash: + md5: c2f83a5ddadadcdb08fe05863295ee97 + sha256: 9eee491a73b67fd64379cf715f85f8681568ebc1f02f9e11b4c50d46a3323544 + category: main + optional: false +- name: eigen + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda + hash: + md5: b1b879d6d093f55dd40d58b5eb2f0699 + sha256: 53b15a98aadbe0704479bacaf7a5618fcb32d1577be320630674574241639b34 + category: main + optional: false +- name: fribidi + version: 1.0.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + hash: + md5: ac7bc6a654f8f41b352b38f4051135f8 + sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + category: main + optional: false +- name: gettext + version: 0.21.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 + hash: + md5: 14947d8770185e5153fdd04d4673ed37 + sha256: 4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a + category: main + optional: false +- name: gmp + version: 6.2.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libstdcxx-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.2.1-h58526e2_0.tar.bz2 + hash: + md5: b94cf2db16066b242ebd26db2facbd56 + sha256: 07a5319e1ac54fe5d38f50c60f7485af7f830b036da56957d0bfb7558a886198 + category: main + optional: false +- name: graphite2 + version: 1.3.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libstdcxx-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2 + hash: + md5: 8c54672728e8ec6aa6db90cf2806d220 + sha256: 65da967f3101b737b08222de6a6a14e20e480e7d523a5d1e19ace7b960b5d6b1 + category: main + optional: false +- name: icu + version: '73.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + hash: + md5: cc47e1facc155f91abd89b11e48e72ff + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + category: main + optional: false +- name: jsoncpp + version: 1.9.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + libstdcxx-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2 + hash: + md5: ae7f50dd1e78c7e78b5d2cf7062e559d + sha256: 7a5a6cdfc17849bb8000cc31b91c22f1fe0e087dfc3fd59ecc4d3b64cf0ad772 + category: main + optional: false +- name: jxrlib + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-h7f98852_2.tar.bz2 + hash: + md5: 8e787b08fe19986d99d034b839df2961 + sha256: 3ffc19c2ca272e6d5b8edc7cfc5bb71763dfdfa1810dd4b8820cc6b212ecbd95 + category: main + optional: false +- name: keyutils + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + hash: + md5: 30186d27e2c9fa62b45fb1476b7200e3 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + category: main + optional: false +- name: lame + version: '3.100' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + hash: + md5: a8832b479f93521a9e7b5b743803be51 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + category: main + optional: false +- name: lerc + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + hash: + md5: 76bbff344f0134279f225174e9064c8f + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + category: main + optional: false +- name: libaec + version: 1.1.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda + hash: + md5: 127b0be54c1c90760d7fe02ea7a56426 + sha256: fdde15e74dc099ab1083823ec0f615958e53d9a8fae10405af977de251668bea + category: main + optional: false +- name: libbrotlicommon + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda + hash: + md5: aec6c91c7371c26392a06708a73c70e5 + sha256: 40f29d1fab92c847b083739af86ad2f36d8154008cf99b64194e4705a1725d78 + category: main + optional: false +- name: libdeflate + version: '1.19' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda + hash: + md5: 1635570038840ee3f9c71d22aa5b8b6d + sha256: 985ad27aa0ba7aad82afa88a8ede6a1aacb0aaca950d710f15d85360451e72fd + category: main + optional: false +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2 + hash: + md5: 6f8720dff19e17ce5d48cfe7f3d2f0a3 + sha256: 8c9635aa0ea28922877dc96358f9547f6a55fc7e2eb75a556b05f1725496baf9 + category: main + optional: false +- name: libexpat + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda + hash: + md5: 6305a3dd2752c76335295da4e581f2fd + sha256: 74c98a563777ae2ad71f1f74d458a8ab043cee4a513467c159ccf159d0e461f3 + category: main + optional: false +- name: libffi + version: 3.4.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + hash: + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + category: main + optional: false +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=13.2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda + hash: + md5: 78fdab09d9138851dde2b5fe2a11019e + sha256: 55ecf5c46c05a98b4822a041d6e1cb196a7b0606126eb96b24131b7d2c8ca561 + category: main + optional: false +- name: libiconv + version: '1.17' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2 + hash: + md5: b62b52da46c39ee2bc3c162ac7f1804d + sha256: 6a81ebac9f1aacdf2b4f945c87ad62b972f0f69c8e0981d68e111739e6720fd7 + category: main + optional: false +- name: libjpeg-turbo + version: 2.1.5.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda + hash: + md5: 323e90742f0f48fc22bea908735f55e6 + sha256: 0ef7378818c6d5b407692d02556c32e2f6af31c7542bca5160d0b92a59427fb5 + category: main + optional: false +- name: libnsl + version: 2.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + hash: + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + category: main + optional: false +- name: libogg + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + hash: + md5: 6e8cc2173440d77708196c5b93771680 + sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 + category: main + optional: false +- name: libopus + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + hash: + md5: 15345e56d527b330e1cacbdf58676e8f + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + category: main + optional: false +- name: libpciaccess + version: '0.17' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2 + hash: + md5: b7463391cf284065294e2941dd41ab95 + sha256: 9fe4aaf5629b4848d9407b9ed4da941ba7e5cebada63ee0becb9aa82259dc6e2 + category: main + optional: false +- name: libsanitizer + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-h0f45ef3_2.conda + hash: + md5: 4655db64eca78a6fcc4fb654fc1f8d57 + sha256: a58add0b4477c59aee324b508d834267360b659f9c543f551ca4442196e656fe + category: main + optional: false +- name: libsodium + version: 1.0.18 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 + hash: + md5: c3788462a6fbddafdb413a9f9053e58d + sha256: 53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130 + category: main + optional: false +- name: libtasn1 + version: 4.19.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2 + hash: + md5: 93840744a8552e9ebf6bb1a5dffc125a + sha256: 5bfeada0e1c6ec2574afe2d17cdbc39994d693a41431338a6cb9dfa7c4d7bfc8 + category: main + optional: false +- name: libunistring + version: 0.9.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + hash: + md5: 7245a044b4a1980ed83196176b78b73a + sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d + category: main + optional: false +- name: libuuid + version: 2.38.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + hash: + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + category: main + optional: false +- name: libvpx + version: 1.13.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda + hash: + md5: 0974a6d3432e10bae02bcab0cce1b308 + sha256: 8067e73d6e4f82eae158cb86acdc2d1cf18dd7f13807f0b93e13a07ee4c04b79 + category: main + optional: false +- name: libwebp-base + version: 1.3.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda + hash: + md5: 30de3fd9b3b602f7473f30e684eeea8c + sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0 + category: main + optional: false +- name: libzlib + version: 1.2.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + hash: + md5: f36c115f1ee199da648e0597ec2047ad + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + category: main + optional: false +- name: lz4-c + version: 1.9.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + hash: + md5: 318b08df404f9c9be5712aaa5a6f0bb0 + sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f + category: main + optional: false +- name: metis + version: 5.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda + hash: + md5: 40ccb8318df2500f83bd868dd8fcd201 + sha256: 446bf794497284e2ffa28ab9191d70c38d372c51e3fd073f0d8b35efb51e7e02 + category: main + optional: false +- name: mpg123 + version: 1.32.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.3-h59595ed_0.conda + hash: + md5: bdadff838d5437aea83607ced8b37f75 + sha256: f02b8ed16b3a488938b5f9453d19ea315ce6ed0d46cc389ecfaa28f2a4c3cb16 + category: main + optional: false +- name: ncurses + version: '6.4' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda + hash: + md5: 681105bccc2a3f7f1a837d47d39c9179 + sha256: ccf61e61d58a8a7b2d66822d5568e2dc9387883dd9b2da61e1d787ece4c4979a + category: main + optional: false +- name: nettle + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.8.1-hc379101_1.tar.bz2 + hash: + md5: 3cb2c7df59990bd37c2ce27fd906de68 + sha256: 49c569a69608eee784e815179a70c6ae4d088dac42b7df999044f68058d593bb + category: main + optional: false +- name: nspr + version: '4.35' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda + hash: + md5: da0ec11a6454ae19bff5b02ed881a2b1 + sha256: 8fadeebb2b7369a4f3b2c039a980d419f65c7b18267ba0c62588f9f894396d0c + category: main + optional: false +- name: openh264 + version: 2.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.3.1-hcb278e6_2.conda + hash: + md5: 37d01894f256b2a6921c5a218f42f8a2 + sha256: 3be6de15d40f02c9bb34d5095c65b6b3f07e04fc21a0fb63d1885f1a31de5ae2 + category: main + optional: false +- name: openssl + version: 3.1.3 + manager: conda + platform: linux-64 + dependencies: + ca-certificates: '' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda + hash: + md5: 7bb88ce04c8deb9f7d763ae04a1da72f + sha256: f4e35f506c7e8ab7dfdc47255b0d5aa8ce0c99028ae0affafd274333042c4f70 + category: main + optional: false +- name: pixman + version: 0.42.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.42.2-h59595ed_0.conda + hash: + md5: 700edd63ccd5fc66b70b1c028cea9a68 + sha256: ae917851474eb3b08812b02c9e945d040808523ec53f828aa74a90b0cdf15f57 + category: main + optional: false +- name: pkg-config + version: 0.29.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2 + hash: + md5: fbef41ff6a4c8140c30057466a1cdd47 + sha256: 8b35a077ceccdf6888f1e82bd3ea281175014aefdc2d4cf63d7a4c7e169c125c + category: main + optional: false +- name: pthread-stubs + version: '0.4' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 + hash: + md5: 22dad4df6e8630e8dff2428f6f6a7036 + sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff + category: main + optional: false +- name: pugixml + version: '1.13' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.13-h59595ed_1.conda + hash: + md5: a7c81a1cf43fe01da4954c9a3001396a + sha256: 3390defa1f68cc0adcbd35d05c679d3b9955fa0d9334774c1012e771046d9d7a + category: main + optional: false +- name: rapidjson + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.3.0' + libstdcxx-ng: '>=7.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/rapidjson-1.1.0-he1b5a44_1002.tar.bz2 + hash: + md5: 37d4fdbb92d573c7d6ab6de74a666dc4 + sha256: 73b74a21dcaafc4a9f43e7f4295ead29d0f3ef13790bad69351942b77294aad8 + category: main + optional: false +- name: snappy + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda + hash: + md5: e6d228cd0bb74a51dd18f5bfce0b4115 + sha256: 02219f2382b4fe39250627dade087a4412d811936a5a445636b7260477164eac + category: main + optional: false +- name: svt-av1 + version: 1.7.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.7.0-h59595ed_0.conda + hash: + md5: b6e0b4f1edc2740d1cf87669195c39d4 + sha256: e79878bba3b013db1b59766895a182dd12d2e1a45e24c01b61b4e922ed8500b6 + category: main + optional: false +- name: x264 + version: 1!164.3095 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 + hash: + md5: 6c99772d483f566d59e25037fea2c4b1 + sha256: 175315eb3d6ea1f64a6ce470be00fa2ee59980108f246d3072ab8b977cb048a5 + category: main + optional: false +- name: x265 + version: '3.5' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + libstdcxx-ng: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 + hash: + md5: e7f6ed84d4623d52ee581325c1587a6b + sha256: 76c7405bcf2af639971150f342550484efac18219c0203c5ee2e38b8956fe2a0 + category: main + optional: false +- name: xorg-kbproto + version: 1.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + hash: + md5: 4b230e8381279d76131116660f5a241a + sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 + category: main + optional: false +- name: xorg-libice + version: 1.1.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda + hash: + md5: b462a33c0be1421532f28bfe8f4a7514 + sha256: 5aa9b3682285bb2bf1a8adc064cb63aff76ef9178769740d855abb42b0d24236 + category: main + optional: false +- name: xorg-libxau + version: 1.0.11 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + hash: + md5: 2c80dc38fface310c9bd81b17037fee5 + sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 + category: main + optional: false +- name: xorg-libxdmcp + version: 1.1.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + hash: + md5: be93aabceefa2fac576e971aef407908 + sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + category: main + optional: false +- name: xorg-renderproto + version: 0.11.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 + hash: + md5: 06feff3d2634e3097ce2fe681474b534 + sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 + category: main + optional: false +- name: xorg-xextproto + version: 7.3.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda + hash: + md5: bce9f945da8ad2ae9b1d7165a64d0f87 + sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 + category: main + optional: false +- name: xorg-xf86vidmodeproto + version: 2.3.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 + hash: + md5: 3ceea9668625c18f19530de98b15d5b0 + sha256: 43398aeacad5b8753b7a1c12cb6bca36124e0c842330372635879c350c430791 + category: main + optional: false +- name: xorg-xproto + version: 7.0.31 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 + hash: + md5: b4a4381d54784606820704f7b5f05a15 + sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d + category: main + optional: false +- name: xz + version: 5.2.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + hash: + md5: 2161070d867d1b1204ea749c8eec4ef0 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + category: main + optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + hash: + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + category: main + optional: false +- name: zfp + version: 0.5.5 + manager: conda + platform: linux-64 + dependencies: + _openmp_mutex: '>=4.5' + libgcc-ng: '>=9.4.0' + libstdcxx-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/zfp-0.5.5-h9c3ff4c_8.tar.bz2 + hash: + md5: f12900b1e1e0527c0e9a4e922a5de2bf + sha256: 22f90931ae2d6f084107cd5a5cac5d065df7d23150356ffc56eba50260562174 + category: main + optional: false +- name: expat + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + libexpat: 2.5.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda + hash: + md5: 8b9b5aca60558d02ddaa09d599e55920 + sha256: 36dfeb4375059b3bba75ce9b38c29c69fd257342a79e6cf20e9f25c1523f785f + category: main + optional: false +- name: gcc_impl_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: + binutils_impl_linux-64: '>=2.39' + libgcc-devel_linux-64: 12.3.0 + libgcc-ng: '>=12.3.0' + libgomp: '>=12.3.0' + libsanitizer: 12.3.0 + libstdcxx-ng: '>=12.3.0' + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.3.0-he2b93b0_2.conda + hash: + md5: 2f4d8677dc7dd87f93e9abfb2ce86808 + sha256: 62a897343229e6dc4a3ace4f419a30e60a0a22ce7d0eac0b9bfb8f0308cf3de5 + category: main + optional: false +- name: hdf4 + version: 4.2.15 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda + hash: + md5: c3e9338e15d90106f467377017352b97 + sha256: 8ad0e739f106e2937e36a2177d012165bc2173fac0f0b941c5796d85f854f9be + category: main + optional: false +- name: imath + version: 3.1.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.9-hfc55251_0.conda + hash: + md5: 73f8b3aecf00f4a7eee44faed06164b3 + sha256: 81b28259a6020fea4ea97ff5997abadc38aae8b7f6f8afdaad17925d31a5f518 + category: main + optional: false +- name: libbrotlidec + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libbrotlicommon: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda + hash: + md5: f07002e225d7a60a694d42a7bf5ff53f + sha256: 86fc861246fbe5ad85c1b6b3882aaffc89590a48b42d794d3d5c8e6d99e5f926 + category: main + optional: false +- name: libbrotlienc + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libbrotlicommon: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda + hash: + md5: 5fc11c6020d421960607d821310fcd4d + sha256: f751b8b1c4754a2a8dfdc3b4040fa7818f35bbf6b10e905a47d3a194b746b071 + category: main + optional: false +- name: libcap + version: '2.69' + manager: conda + platform: linux-64 + dependencies: + attr: '>=2.5.1,<2.6.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + hash: + md5: 25cb5999faa414e5ccb2c1388f62d3d5 + sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c + category: main + optional: false +- name: libdrm + version: 2.4.114 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libpciaccess: '>=0.17,<0.18.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2 + hash: + md5: efb58e80f5d0179a783c4e76c3df3b9c + sha256: 9316075084ad66f9f96d31836e83303a8199eec93c12d68661e41c44eed101e3 + category: main + optional: false +- name: libedit + version: 3.1.20191231 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + ncurses: '>=6.2,<7.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + hash: + md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf + category: main + optional: false +- name: libevent + version: 2.1.12 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + hash: + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + category: main + optional: false +- name: libflac + version: 1.4.3 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + hash: + md5: ee48bf17cc83a00f59ca1494d5646869 + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + category: main + optional: false +- name: libgfortran-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda + hash: + md5: e75a75a6eaf6f318dae2631158c46575 + sha256: 767d71999e5386210fe2acaf1b67073e7943c2af538efa85c101e3401e94ff62 + category: main + optional: false +- name: libgpg-error + version: '1.47' + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda + hash: + md5: c2097d0b46367996f09b4e8e4920384a + sha256: 0306b3c2d65863048983a50bd8b86f6f26e457ef55d1da745a5796af25093f5a + category: main + optional: false +- name: libidn2 + version: 2.3.4 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libgcc-ng: '>=12' + libunistring: '>=0,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.4-h166bdaf_0.tar.bz2 + hash: + md5: 7440fbafd870b8bab68f83a064875d34 + sha256: 888848ae85be9df86f56407639c63bdce8e7651f0b2517be9bc0ac6e38b2d21d + category: main + optional: false +- name: libnghttp2 + version: 1.52.0 + manager: conda + platform: linux-64 + dependencies: + c-ares: '>=1.18.1,<2.0a0' + libev: '>=4.33,<4.34.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.0.8,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda + hash: + md5: 613955a50485812985c059e7b269f42e + sha256: ecd6b08c2b5abe7d1586428c4dd257dcfa00ee53700d79cdc8bca098fdfbd79a + category: main + optional: false +- name: libpng + version: 1.6.39 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda + hash: + md5: e1c890aebdebbfbf87e2c917187b4416 + sha256: a32b36d34e4f2490b99bddbc77d01a674d304f667f0e62c89e02c961addef462 + category: main + optional: false +- name: libsqlite + version: 3.43.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.2-h2797004_0.conda + hash: + md5: 4b441a1ee22397d5a27dc1126b849edd + sha256: b30279b67fce2382a93c638625ff2b284324e2347e30bd0acab813d89289c18a + category: main + optional: false +- name: libssh2 + version: 1.11.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + hash: + md5: 1f5a58e686b13bcfde88b93f547d23fe + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + category: main + optional: false +- name: libvorbis + version: 1.3.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + libogg: '>=1.3.4,<1.4.0a0' + libstdcxx-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + hash: + md5: 309dec04b70a3cc0f1e84a4013683bc0 + sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 + category: main + optional: false +- name: libxcb + version: '1.15' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + pthread-stubs: '' + xorg-libxau: '' + xorg-libxdmcp: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda + hash: + md5: 33277193f5b92bad9fdd230eb700929c + sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485 + category: main + optional: false +- name: libxml2 + version: 2.11.5 + manager: conda + platform: linux-64 + dependencies: + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda + hash: + md5: f3858448893839820d4bcfb14ad3ecdf + sha256: 1b3cb6864de1a558ea5fb144c780121d52507837d15df0600491d8ed92cff90c + category: main + optional: false +- name: libzip + version: 1.10.1 + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda + hash: + md5: ac79812548e7e8cf61f7b0abdef01d3b + sha256: 84e93f189072dcfcbe77744f19c7e4171523fbecfaba7352e5a23bbe014574c7 + category: main + optional: false +- name: mpfr + version: 4.2.1 + manager: conda + platform: linux-64 + dependencies: + gmp: '>=6.2.1,<7.0a0' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda + hash: + md5: 4c28f3210b30250037a4a627eeee9e0f + sha256: 008230a53ff15cf61966476b44f7ba2c779826825b9ca639a0a2b44d8f7aa6cb + category: main + optional: false +- name: mysql-common + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.1.3,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_5.conda + hash: + md5: 1e8ef4090ca4f0d66404a7441e1dbf3c + sha256: 1b5114244f28e416d42e9ac0c61dfdabdfd7255b9fe752a07ca157a3e3893d2a + category: main + optional: false +- name: p11-kit + version: 0.24.1 + manager: conda + platform: linux-64 + dependencies: + libffi: '>=3.4.2,<3.5.0a0' + libgcc-ng: '>=12' + libtasn1: '>=4.18.0,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2 + hash: + md5: 56ee94e34b71742bbdfa832c974e47a8 + sha256: aa8d3887b36557ad0c839e4876c0496e0d670afe843bf5bba4a87764b868196d + category: main + optional: false +- name: pcre2 + version: '10.40' + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libgcc-ng: '>=12' + libzlib: '>=1.2.12,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2 + hash: + md5: 69e2c796349cd9b273890bee0febfe1b + sha256: 7a29ec847556eed4faa1646010baae371ced69059a4ade43851367a076d6108a + category: main + optional: false +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + ncurses: '>=6.3,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + hash: + md5: 47d31b792659ce70f470b5c82fdfb7a4 + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + category: main + optional: false +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-h2797004_0.conda + hash: + md5: 513336054f884f95d9fd925748f41ef3 + sha256: 679e944eb93fde45d0963a22598fafacbb429bb9e7ee26009ba81c4e0c435055 + category: main + optional: false +- name: xorg-fixesproto + version: '5.0' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + xorg-xextproto: '' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2 + hash: + md5: 65ad6e1eb4aed2b0611855aff05e04f6 + sha256: 5d2af1b40f82128221bace9466565eca87c97726bb80bbfcd03871813f3e1876 + category: main + optional: false +- name: xorg-libsm + version: 1.2.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libuuid: '>=2.38.1,<3.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda + hash: + md5: 93ee23f12bc2e684548181256edd2cf6 + sha256: 089ad5f0453c604e18985480218a84b27009e9e6de9a0fa5f4a20b8778ede1f1 + category: main + optional: false +- name: zeromq + version: 4.3.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libsodium: '>=1.0.18,<1.0.19.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_0.conda + hash: + md5: 8851084c192dbc56215ac4e3c9aa30fa + sha256: 53bf2a18224406e9806adb3b270a2c8a028aca0c89bd40114a85d6446f5c98d1 + category: main + optional: false +- name: zlib + version: 1.2.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: 1.2.13 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + hash: + md5: 68c34ec6149623be41a1933ab996a209 + sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b + category: main + optional: false +- name: zstd + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + hash: + md5: 04b88013080254850d6c01ed54810589 + sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 + category: main + optional: false +- name: blosc + version: 1.21.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + snappy: '>=1.1.10,<2.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda + hash: + md5: 009521b7ed97cca25f8f997f9e745976 + sha256: e2b15b017775d1bda8edbb1bc48e545e45364edefa4d926732fc5488cc600731 + category: main + optional: false +- name: brotli-bin + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libbrotlidec: 1.1.0 + libbrotlienc: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda + hash: + md5: 39f910d205726805a958da408ca194ba + sha256: a641abfbaec54f454c8434061fffa7fdaa9c695e8a5a400ed96b4f07c0c00677 + category: main + optional: false +- name: freetype + version: 2.12.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + hash: + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + category: main + optional: false +- name: gcc_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: + binutils_linux-64: '2.40' + gcc_impl_linux-64: 12.3.0.* + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-12.3.0-h76fc315_2.conda + hash: + md5: 11517e7b5c910c5b5d6985c0c7eb7f50 + sha256: 86f6db7399ec0362e4c4025939debbfebc8ad9ccef75e3c0e4069f85b149f24d + category: main + optional: false +- name: gl2ps + version: 1.4.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + libpng: '>=1.6.37,<1.7.0a0' + zlib: '>=1.2.11,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2 + hash: + md5: 438718bf8921ac70956d919d0e2cc487 + sha256: feaf757731cfb8231d8a6c5b3446bbc428aa1cca126f09628ccafaa98a80f022 + category: main + optional: false +- name: gnutls + version: 3.7.8 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libidn2: '>=2,<3.0a0' + libstdcxx-ng: '>=12' + libtasn1: '>=4.19.0,<5.0a0' + nettle: '>=3.8.1,<3.9.0a0' + p11-kit: '>=0.24.1,<0.25.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.8-hf3e180e_0.tar.bz2 + hash: + md5: cbe8e27140d67c3f30e01cfb642a6e7c + sha256: 4a47e4558395b98fff4c1c44ad358dade62b350a03b5a784d4bc589d6eb7ac9e + category: main + optional: false +- name: gxx_impl_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: + gcc_impl_linux-64: 12.3.0 + libstdcxx-devel_linux-64: 12.3.0 + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.3.0-he2b93b0_2.conda + hash: + md5: f89b9916afc36fc5562fbfc11330a8a2 + sha256: 1ca91c1a3892b61da7efe150f9a1830e18aac82f563b27bf707520cb3297cc7a + category: main + optional: false +- name: krb5 + version: 1.21.2 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + hash: + md5: cd95826dbd331ed1be26bdf401432844 + sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 + category: main + optional: false +- name: libboost + version: 1.82.0 + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.82.0-h6fcfa73_6.conda + hash: + md5: 05c40141d4184953616797d5c3d7947f + sha256: c820f1ca7a2844fc5589bb101cc33188e06205ccb022051e13a6398def22e8bf + category: main + optional: false +- name: libgcrypt + version: 1.10.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + libgpg-error: '>=1.44,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.1-h166bdaf_0.tar.bz2 + hash: + md5: f967fc95089cd247ceed56eda31de3a9 + sha256: 8fd7e6db1021cd9298d9896233454de204116840eb66a06fcb712e1015ff132a + category: main + optional: false +- name: libglib + version: 2.78.0 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + pcre2: '>=10.40,<10.41.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.0-hebfc3b9_0.conda + hash: + md5: e618003da3547216310088478e475945 + sha256: 96ec4dc5e38f434aa5862cb46d74923cce1445de3cd0b9d61e3e63102b163af6 + category: main + optional: false +- name: libhwloc + version: 2.9.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxml2: '>=2.11.5,<2.12.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda + hash: + md5: f36ddc11ca46958197a45effdd286e45 + sha256: 6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b + category: main + optional: false +- name: libllvm15 + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxml2: '>=2.11.4,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zstd: '>=1.5.2,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-h5cf9203_3.conda + hash: + md5: 9efe82d44b76a7529a1d702e5a37752e + sha256: bb94e7535a309c2a8d58585cb82bac954ed59f473eef2cac6ea677d6f576a3b6 + category: main + optional: false +- name: libopenblas + version: 0.3.24 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda + hash: + md5: 6e4ef6ca28655124dcde9bd500e44c32 + sha256: c8e080ae4d57506238023e98869928ae93564e6407ef5b0c4d3a337e8c2b7662 + category: main + optional: false +- name: libsndfile + version: 1.2.2 + manager: conda + platform: linux-64 + dependencies: + lame: '>=3.100,<3.101.0a0' + libflac: '>=1.4.3,<1.5.0a0' + libgcc-ng: '>=12' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + mpg123: '>=1.32.1,<1.33.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + hash: + md5: ef1910918dd895516a769ed36b5b3a4e + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + category: main + optional: false +- name: libtheora + version: 1.1.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + libogg: '>=1.3.4,<1.4.0a0' + libpng: '>=1.6.37,<1.7.0a0' + libvorbis: '>=1.3.7,<1.4.0a0' + zlib: '>=1.2.11,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2 + hash: + md5: 1a7c35f56343b7e9e8db20b296c7566c + sha256: 048ce34ba5b143f099cca3d388dfc41acf24d634dd00c5b1c463fb81bf804070 + category: main + optional: false +- name: libtiff + version: 4.6.0 + manager: conda + platform: linux-64 + dependencies: + lerc: '>=4.0.0,<5.0a0' + libdeflate: '>=1.19,<1.20.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libstdcxx-ng: '>=12' + libwebp-base: '>=1.3.2,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda + hash: + md5: 4e9afd30f4ccb2f98645e51005f82236 + sha256: 16f70e3170b9acb5b5a9e7fe60fd9b1104c946e165a48882ebf38ecb7978e980 + category: main + optional: false +- name: mysql-libs + version: 8.0.33 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-common: 8.0.33 + openssl: '>=3.1.3,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_5.conda + hash: + md5: b72f016c910ff9295b1377d3e17da3f2 + sha256: 90a5c105e35990cac53f45366c256d88f4c8f66a360afd37dcae1357e370ade6 + category: main + optional: false +- name: nss + version: '3.94' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libsqlite: '>=3.43.0,<4.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + nspr: '>=4.35,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.94-h1d7d5a4_0.conda + hash: + md5: 7caef74bbfa730e014b20f0852068509 + sha256: c9b7910fc554c6550905b9150f4c8230e973ca63f41b42f2c18a49e8aa458e78 + category: main + optional: false +- name: openexr + version: 3.2.1 + manager: conda + platform: linux-64 + dependencies: + imath: '>=3.1.9,<3.1.10.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.2.1-h3f0fd8d_0.conda + hash: + md5: 76df8e97c9d28062f4ea8a356bda1232 + sha256: fedd59f40d5d620844f1691a7e24f8ea23c453f98717b8f8b61e71fdd8b7c354 + category: main + optional: false +- name: openmpi + version: 4.1.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + mpi: '1.0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/linux-64/openmpi-4.1.6-hc5af2df_101.conda + hash: + md5: f9a2ad0088ee38f396350515fa37d243 + sha256: f0769dd891e1735be4606ec8643951e5cbca199f774e58c7d933f70a70134ce4 + category: main + optional: false +- name: python + version: 3.10.12 + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libnsl: '>=2.0.0,<2.1.0a0' + libsqlite: '>=3.42.0,<4.0a0' + libuuid: '>=2.38.1,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.1.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.12,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda + hash: + md5: eb6f1df105f37daedd6dca78523baa75 + sha256: 05e2a7ce916d259f11979634f770f31027d0a5d18463b094e64a30500f900699 + category: main + optional: false +- name: scotch + version: 6.0.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + libzlib: '>=1.2.11,<1.3.0a0' + zlib: '>=1.2.11,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/scotch-6.0.9-hb2e6521_2.tar.bz2 + hash: + md5: 20eb1f0c247d10da95b1da761e7f4c10 + sha256: 88be3ee9b49716657d8429fbb9b6ce4eb65efd79b7e660636775a858cb077921 + category: main + optional: false +- name: sqlite + version: 3.43.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libsqlite: 3.43.2 + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + readline: '>=8.2,<9.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.2-h2c6b66d_0.conda + hash: + md5: c37b95bcd6c6833dacfd5df0ae2f4303 + sha256: f49389e9cce5bdc451d1c5b56972cf5f75b1ba00350d35ab099848e65b32e94f + category: main + optional: false +- name: xcb-util + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda + hash: + md5: 9bfac7ccd94d54fd21a0501296d60424 + sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad + category: main + optional: false +- name: xcb-util-keysyms + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda + hash: + md5: 632413adcd8bc16b515cab87a2932913 + sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a + category: main + optional: false +- name: xcb-util-renderutil + version: 0.3.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda + hash: + md5: e995b155d938b6779da6ace6c6b13816 + sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 + category: main + optional: false +- name: xcb-util-wm + version: 0.4.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda + hash: + md5: 90108a432fb5c6150ccfee3f03388656 + sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 + category: main + optional: false +- name: xorg-libx11 + version: 1.8.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + xorg-kbproto: '' + xorg-xextproto: '>=7.3.0,<8.0a0' + xorg-xproto: '' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + hash: + md5: 49e482d882669206653b095f5206c05b + sha256: 7a02a7beac472ae2759498550b5fc5261bf5be7a9a2b4648a3f67818a7bfefcf + category: main + optional: false +- name: alabaster + version: 0.7.13 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda + hash: + md5: 06006184e203b61d3525f90de394471e + sha256: b2d160a050996950434c6e87a174fc01c4a937cbeffbdd20d1b46126b4478a95 + category: main + optional: false +- name: attrs + version: 23.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda + hash: + md5: 3edfead7cedd1ab4400a6c588f3e75f8 + sha256: 063639cd568f5c7a557b0fb1cc27f098598c0d8ff869088bfeb82934674f8821 + category: main + optional: false +- name: brotli + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + brotli-bin: 1.1.0 + libbrotlidec: 1.1.0 + libbrotlienc: 1.1.0 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda + hash: + md5: f27a24d46e3ea7b70a1f98e50c62508f + sha256: f2d918d351edd06c55a6c2d84b488fe392f85ea018ff227daac07db22b408f6b + category: main + optional: false +- name: brotli-python + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda + hash: + md5: 1f95722c94f00b69af69a066c7433714 + sha256: e22268d81905338570786921b3def88e55f9ed6d0ccdd17d9fbae31a02fbef69 + category: main + optional: false +- name: cached_property + version: 1.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + hash: + md5: 576d629e47797577ab0f1b351297ef4a + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + category: main + optional: false +- name: certifi + version: 2023.7.22 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + hash: + md5: 7f3dbc9179b4dde7da98dfb151d0ad22 + sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + category: main + optional: false +- name: charset-normalizer + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: 985378f74689fccce52f158027bd9acd + sha256: a31739c49c4b1c8e0cbdec965ba152683d36ce6e23bdaefcfee99937524dabd1 + category: main + optional: false +- name: click + version: 8.1.7 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + hash: + md5: f3ad426304898027fc619827ff428eca + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + category: main + optional: false +- name: cycler + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 5cd86562580f274031ede6aa6aa24441 + sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 + category: main + optional: false +- name: dbus + version: 1.13.6 + manager: conda + platform: linux-64 + dependencies: + expat: '>=2.4.2,<3.0a0' + libgcc-ng: '>=9.4.0' + libglib: '>=2.70.2,<3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + hash: + md5: ecfff944ba3960ecb334b9a2663d708d + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + category: main + optional: false +- name: docutils + version: 0.18.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.18.1-py310hff52083_1.tar.bz2 + hash: + md5: 6405f87c427cdbc25b6b6a21bd6bfc2a + sha256: 2071bf7c56305d234161bef00c0c2ba7ae345484105d2ccc448c7c734634f346 + category: main + optional: false +- name: exceptiongroup + version: 1.1.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda + hash: + md5: e6518222753f519e911e83136d2158d9 + sha256: c28f715e049fe0f09785660bcbffa175ffb438720e5bc5a60d56d4b08364b315 + category: main + optional: false +- name: fftw + version: 3.3.10 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=11.4.0' + libstdcxx-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-mpi_openmpi_h4a81ba8_8.conda + hash: + md5: 278a83d849ad75d6844621b225939b11 + sha256: 1b23330f61b9bfec33bc4513842586f898e70dee46f60ccd1e3d5b0874e96f6f + category: main + optional: false +- name: fontconfig + version: 2.14.2 + manager: conda + platform: linux-64 + dependencies: + expat: '>=2.5.0,<3.0a0' + freetype: '>=2.12.1,<3.0a0' + libgcc-ng: '>=12' + libuuid: '>=2.32.1,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda + hash: + md5: 0f69b688f52ff6da70bccb7ff7001d1d + sha256: 155d534c9037347ea7439a2c6da7c24ffec8e5dd278889b4c57274a1d91e0a83 + category: main + optional: false +- name: frozenlist + version: 1.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.0-py310h2372a71_1.conda + hash: + md5: c7b2865e86782925a872c8598b760c08 + sha256: cd1e59ceac047d9f692bb7cc2a6a6e2356a7d3db660b076b4afb19d35db2fd02 + category: main + optional: false +- name: glib-tools + version: 2.78.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libglib: 2.78.0 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.0-hfc55251_0.conda + hash: + md5: e10134de3558dd95abda6987b5548f4f + sha256: 991803ca90e6ba54568ff1bcb8a02f69a9beb8a09988d257fc21e1bbb3557d8c + category: main + optional: false +- name: gxx_linux-64 + version: 12.3.0 + manager: conda + platform: linux-64 + dependencies: + binutils_linux-64: '2.40' + gcc_linux-64: 12.3.0 + gxx_impl_linux-64: 12.3.0.* + sysroot_linux-64: '' + url: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-12.3.0-h8a814eb_2.conda + hash: + md5: f517b1525e9783849bd56a5dc45a9960 + sha256: 9878771cf1316230150a795d213a2f1dd7dead07dc0bccafae20533d631d5e69 + category: main + optional: false +- name: idna + version: '3.4' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 34272b248891bddccc64479f9a7fffed + sha256: 9887c35c374ec1847f167292d3fde023cb4c994a4ceeec283072b95440131f09 + category: main + optional: false +- name: imagesize + version: 1.4.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.4' + url: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 7de5386c8fea29e76b303f37dde4c352 + sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 + category: main + optional: false +- name: iniconfig + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + hash: + md5: f800d2da156d08e289b14e87e43c1ae5 + sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 + category: main + optional: false +- name: kahip + version: '3.15' + manager: conda + platform: linux-64 + dependencies: + _openmp_mutex: '>=4.5' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + metis: '>=5.1.0,<5.1.1.0a0' + openmpi: '>=4.1.5,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/kahip-3.15-h8d85730_2.conda + hash: + md5: e619a53db9fb5a295df08c3fde41b18d + sha256: cb3bfd03b616ff1f32b30bc44a013e5686ea0e8d0201107a84e79151968f93c4 + category: main + optional: false +- name: kiwisolver + version: 1.4.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda + hash: + md5: b8d67603d43b23ce7e988a5d81a7ab79 + sha256: bb51906639bced3de1d4d7740ac284cdaa89e2f22e0b1ec796378b090b0648ba + category: main + optional: false +- name: lcms2 + version: '2.15' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda + hash: + md5: 9ab79924a3760f85a799f21bc99bd655 + sha256: 9125833b3019bf29c4a20295665e7bc912de581086a53693f10709fae409a3b2 + category: main + optional: false +- name: libblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libopenblas: '>=0.3.24,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda + hash: + md5: 420f4e9be59d0dc9133a0f43f7bab3f3 + sha256: b1311b9414559c5760b08a32e0382ca27fa302c967968aa6f78e042519f728ce + category: main + optional: false +- name: libboost-devel + version: 1.82.0 + manager: conda + platform: linux-64 + dependencies: + libboost: 1.82.0 + libboost-headers: 1.82.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.82.0-h00ab1b0_6.conda + hash: + md5: 66fcac2ce711bea87d3aefd64cd03e9e + sha256: 3505d971488558513f1c0a673cb5d9a5f24c19753a06d68d29a355092804b9a2 + category: main + optional: false +- name: libclang13 + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h9986a30_3.conda + hash: + md5: 1720df000b48e31842500323cb7be18c + sha256: df1221a9a05b9bb3bd9b43c08a7e2fe57a0e15a0010ef26065f7ed7666083f45 + category: main + optional: false +- name: libcups + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.1,<1.22.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + hash: + md5: d4529f4dff3057982a7617c7ac58fde3 + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + category: main + optional: false +- name: libcurl + version: 8.4.0 + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + libgcc-ng: '>=12' + libnghttp2: '>=1.52.0,<2.0a0' + libssh2: '>=1.11.0,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.3,<4.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda + hash: + md5: 1158ac1d2613b28685644931f11ee807 + sha256: 25f4b6a8827d7b17a66e0bd9b5d194bf9a9e4a46fb14e2ef472fdad4b39426a6 + category: main + optional: false +- name: libpq + version: '15.4' + manager: conda + platform: linux-64 + dependencies: + krb5: '>=1.21.2,<1.22.0a0' + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.3,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-15.4-hfc447b1_2.conda + hash: + md5: 4a180ab68881a86be49858c9baf4581d + sha256: f537ad28c083585e7c40e8a05f6febad8b9e649a48a1f2f497add3fc0947800b + category: main + optional: false +- name: libsystemd0 + version: '254' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libcap: '>=2.69,<2.70.0a0' + libgcc-ng: '>=12' + libgcrypt: '>=1.10.1,<2.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-254-h3516f8a_0.conda + hash: + md5: df4b1cd0c91b4234fb02b5701a4cdddc + sha256: e4732b9bc6acbdd3308cd0abd0860c9ea44e37127cd78acb797c996c20e4f42f + category: main + optional: false +- name: loguru + version: 0.7.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py310hff52083_1.conda + hash: + md5: 157e6221a079a60c7f6f6fcb87c722aa + sha256: 35319fe904289949e78af080ac05907bb545ecad64bd2eaea95efb8526069ee5 + category: main + optional: false +- name: markupsafe + version: 2.1.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda + hash: + md5: b74e07a054c479e45a83a83fc5be713c + sha256: ac46cc2f6d4bbeedcd2f508e43f43143a9286ced55730d8d97a3c91ceceb0d56 + category: main + optional: false +- name: mdurl + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f8dab71fdc13b1bf29a01248b156d268 + sha256: c678b9194e025b1fb665bec30ee20aab93399203583875b1dcc0a3b52a8f5523 + category: main + optional: false +- name: mpi4py + version: 3.1.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.4-py310h2a790f2_1.conda + hash: + md5: 406ba065000549070682abfae8011248 + sha256: 516cbab850c2a0c894cf9f267e908d5771eb3636b2262d6b7353e24ecb344fa5 + category: main + optional: false +- name: multidict + version: 6.0.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.4-py310h2372a71_1.conda + hash: + md5: 7ca797f0a0c390ede770f415f5d5e039 + sha256: d8180dcee801bcde6408d924bab0010fc956ae7a14681694af21f9d4382d8ee8 + category: main + optional: false +- name: munkres + version: 1.1.4 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 2ba8498c1018c1e9c61eb99b973dfe19 + sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 + category: main + optional: false +- name: mypy_extensions + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + hash: + md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 + category: main + optional: false +- name: openjpeg + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libtiff: '>=4.6.0,<4.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda + hash: + md5: 128c25b7fe6a25286a48f3a6a9b5b6f3 + sha256: 9fe91b67289267de68fda485975bb48f0605ac503414dc663b50d8b5f29bc82a + category: main + optional: false +- name: packaging + version: '23.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda + hash: + md5: 79002079284aa895f883c6b7f3f88fd6 + sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f + category: main + optional: false +- name: parmetis + version: 4.0.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + libstdcxx-ng: '>=9.3.0' + openmpi: '>=4.1,<4.2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/parmetis-4.0.3-he9a3056_1005.tar.bz2 + hash: + md5: 160999f9228e8aac87dc170f0810bc74 + sha256: 20a46cebbec3c50cd0e33372112f962b69bba1082436fc095c90f65aadd43ffd + category: main + optional: false +- name: pathspec + version: 0.11.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda + hash: + md5: e41debb259e68490e3ab81e46b639ab6 + sha256: 7bcfa6d86359d45572ba9ccaeaedc04b0452e2654fe44b6fe378d0d37b8745e1 + category: main + optional: false +- name: pkgutil-resolve-name + version: 1.3.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + hash: + md5: 405678b942f2481cecdb3e010f4925d9 + sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a + category: main + optional: false +- name: pluggy + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 2390bd10bed1f3fdc7a537fb5a447d8d + sha256: 7bf2ad9d747e71f1e93d0863c2c8061dd0f2fe1e582f28d292abfb40264a2eb5 + category: main + optional: false +- name: ply + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + hash: + md5: 7205635cd71531943440fbfe3b6b5727 + sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + category: main + optional: false +- name: ptscotch + version: 6.0.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=10.3.0' + libzlib: '>=1.2.11,<1.3.0a0' + openmpi: '>=4.1.2,<5.0a0' + scotch: '>=6.0.9,<6.0.10.0a0' + zlib: '>=1.2.11,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ptscotch-6.0.9-h0a9c416_2.tar.bz2 + hash: + md5: 4e5d899d1d4704c80b3051eb01490bb2 + sha256: c45c98ea3f3ee1648a801e13115c39005e2f9c378796edbf56c8cf2588ef2371 + category: main + optional: false +- name: pycparser + version: '2.21' + manager: conda + platform: linux-64 + dependencies: + python: 2.7.*|>=3.4 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + category: main + optional: false +- name: pygments + version: 2.16.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.16.1-pyhd8ed1ab_0.conda + hash: + md5: 40e5cb18165466773619e5c963f00a7b + sha256: 3f0f0fadc6084960ec8cc00a32a03529c562ffea3b527eb73b1653183daad389 + category: main + optional: false +- name: pyparsing + version: 3.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda + hash: + md5: 176f7d56f0cfe9008bdf1bccd7de02fb + sha256: 4a1332d634b6c2501a973655d68f08c9c42c0bd509c349239127b10572b8354b + category: main + optional: false +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + hash: + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + category: main + optional: false +- name: pytz + version: 2023.3.post1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda + hash: + md5: c93346b446cd08c169d843ae5fc0da97 + sha256: 6b680e63d69aaf087cd43ca765a23838723ef59b0a328799e6363eb13f52c49e + category: main + optional: false +- name: pyyaml + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda + hash: + md5: bb010e368de4940771368bc3dc4c63e7 + sha256: aa78ccddb0a75fa722f0f0eb3537c73ee1219c9dd46cea99d6b9eebfdd780f3d + category: main + optional: false +- name: rpds-py + version: 0.10.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.10.6-py310hcb5633a_0.conda + hash: + md5: 43c12d8f7891a87378eb5339c49ef051 + sha256: a23d2f15c48cc689d26dc3f50ee91be9ed2925c5fbae7bc5d93e49db7517b847 + category: main + optional: false +- name: setuptools + version: 68.2.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda + hash: + md5: fc2166155db840c634a1291a5c35a709 + sha256: 851901b1f8f2049edb36a675f0c3f9a98e1495ef4eb214761b048c6f696a06f7 + category: main + optional: false +- name: six + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: main + optional: false +- name: snowballstemmer + version: 2.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 4d22a9315e78c6827f806065957d566e + sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 + category: main + optional: false +- name: sphinxcontrib-jsmath + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + hash: + md5: da1d979339e2714c30a8e806a33ec087 + sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 + category: main + optional: false +- name: tbb + version: 2021.10.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libhwloc: '>=2.9.3,<2.9.4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.10.0-h00ab1b0_2.conda + hash: + md5: eb0d5c122f42714f86a7058d1ce7b2e6 + sha256: 79a6c48fa1df661af7ab3e4f5fa444dd305d87921be017413a8b97fd6d642328 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f832c45a477c78bebd107098db465095 + sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 + category: main + optional: false +- name: tomli + version: 2.0.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 5844808ffab9ebdb694585b50ba02a96 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + category: main + optional: false +- name: tornado + version: 6.3.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py310h2372a71_1.conda + hash: + md5: b23e0147fa5f7a9380e06334c7266ad5 + sha256: 209b6788b81739d3cdc2f04ad3f6f323efd85b1a30f2edce98ab76d98079fac8 + category: main + optional: false +- name: typing_extensions + version: 4.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.8.0-pyha770c72_0.conda + hash: + md5: 5b1be40a26d10a06f6d4f1f9e19fa0c7 + sha256: 38d16b5c53ec1af845d37d22e7bb0e6c934c7f19499123507c5a470f6f8b7dde + category: main + optional: false +- name: unicodedata2 + version: 15.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda + hash: + md5: 72637c58d36d9475fda24700c9796f19 + sha256: 5ab2f2d4542ba0cc27d222c08ae61706babe7173b0c6dfa748aa37ff2fa9d824 + category: main + optional: false +- name: wheel + version: 0.41.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda + hash: + md5: 1ccd092478b3e0ee10d7a891adbf8a4f + sha256: 21bcec5373b04d739ab65252b5532b04a08d229865ebb24b5b94902d6d0a77b0 + category: main + optional: false +- name: xcb-util-image + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda + hash: + md5: 9d7bcddf49cbf727730af10e71022c73 + sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 + category: main + optional: false +- name: xkeyboard-config + version: '2.40' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-libx11: '>=1.8.6,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.40-hd590300_0.conda + hash: + md5: 07c15d846a2e4d673da22cbd85fdb6d2 + sha256: a01fcb9c3346ee08aa24b3900a08896f2e8f80c891378a57d71764e16bbd6141 + category: main + optional: false +- name: xorg-libxext + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-libx11: '>=1.7.2,<2.0a0' + xorg-xextproto: '' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda + hash: + md5: 82b6df12252e6f32402b96dacc656fec + sha256: 73e5cfbdff41ef8a844441f884412aa5a585a0f0632ec901da035a03e1fe1249 + category: main + optional: false +- name: xorg-libxfixes + version: 5.0.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + xorg-fixesproto: '' + xorg-libx11: '>=1.7.0,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2 + hash: + md5: e9a21aa4d5e3e5f1aed71e8cefd46b6a + sha256: 1e426a1abb774ef1dcf741945ed5c42ad12ea2dc7aeed7682d293879c3e1e4c3 + category: main + optional: false +- name: xorg-libxrender + version: 0.9.11 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-renderproto: '' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda + hash: + md5: ed67c36f215b310412b2af935bf3e530 + sha256: 26da4d1911473c965c32ce2b4ff7572349719eaacb88a066db8d968a4132c3f7 + category: main + optional: false +- name: xorg-libxt + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + xorg-kbproto: '' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-xproto: '' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda + hash: + md5: ae92aab42726eb29d16488924f7312cb + sha256: e7648d1efe2e858c4bc63ccf4a637c841dc971b37ded85a01be97a5e240fecfa + category: main + optional: false +- name: zipp + version: 3.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: main + optional: false +- name: aiosignal + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + frozenlist: '>=1.1.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: d1e1eb7e21a9e2c74279d87dafb68156 + sha256: 575c742e14c86575986dc867463582a970463da50b77264cdf54df74f5563783 + category: main + optional: false +- name: babel + version: 2.13.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + pytz: '' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.13.0-pyhd8ed1ab_0.conda + hash: + md5: 22541af7a9eb59fc6afcadb7ecdf9219 + sha256: 25b0a72c9d35319307a9714b05aa5c18b5c82f8c8e7bece65778202c6b8ad2a7 + category: main + optional: false +- name: cached-property + version: 1.5.2 + manager: conda + platform: linux-64 + dependencies: + cached_property: '>=1.5.2,<1.5.3.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + hash: + md5: 9b347a7ec10940d3f7941ff6c460b551 + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + category: main + optional: false +- name: cairo + version: 1.18.0 + manager: conda + platform: linux-64 + dependencies: + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.0,<3.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + pixman: '>=0.42.2,<1.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda + hash: + md5: f907bb958910dc404647326ca80c263e + sha256: 142e2639a5bc0e99c44d76f4cc8dce9c6a2d87330c4beeabb128832cd871a86e + category: main + optional: false +- name: cffi + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + pycparser: '' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda + hash: + md5: 45846a970e71ac98fd327da5d40a0a2c + sha256: 007e7f69ab45553b7bf11f2c1b8d3f3a13fd42997266a0d57795f41c7d38df36 + category: main + optional: false +- name: coverage + version: 7.3.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py310h2372a71_0.conda + hash: + md5: 33c03cd5711885c920ddff676fb84f98 + sha256: f9c07ee8807188c39bd415dd8ce39ac7a90c41cb0cc741e9af429e1f886930c6 + category: main + optional: false +- name: fonttools + version: 4.43.1 + manager: conda + platform: linux-64 + dependencies: + brotli: '' + libgcc-ng: '>=12' + munkres: '' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + unicodedata2: '>=14.0.0' + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.43.1-py310h2372a71_0.conda + hash: + md5: c7d552c32b87beb736c9658441bf93a9 + sha256: 66f89ff0c0e6cd9940e866b04f5442b4ab802d5d279012c5eb13c639cf18da76 + category: main + optional: false +- name: glib + version: 2.78.0 + manager: conda + platform: linux-64 + dependencies: + gettext: '>=0.21.1,<1.0a0' + glib-tools: 2.78.0 + libgcc-ng: '>=12' + libglib: 2.78.0 + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + python: '*' + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.0-hfc55251_0.conda + hash: + md5: 2f55a36b549f51a7e0c2b1e3c3f0ccd4 + sha256: b7fd5ef9aee4205e14105dc9f79b3de326af091c0253e1e52d3e4ee0d960851d + category: main + optional: false +- name: hdf5 + version: 1.14.2 + manager: conda + platform: linux-64 + dependencies: + libaec: '>=1.0.6,<2.0a0' + libcurl: '>=8.2.1,<9.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openmpi: '>=4.1.5,<5.0a0' + openssl: '>=3.1.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-mpi_openmpi_h327c9cf_0.conda + hash: + md5: e69f4f8452059bf0eacd91422077c090 + sha256: 9bdba8976cb1904557403d083f6521a1014554275bae1f9f7a7e695fee02a52f + category: main + optional: false +- name: importlib-metadata + version: 6.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda + hash: + md5: 4e9f59a060c3be52bc4ddc46ee9b6946 + sha256: 2797ed927d65324309b6c630190d917b9f2111e0c217b721f80429aeb57f9fcf + category: main + optional: false +- name: importlib_resources + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 48b0d98e0c0ec810d3ccc2a0926c8c0e + sha256: adab6da633ec3b642f036ab5c1196c3e2db0e8db57fb0c7fc9a8e06e29fa9bdc + category: main + optional: false +- name: isort + version: 5.12.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8,<4.0' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/isort-5.12.0-pyhd8ed1ab_1.conda + hash: + md5: 07ed3421bad60867234c7a9282ea39d4 + sha256: d34a62e33ac7acc8fd3167ceb0e2aee4e7974b94de263f52d752716429d95bcb + category: main + optional: false +- name: jinja2 + version: 3.1.2 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2 + hash: + md5: c8490ed5c70966d232fdd389d0dbed37 + sha256: b045faba7130ab263db6a8fdc96b1a3de5fcf85c4a607c5f11a49e76851500b5 + category: main + optional: false +- name: kahip-python + version: '3.15' + manager: conda + platform: linux-64 + dependencies: + kahip: '3.15' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/kahip-python-3.15-py310h3448afa_2.conda + hash: + md5: a981124f70c638d74ae49ff4da2db830 + sha256: f1e9caeed46af06201f232bab19eeac14125ef5baef8cbba56f02c486153067e + category: main + optional: false +- name: libcblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda + hash: + md5: d12374af44575413fbbd4a217d46ea33 + sha256: 84fddccaf58f42b07af7fb42512bd617efcb072f17bdef27f4c1884dbd33c86a + category: main + optional: false +- name: libclang + version: 15.0.7 + manager: conda + platform: linux-64 + dependencies: + libclang13: 15.0.7 + libgcc-ng: '>=12' + libllvm15: '>=15.0.7,<15.1.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h7634d5b_3.conda + hash: + md5: 0922208521c0463e690bbaebba7eb551 + sha256: c2b0c8dd675e30d86bad410679f258820bc36723fbadffc13c2f60249be91815 + category: main + optional: false +- name: libglu + version: 9.0.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-xextproto: '>=7.3.0,<8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda + hash: + md5: 50c389a09b6b7babaef531eb7cb5e0ca + sha256: 8368435c41105dc3e1c02896a02ecaa21b77d0b0d67fc8b06a16ba885c86f917 + category: main + optional: false +- name: liblapack + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda + hash: + md5: 9f100edf65436e3eabc2a51fc00b2c37 + sha256: 58f402aae605ebd0932e1cbbf855cd49dcdfa2fcb6aab790a4f6068ec5937878 + category: main + optional: false +- name: libraw + version: 0.21.1 + manager: conda + platform: linux-64 + dependencies: + _openmp_mutex: '>=4.5' + lcms2: '>=2.15,<3.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.1-h501b40f_1.conda + hash: + md5: 7ec21ba0b5095601a90ff5e32359a265 + sha256: 5f7ef7aedfa1f0c2967bdcba1664279e0166851817ab96a969d7970548909a5f + category: main + optional: false +- name: libva + version: 2.20.0 + manager: conda + platform: linux-64 + dependencies: + libdrm: '>=2.4.114,<2.5.0a0' + libgcc-ng: '>=12' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxfixes: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda + hash: + md5: 933bcea637569c6cea6084957028cb53 + sha256: 972d6f67d854d0f0fc2593f8bddc8d411859437ace7248c374e1a85a9ea9d410 + category: main + optional: false +- name: libxkbcommon + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxml2: '>=2.11.5,<2.12.0a0' + xkeyboard-config: '' + xorg-libxau: '>=1.0.11,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-h5d7e998_0.conda + hash: + md5: d8edd0e29db6fb6b6988e1a28d35d994 + sha256: 6cd22602fe1517af411cfbf65babf1d6aad276100c2bce90d5e316214a602bbb + category: main + optional: false +- name: markdown-it-py + version: 3.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + hash: + md5: 93a8e71256479c62074356ef6ebf501b + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + category: main + optional: false +- name: pillow + version: 10.0.1 + manager: conda + platform: linux-64 + dependencies: + freetype: '>=2.12.1,<3.0a0' + lcms2: '>=2.15,<3.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + tk: '>=8.6.12,<8.7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py310h29da1c1_1.conda + hash: + md5: 8e93b1c69cddf89fd412178d3d418bae + sha256: 4c18593b1b90299e0f1f7a279ccce6dbe0aba694758ee039c0850e0119d3b3e8 + category: main + optional: false +- name: pint + version: '0.22' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '' + url: https://conda.anaconda.org/conda-forge/noarch/pint-0.22-pyhd8ed1ab_1.conda + hash: + md5: a719c3f3959c529e558e9ed9f98c3f30 + sha256: 49795ff6e5e634523aafe34e869c425e2cdc4a1fcb11aa294d7983035bc38622 + category: main + optional: false +- name: pip + version: 23.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + setuptools: '' + wheel: '' + url: https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda + hash: + md5: 2400c0b86889f43aa52067161e1fb108 + sha256: 435829a03e1c6009f013f29bb83de8b876c388820bf8cf69a7baeec25f6a3563 + category: main + optional: false +- name: proj + version: 9.3.0 + manager: conda + platform: linux-64 + dependencies: + libcurl: '>=8.4.0,<9.0a0' + libgcc-ng: '>=12' + libsqlite: '>=3.43.2,<4.0a0' + libstdcxx-ng: '>=12' + libtiff: '>=4.6.0,<4.7.0a0' + sqlite: '' + url: https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda + hash: + md5: b5e57a0c643da391bef850922963eece + sha256: 252f6c31101719e3d524679e69ae81e6323b93b143e1360169bf50e89386bf24 + category: main + optional: false +- name: pulseaudio-client + version: '16.1' + manager: conda + platform: linux-64 + dependencies: + dbus: '>=1.13.6,<2.0a0' + libgcc-ng: '>=12' + libglib: '>=2.76.4,<3.0a0' + libsndfile: '>=1.2.2,<1.3.0a0' + libsystemd0: '>=254' + url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda + hash: + md5: ac902ff3c1c6d750dd0dfc93a974ab74 + sha256: 9981c70893d95c8cac02e7edd1a9af87f2c8745b772d529f08b7f9dafbe98606 + category: main + optional: false +- name: pytest + version: 7.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + exceptiongroup: '>=1.0.0rc8' + iniconfig: '' + packaging: '' + pluggy: '>=0.12,<2.0' + python: '>=3.7' + tomli: '>=1.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.2-pyhd8ed1ab_0.conda + hash: + md5: 6dd662ff5ac9a783e5c940ce9f3fe649 + sha256: 150bfb2a86dffd4ce1e91c2d61dde5779fb3ee338675e210fec4ef508ffff28c + category: main + optional: false +- name: python-dateutil + version: 2.8.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + category: main + optional: false +- name: referencing + version: 0.30.2 + manager: conda + platform: linux-64 + dependencies: + attrs: '>=22.2.0' + python: '>=3.8' + rpds-py: '>=0.7.0' + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + hash: + md5: a33161b983172ba6ef69d5fc850650cd + sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + category: main + optional: false +- name: sip + version: 6.7.12 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + ply: '' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda + hash: + md5: 68d5bfccaba2d89a7812098dd3966d9b + sha256: 4c350a7ed9f5fd98196a50bc74ce1dc3bb05b0c90d17ea120439755fe2075796 + category: main + optional: false +- name: tbb-devel + version: 2021.10.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + tbb: 2021.10.0 + url: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.10.0-h00ab1b0_2.conda + hash: + md5: 35cc01dda6cac3d1c0c6dda6210f8bab + sha256: 559b4b5fe4c8a82dcec084193fc05666f431f6b2b9bc001d3d82f67c0eb03728 + category: main + optional: false +- name: typing-extensions + version: 4.8.0 + manager: conda + platform: linux-64 + dependencies: + typing_extensions: 4.8.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.8.0-hd8ed1ab_0.conda + hash: + md5: 384462e63262a527bda564fa2d9126c0 + sha256: d6e1dddd0c372218ef15912383d351ac8c73465cbf16238017f0269813cafe2d + category: main + optional: false +- name: urllib3 + version: 2.0.7 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda + hash: + md5: 270e71c14d37074b1d066ee21cf0c4a6 + sha256: 9fe14735dde74278c6f1710cbe883d5710fc98501a96031dec6849a8d8a1bb11 + category: main + optional: false +- name: xorg-libxmu + version: 1.1.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + xorg-libx11: '>=1.7.0,<2.0a0' + xorg-libxext: 1.3.* + xorg-libxt: '>=1.2.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h7f98852_0.tar.bz2 + hash: + md5: 3cdb89236358326adfce12be820a8af3 + sha256: 3a9f9f8bbf3a6934dada98a7a224dd264c533a251d2a92be604a4b23e772e79b + category: main + optional: false +- name: yarl + version: 1.9.2 + manager: conda + platform: linux-64 + dependencies: + idna: '>=2.0' + libgcc-ng: '>=12' + multidict: '>=4.0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.2-py310h2372a71_1.conda + hash: + md5: 30ae8a8f248b4e7cd2622cff41cb05a7 + sha256: 0a9aeb8cf885ef6dd0a737693823a4e4d27b2ee724fa3af317d8ccd925fa4258 + category: main + optional: false +- name: async-timeout + version: 4.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=3.6.5' + url: https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda + hash: + md5: 3ce482ec3066e6d809dbbb1d1679f215 + sha256: bd8b698e7f037a9c6107216646f1191f4f7a7fc6da6c34d1a6d4c211bcca8979 + category: main + optional: false +- name: fenics-libbasix + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/fenics-libbasix-0.6.0-hfdc072b_5.conda + hash: + md5: 1cb6934c5efd89a4e70689bbea874902 + sha256: 02ea6089b619322083743393e103e41e4c6dcff9084e76e7061e671b376b7ffc + category: main + optional: false +- name: fltk + version: 1.3.8 + manager: conda + platform: linux-64 + dependencies: + freetype: '>=2.12.1,<3.0a0' + libgcc-ng: '>=12' + libglu: '' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxdmcp: '' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxfixes: '' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/fltk-1.3.8-hfbcda93_2.conda + hash: + md5: 22ac38d068375b592df4eebabc15a4d5 + sha256: 34b510f05839b02aed19ef789fc0d87ea7917f2f8a5fb632ce26e1afd2b23c3a + category: main + optional: false +- name: freeimage + version: 3.18.0 + manager: conda + platform: linux-64 + dependencies: + imath: '>=3.1.9,<3.1.10.0a0' + jxrlib: '>=1.1,<1.2.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libraw: '>=0.21.1,<0.22.0a0' + libstdcxx-ng: '>=12' + libtiff: '>=4.6.0,<4.7.0a0' + libwebp-base: '>=1.3.2,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openexr: '>=3.2.1,<3.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/freeimage-3.18.0-h138f111_17.conda + hash: + md5: 01778fd100b523cc9e12b1292f8d8f12 + sha256: 6bb076953cafc6f38b871b768c814aa38197ffdcf702bfc2ca18b942d2c3754f + category: main + optional: false +- name: glew + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + libglu: '' + libstdcxx-ng: '>=9.3.0' + xorg-libx11: '' + xorg-libxext: '' + url: https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2 + hash: + md5: fb05eb5c47590b247658243d27fc32f1 + sha256: 86f5484e38f4604f7694b14f64238e932e8fd8d7364e86557f4911eded2843ae + category: main + optional: false +- name: gstreamer + version: 1.22.6 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + gettext: '>=0.21.1,<1.0a0' + glib: '>=2.78.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.0,<3.0a0' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.6-h98fc4e7_2.conda + hash: + md5: 1c95f7c612f9121353c4ef764678113e + sha256: 5578119cec4e86b7b607678781026ebe1170cb851b4f784c49b09bed1c92566c + category: main + optional: false +- name: harfbuzz + version: 8.2.1 + manager: conda + platform: linux-64 + dependencies: + cairo: '>=1.16.0,<2.0a0' + freetype: '>=2.12.1,<3.0a0' + graphite2: '' + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.0,<3.0a0' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.2.1-h3d44ed6_0.conda + hash: + md5: 98db5f8813f45e2b29766aff0e4a499c + sha256: 5ca6585e6a4348bcbe214d57f5d6f560d15d23a6650770a2909475848b214edb + category: main + optional: false +- name: hypre + version: 2.28.0 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/hypre-2.28.0-mpi_openmpi_h4032107_0.conda + hash: + md5: f77f78f41ee21adbcd1b9c8acb8047e2 + sha256: b2e8f249f11c13861f9f4cf008757414306166ccd26e0426238796f6d329289b + category: main + optional: false +- name: importlib_metadata + version: 6.8.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=6.8.0,<6.8.1.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda + hash: + md5: b279b07ce18058034e5b3606ba103a8b + sha256: b96e01dc42d547d6d9ceb1c5b52a5232cc04e40153534350f702c3e0418a6b3f + category: main + optional: false +- name: jsonschema-specifications + version: 2023.7.1 + manager: conda + platform: linux-64 + dependencies: + importlib_resources: '>=1.4.0' + python: '>=3.8' + referencing: '>=0.25.0' + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + hash: + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + category: main + optional: false +- name: libadios2 + version: 2.9.1 + manager: conda + platform: linux-64 + dependencies: + blosc: '>=1.21.5,<2.0a0' + bzip2: '>=1.0.8,<2.0a0' + hdf5: '>=1.14.2,<1.14.3.0a0' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + openmpi: '>=4.1.6,<5.0a0' + zeromq: '>=4.3.5,<4.4.0a0' + zfp: '>=0.5.5,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libadios2-2.9.1-mpi_openmpi_h4e62573_4.conda + hash: + md5: cc2ffb05135c6185b3263badc7ffea80 + sha256: c9e495eda85fdb62189e91b0fd80332a1e4ed70ddfff283e0bbd4ea347f37cc3 + category: main + optional: false +- name: libnetcdf + version: 4.9.2 + manager: conda + platform: linux-64 + dependencies: + blosc: '>=1.21.4,<2.0a0' + bzip2: '>=1.0.8,<2.0a0' + hdf4: '>=4.2.15,<4.2.16.0a0' + hdf5: '>=1.14.2,<1.14.3.0a0' + libaec: '>=1.0.6,<2.0a0' + libcurl: '>=8.2.1,<9.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libxml2: '>=2.11.5,<2.12.0a0' + libzip: '>=1.10.1,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.2,<4.0a0' + zlib: '' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda + hash: + md5: a19fa6cacf80c8a366572853d5890eb4 + sha256: 305ffc3ecaffce10754e4d057daa9803e8dc86d68b14524a791c7dc5598c1d2f + category: main + optional: false +- name: mdit-py-plugins + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=1.0.0,<4.0.0' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 6c5358a10873a15398b6f15f60cb5e1f + sha256: 1ddac8d2be448cd1fbe49d2ca09df7e10d99679d53146a917f8bb4899f76d0ca + category: main + optional: false +- name: numpy + version: 1.26.0 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py310hb13e2d6_0.conda + hash: + md5: ac3b67e928cc71548efad9b522d42fef + sha256: d4671e365c2ed30bf8a376bdc65afcbeeae440ca2091c8712ff8f23678f64973 + category: main + optional: false +- name: platformdirs + version: 3.11.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.6.3' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + hash: + md5: 8f567c0a74aa44cf732f15773b4083b0 + sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + category: main + optional: false +- name: pyqt5-sip + version: 12.12.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + packaging: '' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + sip: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda + hash: + md5: ef5333594a958b25912002886b82b253 + sha256: a6aec078683ed3cf1650b7c47e3f0fe185015d54ea37fe76b9f31f05e1fd087d + category: main + optional: false +- name: requests + version: 2.31.0 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + category: main + optional: false +- name: rich + version: 13.6.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '>=3.7.0' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.6.0-pyhd8ed1ab_0.conda + hash: + md5: 3ca4829f40710f581ca1d76bc907e99f + sha256: a2f8838a75ab8c2c1da0a813c7569d4f6efba0d2b5dc3a7659e2cb6d96bd8e19 + category: main + optional: false +- name: scalapack + version: 2.2.0 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.8.0,<4.0a0' + libgcc-ng: '>=10.3.0' + libgfortran-ng: '' + libgfortran5: '>=10.3.0' + liblapack: '>=3.8.0,<4.0a0' + openmpi: '>=4.1.2,<5.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/scalapack-2.2.0-h67de57e_1.tar.bz2 + hash: + md5: 9f5631123fb242b76de37a6f0f2804cf + sha256: 84d4994cf823a8226b9bb4191a2f8a8111f5b1d561f06de0b0c22643362953d2 + category: main + optional: false +- name: suitesparse + version: 5.10.1 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.8.0,<4.0a0' + libcblas: '>=3.8.0,<4.0a0' + libgcc-ng: '>=9.4.0' + liblapack: '>=3.8.0,<4.0a0' + libstdcxx-ng: '>=9.4.0' + metis: '>=5.1.0,<5.1.1.0a0' + mpfr: '>=4.1.0,<5.0a0' + tbb: '>=2021.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h9e50725_1.tar.bz2 + hash: + md5: a3a685b5f9aeb890ed874502fe56accf + sha256: 176d004eafe3f07110315d1c96ab7245fbba8677364933213404890a0e2e9d1f + category: main + optional: false +- name: superlu + version: 5.2.2 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=10.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/superlu-5.2.2-h00795ac_0.tar.bz2 + hash: + md5: 2fe6fcc1c7d6e2e8ea3f16ebd3306dbe + sha256: dd80a0f64309849d0a222da3e2edbb28de741202f8d0578ccca705e1ca16dabd + category: main + optional: false +- name: superlu_dist + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + _openmp_mutex: '>=4.5' + libblas: '>=3.8.0,<4.0a0' + libgcc-ng: '>=9.4.0' + libgfortran-ng: '' + libgfortran5: '>=9.4.0' + liblapack: '>=3.8.0,<4.0a0' + libstdcxx-ng: '>=9.4.0' + metis: '>=5.1.0,<5.1.1.0a0' + openmpi: '>=4.1.2,<5.0a0' + parmetis: '>=4.0.3,<4.1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/superlu_dist-7.2.0-h34f6f4d_0.tar.bz2 + hash: + md5: 096b645a660e2d764771e73f732b6874 + sha256: abaaac9e2b27a0fd6e9efd02daf8a4bf96d4b8ae7946d35b68a7399e2191817f + category: main + optional: false +- name: aiohttp + version: 3.8.6 + manager: conda + platform: linux-64 + dependencies: + aiosignal: '>=1.1.2' + async-timeout: <5.0,>=4.0.0a3 + attrs: '>=17.3.0' + charset-normalizer: '>=2.0,<4.0' + frozenlist: '>=1.1.1' + libgcc-ng: '>=12' + multidict: '>=4.5,<7.0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + yarl: '>=1.0,<2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.8.6-py310h2372a71_1.conda + hash: + md5: d265a71480afd9479c9333ba86375d04 + sha256: e32892fd786dc4ba150701ffd0981c8e942fc77e52754f6f1c331392004bd6f1 + category: main + optional: false +- name: black + version: 23.10.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + mypy_extensions: '>=0.4.3' + packaging: '>=22.0' + pathspec: '>=0.9' + platformdirs: '>=2' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + tomli: '>=1.1.0' + typing_extensions: '>=4.0.1' + url: https://conda.anaconda.org/conda-forge/linux-64/black-23.10.0-py310hff52083_0.conda + hash: + md5: 05a18fabc4d4c323d612aea919b295ff + sha256: 85504a132f80ecc82ffeb9532151d003eb75a765536b829a4ec3be51cb3fe17e + category: main + optional: false +- name: cftime + version: 1.6.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310h1f7b6fc_2.conda + hash: + md5: 7925aaa4330045bc32d334b20f446902 + sha256: 182a5e5584167a51625617775a2c641784985a5e769e74e3dd445bd6f1c0e7e1 + category: main + optional: false +- name: contourpy + version: 1.1.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '>=1.16' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py310hd41b1e2_1.conda + hash: + md5: 6a38f65d330b74495ad6990280486049 + sha256: 16f44e7e47f7cf9c3c02d760beb9179698510740e0eb1927ade3d8fb69aa1a0d + category: main + optional: false +- name: fenics-basix + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + fenics-libbasix: 0.6.0 + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '' + pybind11-abi: '4' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/fenics-basix-0.6.0-py310heada3b3_5.conda + hash: + md5: 500308aa1c64da979a417778a1b3039f + sha256: 2f2d5b20709650e99046d8939a8e3ceba5bee1c039f0228d07504c9fc931aba6 + category: main + optional: false +- name: fenics-ufl + version: 2023.1.1 + manager: conda + platform: linux-64 + dependencies: + numpy: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/fenics-ufl-2023.1.1-pyhd8ed1ab_1.conda + hash: + md5: 07040acaab0ab2cc2d173cc762983d58 + sha256: 341272328e654a4c55328c6e8db422c89816e925bfd91f3aa86b2d63c8801e11 + category: main + optional: false +- name: gst-plugins-base + version: 1.22.6 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.2.11.0a0' + gettext: '>=0.21.1,<1.0a0' + gstreamer: 1.22.6 + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.0,<3.0a0' + libogg: '>=1.3.4,<1.4.0a0' + libopus: '>=1.3.1,<2.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libvorbis: '>=1.3.7,<1.4.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.6-h8e1006c_2.conda + hash: + md5: 3d8e98279bad55287f2ef9047996f33c + sha256: 07e71ef8ad4d1516695132ed142ef6bc6393243fee54f950aa0944561f2f277f + category: main + optional: false +- name: h5py + version: 3.10.0 + manager: conda + platform: linux-64 + dependencies: + cached-property: '' + hdf5: '>=1.14.2,<1.14.3.0a0' + libgcc-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.10.0-nompi_py310ha2ad45a_100.conda + hash: + md5: dab51c266c6be866e0a5d101bfb0cd58 + sha256: f1af30a4d13b65667f3878b072187f61a80299ea44b47f996612d955bff58b0a + category: main + optional: false +- name: jsonschema + version: 4.19.1 + manager: conda + platform: linux-64 + dependencies: + attrs: '>=22.2.0' + importlib_resources: '>=1.4.0' + jsonschema-specifications: '>=2023.03.6' + pkgutil-resolve-name: '>=1.3.10' + python: '>=3.8' + referencing: '>=0.28.4' + rpds-py: '>=0.7.1' + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.1-pyhd8ed1ab_0.conda + hash: + md5: 78aff5d2af74e6537c1ca73017f01f4f + sha256: b4e50e1d53b984a467e79b7ba69cc408d14e3a2002cad4eaf7798e20268cff2d + category: main + optional: false +- name: libass + version: 0.17.1 + manager: conda + platform: linux-64 + dependencies: + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + fribidi: '>=1.0.10,<2.0a0' + harfbuzz: '>=8.1.1,<9.0a0' + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda + hash: + md5: c306fd9cc90c0585171167d09135a827 + sha256: 1bc3e44239a11613627488b7a9b6c021ec6b52c5925abd666832db0cb2a59f05 + category: main + optional: false +- name: mumps-mpi + version: 5.2.1 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.8.0,<4.0a0' + libgcc-ng: '>=10.3.0' + libgfortran-ng: '' + libgfortran5: '>=10.3.0' + liblapack: '>=3.8.0,<4.0a0' + metis: '>=5.1.0,<5.1.1.0a0' + mumps-include: 5.2.1 + openmpi: '>=4.1.2,<5.0a0' + parmetis: '>=4.0.3,<4.1.0a0' + ptscotch: '>=6.0.9,<6.0.10.0a0' + scalapack: '>=2.2.0,<2.3.0a0' + scotch: '>=6.0.9,<6.0.10.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-mpi-5.2.1-hfb3545b_11.tar.bz2 + hash: + md5: 8cf8da26a2d1e4a6f07fc6597fd42de6 + sha256: fee9b22355697ffa0ed288d1cb01d70041563c6c4c9d8822091f9654c9be2029 + category: main + optional: false +- name: scipy + version: 1.11.3 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py310hb13e2d6_1.conda + hash: + md5: 4260b359d8fbeab4f789a8b0f968079f + sha256: bb8cdaf0869979ef58b3c10491f235c0fabf0b091e591361d25a4ffd47d6aded + category: main + optional: false +- name: fenics-basix-pybind11-abi + version: 0.4.12 + manager: conda + platform: linux-64 + dependencies: + fenics-basix: 0.6.0 + url: https://conda.anaconda.org/conda-forge/linux-64/fenics-basix-pybind11-abi-0.4.12-heada3b3_5.conda + hash: + md5: 07c81f355e2248916d6244e3b65df73b + sha256: c713144b13d81825ef50a79422764fc282568ec00841affff6aad328b25661b7 + category: main + optional: false +- name: fenics-ffcx + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + cffi: '' + fenics-basix: 0.6.* + fenics-ufl: 2023.1.* + numpy: '' + python: '>=3.7' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/fenics-ffcx-0.6.0-pyh56297ac_0.conda + hash: + md5: cf36f595191568ba5aac38dbeeb6298c + sha256: facf23ffc9713262992a0f410d67ce9e3a2fa870662211acfe995b579b40569b + category: main + optional: false +- name: ffmpeg + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + aom: '>=3.6.1,<3.7.0a0' + bzip2: '>=1.0.8,<2.0a0' + dav1d: '>=1.2.1,<1.2.2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + gmp: '>=6.2.1,<7.0a0' + gnutls: '>=3.7.8,<3.8.0a0' + lame: '>=3.100,<3.101.0a0' + libass: '>=0.17.1,<0.17.2.0a0' + libgcc-ng: '>=12' + libopus: '>=1.3.1,<2.0a0' + libstdcxx-ng: '>=12' + libva: '>=2.20.0,<3.0a0' + libvpx: '>=1.13.0,<1.14.0a0' + libxml2: '>=2.11.5,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openh264: '>=2.3.1,<2.3.2.0a0' + svt-av1: '>=1.7.0,<1.7.1.0a0' + x264: '>=1!164.3095,<1!165' + x265: '>=3.5,<3.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.0.0-gpl_h334edf3_105.conda + hash: + md5: d47c3e10d2ca5fc07107d4ac640603da + sha256: f1f9070190bc189b9ec9034e9d9adbbb530cd25b571c763b33585195c0e13813 + category: main + optional: false +- name: matplotlib-base + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2020.06.20' + contourpy: '>=1.0.1' + cycler: '>=0.10' + fonttools: '>=4.22.0' + freetype: '>=2.12.1,<3.0a0' + kiwisolver: '>=1.0.1' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + packaging: '>=20.0' + pillow: '>=6.2.0' + pyparsing: '>=2.3.1' + python: '>=3.10,<3.11.0a0' + python-dateutil: '>=2.7' + python_abi: 3.10.* + tk: '>=8.6.13,<8.7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py310h62c0568_2.conda + hash: + md5: 5c0d101ef8fc542778aa80795a759d08 + sha256: 220052334fb2b01b5a487ddf6953c1c7713b401cc0faa0898401422799cdcec1 + category: main + optional: false +- name: netcdf4 + version: 1.6.4 + manager: conda + platform: linux-64 + dependencies: + certifi: '' + cftime: '' + hdf5: '>=1.14.2,<1.14.3.0a0' + libgcc-ng: '>=12' + libnetcdf: '>=4.9.2,<4.9.3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + numpy: '>=1.22.4,<2.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + setuptools: '' + url: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_103.conda + hash: + md5: 0850d2a119d51601b20c406a4909af4d + sha256: 43dd515bc3ba60d9c7ecf21639803c56af967901086f38c919ff7c67271474f6 + category: main + optional: false +- name: petsc + version: 3.19.6 + manager: conda + platform: linux-64 + dependencies: + fftw: '>=3.3.10,<4.0a0' + hdf5: '>=1.14.2,<1.14.3.0a0' + hypre: '>=2.28.0,<2.28.1.0a0' + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + metis: '>=5.1.0,<5.2.0a0' + mumps-mpi: '>=5.2.1,<5.2.2.0a0' + openmpi: '>=4.1.5,<5.0a0' + parmetis: '>=4.0.3,<4.1.0a0' + ptscotch: '>=6.0.9,<6.0.10.0a0' + scalapack: '>=2.2.0,<2.3.0a0' + scotch: '>=6.0.9,<6.0.10.0a0' + suitesparse: '>=5.10.1,<5.11.0a0' + superlu: '' + superlu_dist: '>=7.1.1,<8.0a0' + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/petsc-3.19.6-real_hda1ae68_100.conda + hash: + md5: b3f27fbfaea8e00d1abb10b0f2401ce8 + sha256: d39fe136656cc6f554b609ad1bf5e0565c2b487aeb7f9b27d71d24a69956950c + category: main + optional: false +- name: qt-main + version: 5.15.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + alsa-lib: '>=1.2.10,<1.2.11.0a0' + dbus: '>=1.13.6,<2.0a0' + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freetype: '>=2.12.1,<3.0a0' + gst-plugins-base: '>=1.22.5,<1.23.0a0' + gstreamer: '>=1.22.5,<1.23.0a0' + harfbuzz: '>=8.2.0,<9.0a0' + icu: '>=73.2,<74.0a0' + krb5: '>=1.21.2,<1.22.0a0' + libclang: '>=15.0.7,<16.0a0' + libclang13: '>=15.0.7' + libcups: '>=2.3.3,<2.4.0a0' + libevent: '>=2.1.12,<2.1.13.0a0' + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libglib: '>=2.78.0,<3.0a0' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libpq: '>=15.4,<16.0a0' + libsqlite: '>=3.43.0,<4.0a0' + libstdcxx-ng: '>=12' + libxcb: '>=1.15,<1.16.0a0' + libxkbcommon: '>=1.5.0,<2.0a0' + libxml2: '>=2.11.5,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + mysql-libs: '>=8.0.33,<8.1.0a0' + nspr: '>=4.35,<5.0a0' + nss: '>=3.92,<4.0a0' + openssl: '>=3.1.2,<4.0a0' + pulseaudio-client: '>=16.1,<16.2.0a0' + xcb-util: '>=0.4.0,<0.5.0a0' + xcb-util-image: '>=0.4.0,<0.5.0a0' + xcb-util-keysyms: '>=0.4.0,<0.5.0a0' + xcb-util-renderutil: '>=0.3.9,<0.4.0a0' + xcb-util-wm: '>=0.4.1,<0.5.0a0' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-xf86vidmodeproto: '' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc47bfe8_16.conda + hash: + md5: a8dd2dfcd570e3965c73be6c5e03e74f + sha256: 18dc29e725b620ec857368b40f07c41fd360b6c4071f83b67112eabfc087e8f1 + category: main + optional: false +- name: wslink + version: 1.12.3 + manager: conda + platform: linux-64 + dependencies: + aiohttp: <4 + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.3-pyhd8ed1ab_0.conda + hash: + md5: 9c9a548737e8238d23d88a7ff33fd253 + sha256: 638a5cfd213217ef59af935d6c12f60a848adfa1d0cd22471f4fa6bc113b419c + category: main + optional: false +- name: meshio + version: 5.3.4 + manager: conda + platform: linux-64 + dependencies: + h5py: '' + importlib_metadata: '' + netcdf4: '' + numpy: '' + python: '>=3.7' + rich: '' + url: https://conda.anaconda.org/conda-forge/noarch/meshio-5.3.4-pyhd8ed1ab_0.tar.bz2 + hash: + md5: d06b23cad8f0645461da747eafb1e8c6 + sha256: ca3f103cbf8f3f999771cc178b4e8ae5ea458a67a79fdb6bbc7b364bd232c86e + category: main + optional: false +- name: petsc4py + version: 3.19.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + numpy: '>=1.22.4,<2.0a0' + openmpi: '>=4.1.6,<5.0a0' + petsc: '>=3.19.6,<3.20.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + url: https://conda.anaconda.org/conda-forge/linux-64/petsc4py-3.19.6-real_hd44ebbc_100.conda + hash: + md5: 3907e4400bae4b4447e3dfdfaffad02c + sha256: 1696dcd78085e7c2a73be6a8d6b1aa7d6c784469c995dd3d9c130d6cc3dbb823 + category: main + optional: false +- name: pyqt + version: 5.15.9 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + pyqt5-sip: 12.12.2 + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + qt-main: '>=5.15.8,<5.16.0a0' + sip: '>=6.7.11,<6.8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda + hash: + md5: f4fe7a6e3d7c78c9de048ea9dda21690 + sha256: 92fe1c9eda6be7879ba798066016c1065047cc13d730105f5109835cbfeae8f1 + category: main + optional: false +- name: slepc + version: 3.19.2 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + petsc: '>=3.19.5,<3.20.0a0' + suitesparse: '>=5.10.1,<5.11.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/slepc-3.19.2-real_h3d00a72_100.conda + hash: + md5: 3e8e7a314aff0311a40165f2c70fd0e5 + sha256: 416a05c441c97ecf1ed04b9e6c6a5ac57ed99127896d4c29ec29d9c4fdea8576 + category: main + optional: false +- name: vtk-base + version: 9.2.6 + manager: conda + platform: linux-64 + dependencies: + double-conversion: '>=3.3.0,<3.4.0a0' + eigen: '' + expat: '' + freetype: '>=2.12.1,<3.0a0' + gl2ps: '>=1.4.2,<1.4.3.0a0' + glew: '>=2.1.0,<2.2.0a0' + hdf5: '>=1.14.2,<1.14.3.0a0' + jsoncpp: '>=1.9.5,<1.9.6.0a0' + libexpat: '>=2.5.0,<3.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libnetcdf: '>=4.9.2,<4.9.3.0a0' + libogg: '>=1.3.4,<1.4.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libsqlite: '>=3.43.0,<4.0a0' + libstdcxx-ng: '>=12' + libtheora: '>=1.1.1,<1.2.0a0' + libtiff: '>=4.6.0,<4.7.0a0' + libuuid: '>=2.38.1,<3.0a0' + libxcb: '>=1.15,<1.16.0a0' + libxml2: '>=2.11.5,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + loguru: '' + lz4-c: '>=1.9.3,<1.10.0a0' + nlohmann_json: '' + numpy: '' + proj: '>=9.3.0,<9.3.1.0a0' + pugixml: '>=1.13,<1.14.0a0' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + qt-main: '>=5.15.8,<5.16.0a0' + sqlite: '' + tbb: '>=2021.10.0' + tbb-devel: '' + tk: '>=8.6.13,<8.7.0a0' + utfcpp: '' + wslink: '' + xorg-libice: '>=1.1.1,<2.0a0' + xorg-libsm: '>=1.2.4,<2.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxt: '>=1.3.0,<2.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py310h1234567_216.conda + hash: + md5: a82dff490dfa22dfd106e5165e2a76f9 + sha256: ff6b260e12ed9a15c735d5048ab1ef0f4b5b62a5888a27b3c74465cb5158ee1d + category: main + optional: false +- name: fenics-libdolfinx + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + fenics-libbasix: '>=0.6.0,<0.6.1.0a0' + fenics-ufcx: '>=0.6.0,<0.6.1.0a0' + hdf5: '>=1.14.2,<1.14.3.0a0' + kahip: '>=3.15,<3.16.0a0' + libadios2: '>=2.9.1,<2.9.2.0a0' + libboost: '>=1.82.0,<1.83.0a0' + libboost-devel: '' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openmpi: '>=4.1.5,<5.0a0' + parmetis: '>=4.0.3,<4.1.0a0' + petsc: '>=3.19.6,<3.20.0a0' + ptscotch: '>=6.0.9,<6.0.10.0a0' + pugixml: '>=1.13,<1.14.0a0' + slepc: '>=3.19.2,<3.20.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/fenics-libdolfinx-0.6.0-hd8a4704_109.conda + hash: + md5: a4269c1bd85b6ecd8db71ba80abd3da0 + sha256: eeebe1fa79f9653a17ac192f00bca2f574cee6f8ac0ce2ea6eba9d80b8a738a8 + category: main + optional: false +- name: matplotlib + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + matplotlib-base: '>=3.8.0,<3.8.1.0a0' + pyqt: '>=5.10' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + tornado: '>=5' + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.0-py310hff52083_2.conda + hash: + md5: cda26b4d722d7319ce66df50332ff09b + sha256: 7262fdcd2974ab6aa864524c48703a81dc1c7891a5180da3cc3a72abafd2fc9b + category: main + optional: false +- name: slepc4py + version: 3.19.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + numpy: '>=1.22.4,<2.0a0' + openmpi: '>=4.1.5,<5.0a0' + petsc: '>=3.19.5,<3.20.0a0' + petsc4py: 3.19.* + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + slepc: '>=3.19.2,<3.20.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/slepc4py-3.19.2-real_hf1ee65d_101.conda + hash: + md5: c76368df8c4d20c30c4b6749641fdc42 + sha256: 23bca2db1bc84e1d4842f56baaadc3bde795d9489190e0ec0565bab7a7bf39e8 + category: main + optional: false +- name: vtk-io-ffmpeg + version: 9.2.6 + manager: conda + platform: linux-64 + dependencies: + ffmpeg: '>=6.0.0,<7.0a0' + vtk-base: 9.2.6 + url: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py310h1234567_216.conda + hash: + md5: d9a5e5dc290dd038bf958f6a48772530 + sha256: 00d47cb873f3de378e1b142d186d728e281f9d3cf87508125dadca9298f089f8 + category: main + optional: false +- name: fenics-dolfinx + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + cffi: '' + fenics-basix: 0.6.* + fenics-basix-pybind11-abi: 0.4.12 + fenics-ffcx: 0.6.* + fenics-libdolfinx: 0.6.0 + fenics-ufl: 2023.1.* + gxx_linux-64: 12.* + hdf5: '>=1.14.2,<1.14.3.0a0' + kahip-python: '' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + mpi4py: '' + numpy: '' + openmpi: '>=4.1.5,<5.0a0' + petsc: '>=3.19.6,<3.20.0a0' + petsc4py: '' + pkg-config: '' + pybind11-abi: '4' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + slepc: '>=3.19.2,<3.20.0a0' + slepc4py: '' + url: https://conda.anaconda.org/conda-forge/linux-64/fenics-dolfinx-0.6.0-py310hf26a831_109.conda + hash: + md5: 4956a7cc80be6c26f341aaa39d2bc99a + sha256: 2f2e1dca7e1b7773def590ac451f55de00715ad660eacc2c0ad63d95c3fd319a + category: main + optional: false +- name: vtk + version: 9.2.6 + manager: conda + platform: linux-64 + dependencies: + vtk-base: 9.2.6 + vtk-io-ffmpeg: 9.2.6 + url: https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py310h1234567_216.conda + hash: + md5: 28c1d6fdf662ae0b1eb45945da7b9a81 + sha256: 7bac072a71e4a27af1d5e9c8d2caccaccc0138547738b9088dc34291934163de + category: main + optional: false +- name: occt + version: 7.7.2 + manager: conda + platform: linux-64 + dependencies: + fontconfig: '>=2.14.2,<3.0a0' + fonts-conda-ecosystem: '' + freeimage: '>=3.18.0,<3.19.0a0' + freetype: '>=2.12.1,<3.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + rapidjson: '' + vtk: '>=9.2.6,<9.2.7.0a0' + xorg-libxt: '>=1.3.0,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/occt-7.7.2-all_h4c9f3c6_201.conda + hash: + md5: c3433e65219e92395cba0cc048a45746 + sha256: 6d5d4358b3022387c8ea43345d346594e0576d8ad1d8976f938801b4d355114c + category: main + optional: false +- name: gmsh + version: 4.11.1 + manager: conda + platform: linux-64 + dependencies: + cairo: '>=1.16.0,<2.0a0' + fltk: '>=1.3.8,<1.4.0a0' + gmp: '>=6.2.1,<7.0a0' + libblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + libglu: '' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + liblapack: '>=3.9.0,<4.0a0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + occt: '>=7.7.2,<7.8.0a0' + xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libxext: '>=1.3.4,<2.0a0' + xorg-libxfixes: '' + xorg-libxmu: '' + xorg-libxrender: '>=0.9.11,<0.10.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/linux-64/gmsh-4.11.1-h22e7e47_4.conda + hash: + md5: 1d1b8525e1f0a535f77892e03c0a3917 + sha256: 27f42074ad8e649f86d0ffca1d4ce8b819cd07df2936ae5fe84881054c217fa0 + category: main + optional: false +- name: python-gmsh + version: 4.11.1 + manager: conda + platform: linux-64 + dependencies: + gmsh: '>=4.11.1,<4.11.2.0a0' + numpy: '' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/python-gmsh-4.11.1-h57928b3_4.conda + hash: + md5: d6cd94a9b194e06eb59b1ce6e5464e24 + sha256: cd832f13039fb46b319232b4fea305c9413d9a46fe9fb3127b7f053134be614b + category: main + optional: false +- name: myst-parser + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + docutils: '>=0.16,<0.21' + jinja2: '' + markdown-it-py: '>=3.0.0,<4.0.0' + mdit-py-plugins: '>=0.4,<1' + python: '>=3.8' + pyyaml: '' + sphinx: '>=6,<8' + url: https://conda.anaconda.org/conda-forge/noarch/myst-parser-2.0.0-pyhd8ed1ab_0.conda + hash: + md5: 70699181909e468875f12076e1b0a8a9 + sha256: 59cdc52d9875f623a4df82896d80f304e436138f8410cbef969a7e4452c6bab7 + category: main + optional: false +- name: sphinx-gallery + version: 0.14.0 + manager: conda + platform: linux-64 + dependencies: + matplotlib-base: '' + pillow: '' + python: '>=3' + sphinx: '>=1.8.3' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: b3788794f88c9512393032e448428261 + sha256: d9421604023b36e336496bb03461414cd07ced3514ed15c1d9f598178fb9d86e + category: main + optional: false +- name: sphinxcontrib-applehelp + version: 1.0.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda + hash: + md5: aebfabcb60c33a89c1f9290cab49bc93 + sha256: 67e2b386c7b3c858ead88fa71fe4fa5eb1f4f59d7994d167b3910a744db392d3 + category: main + optional: false +- name: sphinxcontrib-devhelp + version: 1.0.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda + hash: + md5: ebf08f5184d8eaa486697bc060031953 + sha256: 770e13ebfef321426c09ec51d95c57755512db160518b2922a4337546ee51672 + category: main + optional: false +- name: sphinxcontrib-htmlhelp + version: 2.0.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda + hash: + md5: a9a89000dfd19656ad004b937eeb6828 + sha256: 5f09cd4a08a6c194c11999871a8c7cedc2cd7edd9ff7ceb6f0667b6698be4cc5 + category: main + optional: false +- name: sphinxcontrib-jquery + version: '4.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=2.7' + sphinx: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda + hash: + md5: 914897066d5873acfb13e75705276ad1 + sha256: 2e5f16a2d58f9a31443ffbb8ce3852cfccf533a6349045828cd2e994ef0679ca + category: main + optional: false +- name: sphinx_rtd_theme + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + docutils: <0.19 + python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' + sphinx: '>=1.6,<8' + sphinxcontrib-jquery: '>=4,<5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-1.3.0-pyha770c72_0.conda + hash: + md5: a615c369167e508293d8409973b34863 + sha256: 1288aac6167e320b576d89855262f05b1903e446c3dfc92cc67b12b39fb62502 + category: main + optional: false +- name: sphinxcontrib-qthelp + version: 1.0.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.6-pyhd8ed1ab_0.conda + hash: + md5: cf5c9649272c677a964a7313279e3a9b + sha256: 9ba5cea9cbab64106e8b5a9b19add855dcb52b8fbb1674398c715bccdbc04471 + category: main + optional: false +- name: sphinx + version: 7.2.6 + manager: conda + platform: linux-64 + dependencies: + alabaster: '>=0.7,<0.8' + babel: '>=2.9' + colorama: '>=0.4.5' + docutils: '>=0.18.1,<0.21' + imagesize: '>=1.3' + importlib-metadata: '>=4.8' + jinja2: '>=3.0' + packaging: '>=21.0' + pygments: '>=2.14' + python: '>=3.9' + requests: '>=2.25.0' + snowballstemmer: '>=2.0' + sphinxcontrib-applehelp: '' + sphinxcontrib-devhelp: '' + sphinxcontrib-htmlhelp: '>=2.0.0' + sphinxcontrib-jsmath: '' + sphinxcontrib-qthelp: '' + sphinxcontrib-serializinghtml: '>=1.1.9' + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda + hash: + md5: bbfd1120d1824d2d073bc65935f0e4c0 + sha256: 665d1fe6d20c6cc672ff20e6ebb405860f878b487d3d8d86a5952733fb7bbc42 + category: main + optional: false +- name: sphinxcontrib-serializinghtml + version: 1.1.9 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + sphinx: '>=5' + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.9-pyhd8ed1ab_0.conda + hash: + md5: 0612e497d7860728f2cda421ea2aec09 + sha256: c5710ae7bb7465f25a29cc845d9fb6ad0ea561972d796d379fcb48d801e96d6d + category: main + optional: false diff --git a/environment.yml b/environment.yml index e770689..cf458a6 100644 --- a/environment.yml +++ b/environment.yml @@ -3,8 +3,30 @@ channels: - conda-forge dependencies: - python>=3.10 - - pip + # runtime + - fenics-dolfinx=0.6.0 + - mpi4py=3.1.4 + - scipy + - pint + - matplotlib + - python-gmsh=4.11.1 + - meshio=5.3.4 + - jsonschema + # tests + - pytest + - coverage + - toml + # docs + - sphinx + - sphinx-gallery + - myst-parser + - sphinx_rtd_theme + # environment - conda-ecosystem-user-package-isolation - - fenics-dolfinx + # formatting + - black + - isort + - pip - pip: - - -e .[tests,docs] + - -e . + diff --git a/pyproject.toml b/pyproject.toml index ade09f5..e32bc00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,13 +12,7 @@ classifiers = [ "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", ] -dependencies = [ - "fenics-dolfinx", - "pint", - "gmsh", - "jsonschema", - "scipy", -] +dependencies = [] description = "Implementation of structural problems for concrete structures using FEniCSx" license = {file = "LICENSE"} name = "fenicsxconcrete" @@ -26,9 +20,9 @@ readme = "REAMDE.md" requires-python = ">=3.10" version = "0.0.8" -[project.optional-dependencies] -tests = ["pytest", "coverage", "toml"] -docs = ["sphinx", "sphinx-gallery", "sphinx-rtd-theme", "myst-parser", "matplotlib"] +#[project.optional-dependencies] +#tests = ["pytest", "coverage", "toml"] +#docs = ["sphinx", "sphinx-gallery", "sphinx-rtd-theme", "myst-parser", "matplotlib"] [project.urls] repository = "https://github.com/BAMresearch/FenicsXConcrete.git" From 8866fc8bf99615efff3bbebf7420dd63200a5027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Andr=C3=A9s=20Arcones?= <81630834+danielandresarcones@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:33:35 +0100 Subject: [PATCH 30/32] Update environment.yml --- environment.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/environment.yml b/environment.yml index 8eb2e98..adecb43 100644 --- a/environment.yml +++ b/environment.yml @@ -3,11 +3,11 @@ channels: - conda-forge dependencies: # runtime - - fenics-dolfinx + - fenics-dolfinx=0.6.0 - pint - matplotlib - - python-gmsh - - meshio + - python-gmsh=4.11.1 + - meshio=5.3.4 - jsonschema - scipy # tests From 5f96c11ccb34ff1761725162e824249fa15b2c6e Mon Sep 17 00:00:00 2001 From: darcones Date: Wed, 31 Jan 2024 14:32:18 +0100 Subject: [PATCH 31/32] Added temperature to quadrature field --- .../finite_element_problem/base_material.py | 1 + src/fenicsxconcrete/util/parameters.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 17459c5..67b6a8c 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -62,6 +62,7 @@ class QuadratureFields: strain: ufl.core.expr.Expr | df.fem.Function | None = None degree_of_hydration: ufl.core.expr.Expr | df.fem.Function | None = None damage: ufl.core.expr.Expr | df.fem.Function | None = None + temperature: ufl.core.expr.Expr | df.fem.Function | None = None class MaterialProblem(ABC, LogMixin): diff --git a/src/fenicsxconcrete/util/parameters.py b/src/fenicsxconcrete/util/parameters.py index 8b37eb2..8fb91cb 100644 --- a/src/fenicsxconcrete/util/parameters.py +++ b/src/fenicsxconcrete/util/parameters.py @@ -11,8 +11,11 @@ class Parameters(UserDict): """ def __setitem__(self, key: str, value: pint.Quantity): - assert isinstance(value, pint.Quantity) - self.data[key] = value.to_base_units() + assert isinstance(value, (pint.Quantity, bool)) + try: + self.data[key] = value.to_base_units() + except AttributeError: + self.data[key] = value def __add__(self, other: Parameters | None) -> Parameters: if other is None: @@ -24,6 +27,9 @@ def __add__(self, other: Parameters | None) -> Parameters: def to_magnitude(self) -> dict[str, int | str | float]: magnitude_dictionary = {} for key in self.keys(): - magnitude_dictionary[key] = self[key].magnitude + try: + magnitude_dictionary[key] = self[key].magnitude + except AttributeError: + magnitude_dictionary[key] = self[key] return magnitude_dictionary From 4347af5c9d9f9d6692c8e99b0fe88b327fa10ea0 Mon Sep 17 00:00:00 2001 From: darcones Date: Thu, 1 Feb 2024 16:05:54 +0100 Subject: [PATCH 32/32] Not check dimensions for bool --- .../finite_element_problem/base_material.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fenicsxconcrete/finite_element_problem/base_material.py b/src/fenicsxconcrete/finite_element_problem/base_material.py index 046d814..476da3d 100644 --- a/src/fenicsxconcrete/finite_element_problem/base_material.py +++ b/src/fenicsxconcrete/finite_element_problem/base_material.py @@ -111,12 +111,13 @@ def __init__( keys_set_default.append(key) else: # check if units are compatible - dim_given = parameters[key].dimensionality - dim_default = default_p[key].dimensionality - if dim_given != dim_default: - raise ValueError( - f"given units for {key} are not compatible with default units: {dim_given} != {dim_default}" - ) + if not isinstance(parameters[key], bool): + dim_given = parameters[key].dimensionality + dim_default = default_p[key].dimensionality + if dim_given != dim_default: + raise ValueError( + f"given units for {key} are not compatible with default units: {dim_given} != {dim_default}" + ) self.logger.info(f"for the following parameters, the default values are used: {keys_set_default}") # set parameters as attribute