├── .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 |
2 | 3 | 4 |
5 | 6 | Одномерный случай 7 | 8 |
9 | 10 |
11 | 13 | Длина волны 14 |
15 |
16 | 17 |
18 | 19 |
20 | 22 | Число узлов сеточной области на длину волны (по пространству) 23 |
24 |
25 | 26 |
27 | 28 |
29 | 31 | Число узлов сеточной области на длину волны (по времени) 32 |
33 |
34 | 35 |
36 | 37 |
38 | 40 | "длительность" запускаемого цуга в длинах волн 41 |
42 |
43 | 44 |
45 | 46 |
47 | 49 | Распространение 50 |
51 |
52 | 53 |
54 | 55 |
56 | 58 | Линейные размеры области в длинах волн 59 |
60 |
61 | 62 |
63 | 64 |
65 | 67 |
68 |
69 |
70 |
-------------------------------------------------------------------------------- /src/main/resources/templates/fdtd2dView.ftl: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | Двумерный случай 7 | 8 |
9 | 10 |
11 | 13 | Длина волны 14 |
15 |
16 | 17 |
18 | 19 |
20 | 22 | Число узлов сеточной области на длину волны (по пространству) 23 |
24 |
25 | 26 |
27 | 28 |
29 | 31 | "длительность" запускаемого цуга в длинах волн 32 |
33 |
34 | 35 |
36 | 37 |
38 | 40 | Число узлов сеточной области на длину волны (по времени) 41 |
42 |
43 | 44 |
45 | 46 |
47 | 49 | Распространение 50 |
51 |
52 | 53 |
54 | 55 |
56 | 58 | Линейные размеры области в длинах волн 59 |
60 |
61 | 62 |
63 | 64 |
65 | 67 | Линейные размеры области в длинах волн 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 |
76 |
77 |
78 |
-------------------------------------------------------------------------------- /src/main/resources/templates/fdtd3dView.ftl: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | Трехмерный случай 7 | 8 |
9 | 10 |
11 | 13 | Длина волны 14 |
15 |
16 | 17 |
18 | 19 |
20 | 22 | Число узлов сеточной области на длину волны (по пространству) 23 |
24 |
25 | 26 |
27 | 28 |
29 | 31 | "длительность" запускаемого цуга в длинах волн 32 |
33 |
34 | 35 |
36 | 37 |
38 | 40 | Число узлов сеточной области на длину волны (по времени) 41 |
42 |
43 | 44 |
45 | 46 |
47 | 49 | Распространение 50 |
51 |
52 | 53 |
54 | 55 |
56 | 58 | Линейные размеры области в длинах волн 59 |
60 |
61 | 62 |
63 | 64 |
65 | 67 | Линейные размеры области в длинах волн 68 |
69 |
70 | 71 |
72 | 73 |
74 | 76 | Линейные размеры области в длинах волн 77 |
78 |
79 | 80 |
81 | 82 |
83 | 84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------