package com.miniframe.bisiness.mdo; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import com.fasterxml.jackson.core.JsonProcessingException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; import com.miniframe.core.ExecProcessFlow; import com.miniframe.core.exception.BusinessException; import com.miniframe.core.ext.UtilTools; import com.miniframe.generate.business.mdo.model.MDO0039BaseModel; import com.miniframe.mdo.service.LogService; import com.miniframe.model.mdo.*; import com.miniframe.model.mdo.dao.MdoProComvalMapper; import com.miniframe.model.mdo.dao.MdoProPythonMapper; import com.miniframe.model.mdo.dao.MdoProjectMapper; import com.miniframe.modo.temp.TemplateGenerator; import com.miniframe.modo.temp.cpacs.CpacsVo; import com.miniframe.modo.temp.problem.ProblemVo; import com.miniframe.modo.temp.problem.Solver; import com.miniframe.modo.temp.problem.WorkflowVo; import com.miniframe.tools.XIFileUtils; import com.miniframe.tools.XiJsonUtil; import com.miniframe.tools.docker.DockerExe; import com.miniframe.tools.file.*; import com.sun.media.sound.AiffFileReader; import freemarker.template.Configuration; import freemarker.template.Template; import lombok.SneakyThrows; import tk.mybatis.mapper.util.StringUtil; /** * 西工大系统,“新版求解v2”逻辑处理(重新生成不覆盖)。 */ public class MDO0039Service extends MDO0039BaseModel implements ExecProcessFlow { private static final long serialVersionUID = -7051358269847459502L; /** * 西工大系统,“新版求解v2”业务核心处理 */ public void transExecute() throws Exception { String pid = this.getA_mdo0039().getPid(); MdoProjectMapper proDao = UtilTools.getBean(MdoProjectMapper.class); MdoProject pro =proDao.selectByPrimaryKey(pid); if(pro==null){ throw new BusinessException("MDO000001"); } //创建文件路径 XIFileUtils.mkdir(LogService.BPATH); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in"); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/out"); File nsga2_history1 =new File(LogService.BPATH+"/"+pro.getId()+"/out/nsga2_history1.txt"); if(!nsga2_history1.exists()){ nsga2_history1.createNewFile(); } File nsga2_history2 =new File(LogService.BPATH+"/"+pro.getId()+"/out/nsga2_history2.txt"); if(!nsga2_history2.exists()){ nsga2_history2.createNewFile(); } //日志文件清空 LogService.clearLog(pid); ProblemVo provo = TemplateGenerator.findProblemVo(pid); CpacsVo cspvo = TemplateGenerator.getCpacsVo(pid); WorkflowVo wvo = TemplateGenerator.getWorkflowVo(pid); //创建cpace String cpacsPath =TemplateGenerator.createcCpacsXml(pid,cspvo); if(cspvo.getXfoil()!=null){//workflow 求解器 //创建workflow String workflowPath =TemplateGenerator.createcWorkflowXml(pid,wvo); List solvers =new ArrayList<>(); Solver solver =new Solver(); solver.setWorkflowPath(workflowPath); solver.setCpacsPath(cpacsPath); solvers.add(solver); provo.setSolvers(solvers); //创建problem.xml TemplateGenerator.createProblemXml(pid,provo); //创建run.py TemplateGenerator.createRunpy2(pid); run2(pid); }else if(cspvo.getAdflow()!=null){ //adflow 求解器 //创建adflow String workflowPath =TemplateGenerator.createcWorkflowXml2(pid,wvo); List solvers =new ArrayList<>(); Solver solver =new Solver(); solver.setWorkflowPath(workflowPath); solver.setCpacsPath(cpacsPath); solvers.add(solver); provo.setSolvers(solvers); //文件迁移 XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model"); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model"); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic"); XIFileUtils.mkdir(LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic"); String xyzfid=cspvo.getFfd().getFid(); String gid =cspvo.getAdflow().getFid(); String xyzFile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(xyzfid); String gfile = XIFileUtils.getRootPathStr()+"/"+XIFileUtils.getFileUrl(gid); XIFileUtils.fileCopy(xyzFile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getFfd().getFname()); XIFileUtils.fileCopy(gfile,LogService.BPATH+"/"+pro.getId()+"/in/model/aerodynamic/"+cspvo.getAdflow().getGridfile()); //创建problem.xml TemplateGenerator.createProblemXml(pid,provo); //创建run.py TemplateGenerator.createRunpy2(pid); run3(pid); }else{ if(StringUtil.isEmpty(pro.getStype())){ throw new BusinessException("MDO000011"); } //TODO 目前只有函数求解器 MdoProjectMapper pDao = UtilTools.getBean(MdoProjectMapper.class); MdoProject p = pDao.selectByPrimaryKey(pid); List solvers =new ArrayList<>(); //ptyon py.py 文件 写入 String ppPath=TemplateGenerator.writePython(pid); if(!StringUtil.isEmpty(ppPath)){ Solver solver =new Solver(); solver.setPythonPath(ppPath); solver.setStype(p.getStype()); solvers.add(solver); } provo.setSolvers(solvers); //创建problem.xml TemplateGenerator.createProblemXml(pid,provo); //创建run.py TemplateGenerator.createRunpy(pid); run(pid,pro.getStype()); } } private void run3(String pid) throws Exception { MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class); MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder(); MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria(); sc.andPidEqualTo(pid); comvalDao.deleteByExample(sb); FileMonitor surrMonitor = new FileMonitor(1000); SurromdaoFileListener t= new SurromdaoFileListener(pid); surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t); surrMonitor.start(); // // FileMonitor aifoilMonitor = new FileMonitor(1000); // AirfoilFileListener airfoilFileListener= new AirfoilFileListener(pid); // aifoilMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", airfoilFileListener); // aifoilMonitor.start(); // // FileMonitor cpMonitor = new FileMonitor(1000); // CpFileListener cpFileListener= new CpFileListener(pid); // cpMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", cpFileListener); // cpMonitor.start(); LogService.addLog(pid,"求解——————————————————开始"); DockerExe.stopDocker(pid); DockerExe.runMdo2(pid); final int[] con = {0}; final String[] line = {""}; CompletableFuture cf = CompletableFuture.supplyAsync(()-> {try { DockerExe.getDockerLogs(pid,new ResultCallback.Adapter() { @Override public void onNext(Frame frame) { if(con[0] <100){ line[0]+=new String(frame.getPayload()); con[0]++; }else{ LogService.addLog(pid, line[0]); line[0]=""; con[0] =0; } LogService.addLog(pid, new String(frame.getPayload())); System.out.print(new String(frame.getPayload())); super.onNext(frame); } @Override public void onError(Throwable throwable) { System.err.println("日志获取失败"); LogService.addLog(pid, line[0]); throwable.printStackTrace(); super.onError(throwable); } @Override public void onComplete() { System.out.println("日志获取完成"); LogService.addLog(pid, line[0]); super.onComplete(); } }); LogService.addLog(pid,"求解——————————————————成功"); } catch (Exception e) { LogService.addLog(pid,"求解——————————————————失败"); e.printStackTrace(); } try { surrMonitor.stop(); SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid); // aifoilMonitor.stop(); // AirfoilFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/airfoil.dat"),pid); // cpMonitor.stop(); // CpFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/cp.dat"),pid); } catch (Exception e) { e.printStackTrace(); } return null; }); } private void run2(String pid) throws Exception { MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class); MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder(); MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria(); sc.andPidEqualTo(pid); comvalDao.deleteByExample(sb); FileMonitor surrMonitor = new FileMonitor(1000); SurromdaoFileListener t= new SurromdaoFileListener(pid); surrMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0", t); surrMonitor.start(); FileMonitor aifoilMonitor = new FileMonitor(1000); AirfoilFileListener airfoilFileListener= new AirfoilFileListener(pid); aifoilMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", airfoilFileListener); aifoilMonitor.start(); FileMonitor cpMonitor = new FileMonitor(1000); CpFileListener cpFileListener= new CpFileListener(pid); cpMonitor.monitor("/cephfs/mdo/"+pid+"/in/myid_0/xfoil", cpFileListener); cpMonitor.start(); LogService.addLog(pid,"求解——————————————————开始"); DockerExe.stopDocker(pid); DockerExe.runMdo3(pid); final int[] con = {0}; final String[] line = {""}; CompletableFuture cf = CompletableFuture.supplyAsync(()-> {try { DockerExe.getDockerLogs(pid,new ResultCallback.Adapter() { @Override public void onNext(Frame frame) { if(con[0] <100){ line[0]+=new String(frame.getPayload()); con[0]++; }else{ LogService.addLog(pid, line[0]); line[0]=""; con[0] =0; } LogService.addLog(pid, new String(frame.getPayload())); System.out.print(new String(frame.getPayload())); super.onNext(frame); } @Override public void onError(Throwable throwable) { System.err.println("日志获取失败"); LogService.addLog(pid, line[0]); throwable.printStackTrace(); super.onError(throwable); } @Override public void onComplete() { System.out.println("日志获取完成"); LogService.addLog(pid, line[0]); super.onComplete(); } }); LogService.addLog(pid,"求解——————————————————成功"); } catch (Exception e) { LogService.addLog(pid,"求解——————————————————失败"); e.printStackTrace(); } try { surrMonitor.stop(); SurromdaoFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/surromdao_history_all.dat"),pid); aifoilMonitor.stop(); AirfoilFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/airfoil.dat"),pid); cpMonitor.stop(); CpFileRead.readFile(new File("/cephfs/mdo/"+pid+"/in/myid_0/xfoil/cp.dat"),pid); } catch (Exception e) { e.printStackTrace(); } return null; }); } //异步执行 @SneakyThrows public void run(String pid ,String stype)throws Exception{ MdoProComvalMapper comvalDao =UtilTools.getBean(MdoProComvalMapper.class); MdoProComvalSQLBuilder sb =new MdoProComvalSQLBuilder(); MdoProComvalSQLBuilder.Criteria sc = sb.createCriteria(); sc.andPidEqualTo(pid); comvalDao.deleteByExample(sb); LogService.addLog(pid,"求解——————————————————开始"); DockerExe.stopDocker(pid); DockerExe.runMdo(pid); CompletableFuture cf = CompletableFuture.supplyAsync(()-> {try { DockerExe.getDockerLogs(pid,new ResultCallback.Adapter() { @Override public void onNext(Frame frame) { String line =new String(frame.getPayload()); LogService.addLog(pid,line); System.out.print(new String(frame.getPayload())); super.onNext(frame); } @Override public void onError(Throwable throwable) { System.err.println("日志获取失败"); throwable.printStackTrace(); super.onError(throwable); } @Override public void onComplete() { System.out.println("日志获取完成"); super.onComplete(); } }); LogService.addLog(pid,"求解——————————————————成功"); } catch (Exception e) { LogService.addLog(pid,"求解——————————————————失败"); e.printStackTrace(); } return null; }); } private void saveNsga2_history2(String pid, String stype, MdoProComvalMapper comvalDao) { //保存数据 if("Forrester".equals(stype)||"Branin".equals(stype)||"Rastrigin".equals(stype) ||"Rosenbrock".equals(stype)||"G9".equals(stype) ){ String postFile = "/cephfs/mdo/"+ pid +"/out/nsga2_history2.txt"; try (BufferedReader br = new BufferedReader(new FileReader(postFile))) { String x_name=""; String line; int step = 0; while ((line = br.readLine()) != null) { if(line.trim().startsWith("variables")){ x_name = line.split("=")[1].replace(" ",""); }else if(line.trim().matches("\\d.*")){//数字开头 step++; String tvals =line.trim().replaceAll("\\s+"," ");//替换多个空格为一个空格 MdoProComval comval =new MdoProComval(); comval.setId(UtilTools.getUUid()); comval.setPid(pid); comval.setStep(String.valueOf(step)); comval.setVars(x_name); comval.setVals(tvals); comvalDao.insert(comval); } } }catch (Exception e){ } } } /** * 西工大系统,“新版求解v2”业务前处理 */ public void preTransFlow() throws Exception { this.validater(); } /** * 西工大系统,“新版求解v2”业务后处理 */ public void afterTransFlow() throws Exception { } /** * 西工大系统,“新版求解v2”逻辑入口处理方法 */ @SuppressWarnings("rawtypes") @Override public Map execute(Map vars) throws Exception { this.setTransMap(vars); preTransFlow();// 执行业务开始的规则检查和校验 transExecute();// 执行核心业务段 afterTransFlow();// 执行核心逻辑完成后的收尾逻辑 return this.getTransMap(); } }