XIAN-FEM-2026June/三维matlab代码/2023-2-端口激励问题(四面体网格)/exportPortModesFem2.m

73 lines
2.5 KiB
Matlab

function exportPortModesFem2(outFile)
%EXPORTPORTMODESFEM2 导出 MainFem2 / MeshData2 数值端口模态 (port_modes.json)
if nargin < 1
outFile = fullfile(fileparts(mfilename('fullpath')), '..', '..', ...
'3D opticsfem-master', 'port', 'Release', 'port_modes.json');
end
rootDir = fileparts(mfilename('fullpath'));
load(fullfile(rootDir, 'MeshData2.mat'), 'Mesh');
[Physic, Material, Port1Solver, Port2Solver] = configPhysicMaterialFem4();
Port1Mesh = GetBMesh(Mesh.Nodes, Mesh.Faces, Mesh.FacesIndex, Physic.Port1);
[Port1Solver, Port1Mesh] = BoundaryEigenMode(Port1Mesh, Physic, Material, Port1Solver);
Port1Solver = GetPowerCoef(Port1Solver, Port1Mesh, Material.murF, 1);
Port1Mesh.normal = [0; 0; -1];
Port2Mesh = GetBMesh(Mesh.Nodes, Mesh.Faces, Mesh.FacesIndex, Physic.Port2);
[Port2Solver, Port2Mesh] = BoundaryEigenMode(Port2Mesh, Physic, Material, Port2Solver);
Port2Mesh.normal = [0; 0; 1];
el2no = Mesh.Elements';
f1 = el2no([1 1 1 2], :);
f2 = el2no([2 2 3 3], :);
f3 = el2no([3 4 4 4], :);
f_array = [f1(:) f2(:) f3(:)];
[Faces, ~, FacesOfElements] = unique(f_array, 'rows');
Port1Mesh.FacesConn = GetBFacesConn(Port1Mesh.OldFaces, Faces, FacesOfElements);
Port2Mesh.FacesConn = GetBFacesConn(Port2Mesh.OldFaces, Faces, FacesOfElements);
js.input = packPort(Port1Mesh, Port1Solver, 1);
js.output = packPort(Port2Mesh, Port2Solver, 2);
fid = fopen(outFile, 'w');
fprintf(fid, '%s', jsonencode(js));
fclose(fid);
fprintf('Exported port modes (MeshData2) -> %s\n', outFile);
fprintf('powerCoef=%g gamma1=(%g,%g)\n', Port1Solver.powerCoef, ...
real(Port1Solver.gamma(1)), imag(Port1Solver.gamma(1)));
end
function p = packPort(PortMesh, PortSolver, ptype)
nf = size(PortMesh.NewFaces, 1);
edgeOfFace = zeros(nf, 3);
for n = 1:nf
for i = 1:3
edgeOfFace(n, i) = PortMesh.EdgesOfElements((n - 1) * 3 + i) - 1;
end
end
ez = PortSolver.Ez(:, 1);
et = PortSolver.Et(:, 1);
p = struct( ...
'type', ptype, ...
'gamma', [real(PortSolver.gamma(1)), imag(PortSolver.gamma(1))], ...
'powerCoef', getPowerCoef(PortSolver), ...
'normal', PortMesh.normal(:)', ...
'facesConn', PortMesh.FacesConn, ...
'portNewFaces', PortMesh.NewFaces - 1, ...
'portEdgeOfFace', edgeOfFace, ...
'portNodes', PortMesh.Nodes, ...
'Ez_re', real(ez(:)), 'Ez_im', imag(ez(:)), ...
'Et_re', real(et(:)), 'Et_im', imag(et(:)));
end
function c = getPowerCoef(PortSolver)
if isfield(PortSolver, 'powerCoef')
c = PortSolver.powerCoef;
else
c = 1.0;
end
end