MDO0039Service.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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){//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){ //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{
  109. if(StringUtil.isEmpty(pro.getStype())){
  110. throw new BusinessException("MDO000011");
  111. }
  112. //TODO 目前只有函数求解器
  113. MdoProjectMapper pDao = UtilTools.getBean(MdoProjectMapper.class);
  114. MdoProject p = pDao.selectByPrimaryKey(pid);
  115. List<Solver> solvers =new ArrayList<>();
  116. //ptyon py.py 文件 写入
  117. String ppPath=TemplateGenerator.writePython(pid);
  118. if(!StringUtil.isEmpty(ppPath)){
  119. Solver solver =new Solver();
  120. solver.setPythonPath(ppPath);
  121. solver.setStype(p.getStype());
  122. solvers.add(solver);
  123. }
  124. provo.setSolvers(solvers);
  125. //创建problem.xml
  126. TemplateGenerator.createProblemXml(pid,provo);
  127. //创建run.py
  128. TemplateGenerator.createRunpy(pid);
  129. run(pid,pro.getStype());
  130. }
  131. }
  132. private void run3(String pid) throws Exception {
  133. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  134. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  135. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  136. sc.andPidEqualTo(pid);
  137. comvalDao.deleteByExample(sb);
  138. FileMonitor surrMonitor = new FileMonitor(1000);
  139. SurromdaoFileListener t= new SurromdaoFileListener(pid);
  140. surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t);
  141. surrMonitor.start();
  142. //
  143. // FileMonitor aifoilMonitor = new FileMonitor(1000);
  144. // AirfoilFileListener airfoilFileListener= new AirfoilFileListener(pid);
  145. // aifoilMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", airfoilFileListener);
  146. // aifoilMonitor.start();
  147. //
  148. // FileMonitor cpMonitor = new FileMonitor(1000);
  149. // CpFileListener cpFileListener= new CpFileListener(pid);
  150. // cpMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", cpFileListener);
  151. // cpMonitor.start();
  152. LogService.addLog(pid,"求解——————————————————开始");
  153. DockerExe.stopDocker(pid);
  154. DockerExe.runMdo2(pid);
  155. final int[] con = {0};
  156. final String[] line = {""};
  157. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  158. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  159. @Override
  160. public void onNext(Frame frame) {
  161. if(con[0] <100){
  162. line[0]+=new String(frame.getPayload());
  163. con[0]++;
  164. }else{
  165. LogService.addLog(pid, line[0]);
  166. line[0]="";
  167. con[0] =0;
  168. }
  169. LogService.addLog(pid, new String(frame.getPayload()));
  170. System.out.print(new String(frame.getPayload()));
  171. super.onNext(frame);
  172. }
  173. @Override
  174. public void onError(Throwable throwable) {
  175. System.err.println("日志获取失败");
  176. LogService.addLog(pid, line[0]);
  177. throwable.printStackTrace();
  178. super.onError(throwable);
  179. }
  180. @Override
  181. public void onComplete() {
  182. System.out.println("日志获取完成");
  183. LogService.addLog(pid, line[0]);
  184. super.onComplete();
  185. }
  186. });
  187. LogService.addLog(pid,"求解——————————————————成功");
  188. } catch (Exception e) {
  189. LogService.addLog(pid,"求解——————————————————失败");
  190. e.printStackTrace();
  191. }
  192. try {
  193. surrMonitor.stop();
  194. SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid);
  195. // aifoilMonitor.stop();
  196. // AirfoilFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/airfoil.dat"),pid);
  197. // cpMonitor.stop();
  198. // CpFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/cp.dat"),pid);
  199. } catch (Exception e) {
  200. e.printStackTrace();
  201. }
  202. return null;
  203. });
  204. }
  205. private void run2(String pid) throws Exception {
  206. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  207. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  208. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  209. sc.andPidEqualTo(pid);
  210. comvalDao.deleteByExample(sb);
  211. FileMonitor surrMonitor = new FileMonitor(1000);
  212. SurromdaoFileListener t= new SurromdaoFileListener(pid);
  213. surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t);
  214. surrMonitor.start();
  215. FileMonitor aifoilMonitor = new FileMonitor(1000);
  216. AirfoilFileListener airfoilFileListener= new AirfoilFileListener(pid);
  217. aifoilMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", airfoilFileListener);
  218. aifoilMonitor.start();
  219. FileMonitor cpMonitor = new FileMonitor(1000);
  220. CpFileListener cpFileListener= new CpFileListener(pid);
  221. cpMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", cpFileListener);
  222. cpMonitor.start();
  223. LogService.addLog(pid,"求解——————————————————开始");
  224. DockerExe.stopDocker(pid);
  225. DockerExe.runMdo3(pid);
  226. final int[] con = {0};
  227. final String[] line = {""};
  228. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  229. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  230. @Override
  231. public void onNext(Frame frame) {
  232. if(con[0] <100){
  233. line[0]+=new String(frame.getPayload());
  234. con[0]++;
  235. }else{
  236. LogService.addLog(pid, line[0]);
  237. line[0]="";
  238. con[0] =0;
  239. }
  240. LogService.addLog(pid, new String(frame.getPayload()));
  241. System.out.print(new String(frame.getPayload()));
  242. super.onNext(frame);
  243. }
  244. @Override
  245. public void onError(Throwable throwable) {
  246. System.err.println("日志获取失败");
  247. LogService.addLog(pid, line[0]);
  248. throwable.printStackTrace();
  249. super.onError(throwable);
  250. }
  251. @Override
  252. public void onComplete() {
  253. System.out.println("日志获取完成");
  254. LogService.addLog(pid, line[0]);
  255. super.onComplete();
  256. }
  257. });
  258. LogService.addLog(pid,"求解——————————————————成功");
  259. } catch (Exception e) {
  260. LogService.addLog(pid,"求解——————————————————失败");
  261. e.printStackTrace();
  262. }
  263. try {
  264. surrMonitor.stop();
  265. SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid);
  266. aifoilMonitor.stop();
  267. AirfoilFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/airfoil.dat"),pid);
  268. cpMonitor.stop();
  269. CpFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/cp.dat"),pid);
  270. } catch (Exception e) {
  271. e.printStackTrace();
  272. }
  273. return null;
  274. });
  275. }
  276. //异步执行
  277. @SneakyThrows
  278. public void run(String pid ,String stype)throws Exception{
  279. MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class);
  280. MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder();
  281. MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria();
  282. sc.andPidEqualTo(pid);
  283. comvalDao.deleteByExample(sb);
  284. LogService.addLog(pid,"求解——————————————————开始");
  285. DockerExe.stopDocker(pid);
  286. DockerExe.runMdo(pid);
  287. CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {try {
  288. DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
  289. @Override
  290. public void onNext(Frame frame) {
  291. String line =new String(frame.getPayload());
  292. LogService.addLog(pid,line);
  293. System.out.print(new String(frame.getPayload()));
  294. super.onNext(frame);
  295. }
  296. @Override
  297. public void onError(Throwable throwable) {
  298. System.err.println("日志获取失败");
  299. throwable.printStackTrace();
  300. super.onError(throwable);
  301. }
  302. @Override
  303. public void onComplete() {
  304. System.out.println("日志获取完成");
  305. super.onComplete();
  306. }
  307. });
  308. LogService.addLog(pid,"求解——————————————————成功");
  309. } catch (Exception e) {
  310. LogService.addLog(pid,"求解——————————————————失败");
  311. e.printStackTrace();
  312. }
  313. return null;
  314. });
  315. }
  316. private void saveNsga2_history2(String pid, String stype, MdoProComvalMapper comvalDao) {
  317. //保存数据
  318. if("Forrester".equals(stype)||"Branin".equals(stype)||"Rastrigin".equals(stype)
  319. ||"Rosenbrock".equals(stype)||"G9".equals(stype)
  320. ){
  321. String postFile = "/cephfs/mdo/"+ pid +"/out/nsga2_history2.txt";
  322. try (BufferedReader br = new BufferedReader(new FileReader(postFile))) {
  323. String x_name="";
  324. String line;
  325. int step = 0;
  326. while ((line = br.readLine()) != null) {
  327. if(line.trim().startsWith("variables")){
  328. x_name = line.split("=")[1].replace(" ","");
  329. }else if(line.trim().matches("\\d.*")){//数字开头
  330. step++;
  331. String tvals =line.trim().replaceAll("\\s+"," ");//替换多个空格为一个空格
  332. MdoProComval comval =new MdoProComval();
  333. comval.setId(UtilTools.getUUid());
  334. comval.setPid(pid);
  335. comval.setStep(String.valueOf(step));
  336. comval.setVars(x_name);
  337. comval.setVals(tvals);
  338. comvalDao.insert(comval);
  339. }
  340. }
  341. }catch (Exception e){
  342. }
  343. }
  344. }
  345. /**
  346. * 西工大系统,“新版求解v2”业务前处理
  347. */
  348. public void preTransFlow() throws Exception {
  349. this.validater();
  350. }
  351. /**
  352. * 西工大系统,“新版求解v2”业务后处理
  353. */
  354. public void afterTransFlow() throws Exception {
  355. }
  356. /**
  357. * 西工大系统,“新版求解v2”逻辑入口处理方法
  358. */
  359. @SuppressWarnings("rawtypes")
  360. @Override
  361. public Map execute(Map vars) throws Exception {
  362. this.setTransMap(vars);
  363. preTransFlow();// 执行业务开始的规则检查和校验
  364. transExecute();// 执行核心业务段
  365. afterTransFlow();// 执行核心逻辑完成后的收尾逻辑
  366. return this.getTransMap();
  367. }
  368. }