MDO0039Service.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. package com.miniframe.bisiness.mdo;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.concurrent.CompletableFuture;
  8. import com.fasterxml.jackson.core.JsonProcessingException;
  9. import com.github.dockerjava.api.async.ResultCallback;
  10. import com.github.dockerjava.api.model.Frame;
  11. import com.miniframe.core.ExecProcessFlow;
  12. import com.miniframe.core.exception.BusinessException;
  13. import com.miniframe.core.ext.UtilTools;
  14. import com.miniframe.generate.business.mdo.model.MDO0039BaseModel;
  15. import com.miniframe.mdo.service.LogService;
  16. import com.miniframe.model.mdo.*;
  17. import com.miniframe.model.mdo.dao.MdoProComvalMapper;
  18. import com.miniframe.model.mdo.dao.MdoProPythonMapper;
  19. import com.miniframe.model.mdo.dao.MdoProjectMapper;
  20. import com.miniframe.modo.temp.TemplateGenerator;
  21. import com.miniframe.modo.temp.cpacs.CpacsVo;
  22. import com.miniframe.modo.temp.problem.ProblemVo;
  23. import com.miniframe.modo.temp.problem.Solver;
  24. import com.miniframe.modo.temp.problem.WorkflowVo;
  25. import com.miniframe.tools.XIFileUtils;
  26. import com.miniframe.tools.XiJsonUtil;
  27. import com.miniframe.tools.docker.DockerExe;
  28. import com.miniframe.tools.file.*;
  29. import com.sun.media.sound.AiffFileReader;
  30. import freemarker.template.Configuration;
  31. import freemarker.template.Template;
  32. import lombok.SneakyThrows;
  33. import tk.mybatis.mapper.util.StringUtil;
  34. /**
  35. * 西工大系统,“新版求解v2”逻辑处理(重新生成不覆盖)。
  36. */
  37. public class MDO0039Service extends MDO0039BaseModel implements ExecProcessFlow {
  38. private static final long serialVersionUID = -7051358269847459502L;
  39. /**
  40. * 西工大系统,“新版求解v2”业务核心处理
  41. */
  42. public void transExecute() throws Exception {
  43. String pid = this.getA_mdo0039().getPid();
  44. MdoProjectMapper proDao = UtilTools.getBean(MdoProjectMapper.class);
  45. MdoProject pro =proDao.selectByPrimaryKey(pid);
  46. if(pro==null){
  47. throw new BusinessException("MDO000001");
  48. }
  49. //创建文件路径
  50. XIFileUtils.mkdir(LogService.BPATH);
  51. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId());
  52. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in");
  53. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/out");
  54. File nsga2_history1 =new File(LogService.BPATH+"/"+pro.getId()+"/out/nsga2_history1.txt");
  55. if(!nsga2_history1.exists()){
  56. nsga2_history1.createNewFile();
  57. }
  58. File nsga2_history2 =new File(LogService.BPATH+"/"+pro.getId()+"/out/nsga2_history2.txt");
  59. if(!nsga2_history2.exists()){
  60. nsga2_history2.createNewFile();
  61. }
  62. //日志文件清空
  63. LogService.clearLog(pid);
  64. ProblemVo provo = TemplateGenerator.findProblemVo(pid);
  65. CpacsVo cspvo = TemplateGenerator.getCpacsVo(pid);
  66. WorkflowVo wvo = TemplateGenerator.getWorkflowVo(pid);
  67. //创建cpace
  68. String cpacsPath =TemplateGenerator.createcCpacsXml(pid,cspvo);
  69. if(cspvo.getXfoil()!=null&&cspvo.getFsi()==null){//workflow 求解器
  70. //创建workflow
  71. String workflowPath =TemplateGenerator.createcWorkflowXml(pid,wvo);
  72. List<Solver> solvers =new ArrayList<>();
  73. Solver solver =new Solver();
  74. solver.setWorkflowPath(workflowPath);
  75. solver.setCpacsPath(cpacsPath);
  76. solvers.add(solver);
  77. provo.setSolvers(solvers);
  78. //创建problem.xml
  79. TemplateGenerator.createProblemXml(pid,provo);
  80. //创建run.py
  81. TemplateGenerator.createRunpy2(pid);
  82. run2(pid);
  83. }else if(cspvo.getAdflow()!=null&&cspvo.getFsi()==null){ //adflow 求解器
  84. //创建adflow
  85. String workflowPath =TemplateGenerator.createcWorkflowXml2(pid,wvo);
  86. List<Solver> solvers =new ArrayList<>();
  87. Solver solver =new Solver();
  88. solver.setWorkflowPath(workflowPath);
  89. solver.setCpacsPath(cpacsPath);
  90. solvers.add(solver);
  91. provo.setSolvers(solvers);
  92. //文件迁移
  93. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model");
  94. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model");
  95. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic");
  96. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic");
  97. String xyzfid=cspvo.getFfd().getFid();
  98. String gid =cspvo.getAdflow().getFid();
  99. String xyzFile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(xyzfid);
  100. String gfile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(gid);
  101. XIFileUtils.fileCopy(xyzFile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getFfd().getFname());
  102. XIFileUtils.fileCopy(gfile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getAdflow().getGridfile());
  103. //创建problem.xml
  104. TemplateGenerator.createProblemXml(pid,provo);
  105. //创建run.py
  106. TemplateGenerator.createRunpy2(pid);
  107. run3(pid);
  108. }else if(cspvo.getAdflow()!=null&&cspvo.getFsi()!=null){ //气弹 求解器
  109. //创建adflow
  110. String workflowPath =TemplateGenerator.createcWorkflowXml3(pid,wvo);
  111. List<Solver> solvers =new ArrayList<>();
  112. Solver solver =new Solver();
  113. solver.setWorkflowPath(workflowPath);
  114. solver.setCpacsPath(cpacsPath);
  115. solvers.add(solver);
  116. provo.setSolvers(solvers);
  117. //文件迁移
  118. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model");
  119. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model");
  120. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic");
  121. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic");
  122. String xyzfid=cspvo.getFfd().getFid();
  123. String gid =cspvo.getAdflow().getFid();
  124. String xyzFile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(xyzfid);
  125. String gfile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(gid);
  126. XIFileUtils.fileCopy(xyzFile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getFfd().getFname());
  127. XIFileUtils.fileCopy(gfile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getAdflow().getGridfile());
  128. XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/structure");
  129. String bdfid= cspvo.getTacs().getFid();
  130. String bdffile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(bdfid);
  131. XIFileUtils.fileCopy(bdffile,LogService.BPATH+"/"+pro.getId()+"/in/model/structure/"+cspvo.getTacs().getFname());
  132. //创建problem.xml
  133. TemplateGenerator.createProblemXml(pid,provo);
  134. //创建run.py
  135. TemplateGenerator.createRunpy2(pid);
  136. run2(pid);
  137. }else{
  138. if(StringUtil.isEmpty(pro.getStype())){
  139. throw new BusinessException("MDO000011");
  140. }
  141. //TODO 目前只有函数求解器
  142. MdoProjectMapper pDao = UtilTools.getBean(MdoProjectMapper.class);
  143. MdoProject p = pDao.selectByPrimaryKey(pid);
  144. List<Solver> solvers =new ArrayList<>();
  145. //ptyon py.py 文件 写入
  146. String ppPath=TemplateGenerator.writePython(pid);
  147. if(!StringUtil.isEmpty(ppPath)){
  148. Solver solver =new Solver();
  149. solver.setPythonPath(ppPath);
  150. solver.setStype(p.getStype());
  151. solvers.add(solver);
  152. }
  153. provo.setSolvers(solvers);
  154. //创建problem.xml
  155. TemplateGenerator.createProblemXml(pid,provo);
  156. //创建run.py
  157. TemplateGenerator.createRunpy(pid);
  158. run(pid,pro.getStype());
  159. }
  160. }
  161. private void run3(String pid) throws Exception {
  162. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  163. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  164. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  165. sc.andPidEqualTo(pid);
  166. comvalDao.deleteByExample(sb);
  167. FileMonitor surrMonitor = new FileMonitor(1000);
  168. SurromdaoFileListener t= new SurromdaoFileListener(pid);
  169. surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t);
  170. surrMonitor.start();
  171. FileMonitor crmMonitor = new FileMonitor(1000);
  172. CRMFileListener crml = new CRMFileListener(pid);
  173. crmMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/ADflow/results/aerodynamic", crml);
  174. crmMonitor.start();
  175. LogService.addLog(pid,"求解——————————————————开始");
  176. DockerExe.stopDocker(pid);
  177. DockerExe.runMdo2(pid);
  178. final int[] con = {0};
  179. final String[] line = {""};
  180. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  181. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  182. @Override
  183. public void onNext(Frame frame) {
  184. // if(con[0] <100){
  185. // line[0]+=new String(frame.getPayload());
  186. // con[0]++;
  187. // }else{
  188. //// LogService.addLog(pid, line[0]);
  189. // line[0]="";
  190. // con[0] =0;
  191. // }
  192. // LogService.addLog(pid, new String(frame.getPayload()));
  193. // System.out.print(new String(frame.getPayload()));
  194. super.onNext(frame);
  195. }
  196. @Override
  197. public void onError(Throwable throwable) {
  198. System.err.println("日志获取失败");
  199. // LogService.addLog(pid, line[0]);
  200. throwable.printStackTrace();
  201. super.onError(throwable);
  202. }
  203. @Override
  204. public void onComplete() {
  205. System.out.println("日志获取完成");
  206. // LogService.addLog(pid, line[0]);
  207. super.onComplete();
  208. }
  209. });
  210. LogService.addLog(pid,"求解——————————————————成功");
  211. } catch (Exception e) {
  212. LogService.addLog(pid,"求解——————————————————失败");
  213. e.printStackTrace();
  214. }
  215. try {
  216. surrMonitor.stop();
  217. SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid);
  218. crmMonitor.stop();
  219. CRMFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/ADflow/results/aerodynamic/CRM_final_000_slices.dat"),pid);
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. }
  223. return null;
  224. });
  225. }
  226. private void run2(String pid) throws Exception {
  227. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  228. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  229. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  230. sc.andPidEqualTo(pid);
  231. comvalDao.deleteByExample(sb);
  232. FileMonitor surrMonitor = new FileMonitor(1000);
  233. SurromdaoFileListener t= new SurromdaoFileListener(pid);
  234. surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t);
  235. surrMonitor.start();
  236. FileMonitor aifoilMonitor = new FileMonitor(1000);
  237. AirfoilFileListener airfoilFileListener= new AirfoilFileListener(pid);
  238. aifoilMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", airfoilFileListener);
  239. aifoilMonitor.start();
  240. FileMonitor cpMonitor = new FileMonitor(1000);
  241. CpFileListener cpFileListener= new CpFileListener(pid);
  242. cpMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", cpFileListener);
  243. cpMonitor.start();
  244. LogService.addLog(pid,"求解——————————————————开始");
  245. DockerExe.stopDocker(pid);
  246. DockerExe.runMdo3(pid);
  247. final int[] con = {0};
  248. final String[] line = {""};
  249. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  250. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  251. @Override
  252. public void onNext(Frame frame) {
  253. if(con[0] <100){
  254. line[0]+=new String(frame.getPayload());
  255. con[0]++;
  256. }else{
  257. LogService.addLog(pid, line[0]);
  258. line[0]="";
  259. con[0] =0;
  260. }
  261. LogService.addLog(pid, new String(frame.getPayload()));
  262. System.out.print(new String(frame.getPayload()));
  263. super.onNext(frame);
  264. }
  265. @Override
  266. public void onError(Throwable throwable) {
  267. System.err.println("日志获取失败");
  268. LogService.addLog(pid, line[0]);
  269. throwable.printStackTrace();
  270. super.onError(throwable);
  271. }
  272. @Override
  273. public void onComplete() {
  274. System.out.println("日志获取完成");
  275. LogService.addLog(pid, line[0]);
  276. super.onComplete();
  277. }
  278. });
  279. LogService.addLog(pid,"求解——————————————————成功");
  280. } catch (Exception e) {
  281. LogService.addLog(pid,"求解——————————————————失败");
  282. e.printStackTrace();
  283. }
  284. try {
  285. surrMonitor.stop();
  286. SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid);
  287. aifoilMonitor.stop();
  288. AirfoilFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/airfoil.dat"),pid);
  289. cpMonitor.stop();
  290. CpFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/cp.dat"),pid);
  291. } catch (Exception e) {
  292. e.printStackTrace();
  293. }
  294. return null;
  295. });
  296. }
  297. //异步执行
  298. @SneakyThrows
  299. public void run(String pid ,String stype)throws Exception{
  300. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  301. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  302. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  303. sc.andPidEqualTo(pid);
  304. comvalDao.deleteByExample(sb);
  305. LogService.addLog(pid,"求解——————————————————开始");
  306. DockerExe.stopDocker(pid);
  307. DockerExe.runMdo(pid);
  308. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  309. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  310. @Override
  311. public void onNext(Frame frame) {
  312. String line =new String(frame.getPayload());
  313. LogService.addLog(pid,line);
  314. System.out.print(new String(frame.getPayload()));
  315. super.onNext(frame);
  316. }
  317. @Override
  318. public void onError(Throwable throwable) {
  319. System.err.println("日志获取失败");
  320. throwable.printStackTrace();
  321. super.onError(throwable);
  322. }
  323. @Override
  324. public void onComplete() {
  325. System.out.println("日志获取完成");
  326. super.onComplete();
  327. }
  328. });
  329. LogService.addLog(pid,"求解——————————————————成功");
  330. } catch (Exception e) {
  331. LogService.addLog(pid,"求解——————————————————失败");
  332. e.printStackTrace();
  333. }
  334. return null;
  335. });
  336. }
  337. private void saveNsga2_history2(String pid, String stype, MdoProComvalMapper comvalDao) {
  338. //保存数据
  339. if("Forrester".equals(stype)||"Branin".equals(stype)||"Rastrigin".equals(stype)
  340. ||"Rosenbrock".equals(stype)||"G9".equals(stype)
  341. ){
  342. String postFile = "/cephfs/mdo/"+ pid +"/out/nsga2_history2.txt";
  343. try (BufferedReader br = new BufferedReader(new FileReader(postFile))) {
  344. String x_name="";
  345. String line;
  346. int step = 0;
  347. while ((line = br.readLine()) != null) {
  348. if(line.trim().startsWith("variables")){
  349. x_name = line.split("=")[1].replace(" ","");
  350. }else if(line.trim().matches("\\d.*")){//数字开头
  351. step++;
  352. String tvals =line.trim().replaceAll("\\s+"," ");//替换多个空格为一个空格
  353. MdoProComval comval =new MdoProComval();
  354. comval.setId(UtilTools.getUUid());
  355. comval.setPid(pid);
  356. comval.setStep(step);
  357. comval.setVars(x_name);
  358. comval.setVals(tvals);
  359. comvalDao.insert(comval);
  360. }
  361. }
  362. }catch (Exception e){
  363. }
  364. }
  365. }
  366. /**
  367. * 西工大系统,“新版求解v2”业务前处理
  368. */
  369. public void preTransFlow() throws Exception {
  370. this.validater();
  371. }
  372. /**
  373. * 西工大系统,“新版求解v2”业务后处理
  374. */
  375. public void afterTransFlow() throws Exception {
  376. }
  377. /**
  378. * 西工大系统,“新版求解v2”逻辑入口处理方法
  379. */
  380. @SuppressWarnings("rawtypes")
  381. @Override
  382. public Map execute(Map vars) throws Exception {
  383. this.setTransMap(vars);
  384. preTransFlow();// 执行业务开始的规则检查和校验
  385. transExecute();// 执行核心业务段
  386. afterTransFlow();// 执行核心逻辑完成后的收尾逻辑
  387. return this.getTransMap();
  388. }
  389. }