%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MDS Modular Design System 1.00 2007
% Th. Fetz, M. Möderl
% http://techmath.uibk.ac.at/fetz/downloads/mds.zip
%
% readme.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Installation:
=============
PLEASE ADD THE DIRECTORY mds TO YOUR MATLAB PATH!
Generating moduls:
==================
1. By a matrix describing the graph:

MDS = mds(graph) module defined by matrix graph
graph(i,j) defines the connections to and from node (i,j) in the
rectangular grid. The connections to the neighbornodes are binary coded:
0 no connections
1 connection to the right node
2 connection to the upper node
4 connection to the left node
8 connection to the lower node
Example:
o
 is coded by 1+4+8 = 13
2. By generating empty modules and inserting existing modules:

Empty modules:
MDS = mds(m,n) empty module, size m x n
MDS = mds(m,n,dx,dy) empty module, size m x n, gridsize dx, dy
Inserting modules:
MDS(i,j) = M inserting the module M into module MDS where the upper left
node of M is inserted at (i,j) of MDS.
Concatenating modules:
Columnwise or rowwise concatenating in the same way as matlab matrices but
with overlapping columns and rows, respectively, and using operator "or".
Example:
N = ooo M = oo
 
. oo oo
N = mds([1 5 4; 0 3 4])
M = mds([1 4; 1 6])
MDS = [N, M] = oooo = [1 5 bitor(4,1) 4; 0 3 bitor(4,1) 6]
 
. ooo = [1 5 5 4; 0 3 5 6];
Rotating modules:
=================
M = rotate(N,1) 90° counterclockwise
M = rotate(N,2) 180° counterclockwise
M = rotate(N,3) 270° counterclockwise
Setting the types of the nodes:
===============================
Setting the type of all nodes of the graph:

module.nodes.type = TYPE
TYPE can be either a value or a matrix of the same size as the module.
Allowed values for TYPE: JUNCTIONS RESERVOIRS AUTOCONNECT NONE
as defined in mdstypes (this mfile should always be called at the beginning)
Nodes are junctions by default.
Setting the type of single node (i,j):

modules.nodes.type(i,j) = TYPE
Setting the types of the arcs (connections):
============================================
Arcs are always pipes so far.
Setting properties:
===================
Setting a property of all nodes of the same type:

module.type.property = value
types: junctions, reservoirs
properties: as in epanet
Example: M.junctions.elev = 10
Setting a property of node (i,j):

module.type.property(i,j) = values
Setting a property of all pipes:

module.pipes.property = value
properties: as in epanet
Example: M.pipes.roughness = 0.4
Setting a property of a single pipe (i,j):

horizontal pipes: pipe between node node (i,j) and node (i,j+1)
module.hpipes.property(i,j) = value
vertical pipes: pipe between node node (i,j) and node (i1,j)
module.vpipes.property(i,j) = value
Autoconnecting feature:
========================
Autoconnecting node A:

An autoconnecting node is junction with only one connection C to a neighbor
node. Applying the function "connect" junctions and pipes are inserted between
the autoconnecting node A and the first node reached in the opposite
direction of the connection C. The properties of A and C are inherited to
the new pipes and junctions inserted.
oA . . . . . . oo

o
N = mds([1 4]);
N.nodes.type = [JUNCTIONS AUTOCONNECT];
M = mds([1 12;0 2]);
MDS = mds(2,10);
MDS(1,1) = N;
MDS(9,1) = M;
Result:
oA . . . . . . oo

. . . . . . . . . o
MDS = connect(MDS);
Result:
oAoooooooo

. . . . . . . . . o