你已经派生过 gpr-sidl-inv
镜像自地址
https://gitee.com/sduem/gpr-sidl-inv.git
已同步 2025-08-03 02:46:52 +08:00
94 行
3.8 KiB
Python
94 行
3.8 KiB
Python
import numpy as np
|
|
import random
|
|
|
|
def generate_layers_1d(grid_size, num_layers, min_size, transition_size, first_layer_minsize, first_layer_maxsize):
|
|
"""Generate a 1D stratified model with transition zones."""
|
|
usable_size = grid_size - (num_layers - 1) * transition_size
|
|
grid = np.zeros(grid_size, dtype=int)
|
|
remaining_size = usable_size
|
|
layer_sizes = []
|
|
|
|
# Determine layer sizes
|
|
for i in range(num_layers - 1):
|
|
if i == 0:
|
|
size = random.randint(first_layer_minsize, first_layer_maxsize)
|
|
else:
|
|
size = random.randint(min_size, remaining_size - (num_layers - i - 1) * min_size)
|
|
layer_sizes.append(size)
|
|
remaining_size -= size
|
|
layer_sizes.append(remaining_size)
|
|
|
|
# Assign layers and transitions to grid
|
|
current_position = 0
|
|
for i, size in enumerate(layer_sizes):
|
|
grid[current_position:current_position + size] = i + 1
|
|
current_position += size
|
|
if i < num_layers - 1:
|
|
grid[current_position:current_position + transition_size] = 0 # 0 indicates transition zone
|
|
current_position += transition_size
|
|
|
|
return grid
|
|
|
|
def assign_permittivity(grid, num_layers, permittivity_range=(1, 81), transition_size=5):
|
|
"""Assign permittivity values to layers and interpolate values across transition zones."""
|
|
permittivity_grid = np.zeros_like(grid, dtype=float)
|
|
layer_permittivities = {}
|
|
|
|
# Assign permittivity to each layer
|
|
for layer in range(1, num_layers + 1):
|
|
value = random.uniform(*permittivity_range)
|
|
layer_permittivities[layer] = value
|
|
permittivity_grid[grid == layer] = value
|
|
|
|
# Smooth transitions between layers using linear interpolation
|
|
for i in range(1, num_layers):
|
|
start_val = layer_permittivities[i]
|
|
end_val = layer_permittivities[i + 1]
|
|
transition_start = np.where(grid == 0)[0][(i - 1) * transition_size]
|
|
for j in range(transition_size):
|
|
t = j / (transition_size - 1)
|
|
permittivity_grid[transition_start + j] = (1 - t) * start_val + t * end_val
|
|
|
|
return permittivity_grid
|
|
|
|
def assign_permittivity_with_smooth_transition(grid, num_layers, first_layer_eps_range, permittivity_range=(1, 81), transition_size=5):
|
|
"""Assign permittivity values using smooth cosine transition between layers."""
|
|
permittivity_grid = np.zeros_like(grid, dtype=float)
|
|
layer_permittivities = {}
|
|
|
|
for layer in range(1, num_layers + 1):
|
|
if layer == 1:
|
|
value = random.randint(*first_layer_eps_range)
|
|
else:
|
|
value = random.uniform(*permittivity_range)
|
|
layer_permittivities[layer] = value
|
|
permittivity_grid[grid == layer] = value
|
|
|
|
# Cosine-smooth transitions
|
|
for i in range(1, num_layers):
|
|
start_val = layer_permittivities[i]
|
|
end_val = layer_permittivities[i + 1]
|
|
transition_start = np.where(grid == 0)[0][(i - 1) * transition_size]
|
|
for j in range(transition_size):
|
|
t = j / (transition_size - 1)
|
|
smooth = 0.5 * (1 - np.cos(np.pi * t))
|
|
permittivity_grid[transition_start + j] = start_val + (end_val - start_val) * smooth
|
|
|
|
return permittivity_grid
|
|
|
|
def assign_integer_values(permittivity_grid):
|
|
"""Convert permittivity values to discrete integers representing unique material zones."""
|
|
layer_id = np.zeros_like(permittivity_grid, dtype=float)
|
|
unique_permittivities = {}
|
|
integer_value = 0
|
|
|
|
for idx, val in enumerate(permittivity_grid):
|
|
val = round(val, 5)
|
|
if idx == 0 or val != round(permittivity_grid[idx - 1], 5):
|
|
unique_permittivities[val] = integer_value
|
|
integer_value += 1
|
|
layer_id[idx] = unique_permittivities[val]
|
|
|
|
return layer_id
|
|
|