163 integer,
intent(in) :: ixG^L
165 double precision :: x(ixG^S,ndim), xext(ixGmin1-1:ixGmax1,1), drs(ixG^S), drs_ext(ixGmin1-1:ixGmax1), dx2(ixG^S), dx3(ixG^S)
166 double precision :: exp_factor_ext(ixGmin1-1:ixGmax1),del_exp_factor_ext(ixGmin1-1:ixGmax1),exp_factor_primitive_ext(ixGmin1-1:ixGmax1)
167 double precision :: exp_factor(ixGmin1:ixGmax1),del_exp_factor(ixGmin1:ixGmax1),exp_factor_primitive(ixGmin1:ixGmax1)
172 drs(ixg^s)=s%dx(ixg^s,1)
173 x(ixg^s,1)=s%x(ixg^s,1)
176 call usr_set_surface(ixgmin1,ixgmax1,x,drs,exp_factor,del_exp_factor,exp_factor_primitive)
177 if (any(exp_factor <= zero))
call mpistop(
"The area must always be strictly positive!")
179 s%surface(ixg^s,1)=exp_factor(ixg^s)
180 xext(ixgmin1-1,1)=x(1,1)-half*drs(1)
181 xext(ixg^s,1)=x(ixg^s,1)+half*drs(ixg^s)
182 drs_ext(ixgmin1-1)=drs(1)
183 drs_ext(ixg^s)=drs(ixg^s)
185 s%surfaceC(ixgmin1-1:ixgmax1,1)=exp_factor_ext(ixgmin1-1:ixgmax1)
189 drs(ixg^s)=s%dx(ixg^s,1)
191 dx2(ixg^s)=s%dx(ixg^s,2)}
193 dx3(ixg^s)=s%dx(ixg^s,3)}
196 s%surfaceC(ixg^s,1)=1.d0
197 s%surface(ixg^s,1) =1.d0
200 s%surfaceC(ixg^s,1)=dx2(ixg^s)
201 s%surfaceC(ixg^s,2)=drs(ixg^s)
202 s%surface(ixg^s,1) =dx2(ixg^s)
203 s%surface(ixg^s,2)=drs(ixg^s)
206 s%surfaceC(ixg^s,1)= dx2(ixg^s)*dx3(ixg^s)
207 s%surfaceC(ixg^s,2)= drs(ixg^s)*dx3(ixg^s)
208 s%surfaceC(ixg^s,3)= drs(ixg^s)*dx2(ixg^s)
209 s%surface(ixg^s,1)=s%surfaceC(ixg^s,1)
210 s%surface(ixg^s,2)=s%surfaceC(ixg^s,2)
211 s%surface(ixg^s,3)=s%surfaceC(ixg^s,3)
213 {s%surfaceC(0^
d%ixG^s,^
d)=s%surfaceC(1^
d%ixG^s,^
d);\}
215 x(ixg^s,1)=s%x(ixg^s,1)
217 x(ixg^s,2)=s%x(ixg^s,2)
219 drs(ixg^s)=s%dx(ixg^s,1)
221 dx2(ixg^s)=s%dx(ixg^s,2)
224 dx3(ixg^s)=s%dx(ixg^s,3)
227 s%surfaceC(ixg^s,1)=(x(ixg^s,1)+half*drs(ixg^s))**2 {^nooned &
228 *two*dabs(dsin(x(ixg^s,2)))*dsin(half*dx2(ixg^s))}{^ifthreed*dx3(ixg^s)}
232 s%surfaceC(ixg^s,2)=x(ixg^s,1)*drs(ixg^s)&
233 *dabs(dsin(x(ixg^s,2)+half*dx2(ixg^s)))}{^ifthreed*dx3(ixg^s)}
236 s%surfaceC(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)
240 s%surfaceC(0,1)=(x(1,1)-half*drs(1))**2
243 s%surfaceC(0,ixgmin2:ixgmax2,1)=(x(1,ixgmin2:ixgmax2,1)-half*drs(1,&
244 ixgmin2:ixgmax2))**2*two*dabs(dsin(x(1,ixgmin2:ixgmax2,2)))*dsin(half*dx2(1,&
246 s%surfaceC(ixgmin1:ixgmax1,0,2)=x(ixgmin1:ixgmax1,1,&
247 1)*drs(ixgmin1:ixgmax1,1)*dabs(dsin(x(ixgmin1:ixgmax1,1,&
248 2)-half*dx2(ixgmin1:ixgmax1,1)))
251 s%surfaceC(0,ixgmin2:ixgmax2,ixgmin3:ixgmax3,1)=(x(1,ixgmin2:ixgmax2,&
252 ixgmin3:ixgmax3,1)-half*drs(1,ixgmin2:ixgmax2,&
253 ixgmin3:ixgmax3))**2*two*dabs(dsin(x(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3,&
254 2)))*dsin(half*dx2(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3))*dx3(1,&
255 ixgmin2:ixgmax2,ixgmin3:ixgmax3)
256 s%surfaceC(ixgmin1:ixgmax1,0,ixgmin3:ixgmax3,2)=x(ixgmin1:ixgmax1,1,&
257 ixgmin3:ixgmax3,1)*drs(ixgmin1:ixgmax1,1,&
258 ixgmin3:ixgmax3)*dabs(dsin(x(ixgmin1:ixgmax1,1,ixgmin3:ixgmax3,&
259 2)-half*dx2(ixgmin1:ixgmax1,1,ixgmin3:ixgmax3)))*dx3(ixgmin1:ixgmax1,1,&
261 s%surfaceC(ixgmin1:ixgmax1,ixgmin2:ixgmax2,0,3)=&
262 s%surfaceC(ixgmin1:ixgmax1,ixgmin2:ixgmax2,1,3)
265 s%surface(ixg^s,1)=x(ixg^s,1)**2 {^nooned &
266 *two*dabs(dsin(x(ixg^s,2)))*dsin(half*dx2(ixg^s))}{^ifthreed*dx3(ixg^s)}
268 s%surface(ixg^s,2)=x(ixg^s,1)*drs(ixg^s)&
269 *dabs(dsin(x(ixg^s,2)))}{^ifthreed*dx3(ixg^s)}
272 s%surface(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)}
275 x(ixg^s,1)=s%x(ixg^s,1)
276 drs(ixg^s)=s%dx(ixg^s,1)
278 dx2(ixg^s)=s%dx(ixg^s,2)}
280 dx3(ixg^s)=s%dx(ixg^s,3)}
282 s%surfaceC(ixg^s,1)=dabs(x(ixg^s,1)+half*drs(ixg^s)){^de&*
dx^de(ixg^s) }
285 if (
z_==2) s%surfaceC(ixg^s,2)=dabs(x(ixg^s,1))*drs(ixg^s){^ifthreed*dx3(ixg^s)}
286 if (
phi_==2) s%surfaceC(ixg^s,2)=drs(ixg^s){^ifthreed*dx3(ixg^s)}
289 if (
z_==3) s%surfaceC(ixg^s,3)=dabs(x(ixg^s,1))*drs(ixg^s)*dx2(ixg^s)
290 if (
phi_==3) s%surfaceC(ixg^s,3)=drs(ixg^s)*dx2(ixg^s)
293 s%surfaceC(0,1)=dabs(x(1,1)-half*drs(1))
296 s%surfaceC(0,ixgmin2:ixgmax2,1)=dabs(x(1,ixgmin2:ixgmax2,1)-half*drs(1,&
297 ixgmin2:ixgmax2))*dx2(1,ixgmin2:ixgmax2)
300 s%surfaceC(0,ixgmin2:ixgmax2,ixgmin3:ixgmax3,1)=dabs(x(1,ixgmin2:ixgmax2,&
301 ixgmin3:ixgmax3,1)-half*drs(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3))*dx2(1,&
302 ixgmin2:ixgmax2,ixgmin3:ixgmax3)*dx3(1,ixgmin2:ixgmax2,&
305 {s%surfaceC(0^de%ixG^s,^de)=s%surfaceC(1^de%ixG^s,^de);\}
307 s%surface(ixg^s,1)=dabs(x(ixg^s,1)){^de&*
dx^de(ixg^s) }
309 if (
z_==2) s%surface(ixg^s,2)=dabs(x(ixg^s,1))*drs(ixg^s){^ifthreed*dx3(ixg^s)}
310 if (
phi_==2) s%surface(ixg^s,2)=drs(ixg^s){^ifthreed*dx3(ixg^s)}}
312 if (
z_==3) s%surface(ixg^s,3)=dabs(x(ixg^s,1))*drs(ixg^s)*dx2(ixg^s)
313 if (
phi_==3) s%surface(ixg^s,3)=drs(ixg^s)*dx2(ixg^s)}
316 call mpistop(
"Sorry, coordinate unknown")
710 subroutine curlvector(qvec,ixI^L,ixO^L,curlvec,idirmin,idirmin0,ndir0,fourthorder)
713 integer,
intent(in) :: ixI^L,ixO^L
714 integer,
intent(in) :: ndir0, idirmin0
715 integer,
intent(inout) :: idirmin
716 double precision,
intent(in) :: qvec(ixI^S,1:ndir0)
717 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
718 logical,
intent(in),
optional :: fourthorder
720 double precision :: invdx(1:ndim)
721 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
722 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L,kxO^L,gxO^L
723 logical :: use_4th_order
729 use_4th_order = .false.
730 if (
present(fourthorder)) use_4th_order = fourthorder
732 if (use_4th_order)
then
734 call mpistop(
"curlvector: 4th order only supported for slab geometry")
742 if (iximin^
d>ixamin^
d.or.iximax^
d<ixamax^
d|.or.) &
743 call mpistop(
"Error in curlvector: Non-conforming input limits")
746 curlvec(ixo^s,idirmin0:3)=zero
752 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
753 if(
lvc(idir,jdir,kdir)/=0)
then
754 if (.not. use_4th_order)
then
756 jxo^l=ixo^l+
kr(jdir,^
d);
757 hxo^l=ixo^l-
kr(jdir,^
d);
758 tmp(ixo^s)=half*(qvec(jxo^s,kdir) &
759 - qvec(hxo^s,kdir))*invdx(jdir)
762 kxo^l=ixo^l+2*
kr(jdir,^
d);
763 jxo^l=ixo^l+
kr(jdir,^
d);
764 hxo^l=ixo^l-
kr(jdir,^
d);
765 gxo^l=ixo^l-2*
kr(jdir,^
d);
766 tmp(ixo^s)=(-qvec(kxo^s,kdir) + 8.0d0 * qvec(jxo^s,kdir) - 8.0d0 * &
767 qvec(hxo^s,kdir) + qvec(gxo^s,kdir))/(12.0d0 *
dxlevel(jdir))
769 if(
lvc(idir,jdir,kdir)==1)
then
770 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
772 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
774 if(idir<idirmin)idirmin=idir
778 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
779 if(
lvc(idir,jdir,kdir)/=0)
then
782 tmp(ixa^s)=qvec(ixa^s,kdir)
783 hxo^l=ixo^l-
kr(jdir,^
d);
784 jxo^l=ixo^l+
kr(jdir,^
d);
786 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
788 hxo^l=ixo^l-
kr(jdir,^
d);
789 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
790 jxc^l=ixc^l+
kr(jdir,^
d);
791 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
792 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
793 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
795 hxo^l=ixo^l-
kr(jdir,^
d);
796 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
797 jxc^l=ixc^l+
kr(jdir,^
d);
799 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
800 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
802 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
803 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
806 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
808 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
811 call mpistop(
'no such curl evaluator')
813 if(
lvc(idir,jdir,kdir)==1)
then
814 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
816 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
818 if(idir<idirmin)idirmin=idir
824 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
825 if(
lvc(idir,jdir,kdir)/=0)
then
826 tmp(ixa^s)=qvec(ixa^s,kdir)
827 hxo^l=ixo^l-
kr(jdir,^
d);
828 jxo^l=ixo^l+
kr(jdir,^
d);
831 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
832 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
834 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
835 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
836 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
839 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1)*dsin(
block%x(ixo^s,2)))
842 if(
lvc(idir,jdir,kdir)==1)
then
843 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
845 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
847 if(idir<idirmin)idirmin=idir
852 do jdir=1,ndim;
do kdir=1,ndir0
853 if(
lvc(idir,jdir,kdir)/=0)
then
854 hxo^l=ixo^l-
kr(jdir,^
d);
855 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
856 jxc^l=ixc^l+
kr(jdir,^
d);
857 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
858 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
859 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
860 if(
lvc(idir,jdir,kdir)==1)
then
861 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
863 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
865 if(idir<idirmin)idirmin=idir
869 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
877 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
878 if(
lvc(idir,jdir,kdir)/=0)
then
884 hxo^l=ixo^l-
kr(jdir,^
d);
885 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
886 jxc^l=ixc^l+
kr(jdir,^
d);
889 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
890 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
892 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
895 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
896 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
897 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
899 hxo^l=ixo^l-
kr(kdir,^
d);
900 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
901 jxc^l=ixc^l+
kr(kdir,^
d);
904 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
905 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
907 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
909 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
910 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
916 hxo^l=ixo^l-
kr(kdir,^
d);
917 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
918 jxc^l=ixc^l+
kr(kdir,^
d);
921 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
922 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
924 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
926 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
928 hxo^l=ixo^l-
kr(jdir,^
d);
929 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
930 jxc^l=ixc^l+
kr(jdir,^
d);
933 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
934 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
936 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
939 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
940 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
941 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
947 hxo^l=ixo^l-
kr(kdir,^
d);
948 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
949 jxc^l=ixc^l+
kr(kdir,^
d);
952 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
953 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
955 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
957 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
959 hxo^l=ixo^l-
kr(jdir,^
d);
960 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
961 jxc^l=ixc^l+
kr(jdir,^
d);
964 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
965 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
967 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
970 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
972 surface(ixo^s)=
block%surface(ixo^s,idir)
974 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
976 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(ixo^s)*tmp(ixo^s)-xc(hxo^s)*tmp(hxo^s))*
block%dx(ixo^s,kdir))&
980 if(idir<idirmin)idirmin=idir
984 call mpistop(
'no such curl evaluator')
989 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
990 if(
lvc(idir,jdir,kdir)/=0)
then
991 tmp(ixa^s)=qvec(ixa^s,kdir)
992 hxo^l=ixo^l-
kr(jdir,^
d);
993 jxo^l=ixo^l+
kr(jdir,^
d);
994 if(
z_==3.or.
z_==-1)
then
998 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1000 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1001 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1004 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1008 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1016 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1018 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1019 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1022 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1026 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1030 if(
lvc(idir,jdir,kdir)==1)
then
1031 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1033 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1035 if(idir<idirmin)idirmin=idir
1037 enddo; enddo; enddo;
1039 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1041 do jdir=1,ndim;
do kdir=1,ndir0
1042 if(
lvc(idir,jdir,kdir)/=0)
then
1043 hxo^l=ixo^l-
kr(jdir,^
d);
1044 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1045 jxc^l=ixc^l+
kr(jdir,^
d);
1046 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1047 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1048 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1049 if(
lvc(idir,jdir,kdir)==1)
then
1050 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1052 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1054 if(idir<idirmin)idirmin=idir
1061 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1063 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1065 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1069 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1070 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1071 if(
lvc(idir,jdir,kdir)/=0)
then
1076 hxo^l=ixo^l-
kr(jdir,^
d);
1077 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1078 jxc^l=ixc^l+
kr(jdir,^
d);
1081 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1082 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1084 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1086 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1088 hxo^l=ixo^l-
kr(kdir,^
d);
1089 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1090 jxc^l=ixc^l+
kr(kdir,^
d);
1093 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1094 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1096 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1098 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1099 /
block%surface(ixo^s,idir)
1101 else if(idir==
phi_)
then
1105 hxo^l=ixo^l-
kr(kdir,^
d);
1106 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1107 jxc^l=ixc^l+
kr(kdir,^
d);
1110 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1111 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1113 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1115 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1117 hxo^l=ixo^l-
kr(jdir,^
d);
1118 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1119 jxc^l=ixc^l+
kr(jdir,^
d);
1122 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1123 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1125 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1127 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1128 /
block%surface(ixo^s,idir)
1134 hxo^l=ixo^l-
kr(kdir,^
d);
1135 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1136 jxc^l=ixc^l+
kr(kdir,^
d);
1139 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1140 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1142 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1144 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1146 hxo^l=ixo^l-
kr(jdir,^
d);
1147 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1148 jxc^l=ixc^l+
kr(jdir,^
d);
1151 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1152 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1154 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1157 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1158 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(ixo^s)*tmp(ixo^s)-xc(hxo^s)*tmp(hxo^s))*
block%dx(ixo^s,kdir))&
1159 /
block%surface(ixo^s,idir)
1162 if(idir<idirmin)idirmin=idir
1164 enddo; enddo; enddo;
1166 call mpistop(
'no such curl evaluator')
1169 call mpistop(
'not possible to calculate curl')
1182 integer,
intent(in) :: ixI^L,ixO^L
1183 integer,
intent(in) :: idim, ndir0, idirmin0
1184 integer,
intent(inout) :: idirmin
1185 double precision,
intent(in) :: qvec(ixI^S,1:ndir0),qvecc(ixI^S,1:ndir0)
1186 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
1188 double precision :: invdx(1:ndim)
1189 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
1190 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L
1197 curlvec(ixo^s,idirmin0:3)=zero
1206 do jdir=1,ndim;
do kdir=1,ndir0
1207 if(
lvc(idir,jdir,kdir)/=0)
then
1209 tmp(ixi^s)=qvec(ixi^s,kdir)
1210 hxo^l=ixo^l-
kr(jdir,^
d);
1211 jxo^l=ixo^l+
kr(jdir,^
d);
1215 tmp(ixi^s)=qvecc(ixi^s,kdir)
1217 jxo^l=ixo^l+
kr(jdir,^
d);
1220 tmp(ixo^s)=half*(tmp(jxo^s)-tmp(hxo^s))*invdx(jdir)
1221 if(
lvc(idir,jdir,kdir)==1)
then
1222 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
1224 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
1226 if(idir<idirmin)idirmin=idir
1231 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1232 if(
lvc(idir,jdir,kdir)/=0)
then
1235 tmp(ixi^s)=qvec(ixi^s,kdir)
1236 hxo^l=ixo^l-
kr(jdir,^
d);
1237 jxo^l=ixo^l+
kr(jdir,^
d);
1239 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
1241 hxo^l=ixo^l-
kr(jdir,^
d);
1242 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1243 jxc^l=ixc^l+
kr(jdir,^
d);
1244 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1245 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1246 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1248 hxo^l=ixo^l-
kr(jdir,^
d);
1249 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1250 jxc^l=ixc^l+
kr(jdir,^
d);
1252 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1253 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1255 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1256 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1259 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
1261 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
1264 call mpistop(
'no such curl evaluator')
1266 if(
lvc(idir,jdir,kdir)==1)
then
1267 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1269 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1271 if(idir<idirmin)idirmin=idir
1273 enddo; enddo; enddo;
1277 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1278 if(
lvc(idir,jdir,kdir)/=0)
then
1279 tmp(ixi^s)=qvec(ixi^s,kdir)
1280 hxo^l=ixo^l-
kr(jdir,^
d);
1281 jxo^l=ixo^l+
kr(jdir,^
d);
1284 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1285 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
1287 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
1288 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1289 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
1292 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1)*dsin(
block%x(ixo^s,2)))
1295 if(
lvc(idir,jdir,kdir)==1)
then
1296 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1298 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1300 if(idir<idirmin)idirmin=idir
1302 enddo; enddo; enddo;
1305 do jdir=1,ndim;
do kdir=1,ndir0
1306 if(
lvc(idir,jdir,kdir)/=0)
then
1307 hxo^l=ixo^l-
kr(jdir,^
d);
1308 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1309 jxc^l=ixc^l+
kr(jdir,^
d);
1310 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1311 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1312 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1313 if(
lvc(idir,jdir,kdir)==1)
then
1314 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1316 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1318 if(idir<idirmin)idirmin=idir
1322 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
1330 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1331 if(
lvc(idir,jdir,kdir)/=0)
then
1337 hxo^l=ixo^l-
kr(jdir,^
d);
1338 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1339 jxc^l=ixc^l+
kr(jdir,^
d);
1342 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1343 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1345 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1348 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1349 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
1350 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
1352 hxo^l=ixo^l-
kr(kdir,^
d);
1353 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1354 jxc^l=ixc^l+
kr(kdir,^
d);
1357 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1358 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1360 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1362 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
1363 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
1369 hxo^l=ixo^l-
kr(kdir,^
d);
1370 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1371 jxc^l=ixc^l+
kr(kdir,^
d);
1374 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1375 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1377 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1379 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
1381 hxo^l=ixo^l-
kr(jdir,^
d);
1382 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1383 jxc^l=ixc^l+
kr(jdir,^
d);
1386 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1387 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1389 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1392 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1393 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
1394 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
1400 hxo^l=ixo^l-
kr(kdir,^
d);
1401 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1402 jxc^l=ixc^l+
kr(kdir,^
d);
1405 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1406 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1408 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1410 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1412 hxo^l=ixo^l-
kr(jdir,^
d);
1413 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1414 jxc^l=ixc^l+
kr(jdir,^
d);
1417 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1418 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1420 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1423 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1425 surface(ixo^s)=
block%surface(ixo^s,idir)
1427 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
1429 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(ixo^s)*tmp(ixo^s)-xc(hxo^s)*tmp(hxo^s))*
block%dx(ixo^s,kdir))&
1433 if(idir<idirmin)idirmin=idir
1435 enddo; enddo; enddo;
1437 call mpistop(
'no such curl evaluator')
1442 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1443 if(
lvc(idir,jdir,kdir)/=0)
then
1444 tmp(ixi^s)=qvec(ixi^s,kdir)
1445 hxo^l=ixo^l-
kr(jdir,^
d);
1446 jxo^l=ixo^l+
kr(jdir,^
d);
1447 if(
z_==3.or.
z_==-1)
then
1451 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1453 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1454 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1457 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1461 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1469 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1471 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1472 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1475 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1479 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1483 if(
lvc(idir,jdir,kdir)==1)
then
1484 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1486 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1488 if(idir<idirmin)idirmin=idir
1490 enddo; enddo; enddo;
1492 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1494 do jdir=1,ndim;
do kdir=1,ndir0
1495 if(
lvc(idir,jdir,kdir)/=0)
then
1496 hxo^l=ixo^l-
kr(jdir,^
d);
1497 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1498 jxc^l=ixc^l+
kr(jdir,^
d);
1499 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1500 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1501 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1502 if(
lvc(idir,jdir,kdir)==1)
then
1503 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1505 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1507 if(idir<idirmin)idirmin=idir
1514 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1516 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1518 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1522 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1523 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1524 if(
lvc(idir,jdir,kdir)/=0)
then
1529 hxo^l=ixo^l-
kr(jdir,^
d);
1530 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1531 jxc^l=ixc^l+
kr(jdir,^
d);
1534 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1535 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1537 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1539 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1541 hxo^l=ixo^l-
kr(kdir,^
d);
1542 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1543 jxc^l=ixc^l+
kr(kdir,^
d);
1546 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1547 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1549 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1551 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1552 /
block%surface(ixo^s,idir)
1554 else if(idir==
phi_)
then
1558 hxo^l=ixo^l-
kr(kdir,^
d);
1559 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1560 jxc^l=ixc^l+
kr(kdir,^
d);
1563 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1564 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1566 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1568 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1570 hxo^l=ixo^l-
kr(jdir,^
d);
1571 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1572 jxc^l=ixc^l+
kr(jdir,^
d);
1575 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1576 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1578 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1580 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1581 /
block%surface(ixo^s,idir)
1587 hxo^l=ixo^l-
kr(kdir,^
d);
1588 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1589 jxc^l=ixc^l+
kr(kdir,^
d);
1592 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1593 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1595 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1597 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1599 hxo^l=ixo^l-
kr(jdir,^
d);
1600 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1601 jxc^l=ixc^l+
kr(jdir,^
d);
1604 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1605 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1607 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1610 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1611 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(ixo^s)*tmp(ixo^s)-xc(hxo^s)*tmp(hxo^s))*
block%dx(ixo^s,kdir))&
1612 /
block%surface(ixo^s,idir)
1615 if(idir<idirmin)idirmin=idir
1617 enddo; enddo; enddo;
1619 call mpistop(
'no such curl evaluator')
1622 call mpistop(
'not possible to calculate curl')