73 lines
2.5 KiB
Matlab
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
|