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*dsin(x(ixg^s,2))*dsin(half*dx2(ixg^s))}{^ifthreed*dx3(ixg^s)}
231 s%surfaceC(ixg^s,2)=x(ixg^s,1)*drs(ixg^s)&
232 *dsin(x(ixg^s,2)+half*dx2(ixg^s))}{^ifthreed*dx3(ixg^s)}
235 s%surfaceC(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)
239 s%surfaceC(0,1)=dabs(x(1,1)-half*drs(1))**2
242 s%surfaceC(0,ixgmin2:ixgmax2,1)=(x(1,ixgmin2:ixgmax2,1)-half*drs(1,&
243 ixgmin2:ixgmax2))**2*two*dsin(x(1,ixgmin2:ixgmax2,2))*dsin(half*dx2(1,&
245 s%surfaceC(ixgmin1:ixgmax1,0,2)=x(ixgmin1:ixgmax1,1,&
246 1)*drs(ixgmin1:ixgmax1,1)*dsin(x(ixgmin1:ixgmax1,1,&
247 2)-half*dx2(ixgmin1:ixgmax1,1))
250 s%surfaceC(0,ixgmin2:ixgmax2,ixgmin3:ixgmax3,1)=(x(1,ixgmin2:ixgmax2,&
251 ixgmin3:ixgmax3,1)-half*drs(1,ixgmin2:ixgmax2,&
252 ixgmin3:ixgmax3))**2*two*dsin(x(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3,&
253 2))*dsin(half*dx2(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3))*dx3(1,&
254 ixgmin2:ixgmax2,ixgmin3:ixgmax3)
255 s%surfaceC(ixgmin1:ixgmax1,0,ixgmin3:ixgmax3,2)=x(ixgmin1:ixgmax1,1,&
256 ixgmin3:ixgmax3,1)*drs(ixgmin1:ixgmax1,1,&
257 ixgmin3:ixgmax3)*dsin(x(ixgmin1:ixgmax1,1,ixgmin3:ixgmax3,&
258 2)-half*dx2(ixgmin1:ixgmax1,1,ixgmin3:ixgmax3))*dx3(ixgmin1:ixgmax1,1,&
260 s%surfaceC(ixgmin1:ixgmax1,ixgmin2:ixgmax2,0,3)=&
261 s%surfaceC(ixgmin1:ixgmax1,ixgmin2:ixgmax2,1,3)
264 s%surface(ixg^s,1)=x(ixg^s,1)**2 {^nooned &
265 *two*dsin(x(ixg^s,2))*dsin(half*dx2(ixg^s))}{^ifthreed*dx3(ixg^s)}
267 s%surface(ixg^s,2)=x(ixg^s,1)*drs(ixg^s)&
268 *dsin(x(ixg^s,2))}{^ifthreed*dx3(ixg^s)}
271 s%surface(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)}
274 x(ixg^s,1)=s%x(ixg^s,1)
275 drs(ixg^s)=s%dx(ixg^s,1)
277 dx2(ixg^s)=s%dx(ixg^s,2)}
279 dx3(ixg^s)=s%dx(ixg^s,3)}
281 s%surfaceC(ixg^s,1)=dabs(x(ixg^s,1)+half*drs(ixg^s)){^de&*
dx^de(ixg^s) }
283 if (
z_==2) s%surfaceC(ixg^s,2)=x(ixg^s,1)*drs(ixg^s){^ifthreed*dx3(ixg^s)}
284 if (
phi_==2) s%surfaceC(ixg^s,2)=drs(ixg^s){^ifthreed*dx3(ixg^s)}
287 if (
z_==3) s%surfaceC(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)
288 if (
phi_==3) s%surfaceC(ixg^s,3)=drs(ixg^s)*dx2(ixg^s)
291 s%surfaceC(0,1)=dabs(x(1,1)-half*drs(1))
294 s%surfaceC(0,ixgmin2:ixgmax2,1)=dabs(x(1,ixgmin2:ixgmax2,1)-half*drs(1,&
295 ixgmin2:ixgmax2))*dx2(1,ixgmin2:ixgmax2)
298 s%surfaceC(0,ixgmin2:ixgmax2,ixgmin3:ixgmax3,1)=dabs(x(1,ixgmin2:ixgmax2,&
299 ixgmin3:ixgmax3,1)-half*drs(1,ixgmin2:ixgmax2,ixgmin3:ixgmax3))*dx2(1,&
300 ixgmin2:ixgmax2,ixgmin3:ixgmax3)*dx3(1,ixgmin2:ixgmax2,&
303 {s%surfaceC(0^de%ixG^s,^de)=s%surfaceC(1^de%ixG^s,^de);\}
305 s%surface(ixg^s,1)=dabs(x(ixg^s,1)){^de&*
dx^de(ixg^s) }
307 if (
z_==2) s%surface(ixg^s,2)=x(ixg^s,1)*drs(ixg^s){^ifthreed*dx3(ixg^s)}
308 if (
phi_==2) s%surface(ixg^s,2)=drs(ixg^s){^ifthreed*dx3(ixg^s)}}
310 if (
z_==3) s%surface(ixg^s,3)=x(ixg^s,1)*drs(ixg^s)*dx2(ixg^s)
311 if (
phi_==3) s%surface(ixg^s,3)=drs(ixg^s)*dx2(ixg^s)}
314 call mpistop(
"Sorry, coordinate unknown")
708 subroutine curlvector(qvec,ixI^L,ixO^L,curlvec,idirmin,idirmin0,ndir0,fourthorder)
711 integer,
intent(in) :: ixI^L,ixO^L
712 integer,
intent(in) :: ndir0, idirmin0
713 integer,
intent(inout) :: idirmin
714 double precision,
intent(in) :: qvec(ixI^S,1:ndir0)
715 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
716 logical,
intent(in),
optional :: fourthorder
718 double precision :: invdx(1:ndim)
719 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
720 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L,kxO^L,gxO^L
721 logical :: use_4th_order
727 use_4th_order = .false.
728 if (
present(fourthorder)) use_4th_order = fourthorder
730 if (use_4th_order)
then
732 call mpistop(
"curlvector: 4th order only supported for slab geometry")
740 if (iximin^
d>ixamin^
d.or.iximax^
d<ixamax^
d|.or.) &
741 call mpistop(
"Error in curlvector: Non-conforming input limits")
744 curlvec(ixo^s,idirmin0:3)=zero
750 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
751 if(
lvc(idir,jdir,kdir)/=0)
then
752 if (.not. use_4th_order)
then
754 jxo^l=ixo^l+
kr(jdir,^
d);
755 hxo^l=ixo^l-
kr(jdir,^
d);
756 tmp(ixo^s)=half*(qvec(jxo^s,kdir) &
757 - qvec(hxo^s,kdir))*invdx(jdir)
760 kxo^l=ixo^l+2*
kr(jdir,^
d);
761 jxo^l=ixo^l+
kr(jdir,^
d);
762 hxo^l=ixo^l-
kr(jdir,^
d);
763 gxo^l=ixo^l-2*
kr(jdir,^
d);
764 tmp(ixo^s)=(-qvec(kxo^s,kdir) + 8.0d0 * qvec(jxo^s,kdir) - 8.0d0 * &
765 qvec(hxo^s,kdir) + qvec(gxo^s,kdir))/(12.0d0 *
dxlevel(jdir))
767 if(
lvc(idir,jdir,kdir)==1)
then
768 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
770 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
772 if(idir<idirmin)idirmin=idir
776 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
777 if(
lvc(idir,jdir,kdir)/=0)
then
780 tmp(ixa^s)=qvec(ixa^s,kdir)
781 hxo^l=ixo^l-
kr(jdir,^
d);
782 jxo^l=ixo^l+
kr(jdir,^
d);
784 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
786 hxo^l=ixo^l-
kr(jdir,^
d);
787 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
788 jxc^l=ixc^l+
kr(jdir,^
d);
789 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
790 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
791 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
793 hxo^l=ixo^l-
kr(jdir,^
d);
794 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
795 jxc^l=ixc^l+
kr(jdir,^
d);
797 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
798 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
800 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
801 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
804 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
806 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
809 call mpistop(
'no such curl evaluator')
811 if(
lvc(idir,jdir,kdir)==1)
then
812 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
814 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
816 if(idir<idirmin)idirmin=idir
822 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
823 if(
lvc(idir,jdir,kdir)/=0)
then
824 tmp(ixa^s)=qvec(ixa^s,kdir)
825 hxo^l=ixo^l-
kr(jdir,^
d);
826 jxo^l=ixo^l+
kr(jdir,^
d);
829 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
830 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
832 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
833 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
834 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
837 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)))
840 if(
lvc(idir,jdir,kdir)==1)
then
841 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
843 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
845 if(idir<idirmin)idirmin=idir
850 do jdir=1,ndim;
do kdir=1,ndir0
851 if(
lvc(idir,jdir,kdir)/=0)
then
852 hxo^l=ixo^l-
kr(jdir,^
d);
853 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
854 jxc^l=ixc^l+
kr(jdir,^
d);
855 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
856 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
857 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
858 if(
lvc(idir,jdir,kdir)==1)
then
859 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
861 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
863 if(idir<idirmin)idirmin=idir
867 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
875 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
876 if(
lvc(idir,jdir,kdir)/=0)
then
882 hxo^l=ixo^l-
kr(jdir,^
d);
883 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
884 jxc^l=ixc^l+
kr(jdir,^
d);
887 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
888 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
890 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
893 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
894 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
895 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
897 hxo^l=ixo^l-
kr(kdir,^
d);
898 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
899 jxc^l=ixc^l+
kr(kdir,^
d);
902 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
903 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
905 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
907 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
908 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
914 hxo^l=ixo^l-
kr(kdir,^
d);
915 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
916 jxc^l=ixc^l+
kr(kdir,^
d);
919 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
920 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
922 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
924 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
926 hxo^l=ixo^l-
kr(jdir,^
d);
927 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
928 jxc^l=ixc^l+
kr(jdir,^
d);
931 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
932 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
934 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
937 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
938 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
939 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
945 hxo^l=ixo^l-
kr(kdir,^
d);
946 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
947 jxc^l=ixc^l+
kr(kdir,^
d);
950 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
951 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
953 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
955 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
957 hxo^l=ixo^l-
kr(jdir,^
d);
958 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
959 jxc^l=ixc^l+
kr(jdir,^
d);
962 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
963 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
965 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
968 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
970 surface(ixo^s)=
block%surface(ixo^s,idir)
972 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
974 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))&
978 if(idir<idirmin)idirmin=idir
982 call mpistop(
'no such curl evaluator')
987 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
988 if(
lvc(idir,jdir,kdir)/=0)
then
989 tmp(ixa^s)=qvec(ixa^s,kdir)
990 hxo^l=ixo^l-
kr(jdir,^
d);
991 jxo^l=ixo^l+
kr(jdir,^
d);
992 if(
z_==3.or.
z_==-1)
then
996 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
998 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
999 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1002 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1006 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1014 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1016 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1017 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1020 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1024 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1028 if(
lvc(idir,jdir,kdir)==1)
then
1029 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1031 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1033 if(idir<idirmin)idirmin=idir
1035 enddo; enddo; enddo;
1037 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1039 do jdir=1,ndim;
do kdir=1,ndir0
1040 if(
lvc(idir,jdir,kdir)/=0)
then
1041 hxo^l=ixo^l-
kr(jdir,^
d);
1042 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1043 jxc^l=ixc^l+
kr(jdir,^
d);
1044 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1045 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1046 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1047 if(
lvc(idir,jdir,kdir)==1)
then
1048 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1050 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1052 if(idir<idirmin)idirmin=idir
1059 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1061 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1063 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1067 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1068 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1069 if(
lvc(idir,jdir,kdir)/=0)
then
1074 hxo^l=ixo^l-
kr(jdir,^
d);
1075 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1076 jxc^l=ixc^l+
kr(jdir,^
d);
1079 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1080 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1082 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1084 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1086 hxo^l=ixo^l-
kr(kdir,^
d);
1087 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1088 jxc^l=ixc^l+
kr(kdir,^
d);
1091 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1092 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1094 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1096 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1097 /
block%surface(ixo^s,idir)
1099 else if(idir==
phi_)
then
1103 hxo^l=ixo^l-
kr(kdir,^
d);
1104 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1105 jxc^l=ixc^l+
kr(kdir,^
d);
1108 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1109 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1111 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1113 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1115 hxo^l=ixo^l-
kr(jdir,^
d);
1116 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1117 jxc^l=ixc^l+
kr(jdir,^
d);
1120 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1121 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1123 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1125 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1126 /
block%surface(ixo^s,idir)
1132 hxo^l=ixo^l-
kr(kdir,^
d);
1133 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1134 jxc^l=ixc^l+
kr(kdir,^
d);
1137 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1138 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1140 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1142 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1144 hxo^l=ixo^l-
kr(jdir,^
d);
1145 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1146 jxc^l=ixc^l+
kr(jdir,^
d);
1149 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1150 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1152 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1155 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1156 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))&
1157 /
block%surface(ixo^s,idir)
1160 if(idir<idirmin)idirmin=idir
1162 enddo; enddo; enddo;
1164 call mpistop(
'no such curl evaluator')
1167 call mpistop(
'not possible to calculate curl')
1180 integer,
intent(in) :: ixI^L,ixO^L
1181 integer,
intent(in) :: idim, ndir0, idirmin0
1182 integer,
intent(inout) :: idirmin
1183 double precision,
intent(in) :: qvec(ixI^S,1:ndir0),qvecc(ixI^S,1:ndir0)
1184 double precision,
intent(inout) :: curlvec(ixI^S,idirmin0:3)
1186 double precision :: invdx(1:ndim)
1187 double precision :: tmp(ixI^S),tmp2(ixI^S),xC(ixI^S),surface(ixI^S)
1188 integer :: ixA^L,ixC^L,jxC^L,idir,jdir,kdir,hxO^L,jxO^L
1195 curlvec(ixo^s,idirmin0:3)=zero
1204 do jdir=1,ndim;
do kdir=1,ndir0
1205 if(
lvc(idir,jdir,kdir)/=0)
then
1207 tmp(ixi^s)=qvec(ixi^s,kdir)
1208 hxo^l=ixo^l-
kr(jdir,^
d);
1209 jxo^l=ixo^l+
kr(jdir,^
d);
1213 tmp(ixi^s)=qvecc(ixi^s,kdir)
1215 jxo^l=ixo^l+
kr(jdir,^
d);
1218 tmp(ixo^s)=half*(tmp(jxo^s)-tmp(hxo^s))*invdx(jdir)
1219 if(
lvc(idir,jdir,kdir)==1)
then
1220 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp(ixo^s)
1222 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp(ixo^s)
1224 if(idir<idirmin)idirmin=idir
1229 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1230 if(
lvc(idir,jdir,kdir)/=0)
then
1233 tmp(ixi^s)=qvec(ixi^s,kdir)
1234 hxo^l=ixo^l-
kr(jdir,^
d);
1235 jxo^l=ixo^l+
kr(jdir,^
d);
1237 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,jdir)-
block%x(hxo^s,jdir))
1239 hxo^l=ixo^l-
kr(jdir,^
d);
1240 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1241 jxc^l=ixc^l+
kr(jdir,^
d);
1242 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1243 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1244 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1246 hxo^l=ixo^l-
kr(jdir,^
d);
1247 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1248 jxc^l=ixc^l+
kr(jdir,^
d);
1250 tmp(ixc^s)=
block%ds(ixo^s,kdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1251 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1253 tmp(ixc^s)=(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1254 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1257 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%surface(ixo^s,idir)
1259 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/(
block%ds(ixo^s,jdir)*
block%ds(ixo^s,kdir))
1262 call mpistop(
'no such curl evaluator')
1264 if(
lvc(idir,jdir,kdir)==1)
then
1265 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1267 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1269 if(idir<idirmin)idirmin=idir
1271 enddo; enddo; enddo;
1275 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1276 if(
lvc(idir,jdir,kdir)/=0)
then
1277 tmp(ixi^s)=qvec(ixi^s,kdir)
1278 hxo^l=ixo^l-
kr(jdir,^
d);
1279 jxo^l=ixo^l+
kr(jdir,^
d);
1282 tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1283 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,1)-
block%x(hxo^s,1))*
block%x(ixo^s,1))
1285 if(idir==1) tmp(ixa^s)=tmp(ixa^s)*dsin(
block%x(ixa^s,2))
1286 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1287 if(idir==1) tmp2(ixo^s)=tmp2(ixo^s)/dsin(
block%x(ixo^s,2))
1290 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)))
1293 if(
lvc(idir,jdir,kdir)==1)
then
1294 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1296 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1298 if(idir<idirmin)idirmin=idir
1300 enddo; enddo; enddo;
1303 do jdir=1,ndim;
do kdir=1,ndir0
1304 if(
lvc(idir,jdir,kdir)/=0)
then
1305 hxo^l=ixo^l-
kr(jdir,^
d);
1306 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1307 jxc^l=ixc^l+
kr(jdir,^
d);
1308 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1309 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1310 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1311 if(
lvc(idir,jdir,kdir)==1)
then
1312 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1314 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1316 if(idir<idirmin)idirmin=idir
1320 if(idir==2.and.
phi_>0) curlvec(ixo^s,2)=curlvec(ixo^s,2)+qvec(ixo^s,
phi_)/
block%x(ixo^s,
r_)
1328 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1329 if(
lvc(idir,jdir,kdir)/=0)
then
1335 hxo^l=ixo^l-
kr(jdir,^
d);
1336 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1337 jxc^l=ixc^l+
kr(jdir,^
d);
1340 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1341 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1343 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1346 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1347 curlvec(ixo^s,idir)=(dsin(xc(ixo^s))*tmp(ixo^s)-&
1348 dsin(xc(hxo^s))*tmp(hxo^s))*
block%dx(ixo^s,kdir)
1350 hxo^l=ixo^l-
kr(kdir,^
d);
1351 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1352 jxc^l=ixc^l+
kr(kdir,^
d);
1355 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1356 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1358 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1360 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir))&
1361 /
block%surface(ixo^s,idir)*
block%x(ixo^s,idir)
1367 hxo^l=ixo^l-
kr(kdir,^
d);
1368 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1369 jxc^l=ixc^l+
kr(kdir,^
d);
1372 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1373 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1375 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1377 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,1)
1379 hxo^l=ixo^l-
kr(jdir,^
d);
1380 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1381 jxc^l=ixc^l+
kr(jdir,^
d);
1384 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1385 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1387 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1390 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1391 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(xc(hxo^s)*tmp(hxo^s)-xc(ixo^s)*tmp(ixo^s))*&
1392 dsin(
block%x(ixo^s,idir))*
block%dx(ixo^s,kdir))/
block%surface(ixo^s,idir)
1398 hxo^l=ixo^l-
kr(kdir,^
d);
1399 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1400 jxc^l=ixc^l+
kr(kdir,^
d);
1403 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1404 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1406 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1408 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1410 hxo^l=ixo^l-
kr(jdir,^
d);
1411 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1412 jxc^l=ixc^l+
kr(jdir,^
d);
1415 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1416 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1418 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1421 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1423 surface(ixo^s)=
block%surface(ixo^s,idir)
1425 surface(ixo^s)=
block%x(ixo^s,jdir)*
block%dx(ixo^s,kdir)*
block%dx(ixo^s,jdir)
1427 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))&
1431 if(idir<idirmin)idirmin=idir
1433 enddo; enddo; enddo;
1435 call mpistop(
'no such curl evaluator')
1440 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1441 if(
lvc(idir,jdir,kdir)/=0)
then
1442 tmp(ixi^s)=qvec(ixi^s,kdir)
1443 hxo^l=ixo^l-
kr(jdir,^
d);
1444 jxo^l=ixo^l+
kr(jdir,^
d);
1445 if(
z_==3.or.
z_==-1)
then
1449 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1451 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1452 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1455 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,2)-
block%x(hxo^s,2))*
block%x(ixo^s,1))
1459 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,3)-
block%x(hxo^s,3))
1467 if(idir==
z_) tmp(ixa^s)=tmp(ixa^s)*
block%x(ixa^s,1)
1469 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,1)-
block%x(hxo^s,1))
1470 if(idir==
z_) tmp2(ixo^s)=tmp2(ixo^s)/
block%x(ixo^s,1)
1473 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/(
block%x(jxo^s,2)-
block%x(hxo^s,2))
1477 tmp2(ixo^s)=(tmp(jxo^s)-tmp(hxo^s))/((
block%x(jxo^s,3)-
block%x(hxo^s,3))*
block%x(ixo^s,1))
1481 if(
lvc(idir,jdir,kdir)==1)
then
1482 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1484 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1486 if(idir<idirmin)idirmin=idir
1488 enddo; enddo; enddo;
1490 if(ndim<2)
call mpistop(
"Gaussbased for 2D, 2.5D or 3D polar or cylindrical only")
1492 do jdir=1,ndim;
do kdir=1,ndir0
1493 if(
lvc(idir,jdir,kdir)/=0)
then
1494 hxo^l=ixo^l-
kr(jdir,^
d);
1495 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1496 jxc^l=ixc^l+
kr(jdir,^
d);
1497 tmp(ixc^s)=
block%surfaceC(ixc^s,jdir)*(qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1498 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir)))
1499 tmp2(ixo^s)=(tmp(ixo^s)-tmp(hxo^s))/
block%dvolume(ixo^s)
1500 if(
lvc(idir,jdir,kdir)==1)
then
1501 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+tmp2(ixo^s)
1503 curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-tmp2(ixo^s)
1505 if(idir<idirmin)idirmin=idir
1512 if((idir==
phi_.or.(
phi_==-1.and.idir==3)).and.
z_>0)
then
1514 if(
z_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)-qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1516 if(
phi_==2) curlvec(ixo^s,idir)=curlvec(ixo^s,idir)+qvec(ixo^s,
z_)/
block%x(ixo^s,
r_)
1520 if(ndim<3)
call mpistop(
"Stokesbased for 3D cylindrical only")
1521 do idir=idirmin0,3;
do jdir=1,ndim;
do kdir=1,ndir0
1522 if(
lvc(idir,jdir,kdir)/=0)
then
1527 hxo^l=ixo^l-
kr(jdir,^
d);
1528 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1529 jxc^l=ixc^l+
kr(jdir,^
d);
1532 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1533 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1535 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1537 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,kdir)
1539 hxo^l=ixo^l-
kr(kdir,^
d);
1540 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1541 jxc^l=ixc^l+
kr(kdir,^
d);
1544 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1545 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1547 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1549 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%x(ixo^s,idir)*
block%dx(ixo^s,jdir))&
1550 /
block%surface(ixo^s,idir)
1552 else if(idir==
phi_)
then
1556 hxo^l=ixo^l-
kr(kdir,^
d);
1557 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1558 jxc^l=ixc^l+
kr(kdir,^
d);
1561 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1562 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1564 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1566 curlvec(ixo^s,idir)=(tmp(ixo^s)-tmp(hxo^s))*
block%dx(ixo^s,jdir)
1568 hxo^l=ixo^l-
kr(jdir,^
d);
1569 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1570 jxc^l=ixc^l+
kr(jdir,^
d);
1573 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1574 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1576 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1578 curlvec(ixo^s,idir)=(curlvec(ixo^s,idir)+(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,kdir))&
1579 /
block%surface(ixo^s,idir)
1585 hxo^l=ixo^l-
kr(kdir,^
d);
1586 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1587 jxc^l=ixc^l+
kr(kdir,^
d);
1590 tmp(ixc^s)=qvec(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,kdir)*&
1591 (qvec(jxc^s,jdir)-qvec(ixc^s,jdir))/(
block%x(jxc^s,kdir)-
block%x(ixc^s,kdir))
1593 tmp(ixc^s)=0.5d0*(qvec(ixc^s,jdir)+qvec(jxc^s,jdir))
1595 curlvec(ixo^s,idir)=(tmp(hxo^s)-tmp(ixo^s))*
block%dx(ixo^s,jdir)
1597 hxo^l=ixo^l-
kr(jdir,^
d);
1598 ixcmin^
d=hxomin^
d;ixcmax^
d=ixomax^
d;
1599 jxc^l=ixc^l+
kr(jdir,^
d);
1602 tmp(ixc^s)=qvec(ixc^s,kdir)+0.5d0*
block%dx(ixc^s,jdir)*&
1603 (qvec(jxc^s,kdir)-qvec(ixc^s,kdir))/(
block%x(jxc^s,jdir)-
block%x(ixc^s,jdir))
1605 tmp(ixc^s)=0.5d0*(qvec(ixc^s,kdir)+qvec(jxc^s,kdir))
1608 xc(ixc^s)=
block%x(ixc^s,jdir)+0.5d0*
block%dx(ixc^s,jdir)
1609 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))&
1610 /
block%surface(ixo^s,idir)
1613 if(idir<idirmin)idirmin=idir
1615 enddo; enddo; enddo;
1617 call mpistop(
'no such curl evaluator')
1620 call mpistop(
'not possible to calculate curl')