Encyclopaedia Index
Parallel Phoenics works by decomposing the complete flow domain into several sub-domains, each of which is handled by a separate processor.
Internally, each sub-domain uses its own local indexing of cells, its own local values of NX,NY,NZ and its own local lists of patches and VR-Objects.
It is because of these features that special care must be taken in the writing of In-Form statements when PHOENICS is to operate in parallel mode.
The statements which present special difficulty are those which require one processor to have knowledge of data which until now have been known only to other processors.
A feature introduced with PHOENICS-2008 partly overcomes this difficulty. It ensures that selected items of information are made accessible to all processors.
Exploiting this new possibility requires some In-Form statements which are acceptable to sequential PHOENICS to be re-written so as to be accepted by parallel PHOENICS, as will be explained below.
Almost all statements and functions of In-Form work equally well with parallel and sequential (i.e. multi-processor and single-processor) PHOENICS.
In the descriptions which follow, the indices IX,IY,IZ, numbers of cells NX,NY,NZ and physical coordinates in {} operators are all in global space.
Among those which did not work prior to PHOENICS 2008 but now do so satisfactorily are the following:
(STORED TS is TEM1*VOL with if(IX.LT.NX/2.AND.IY.LT.NY/3)!SWPFIN)
(MAKE of XPP1 is 0.01) (MAKE of XPP2 is 0.74) (MAKE of YPP1 is 0.338) (MAKE of YPP2 is 0.98) (MAKE of D_UU) (STORE1 D_UU is -100*(U1{XPP1,YPP1} - U1{XPP2,YPP2}) with SWPFIN) (print of U1_different is D_UU)
(MAKE of IXP1 is 1) (MAKE of IXP2 is 3*NX/4) (MAKE of IYP1 is NX/4) (MAKE of IYP2 is NY) (MAKE of D_PI) (STORE1 D_PI is -100*(P1[IXP1,IYP1,1] - P1[IXP2,IYP2,1]) with SWPFIN) (print of P1I_different is D_PI)
Note that expressions involving the use of {} and [] can not be used directly in SOURCE, STORED, INITIAL, PROPERTY or TABLE statements.
However, the desired end can be achieved in two stages by the use of STORE1. For example, instead of:
(STORED of TDIF is 100*(TEM1 - TEM1[NX/2,NY/2,1])) (SOURCE of TEM1 at SRAD is 0.1*(TEM1{0.56,0.45,0.8}-TEM1) with LINE)
one can write:
(MAKE of TSENSA) (MAKE of TSENSB) (STORE1 TSENSA is TEM1[NX/2,NY/2,1]) (STORE1 TSENSB is TEM1{0.56,0.45,0.8}) (STORED of TDIF is 100*(TEM1 - TSENSA)) (SOURCE of TEM1 at SRAD is 0.1*(TSENSB-TEM1) with LINE)
**** SUM() and IF with XYZ *** (MAKE of TSUMX is 0) (MAKE of VSUMX) (STORE1 TSUMX is SUM(TEM1*VOL) with if(XG.LT.0.8.AND.YG.LT.0.5)!SWPFIN) (STORE1 VSUMX is SUM(VOL) with if(XG.LT.0.8.AND.YG.LT.0.5)!SWPFIN) (STORE1 TSUMX is TSUMX/VSUMX!SWPFIN) **** SUM() and IF with IX/IY/IZ *** (MAKE of TSUMI is 0) (MAKE of VSUMI) (STORE1 TSUMI is SUM(TEM1*VOL) with if(IX.LT.30.AND.IY.LT.20)!SWPFIN) (STORE1 VSUMI is SUM(VOL) with if(IX.LT.30.AND.IY.LT.20)!SWPFIN) (STORE1 TSUMI is TSUMI/VSUMI!SWPFIN) (print of TSUMI is TSUMI) **** SUM() and VRObject **** (MAKE of TSUMP is 0) (MAKE of VSUMP) (STORE1 TSUMP at SENTEM is SUM(TEM1*VOL) with SWPFIN) (STORE1 VSUMP at SENTEM is SUM(VOL) with SWPFIN) (STORE1 TSUMP is TSUMP/VSUMP!SWPFIN)
PATCH(DPDX1,EAST,2,NX-1,1,NY,1,1,1,1) (SOURCE of UC1 at DPDX1 is (P1[-1]-P1[+1])/2.)
PATCH(DPDY1,NORTH,1,NX,2,NY-1,1,1,1,1) (SOURCE of VC1 at DPDY1 is (SOUTH(P1)-NORTH(P1))/2.)
(MAKE UR) (STORE1 of UR at INOUT is SUM(AHIGH) with SWPFIN) (print urFIRST is ur) (MAKE UB) (STORE1 of UB at INOUT is SUM(W1*AHIGH)/UR with SWPFIN) (print ubLAST is ub)
Variables are printed to the INFOROUT file (as in sequential mode).
patch(inout,cell,1,nx,1,ny,nz-3,nz-3,1,1) (print FLUX at inout is w1*ahigh)
will not work in parallel mode.
However, instead of this single operator, the following operators can be used:
(stored of FLUX is w1*ahigh with IF(IZ.EQ.NZ-3))
or
(stored of FLUX at inout is w1*ahigh)
In this case the FLUX array is printed in the Result file.
In the current version of In-Form it is impossible to use the following operators: