-
Notifications
You must be signed in to change notification settings - Fork 2
/
bem5_volume_XY.m
149 lines (135 loc) · 5.82 KB
/
bem5_volume_XY.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
% This script accurately computes and displays electric fields sampled on
% a cross-section (transverse plane) via the FMM method with accurate neighbor integration
%
% Copyright SNM/WAW 2017-2020
%% Load/prepare data
planeABCD = [0 0 1 -Z*1e-3]; % Equation of the plane of the cross-section (Ax + By + Cz + D = 0)(meters) for neighbor triangle search acceleration
%% Post processing parameters
component = 4; % field component to be plotted (1, 2, 3 or x, y, z, or 4 - total)
temp = ['x' 'y' 'z' 't'];
label = temp(component);
%% Define dimensionless radius of the integration sphere (for precise integration near boundaries)
R = 4;
%% Define observation points in the cross-section (MsxMs observation points)
Ms = 200;
% Coronal plane
x = linspace(xmin, xmax, Ms);
y = linspace(ymin, ymax, Ms);
[X0, Y0] = meshgrid(x, y);
clear pointsXY;
pointsXY(:, 1) = reshape(X0, 1, Ms^2);
pointsXY(:, 2) = reshape(Y0, 1, Ms^2);
pointsXY(:, 3) = Z*ones(1, Ms^2);
% Set up enclosing tissues (optional: suppresses visualization of saturated E-field outside the head model)
pol = 1; % 1 - skin; 2 - skull; 3 - CSF
EofXY_closed = close_meshpolygon(EofXY{pol}, PofXY{pol});
poly = meshpolygon(PofXY{pol}, EofXY_closed); % cross-section in the form of an oriented polygon
in = inpolygon(pointsXY(:, 1), pointsXY(:, 2), poly(:, 1), poly(:, 2));
% Assign tissue types to observation points (required for current density plot)
obsPointTissues = assign_tissue_type_volume(pointsXY*1e-3, normals, Center, Indicator);
%% Find the E-field at each observation point in the cross-section
tic
pointsXY = 1e-3*pointsXY; % Convert back to m
Epri = zeros(Ms*Ms, 3);
Esec = zeros(Ms*Ms, 3);
Epri(in, :) = bemf3_inc_field_electric(strcoil, pointsXY(in, :), dIdt, mu0);
Esec(in, :) = bemf5_volume_field_electric(pointsXY(in, :), c, P, t, Center, Area, normals, R, planeABCD);
Etotal = Epri + Esec;
fieldPlaneTime = toc
%% Calculate current density at each observation point
% Observation points in free space were originally assigned tissue code 0,
% so provide an extra "Free Space" conductivity entry and point free space obs pts to that entry.
condTemp = [cond 0];
obsPointTissues(obsPointTissues == 0) = length(condTemp);
% Calculate current density J = sigma * E
condTempExpanded = transpose(condTemp(obsPointTissues));
Jtotal = repmat(condTempExpanded, 1, 3).*Etotal;
%% Plot the E-field in the cross-section
figure;
% E-field plot: contour plot
if component == 4
temp = abs(sqrt(dot(Etotal, Etotal, 2)));
else
temp = abs(Etotal(:, component));
end
th1 = 120; % in V/m
th2 = 0; % in V/m
levels = 20;
bemf2_graphics_vol_field(temp, th1, th2, levels, x, y);
xlabel('Distance x, mm');
ylabel('Distance y, mm');
title(['E-field (V/m), ', label, '-component in the transverse plane.']);
% E-field plot: tissue boundaries
color = prism(length(tissue)); color(4, :) = [0 1 1];
for m = countXY
edges = EofXY{m}; % this is for the contour
points = [];
points(:, 1) = +PofXY{m}(:, 1); % this is for the contour
points(:, 2) = +PofXY{m}(:, 2); % this is for the contour
patch('Faces', edges, 'Vertices', points, 'EdgeColor', color(m, :), 'LineWidth', 2.0); % this is contour plot
end
% E-field plot: general settings
axis 'equal'; axis 'tight';
colormap parula; colorbar;
axis([xmin xmax ymin ymax]);
grid on; set(gcf,'Color','White');
%% Plot the current distribution in the cross-section
figure;
% J-field plot: Contour plot
if component == 4
temp = abs(sqrt(dot(Jtotal, Jtotal, 2)));
else
temp = abs(Jtotal(:, component));
end
th1 = 120; % in V/m
th2 = 0; % in V/m
levels = 20;
bemf2_graphics_vol_field(temp, th1, th2, levels, x, y);
xlabel('Distance x, mm');
ylabel('Distance y, mm');
title(['Current density (A/m^2), ', label, '-component in the transverse plane.']);
% J-field plot: tissue boundaries
color = prism(length(tissue)); color(4, :) = [0 1 1];
for m = countXY
edges = EofXY{m}; % this is for the contour
points = [];
points(:, 1) = +PofXY{m}(:, 1); % this is for the contour
points(:, 2) = +PofXY{m}(:, 2); % this is for the contour
patch('Faces', edges, 'Vertices', points, 'EdgeColor', color(m, :), 'LineWidth', 2.0); % this is contour plot
end
% J-field plot: general settings
axis 'equal'; axis 'tight';
colormap parula; colorbar;
axis([xmin xmax ymin ymax]);
grid on; set(gcf,'Color','White');
%% Verification: Plot obs pt tissue assignments against the contours
% The tissue assignment may fail for bad meshes or complicated geometry.
% This plot will show which tissue types were used for the prior plot
color = prism(length(tissue)); color(4,:) = [0 1 1];
figure;
for j = 0:length(tissue)
if(j == 0)
c_temp = [0 0 0];
else
c_temp = color(j,:);
end
ptsX = pointsXY(obsPointTissues == j, 1) * 1e3;
ptsY = pointsXY(obsPointTissues == j, 2) * 1e3;
scatter(ptsX, ptsY, 4, c_temp, 'filled'); hold on;
end
% Display the tissue boundaries
color = ones(length(tissue), 3);
for m = countXY
edges = EofXY{m}; % this is for the contour
points = [];
points(:, 1) = +PofXY{m}(:, 1); % this is for the contour
points(:, 2) = +PofXY{m}(:, 2); % this is for the contour
patch('Faces', edges, 'Vertices', points, 'EdgeColor', color(m, :), 'LineWidth', 2.0); % this is contour plot
end
% General settings
axis 'equal'; axis 'tight';
axis([xmin xmax ymin ymax]);
grid on; set(gcf,'Color','White');
title('Tissue types assigned to observation points');
xlabel('Distance x, mm');
ylabel('Distance y, mm');