Периодическая граница — это место, где частицы, выходящие за пределы поля моделирования, повторно входят с противоположной стороны, имитируя бесконечную систему.
Если L = периодическая длина, то
Только в случае положительных осей значения переносимых координат должны находиться в диапазоне [0, L) (исключительно справа, т. е. значения оборачиваются до L).
В случае смешанных отрицательно-положительных осей значения переносимых координат должны находиться в диапазоне [-L/2, L/2] (оба включительно).
Примеры для положительных координат, где L=10 и обернутые значения должны оставаться между [0, 10) (левая сторона включительно и правая сторона). эксклюзивный):
Пример переноса только положительных значений (L=10):
эта процедура отлично работает для всех заданных условий. Примеры для смешанных отрицательно-положительных координат, где L=10 и обернутых значений должно оставаться в диапазоне [-5, 5] (обе стороны включительно):
Эта процедура завершается успешно, за исключением #6, которая дает (-5.0, -5.0, -5.0) после переноса.
Как я могу внести исправления в вторая процедура? Примечание. Я не должен использовать if-else или ?: (условный оператор) только из соображений производительности. Когда я работаю с тысячами частиц, проверка каждой координаты для каждой оси значительно снижает производительность.
Периодическая граница — это место, где частицы, выходящие за пределы поля моделирования, повторно входят с противоположной стороны, имитируя бесконечную систему. Если L = периодическая длина, то [list] [*]Только в случае положительных осей значения переносимых координат должны находиться в диапазоне [b][0, L)[/b] (исключительно справа, т. е. значения оборачиваются до L).
[*]В случае смешанных отрицательно-положительных осей значения переносимых координат должны находиться в диапазоне [b][-L/2, L/2] (оба включительно).
[/list] Примеры для положительных координат, где L=10 и обернутые значения должны оставаться между [0, 10) (левая сторона включительно и правая сторона). эксклюзивный):[/b] Пример переноса только положительных значений (L=10): [list] [*]WrapPositive(10 , 3.0) → 3.0 [*]WrapPositive(10, 12.0) → 2.0 [*]WrapPositive(10, -1.0) → 9.0 [*]WrapPositive(10, 0.0) → 0.0 [*]WrapPositive(10, 10.0) → 0.0 [*] WrapPositive(10, 0.001) → 0.001 [/list] [code]double WrapPositive(double periodicDistance, double position) { return (position % periodicDistance + periodicDistance) % periodicDistance ; } [/code] эта процедура отлично работает для всех заданных условий. [b]Примеры для смешанных отрицательно-положительных координат, где L=10 и обернутых значений должно оставаться в диапазоне [-5, 5] (обе стороны включительно):[/b] [list] [*]WrapNegativePositive(10, 3.0) → 3.0[*]WrapNegativePositive(10, 6.0) → -4.0 [*]WrapNegativePositive(10, -6.0) → 4.0 [*]WrapNegativePositive(10, 0.0) ) → 0.0 [*]WrapNegativePositive(10, -5.0) → -5.0 [*]WrapNegativePositive(10, 5.0) → 5.0 [*]WrapNegativePositive(10, 4.999999999) → 4.999999999 [*]WrapNegativePositive(10, -5.000000001) → -4.999999999 [/list] [code]double WrapNegativePositive(double periodicDistance, double position) { return ((position + periodicDistance / 2) % periodicDistance + periodicDistance) % periodicDistance - periodicDistance / 2; } [/code] Эта процедура завершается успешно, за исключением #6, которая дает (-5.0, -5.0, -5.0) после переноса. Как я могу внести исправления в вторая процедура? [b]Примечание.[/b] Я не должен использовать if-else или ?: (условный оператор) только из соображений производительности. Когда я работаю с тысячами частиц, проверка каждой координаты для каждой оси значительно снижает производительность.