/*
* Copyright (C) 2012 Addition, Lda. (addition at addition dot pt)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package org.addition.epanet.network.io.output;
import org.addition.epanet.Constants;
import org.addition.epanet.network.io.Keywords;
import org.addition.epanet.util.ENException;
import org.addition.epanet.util.Utilities;
import org.addition.epanet.network.FieldsMap;
import org.addition.epanet.network.FieldsMap.*;
import org.addition.epanet.network.Network;
import org.addition.epanet.network.PropertiesMap;
import org.addition.epanet.network.structures.*;
import org.addition.epanet.network.structures.Control.*;
import org.addition.epanet.network.structures.Link.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* INP file composer.
*/
public class InpComposer extends OutputComposer{
private static final String JUNCS_SUBTITLE = ";ID\tElev\tDemand\tPattern";
private static final String RESERVOIRS_SUBTITLE = ";ID\tHead\tPattern";
private static final String TANK_SUBTITLE = ";ID\tElevation\tInitLevel\tMinLevel\tMaxLevel\tDiameter\tMinVol\tVolCurve";
private static final String PUMPS_SUBTITLE = ";ID\tNode1\tNode2\tParameters";
private static final String VALVES_SUBTITLE = ";ID\tNode1\tNode2\tDiameter\tType\tSetting\tMinorLoss";
private static final String DEMANDS_SUBTITLE = ";Junction\tDemand\tPattern\tCategory";
private static final String STATUS_SUBTITLE = ";ID\tStatus/Setting";
private static final String PIPES_SUBTITLE = ";ID\tNode1\tNode2\tLength\tDiameter\tRoughness\tMinorLoss\tStatus";
private static final String PATTERNS_SUBTITLE = ";ID\tMultipliers";
private static final String EMITTERS_SUBTITLE = ";Junction\tCoefficient";
private static final String CURVE_SUBTITLE = ";ID\tX-Value\tY-Value";
private static final String QUALITY_SUBTITLE = ";Node\tInitQual";
private static final String SOURCE_SUBTITLE = ";Node\tType\tQuality\tPattern";
private static final String MIXING_SUBTITLE = ";Tank\tModel";
private static final String REACTIONS_SUBTITLE = ";Type\tPipe/Tank";
private static final String COORDINATES_SUBTITLE = ";Node\tX-Coord\tY-Coord";
BufferedWriter buffer;
public InpComposer() {
}
@Override
public void composer(Network net, File f) throws ENException {
try{
buffer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f),"ISO-8859-1"));
composeHeader(net);
composeJunctions(net);
composeReservoirs(net);
composeTanks(net);
composePipes(net);
composePumps(net);
composeValves(net);
composeDemands(net);
composeEmitters(net);
composeStatus(net);
composePatterns(net);
composeCurves(net);
composeControls(net);
composeQuality(net);
composeSource(net);
composeMixing(net);
composeReaction(net);
composeEnergy(net);
composeTimes(net);
composeOptions(net);
composeExtraOptions(net);
composeReport(net);
composeLabels(net);
composeCoordinates(net);
composeVertices(net);
composeRules(net);
buffer.write(Network.SectType.END.parseStr);
buffer.close();
}
catch (IOException e){return;}
}
public void composeHeader(Network net) throws IOException {
if(net.getTitleText().size()==0)
return;
buffer.write(Network.SectType.TITLE.parseStr);
buffer.newLine();
for(String str : net.getTitleText()){
buffer.write(str);
buffer.newLine();
}
buffer.newLine();
}
private void composeJunctions(Network net) throws IOException, ENException {
FieldsMap fMap = net.getFieldsMap();
PropertiesMap pMap = net.getPropertiesMap();
if(net.getJunctions().size()==0)
return;
buffer.write(Network.SectType.JUNCTIONS.parseStr);
buffer.newLine();
buffer.write(JUNCS_SUBTITLE);
buffer.newLine();
for(Node node : net.getJunctions()){
buffer.write(String.format(" %s\t%s",node.getId(),fMap.revertUnit(Type.ELEV, node.getElevation())));
//if(node.getDemand()!=null && node.getDemand().size()>0 && !node.getDemand().get(0).getPattern().getId().equals(""))
// buffer.write("\t"+node.getDemand().get(0).getPattern().getId());
if(node.getDemand().size()>0){
Demand d = node.getDemand().get(0);
buffer.write(String.format("\t%s",fMap.revertUnit(FieldsMap.Type.DEMAND, d.getBase())));
if (!d.getPattern().getId().equals("") && !pMap.getDefPatId().equals(d.getPattern().getId()))
buffer.write("\t" + d.getPattern().getId());
}
if(node.getComment().length()!=0)
buffer.write("\t;"+node.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composeReservoirs(Network net) throws IOException, ENException {
FieldsMap fMap = net.getFieldsMap();
if(net.getTanks().size()==0)
return;
List<Tank> reservoirs = new ArrayList<Tank>();
for(Tank tank : net.getTanks())
if(tank.getArea() == 0)
reservoirs.add(tank);
if(reservoirs.size()==0)
return;
buffer.write(Network.SectType.RESERVOIRS.parseStr);
buffer.newLine();
buffer.write(RESERVOIRS_SUBTITLE);
buffer.newLine();
for(Tank r : reservoirs){
buffer.write(String.format(" %s\t%s",r.getId(),fMap.revertUnit(Type.ELEV, r.getElevation())));
if (r.getPattern()!=null)
buffer.write(String.format("\t%s",r.getPattern().getId()));
if(r.getComment().length()!=0)
buffer.write("\t;"+r.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composeTanks(Network net) throws IOException, ENException {
FieldsMap fMap = net.getFieldsMap();
List<Tank> tanks = new ArrayList<Tank>();
for(Tank tank : net.getTanks())
if(tank.getArea()!= 0)
tanks.add(tank);
if(tanks.size()==0)
return;
buffer.write(Network.SectType.TANKS.parseStr);
buffer.newLine();
buffer.write(TANK_SUBTITLE);
buffer.newLine();
for(Tank tank : tanks){
double Vmin = tank.getVmin();
if(Math.round(Vmin/tank.getArea()) == Math.round(tank.getHmin()-tank.getElevation()))
Vmin = 0;
buffer.write(String.format(" %s\t%s\t%s\t%s\t%s\t%s\t%s",
tank.getId(),
fMap.revertUnit(Type.ELEV, tank.getElevation()),
fMap.revertUnit(Type.ELEV, tank.getH0() - tank.getElevation()),
fMap.revertUnit(Type.ELEV, tank.getHmin() - tank.getElevation()),
fMap.revertUnit(Type.ELEV, tank.getHmax() - tank.getElevation()),
fMap.revertUnit(Type.ELEV, 2*Math.sqrt(tank.getArea() / Constants.PI)),
fMap.revertUnit(Type.VOLUME,Vmin)));
if(tank.getVcurve()!=null)
buffer.write(" "+tank.getVcurve().getId());
if(tank.getComment().length()!=0)
buffer.write("\t;"+tank.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composePipes(Network net) throws IOException, ENException {
FieldsMap fMap = net.getFieldsMap();
PropertiesMap pMap = net.getPropertiesMap();
if(net.getLinks().size()==0)
return;
List<Link> pipes = new ArrayList<Link>();
for(Link link : net.getLinks())
if(link.getType() == LinkType.PIPE || link.getType() == LinkType.CV)
pipes.add(link);
buffer.write(Network.SectType.PIPES.parseStr);
buffer.newLine();
buffer.write(PIPES_SUBTITLE);
buffer.newLine();
for(Link link : pipes){
double d = link.getDiameter();
double kc = link.getRoughness();
if (pMap.getFormflag() == PropertiesMap.FormType.DW)
kc = fMap.revertUnit(Type.ELEV,kc*1000.0);
double km = link.getKm()*Math.pow(d,4.0)/0.02517;
buffer.write(String.format(" %s\t%s\t%s\t%s\t%s",
link.getId(),
link.getFirst().getId(),
link.getSecond().getId(),
fMap.revertUnit(Type.LENGTH, link.getLenght()),
fMap.revertUnit(Type.DIAM, d)));
//if (pMap.getFormflag() == FormType.DW)
buffer.write(String.format(" %s\t%s", kc, km));
if (link.getType() == LinkType.CV)
buffer.write(" CV");
else if (link.getStat() == StatType.CLOSED)
buffer.write(" CLOSED");
else if (link.getStat() == StatType.OPEN)
buffer.write(" OPEN");
if(link.getComment().length()!=0)
buffer.write("\t;" + link.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composePumps(Network net) throws IOException, ENException{
FieldsMap fMap = net.getFieldsMap();
List<Pump> pumps = new ArrayList<Pump>(net.getPumps());
if(pumps.size()==0)
return;
buffer.write(Network.SectType.PUMPS.parseStr);
buffer.newLine();
buffer.write(PUMPS_SUBTITLE);
buffer.newLine();
for(Pump pump : pumps)
{
buffer.write(String.format(" %s\t%s\t%s", pump.getId(),
pump.getFirst().getId(), pump.getSecond().getId()));
// Pump has constant power
if (pump.getPtype() == Pump.Type.CONST_HP)
buffer.write(String.format(" POWER %s", pump.getKm()));
// Pump has a head curve
else if (pump.getHcurve()!=null)
buffer.write(String.format(" HEAD %s", pump.getHcurve().getId()));
// Old format used for pump curve
else
{
buffer.write(String.format(" %s\t%s\t%s\t0.0\t%s",
fMap.revertUnit(Type.HEAD,-pump.getH0()),
fMap.revertUnit(Type.HEAD,-pump.getH0() - pump.getFlowCoefficient()*Math.pow(pump.getQ0(),pump.getN())),
fMap.revertUnit(Type.FLOW,pump.getQ0()),
fMap.revertUnit(Type.FLOW,pump.getQmax())
));
continue;
}
if ( pump.getUpat()!=null)
buffer.write(String.format(" PATTERN %s", pump.getUpat().getId()));
if (pump.getRoughness() != 1.0)
buffer.write(String.format(" SPEED %s", pump.getRoughness()));
if(pump.getComment().length()!=0)
buffer.write("\t;"+pump.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composeValves(Network net) throws IOException, ENException{
FieldsMap fMap = net.getFieldsMap();
List<Valve> valves = new ArrayList<Valve>(net.getValves());
if(valves.size()==0)
return;
buffer.write(Network.SectType.VALVES.parseStr);
buffer.newLine();
buffer.write(VALVES_SUBTITLE);
buffer.newLine();
for(Valve valve : valves)
{
double d = valve.getDiameter();
double kc = valve.getRoughness();
if (kc == Constants.MISSING)
kc = 0.0;
switch (valve.getType())
{
case FCV: kc = fMap.revertUnit(Type.FLOW,kc) ; break;
case PRV:
case PSV:
case PBV: kc = fMap.revertUnit(Type.PRESSURE,kc) ; break;
}
double km = valve.getKm()*Math.pow(d,4)/0.02517;
buffer.write(String.format(" %s\t%s\t%s\t%s\t%5s",
valve.getId(),
valve.getFirst().getId(),
valve.getSecond().getId(),
fMap.revertUnit(Type.DIAM,d),
valve.getType().parseStr));
if (valve.getType() == LinkType.GPV && valve.getCurve() != null)
buffer.write(String.format(" %s\t%s", valve.getCurve().getId(), km));
else
buffer.write(String.format(" %s\t%s",kc,km));
if(valve.getComment().length()!=0)
buffer.write("\t;"+valve.getComment());
buffer.newLine();
}
buffer.newLine();
}
private void composeDemands(Network net) throws IOException, ENException {
FieldsMap fMap = net.getFieldsMap();
if(net.getJunctions().size()==0)
return;
buffer.write(Network.SectType.DEMANDS.parseStr);
buffer.newLine();
buffer.write(DEMANDS_SUBTITLE);
buffer.newLine();
double ucf = fMap.getUnits(Type.DEMAND);
for(Node node : net.getJunctions()){
if (node.getDemand().size() > 1)
for(int i = 0;i<node.getDemand().size();i++){
Demand demand = node.getDemand().get(i);
buffer.write(String.format("%s\t%s",node.getId(), ucf * demand.getBase()));
if (demand.getPattern() != null)
buffer.write("\t"+demand.getPattern().getId());
buffer.newLine();
}
}
buffer.newLine();
}
private void composeEmitters(Network net) throws IOException, ENException {
if(net.getNodes().size()==0)
return;
buffer.write(Network.SectType.EMITTERS.parseStr);
buffer.newLine();
buffer.write(EMITTERS_SUBTITLE);
buffer.newLine();
double uflow = net.getFieldsMap().getUnits(Type.FLOW);
double upressure = net.getFieldsMap().getUnits(Type.PRESSURE);
double Qexp = net.getPropertiesMap().getQexp();
for(Node node : net.getJunctions()){
if(node.getKe()==0.0) continue;
double ke = uflow/Math.pow(upressure * node.getKe(), (1.0 / Qexp));
buffer.write(String.format(" %s\t%s",node.getId(),ke));
buffer.newLine();
}
buffer.newLine();
}
private void composeStatus(Network net) throws IOException, ENException {
if(net.getLinks().size()==0)
return;
buffer.write(Network.SectType.STATUS.parseStr);
buffer.newLine();
buffer.write(STATUS_SUBTITLE);
buffer.newLine();
for(Link link : net.getLinks())
{
if (link.getType().id <= LinkType.PUMP.id)
{
if (link.getStat() == StatType.CLOSED)
buffer.write(String.format(" %s\t%s\n",link.getId(),StatType.CLOSED.parseStr));
// Write pump speed here for pumps with old-style pump curve input
else if (link.getType() == LinkType.PUMP){
Pump pump = (Pump)link;
if (pump.getHcurve() == null &&
pump.getPtype() != Pump.Type.CONST_HP &&
pump.getRoughness() != 1.0)
buffer.write(String.format(" %s\t%s\n", link.getId(), link.getRoughness()));
}
}
// Write fixed-status PRVs & PSVs (setting = MISSING)
else if (link.getRoughness() == Constants.MISSING)
{
if (link.getStat() == StatType.OPEN)
buffer.write(String.format(" %s\t%s\n",link.getId(),StatType.OPEN.parseStr));
if (link.getStat() == StatType.CLOSED)
buffer.write(String.format(" %s\t%s\n", link.getId(), StatType.CLOSED.parseStr));
}
}
buffer.newLine();
}
private void composePatterns(Network net) throws IOException, ENException {
List<Pattern> pats = new ArrayList<Pattern>(net.getPatterns());
if(pats.size()<=1)
return;
buffer.write(Network.SectType.PATTERNS.parseStr);
buffer.newLine();
buffer.write(PATTERNS_SUBTITLE);
buffer.newLine();
for(int i = 1;i<pats.size();i++)
{
Pattern pat = pats.get(i);
List<Double> F = pat.getFactorsList();
for (int j=0; j<pats.get(i).getLength(); j++)
{
if (j % 6 == 0)
buffer.write(String.format(" %s",pat.getId()));
buffer.write(String.format(" %s",F.get(j)));
if (j % 6 == 5)
buffer.newLine();
}
buffer.newLine();
}
buffer.newLine();
}
private void composeCurves(Network net) throws IOException, ENException {
List<Curve> curves = new ArrayList<Curve>(net.getCurves());
if(curves.size()==0)
return;
buffer.write(Network.SectType.CURVES.parseStr);
buffer.newLine();
buffer.write(CURVE_SUBTITLE);
buffer.newLine();
for(Curve c : curves)
{
for(int i = 0;i < c.getNpts();i++){
buffer.write(String.format(" %s\t%s\t%s",
c.getId(),c.getX().get(i),c.getY().get(i)));
buffer.newLine();
}
}
buffer.newLine();
}
private void composeControls(Network net) throws IOException, ENException {
Control [] controls = net.getControls();
FieldsMap fmap = net.getFieldsMap();
if(controls.length == 0)
return;
buffer.write(Network.SectType.CONTROLS.parseStr);
buffer.newLine();
for(Control control : controls)
{
// Check that controlled link exists
if (control.getLink()==null) continue;
// Get text of control's link status/setting
if (control.getSetting() == Constants.MISSING)
buffer.write(String.format(" LINK %s %s ", control.getLink().getId(), control.getStatus().parseStr));
else
{
Double kc = control.getSetting();
switch(control.getLink().getType())
{
case PRV:
case PSV:
case PBV: kc = fmap.revertUnit(Type.PRESSURE,kc); break;
case FCV: kc = fmap.revertUnit(Type.FLOW,kc); break;
}
buffer.write(String.format(" LINK %s %s",control.getLink().getId(), kc));
}
switch (control.getType())
{
// Print level control
case LOWLEVEL:
case HILEVEL:
double kc = control.getGrade() - control.getNode().getElevation();
if (control.getNode() instanceof Tank) kc = fmap.revertUnit(Type.HEAD,kc);
else
kc = fmap.revertUnit(Type.PRESSURE,kc);
buffer.write(String.format(" IF NODE %s %s %s",
control.getNode().getId(), control.getType().parseStr, kc));
break;
// Print timer control
case TIMER:
buffer.write(String.format(" AT %s %s HOURS",
ControlType.TIMER.parseStr, control.getTime()/3600.0f));
break;
// Print time-of-day control
case TIMEOFDAY:
buffer.write(String.format(" AT %s %s", ControlType.TIMEOFDAY.parseStr, Utilities.getClockTime(control.getTime())));
break;
}
buffer.newLine();
}
buffer.newLine();
}
private void composeQuality(Network net) throws IOException, ENException {
Collection<Node> nodes = net.getNodes();
FieldsMap fmap = net.getFieldsMap();
if(nodes.size() == 0)
return;
buffer.write(Network.SectType.QUALITY.parseStr);
buffer.newLine();
buffer.write(QUALITY_SUBTITLE);
buffer.newLine();
for(Node node : nodes)
{
if (node.getC0().length == 1 ){
if(node.getC0()[0] == 0.0 ) continue;
buffer.write(String.format(" %s\t%s",node.getId(),fmap.revertUnit(Type.QUALITY,node.getC0()[0])));
}
buffer.newLine();
}
buffer.newLine();
}
private void composeSource(Network net) throws IOException {
Collection<Node> nodes = net.getNodes();
if(nodes.size() == 0)
return;
buffer.write(Network.SectType.SOURCES.parseStr);
buffer.newLine();
buffer.write(SOURCE_SUBTITLE);
buffer.newLine();
for(Node node : nodes){
Source source = node.getSource();
if (source == null)
continue;
buffer.write(String.format(" %s\t%s\t%s",
node.getId(),
source.getType().parseStr,
source.getC0()));
if (source.getPattern()!=null)
buffer.write(" " + source.getPattern().getId());
buffer.newLine();
}
buffer.newLine();
}
private void composeMixing(Network net) throws IOException{
if(net.getTanks().size()==0)
return;
buffer.write(Network.SectType.MIXING.parseStr);
buffer.newLine();
buffer.write(MIXING_SUBTITLE);
buffer.newLine();
for(Tank tank : net.getTanks())
{
if (tank.getArea() == 0.0) continue;
buffer.write(String.format(" %s\t%s\t%s",
tank.getId(),tank.getMixModel().parseStr,
(tank.getV1max() / tank.getVmax())));
buffer.newLine();
}
buffer.newLine();
}
private void composeReaction(Network net) throws IOException, ENException {
PropertiesMap pMap = net.getPropertiesMap();
buffer.write(Network.SectType.REACTIONS.parseStr);
buffer.newLine();
buffer.write(REACTIONS_SUBTITLE);
buffer.newLine();
buffer.write(String.format("ORDER BULK %s\n", pMap.getBulkOrder()));
buffer.write(String.format("ORDER WALL %s\n", pMap.getWallOrder()));
buffer.write(String.format("ORDER TANK %s\n", pMap.getTankOrder()));
buffer.write(String.format("GLOBAL BULK %s\n", pMap.getKbulk() * Constants.SECperDAY));
buffer.write(String.format("GLOBAL WALL %s\n", pMap.getKwall() * Constants.SECperDAY));
//if (pMap.getClimit() > 0.0)
buffer.write(String.format("LIMITING POTENTIAL %s\n", pMap.getClimit()));
//if (pMap.getRfactor() != Constants.MISSING && pMap.getRfactor() != 0.0)
buffer.write(String.format("ROUGHNESS CORRELATION %s\n", pMap.getRfactor()));
for(Link link : net.getLinks())
{
if (link.getType().id > LinkType.PIPE.id)
continue;
if (link.getKb() != pMap.getKbulk())
buffer.write(String.format("BULK %s %s\n", link.getId(), link.getKb() * Constants.SECperDAY));
if (link.getKw() != pMap.getKwall())
buffer.write(String.format("WALL %s %s\n", link.getId(), link.getKw() * Constants.SECperDAY));
}
for(Tank tank : net.getTanks())
{
if (tank.getArea() == 0.0) continue;
if (tank.getKb() != pMap.getKbulk())
buffer.write(String.format("TANK %s %s\n",tank.getId(),tank.getKb()*Constants.SECperDAY));
}
buffer.newLine();
}
private void composeEnergy(Network net) throws IOException, ENException {
PropertiesMap pMap = net.getPropertiesMap();
buffer.write(Network.SectType.ENERGY.parseStr);
buffer.newLine();
if (pMap.getEcost() != 0.0)
buffer.write(String.format("GLOBAL PRICE %s\n", pMap.getEcost()));
if (!pMap.getEpatId().equals(""))
buffer.write(String.format("GLOBAL PATTERN %s\n", pMap.getEpatId()));
buffer.write(String.format("GLOBAL EFFIC %s\n", pMap.getEpump()));
buffer.write(String.format("DEMAND CHARGE %s\n", pMap.getDcost()));
for(Pump p : net.getPumps())
{
if (p.getEcost() > 0.0)
buffer.write(String.format("PUMP %s PRICE %s\n",p.getId(),p.getEcost()));
if (p.getEpat() != null)
buffer.write(String.format("PUMP %s PATTERN %s\n",
p.getId(),p.getEpat().getId()));
if (p.getEcurve() !=null)
buffer.write(String.format("PUMP %s EFFIC %s\n",
p.getId(),p.getEcurve().getId()));
}
buffer.newLine();
}
private void composeTimes(Network net) throws IOException, ENException {
PropertiesMap pMap = net.getPropertiesMap();
buffer.write(Network.SectType.TIMES.parseStr);
buffer.newLine();
buffer.write(String.format("DURATION %s\n", Utilities.getClockTime(pMap.getDuration())));
buffer.write(String.format("HYDRAULIC TIMESTEP %s\n", Utilities.getClockTime(pMap.getHstep())));
buffer.write(String.format("QUALITY TIMESTEP %s\n", Utilities.getClockTime(pMap.getQstep())));
buffer.write(String.format("REPORT TIMESTEP %s\n", Utilities.getClockTime(pMap.getRstep())));
buffer.write(String.format("REPORT START %s\n", Utilities.getClockTime(pMap.getRstart())));
buffer.write(String.format("PATTERN TIMESTEP %s\n", Utilities.getClockTime(pMap.getPstep())));
buffer.write(String.format("PATTERN START %s\n", Utilities.getClockTime(pMap.getPstart())));
buffer.write(String.format("RULE TIMESTEP %s\n", Utilities.getClockTime(pMap.getRulestep())));
buffer.write(String.format("START CLOCKTIME %s\n", Utilities.getClockTime(pMap.getTstart())));
buffer.write(String.format("STATISTIC %s\n", pMap.getTstatflag().parseStr));
buffer.newLine();
}
private void composeOptions(Network net) throws IOException,ENException{
PropertiesMap pMap = net.getPropertiesMap();
FieldsMap fMap = net.getFieldsMap();
buffer.write(Network.SectType.OPTIONS.parseStr);
buffer.newLine();
buffer.write(String.format("UNITS %s\n", pMap.getFlowflag().parseStr));
buffer.write(String.format("PRESSURE %s\n", pMap.getPressflag().parseStr));
buffer.write(String.format("HEADLOSS %s\n", pMap.getFormflag().parseStr));
if (!pMap.getDefPatId().equals(""))
buffer.write(String.format("PATTERN %s\n", pMap.getDefPatId()));
if (pMap.getHydflag() == PropertiesMap.Hydtype.USE)
buffer.write(String.format("HYDRAULICS USE %s\n", pMap.getHydFname()));
if (pMap.getHydflag() == PropertiesMap.Hydtype.SAVE)
buffer.write(String.format("HYDRAULICS SAVE %s\n", pMap.getHydFname()));
if (pMap.getExtraIter() == -1)
buffer.write("UNBALANCED STOP\n");
if (pMap.getExtraIter() >= 0)
buffer.write(String.format("UNBALANCED CONTINUE %d\n", pMap.getExtraIter()));
if (pMap.getQualflag() == PropertiesMap.QualType.CHEM)
buffer.write(String.format("QUALITY %s %s\n", pMap.getChemName(), pMap.getChemUnits()));
if (pMap.getQualflag() == PropertiesMap.QualType.TRACE)
buffer.write(String.format("QUALITY TRACE %s\n", pMap.getTraceNode()));
if (pMap.getQualflag() == PropertiesMap.QualType.AGE)
buffer.write("QUALITY AGE\n");
if (pMap.getQualflag() == PropertiesMap.QualType.NONE)
buffer.write("QUALITY NONE\n");
buffer.write(String.format("DEMAND MULTIPLIER %s\n", pMap.getDmult()));
buffer.write(String.format("EMITTER EXPONENT %s\n", 1.0/pMap.getQexp()));
buffer.write(String.format("VISCOSITY %s\n", pMap.getViscos()/Constants.VISCOS));
buffer.write(String.format("DIFFUSIVITY %s\n", pMap.getDiffus()/Constants.DIFFUS));
buffer.write(String.format("SPECIFIC GRAVITY %s\n", pMap.getSpGrav()));
buffer.write(String.format("TRIALS %d\n", pMap.getMaxIter()));
buffer.write(String.format("ACCURACY %s\n", pMap.getHacc()));
buffer.write(String.format("TOLERANCE %s\n", fMap.revertUnit(Type.QUALITY,pMap.getCtol())));
buffer.write(String.format("CHECKFREQ %d\n", pMap.getCheckFreq()));
buffer.write(String.format("MAXCHECK %d\n", pMap.getMaxCheck()));
buffer.write(String.format("DAMPLIMIT %s\n", pMap.getDampLimit()));
buffer.newLine();
}
private void composeExtraOptions(Network net) throws ENException, IOException {
PropertiesMap pMap = net.getPropertiesMap();
List<String> otherObjsNames = pMap.getObjectsNames(true);
if(otherObjsNames.size()==0)
return;
for(String objName : otherObjsNames){
Object objVal = pMap.get(objName);
buffer.write(objName + " " + objVal);
buffer.newLine();
}
buffer.newLine();
}
private void composeReport(Network net) throws IOException,ENException{
buffer.write(Network.SectType.REPORT.parseStr);
buffer.newLine();
PropertiesMap pMap = net.getPropertiesMap();
FieldsMap fMap = net.getFieldsMap();
buffer.write(String.format("PAGESIZE %d\n",pMap.getPageSize()));
buffer.write(String.format("STATUS %s\n", pMap.getStatflag().parseStr));
buffer.write(String.format("SUMMARY %s\n", pMap.getSummaryflag() ? Keywords.w_YES:Keywords.w_NO));
buffer.write(String.format("ENERGY %s\n", pMap.getEnergyflag() ? Keywords.w_YES:Keywords.w_NO));
switch (pMap.getNodeflag()){
case FALSE:
buffer.write("NODES NONE\n");
break;
case TRUE:
buffer.write("NODES ALL\n");
break;
case SOME:
{
int j = 0;
for(Node node : net.getNodes()){
if(node.isRptFlag()){
if (j % 5 == 0) buffer.write("NODES \n");
buffer.write(String.format("%s ", node.getId()));
j++;
}
}
break;
}
}
switch (pMap.getLinkflag()){
case FALSE:
buffer.write("LINKS NONE\n");
break;
case TRUE:
buffer.write("LINKS ALL\n");
break;
case SOME:
{
int j = 0;
for(Link link : net.getLinks()){
if(link.isRptFlag()){
if (j % 5 == 0) buffer.write("LINKS \n");
buffer.write(String.format("%s ", link.getId()));
j++;
}
}
break;
}
}
for(int i = 0;i< Type.FRICTION.id;i++){
Type t = null;
for (Type type : Type.values()) {
if(type.id==i){
t=type;break;
}
}
Field f = fMap.getField(t);
if(f.isEnabled()){
buffer.write(String.format("%-19s PRECISION %d\n", f.getName(), f.getPrecision()));
if (f.getRptLim(Field.RangeType.LOW) < Constants.BIG)
buffer.write(String.format("%-19s BELOW %s\n", f.getName(), f.getRptLim(Field.RangeType.LOW)));
if (f.getRptLim(Field.RangeType.HI) > -Constants.BIG)
buffer.write(String.format("%-19s ABOVE %s", f.getName(), f.getRptLim(Field.RangeType.HI)));
}
else
buffer.write(String.format("%-19s NO\n", f.getName()));
}
buffer.newLine();
}
private void composeCoordinates(Network net) throws IOException {
buffer.write(Network.SectType.COORDS.parseStr);
buffer.newLine();
buffer.write(COORDINATES_SUBTITLE);
buffer.newLine();
for(Node node : net.getNodes()){
if(node.getPosition()!=null){
buffer.write(String.format(" %s\t%s\t%s\n",node.getId(),node.getPosition().getX(),node.getPosition().getY()));
}
}
buffer.newLine();
}
private void composeLabels(Network net) throws IOException {
buffer.write(Network.SectType.LABELS.parseStr);
buffer.newLine();
buffer.write(";X-Coord\tY-Coord\tLabel & Anchor Node");
buffer.newLine();
for(Label label : net.getLabels()){
buffer.write(String.format(" %s\t%s\t\"%s\"\n", label.getPosition().getX(), label.getPosition().getY(), label.getText()));
}
buffer.newLine();
}
private void composeVertices(Network net) throws IOException {
buffer.write(Network.SectType.VERTICES.parseStr);
buffer.newLine();
buffer.write(";Link\tX-Coord\tY-Coord");
buffer.newLine();
for(Link link : net.getLinks()){
for(Point p : link.getVertices()){
buffer.write(String.format(" %s\t%s\t%s\n",link.getId(),p.getX(),p.getY()));
}
}
buffer.newLine();
}
private void composeRules(Network net) throws IOException, ENException {
buffer.write(Network.SectType.RULES.parseStr);
buffer.newLine();
for(Rule r : net.getRules()){
buffer.write("RULE " + r.getLabel()+"\n");
for(String s : r.getCode().split("\n"))
buffer.write(s+"\n");
buffer.newLine();
}
buffer.newLine();
}
}