├── .gitignore
├── pom.xml
└── src
└── main
├── java
└── com
│ └── aerospace
│ └── university
│ └── matlab_executor
│ ├── MatlabExecutorApplication.java
│ ├── controller
│ └── FdtdViewController.java
│ ├── endpoint
│ └── FdtdExecutorEndpoint.java
│ ├── model
│ ├── Fdtd1Darguments.java
│ ├── Fdtd2Darguments.java
│ └── Fdtd3Darguments.java
│ └── service
│ ├── FdtdExecutorService.java
│ └── FileHandlerService.java
└── resources
├── application.yml
├── scripts
├── calculateFdtd1d.m
├── calculateFdtd2d.m
└── calculateFdtd3d.m
└── templates
├── fdtd1dView.ftl
├── fdtd2dView.ftl
└── fdtd3dView.ftl
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**
5 | !**/src/test/**
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 |
30 | ### VS Code ###
31 | .vscode/
32 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.2.6.RELEASE
9 |
10 |
11 | com.aerospace.university
12 | matlab_executor
13 | 0.0.1-SNAPSHOT
14 | matlab_executor
15 | fdtd method realization
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-web
25 |
26 |
27 | org.springframework.boot
28 | spring-boot-starter-freemarker
29 |
30 |
31 | org.projectlombok
32 | lombok
33 | true
34 |
35 |
36 | org.springframework.boot
37 | spring-boot-starter-test
38 | test
39 |
40 |
41 | org.junit.vintage
42 | junit-vintage-engine
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | org.springframework.boot
52 | spring-boot-maven-plugin
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/MatlabExecutorApplication.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class MatlabExecutorApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(MatlabExecutorApplication.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/controller/FdtdViewController.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.controller;
2 |
3 | import com.aerospace.university.matlab_executor.model.Fdtd1Darguments;
4 | import com.aerospace.university.matlab_executor.model.Fdtd2Darguments;
5 | import com.aerospace.university.matlab_executor.model.Fdtd3Darguments;
6 | import com.aerospace.university.matlab_executor.service.FdtdExecutorService;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.stereotype.Controller;
9 | import org.springframework.web.bind.annotation.GetMapping;
10 | import org.springframework.web.bind.annotation.PostMapping;
11 | import org.springframework.web.bind.annotation.RequestParam;
12 |
13 | import java.io.IOException;
14 |
15 | @Controller
16 | public class FdtdViewController {
17 |
18 | private final FdtdExecutorService fdtdExecutorService;
19 |
20 | @Autowired
21 | public FdtdViewController(FdtdExecutorService fdtdExecutorService) {
22 | this.fdtdExecutorService = fdtdExecutorService;
23 | }
24 |
25 | @GetMapping({"/fdtd_1D"})
26 | public String getFdtd1D() {
27 | return "fdtd1dView";
28 | }
29 |
30 | @GetMapping({"/fdtd_2D"})
31 | public String getFdtd2D() {
32 | return "fdtd2dView";
33 | }
34 |
35 | @GetMapping({"/fdtd_3D"})
36 | public String getFdtd3D() {
37 | return "fdtd3dView";
38 | }
39 |
40 | @PostMapping({"/calculateFdtd_1D"})
41 | public void calculateFdtd1D(@RequestParam("Lambda") String Lambda,
42 | @RequestParam("Q") String Q,
43 | @RequestParam("Qt") String Qt,
44 | @RequestParam("QT") String QT,
45 | @RequestParam("Eps") String Eps,
46 | @RequestParam("LzConst") String LzConst) throws IOException {
47 | Fdtd1Darguments fdtd1Darguments = new Fdtd1Darguments(Lambda, Q, Qt, QT, Eps, LzConst);
48 | this.fdtdExecutorService.executeFdtd1d(fdtd1Darguments);
49 | }
50 |
51 | @PostMapping({"/calculateFdtd_2D"})
52 | public void calculateFdtd2D(@RequestParam("Lambda") String Lambda,
53 | @RequestParam("Q") String Q,
54 | @RequestParam("Qt") String Qt,
55 | @RequestParam("QT") String QT,
56 | @RequestParam("Eps") String Eps,
57 | @RequestParam("LzConst") String LyConst,
58 | @RequestParam("LzConst") String LzConst) throws IOException {
59 | Fdtd2Darguments fdtd2Darguments = new Fdtd2Darguments(Lambda, Q, Qt, QT, Eps, LyConst, LzConst);
60 | this.fdtdExecutorService.executeFdtd2d(fdtd2Darguments);
61 | }
62 |
63 | @PostMapping({"/calculateFdtd_3D"})
64 | public void calculateFdtd3D(@RequestParam("Lambda") String Lambda,
65 | @RequestParam("Q") String Q,
66 | @RequestParam("Qt") String Qt,
67 | @RequestParam("QT") String QT,
68 | @RequestParam("Eps") String Eps,
69 | @RequestParam("LzConst") String LxConst,
70 | @RequestParam("LzConst") String LyConst,
71 | @RequestParam("LzConst") String LzConst) throws IOException {
72 | Fdtd3Darguments fdtd3Darguments = new Fdtd3Darguments(Lambda, Q, Qt, QT, Eps, LxConst, LyConst, LzConst);
73 | this.fdtdExecutorService.executeFdtd3d(fdtd3Darguments);
74 | }
75 |
76 | }
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/endpoint/FdtdExecutorEndpoint.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.endpoint;
2 |
3 | import com.aerospace.university.matlab_executor.model.Fdtd1Darguments;
4 | import com.aerospace.university.matlab_executor.model.Fdtd2Darguments;
5 | import com.aerospace.university.matlab_executor.model.Fdtd3Darguments;
6 | import com.aerospace.university.matlab_executor.service.FdtdExecutorService;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.http.MediaType;
9 | import org.springframework.web.bind.annotation.PostMapping;
10 | import org.springframework.web.bind.annotation.RequestBody;
11 | import org.springframework.web.bind.annotation.RequestMapping;
12 | import org.springframework.web.bind.annotation.RestController;
13 |
14 | import java.io.IOException;
15 |
16 | @RestController
17 | @RequestMapping(value = "api", produces = {MediaType.APPLICATION_JSON_VALUE})
18 | public class FdtdExecutorEndpoint {
19 |
20 | private final FdtdExecutorService fdtdExecutorService;
21 |
22 | @Autowired
23 | public FdtdExecutorEndpoint(FdtdExecutorService fdtdExecutorService) {
24 | this.fdtdExecutorService = fdtdExecutorService;
25 | }
26 |
27 | @PostMapping("/fdtd1D")
28 | public void executeFDTD1D(@RequestBody Fdtd1Darguments fdtd1Darguments) throws IOException {
29 | this.fdtdExecutorService.executeFdtd1d(fdtd1Darguments);
30 | }
31 |
32 | @PostMapping("/fdtd2D")
33 | public void executeFDTD2D(@RequestBody Fdtd2Darguments fdtd2Darguments) throws IOException {
34 | this.fdtdExecutorService.executeFdtd2d(fdtd2Darguments);
35 | }
36 |
37 | @PostMapping("/fdtd3D")
38 | public void executeFDTD3D(@RequestBody Fdtd3Darguments fdtd3Darguments) throws IOException {
39 | this.fdtdExecutorService.executeFdtd3d(fdtd3Darguments);
40 | }
41 | }
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/model/Fdtd1Darguments.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.model;
2 |
3 | public class Fdtd1Darguments {
4 |
5 | private String lambda;
6 | private String q; // число узлов сеточной области на длину волны (по пространству)
7 | private String qt; // число узлов сеточной области на длину волны (по времени)
8 | private String qT; // "длительность" запускаемого цуга в длинах волн
9 | private String lzConst; // "длительность" запускаемого цуга в длинах волн
10 | private String eps; // распространение в кварце
11 |
12 | public Fdtd1Darguments() {
13 | }
14 |
15 | public Fdtd1Darguments(String lambda, String q, String qt, String qT, String lzConst, String eps) {
16 | this.lambda = lambda;
17 | this.q = q;
18 | this.qt = qt;
19 | this.qT = qT;
20 | this.lzConst = lzConst;
21 | this.eps = eps;
22 | }
23 |
24 | public String getLambda() {
25 | return lambda;
26 | }
27 |
28 | public void setLambda(String lambda) {
29 | this.lambda = lambda;
30 | }
31 |
32 | public String getQ() {
33 | return q;
34 | }
35 |
36 | public void setQ(String q) {
37 | this.q = q;
38 | }
39 |
40 | public String getQt() {
41 | return qt;
42 | }
43 |
44 | public void setQt(String qt) {
45 | this.qt = qt;
46 | }
47 |
48 | public String getqT() {
49 | return qT;
50 | }
51 |
52 | public void setqT(String qT) {
53 | this.qT = qT;
54 | }
55 |
56 | public String getLzConst() {
57 | return lzConst;
58 | }
59 |
60 | public void setLzConst(String lzConst) {
61 | this.lzConst = lzConst;
62 | }
63 |
64 | public String getEps() {
65 | return eps;
66 | }
67 |
68 | public void setEps(String eps) {
69 | this.eps = eps;
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/model/Fdtd2Darguments.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.model;
2 |
3 | public class Fdtd2Darguments {
4 |
5 | private String lambda;
6 | private String q; // число узлов сеточной области на длину волны (по пространству)
7 | private String qt; // число узлов сеточной области на длину волны (по времени)
8 | private String qT; // "длительность" запускаемого цуга в длинах волн
9 | private String lzConst; // "длительность" запускаемого цуга в длинах волн
10 | private String lyConst; // "длительность" запускаемого цуга в длинах волн
11 | private String eps; // распространение в кварце
12 |
13 | public Fdtd2Darguments() {
14 | }
15 |
16 | public Fdtd2Darguments(String lambda, String q, String qt, String qT, String lzConst, String lyConst, String eps) {
17 | this.lambda = lambda;
18 | this.q = q;
19 | this.qt = qt;
20 | this.qT = qT;
21 | this.lzConst = lzConst;
22 | this.lyConst = lyConst;
23 | this.eps = eps;
24 | }
25 |
26 | public String getLambda() {
27 | return lambda;
28 | }
29 |
30 | public void setLambda(String lambda) {
31 | this.lambda = lambda;
32 | }
33 |
34 | public String getQ() {
35 | return q;
36 | }
37 |
38 | public void setQ(String q) {
39 | this.q = q;
40 | }
41 |
42 | public String getQt() {
43 | return qt;
44 | }
45 |
46 | public void setQt(String qt) {
47 | this.qt = qt;
48 | }
49 |
50 | public String getqT() {
51 | return qT;
52 | }
53 |
54 | public void setqT(String qT) {
55 | this.qT = qT;
56 | }
57 |
58 | public String getLyConst() {
59 | return lyConst;
60 | }
61 |
62 | public void setLyConst(String lyConst) {
63 | this.lyConst = lyConst;
64 | }
65 |
66 | public String getLzConst() {
67 | return lzConst;
68 | }
69 |
70 | public void setLzConst(String lzConst) {
71 | this.lzConst = lzConst;
72 | }
73 |
74 | public String getEps() {
75 | return eps;
76 | }
77 |
78 | public void setEps(String eps) {
79 | this.eps = eps;
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/model/Fdtd3Darguments.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.model;
2 |
3 | public class Fdtd3Darguments {
4 |
5 | private String lambda;
6 | private String q; // число узлов сеточной области на длину волны (по пространству)
7 | private String qt; // число узлов сеточной области на длину волны (по времени)
8 | private String qT; // "длительность" запускаемого цуга в длинах волн
9 | private String lxConst; // "длительность" запускаемого цуга в длинах волн
10 | private String lyConst; // "длительность" запускаемого цуга в длинах волн
11 | private String lzConst; // "длительность" запускаемого цуга в длинах волн
12 | private String eps; // распространение в кварце
13 |
14 | public Fdtd3Darguments() {
15 | }
16 |
17 | public Fdtd3Darguments(String lambda, String q, String qt, String qT, String lxConst, String lyConst, String lzConst, String eps) {
18 | this.lambda = lambda;
19 | this.q = q;
20 | this.qt = qt;
21 | this.qT = qT;
22 | this.lxConst = lxConst;
23 | this.lyConst = lyConst;
24 | this.lzConst = lzConst;
25 | this.eps = eps;
26 | }
27 |
28 | public String getLambda() {
29 | return lambda;
30 | }
31 |
32 | public void setLambda(String lambda) {
33 | this.lambda = lambda;
34 | }
35 |
36 | public String getQ() {
37 | return q;
38 | }
39 |
40 | public void setQ(String q) {
41 | this.q = q;
42 | }
43 |
44 | public String getQt() {
45 | return qt;
46 | }
47 |
48 | public void setQt(String qt) {
49 | this.qt = qt;
50 | }
51 |
52 | public String getqT() {
53 | return qT;
54 | }
55 |
56 | public void setqT(String qT) {
57 | this.qT = qT;
58 | }
59 |
60 | public String getLxConst() {
61 | return lxConst;
62 | }
63 |
64 | public void setLxConst(String lxConst) {
65 | this.lxConst = lxConst;
66 | }
67 |
68 | public String getLyConst() {
69 | return lyConst;
70 | }
71 |
72 | public void setLyConst(String lyConst) {
73 | this.lyConst = lyConst;
74 | }
75 |
76 | public String getLzConst() {
77 | return lzConst;
78 | }
79 |
80 | public void setLzConst(String lzConst) {
81 | this.lzConst = lzConst;
82 | }
83 |
84 | public String getEps() {
85 | return eps;
86 | }
87 |
88 | public void setEps(String eps) {
89 | this.eps = eps;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/service/FdtdExecutorService.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.service;
2 |
3 | import com.aerospace.university.matlab_executor.model.Fdtd1Darguments;
4 | import com.aerospace.university.matlab_executor.model.Fdtd2Darguments;
5 | import com.aerospace.university.matlab_executor.model.Fdtd3Darguments;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.beans.factory.annotation.Value;
8 | import org.springframework.stereotype.Service;
9 |
10 | import java.io.IOException;
11 |
12 | @Service
13 | public class FdtdExecutorService {
14 |
15 | private final FileHandlerService fileHandlerService;
16 |
17 | @Value("${matlabPath}")
18 | private String matlabPath;
19 |
20 | @Value("${fdtdScriptsPath}")
21 | private String scriptFolderPath;
22 |
23 | @Value("${fdtdScripts.1d}")
24 | private String fdtd1D;
25 |
26 | @Value("${fdtdScripts.2d}")
27 | private String fdtd2D;
28 |
29 | @Value("${fdtdScripts.3d}")
30 | private String fdtd3D;
31 |
32 | @Autowired
33 | public FdtdExecutorService(FileHandlerService fileHandlerService) {
34 | this.fileHandlerService = fileHandlerService;
35 | }
36 |
37 | public void executeFdtd1d(Fdtd1Darguments fdtd1Darguments) throws IOException {
38 | String command = String.format("%s -nodisplay -nosplash -nodesktop -r \"cd('%s'); calculateFdtd(%s, %s, %s, %s, %s);\"",
39 | matlabPath, scriptFolderPath, fdtd1Darguments.getLambda(), fdtd1Darguments.getQ(), fdtd1Darguments.getQt(),
40 | fdtd1Darguments.getqT(), fdtd1Darguments.getLzConst());
41 | this.execute(fdtd1D, command, fdtd1Darguments.getEps());
42 | }
43 |
44 | public void executeFdtd2d(Fdtd2Darguments fdtd2Darguments) throws IOException {
45 | String command = String.format("%s -nodisplay -nosplash -nodesktop -r \"cd('%s'); calculateFdtd(%s, %s, %s, %s, %s, %s);\"",
46 | matlabPath, scriptFolderPath,
47 | fdtd2Darguments.getLambda(), fdtd2Darguments.getQ(), fdtd2Darguments.getQt(), fdtd2Darguments.getqT(),
48 | fdtd2Darguments.getLyConst(), fdtd2Darguments.getLzConst());
49 | this.execute(fdtd2D, command, fdtd2Darguments.getEps());
50 | }
51 |
52 | public void executeFdtd3d(Fdtd3Darguments fdtd3Darguments) throws IOException {
53 | String command = String.format("%s -nodisplay -nosplash -nodesktop -r \"cd('%s'); calculateFdtd(%s, %s, %s, %s, %s, %s);\"",
54 | matlabPath, scriptFolderPath, fdtd3Darguments.getLambda(), fdtd3Darguments.getQ(), fdtd3Darguments.getQt(),
55 | fdtd3Darguments.getqT(),
56 | fdtd3Darguments.getLyConst(), fdtd3Darguments.getLzConst());
57 | this.execute(fdtd3D, command, fdtd3Darguments.getEps());
58 | }
59 |
60 | private void execute(String programName, String command, String eps) throws IOException {
61 | String textProgram = fileHandlerService.read(scriptFolderPath + programName);
62 | textProgram = fileHandlerService.replace(textProgram, "epsValue", eps);
63 | fileHandlerService.write(textProgram, scriptFolderPath + "calculateFdtd.m");
64 | Runtime run = Runtime.getRuntime();
65 | run.exec(command);
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/main/java/com/aerospace/university/matlab_executor/service/FileHandlerService.java:
--------------------------------------------------------------------------------
1 | package com.aerospace.university.matlab_executor.service;
2 |
3 | import org.springframework.stereotype.Service;
4 |
5 | import java.io.IOException;
6 | import java.nio.file.Files;
7 | import java.nio.file.Paths;
8 |
9 | @Service
10 | public class FileHandlerService {
11 |
12 | public String read(String filePath) throws IOException {
13 | return new String(Files.readAllBytes(Paths.get(filePath)));
14 | }
15 |
16 | public void write(String data, String filePath) throws IOException {
17 | Files.write(Paths.get(filePath), data.getBytes());
18 | }
19 |
20 | public String replace(String text, String oldWord, String newWord) {
21 | return text.replace(oldWord, newWord);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | matlabPath: D:\\Programs\\matlab\\bin\\matlab.exe
2 | scriptFolderPath: C:\\Users\\Zufar\\Desktop\\script\\
3 | fdtdScriptsPath: src/main/resources/scripts/
4 | fdtdScripts:
5 | 1d: calculateFdtd1d.m
6 | 2d: calculateFdtd2d.m
7 | 3d: calculateFdtd3d.m
8 | spring:
9 | freemarker:
10 | template-loader-path: classpath:/templates
11 | suffix: .ftl
12 |
--------------------------------------------------------------------------------
/src/main/resources/scripts/calculateFdtd1d.m:
--------------------------------------------------------------------------------
1 | function calculateFdtd(lambdaValue, QValue, QtValue, QTValue, LzConst)
2 | % электромагнитные константы (пространственные величины измер¤ютс¤ в микронах)
3 | cc=2.99792458e14; % скорость света в вакууме
4 | EPSo=8.8541878174e-18; % диэлектрическа¤ константа
5 | MUo=1.2566370614e-12; % магнитна¤ константа
6 |
7 | % параметры среды
8 | lambda=lambdaValue; % длина волны
9 | Lz=LzConst*lambda; % линейные размеры области в длинах волн
10 |
11 | % дискретизаци¤ сетки по пространству
12 | Q =QValue; % число узлов сеточной области на длину волны (по пространству)
13 | Qt=QtValue; % число узлов сеточной области на длину волны (по времени)
14 | QT=QTValue; % "длительность" запускаемого цуга в длинах волн
15 |
16 | Nz=fix(Lz*Q)+1; % длина сеточной области в узлах (по пространству)
17 | Nt=fix(Qt*QT); % дискретизаци¤ сетки по времени
18 | hz=Lz/(Nz-1); % шаг по пространству
19 | ht=lambda/Qt/cc; % шаг по времени
20 | Izl=fix(Nz/2); % нахождение источника излучени¤ дл¤ "жесткого" излучающего услови¤
21 |
22 | % константы разностной схемы
23 | c1=ht/hz/MUo; c4=ht/hz/EPSo; c5=2*pi*ht*cc/lambda;
24 |
25 | % создание полей
26 | Ex=zeros(1,Nz); Hy=zeros(1,Nz-1);
27 | Eps=epsValue; % распространение в кварце
28 |
29 | A=exp(0.0*i); % комплексна¤ амплитуда падающей волны
30 |
31 | % разностна¤ схема Yee
32 | for t=1:Nt
33 | Hy=Hy-c1*(Ex(2:Nz)-Ex(1:Nz-1)); % поиск Hy
34 | Ex(2:Nz-1)=Ex(2:Nz-1)-c4*(Hy(2:Nz-1)-Hy(1:Nz-2))./Eps(2:Nz-1); % поиск Ex
35 |
36 | Ex(Izl)=real(A*exp(-i*(c5*t-pi/2))); % "жесткий" источник
37 | end
38 |
39 | plot(Ex); grid on; % вывод результата
40 | end
--------------------------------------------------------------------------------
/src/main/resources/scripts/calculateFdtd2d.m:
--------------------------------------------------------------------------------
1 | % САМАЯ ПРОСТАЯ ПРОГРАММКА FDTD-МЕТОДА (ДВУМЕРНЫЙ СЛУЧАЙ)
2 |
3 | function calculateFdtd(lambdaValue, QValue, QtValue, QTValue, LyConst, LzConst)
4 |
5 | % электромагнитные константы (все отнесено к микрону)
6 | lv=2.99792458e14; % скорость света в вакууме
7 | EPSo=8.8541878174e-18; % диэлектрическая константа
8 | MUo=1.2566370614e-12; % магнитная константа
9 |
10 | % параметры среды
11 | lambda=lambdaValue; % длина падающей волны в микронах
12 | Ly=LyConst*lambda; Lz=LzConst*lambda; % линейные размеры области
13 |
14 | % дискретизация сетки по пространству и времени
15 | Q =QValue; % число узлов сеточной области на длину волны (по пространству)
16 | Qt=QtValue; % число узлов сеточной области на длину волны (по времени)
17 | QT=QTValue; % "длительность" запускаемого цуга в длинах волн
18 |
19 | Ny=fix(Ly*Q)+1; Nz=fix(Lz*Q)+1; % длина сеточной области в узлах (по пространству)
20 | Nt=fix(Qt*QT); % дискретизация сетки по времени
21 | hy=Ly/(Ny-1); hz=Lz/(Nz-1); % шаги по пространству
22 | ht=lambda/Qt/lv; % шаг по времени
23 | locy=fix(Ny/2)+1; locz=fix(Nz/2)+1; % нахождение источника излучения
24 |
25 | % шаги схемы и константы
26 | c1=ht/hz/MUo; c2=ht/hy/MUo; c3=ht/hy/EPSo; c4=ht/hz/EPSo; c5=2*pi*ht*lv/lambda;
27 |
28 | % создание полей
29 | Ex=zeros(Ny,Nz); Hy=zeros(Ny-2,Nz-1); Hz=zeros(Ny-1,Nz-2);
30 | Eps=epsValue; % распространение происходит в кварце
31 |
32 | A=exp(0.0*i); % комплексная амплитуда падающей волны
33 |
34 | % разностная схема Yee
35 | for t=1:Nt
36 | Hy=Hy-c1*(Ex(2:Ny-1,2:Nz)-Ex(2:Ny-1,1:Nz-1)); % поиск Hy
37 | Hz=Hz+c2*(Ex(2:Ny,2:Nz-1)-Ex(1:Ny-1,2:Nz-1)); % поиск Hz
38 | Ex(2:Ny-1,2:Nz-1)=Ex(2:Ny-1,2:Nz-1)+(c3*(Hz(2:Ny-1,1:Nz-2)-Hz(1:Ny-2,1:Nz-2))- ...
39 | c4*(Hy(1:Ny-2,2:Nz-1)-Hy(1:Ny-2,1:Nz-2)))./Eps(2:Ny-1,2:Nz-1); % поиск Ex
40 |
41 | Ex(locy,locz)=real(A*exp(-i*(c5*t-pi/2))); % условие излучения плоской волны с равномерным фронтом и пропусканием отраженной волны
42 | end
43 |
44 | imagesc(Ex); colorbar; % вывод электрического поля
45 |
46 | end
--------------------------------------------------------------------------------
/src/main/resources/scripts/calculateFdtd3d.m:
--------------------------------------------------------------------------------
1 | % САМАЯ ПРОСТАЯ ПРОГРАММКА FDTD-МЕТОДА (ТРЕХМЕРНЫЙ СЛУЧАЙ)
2 |
3 | function calculateFdtd(lambdaValue, QValue, QtValue, QTValue, LxConst, LyConst, LzConst)
4 | % очистка памяти
5 | % электромагнитные константы (все отнесено к микрону)
6 | lv=2.99792458e14; % скорость света в вакууме
7 | EPSo=8.8541878174e-18; % диэлектрическая константа
8 | MUo=1.2566370614e-12; % магнитная константа
9 |
10 | % параметры среды
11 | lambda=lambdaValue; % длина падающей волны в микронах
12 | Lx=LxConst*lambda; Ly=LyConst*lambda; Lz=LzConst*lambda; % линейные размеры области
13 |
14 | % дискретизация сетки по пространству и времени
15 | Q =QValue; % число узлов сеточной области на длину волны (по пространству)
16 | Qt=QtValue; % число узлов сеточной области на длину волны (по времени)
17 | QT=QTValue; % "длительность" запускаемого цуга в длинах волн
18 |
19 | Nx=fix(Ly*Q)+1; Ny=fix(Ly*Q)+1; Nz=fix(Lz*Q)+1; % длина сеточной области в узлах (по пространству)
20 | Nt=fix(Qt*QT); % дискретизация сетки по времени
21 | hx=Lx/(Nx-1); hy=Ly/(Ny-1); hz=Lz/(Nz-1); % шаги по пространству
22 | ht=lambda/Qt/lv; % шаг по времени
23 | locx=fix(Nx/2)+1; locy=fix(Ny/2)+1; locz=fix(Nz/2)+1; % нахождение источника излучения
24 |
25 | ie=Nx-1; %number of grid cells and Ex samples along x-direction
26 | je=Ny-1; %number of grid cells and Ey samples along y-direction
27 | ke=Nz-1; %number of grid cells and Ez samples along z-direction
28 |
29 | ib=Nx; %grid boundary coordinates
30 | jb=Ny;
31 | kb=Nz;
32 |
33 | Ex=zeros(ie,jb,kb);
34 | Ey=zeros(ib,je,kb);
35 | Ez=zeros(ib,jb,ke);
36 | Hx=zeros(ib,je,ke);
37 | Hy=zeros(ie,jb,ke);
38 | Hz=zeros(ie,je,kb);
39 |
40 | % шаги схемы и константы
41 | c1=ht/MUo; c2=ht/EPSo; c5=2*pi*ht*lv/lambda;
42 |
43 | % создание полей
44 |
45 | epsilon=epsValue; % распространение происходит флинт стекле
46 |
47 | A=exp(0.0*i); % комплексная амплитуда падающей волны
48 |
49 | % разностная схема Yee
50 | for t=1:Nt
51 | %***********************************************************************
52 | % Update magnetic fields
53 | %***********************************************************************
54 |
55 | Hx(2:ie,1:je,1:ke)=Hx(2:ie,1:je,1:ke)+...
56 | c1*((Ey(2:ie,1:je,2:kb)-Ey(2:ie,1:je,1:ke))/hz+...
57 | (Ez(2:ie,1:je,1:ke)-Ez(2:ie,2:jb,1:ke))/hy);
58 |
59 | Hy(1:ie,2:je,1:ke)=Hy(1:ie,2:je,1:ke)+...
60 | c1*((Ex(1:ie,2:je,1:ke)-Ex(1:ie,2:je,2:kb))/hz+...
61 | (Ez(2:ib,2:je,1:ke)-Ez(1:ie,2:je,1:ke))/hx);
62 |
63 | Hz(1:ie,1:je,2:ke)=Hz(1:ie,1:je,2:ke)+...
64 | c1*((Ex(1:ie,2:jb,2:ke)-Ex(1:ie,1:je,2:ke))/hy+...
65 | (Ey(1:ie,1:je,2:ke)-Ey(2:ib,1:je,2:ke))/hx);
66 |
67 | %***********************************************************************
68 | % Update electric fields
69 | %***********************************************************************
70 |
71 | Ex(1:ie,2:je,2:ke)=Ex(1:ie,2:je,2:ke)+...
72 | c2*((Hz(1:ie,2:je,2:ke)-Hz(1:ie,1:je-1,2:ke))/hy+...
73 | (Hy(1:ie,2:je,1:ke-1)-Hy(1:ie,2:je,2:ke))/hz)./epsilon(1:ie,2:je,2:ke);
74 |
75 | Ey(2:ie,1:je,2:ke)=Ey(2:ie,1:je,2:ke)+...
76 | c2*((Hx(2:ie,1:je,2:ke)-Hx(2:ie,1:je,1:ke-1))/hz+...
77 | (Hz(1:ie-1,1:je,2:ke)-Hz(2:ie,1:je,2:ke))/hx)./epsilon(2:ie,1:je,2:ke);
78 |
79 | Ez(2:ie,2:je,1:ke)=Ez(2:ie,2:je,1:ke)+...
80 | c2*((Hx(2:ie,1:je-1,1:ke)-Hx(2:ie,2:je,1:ke))/hy+...
81 | (Hy(2:ie,2:je,1:ke)-Hy(1:ie-1,2:je,1:ke))/hx)./epsilon(2:ie,2:je,1:ke);
82 |
83 | Ex(locx,locy,locz)=real(A*exp(-i*(c5*t-pi/2))); % условие излучения волны
84 | end
85 |
86 | imagesc(Ex(:,:,fix(Nz/2))); colorbar; % вывод электрического поля
87 | end
--------------------------------------------------------------------------------
/src/main/resources/templates/fdtd1dView.ftl:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/main/resources/templates/fdtd2dView.ftl:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/main/resources/templates/fdtd3dView.ftl:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------