IMO, вы действительно мало что можете получить от этой функции, которая, по сути, является набором арифметических операций.
Вы можете поглотить *0.125_dp
в других константах.
ЛучшеВы можете переписать вычисление как (псевдокод)
ar= 1 + 2 * ((ar > 1) - ar)
Del= (2 + ar + sqrt(1 - ar * ar)) * 0.125
Это предполагает неявное преобразование .false.
в 0
и .true.
в 1
, что может не выполняться вашим компилятором.Надеюсь, он скомпилирован как безветвленный.
Поскольку длина вектора равна четырем, вы можете полностью развернуть цикл (но, возможно, компилятор уже делает это).
Моя ставка в том, что выиграл 'не имеет видимого значения.
Чтобы повысить производительность, вы должны рассмотреть код с более глобальной точки зрения и, возможно, рассмотреть возможность распараллеливания.
Обновление:
Как указал @kvantour, я пропустил смену знака.Мы можем исправить с помощью
i= 2 * (ar > 1) - 1
ar= i + 2 * (1 - ar)
Del= (2 + ar + i * sqrt(1 - ar * ar)) * 0.125
В качестве альтернативы,
i= SIGN(1, ar - 1)
, если это окажется эффективным.