123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- 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<Solver> 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<Solver> 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<Solver> 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<Void> cf = CompletableFuture.supplyAsync(()-> {try {
- DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
- @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<Void> cf = CompletableFuture.supplyAsync(()-> {try {
- DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
- @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<Void> cf = CompletableFuture.supplyAsync(()-> {try {
- DockerExe.getDockerLogs(pid,new ResultCallback.Adapter<Frame>() {
- @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();
- }
- }
|