When running a simple parameterized diffusion problem., the error message is: "could not unroll graph! This is probably because you are asking to compute a value that is not an output of any node"
the related source code is: @modulus.main(config_path=“conf”, config_name=“config”)
def run(cfg: ModulusConfig) → None:
# make list of nodes to unroll graph on
diff_u1 = Diffusion(T="u_1", D="D1", dim=2, time=False)
diff_net_u_1 = instantiate_arch(
input_keys=[Key("x"), Key("y"), **Key("D1")**],
output_keys=[Key("u_1")],
cfg=cfg.arch.fully_connected,
)
nodes = (
diff_u1.make_nodes()
+ [diff_net_u_1.make_node(name="u1_network", jit=cfg.jit)]
)
the error is caused by the Key(“D1”) in the network input but not understood why?
A similar issue exists if I run the “diffusion_bar_parameterized.py” script from the examples
Thank you for the response. The full script is provided below showing the node declaration.
import torch
import numpy as np
from sympy import Symbol, Eq, Function, Number
import modulus
from modulus.hydra import to_absolute_path, ModulusConfig, instantiate_arch
from modulus.solver import Solver
from modulus.domain import Domain
from modulus.geometry.primitives_1d import Line1D
from modulus.geometry.primitives_2d import Rectangle
from modulus.geometry import Parameterization
from modulus.domain.constraint import (
PointwiseBoundaryConstraint,
PointwiseInteriorConstraint,
)
from modulus.domain.validator import PointwiseValidator
from modulus.domain.monitor import PointwiseMonitor
from modulus.domain.inferencer import PointwiseInferencer
from modulus.utils.io.plotter import ValidatorPlotter, InferencerPlotter
from modulus.key import Key
from modulus.node import Node
from modulus.eq.pde import PDE
#------------------------------------- #Heat transfer (diffusion) partial differential equation
class Diffusion(PDE):
name = “Diffusion”
def __init__(self, T="T", D="D", Q=0, dim=3, time=True):
# set params
self.T = T
self.dim = dim
self.time = time
# coordinates
x, y, z = Symbol("x"), Symbol("y"), Symbol("z")
# time
t = Symbol("t")
# make input variables
input_variables = {"x": x, "y": y, "z": z, "t": t}
if self.dim == 1:
input_variables.pop("y")
input_variables.pop("z")
elif self.dim == 2:
input_variables.pop("z")
if not self.time:
input_variables.pop("t")
# Temperature
assert type(T) == str, "T needs to be string"
T = Function(T)(*input_variables)
# Diffusivity
if type(D) is str:
D = Function(D)(*input_variables)
elif type(D) in [float, int]:
D = Number(D)
# Source
if type(Q) is str:
Q = Function(Q)(*input_variables)
elif type(Q) in [float, int]:
Q = Number(Q)
# set equations
self.equations = {}
self.equations["diffusion_" + self.T] = (
T.diff(t)
- (D * T.diff(x)).diff(x)
- (D * T.diff(y)).diff(y)
- (D * T.diff(z)).diff(z)
- Q
)