/*
* JaamSim Discrete Event Simulation
* Copyright (C) 2013 Ausenco Engineering Canada Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jaamsim.FluidObjects;
import com.jaamsim.DisplayModels.ShapeModel;
import com.jaamsim.input.ColourInput;
import com.jaamsim.input.Keyword;
import com.jaamsim.input.Output;
import com.jaamsim.input.ValueInput;
import com.jaamsim.units.DistanceUnit;
import com.jaamsim.units.PressureUnit;
import com.jaamsim.units.VolumeUnit;
/**
* FluidTank is a storage tank that contains a fluid.
* @author Harry King
*
*/
public class FluidTank extends FluidComponent {
@Keyword(description = "The total volume of fluid that can be stored in the tank.",
example = "Tank1 Capacity { 1.0 m3 }")
private final ValueInput capacityInput;
@Keyword(description = "The volume of fluid in the tank at the start of the simulation run.",
example = "Tank1 InitialVolume { 1.0 m3 }")
private final ValueInput initialVolumeInput;
@Keyword(description = "The atmospheric pressure acting on the surface of the fluid in the "
+ "tank.",
example = "Tank1 AmbientPressure { 1.0 Pa }")
private final ValueInput ambientPressureInput;
@Keyword(description = "The height of the flow feeding the tank. Measured relative to the "
+ "bottom of the tank.",
example = "Tank1 InletHeight { 1.0 m }")
private final ValueInput inletHeightInput;
private double fluidVolume; // The present volume of the fluid in the tank.
private double fluidLevel; // The height of the fluid in the tank.
{
capacityInput = new ValueInput( "Capacity", "Key Inputs", 1.0d);
capacityInput.setValidRange( 0.0, Double.POSITIVE_INFINITY);
capacityInput.setUnitType( VolumeUnit.class );
this.addInput( capacityInput);
initialVolumeInput = new ValueInput( "InitialVolume", "Key Inputs", 0.0d);
initialVolumeInput.setValidRange( 0.0, Double.POSITIVE_INFINITY);
initialVolumeInput.setUnitType( VolumeUnit.class );
this.addInput( initialVolumeInput);
ambientPressureInput = new ValueInput( "AmbientPressure", "Key Inputs", 0.0d);
ambientPressureInput.setUnitType( PressureUnit.class );
this.addInput( ambientPressureInput);
inletHeightInput = new ValueInput( "InletHeight", "Key Inputs", 0.0d);
inletHeightInput.setValidRange( 0.0, Double.POSITIVE_INFINITY);
inletHeightInput.setUnitType( DistanceUnit.class );
this.addInput( inletHeightInput);
}
@Override
public void earlyInit() {
super.earlyInit();
fluidVolume = initialVolumeInput.getValue();
}
@Override
public void addVolume( double v ) {
fluidVolume += v;
fluidLevel = fluidVolume / this.getFlowArea();
}
@Override
public double calcOutletPressure( double inletPres, double flowAccel ) {
return this.getFluidPressure(0.0);
}
@Override
public double getTargetInletPressure() {
return this.getFluidPressure( inletHeightInput.getValue() );
}
/*
* Return the pressure in the tank at the given height above the outlet.
*/
private double getFluidPressure( double h ) {
double pres = ambientPressureInput.getValue();
if( h < fluidLevel ) {
pres += ( fluidLevel - h) * this.getFluid().getDensityxGravity();
}
return pres;
}
@Override
public double getFluidVolume() {
return fluidVolume;
}
public double getFluidLevel() {
return fluidLevel;
}
@Override
public void updateGraphics(double simTime) {
super.updateGraphics(simTime);
double ratio = Math.min( 1.0, fluidVolume / capacityInput.getValue() );
setTagSize(ShapeModel.TAG_CONTENTS, ratio);
if( this.getFluid() != null )
setTagColour(ShapeModel.TAG_CONTENTS, this.getFluid().getColour());
else
setTagColour(ShapeModel.TAG_CONTENTS, ColourInput.getColorWithName("black"));
}
@Output(name = "FluidVolume",
description = "The volume of the fluid stored in the tank.",
unitType = VolumeUnit.class)
public double getFluidVolume( double simTime ) {
return fluidVolume;
}
@Output(name = "FluidLevel",
description = "The height of the fluid from the bottom of the tank.",
unitType = DistanceUnit.class)
public double getFluidLevel( double simTime ) {
return fluidLevel;
}
}