XIAN-FEM-2026June/三维matlab代码/matlab 3D一阶基 + bele/export_case.m

128 lines
4.6 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function export_case()
%EXPORT_CASE 按 case_config.m 写出 bele3d.json含 bele 块)
[phy, cfg] = case_config();
root = fileparts(mfilename('fullpath'));
jsonPath = fullfile(root, cfg.jsonFile);
sbcIndex = phy.out(:)';
doc = struct();
doc.FemType = cfg.FemType;
doc.EletricType = cfg.EletricType;
doc.lambda = phy.lda0;
doc.NbrBoundary = cfg.NbrBoundary;
doc.BoundaryFlag = cfg.BoundaryFlag;
doc.sbc = struct( ...
'Index', sbcIndex, ...
'SBCType', zeros(1, nSbc), ...
'E0x', {repmat({'0'}, 1, nSbc)}, ...
'E0y', {repmat({'0'}, 1, nSbc)}, ...
'E0z', {repmat({'0'}, 1, nSbc)}, ...
'kx', zeros(1, nSbc), ...
'ky', zeros(1, nSbc), ...
'kz', zeros(1, nSbc));
doc.bele = struct( ...
'index', phy.beleDomains, ...
'Ebx', 'exp(-2.5*i*pi*(z+0.5))', ...
'Eby', '0', ...
'Ebz', '0', ...
'curlEbx', '0', ...
'curlEby', '-2.5*i*pi*exp(-2.5*i*pi*(z+0.5))', ...
'curlEbz', '0');
nDom = numel(phy.eps);
doc.NbrDomain = nDom;
doc.domainType = repmat(2, 1, nDom);
doc.domainIndex = 0:(nDom - 1);
doc.matType = zeros(1, nDom);
doc.epsilonrR = phy.eps(:)';
doc.epsilonrI = zeros(1, nDom);
doc.murR = phy.mur(:)';
doc.murI = zeros(1, nDom);
doc.chiheR = zeros(1, nDom);
doc.chiehR = zeros(1, nDom);
doc.chiheI = zeros(1, nDom);
doc.chiehI = zeros(1, nDom);
doc.sigma = zeros(1, nDom);
doc.n = ones(1, nDom);
doc.k = zeros(1, nDom);
doc.MeshFile = cfg.MeshFile;
doc.OutFile = cfg.OutFile;
txt = write_bele_json(doc);
fid = fopen(jsonPath, 'w');
if fid < 0
error('无法写入: %s', jsonPath);
end
fprintf(fid, '%s', txt);
fclose(fid);
fprintf('已写出 %s\n', jsonPath);
end
function txt = write_bele_json(doc)
lines = {};
lines{end+1} = '{';
lines{end+1} = sprintf(' "FemType": %d,', doc.FemType);
lines{end+1} = sprintf(' "EletricType": %d,', doc.EletricType);
lines{end+1} = sprintf(' "lambda": %g,', doc.lambda);
lines{end+1} = sprintf(' "NbrBoundary": %d,', doc.NbrBoundary);
lines{end+1} = sprintf(' "BoundaryFlag": %s,', fmt_int_row(doc.BoundaryFlag));
lines{end+1} = ' "sbc": {';
lines{end+1} = sprintf(' "Index": %s,', fmt_int_row(doc.sbc.Index));
lines{end+1} = sprintf(' "SBCType": %s,', fmt_int_row(doc.sbc.SBCType));
lines{end+1} = sprintf(' "E0x": %s,', fmt_str_row(doc.sbc.E0x));
lines{end+1} = sprintf(' "E0y": %s,', fmt_str_row(doc.sbc.E0y));
lines{end+1} = sprintf(' "E0z": %s,', fmt_str_row(doc.sbc.E0z));
lines{end+1} = sprintf(' "kx": %s,', fmt_int_row(doc.sbc.kx));
lines{end+1} = sprintf(' "ky": %s,', fmt_int_row(doc.sbc.ky));
lines{end+1} = sprintf(' "kz": %s', fmt_int_row(doc.sbc.kz));
lines{end+1} = ' },';
lines{end+1} = ' "bele": {';
lines{end+1} = sprintf(' "index": %s,', fmt_int_row(doc.bele.index));
lines{end+1} = sprintf(' "Ebx": "%s",', doc.bele.Ebx);
lines{end+1} = sprintf(' "Eby": "%s",', doc.bele.Eby);
lines{end+1} = sprintf(' "Ebz": "%s",', doc.bele.Ebz);
lines{end+1} = sprintf(' "curlEbx": "%s",', doc.bele.curlEbx);
lines{end+1} = sprintf(' "curlEby": "%s",', doc.bele.curlEby);
lines{end+1} = sprintf(' "curlEbz": "%s"', doc.bele.curlEbz);
lines{end+1} = ' },';
lines{end+1} = sprintf(' "NbrDomain": %d,', doc.NbrDomain);
lines{end+1} = sprintf(' "domainType": %s,', fmt_int_row(doc.domainType));
lines{end+1} = sprintf(' "domainIndex": %s,', fmt_int_row(doc.domainIndex));
lines{end+1} = sprintf(' "matType": %s,', fmt_int_row(doc.matType));
lines{end+1} = sprintf(' "epsilonrR": %s,', fmt_float_row(doc.epsilonrR));
lines{end+1} = sprintf(' "epsilonrI": %s,', fmt_float_row(doc.epsilonrI));
lines{end+1} = sprintf(' "murR": %s,', fmt_float_row(doc.murR));
lines{end+1} = sprintf(' "murI": %s,', fmt_float_row(doc.murI));
lines{end+1} = sprintf(' "chiheR": %s,', fmt_float_row(doc.chiheR));
lines{end+1} = sprintf(' "chiehR": %s,', fmt_float_row(doc.chiehR));
lines{end+1} = sprintf(' "chiheI": %s,', fmt_float_row(doc.chiheI));
lines{end+1} = sprintf(' "chiehI": %s,', fmt_float_row(doc.chiehI));
lines{end+1} = sprintf(' "sigma": %s,', fmt_float_row(doc.sigma));
lines{end+1} = sprintf(' "n": %s,', fmt_float_row(doc.n));
lines{end+1} = sprintf(' "k": %s,', fmt_float_row(doc.k));
lines{end+1} = sprintf(' "MeshFile": "%s",', doc.MeshFile);
lines{end+1} = sprintf(' "OutFile": "%s"', doc.OutFile);
lines{end+1} = '}';
txt = strjoin(lines, newline);
end
function s = fmt_int_row(v)
s = ['[', strjoin(arrayfun(@num2str, v(:)', 'UniformOutput', false), ', '), ']'];
end
function s = fmt_float_row(v)
s = ['[', strjoin(arrayfun(@(x) num2str(x, '%.16g'), v(:)', 'UniformOutput', false), ', '), ']'];
end
function s = fmt_str_row(c)
parts = cell(1, numel(c));
for i = 1:numel(c)
parts{i} = ['"', char(c{i}), '"'];
end
s = ['[', strjoin(parts, ', '), ']'];
end