Не все знают, что в Петреловском калькуляторе свойств можно обращаться к любой ячейке грида, используя такой же синтаксис, как и во многих языках программирования, указывая координаты ячейки в квадратных скобках. При этом, если скобки не указаны подразумевается, то адресуется текущая ячейка, с координатами I, J, K.
Координаты ячейки могут быть относительными (I+1 – следующая по оси Х, K-1 – предыдущий слой и т.д.) или абсолютными, указывая на конкретную ячейку.
Например, в выражении ниже произойдет копирование свойств первого слоя на все остальные. В принципе в этом выражении можно даже конструкцией if не пользоваться.
Poro = if(K>1, Poro[i,j,1], Poro) или Poro = Poro[i,j,1]
Ну и еще, исключительно для примера, произведём некого рода сглаживание, путем осреднения значений соседних ячеек. Понятно, что сам Petrel умеет сглаживать гораздо лучше, но тут важно продемонстрировать возможности калькулятора:
PoroSmooth = (Poro[i-1,j,k]+Poro[i+1,j,k]+Poro+Poro[i,j-1,k]+Poro[i, j+1,k])/5
И еще момент, в последнем примере нет необходимости проверять граничные значения (не вывалились ли мы за пределы грида). Ничего криминального не произойдет. Petrel автоматически проигнорирует выражения, в которых происходит обращение к недопустимым значениям индексов, что очень удобно и значительно упрощает жизнь, т.к. нет необходимости вводить огромное количество вложенных if-ов в одном выражении. НО, есть один нюанс, краевые ячейки результирующего грида будут иметь неопределенные значения – U, которые если это необходимо можно будет подправить следующими выражениями:
PoroSmooth = if(i=1,(Poro[i+1,j,k]+Poro+Poro[i,j-1,k]+Poro[i, j+1,k])/4, PoroSmooth) PoroSmooth = if(i=i.Max,Poro[i-1,j,k]+Poro+Poro[i,j-1,k]+Poro[i,j+1,k])/4, PoroSmooth) ...
Ну и еще в вышеприведенном примере, если в вашем свойстве Poro есть неопределенные ячейки внутри грида, это конечно же добавит необходимость их отработать.