31 get_odirs(dir,&odir1,&odir2);
33 if(Nvec[odir1]>1) { *fluxdir=odir1; *pldir=odir2; *plforflux =
B1+ *pldir-1; *signflux=1.0; }
34 else if(Nvec[odir2]>1){ *fluxdir=odir2; *pldir=odir1; *plforflux =
B1+ *pldir-1; *signflux=-1.0; }
35 else{ *fluxdir=0; *pldir=0; *plforflux=0; }
49 void get_odirs(
int dir,
int *odir1,
int *odir2)
60 int set_location_fluxasemforvpot(
int dir,
int *numdirs,
int *odir1,
int *odir2,
int *loc)
64 get_numdirs_fluxasemforvpot(numdirs,fieldloc);
67 get_odirs(dir,odir1,odir2);
73 loc[*odir1]=
FACE1-1 + *odir1;
74 loc[*odir2]=
FACE1-1 + *odir2;
79 loc[*odir1]=
CORN1-1 + dir;
80 loc[*odir2]=
CORN1-1 + dir;
91 int get_numdirs_fluxasemforvpot(
int *numdirs,
int *fieldloc)
158 int vpot2field(
SFTYPE time,
FTYPE (*A)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*pfield)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*pstag)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*ucons)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*Bhat)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*F1)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F2)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F3)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*Atemp)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*uconstemp)[
NSTORE2][
NSTORE3][NPR])
161 int numdirs, fieldloc[
NDIM];
169 get_numdirs_fluxasemforvpot(&numdirs,fieldloc);
190 vectorpot_useflux(
STAGEM1, pfield, F1, F2, F3);
194 vectorpot_fluxreconorfvavg(
STAGEM1, pfield, A, F1, F2, F3);
218 dualfprintf(
fail_file,
"FLUXCD probably not setup right in vpot2field()\n");
227 dualfprintf(
fail_file,
"Undefined numdirs==1 with FLUXB==%d\n",
FLUXB);
242 dualfprintf(
fail_file,
"Undefined numdirs==2 with FLUXB==%d\n",
FLUXB);
252 field_Bhat_fluxrecon(pfield,ucons,Bhat);
264 copy_3d_fieldonly_fullloop(pfield,pstag);
312 int numdirs, fieldloc[
NDIM];
320 get_numdirs_fluxasemforvpot(&numdirs,fieldloc);
345 deaverage_fields_fv(pfield,unew,ulast);
349 field_integrate_fluxrecon(
STAGEM1,pfield,unew,ulast);
353 copy_3d_fieldonly_fullloop(unew,ulast);
358 copy_3d_fieldonly_fullloop(unew,ulast);
416 bound_vpot(
STAGEM1, finalstep,
t, boundvartype, vpot, doboundmpi, doboundnonmpi);
443 if(dir==1) loc=
CORN1;
444 else if(dir==2) loc=
CORN2;
445 else if(dir==3) loc=
CORN3;
448 bl_coord_ijk_2(i, j, k, loc, X, V);
453 init_vpot_user(&whichcoord, userdir, time, i,j,k, loc, prim, V, &vpotuser[userdir]);
460 vpot[dir]=vpotuser[dir];
492 set_location_fluxasemforvpot(dir, &numdirs, &odir1[dir], &odir2[dir], locvpot[dir]);
503 trifprintf(
"Initialize field from vector potential (really A)\n");
505 DIMENLOOP(dir) init_3dvpot_fullloopp1(0.0,A[dir]);
507 init_3dvpot_fullloopp1(0.0,A[
TT]);
512 trifprintf(
"Initialize field from vector potential assign: init_vpot_justAcov()\n");
522 #pragma omp parallel private(dir) OPENMPGLOBALPRIVATEFULL // user could do anything
538 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
558 for(otherdir=1;otherdir<=numdirs;otherdir++){
561 loc=locvpot[dir][odir1[dir]];
563 else if(otherdir==2){
564 loc=locvpot[dir][odir2[dir]];
567 bl_coord_ijk_2(i, j, k, loc, X, V);
573 init_vpot_user(&whichcoord, userdir, time, i,j,k, loc, prim, V, &vpotuser[userdir]);
580 MACP1A0(A,dir,i,j,k) = vpotuser[dir];
626 set_location_fluxasemforvpot(dir, &numdirs, &odir1[dir], &odir2[dir], locvpot[dir]);
635 trifprintf(
"Initialize field from vector potential (really flux)\n");
638 init_3dnpr_fullloop_flux(0.0,fluxvec[dir]);
648 trifprintf(
"Initialize field from vector potential assign: init_vpot_toF()\n");
658 #pragma omp parallel private(dir) OPENMPGLOBALPRIVATEFULL // user could do anything
671 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
691 for(otherdir=1;otherdir<=numdirs;otherdir++){
694 loc=locvpot[dir][odir1[dir]];
696 else if(otherdir==2){
697 loc=locvpot[dir][odir2[dir]];
708 if(otherdir==1 && Nvec[odir1[dir]]>1)
MACP1A1(fluxvec,odir1[dir],i,j,k,
B1-1+odir2[dir])=
MACP1A0(A,dir,i,j,k);
709 if(otherdir==2 && Nvec[odir2[dir]]>1)
MACP1A1(fluxvec,odir2[dir],i,j,k,
B1-1+odir1[dir])=-
MACP1A0(A,dir,i,j,k);
769 set_location_fluxasemforvpot(dir, &numdirs, &odir1[dir], &odir2[dir], locvpot[dir]);
778 init_3dnpr_fullloop_flux(0.0,fluxvec[dir]);
787 #pragma omp parallel private(dir) // no copyin since no use of non-array globals (yet)
793 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
800 for(otherdir=1;otherdir<=numdirs;otherdir++){
805 if(otherdir==1 && Nvec[odir1[dir]]>1)
MACP1A1(fluxvec,odir1[dir],i,j,k,
B1-1+odir2[dir])=
MACP1A0(A,dir,i,j,k);
806 if(otherdir==2 && Nvec[odir2[dir]]>1)
MACP1A1(fluxvec,odir2[dir],i,j,k,
B1-1+odir1[dir])=-
MACP1A0(A,dir,i,j,k);
830 int evolve_withvpot(
SFTYPE time,
FTYPE (*prim)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*pstag)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*unew)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*vpot)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*Bhat)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*F1)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F2)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*F3)[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*Atemp)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*uconstemp)[
NSTORE2][
NSTORE3][NPR])
848 copy_vpot2flux(vpot,F1,F2,F3);
853 vpot2field(time, vpot,prim, pstag, unew, Bhat,F1,F2,F3,Atemp,uconstemp);
861 bound_uavg(
STAGEM1,
t,prim, pstag, unew);
976 struct of_geom geomfdontuse[NDIM];
981 DLOOPA(jj) ptrgeomf[jj]=&(geomfdontuse[jj]);
991 get_odirs(dir,&odir1,&odir2);
992 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
994 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // no wait allowed as in fluxct.c
1004 MACP0A1(ufield,i,j,k,
B1) += -(
MACP0A1(F2,i,
jp1mac(j),k,
B1)-
MACP0A1(F2,i,j,k,
B1))/(
dx[2]);
1007 MACP0A1(ufield,i,j,k,
B1) += -(
MACP0A1(F3,i,j,
kp1mac(k),
B1)-
MACP0A1(F3,i,j,k,
B1))/(
dx[3]);
1011 igdetgnosing[dir] =
sign(ptrgeomf[dir]->
gdet)/(fabs(ptrgeomf[dir]->
gdet)+
SMALL);
1023 get_odirs(dir,&odir1,&odir2);
1024 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
1026 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // no wait allowed as in fluxct.c
1035 MACP0A1(ufield,i,j,k,
B2) += -(
MACP0A1(F3,i,j,
kp1mac(k),
B2)-
MACP0A1(F3,i,j,k,
B2))/(
dx[3]);
1038 MACP0A1(ufield,i,j,k,
B2) += -(
MACP0A1(F1,
ip1mac(i),j,k,
B2)-
MACP0A1(F1,i,j,k,
B2))/(
dx[1]);
1042 igdetgnosing[dir] =
sign(ptrgeomf[dir]->
gdet)/(fabs(ptrgeomf[dir]->
gdet)+
SMALL);
1054 get_odirs(dir,&odir1,&odir2);
1055 if(!(Nvec[odir1]==1 && Nvec[odir2]==1)){
1057 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // no wait allowed as in fluxct.c
1066 MACP0A1(ufield,i,j,k,
B3) += -(
MACP0A1(F1,
ip1mac(i),j,k,
B3)-
MACP0A1(F1,i,j,k,
B3))/(
dx[1]);
1069 MACP0A1(ufield,i,j,k,
B3) += -(
MACP0A1(F2,i,
jp1mac(j),k,
B3)-
MACP0A1(F2,i,j,k,
B3))/(
dx[2]);
1073 igdetgnosing[dir] =
sign(ptrgeomf[dir]->
gdet)/(fabs(ptrgeomf[dir]->
gdet)+
SMALL);
1091 int i,
j,k,dir,pl,pliter;
1096 PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,4*NPR + (dir-1)*NPR*5 + NPR*0 + pl)=
MACP1A1(fluxvec,dir,i,j,k,pl);
1099 PLOOP(pliter,pl) GLOBALMACP0A1(fluxdump,i,j,k,4*NPR + (dir-1)*NPR*5 + NPR*0 + pl)=0.0L;
1139 int evolve_vpotgeneral(
int whichmethod,
int stage,
1140 int initialstep,
int finalstep,
1154 vpotlast=vpot+2*
NDIM;
1155 vpotcum =vpot+3*
NDIM;
1160 dualfprintf(
fail_file,
"Shouldn't be in evolve_vpotgeneral() with EVOLVEWITHVPOT==0 && TRACKVPOT==0\n");
1186 for(dimen=0;dimen<
NDIM;dimen++){
1188 copy_3dvpot_fullloopp1(vpot[dimen],vpot0[dimen]);
1190 init_3dvpot_fullloopp1(0.0,vpotlast[dimen]);
1191 init_3dvpot_fullloopp1(0.0,vpotcum[dimen]);
1210 update_vpot(whichmethod, stage,
pr, fluxvec, emf, CUf, CUnew, fluxdt, vpot, vpot0, vpotlast, NULL);
1223 adjust_vpot(fluxtime, whichmethod,
pr, Nvec, vpot);
1231 set_emfflux(whichmethod, stage,
pr,fluxvec,emf,CUf, CUnew, fluxdt,vpot,vpot0,vpotlast);
1250 update_vpot(whichmethod, stage,
pr, fluxvec, emf, CUf, CUnew, fluxdt, vpot, vpot0, vpotlast, vpotcum);
1255 for(dimen=0;dimen<
NDIM;dimen++) copy_3dvpot_fullloopp1(vpot[dimen],vpotlast[dimen]);
1263 for(dimen=0;dimen<
NDIM;dimen++) copy_3dvpot_fullloopp1(vpotcum[dimen],vpot[dimen]);
1286 adjust_fluxcttoth_emfs(fluxtime,
pr,emf);
1289 adjust_fluxctstag_emfs(fluxtime,
pr,Nvec,fluxvec);
1304 adjust_fluxcttoth_vpot(fluxtime,
pr,Nvec,vpot);
1307 adjust_fluxctstag_vpot(fluxtime,
pr,Nvec,vpot);
1317 int update_vpot(
int whichmethod,
int stage,
FTYPE (*
pr)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*fluxvec[NDIM])[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*emf)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE *CUf,
FTYPE *CUnew,
SFTYPE fluxdt,
FTYPE (*vpot)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vpot0)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vpotlast)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vpotcum)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3])
1321 int fluxdirlist[
NDIM],pldirlist[
NDIM],plforfluxlist[
NDIM];
1336 bound_flux_fluxrecon(stage,
pr,Nvec,fluxvec);
1350 get_fluxpldirs(Nvec, dir, &fluxdirlist[dir], &pldirlist[dir], &plforfluxlist[dir], &signforfluxlist[dir]);
1352 set_location_fluxasemforvpot(dir, &numdirs, &odir1[dir], &odir2[dir], locvpot[dir]);
1359 #pragma omp parallel private(dir) //nothing needed to copyin()
1361 int is,ie,js,je,ks,ke;
1362 int i,
j,k,pl,pliter;
1363 int fluxdir,pldir,plforflux;
1366 struct of_geom *ptrgeom=&geomdontuse;
1386 fluxdir=fluxdirlist[dir];
1387 pldir=pldirlist[dir];
1388 plforflux=plforfluxlist[dir];
1389 signforflux=signforfluxlist[dir];
1392 dualfprintf(
fail_file,
"nstep=%ld steppart=%d dir=%d fluxdir=%d plforflux=%d locvpot=%d geomeodir=%d pldir=%d signforflux=%21.15g\n",
nstep,
steppart,dir,fluxdir,plforflux,locvpot[dir][odir2[dir]],
B1-1+odir1[dir],pldir,signforflux);
1396 if(Nvec[fluxdir]>1){
1413 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // Can use "nowait" since each vpot[dir] setting is independent from prior loops
1442 myemf=signforflux*
MACP1A1(fluxvec,fluxdir,i,j,k,plforflux);
1447 if(vpot!=NULL)
MACP1A0(vpot,dir,i,j,k) = UFSET (CUf ,
dt,
MACP1A0(vpot0,dir,i,j,k),
MACP1A0(vpotlast,dir,i,j,k),myemf,0.0,ftemp);
1448 if(vpotcum!=NULL)
MACP1A0(vpotcum,dir,i,j,k) += UCUMUPDATE(CUnew,
dt,
MACP1A0(vpot0,dir,i,j,k),
MACP1A0(vpot,dir,i,j,k) ,myemf,0.0,ftemp);
1452 if(dir==2 && i==26 && j==40){
1453 dualfprintf(
fail_file,
"inside update_vpot: %21.15g (%21.15g %21.15g %21.15g) dt=%21.15g vpot0=%21.15g vpotlast=%21.15g myemf=%21.15g\n",
MACP1A0(vpot,dir,i,j,k),CUf[0],CUf[1],CUf[2],
dt,
MACP1A0(vpot0,dir,i,j,k),
MACP1A0(vpotlast,dir,i,j,k),myemf);
1481 int set_emfflux(
int whichmethod,
int stage,
FTYPE (*
pr)[
NSTORE2][
NSTORE3][NPR],
FTYPE (*fluxvec[NDIM])[
NSTORE2][
NSTORE3][NPR+
NSPECIAL],
FTYPE (*emf)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE *CUf,
FTYPE *CUnew,
SFTYPE fluxdt,
FTYPE (*vpot)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vpot0)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3],
FTYPE (*vpotlast)[
NSTORE1+
SHIFTSTORE1][
NSTORE2+
SHIFTSTORE2][
NSTORE3+
SHIFTSTORE3])
1484 int fluxdirlist[
NDIM],pldirlist[
NDIM],plforfluxlist[
NDIM];
1504 get_fluxpldirs(Nvec, dir, &fluxdirlist[dir], &pldirlist[dir], &plforfluxlist[dir], &signforfluxlist[dir]);
1506 set_location_fluxasemforvpot(dir, &numdirs, &odir1[dir], &odir2[dir], locvpot[dir]);
1513 #pragma omp parallel private(dir) //nothing needed to copyin()
1515 int is,ie,js,je,ks,ke;
1516 int i,
j,k,pl,pliter;
1517 int fluxdir,pldir,plforflux;
1520 struct of_geom *ptrgeom=&geomdontuse;
1540 fluxdir=fluxdirlist[dir];
1541 pldir=pldirlist[dir];
1542 plforflux=plforfluxlist[dir];
1543 signforflux=signforfluxlist[dir];
1546 if(Nvec[fluxdir]>1){
1550 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // Can use "nowait" since each vpot[dir] setting is independent from prior loops
1560 myemf =
dUfromUFSET(CUf,
dt,
MACP1A0(vpot0,dir,i,j,k),
MACP1A0(vpotlast,dir,i,j,k),
MACP1A0(vpot,dir,i,j,k));
1570 MACP1A1(fluxvec,fluxdir,i,j,k,plforflux)=myemf/signforflux;
1572 if(Nvec[plforflux-
B1+1]>1){
1573 MACP1A1(fluxvec,plforflux-
B1+1,i,j,k,
B1+fluxdir-1)=-
MACP1A1(fluxvec,fluxdir,i,j,k,plforflux);
1602 #pragma omp parallel
1604 int i,
j,k,pl,pliter;
1610 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // next vpot assignment is independent
1647 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize)) nowait // next vpot assignment is independent
1651 MACP1A0(vpot,1,i,j,k) *= norm;
1652 MACP1A0(vpot,2,i,j,k) *= norm;
1653 MACP1A0(vpot,3,i,j,k) *= norm;
1677 #pragma omp parallel
1679 int i,
j,k,pl,pliter;
1681 struct of_geom *ptrgeom=&geomdontuse;
1683 struct of_geom *ptrgeomf=&geomfdontuse;
1686 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1694 MACP0A1(ucons,i,j,k,pl)=
MACP0A1(pstag,i,j,k,pl)*(ptrgeomf->gdet);
1722 int myim1,myjm1,mykm1;
1723 int myip1,myjp1,mykp1;
1729 DLOOPA(jj) ptrgeomf[jj]=&(geomfdontuse[jj]);
1743 MACP0A1(pstag,i,j,k,pl)=0.5*(
MACP0A1(
p,i,j,k,pl)+
MACP0A1(
p,myim1,j,k,pl));
1745 MACP0A1(ucons,i,j,k,
B1-1+dir)=
MACP0A1(pstag,i,j,k,pl)*ptrgeomf[dir]->IEOMFUNCNOSINGMAC(pl);
1749 MACP0A1(pstag,i,j,k,pl)=0.5*(
MACP0A1(
p,i,j,k,pl)+
MACP0A1(
p,i,myjm1,k,pl));
1751 MACP0A1(ucons,i,j,k,
B1-1+dir)=
MACP0A1(pstag,i,j,k,pl)*ptrgeomf[dir]->IEOMFUNCNOSINGMAC(pl);
1755 MACP0A1(pstag,i,j,k,pl)=0.5*(
MACP0A1(
p,i,j,k,pl)+
MACP0A1(
p,i,j,mykm1,pl));
1757 MACP0A1(ucons,i,j,k,
B1-1+dir)=
MACP0A1(pstag,i,j,k,pl)*ptrgeomf[dir]->IEOMFUNCNOSINGMAC(pl);
1776 #pragma omp parallel
1781 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))
1786 MACP0A1(prim,i,j,k,
B1)=
MACP0A1(prim,i,j,k,
B2)=
MACP0A1(prim,i,j,k,
B3)=0.0;
1787 MACP0A1(ucons,i,j,k,
B1)=
MACP0A1(ucons,i,j,k,
B2)=
MACP0A1(ucons,i,j,k,
B3)=0.0;
1789 MACP0A1(Bhat,i,j,k,
B1)=
MACP0A1(Bhat,i,j,k,
B2)=
MACP0A1(Bhat,i,j,k,
B3)=0.0;
1792 MACP0A1(pstag,i,j,k,
B1)=
MACP0A1(pstag,i,j,k,
B2)=
MACP0A1(pstag,i,j,k,
B3)=0.0;
1800 #pragma omp parallel
1805 #pragma omp for schedule(OPENMPSCHEDULE(),OPENMPCHUNKSIZE(blocksize))