목표

<aside> 📌 입자가 가지고 있는 value를 Grid에서 평가 또는 Grid가 가지고 있는 (Field) value를 입자의 위치에서 평가

</aside>

학습 범위

<aside> <img src="/icons/paste_gray.svg" alt="/icons/paste_gray.svg" width="40px" /> Interpolation을 적용해 본다.

</aside>

⚠️ 모르는 단어나 개념은 Googling이나 ChatGPT로 꼭 알아봅시다!!!

학습 범위에 대한 밑그림

Passive particle simulation이라고도 불리는 입자 simulation은 Field를 계산하지 않는다. 해당 경우는 주어진 외부 Field (전기장 또는 자기장, 중력장이라도 상관은 없다)로부터 하나의 입자가 어떻게 움직이는지 살펴본다. 여러 입자를 Simualtion하더라도 입자와 입자간의 interaction은 고려하지 않는다. 여기서 Background에 있는 가상의 입자들 (즉 여러 입자들 사이를 하나의 입자가 충돌하지 않고 지나가는 길이를 mean free path라고 하는데 그러한 길이를 지나가다가 결국 다른 입자들과 부딪히게 될 것이다)과 부딪히는 것을 모사하거나 또는 Field 값이 fluctuating하여 (turbulence와 같이…) 입자의 path가 fluctuating하는 영향을 받는 것을 모사하기 위해서 중간 중간 입자의 velocity를 상황에 맞게 비틀어 주고 다시 입자가 충돌이 일어나기 전까지를 모사한 다음 계속 입자의 velocity를 조정하여 다른 입자들과의 interaction을 모사하게 된다. 하지만 이러한 입자의 velocity 변화는 momentum의 변화인데 이러한 관심 입자의 momentum 변화가 가상의 background에 전달이 되는 mechanism은 없다. 이러한 passive particle simulation은 기존의 monte carlo method랑 사실상 같은 방법이다.

그렇다면 앞서 언급한 Passive particle simulation과 PIC의 차이는 무엇일까? 가장 처음 언급했지만 Field를 계산하고 계산하지 않고의 차이다. PIC이 도입된 이유를 곰곰히 생각해보면 입자들 간의 Pair interaction을 하기엔 Pair가 너무 많다보니 Grid를 도입하여 Field를 Grid에서 대신 계산하는 것이었다. 일단 Cell안에 3천개 정도의 입자가 있다고 하면 결국 Grid를 이용해서 계산해야 할 자유도는 Cell이 사각형이면 4개 정도겠지만 입자들 사이의 interaction을 보자면 3000 x 2999 pair를 따져봐야 한다. 물론 Grid size보다 작은 interaction scale, 즉 wavelength는 Grid에서 Field를 계산할 시에 고려할 수 없다(high order basis를 쓰면 가능하긴 하지만 실질적으로 한계가 있겠다.) 따라서 앞서의 Cell 도입시 자유도와 Cell 내의 interaction pair를 따지는 건 사실 비교가 맞지 않지만 Cell내의 한 입자와 Cell밖의 다른 입자들간의 interaction pair를 비교한다고 해도 어머어마한 숫자 대비 Grid를 이용했을 때 계산해야하는 격자점(vertices) 수는 비교할 수 없이 작다. 따라서 빠른 Field 계산이 가능하다.

전기장의 경우 결국 입자들로부터 Grid위에서의 입자 density를 평가하고 (Particle → Grid) 그러한 density로부터 Gauss’ law를 계산하여 potential이나 electric field를 Grid 위에서 계산을 한다. 그리고 그러한 Grid위의 Field를 입자를 Push하기 위해서 입자 위치에서 계산하다 (Grid→Particle). 이러한 Particle to Grid, 그리고 Grid to Particle Process를 각각 Scatter와 Gather라고 부른다. (두 Process의 영어단어가 관점에 따라 헷갈리는 점이 있다.) Conventional한 용어는 아니지만 Grid-Particle interaction 또는 Mesh-Particle interaction이라고 부르기도 했다.

Interpolation

입자의 밀도나 전류를 Grid위에서 계산을 하려면 각 입자가 가지고 있는 입자의 개수 (weight)를 근처 존재하는 격자점 위에 흩어 뿌리게 된다. 예를 들면 하나의 입자가 어떠한 사각형 Cell에 있는데 그러한 Cell의 꼭지점에 해당하는 격자점에 입자의 개수를 나누어 주는 형태이다. 이를 어떤 관점에서는 입자가 마치 구름과 같은 부피를 가지고 있고 그러한 부피 중 격자점이 위치한 곳에서의 값을 해당 격자점에 할당하는 식으로도 해석하여 이야기 하기도 한다. 그리고 그러한 부피가 꼭 한 cell에 국한될 필요는 없으며, 입자가 있는 Cell 옆에 있는 Cell들 또는 그 이상으로 넓게 퍼져 있는 것이 가능하지만 주로 3개를 건너띄어 인접한 Cell 이상으로 벗어나는 방법을 실제에서 사용하는 경우는 매우 드물다. 여러 개의 Cell로 한 개 입자의 weight을 분포시키는 것은 다른 이야기로 smooth한 입자의 shape을 사용하는 것으로 noise를 덜 타는 것으로 이야기되고 있지만 computing 양도 늘어나고 다른 issue가 있는 것으로 알려져 있다. 어쨌든 이러한 입자 weight을 주변 Cell에 나누는 방법이 바로 Scatter이다. 즉, 흩뿌리는 것이다. 다시 이야기하면 흩뿌린 입자 개수들을 모두 더하면 이는 원래의 weight이 되어야 한다. 또 다른 표현을 빌리자면 우리는 weight을 근처 관계를 가질 격자점으로 나누어 줄 때 각 격자점에 대한 비율을 정해줘야 한다. 여기서는 linear interpolation, 즉 입자가 속해 있는 Cell을 이루고 있는 격자점에 대해서만 weight을 나누어 주는 것을 고려하겠다. (0th order의 경우는 가장 근접한 격자점인 Nearest-grid-point (NGP)에 weight을 모두 할당한다.)

그렇다면 어떠한 기준으로 각 격자점에 할당할 비율을 설정할 수 있을까? 아무래도 현재 입자가 위치한 곳 근처에 있는 격자점이 그 반대편에 있는 비교적 멀리 있는 격자점보다 많이 가져가야 맞을 것 같다. 왜냐하면 가상 입자가 부피를 가지고 있다고 가정하면 근처에 있는 입자가 보다 많은 입자들 근처에 있게 될 듯 하다. 마치 Heuristic method와 같긴 하지만 정성적으로 표현을 해서 그렇지 정량적으로 정확한 식들을 기반으로 하고 있으니 걱정하지 않아도 된다. 이러한 1차 interpolation 형태를 Cloud-In-Cell (CIC)이라고 표현하기도 한다. 1차원에서는 한 Cell이 결국은 두 Vertex를 이은 하나의 Edge이므로 양 쪽 격자점(Vertex)과 입자 사이의 거리를 계산 후 반대쪽 거리를 전체 edge 길이로 나누어준 비율로 적용해주면 된다. 예를 들면 1차원 Cell에서 격자와 격자 간격, 즉 edge의 길이가 4인 상황에서 입자가 왼쪽 점으로부터 3만큼 떨어진 지점에 있다고 가정을 해보자. 그렇다면 왼쪽 점에 할당될 weight의 비율은 입자를 기준으로 오른쪽 점까지의 길이인 1을 고려한 1/4을 가지게 된다. 반대로 오른쪽 점에 할당될 입자의 weight은 입자를 기준으로 왼쪽 점까지의 길이인 3을 고려하여 3/4를 가지게 된다. 입자의 weight이 12였다면, 왼쪽 점은 3을, 오른쪽 점은 9를 가지게 되는 것이다. 두 합은 원래 weight인 12가 된다. 2차원 직사각형 Cell의 경우는 어떻게 다룰까? 같은 논리로 면적으로 따지게 된다. 직사각형은 4개의 격자점으로 구성이 되어 있으므로 Cell 안에 포함된 입자의 위치를 기준으로 총 4개의 면적을 가지게 된다. 각 격자점에 할당될 weight은 입자를 기준으로 할당받을 격자점의 반대편에 있는 면적을 전체 면적으로 나눈 값에 weight을 곱한 값이 된다. 3차원 Volume도 마찬가지이다.

지금까지는 입자 하나를 어떻게 나눌지에 대해서 이야기를 했다. 앞서 다른 Section에서 이야기를 했듯이 우리는 Cell당 3천개의 입자를 다루고 하나의 격자점, 즉 Vertex는 Boundary Tip에 위치해 있는 것이 아니라면 여러 Cell들에게 공유되고 있다. 따라서 한 Cell 내의 여러 입자들이 특정 격자점에 값들을 할당 하게 되고 그 옆에 다른 Cell에서 또한 그 특정 격자점에 값을 할당하여 더하게 되는 방식이다. 이렇게 더해진 여러 입자들로부터 온 weight은 Unit으로 따지자면 입자의 개수이다. 하지만 우리가 Gauss’ law로 부터 계산하고자 하는 것은 입자 밀도이다. 즉 부피로 나눠야 한다. Ampere’s law 계산을 위한 전류 밀도 또한 입자 각각의 속도에 전하를 곱한 다음에 같은 방식으로 격자점에 나누어 주면 된다.

Gather는 Scatter의 반대 Process다. Solve process에서 구해져 격자점에서 정의된 전기장 또는 자기장 값을 얻었다면 이제는 각 입자의 위치에서 Electric Field를 계산할 차례이다. 왜냐하면 Gather의 다음 Process인 Push에서 입자의 위치에서의 전기장이나 자기장을 계산해야 하기 때문이다. 어떻게보면 Gather Process야말로 conventional하게 쓰이는 Interpolation의 의미와 비슷하겠다.