== messy_clamsmix_si.f90 ==
=== sub. clamsmix_global_end ===
* '''clamsmix_set_config'''
{{{
SUBROUTINE clamsmix_set_config
}}}
* in messy_clamsmix.f90
* Setze von mix benötigte Variablen:
adapt_par, time_step, nthetas, l_nthetas, theta_min, theta_max
* '''clamsmix_set_bounds '''
{{{
SUBROUTINE clamsmix_set_bounds
}}}
* in messy_clamsmix.f90
* Setze die Grenzen für jedes Level:
theta_min_act, theta_max_act, theta_delta_act, l_min_act, l_max_act, l_delta_act
* '''clamsmix_sort'''
{{{
SUBROUTINE clamsmix_sort (status, level, indarr, irange)
}}}
* Indexsortierung des Levels (ZETA)
* Variablen
|| status || integer || || OUT || Fehlercode ||
|| level || real(prec) || (dnparts) || IN || Level (ZETA-Werte)||
|| indarr || integer || (dnparts) || OUT || sortierter Index von levelind||
|| irange || integer || (2,l_nthetas,0:ntasks-1) || OUT || Start- und Endposition jedes Levels im sortierten Feld <
> irange(1,i,k): Erster Punkt auf Level i in levelind(indarr) auf PE k <
> irange(2,i,k): Letzter Punkt auf Level i in levelind(indarr) auf PE k||
|| levelind || integer || (dnparts) || LOKAL || Index der ZETA-Werte in ZETA-Grid||
* Ermittle zu jedem ZETA-Wert den Index im ZETA-Grid -> levelind
* Indexsortierung des Feldes levelind -> indarr
* Ermittle den ersten und letzten Punkt jedes Levels in levelind(indarr) -> irange
{{{
ipart 1 2 3 4 5 6 7 8 9
level 320 330 325 340 322 331 332 342 mdi
levelind 1 2 1 3 1 2 2 3 9999
indarr 1 3 5 2 6 7 4 8 9
levelind 1 1 1 2 2 2 3 3 9999
(indarr)
irange (1,3) (4,6) (7,8)
}}}
* '''clamsmix_nparts_per_level '''
{{{
SUBROUTINE clamsmix_nparts_per_level (irange, dnparts_level, nparts_level)
}}}
* in messy_clamsmix.f90
* Ermittle die Anzahl Punkte pro Level
* Parameter:
|| irange || integer || (2,l_nthetas,0:ntasks-1) || IN || Start- und Endposition jedes Levels für jede PE||
|| dnparts_level || integer || (l_nthetas,0:ntasks-1) || OUT || Anzahl Punkte pro Level für jede PE ||
|| nparts_level || integer || (l_nthetas) || OUT || Anzahl Punkte pro Level auf allen PEs ||
* '''clamsmix_set_level '''
{{{
SUBROUTINE clamsmix_set_level (levelrange, nparts_level)
}}}
* in messy_clamsmix.f90
* Ermittle für jede PE, welche Level bearbeitet werden
* Wenn mehr CPUs als Level genutzt werden, bearbeiten die ersten nthetas CPUs jeweils ein Level, die weiteren bleiben ungenutzt
* Bei weniger CPUs als Level wird die Anzahl Punkte möglichst gleichmäßig auf die CPUs verteilt: <
>
Es wird solange jeweils das nächste Level hinzugefügt, bis die Anzahl der Punkte auf der aktuellen CPU möglichst nah an nparts/ntasks und die Gesamtzahl der bisher zugeteilten Punkte möglichst nah an (nparts/ntasks)*(irank+1) liegt.
* Parameter:
|| nparts_level || integer || (l_nthetas) || IN || Anzahl Punkte pro Level auf allen PEs ||
|| levelrange || integer || (2,0:ntasks-1)|| OUT || Start- und Endlevel für jede PE ||
* '''clamsmix_shuffle'''
{{{
SUBROUTINE clamsmix_shuffle (status, my_nparts, indarr, irange, levelrange, &
dnparts_level, nparts_level, level, infield, outfield)
}}}
* Umsortierung der Punkte:
Jede PE bekommt alle Punkte, deren Level zwischen levelrange(1,irank) and levelrange(2,irank) liegt
* Parameter
|| status || integer || || OUT || Fehlercode ||
|| my_nparts || integer || || OUT || neue Anzahl Punkte auf aktueller PE||
|| indarr || integer || (dnparts) || IN || ||
|| irange || integer || (2,l_nthetas,0:ntasks-1)|| IN || ||
|| levelrange || integer || (2,0:ntasks-1) || IN || ||
|| dnparts_level|| integer || (l_nthetas,0:ntasks-1) || IN || ||
|| nparts_level || integer || (l_nthetas) || IN || ||
|| level || real(prec)|| (dnparts_max) || IN || Level (ZETA-Werte) ||
|| infield || real(prec)|| (dnparts_max) || IN || Umzuordnender Parameter ||
|| outfield || real(prec)|| (dnparts_max) || OUT || Umgeordneter Parameter ||
* Jede PE schreibt die Daten, die von ihr selbst bearbeitet werden, zuerst auf outfield
* Jede PE empfängt von allen anderen die Punkte, die auf den von der PE zu bearbeitenden Leveln liegen, und hängt diese an outfield an
* Jede PE sendet an alle anderen PEs die Punkte, die auf den von dieser zu bearbeitenden Leveln liegen
* Falls Unterintervalle für mix gewählt wurden (nintervals>1) müssen noch Punkte aus den Grenzbereichen ausgetauscht werden. Diese werden jeweils auf zwei aufeinanderfolgenden PEs benötigt: <
>
Von der vorhergehenden PE müssen die Punkte zwischen theta_min_act und l_min_act noch geholt werden. Von der nachfolgenden PE müssen die Punkte zwischen l_max_act und theta_max_act noch geholt werden.
* setze die aktuelle Anzahl Punkte auf der jeweiligen PE ->my_nparts
* '''mix'''
* '''clamsmix_shuffle'''
{{{
SUBROUTINE clamsmix_reshuffle
}}}
*Punkte wieder gleichmäßig auf CPUs verteilen