static void
ggcm_mhd_diag_item_v_run(struct ggcm_mhd_diag_item *item,
			 struct mrc_io *io, struct mrc_fld *fld,
			 int diag_type, float plane)
{
  struct ggcm_mhd *mhd = item->diag->mhd;

  int bnd = fld->_nr_ghosts;

  struct mrc_fld *fld_r = mrc_domain_fld_create(mhd->domain, bnd, "vx:vy:vz");
  mrc_fld_set_type(fld_r, FLD_TYPE);
  mrc_fld_setup(fld_r);

  struct mrc_fld *r = mrc_fld_get_as(fld_r, FLD_TYPE);
  struct mrc_fld *f = mrc_fld_get_as(fld, FLD_TYPE);

  for (int p = 0; p < mrc_fld_nr_patches(fld); p++) {
    mrc_fld_foreach(f, ix,iy,iz, bnd, bnd) {
      mrc_fld_data_t rri = 1.f / RR_(f, ix,iy,iz, p);
      M3(r, 0, ix,iy,iz, p) = rri * RVX_(f, ix,iy,iz, p);
      M3(r, 1, ix,iy,iz, p) = rri * RVY_(f, ix,iy,iz, p);
      M3(r, 2, ix,iy,iz, p) = rri * RVZ_(f, ix,iy,iz, p);
    } mrc_fld_foreach_end;
  }
Example #2
0
static void
ggcm_mhd_bnd_open_x_fill_ghosts_fcons_cc(struct ggcm_mhd_bnd *bnd, struct mrc_fld *fld,
					 float bntim)
{
  struct ggcm_mhd *mhd = bnd->mhd;

  struct mrc_fld *f = mrc_fld_get_as(fld, FLD_TYPE);

  int gdims[3];
  mrc_domain_get_global_dims(mhd->domain, gdims);
  int sw_y = gdims[1] > 1 ? SW_2 : 0; 
  int sw_z = gdims[2] > 1 ? SW_2 : 0; 

  assert(mrc_fld_nr_patches(f) == 1);
  int p = 0;
  const int *ldims = mrc_fld_spatial_dims(f);
  int mx = ldims[0];
  struct mrc_patch_info info;
  mrc_domain_get_local_patch_info(mhd->domain, 0, &info);
  int nr_comps = mrc_fld_nr_comps(f);

    if (info.off[0] == 0) { // x lo FIXME, there is (?) a function for this
    for (int k = -sw_z; k < ldims[2] + sw_z; k++) {
      for (int j = -sw_y; j < ldims[1] + sw_y; j++) {	
	for (int m = 0; m < nr_comps; m++) {
	  M3(f, m, -1,j,k, p) = M3(f, m, 0,j,k, p);
	  M3(f, m, -2,j,k, p) = M3(f, m, 1,j,k, p);
	}
      }
    }
  }

  if (info.off[0] + info.ldims[0] == gdims[0]) { // x hi
    for (int k = -sw_z; k < ldims[2] + sw_z; k++) {
      for (int j = -sw_y; j < ldims[1] + sw_y; j++) {	
	for (int m = 0; m < nr_comps; m++) {
	  M3(f, m, mx  ,j,k, p) = M3(f, m, mx-1,j,k, p);
	  M3(f, m, mx+1,j,k, p) = M3(f, m, mx-2,j,k, p);
	}
      }
    }
  }

  mrc_fld_put_as(f, fld);
}
Example #3
0
static void
ggcm_mhd_bnd_open_x_fill_ghosts_scons(struct ggcm_mhd_bnd *bnd, struct mrc_fld *fld,
				      float bntim)
{
  struct ggcm_mhd *mhd = bnd->mhd;

  struct mrc_fld *f3 = mrc_fld_get_as(fld, FLD_TYPE);

  assert(mrc_fld_nr_patches(f3) == 1);
  int p = 0;

  int gdims[3];
  mrc_domain_get_global_dims(mhd->domain, gdims);
  int dy = (gdims[1] > 1), dz = (gdims[2] > 1);
  int sw_y = gdims[1] > 1 ? SW_2 : 0; 
  int sw_z = gdims[2] > 1 ? SW_2 : 0; 

  const int *dims = mrc_fld_dims(f3);
  int nx = dims[0], ny = dims[1], nz = dims[2];
  struct mrc_patch_info info;
  mrc_domain_get_local_patch_info(mhd->domain, 0, &info);

  float *bd2x = ggcm_mhd_crds_get_crd(mhd->crds, 0, BD2);
  float *bd2y = ggcm_mhd_crds_get_crd(mhd->crds, 1, BD2);
  float *bd2z = ggcm_mhd_crds_get_crd(mhd->crds, 2, BD2);

  // fill boundary values with closes non-zero value 
  // FIXME: should this be necessary? 
  
  bd2x[-2] = bd2x[0]; 
  bd2x[-1] = bd2x[0]; 
  bd2x[nx] = bd2x[nx-1];
  bd2x[nx+1] = bd2x[nx-1]; 

  bd2y[-2] = bd2y[0]; 
  bd2y[-1] = bd2y[0]; 
  bd2y[ny] = bd2y[ny-1];
  bd2y[ny+1] = bd2y[ny-1]; 

  bd2z[-2] = bd2z[0]; 
  bd2z[-1] = bd2z[0]; 
  bd2z[nz] = bd2z[nz-1];
  bd2z[nz+1] = bd2z[nz-1]; 
  
//-----------------------------------------------------------------------------------//
// lower bound 
//-----------------------------------------------------------------------------------//
  if (info.off[0] == 0) { // x lo    
    // transverse magnetic extrapolated
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	// bd1y and bd2y indices offset by one 
	M3(f3,BY, -1,iy,iz, p) = M3(f3,BY, 0,iy,iz, p); 
        M3(f3,BZ, -1,iy,iz, p) = M3(f3,BZ, 0,iy,iz, p);
      }
    }

    // set normal magnetic field component for divB=0
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BX, -1,iy,iz, p) = M3(f3,BX, 0,iy,iz, p) + bd2x[0] *  
	  ((M3(f3,BY, 0,iy,iz, p) - M3(f3,BY, 0,iy-dy,iz, p) ) / bd2y[iy] + 
	   (M3(f3,BZ, 0,iy,iz, p) - M3(f3,BZ, 0,iy,iz-dz, p) ) / bd2z[iz]);
      }
    }	
    // transverse magnetic field extrapolated 
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {       
	// bd1x and bd2y indices offset by one 
	M3(f3,BY, -2,iy,iz, p) = M3(f3,BY, 1,iy,iz, p);
	M3(f3,BZ, -2,iy,iz, p) = M3(f3,BZ, 1,iy,iz, p);
      }
    }
    // set normal magnetic field component for divB=0
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BX, -2,iy,iz, p) = M3(f3,BX, -1,iy,iz, p) + bd2x[-1] * 
	  ((M3(f3,BY, -1,iy,iz, p) - M3(f3,BY, -1,iy-dy,iz, p) ) / bd2y[iy] + 
           (M3(f3,BZ, -1,iy,iz, p) - M3(f3,BZ, -1,iy,iz-dz, p) ) / bd2z[iz]);      
      }
    }	
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {	

	M3(f3,RVX, -1,iy,iz, p) = M3(f3,RVX, 0,iy,iz, p);
	M3(f3,RVX, -2,iy,iz, p) = M3(f3,RVX, 1,iy,iz, p);	

	M3(f3,RR, -1,iy,iz, p) = M3(f3,RR, 0,iy,iz, p);
	M3(f3,RR, -2,iy,iz, p) = M3(f3,RR, 1,iy,iz, p);

	M3(f3,RVY, -1,iy,iz, p) = M3(f3,RVY, 0,iy,iz, p); 
	M3(f3,RVY, -2,iy,iz, p) = M3(f3,RVY, 1,iy,iz, p);
	
	M3(f3,RVZ, -1,iy,iz, p) = M3(f3,RVZ, 0,iy,iz, p);
	M3(f3,RVZ, -2,iy,iz, p) = M3(f3,RVZ, 1,iy,iz, p);
	
	M3(f3,UU, -1,iy,iz, p) = M3(f3,UU, 0,iy,iz, p);
	M3(f3,UU, -2,iy,iz, p) = M3(f3,UU, 1,iy,iz, p);

      }
    }
  }
  //-----------------------------------------------------------------------------------//
  // upper bound 
  //-----------------------------------------------------------------------------------//
  if (info.off[0] + info.ldims[0] == gdims[0]) { // x hi
    //  transverse magnetic field extrapolated
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BY, nx,iy,iz, p) = M3(f3, BY, nx-1,iy,iz, p);
	M3(f3,BZ, nx,iy,iz, p) = M3(f3, BZ, nx-1,iy,iz, p);
      }
    }
    // set normal magnetic field component for divB=0
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BX, nx-1,iy,iz, p) = M3(f3,BX, nx-2,iy,iz, p) - bd2x[nx-1] *
	  ((M3(f3,BY, nx-1,iy,iz, p) - M3(f3,BY, nx-1,iy-dy,iz, p) ) / bd2y[iy] +
	   (M3(f3,BZ, nx-1,iy,iz, p) - M3(f3,BZ, nx-1,iy,iz-dz, p) ) / bd2z[iz]);
      }
    }	
    //  transverse magnetic field extrapolated
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BY, nx+1,iy,iz, p) = M3(f3, BY, nx-2,iy,iz, p);
        M3(f3,BZ, nx+1,iy,iz, p) = M3(f3, BZ, nx-2,iy,iz, p); 
      }
    }
    // set normal magnetic field component for divB=0
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {
	M3(f3,BX, nx,iy,iz, p) = M3(f3,BX, nx-1,iy,iz, p) - bd2x[nx] *  
	  ((M3(f3,BY, nx,iy,iz, p) - M3(f3,BY, nx,iy-dy,iz, p) ) / bd2y[iy] + 
	   (M3(f3,BZ, nx,iy,iz, p) - M3(f3,BZ, nx,iy,iz-dz, p) ) / bd2z[iz]);
      }
    }	
    for (int iz = -sw_z; iz < nz + sw_z; iz++) {
      for (int iy = -sw_y; iy < ny + sw_y; iy++) {

	M3(f3,RVX, nx+1,iy,iz, p) = M3(f3,RVX, nx-2,iy,iz, p);	
	M3(f3,RVX, nx,iy,iz, p) = M3(f3,RVX, nx-1,iy,iz, p);

	M3(f3,RR, nx+1,iy,iz, p) = M3(f3,RR, nx-2,iy,iz, p);	
	M3(f3,RR, nx,iy,iz, p) = M3(f3,RR, nx-1,iy,iz, p);

	M3(f3,RVY, nx+1,iy,iz, p) = M3(f3,RVY, nx-2,iy,iz, p); 
	M3(f3,RVY, nx,iy,iz, p) = M3(f3,RVY, nx-1,iy,iz, p);

	M3(f3,RVZ, nx+1,iy,iz, p) = M3(f3,RVZ, nx-2,iy,iz, p);
	M3(f3,RVZ, nx,iy,iz, p) = M3(f3,RVZ, nx-1,iy,iz, p);

	M3(f3,UU, nx+1,iy,iz, p) = M3(f3,UU, nx-2,iy,iz, p);
	M3(f3,UU, nx,iy,iz, p) = M3(f3,UU, nx-1,iy,iz, p); 

      }
    }
  }

  mrc_fld_put_as(f3, fld);
}