/*
* 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.hydraulic.structures;
import java.util.Arrays;
public class LSVariables {
private double[] nodalInflows; // Epanet 'X[n]' variable
private double[] matrixOffDiagonal; // Epante Aij[n] variable
private double[] matrixDiagonal; // Epanet Aii[n] variable
private double[] rightHandSideCoeffs; // Epanet F[n] variable
public void clear() {
Arrays.fill(nodalInflows, 0);
Arrays.fill(matrixOffDiagonal, 0);
Arrays.fill(matrixDiagonal, 0);
Arrays.fill(rightHandSideCoeffs, 0);
}
public LSVariables(int nodes, int coeffs) {
nodalInflows = new double[nodes];
matrixDiagonal = new double[nodes];
matrixOffDiagonal = new double[coeffs];
rightHandSideCoeffs = new double[nodes];
clear();
}
public void addRHSCoeff(int id, double value) {
rightHandSideCoeffs[id] += value;
}
public double getRHSCoeff(int id) {
return rightHandSideCoeffs[id];
}
public void addNodalInFlow(int id, double value) {
nodalInflows[id] += value;
}
public double getNodalInFlow(int id) {
return nodalInflows[id];
}
public void addNodalInFlow(SimulationNode id, double value) {
nodalInflows[id.getIndex()] += value;
}
public double getNodalInFlow(SimulationNode id) {
return nodalInflows[id.getIndex()];
}
public void addAii(int id, double value) {
matrixDiagonal[id] += value;
}
public double getAii(int id) {
return matrixDiagonal[id];
}
public void addAij(int id, double value) {
matrixOffDiagonal[id] += value;
}
public double getAij(int id) {
return matrixOffDiagonal[id];
}
public double[] getAiiVector() {
return matrixDiagonal;
}
public double[] getAijVector() {
return matrixOffDiagonal;
}
public double[] getRHSCoeffs() {
return rightHandSideCoeffs;
}
}
/**
* Linear System Variables that feed the sparse matrix for each iteration.
public class LSVariablesSim {
private double [] nodalInflows; // Epanet 'X[n]' variable
private double [] matrixOffDiagonal; // Epante Aij[n] variable
private double [] matrixDiagonal; // Epanet Aii[n] variable
private double [] rightHandSideCoeffs; // Epanet F[n] variable
public void clear(){
Arrays.fill(nodalInflows,0);
Arrays.fill(matrixOffDiagonal,0);
Arrays.fill(matrixDiagonal,0);
Arrays.fill(rightHandSideCoeffs,0);
}
public LSVariables(int nodes, int coeffs) {
nodalInflows = new double[nodes];
matrixDiagonal = new double[nodes];
matrixOffDiagonal = new double[coeffs];
rightHandSideCoeffs = new double[nodes];
clear();
}
public void addRHSCoeff(int id, double value){
synchronized (rightHandSideCoeffs){
rightHandSideCoeffs[id]+=value;
}
}
public double getRHSCoeff(int id){
synchronized (rightHandSideCoeffs){
return rightHandSideCoeffs[id];
}
}
public void addNodalInFlow(int id, double value){
synchronized (nodalInflows){
nodalInflows[id]+=value;
}
}
public double getNodalInFlow(int id){
synchronized (nodalInflows){
return nodalInflows[id];
}
}
public void addNodalInFlow(SimulationNode id, double value){
synchronized (nodalInflows){
nodalInflows[id.getIndex()]+=value;
}
}
public double getNodalInFlow(SimulationNode id){
synchronized (nodalInflows){
return nodalInflows[id.getIndex()];
}
}
public void addAii(int id, double value){
synchronized (matrixDiagonal){
matrixDiagonal[id]+=value;
}
}
public double getAii(int id){
synchronized (matrixDiagonal){
return matrixDiagonal[id];
}
}
public void addAij(int id, double value){
synchronized (matrixDiagonal){
matrixOffDiagonal[id]+=value;
}
}
public double getAij(int id){
synchronized (matrixDiagonal){
return matrixOffDiagonal[id];
}
}
public double [] getAiiVector(){
return matrixDiagonal;
}
public double [] getAijVector(){
return matrixOffDiagonal;
}
public double [] getRHSCoeffs(){
return rightHandSideCoeffs;
}
}
*/