Я моделирую электрический ток через различные структуры с помощью FiPy. Для этого я решаю уравнение Лапласа для электрического потенциала. Затем я использую закон Ома для получения поля и с помощью проводимости получаю плотность тока.
FiPy хранит потенциал как переменную, ориентированную на ячейку, и его градиент как переменную, ориентированную на лицо, что имеет для меня смысл. У меня два вопроса по поводу гранецентрированных переменных:
Если у меня есть двух- или трехмерная проблема, FiPy вычисляет градиент во всех направлениях (ddx, ddy, ddz). Градиент - это FaceVariable, который всегда определяется на грани между двумя центрами ячеек. Для структурированной (четырехугольной) сетки только одна из производных должна быть больше нуля, поскольку для любой грани положение двух задействованных центров ячеек должно отличаться только в одной координате. Однако в моем моделировании часто случается, что более чем одна из производных (ddx, ddy, ddz) больше нуля, даже для структурированной сетки.
В руководстве дается следующее объяснение метода FaceGrad: Вернуть градиент (phi) как FaceVariable ранга 1, используя разность для нормального направления (градиент второго порядка).
Я не понимаю, чем это отличается от моего понимания, указанного выше.
Что делает его еще более проблематичным: всякий раз, когда включается "слишком много" производных, ток не кажется сохраненным, даже в простейших структурах, которые я моделирую ...Есть ли умный способ получить доступ к данным, хранящимся в лицевой переменной? Предположим, я хотел бы вычислить электрический ток, проходящий через мою смоделированную структуру.
На данный момент я сохраняю данные, хранящиеся в FaceVariable, в виде tsv-файла. Это дает таблицу с (x, y, z) -позициями и (ddx, ddy, ddz) -значениями. Я читаю файл и сохраняю данные в массивы, чтобы использовать их в Python. Это кажется нелогичным и действительно неудобным. Было бы намного лучше иметь доступ к FaceVariable в определенных плоскостях или в определенных точках.