Skip to content

Commit

Permalink
select general mat data only inside the domain for training
Browse files Browse the repository at this point in the history
  • Loading branch information
enigne committed Dec 5, 2024
1 parent a0202bc commit 8f5f36a
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 16 deletions.
25 changes: 23 additions & 2 deletions pinnicle/modeldata/general_mat_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,37 @@ def load_data(self, domain=None, physics=None):
# Reading matlab data
data = load_mat(self.parameters.data_path)

# pre load x, y, then use domain.bbox to further get the inflag
X = {}

# load the coordinates
for k, v in self.parameters.X_map.items():
if v in data:
self.X_dict[k] = data[v]
X[k] = data[v]
else:
print(f"{v} is not found in the data from {self.parameters.data_path}, please specify the mapping in 'X_map'")

# use the order in physics.input_var to determine x and y names
if physics:
xkeys = physics.input_var[0:2]
else:
xkeys = list(X.keys())

# get the bbox from domain, set the rectangle, works for both static and time dependent domain
if domain:
bbox = domain.bbox()
# set the flag based on the bbox region
boxflag = (X[xkeys[0]]>=bbox[0][0]) & (X[xkeys[0]]<=bbox[1][0]) & (X[xkeys[1]]>=bbox[0][1]) & (X[xkeys[1]]<=bbox[1][1])
else:
boxflag = np.ones_like(X[xkeys[0]], dtype=bool)

# load the coordinates
for k in X.keys():
self.X_dict[k] = X[k][boxflag].flatten()[:,None]

# load all variables from parameters.name_map
for k in self.parameters.name_map:
self.data_dict[k] = data[self.parameters.name_map[k]]
self.data_dict[k] = data[self.parameters.name_map[k]][boxflag].flatten()[:,None]

def plot(self, data_names=[], vranges={}, axs=None, **kwargs):
""" TODO: scatter plot of the selected data from data_names
Expand Down
14 changes: 6 additions & 8 deletions pinnicle/modeldata/h5_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,20 @@ def load_data(self, domain=None, physics=None):

# use the order in physics.input_var to determine x and y names
if physics:
xkey = physics.input_var[0]
ykey = physics.input_var[1]
xkeys = physics.input_var[0:2]
else:
xkey = 'x'
ykey = 'y'
xkeys = list(X.keys())

# get the bbox from domain, set the rectangle
# get the bbox from domain, set the rectangle, works for both static and time dependent domain
if domain:
bbox = domain.bbox()
# set the flag based on the bbox region
boxflag = (X[xkey]>=bbox[0][0]) & (X[xkey]<=bbox[1][0]) & (X[ykey]>=bbox[0][1]) & (X[ykey]<=bbox[1][1])
boxflag = (X[xkeys[0]]>=bbox[0][0]) & (X[xkeys[0]]<=bbox[1][0]) & (X[xkeys[1]]>=bbox[0][1]) & (X[xkeys[1]]<=bbox[1][1])
else:
boxflag = np.ones_like(X[xkey], dtype=bool)
boxflag = np.ones_like(X[xkeys[0]], dtype=bool)

# load the coordinates
for k in self.parameters.X_map.keys():
for k in X.keys():
self.X_dict[k] = X[k][boxflag].flatten()[:,None]

# load all variables from parameters.name_map
Expand Down
57 changes: 51 additions & 6 deletions tests/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,19 +140,64 @@ def test_MatData():
icoord = data_loader.get_ice_coordinates()
assert icoord.shape == (3192, 2)

hp["X_map"] = {"x":"x"}
hp["X_map"] = {"notload":"t", "y":"y"}
p = SingleDataParameter(hp)
data_loader = MatData(p)
data_loader.load_data()
assert ("y" in data_loader.X_dict)
assert ("t" not in data_loader.X_dict)
assert ("notload" not in data_loader.X_dict)

def test_MatData_domain():
filename = "flightTracks.mat"
expFileName = "fastflow_CF.exp"
repoPath = os.path.dirname(__file__) + "/../examples/"
appDataPath = os.path.join(repoPath, "dataset")
path = os.path.join(appDataPath, filename)

hp = {}
hp["data_path"] = path
hp["data_size"] = {"H":100}
hp["name_map"] = {"H":"thickness"}
hp["source"] = "mat"
hp["X_map"] = {"x1":"x", "x2":"y"}
hp["shapefile"] = os.path.join(repoPath, "dataset", expFileName)

d = pinn.domain.Domain( pinn.parameter.DomainParameter(hp))
p = SingleDataParameter(hp)
data_loader = MatData(p)
data_loader.load_data(d)
data_loader.prepare_training_data()
assert(data_loader.X['H'].shape[1] == 1)
assert(data_loader.X['H'].shape == (100,2))
assert(data_loader.sol['H'].shape == (100,1))
icoord = data_loader.get_ice_coordinates()
assert icoord.shape == (673,2)

hp["X_map"] = {"x":"t", "y":"y"}
def test_MatData_physics():
filename = "flightTracks.mat"
expFileName = "fastflow_CF.exp"
repoPath = os.path.dirname(__file__) + "/../examples/"
appDataPath = os.path.join(repoPath, "dataset")
path = os.path.join(appDataPath, filename)

hp = {}
hp["data_path"] = path
hp["data_size"] = {"H":100}
hp["name_map"] = {"H":"thickness"}
hp["source"] = "mat"
hp["X_map"] = {"x1":"x", "x2":"y"}
hp["shapefile"] = os.path.join(repoPath, "dataset", expFileName)
hp["equations"] = {"SSA":{"input":["x1", "x2"]}}

phy = pinn.physics.Physics(pinn.parameter.PhysicsParameter(hp))
p = SingleDataParameter(hp)
data_loader = MatData(p)
data_loader.load_data()
assert ("y" in data_loader.X_dict)
assert ("x" not in data_loader.X_dict)
data_loader.load_data(physics=phy)
data_loader.prepare_training_data()
assert(data_loader.X['H'].shape == (100,2))
assert(data_loader.sol['H'].shape == (100,1))
icoord = data_loader.get_ice_coordinates()
assert icoord.shape == (3192,2)

def test_h5Data():
filename = "subdomain_data.h5"
Expand Down

0 comments on commit 8f5f36a

Please sign in to comment.