Przeglądaj źródła

cpacsxml 生成

huangxingxing 6 miesięcy temu
rodzic
commit
dc7454018e

+ 7 - 1
src/main/java/com/miniframe/bisiness/mdo/MDO0039Service.java

@@ -62,8 +62,14 @@ public class MDO0039Service extends MDO0039BaseModel implements ExecProcessFlow
 		if(!nsga2_history2.exists()){
 			nsga2_history2.createNewFile();
 		}
-				//日志文件清空
+		//日志文件清空
 		LogService.clearLog(pid);
+
+		//创建cpace
+		String cpacsPath =TemplateGenerator.createcCpacsXml(pid);
+		//创建workflow
+		String workflowPath =TemplateGenerator.createcWorkflowXml(pid);
+
 		//创建problem.xml
 		TemplateGenerator.createProblemXml(pid);
 		//创建run.py

+ 153 - 3
src/main/java/com/miniframe/modo/temp/TemplateGenerator.java

@@ -4,6 +4,7 @@ import com.miniframe.core.ext.UtilTools;
 import com.miniframe.mdo.service.LogService;
 import com.miniframe.model.mdo.*;
 import com.miniframe.model.mdo.dao.*;
+import com.miniframe.modo.temp.cpacs.*;
 import com.miniframe.modo.temp.problem.*;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
@@ -14,6 +15,7 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 public class TemplateGenerator {
 
@@ -90,17 +92,165 @@ public class TemplateGenerator {
      * TODO 创建 cpacsxml
      * @return
      */
-    public static String createcCpacsXml(String pid){
+    public static String createcCpacsXml(String pid)  {
+        try {
+            Configuration cfg = new Configuration(Configuration.VERSION_2_3_0);
+            // 设置模板所在目录
+            cfg.setClassForTemplateLoading(TemplateGenerator.class, "/templates");
+            // 获取模板对象
+            Template template = cfg.getTemplate("cpacs.ftl");
+            // 定义数据模型(Map)
+            Map<String, Object> dataModel = new HashMap<>();
+            CpacsVo vo = new CpacsVo();
+            HeaderVo header =new HeaderVo();
+            header.setName(pid);
+            header.setTimestamp(new Date());
+            vo.setHeader(header);
 
-        return "";
+            MdoProXfoil xfoil = findXfoil(pid);
+            vo.setXfoil(xfoil);
+            MdoProAdflow adflow = findAdflow(pid);
+            vo.setAdflow(adflow);
+            //不用生成
+            if(xfoil==null&& adflow==null){
+                return "";
+            }
+            List<MdoProInoutPara> xInoutList = findMdoProInoutParas(pid, xfoil.getId());
+            XfoilInVo xinvo = new XfoilInVo();
+            // alpha mach reynolds
+            xinvo.setAlpha(getValByParaListAndCode(xInoutList,"alpha"));
+            xinvo.setMach(getValByParaListAndCode(xInoutList,"alpha"));
+            xinvo.setReynolds(getValByParaListAndCode(xInoutList,"reynolds"));
+            vo.setXinvo(xinvo);
+            XfoilOutVo xoutvo = new XfoilOutVo();
+            xoutvo.setCl(getValByParaListAndCode(xInoutList,"cl"));
+            xoutvo.setCd(getValByParaListAndCode(xInoutList,"cd"));
+            xoutvo.setCdp(getValByParaListAndCode(xInoutList,"cdp"));
+            xoutvo.setCm(getValByParaListAndCode(xInoutList,"cm"));
+            xoutvo.setXtr_upper(getValByParaListAndCode(xInoutList,"xtr_upper"));
+            xoutvo.setXtr_lower(getValByParaListAndCode(xInoutList,"xtr_lower"));
+            vo.setXoutvo(xoutvo);
+
+
+            List<MdoProInoutPara> adInoutList = findMdoProInoutParas(pid, adflow.getId());
+            AdflowInVo adinvo = new AdflowInVo();
+            adinvo.setMode(getValByParaListAndCode(adInoutList,"mode"));
+            adinvo.setAlpha(getValByParaListAndCode(adInoutList,"alpha"));
+            adinvo.setMach(getValByParaListAndCode(adInoutList,"mach"));
+            adinvo.setReynolds(getValByParaListAndCode(adInoutList,"reynolds"));
+            adinvo.setTemperature(getValByParaListAndCode(adInoutList,"temperature"));
+            adinvo.setReynoldsLength(getValByParaListAndCode(adInoutList,"reynoldsLength"));
+            vo.setAdinvo(adinvo);
+
+            AdflowOutVo adoutvo = new AdflowOutVo();
+            adoutvo.setCl(getValByParaListAndCode(adInoutList,"cl"));
+            adoutvo.setCd(getValByParaListAndCode(adInoutList,"cd"));
+            adoutvo.setCmz(getValByParaListAndCode(adInoutList,"cmz"));
+            vo.setAdoutvo(adoutvo);
+
+            MdoProCst cst = findCst(pid);
+            vo.setCst(cst);
+            MdoProFfd ffd = getFfd(pid);
+            vo.setFfd(ffd);
+
+            dataModel.put("vo",vo);
+            //dataModel.put("geoFilePath", BPATH + "/" + aid + "/" + jid + "/Geometry");
+            // 将数据模型传入模板进行处理
+            StringWriter writer = new StringWriter();
+            template.process(dataModel, writer);
+            FileWriter fileWriter = new FileWriter(LogService.BPATH + "/" + pid + "/in/cpacs.xml");
+            fileWriter.write(writer.toString());
+            fileWriter.close();
+            return  LogService.BPATH + "/" + pid + "/in/cpacs.xml";
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    private static List<MdoProInoutPara> findMdoProInoutParas(String pid, String fatherid) {
+        MdoProInoutParaMapper xdao = UtilTools.getBean(MdoProInoutParaMapper.class);
+        MdoProInoutParaSQLBuilder xsb  = new MdoProInoutParaSQLBuilder();
+        MdoProInoutParaSQLBuilder.Criteria xsc =xsb.createCriteria();
+        xsc.andPidEqualTo(pid);
+        xsc.andFatheridEqualTo(fatherid);
+        List<MdoProInoutPara> inList = xdao.selectByExample(xsb);
+        return inList;
     }
+
+    private static String getValByParaListAndCode(List<MdoProInoutPara> inList,String code) {
+        String value ="0";
+        List<MdoProInoutPara> tList = inList.stream().filter(x ->{
+            return code.equals(x.getCode());
+        }).collect(Collectors.toList());
+        if(tList!=null&&!tList.isEmpty()){
+            value = tList.get(0).getValue();
+        }
+        return value;
+    }
+
+    private static MdoProFfd getFfd(String pid) {
+        MdoProFfdMapper xdao = UtilTools.getBean(MdoProFfdMapper.class);
+        MdoProFfdSQLBuilder xsb  = new MdoProFfdSQLBuilder();
+        MdoProFfdSQLBuilder.Criteria xsc =xsb.createCriteria();
+        xsc.andPidEqualTo(pid);
+        xsc.andCheckedEqualTo(1);
+        List<MdoProFfd> xList = xdao.selectByExample(xsb);
+        MdoProFfd ffd =null;
+        if(xList!=null&&xList.isEmpty()){
+            ffd=xList.get(0);
+        }
+        return ffd;
+    }
+
+    private static MdoProCst findCst(String pid) {
+        MdoProCstMapper xdao = UtilTools.getBean(MdoProCstMapper.class);
+        MdoProCstSQLBuilder xsb  = new MdoProCstSQLBuilder();
+        MdoProCstSQLBuilder.Criteria xsc =xsb.createCriteria();
+        xsc.andPidEqualTo(pid);
+        xsc.andCheckedEqualTo(1);
+        List<MdoProCst> xList = xdao.selectByExample(xsb);
+        MdoProCst cst =null;
+        if(xList!=null&&xList.isEmpty()){
+            cst=xList.get(0);
+        }
+        return cst;
+    }
+
+    private static MdoProAdflow findAdflow(String pid) {
+        MdoProAdflowMapper xdao = UtilTools.getBean(MdoProAdflowMapper.class);
+        MdoProAdflowSQLBuilder xsb  = new MdoProAdflowSQLBuilder();
+        MdoProAdflowSQLBuilder.Criteria xsc =xsb.createCriteria();
+        xsc.andPidEqualTo(pid);
+        xsc.andCheckedEqualTo(1);
+        List<MdoProAdflow> xList = xdao.selectByExample(xsb);
+        MdoProAdflow adflow =null;
+        if(xList!=null&&xList.isEmpty()){
+            adflow=xList.get(0);
+        }
+        return adflow;
+    }
+
+    private static MdoProXfoil findXfoil(String pid) {
+        MdoProXfoilMapper xdao = UtilTools.getBean(MdoProXfoilMapper.class);
+        MdoProXfoilSQLBuilder xsb  = new MdoProXfoilSQLBuilder();
+        MdoProXfoilSQLBuilder.Criteria xsc =xsb.createCriteria();
+        xsc.andPidEqualTo(pid);
+        xsc.andCheckedEqualTo(1);
+        List<MdoProXfoil> xList = xdao.selectByExample(xsb);
+        MdoProXfoil xfoil =null;
+        if(xList!=null&&xList.isEmpty()){
+            xfoil=xList.get(0);
+        }
+        return xfoil;
+    }
+
     /**
      * TODO 创建 workflowXml
      * @return
      */
     public static String createcWorkflowXml(String pid){
 
-        return "";
+        return null;
     }
 
     /**

+ 68 - 0
src/main/java/com/miniframe/modo/temp/cpacs/AdflowInVo.java

@@ -0,0 +1,68 @@
+package com.miniframe.modo.temp.cpacs;
+
+public class AdflowInVo {
+    private String mode;
+    private String alpha;
+    private String mach;
+    private String reynolds;
+    private String temperature;
+    private String reynoldsLength;
+
+    public AdflowInVo() {
+        super();
+        this.mode="0";
+        this.alpha="0";
+        this.mach="0";
+        this.reynolds="0";
+        this.temperature="0";
+        this.reynoldsLength="0";
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
+
+    public String getAlpha() {
+        return alpha;
+    }
+
+    public void setAlpha(String alpha) {
+        this.alpha = alpha;
+    }
+
+    public String getMach() {
+        return mach;
+    }
+
+    public void setMach(String mach) {
+        this.mach = mach;
+    }
+
+    public String getReynolds() {
+        return reynolds;
+    }
+
+    public void setReynolds(String reynolds) {
+        this.reynolds = reynolds;
+    }
+
+    public String getTemperature() {
+        return temperature;
+    }
+
+    public void setTemperature(String temperature) {
+        this.temperature = temperature;
+    }
+
+    public String getReynoldsLength() {
+        return reynoldsLength;
+    }
+
+    public void setReynoldsLength(String reynoldsLength) {
+        this.reynoldsLength = reynoldsLength;
+    }
+}

+ 38 - 0
src/main/java/com/miniframe/modo/temp/cpacs/AdflowOutVo.java

@@ -0,0 +1,38 @@
+package com.miniframe.modo.temp.cpacs;
+
+public class AdflowOutVo {
+   private String cl;
+   private String cd;
+   private String cmz;
+
+    public AdflowOutVo() {
+        super();
+        this.cl ="0";
+        this.cd ="0";
+        this.cmz ="0";
+    }
+
+    public String getCl() {
+        return cl;
+    }
+
+    public void setCl(String cl) {
+        this.cl = cl;
+    }
+
+    public String getCd() {
+        return cd;
+    }
+
+    public void setCd(String cd) {
+        this.cd = cd;
+    }
+
+    public String getCmz() {
+        return cmz;
+    }
+
+    public void setCmz(String cmz) {
+        this.cmz = cmz;
+    }
+}

+ 88 - 0
src/main/java/com/miniframe/modo/temp/cpacs/CpacsVo.java

@@ -0,0 +1,88 @@
+package com.miniframe.modo.temp.cpacs;
+
+import com.miniframe.model.mdo.*;
+import com.miniframe.modo.temp.problem.HeaderVo;
+
+public class CpacsVo {
+    private HeaderVo header;
+    private MdoProXfoil xfoil;
+    private XfoilInVo xinvo;
+    private XfoilOutVo xoutvo;
+    private MdoProAdflow adflow;
+    private AdflowInVo adinvo;
+    private AdflowOutVo adoutvo;
+    private MdoProFfd ffd;
+    private MdoProCst cst;
+
+    public MdoProXfoil getXfoil() {
+        return xfoil;
+    }
+
+    public void setXfoil(MdoProXfoil xfoil) {
+        this.xfoil = xfoil;
+    }
+
+    public XfoilInVo getXinvo() {
+        return xinvo;
+    }
+
+    public void setXinvo(XfoilInVo xinvo) {
+        this.xinvo = xinvo;
+    }
+
+    public XfoilOutVo getXoutvo() {
+        return xoutvo;
+    }
+
+    public void setXoutvo(XfoilOutVo xoutvo) {
+        this.xoutvo = xoutvo;
+    }
+
+    public MdoProAdflow getAdflow() {
+        return adflow;
+    }
+
+    public void setAdflow(MdoProAdflow adflow) {
+        this.adflow = adflow;
+    }
+
+    public AdflowInVo getAdinvo() {
+        return adinvo;
+    }
+
+    public void setAdinvo(AdflowInVo adinvo) {
+        this.adinvo = adinvo;
+    }
+
+    public AdflowOutVo getAdoutvo() {
+        return adoutvo;
+    }
+
+    public void setAdoutvo(AdflowOutVo adoutvo) {
+        this.adoutvo = adoutvo;
+    }
+
+    public MdoProFfd getFfd() {
+        return ffd;
+    }
+
+    public void setFfd(MdoProFfd ffd) {
+        this.ffd = ffd;
+    }
+
+    public MdoProCst getCst() {
+        return cst;
+    }
+
+    public void setCst(MdoProCst cst) {
+        this.cst = cst;
+    }
+
+    public HeaderVo getHeader() {
+        return header;
+    }
+
+    public void setHeader(HeaderVo header) {
+        this.header = header;
+    }
+}

+ 38 - 0
src/main/java/com/miniframe/modo/temp/cpacs/XfoilInVo.java

@@ -0,0 +1,38 @@
+package com.miniframe.modo.temp.cpacs;
+
+public class XfoilInVo {
+   private String alpha;
+   private String mach;
+   private String reynolds;
+
+    public XfoilInVo() {
+        super();
+       this.alpha="0";
+       this.mach="0";
+       this.reynolds="0";
+    }
+
+    public String getAlpha() {
+        return alpha;
+    }
+
+    public void setAlpha(String alpha) {
+        this.alpha = alpha;
+    }
+
+    public String getMach() {
+        return mach;
+    }
+
+    public void setMach(String mach) {
+        this.mach = mach;
+    }
+
+    public String getReynolds() {
+        return reynolds;
+    }
+
+    public void setReynolds(String reynolds) {
+        this.reynolds = reynolds;
+    }
+}

+ 66 - 0
src/main/java/com/miniframe/modo/temp/cpacs/XfoilOutVo.java

@@ -0,0 +1,66 @@
+package com.miniframe.modo.temp.cpacs;
+
+public class XfoilOutVo {
+   private String cl;
+   private String cd;
+   private String cdp;
+   private String cm;
+   private String xtr_upper;
+   private String xtr_lower;
+    public XfoilOutVo() {
+        super();
+        this.cl="0";
+        this.cd="0";
+        this.cdp="0";
+        this.cm="0";
+        this.xtr_upper="0";
+        this.xtr_lower="0";
+    }
+    public String getCl() {
+        return cl;
+    }
+
+    public void setCl(String cl) {
+        this.cl = cl;
+    }
+
+    public String getCd() {
+        return cd;
+    }
+
+    public void setCd(String cd) {
+        this.cd = cd;
+    }
+
+    public String getCdp() {
+        return cdp;
+    }
+
+    public void setCdp(String cdp) {
+        this.cdp = cdp;
+    }
+
+    public String getCm() {
+        return cm;
+    }
+
+    public void setCm(String cm) {
+        this.cm = cm;
+    }
+
+    public String getXtr_upper() {
+        return xtr_upper;
+    }
+
+    public void setXtr_upper(String xtr_upper) {
+        this.xtr_upper = xtr_upper;
+    }
+
+    public String getXtr_lower() {
+        return xtr_lower;
+    }
+
+    public void setXtr_lower(String xtr_lower) {
+        this.xtr_lower = xtr_lower;
+    }
+}

+ 161 - 0
src/main/resources/templates/cpacs.ftl

@@ -0,0 +1,161 @@
+<cpacs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/cpacs_schema.xsd">
+    <header>
+        <name>${vo.header.name}</name>
+        <creator>SurroMDAO</creator>
+        <timestamp>${vo.header.timestamp}</timestamp>
+        <version>1.0</version>
+        <cpacsVersion>3.3</cpacsVersion>
+    </header>
+    <vehicles>
+        <#if vo.cst??>
+        <profiles>
+            <wingAirfoils>
+                <wingAirfoil uID="foil1">
+                    <name>foil1</name>
+                    <description>airfoil</description>
+                    <cst2D mapType="complex">
+                        <N>${vo.cst.cstn}</N>
+                        <lowerB mapType="vector">${string_replace(vo.cst.lowerb, ",", ";")}</lowerB>
+                        <lowerN1 mapType="dobule">${vo.cst.lowern1}</lowerN1>
+                        <lowerN2 mapType="dobule">${vo.cst.lowern2}</lowerN2>
+                        <upperB mapType="vector">${string_replace(vo.cst.upperb, ",", ";")</upperB>
+                        <upperN1 mapType="dobule">${vo.cst.uppern1}</upperN1>
+                        <upperN2 mapType="dobule">${vo.cst.uppern2}</upperN2>
+                        <trailingEdgeThickness mapType="dobule">0</trailingEdgeThickness>
+                    </cst2D>
+                </wingAirfoil>
+            </wingAirfoils>
+        </profiles>
+        <#else>
+        </#if>
+        <#if vo.adflow??>
+        <aircraft>
+            <model uID="wing">
+                <name>wing</name>
+                <reference mapType="complex">
+                    <area mapType="double">${vo.adflow.area}</area>
+                    <length mapType="double">${vo.adflow.length}</length>
+                    <point mapType="complex">
+                        <x mapType="double">${vo.adflow.momx}</x>
+                        <y mapType="double">${vo.adflow.momy}</y>
+                        <z mapType="double">${vo.adflow.momz}</z>
+                    </point>
+                </reference>
+            </model>
+        </aircraft>
+        <#else>
+        </#if>
+    </vehicles>
+    <toolspecific>
+       <#if vo.ffd??>
+         <FFD mapType="complex" uID="FFD">
+                <switch mapType="boolean">1</switch>
+                <FFDFile>${vo.ffd.fname}</FFDFile>
+                <order mapType="integer">${vo.ffd.fname}</order>
+                <Controlpoints mapType="complex">
+                    <Nx mapType="integer">${vo.ffd.nx}</Nx>
+                    <Ny mapType="integer">${vo.ffd.ny}</Ny>
+                    <Nz mapType="integer">${vo.ffd.nz}</Nz>
+                </Controlpoints>
+                <vars mapType="complex">
+                    <sample mapType="vector">${string_replace(vo.ffd.vars, ",", ";")}</sample>
+                    <local_shape_dv mapType="boolean">1</local_shape_dv>
+                </vars>
+         </FFD>
+      <#else>
+      </#if>
+        <CFD>
+         <#if vo.xfoil??>
+            <XFOIL mapType="complex" uID="XFOIL">
+                <analyzed mapType="boolean">1</analyzed>
+                <options mapType="complex">
+                    <pacc>${vo.xfoil.pacc}</pacc>
+                    <cpwr>${vo.xfoil.cpwr}</cpwr>
+                    <iter mapType="integer">${vo.xfoil.iter}</iter>
+                    <ppar mapType="integer">${vo.xfoil.ppar}</ppar>
+                </options>
+                <condition mapType="complex">
+                    <alpha mapType="double">${vo.xinvo.alpha}</alpha>
+                    <mach mapType="double">${vo.xinvo.mach}</mach>
+                    <reynolds mapType="double">${vo.xinvo.reynolds}</reynolds>
+                </condition>
+                <evalFuncs mapType="complex">
+                    <cl mapType="double">${vo.xoutvo.cl}</cl>
+                    <cd mapType="double">${vo.xoutvo.cd}</cd>
+                    <cdp mapType="double">${vo.xoutvo.cdp}</cdp>
+                    <cm mapType="double">${vo.xoutvo.cm}</cm>
+                    <xtr_upper mapType="double">${vo.xoutvo.xtr_upper}</xtr_upper>
+                    <xtr_lower mapType="double">${vo.xoutvo.xtr_lower}</xtr_lower>
+                </evalFuncs>
+            </XFOIL>
+         <#else>
+         </#if>
+         <#if vo.adflow??>
+             <ADflow mapType="complex" uID="ADflow">
+             <switch mapType="boolean">1</switch>
+             <proName>${vo.adflow.proname}</proName>
+             <analyzed mapType="boolean">0</analyzed>
+             <isAirfoil mapType="boolean">${vo.adflow.isairfoil}</isAirfoil>
+             <inputDirectoryName>model</inputDirectoryName>
+             <outputDirectoryName>results</outputDirectoryName>
+             <options mapType="complex">
+                 <gridFile>${vo.adflow.gridfile}</gridFile>
+                 <writeTecplotSurfaceSolution mapType="boolean">${vo.adflow.writetecplotsurfacesolution}</writeTecplotSurfaceSolution>
+                 <equationType>${vo.adflow.equationtype}</equationType>
+                 <smoother>DADI</smoother>
+                 <MGCycle>${vo.adflow.mgcycle}</MGCycle>
+                 <nCycles mapType="integer">${vo.adflow.ncycles}</nCycles>
+                 <monitorvariables mapType="complex">
+                        <#if vo.adflow.resrho?trim == "1">
+                        <monitorvariable1>resrho</monitorvariable1>
+                        <#else>
+                        </#if>
+                        <#if vo.adflow.cl?trim == "1">
+                        <monitorvariable2>cl</monitorvariable2>
+                        <#else>
+                        </#if>
+                        <#if vo.adflow.cd?trim == "1">
+                        <monitorvariable2>cd</monitorvariable2>
+                        <#else>
+                        </#if>
+                        <#if vo.adflow.cmz?trim == "1">
+                        <monitorvariable2>cmz</monitorvariable2>
+                        <#else>
+                        </#if>
+                 </monitorvariables>
+                 <useNKSolver mapType="boolean">1</useNKSolver> # 使用nk求解器
+                 <useanksolver mapType="boolean">1</useanksolver> # 使用ank求解器
+                 <nsubiterturb mapType="integer">5</nsubiterturb>
+                 <liftIndex mapType="integer">${vo.adflow.liftindex}</liftIndex>
+                 <infchangecorrection mapType="boolean">1</infchangecorrection>
+                 <L2Convergence mapType="double">${vo.adflow.l2convergence}</L2Convergence>
+                 <L2ConvergenceCoarse mapType="double">${vo.adflow.l2convergencecoarse}</L2ConvergenceCoarse>
+                 <NKSwitchTol mapType="double">1e-8</NKSwitchTol>
+                 <ANKSwitchTol mapType="double">1e-1</ANKSwitchTol>
+                 <L2ConvergenceRel mapType="double">1e-3</L2ConvergenceRel>
+             </options>
+             <condition mapType="complex">
+                 <mode mapType="integer">${vo.adinvo.mode}</mode>
+                 <alpha mapType="double">${vo.adinvo.alpha}</alpha>
+                 <mach mapType="double">${vo.adinvo.mach}</mach>
+                 <reynolds mapType="double">${vo.adinvo.reynolds}</reynolds>
+                 <temperature mapType="double">${vo.adinvo.temperature}</temperature>
+                 <reynoldsLength mapType="double">${vo.adinvo.reynoldsLength}</reynoldsLength>
+             </condition>
+             <evalFuncs mapType="complex">
+                 <force mapType="complex">
+                     <cl mapType="double">${vo.adoutvo.cl}</cl>
+                     <cd mapType="double">${vo.adoutvo.cd}</cd>
+                     <cmz mapType="double">${vo.adoutvo.cmz}</cmz>
+                 </force>
+                 <geometry mapType="complex">
+                     <volume mapType="double">0.0</volume>
+                 </geometry>
+             </evalFuncs>
+         </ADflow>
+         <#else>
+         </#if>
+        </CFD>
+
+    </toolspecific>
+</cpacs>