107 | | Of course the above example works for any field - but does not impose the divergence free constraint. (Presumably the functions {{{Bx}}}, {{{By}}}, and {{{Bz}}} would take care of that) to the degree they are accurately integrated along each edge - but a better approach is to instead initialize the vector potential and then discretely difference it to get the face fields. |
| 107 | Of course the above example works for any field - but does not impose the divergence free constraint. Presumably the functions {{{Bx}}}, {{{By}}}, and {{{Bz}}} would take care of that to the degree they are accurate face averages - but a better approach is to instead approximate the vector potential at cell edges and then discretely difference it to get the face average fields. |
| 108 | |
| 109 | {{{ |
| 110 | IF (nDim == 2) THEN |
| 111 | !In 2D the only component of the vector potential that matters is Az |
| 112 | ALLOCATE(A(1:Info%mX(1)+1,1:Info%mX(2)+1,1,1) |
| 113 | DO i=1, Info%mX(1)+1 |
| 114 | x = Info%xBounds(1,1)+(REAL(i)-1d0)*dx(1) |
| 115 | DO j=1, Info%mX(2)+1 |
| 116 | y = Info%xBounds(2,1)+(REAL(j)-1d0)*dx(2) |
| 117 | A(i,j,1,1)=Az(x,y,z) |
| 118 | END DO |
| 119 | END DO |
| 120 | |
| 121 | !Then take the curl of A to get B |
| 122 | FORALL(i=1:Info%mX(1)+1,j=1:Info%mX(2)) |
| 123 | Info%aux(i,j,1,1)=+(A(i,j+1,1,1)-A(i,j,1,1))/dx(2) |
| 124 | END FORALL |
| 125 | FORALL(i=1:Info%mX(1),j=1:Info%mX(2)+1) |
| 126 | Info%aux(i,j,1,2)=-(A(i+1,j,1,1)-A(i,j,1,1))/dx(1) |
| 127 | END FORALL |
| 128 | |
| 129 | ELSEIF (nDim == 3) THEN |
| 130 | !Now the vector potential is a 3 component vector |
| 131 | ALLOCATE(A(1:Info%mX(1)+1,1:Info%mX(2)+1,1:Info%mX(3)+1,3) |
| 132 | |
| 133 | !We could do this with three separate loops to avoid calculating |
| 134 | !A(:,:,Info%mX(3)+1,3),A(:,Info%mX(2)+1,:,2), and A(Info%mX(1)+1,:,:,1) |
| 135 | !Since these do not get used in taking the curl... |
| 136 | |
| 137 | DO i=1, Info%mX(1)+1 |
| 138 | x = Info%xBounds(1,1)+(REAL(i)-1d0)*dx(1) |
| 139 | DO j=1, Info%mX(2)+1 |
| 140 | y = Info%xBounds(2,1)+(REAL(j)-1d0)*dx(2) |
| 141 | DO k=1, Info%mX(3)+1 |
| 142 | z = Info%xBounds(3,1)+(REAL(k)-1d0)*dx(3) |
| 143 | A(i,j,k,1)=Ax(x+half*dx(1),y,z) |
| 144 | A(i,j,k,2)=Ay(x,y+half*dx(2),z) |
| 145 | A(i,j,k,3)=Az(x,y,z+half*dx(3)) |
| 146 | END DO |
| 147 | END DO |
| 148 | END DO |
| 149 | |
| 150 | !Then take the curl of A to get B |
| 151 | FORALL(i=1:Info%mX(1)+1,j=1:Info%mX(2),k=1:Info%mX(3)) |
| 152 | Info%aux(i,j,k,1)=+(A(i,j+1,k,3)-A(i,j,k,3))/dx(2)-(A(i,j,k+1,2)-A(i,j,k,2))/dx(3) |
| 153 | END FORALL |
| 154 | FORALL(i=1:Info%mX(1),j=1:Info%mX(2)+1,k=1:Info%mX(3)) |
| 155 | Info%aux(i,j,k,2)=+(A(i,j,k+1,1)-A(i,j,k,1))/dx(3)-(A(i+1,j,k,3)-A(i,j,k,3))/dx(1) |
| 156 | END FORALL |
| 157 | FORALL(i=1:Info%mX(1),j=1:Info%mX(2),k=1:Info%mX(3)+1) |
| 158 | Info%aux(i,j,k,3)=+(A(i+1,j,k,2)-A(i,j,k,2))/dx(1)-(A(i,j+1,k,1)-A(i,j,k,1))/dx(2) |
| 159 | END FORALL |
| 160 | END IF |
| 161 | |
| 162 | }}} |
| 163 | |
| 164 | [[Image(Stencil.png, width=400)]] |