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")
793 subroutine curlvector(qvec,ixI^L,ixO^L,curlvec,idirmin,idirmin0,ndir0,fourthorder)
796 integer,
intent(in) :: ixI^L,ixO^L
797 integer,
intent(in) :: ndir0, idirmin0
798 integer,
intent(inout) :: idirmin
799 double precision,
intent(in) :: qvec(ixI^S,1:ndir0)
800 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
801 logical,
intent(in),
optional :: fourthorder
803 double precision :: invdx(1:ndim)
804 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
805 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L,kxO^L,gxO^L
806 logical :: use_4th_order
812 use_4th_order = .false.
813 if (
present(fourthorder)) use_4th_order = fourthorder
815 if (use_4th_order)
then
817 call mpistop(
"curlvector: 4th order only supported for slab geometry")
825 if (iximin^
d>ixamin^
d.or.iximax^
d<ixamax^
d|.or.) &
826 call mpistop(
"Error in curlvector: Non-conforming input limits")
829 curlvec(ixo^s,idirmin0:3)=zero
835 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
836 if(
lvc(idir,jdir,kdir)/=0)
then
837 if (.not. use_4th_order)
then
839 jxo^l=ixo^l+
kr(jdir,^
d);
840 hxo^l=ixo^l-
kr(jdir,^
d);
841 tmp(ixo^s)=half*(qvec(jxo^s,kdir) &
842 - qvec(hxo^s,kdir))*invdx(jdir)
845 kxo^l=ixo^l+2*
kr(jdir,^
d);
846 jxo^l=ixo^l+
kr(jdir,^
d);
847 hxo^l=ixo^l-
kr(jdir,^
d);
848 gxo^l=ixo^l-2*
kr(jdir,^
d);
849 tmp(ixo^s)=(-qvec(kxo^s,kdir) + 8.0d0 * qvec(jxo^s,kdir) - 8.0d0 * &
850 qvec(hxo^s,kdir) + qvec(gxo^s,kdir))/(12.0d0 *
dxlevel(jdir))
852 if(
lvc(idir,jdir,kdir)==1)
then
853 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
855 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
857 if(idir<idirmin)idirmin=idir
861 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
862 if(
lvc(idir,jdir,kdir)/=0)
then
865 tmp(ixa^s)=qvec(ixa^s,kdir)
866 hxo^l=ixo^l-
kr(jdir,^
d);
867 jxo^l=ixo^l+
kr(jdir,^
d);
869 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
871 hxo^l=ixo^l-
kr(jdir,^
d);
872 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
873 jxc^l=ixc^l+
kr(jdir,^
d);
874 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
875 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
876 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
878 hxo^l=ixo^l-
kr(jdir,^
d);
879 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
880 jxc^l=ixc^l+
kr(jdir,^
d);
882 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
883 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
885 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
886 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
889 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
891 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
894 call mpistop(
'no such curl evaluator')
896 if(
lvc(idir,jdir,kdir)==1)
then
897 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
899 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
901 if(idir<idirmin)idirmin=idir
907 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
908 if(
lvc(idir,jdir,kdir)/=0)
then
909 tmp(ixa^s)=qvec(ixa^s,kdir)
910 hxo^l=ixo^l-
kr(jdir,^
d);
911 jxo^l=ixo^l+
kr(jdir,^
d);
914 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
915 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
917 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
918 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
919 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
922 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)))
925 if(
lvc(idir,jdir,kdir)==1)
then
926 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
928 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
930 if(idir<idirmin)idirmin=idir
935 do jdir=1,ndim;
do kdir=1,ndir0
936 if(
lvc(idir,jdir,kdir)/=0)
then
937 hxo^l=ixo^l-
kr(jdir,^
d);
938 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
939 jxc^l=ixc^l+
kr(jdir,^
d);
940 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
941 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
942 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
943 if(
lvc(idir,jdir,kdir)==1)
then
944 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
946 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
948 if(idir<idirmin)idirmin=idir
952 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
960 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
961 if(
lvc(idir,jdir,kdir)/=0)
then
967 hxo^l=ixo^l-
kr(jdir,^
d);
968 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
969 jxc^l=ixc^l+
kr(jdir,^
d);
972 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
973 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
975 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
978 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
979 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
980 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
982 hxo^l=ixo^l-
kr(kdir,^
d);
983 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
984 jxc^l=ixc^l+
kr(kdir,^
d);
987 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
988 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
990 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
992 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
993 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
999 hxo^l=ixo^l-
kr(kdir,^
d);
1000 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1001 jxc^l=ixc^l+
kr(kdir,^
d);
1004 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1005 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1007 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1009 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
1011 hxo^l=ixo^l-
kr(jdir,^
d);
1012 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1013 jxc^l=ixc^l+
kr(jdir,^
d);
1016 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1017 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1019 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1022 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1023 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
1024 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
1030 hxo^l=ixo^l-
kr(kdir,^
d);
1031 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1032 jxc^l=ixc^l+
kr(kdir,^
d);
1035 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1036 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1038 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1040 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1042 hxo^l=ixo^l-
kr(jdir,^
d);
1043 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1044 jxc^l=ixc^l+
kr(jdir,^
d);
1047 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1048 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1050 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1053 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1055 surface(ixo^s)=
block%surface(ixo^s,idir)
1057 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
1059 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))&
1063 if(idir<idirmin)idirmin=idir
1065 enddo; enddo; enddo;
1067 call mpistop(
'no such curl evaluator')
1072 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1073 if(
lvc(idir,jdir,kdir)/=0)
then
1074 tmp(ixa^s)=qvec(ixa^s,kdir)
1075 hxo^l=ixo^l-
kr(jdir,^
d);
1076 jxo^l=ixo^l+
kr(jdir,^
d);
1077 if(
z_==3.or.
z_==-1)
then
1081 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1083 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1084 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1087 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1091 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1099 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1101 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1102 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1105 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1109 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1113 if(
lvc(idir,jdir,kdir)==1)
then
1114 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1116 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1118 if(idir<idirmin)idirmin=idir
1120 enddo; enddo; enddo;
1122 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1124 do jdir=1,ndim;
do kdir=1,ndir0
1125 if(
lvc(idir,jdir,kdir)/=0)
then
1126 hxo^l=ixo^l-
kr(jdir,^
d);
1127 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1128 jxc^l=ixc^l+
kr(jdir,^
d);
1129 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1130 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1131 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1132 if(
lvc(idir,jdir,kdir)==1)
then
1133 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1135 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1137 if(idir<idirmin)idirmin=idir
1144 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1146 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1148 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1152 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1153 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1154 if(
lvc(idir,jdir,kdir)/=0)
then
1159 hxo^l=ixo^l-
kr(jdir,^
d);
1160 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1161 jxc^l=ixc^l+
kr(jdir,^
d);
1164 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1165 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1167 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1169 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1171 hxo^l=ixo^l-
kr(kdir,^
d);
1172 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1173 jxc^l=ixc^l+
kr(kdir,^
d);
1176 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1177 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1179 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1181 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1182 /
block%surface(ixo^s,idir)
1184 else if(idir==
phi_)
then
1188 hxo^l=ixo^l-
kr(kdir,^
d);
1189 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1190 jxc^l=ixc^l+
kr(kdir,^
d);
1193 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1194 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1196 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1198 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1200 hxo^l=ixo^l-
kr(jdir,^
d);
1201 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1202 jxc^l=ixc^l+
kr(jdir,^
d);
1205 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1206 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1208 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1210 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1211 /
block%surface(ixo^s,idir)
1217 hxo^l=ixo^l-
kr(kdir,^
d);
1218 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1219 jxc^l=ixc^l+
kr(kdir,^
d);
1222 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1223 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1225 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1227 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1229 hxo^l=ixo^l-
kr(jdir,^
d);
1230 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1231 jxc^l=ixc^l+
kr(jdir,^
d);
1234 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1235 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1237 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1240 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1241 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))&
1242 /
block%surface(ixo^s,idir)
1245 if(idir<idirmin)idirmin=idir
1247 enddo; enddo; enddo;
1249 call mpistop(
'no such curl evaluator')
1252 call mpistop(
'not possible to calculate curl')
1265 integer,
intent(in) :: ixI^L,ixO^L
1266 integer,
intent(in) :: idim, ndir0, idirmin0
1267 integer,
intent(inout) :: idirmin
1268 double precision,
intent(in) :: qvec(ixI^S,1:ndir0),qvecc(ixI^S,1:ndir0)
1269 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
1271 double precision :: invdx(1:ndim)
1272 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
1273 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L
1280 curlvec(ixo^s,idirmin0:3)=zero
1289 do jdir=1,ndim;
do kdir=1,ndir0
1290 if(
lvc(idir,jdir,kdir)/=0)
then
1292 tmp(ixi^s)=qvec(ixi^s,kdir)
1293 hxo^l=ixo^l-
kr(jdir,^
d);
1294 jxo^l=ixo^l+
kr(jdir,^
d);
1298 tmp(ixi^s)=qvecc(ixi^s,kdir)
1300 jxo^l=ixo^l+
kr(jdir,^
d);
1303 tmp(ixo^s)=half*(tmp(jxo^s)-tmp(hxo^s))*invdx(jdir)
1304 if(
lvc(idir,jdir,kdir)==1)
then
1305 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
1307 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
1309 if(idir<idirmin)idirmin=idir
1314 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1315 if(
lvc(idir,jdir,kdir)/=0)
then
1318 tmp(ixi^s)=qvec(ixi^s,kdir)
1319 hxo^l=ixo^l-
kr(jdir,^
d);
1320 jxo^l=ixo^l+
kr(jdir,^
d);
1322 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
1324 hxo^l=ixo^l-
kr(jdir,^
d);
1325 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1326 jxc^l=ixc^l+
kr(jdir,^
d);
1327 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1328 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1329 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1331 hxo^l=ixo^l-
kr(jdir,^
d);
1332 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1333 jxc^l=ixc^l+
kr(jdir,^
d);
1335 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1336 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1338 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1339 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1342 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
1344 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
1347 call mpistop(
'no such curl evaluator')
1349 if(
lvc(idir,jdir,kdir)==1)
then
1350 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1352 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1354 if(idir<idirmin)idirmin=idir
1356 enddo; enddo; enddo;
1360 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1361 if(
lvc(idir,jdir,kdir)/=0)
then
1362 tmp(ixi^s)=qvec(ixi^s,kdir)
1363 hxo^l=ixo^l-
kr(jdir,^
d);
1364 jxo^l=ixo^l+
kr(jdir,^
d);
1367 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1368 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
1370 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
1371 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1372 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
1375 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)))
1378 if(
lvc(idir,jdir,kdir)==1)
then
1379 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1381 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1383 if(idir<idirmin)idirmin=idir
1385 enddo; enddo; enddo;
1388 do jdir=1,ndim;
do kdir=1,ndir0
1389 if(
lvc(idir,jdir,kdir)/=0)
then
1390 hxo^l=ixo^l-
kr(jdir,^
d);
1391 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1392 jxc^l=ixc^l+
kr(jdir,^
d);
1393 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1394 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1395 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1396 if(
lvc(idir,jdir,kdir)==1)
then
1397 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1399 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1401 if(idir<idirmin)idirmin=idir
1405 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
1413 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1414 if(
lvc(idir,jdir,kdir)/=0)
then
1420 hxo^l=ixo^l-
kr(jdir,^
d);
1421 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1422 jxc^l=ixc^l+
kr(jdir,^
d);
1425 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1426 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1428 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1431 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1432 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
1433 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
1435 hxo^l=ixo^l-
kr(kdir,^
d);
1436 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1437 jxc^l=ixc^l+
kr(kdir,^
d);
1440 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1441 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1443 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1445 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
1446 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
1452 hxo^l=ixo^l-
kr(kdir,^
d);
1453 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1454 jxc^l=ixc^l+
kr(kdir,^
d);
1457 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1458 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1460 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1462 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
1464 hxo^l=ixo^l-
kr(jdir,^
d);
1465 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1466 jxc^l=ixc^l+
kr(jdir,^
d);
1469 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1470 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1472 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1475 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1476 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
1477 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
1483 hxo^l=ixo^l-
kr(kdir,^
d);
1484 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1485 jxc^l=ixc^l+
kr(kdir,^
d);
1488 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1489 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1491 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1493 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1495 hxo^l=ixo^l-
kr(jdir,^
d);
1496 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1497 jxc^l=ixc^l+
kr(jdir,^
d);
1500 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1501 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1503 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1506 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1508 surface(ixo^s)=
block%surface(ixo^s,idir)
1510 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
1512 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))&
1516 if(idir<idirmin)idirmin=idir
1518 enddo; enddo; enddo;
1520 call mpistop(
'no such curl evaluator')
1525 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1526 if(
lvc(idir,jdir,kdir)/=0)
then
1527 tmp(ixi^s)=qvec(ixi^s,kdir)
1528 hxo^l=ixo^l-
kr(jdir,^
d);
1529 jxo^l=ixo^l+
kr(jdir,^
d);
1530 if(
z_==3.or.
z_==-1)
then
1534 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1536 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1537 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1540 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1544 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1552 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1554 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1555 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1558 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1562 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1566 if(
lvc(idir,jdir,kdir)==1)
then
1567 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1569 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1571 if(idir<idirmin)idirmin=idir
1573 enddo; enddo; enddo;
1575 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1577 do jdir=1,ndim;
do kdir=1,ndir0
1578 if(
lvc(idir,jdir,kdir)/=0)
then
1579 hxo^l=ixo^l-
kr(jdir,^
d);
1580 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1581 jxc^l=ixc^l+
kr(jdir,^
d);
1582 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1583 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1584 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1585 if(
lvc(idir,jdir,kdir)==1)
then
1586 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1588 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1590 if(idir<idirmin)idirmin=idir
1597 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1599 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1601 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1605 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1606 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1607 if(
lvc(idir,jdir,kdir)/=0)
then
1612 hxo^l=ixo^l-
kr(jdir,^
d);
1613 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1614 jxc^l=ixc^l+
kr(jdir,^
d);
1617 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1618 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1620 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1622 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1624 hxo^l=ixo^l-
kr(kdir,^
d);
1625 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1626 jxc^l=ixc^l+
kr(kdir,^
d);
1629 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1630 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1632 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1634 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1635 /
block%surface(ixo^s,idir)
1637 else if(idir==
phi_)
then
1641 hxo^l=ixo^l-
kr(kdir,^
d);
1642 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1643 jxc^l=ixc^l+
kr(kdir,^
d);
1646 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1647 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1649 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1651 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1653 hxo^l=ixo^l-
kr(jdir,^
d);
1654 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1655 jxc^l=ixc^l+
kr(jdir,^
d);
1658 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1659 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1661 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1663 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1664 /
block%surface(ixo^s,idir)
1670 hxo^l=ixo^l-
kr(kdir,^
d);
1671 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1672 jxc^l=ixc^l+
kr(kdir,^
d);
1675 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1676 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1678 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1680 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1682 hxo^l=ixo^l-
kr(jdir,^
d);
1683 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1684 jxc^l=ixc^l+
kr(jdir,^
d);
1687 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1688 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1690 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1693 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1694 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))&
1695 /
block%surface(ixo^s,idir)
1698 if(idir<idirmin)idirmin=idir
1700 enddo; enddo; enddo;
1702 call mpistop(
'no such curl evaluator')
1705 call mpistop(
'not possible to calculate curl')